OSDev http://osdev.su/ |
|
EFI Boot - вопросы http://osdev.su/viewtopic.php?f=6&t=1189 |
Страница 1 из 1 |
Автор: | DJ PhoeniX [ 14 ноя 2016, 14:22 ] |
Заголовок сообщения: | EFI Boot - вопросы |
Всех приветствую. В общем, продвигается моя операционка, уже многое удалось решить, сейчас занимаюсь гибридной (Multiboot+EFI) загрузкой. Столкнулся с двумя проблемами: 1. Как замаскировать (средствами EFI Boot Services) нулевую страницу памяти так, чтобы обращение к ней вызывало #PF? В случае с Multiboot всей таблицей рулю сам, так что всё понятно. Для EFI было решено использовать стандартные для него методы, аллокатор уже написал, а вот с нулевой страницей беда - AllocatePages с любой комбинацией флагов, или FreePages, так или иначе, не имеют никакого эффекта - обращение к нулевому адресу (или около него) проходит успешно. Тестировал следующим кодом: Код: asm volatile("movb $'X', 0"); В multiboot-режиме ожидаемый #PF, в EFI - проходит дальше. 2. APIC-таймер в EFI-режиме вызывает зависание системы. Если закомментировать его инициализацию - то всё работает, прерывания (клавиатуры / эксепшенов) приходят как положено, но на этом всё. Инициализация таймера: https://git.phoenix.dj/phoenix/phoenix- ... i.cpp#L292 Весь код можно смотреть и качать для сборки тут: https://git.phoenix.dj/phoenix/phoenix-os Собранные образы (для экспериментов): https://git.phoenix.dj/phoenix/phoenix-os/builds |
Автор: | Nable [ 17 ноя 2016, 06:34 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
> Для EFI было решено использовать стандартные для него методы В каком это смысле стандартные методы? Для ядра системы не должно быть разницы как она была загружена. Как только смог корявыми методами firmware кое-как загрузить все нужные драйверы - скорее делай ExitBootServices (или аналог), меняй таблицы страниц на свои и забывай про функции из кода начальной загрузки как про страшный сон. |
Автор: | DJ PhoeniX [ 17 ноя 2016, 15:31 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
Я уже понял, что стоит пойти по этому пути... С таймерами разобрался - переписал инициализацию прерываний и GDT, жить стало легче. Теперь возникла другая проблема - если начинаю инициализацию процессов, то где-то на этапе чтения Elf-потока всё заваливается наглухо. Причём без эксепшенов - просто виснет. С таблицами вроде тоже осознал - EFI заполняет их по 2 мегабайта, а у меня юзаются 4кб... Попытался на основе GetMemoryMap создать свою и переключиться на неё - виснет. Или не виснет, но отказывается работать с фреймбуфером - возможно, его аллокацию надо делать отдельно. Пока не придумал, как это обойти. Писать VFB уровня ядра не хочется, а до модулей ещё надо добраться, и дебагать их как-то надо... |
Автор: | DJ PhoeniX [ 17 ноя 2016, 19:38 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
Так, разобрался. Выкинул early console в serial output (назначив его на stdio в qemu). Также в заполнении таблицы страниц замапил framebuffer (который нашёл через Graphics Output Protocol). Однако положение это не сильно спасло. Ядро, конечно, стартует (включая прерывания, Page Fault на нулевой адрес, и запуск процессов), но EFI Console недоступна (фреймбуфер пока не пробовал). Реализовывать console output руками (со своей отрисовкой) при доступности оного в UEFI очень не хочется... EDIT: ...но пришлось. В общем, заработало. И даже "как задумано". Надо бы до кучи VBE Linear Framebuffer включить (раз уж включил шрифт и поддержку LFB в ведро). |
Автор: | dixie [ 24 ноя 2016, 23:07 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
EFI это задница на заднице... С APIC таймером такой прикол, что это чудо природы (EFI) само ходит в реал мод для вызова VESA биос Например, при SetMode. Если APIC таймер в это время взведён - полные штаны радости гарантированы. Т.е. прерывание таймера честно прилетит в реальный режим. В лучшем случае там будет iret без EOI в APIC, в худшем просто нулевые вектора (как в VBox, например, старшая часть таблицы прерываний). Писать в видео однозначно лучше своим кодом, EFI-шная консоль - это нецензурно. Во-первых, она тормозная. Даже в коммерческих, в TianoCore - там просто 1200 бод. Забавно, что самописная консоль, выводящая через EFI blit в TianoCore - и то на порядки быстрее. Что и как они там писали - не знаю. Если графический протокол отдаёт указатель на память, то лучше, конечно, брать его за LFB. У меня ещё и 32 бита - и походы 32<->64 для вывода символа на экран - это слегка перебор |
Автор: | DJ PhoeniX [ 25 ноя 2016, 10:09 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
dixie писал(а): EFI это задница на заднице... Я уже оценил. Немного более плотно раскурил, ЧТО оно делает при вызове некоторых функций...dixie писал(а): С APIC таймером такой прикол, что это чудо природы (EFI) само ходит в реал мод для вызова VESA биос Реал-мода в моём случае не было, а вот переключения LM-PM и код-сегментов (ЗАЧЕМ???) происходили. Да и IDT у меня с IST, которые тоже внезапно отваливались - почему пока не понял, и не уверен, что хочу понять.dixie писал(а): Писать в видео однозначно лучше своим кодом... Если графический протокол отдаёт указатель на память, то лучше, конечно, брать его за LFB. Так в итоге и сделал (kernlib/display.cpp@FramebufferDisplay). Производительность не мерял (не заморачивался с оптимизацией), но работает вменяемо. От функций EFI (в том числе Blit) отказался вообще.
|
Автор: | dixie [ 25 ноя 2016, 15:29 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
DJ PhoeniX писал(а): Реал-мода в моём случае не было, а вот переключения LM-PM и код-сегментов (ЗАЧЕМ???) происходили. Да и IDT у меня с IST, которые тоже внезапно отваливались - почему пока не понял, и не уверен, что хочу понять. Да, скачет он часто... на это я первым делом попал - восстановил исходную GDT на выходе (выход назад в EFI шелл есть) - а DS поправить забыл и он оказался за пределами GDT - почти сразу умирает Т.е. где-то этот левый DS используется. В итоге все хождения из своих 32-х бит в EFI обложил восстановлением сегментных регистров.А в реальный оно запросто пойдёт - на вставной видюхе с биосом. В добавок к этому, там вообще вся установка режимов криво сделана. Консоль подразумевает свой режим, если его сменить, то она нифига не апдейтится - и начинает рисовать только на части экрана, например Т.е., я врубаю самописную консоль в 800x600, например, а потом, если надо вернуться на штатную - то сначала восстанавливаю её графический режим и тока потом SetMode консоли.... Иначе оно чудит, вешается... В общем, кривь несусветная. Кроме старта венды тупо ничего не тестили DJ PhoeniX писал(а): Так в итоге и сделал (kernlib/display.cpp@FramebufferDisplay). Производительность не мерял (не заморачивался с оптимизацией), но работает вменяемо. От функций EFI (в том числе Blit) отказался вообще. Не получится от Blit отказаться - в указателе на буфер может быть 0. Вон под qemu есть какая-то сборка TianoCore биоса и там именно 0. И приходится ручками blit звать для каждой буковки. Всё-равно получается быстрее их родной консоли в несколько раз.Мой код тут, там внутри ещё один архив - QSINIT_EFI.ZIP |
Автор: | DJ PhoeniX [ 25 ноя 2016, 18:31 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
dixie писал(а): восстановил исходную GDT на выходе Благо, у меня такой ситуации не предусмотрено - bootup в один конец и пошло оно всё в лес.dixie писал(а): Не получится от Blit отказаться - в указателе на буфер может быть 0. Нет LFB - "давай досвидания", fallback на что-нибудь (например, как сейчас, serial-port). Пока на такие не натыкался. В крайнем случае оно надо только для Early Bootup Console, до загрузки модулей, а там какая-нибудь универсалка (с каким-нибудь эмулятором 8086 на "совсем худой конец") спасёт положение.
|
Автор: | poly [ 18 июл 2018, 15:30 ] |
Заголовок сообщения: | Прощай, BIOS |
Похороны 16-разрядного BIOS запланированы на 2020 http://www.uefi.org/sites/default/files ... _Final.pdf Будем грузить системы по HTTPS |
Автор: | phantom-84 [ 19 июл 2018, 15:15 ] |
Заголовок сообщения: | Re: EFI Boot - вопросы |
poly писал(а): Будем грузить системы по HTTPS EFI для этого не нужен |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |