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