OSDev
http://osdev.su/

вопрос по размещению таблицы IDT.
http://osdev.su/viewtopic.php?f=6&t=965
Страница 1 из 3

Автор:  Demonikss [ 18 июл 2014, 18:36 ]
Заголовок сообщения:  вопрос по размещению таблицы IDT.

Писать свою полноценную ось я пока не собираюсь. Изучаю как другие реализовывали. Возник вопрос с размещением таблицы прерываний. Если я пишу небольшую программу для изучения работы какого-нибудь кода в защищенном режиме, который будет загружаться в память своим загрузчиком, могу ли я в нем при переходе в защищенный режим разместить таблицу IDT с адреса 0000:0000h, то есть там же где в реальном режиме находится таблица векторов прерываний? Прочитал достаточно много, понимаю что она может размещаться где угодно. Интересует размещение именно с первого адреса ОЗУ. Буду очень признателен если дадите ссылочку на литературу которая описывает все за и против такого подхода при проектировании реальной операционной системы защищенного режима.

Автор:  Bargest [ 18 июл 2014, 21:03 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

У меня в первой версии так и было. Никаких проблем не встречал. Но и смысла особого в этом нет - при использовании страничной адресации, можно отобразить что угодно куда угодно, и idt по виртуальному адресу 0 может находиться вообще в конце памяти.
Потом отказался, решил вообще первый метр памяти не трогать (чтобы потом можно было поэмулировать 16-битный код BIOS'а из x64 если понадобится).

Автор:  Demonikss [ 18 июл 2014, 21:49 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

Дело в том что есть у меня старенький ноутбук на i486dx, с 8 мб ОЗУ, от tosiba. Я на нем экспериментирую. Если подробности нужны могу пояснить. Просто попытался запустить на нем Колибри, не вышло. Когда начал изучать исходники выяснилось что дырок в Колибри как в решете. Стандартный ответ работает там где тестировали меня не устраивает. Я по роду занятий инженер, работаю с железками в энергетике. Ну еще параллельно приходится поддерживать АСУТП, которая это железо контролирует и дает возможность тыком мышки запустить, остановить и все прочее. Иногда один раз ткнут так потом месяц спина в мыле...
Вопрос задан в смысле того что при переходе в защищенный режим не планируется возврат в реальный. Пока просто чисто творческий интерес. Потом может быть написание своих драйверов и обработчиков полностью в защищенном режиме. Я думаю что если уж писать реальную операционную систему то она все должна делать сама, независимо и без всяких обращений к биос с возвратом в реальный режим.

Автор:  Himik [ 19 июл 2014, 00:19 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

В программах часто возникают ошибки при работе с указателями, содержащими 0 (NULL), поэтому по адресу 0 лучше ни чего не хранить.

Автор:  phantom-84 [ 19 июл 2014, 01:49 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

Судя по первому посту, речь идет о пространстве физической памяти. В ВАП можно отобразить в другое место.

Я бы не рекомендовал затирать IVT и BDA. Нигде не сказано, что BIOS не использует этот участок после перехода из реального режима. Ваша ось не обеднеет, если откажется от использования этого участка для хранения чего-то другого.

Лично я продолжаю сохранять совместимость со старыми процами. В частности для одной серьезной ошибки Pentium MMX размещаю IDT так, чтобы она пересекала границу страниц, при этом первая страница была некэшируемой. Кстати говоря, эта первая страница IDT – как раз первая физическая страница памяти. Ее разметка выглядит так: IVT, BDA, небольшая секция для передачи параметров из RM (естественно, ее размер контролируется), начало IDT. Кстати данные из BDA могут использоваться во время инициализации системы. Например, встроенный в ядро драйвер клавиатуры берет оттуда первоначальное состояние клавиатурных индикаторов.

Автор:  pavia [ 19 июл 2014, 08:04 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

Без обращения к БИОСу не получится. Дело в том что создатели компьютеров любят делать не стандартные вещи особенно это любят делать производители ноутбуков. Как следствие без тестирования не обойтись и написания драйверов под каждую уникальную железку. Есть выход в железе поставляются свои код в EPPROM(БИОС, UEFI) под единый интерфейс.
Правда его очень мало ~1% из них под реальный режим ещё меньше.

К примеру Int 10h для смены разрешения без использования драйверов. ACPI для выключения компьютера и перевода в режим гибернации и сна. PnP для выбора загрузочного устройства.

Хотя примеры не очень хорошие и написания драйверов это решает.

Ничего страшного в том что-бы затереть IDT нет. Дело в том что там не храниться ничего полезного для защищенного режима. А вот BDA я бы не стал трогать.

Автор:  Demonikss [ 19 июл 2014, 09:30 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

Ну я так понимаю не рекомендуется затирать начало таблицы векторов потому, что там вектор для немаскируемых прерываний? Как может использоваться биос в защищенном режиме я не представляю себе, так как по определению биос пишется для работы в реальном режиме и для поддержки старых ОС реального режима. BDA насколько я знаю тоже необходим только старым операционкам которые большинство функций выполняют непосредственно через вызовы биос. Хорошо, я так понимаю что если не планируется использовать биос и если теоретически программа (некоторое подобие ОС) будет всегда работать только в защищенном режиме и со своими драйверами то правильнее всего будет:
- начало IDT расположить выше IVT и BDA (ну на всякий случай).
- IVT заполнить переходом на какое-то одно прерывание IDT (к нему прилепить обработчик ну например для вывода сообщения что происходит незапланированное прерывание, мало ли...).
Тогда возникает вопрос, а BDA на всех биос следуют стандарту и имеют один размер? Или необходимо при размещении программы в памяти прямо спрашивать биоса куда он затолкал BDA и сколько для него откушал?
Вот только не могу понять, ведь в защищенном режиме таблица векторов тоже имеет зарезервированные вектора прерываний (то есть обработка исключений и прерываний), то есть использовать IVT реального режима по определению она не будет... Или все не так просто у этих буржуинов? :)

Автор:  Demonikss [ 19 июл 2014, 10:45 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

phantom-84 писал(а):
Например, встроенный в ядро драйвер клавиатуры берет оттуда первоначальное состояние клавиатурных индикаторов.


Не понимаю про какое ядро идет в данном случае речь. Если про то что функции биос, так я ясно выразился что не хочу их использовать. Если про ядро любой операционной системы, то это уже зависит от реализации самого драйвера. Я говорю про низкоуровневое программирование на языке ассемблера любого кода в защищенном режиме.

Автор:  pavia [ 19 июл 2014, 11:02 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

Цитата:
Ну я так понимаю не рекомендуется затирать начало таблицы векторов потому, что там вектор для немаскируемых прерываний?

Нет. Обработчик NMI вы пишете сами. И адрес для обработчика вы задаёте в IDT которая может быть где угодно.
NMI изначально предполагался для обработки ошибок возникших в обработчиках прерывания. Т.е это ошибки в железе.
К примеру в случае заклинивания таймер или Ваша ОС зависла. К примеру вы ждете бита и у вас выключены прерывания, а он не появляется из за аппаратного сбоя. Срабатывает сторожевой таймер который вызывает NMI.

Цитата:
Как может использоваться биос в защищенном режиме я не представляю себе, так как по определению биос пишется для работы в реальном режиме и для поддержки старых ОС реального режима.

По разному. Начиная от возврата в реальный режим, заканчивая исполнения p-coda.
К примеру:
1. в Int 10h VBE есть функции которые работают в 32 защищенном режиме. Хотя код лучше вызывать из реального или эмулировать проц.
2. в PnP есть функции которые работают в 16 защищенном режиме. Правда они никому не нужны достаточно таблиц и загрузчика.
3 У процессора есть режим System Management Mode(SMM) в который он попадает по внешнему сигналу. В этом режиме БИОС обрабатывает свои черные дела. К примеру для клавиатуры USB читается команда и записывается в контролёр 8042 тем самым эмулируется поступления кода как бы от PS/2 клавиатуры.
Код для SMM прячется обычно в теневой области RAM. Или был случай код в SMM эмалировал порты VGA и для установки режима использовал BDA.
4. А так да большинство кода BIOS является 16 битным и не годятся для работы в защищенном режиме. Поэтому BIOS предлагает таблицы с данными которыми ОС и пользуется. Есть ещё П-код для ACPI - AML. Который выполняется в защищенном режиме. Есть UEFI

Цитата:
- IVT заполнить переходом на какое-то одно прерывание IDT (к нему прилепить обработчик ну например для вывода сообщения что происходит незапланированное прерывание, мало ли...).
Это лишнее. Если прерывание будет то оно прийдет в IDT а IVT в природе несущественен. IDT настраивается в первых строчках кода BIOS. А уж где он будет находиться в вашей ОС решать вам.

Цитата:
тогда возникает вопрос, а BDA на всех биос следуют стандарту и имеют один размер?

А нет стандарта на BDA. В большинстве случаев 100h остальное считаем как исключение. Правда за ваш ноут не скажу там может и больше оказаться. Линуксойды чаще всего считают 100h виндоус считает что 200h

Автор:  pavia [ 19 июл 2014, 11:30 ]
Заголовок сообщения:  Re: вопрос по размещению таблицы IDT.

PS/
Demonikss писал(а):
Дело в том что есть у меня старенький ноутбук на i486dx, с 8 мб ОЗУ, от tosiba.

Тут вспомнил. С вероятностью более 75% для вашего ноута вам придется прыгать в реальный режим для выключения компьютера через вызов APM из BIOS.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/