Означает ли загрузка в режиме EFI, что у меня не будет доступа к прерываниям BIOS?
Я пытаюсь разработать простую ОС. Я сделал несколько программ сборки и должен был использовать INT 10h
для отображения символов на экране. Я понимаю, что UEFI поддерживает устаревшую версию BIOS и все еще может использовать INT 10h
Сервисы. Однако, если я решу создать чистую загрузочную ОС UEFI, следует ли мне избегать использования INT 10h
? Или я смотрю на вещи неправильно?
Другими словами, делает ли пробуренный printf
в stdout
(экран) в конечном итоге вызывает BIOS INT 10h
? Или вопрос - это SYS_WRITE
вызов функции на основе INT 10h?"более уместно?
Нужно ли мне создавать загрузочный сектор с 512 байтами и размещать их как нулевой сектор на диске (или образе диска)? Есть ли местоположение 0x7c00
иметь значение больше?
2 ответа
Если ваш загрузчик является загрузчиком UEFI (вы будете знать, так ли это), то вы можете вообще не использовать BIOS, включая int 0x10 - вы должны использовать загрузочные сервисы UEFI, которые предоставляют все функции, которые BIOS в противном случае предоставил бы устаревшим загрузочным системам.
Если вы не пишете загрузчик UEFI, но ваше оборудование поддерживает UEFI, ваш загрузчик будет загружен в "устаревшем" режиме, и вы сможете использовать BIOS, как и раньше.
Или, другими словами, ваш загрузочный образ может быть либо загрузчиком UEFI, либо устаревшим образом BIOS. Устаревшие образы BIOS не могут использовать UEFI, а загрузчики UEFI не могут использовать BIOS.
Другими словами, вызывает ли развернутый printf до stdout (экран) вызов BIOS INT 10h? Или вопрос - "Основан ли вызов функции SYS_WRITE на INT 10h?" более подходящий?
Зависит от того, кто написал вашу функцию printf (вы - ОС, под вами никого нет). Если вы вызываете Int 0x10 и не настроили IDT для обработки этого вызова в UEFI для записи символа на экран, то вы просто используете неопределенное поведение.
Нужно ли мне создавать загрузочный сектор с 512 байтами и размещать их как нулевой сектор на диске (или образе диска)? Имеет ли значение 0x7c00 значение?
Нет и нет UEFI поддерживает гораздо большие загрузчики и не загружается при 0x7C00. Если вы хотите узнать, какие области памяти имеют особое значение, вы должны попросить UEFI предоставить вам карту памяти.
BIOS ПК не является частью модели программирования UEFI, поэтому его не следует использовать в приложениях UEFI. Например, для печати на экране вы должны использовать функцию из библиотеки UEFI.
Чтение первого сектора с диска и загрузка его в 0x7C00 - это специальный протокол загрузки BIOS. Загрузчики UEFI загружаются из файловой системы. Вы можете прочитать больше об этом на OSDev Wiki.