OSDev

для всех
Текущее время: 29 апр 2024, 19:47

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: вопрос по размещению таблицы IDT.
СообщениеДобавлено: 18 июл 2014, 18:36 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 июл 2014, 21:03 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 июл 2014, 21:49 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 00:19 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
В программах часто возникают ошибки при работе с указателями, содержащими 0 (NULL), поэтому по адресу 0 лучше ни чего не хранить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 01:49 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Судя по первому посту, речь идет о пространстве физической памяти. В ВАП можно отобразить в другое место.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 08:04 
Аватара пользователя

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 09:30 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 10:45 

Зарегистрирован: 18 июл 2014, 18:13
Сообщения: 13
phantom-84 писал(а):
Например, встроенный в ядро драйвер клавиатуры берет оттуда первоначальное состояние клавиатурных индикаторов.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 11:02 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Ну я так понимаю не рекомендуется затирать начало таблицы векторов потому, что там вектор для немаскируемых прерываний?

Нет. Обработчик 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 июл 2014, 11:30 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB