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/ |