OSDev

для всех
Текущее время: 11 дек 2017, 22:10

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: EFI Boot - вопросы
СообщениеДобавлено: 14 ноя 2016, 14:22 
Аватара пользователя

Зарегистрирован: 06 мар 2012, 20:05
Сообщения: 130
Откуда: Санкт-Петербург
Всех приветствую.

В общем, продвигается моя операционка, уже многое удалось решить, сейчас занимаюсь гибридной (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

_________________
We are back with a hard even better than before [D-Block & S-Te-Fan – Evolutionz {Ran-D remix}]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 17 ноя 2016, 06:34 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 208
> Для EFI было решено использовать стандартные для него методы
В каком это смысле стандартные методы? Для ядра системы не должно быть разницы как она была загружена. Как только смог корявыми методами firmware кое-как загрузить все нужные драйверы - скорее делай ExitBootServices (или аналог), меняй таблицы страниц на свои и забывай про функции из кода начальной загрузки как про страшный сон.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 17 ноя 2016, 15:31 
Аватара пользователя

Зарегистрирован: 06 мар 2012, 20:05
Сообщения: 130
Откуда: Санкт-Петербург
Я уже понял, что стоит пойти по этому пути...

С таймерами разобрался - переписал инициализацию прерываний и GDT, жить стало легче. Теперь возникла другая проблема - если начинаю инициализацию процессов, то где-то на этапе чтения Elf-потока всё заваливается наглухо. Причём без эксепшенов - просто виснет.

С таблицами вроде тоже осознал - EFI заполняет их по 2 мегабайта, а у меня юзаются 4кб... Попытался на основе GetMemoryMap создать свою и переключиться на неё - виснет. Или не виснет, но отказывается работать с фреймбуфером - возможно, его аллокацию надо делать отдельно. Пока не придумал, как это обойти. Писать VFB уровня ядра не хочется, а до модулей ещё надо добраться, и дебагать их как-то надо...

_________________
We are back with a hard even better than before [D-Block & S-Te-Fan – Evolutionz {Ran-D remix}]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 17 ноя 2016, 19:38 
Аватара пользователя

Зарегистрирован: 06 мар 2012, 20:05
Сообщения: 130
Откуда: Санкт-Петербург
Так, разобрался. Выкинул early console в serial output (назначив его на stdio в qemu). Также в заполнении таблицы страниц замапил framebuffer (который нашёл через Graphics Output Protocol). Однако положение это не сильно спасло. Ядро, конечно, стартует (включая прерывания, Page Fault на нулевой адрес, и запуск процессов), но EFI Console недоступна (фреймбуфер пока не пробовал). Реализовывать console output руками (со своей отрисовкой) при доступности оного в UEFI очень не хочется...

EDIT:
...но пришлось. В общем, заработало. И даже "как задумано". Надо бы до кучи VBE Linear Framebuffer включить (раз уж включил шрифт и поддержку LFB в ведро).

_________________
We are back with a hard even better than before [D-Block & S-Te-Fan – Evolutionz {Ran-D remix}]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 24 ноя 2016, 23:07 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 80
EFI это задница на заднице...

С APIC таймером такой прикол, что это чудо природы (EFI) само ходит в реал мод для вызова VESA биос ;) Например, при SetMode. Если APIC таймер в это время взведён - полные штаны радости гарантированы. Т.е. прерывание таймера честно прилетит в реальный режим. В лучшем случае там будет iret без EOI в APIC, в худшем просто нулевые вектора (как в VBox, например, старшая часть таблицы прерываний).

Писать в видео однозначно лучше своим кодом, EFI-шная консоль - это нецензурно. Во-первых, она тормозная. Даже в коммерческих, в TianoCore - там просто 1200 бод. Забавно, что самописная консоль, выводящая через EFI blit в TianoCore - и то на порядки быстрее. Что и как они там писали - не знаю.

Если графический протокол отдаёт указатель на память, то лучше, конечно, брать его за LFB. У меня ещё и 32 бита - и походы 32<->64 для вывода символа на экран - это слегка перебор ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 25 ноя 2016, 10:09 
Аватара пользователя

Зарегистрирован: 06 мар 2012, 20:05
Сообщения: 130
Откуда: Санкт-Петербург
dixie писал(а):
EFI это задница на заднице...
Я уже оценил. Немного более плотно раскурил, ЧТО оно делает при вызове некоторых функций...
dixie писал(а):
С APIC таймером такой прикол, что это чудо природы (EFI) само ходит в реал мод для вызова VESA биос
Реал-мода в моём случае не было, а вот переключения LM-PM и код-сегментов (ЗАЧЕМ???) происходили. Да и IDT у меня с IST, которые тоже внезапно отваливались - почему пока не понял, и не уверен, что хочу понять.
dixie писал(а):
Писать в видео однозначно лучше своим кодом... Если графический протокол отдаёт указатель на память, то лучше, конечно, брать его за LFB.
Так в итоге и сделал (kernlib/display.cpp@FramebufferDisplay). Производительность не мерял (не заморачивался с оптимизацией), но работает вменяемо. От функций EFI (в том числе Blit) отказался вообще.

_________________
We are back with a hard even better than before [D-Block & S-Te-Fan – Evolutionz {Ran-D remix}]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 25 ноя 2016, 15:29 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 80
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EFI Boot - вопросы
СообщениеДобавлено: 25 ноя 2016, 18:31 
Аватара пользователя

Зарегистрирован: 06 мар 2012, 20:05
Сообщения: 130
Откуда: Санкт-Петербург
dixie писал(а):
восстановил исходную GDT на выходе
Благо, у меня такой ситуации не предусмотрено - bootup в один конец и пошло оно всё в лес.
dixie писал(а):
Не получится от Blit отказаться - в указателе на буфер может быть 0.
Нет LFB - "давай досвидания", fallback на что-нибудь (например, как сейчас, serial-port). Пока на такие не натыкался. В крайнем случае оно надо только для Early Bootup Console, до загрузки модулей, а там какая-нибудь универсалка (с каким-нибудь эмулятором 8086 на "совсем худой конец") спасёт положение.

_________________
We are back with a hard even better than before [D-Block & S-Te-Fan – Evolutionz {Ran-D remix}]


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

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


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

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