OSDev http://osdev.su/ |
|
UEFI на ассемблере http://osdev.su/viewtopic.php?f=6&t=791 |
Страница 1 из 2 |
Автор: | t0serg [ 04 сен 2013, 23:11 ] |
Заголовок сообщения: | UEFI на ассемблере |
Никак не могу достучаться до флэшки. Либо я неверно пинаю EFI, либо EFI в принципе не позволяет этого, что странно. Код пишется на ассемблере по двум причинам: 1) Это инструментальный монитор и загрузчик 64-битной форт-системы, а потому Си со своей инкапсуляцией здесь явно лишний. 2) Среда разработки edk2 весьма монструозна. В действительности же для превращения собранного nasm'ом бинарника в полноценное приложение EFI достаточно добавить всего 176 байт в начало файла - только COFF (первые два символа PE, а никакой не MZ), Data Directory убрать всю, только один сегмент и никаких Relocation Table (всё равно прямая адресация в x86-64 поддерживается из рук вон плохо). Делаю я следующее. Сначала в ImageHandle нахожу EFI_LOADED_IMAGE_PROTOCOL. Затем вытаскиваю из него DeviceHandle, который открывает мне ещё пару протоколов - EFI_BLOCK_IO_PROTOCOL и EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. Последний вызовом единственной функции даёт EFI_FILE_PROTOCOL. Всё чисто, никаких ошибок. А вот дальше начинаются проблемы - EFI_FILE_PROTOCOL.Open не находит файла, а EFI_BLOCK_IO_PROTOCOL.ReadBlocks читает флэшку, но куда-то не туда, хотя и возвращает Ok (нуль). Может, я неправильно пишу в стек пятый аргумент функции? Метод нетривиальный: после него надо поднять стек ещё на 32 байта (тоже даже если аргументов не более четырёх и они в регистрах) и только потом вызывать EFI-функцию. Во всяком случае, LocateHandle и LocateHandleBuffer, получающие в пятом аргументе адрес возвращаемой информации, так работают без ошибок и возвращают всё тот же DeviceHandle, что и в EFI_LOADED_IMAGE_PROTOCOL с ImageHandle загруженного кода (других FAT32 у меня нет в системе). Понимаю, что ассемблер - это не модно (особенно с UEFI), но может кто сталкивался с таким? |
Автор: | maisvendoo [ 05 сен 2013, 00:38 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
t0serg писал(а): Понимаю, что ассемблер - это не модно Ассемблер - это всегда модно, когда речь идет о железе t0serg писал(а): потому Си со своей инкапсуляцией В C её нет. Она в C++ |
Автор: | phantom-84 [ 05 сен 2013, 09:08 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом. Вообще тема интересная. В связи с этим у меня вопрос. Есть ли хороший эмулятор загрузочного сервиса UEFI поверх BIOS, встроенный в загрузчик? И как обстоят дела с поддержкой UEFI BIOS в эмуляторах ПК? FASM может делать UEFI-бинарники, вообще доп. обработка не нужна. |
Автор: | pavia [ 05 сен 2013, 15:31 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
phantom-84 писал(а): Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом.Вообще тема интересная. В связи с этим у меня вопрос. Есть ли хороший эмулятор загрузочного сервиса UEFI поверх BIOS, встроенный в загрузчик? И как обстоят дела с поддержкой UEFI BIOS в эмуляторах ПК?FASM может делать UEFI-бинарники, вообще доп. обработка не нужна. edk2 он же DUET, это загрузчик работающий поверх BIOS. Эмуляторы поддерживают, но не все. С флешками насколько помню UEFI дружит так же как и BIOS. |
Автор: | phantom-84 [ 05 сен 2013, 18:27 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
pavia писал(а): edk2 он же DUET, это загрузчик работающий поверх BIOS. Слышал о таком. Кто-нибудь пробовал его использовать? Каково качество эмуляции, много ли глюков?
|
Автор: | t0serg [ 05 сен 2013, 19:56 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
maisvendoo писал(а): t0serg писал(а): Понимаю, что ассемблер - это не модно Ассемблер - это всегда модно, когда речь идет о железе UEFI, увы, написан не на ассемблере. maisvendoo писал(а): t0serg писал(а): потому Си со своей инкапсуляцией В C её нет. Она в C++ Инкапсуляция - свойство всех процедурных языков высокого уровня. В Си это выражается наличием локальных структур данных и строгой иерархией вызовов/контекстов функций, имеющих одну точку входа. А уж хорошо это или плохо - всё зависит от решаемой задачи. Когда загрузчик, написанный на Си, больше ядра загружаемой системы, это выглядит нелепо. |
Автор: | t0serg [ 05 сен 2013, 20:37 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
phantom-84 писал(а): Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом. Эх, знать бы в чём. Очень не хочется глубоко зарываться в код UEFI - хоть он и читается нормально. Думал, может кому случалось реализовать на Си описанную последовательность вызовов с иным результатом. Если так - проблема решается путём дизассемблирования либо этой реализации, либо самого UEFI. Не фатально. А вот если это не работает и на Си - значит UEFI и правда не дружит с флешками (только с ними?) - и тогда UEFI вовсе не решает проблему загрузки. Одно непонятно: каким образом UEFI загружает приложение с флешки, а потом не дружит с нею? phantom-84 писал(а): FASM может делать UEFI-бинарники, вообще доп. обработка не нужна. NASM тоже обработки не требует: пара макросов - и можно сразу навсегда забыть об этом. Приведу их здесь, если интересно. FASM делает UEFI-бинарник который, если ему верить, "...cannot be run in DOS mode". Но я не поклонник MZ. UEFI в нём вовсе не нуждается. |
Автор: | phantom-84 [ 06 сен 2013, 11:02 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
t0serg писал(а): Одно непонятно: каким образом UEFI загружает приложение с флешки, а потом не дружит с нею? Это как раз понятно: внутренняя реализация немного отличается от интерфейсной. Но это было всего лишь мое предположение, основанное даже не на личном опыте, а на прочтенном где-то и когда-то, поэтому я сразу сказал о возможной несостоятельности моего предположения. Судя по тексту в стартовом посте вы в этой теме продвинулись значительно дальше, чем большинство из здесь присутствующих. Но если мы будем ее развивать, то вполне возможно найдем решение и вашей проблемы.Цитата: NASM тоже обработки не требует: пара макросов - и можно сразу навсегда забыть об этом. Приведу их здесь, если интересно. Я имел в виду, что сам компилятор поддерживает форматы UEFI-бинарников. Мне казалось, что UEFI-бинарники - это PE- особых типов, а MZ-заглушка - это составляющая PE-формата. Попробую сделать UEFI-бинарник fasm'ом, потом отпишусь... Макросы не помешают, если не найдется более подходящих инструментов.
FASM делает UEFI-бинарник который, если ему верить, "...cannot be run in DOS mode". Но я не поклонник MZ. UEFI в нём вовсе не нуждается. |
Автор: | phantom-84 [ 06 сен 2013, 11:50 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
Попробовал. MZ-заглушка присутствует. Но fasm позволяет ее переопределить (например, можно сделать заглушку, которая бы писала, что это EFI-экзэшник). Кстати релоки могут быть и в 64-разрядном формате. По крайней мере здесь таблица определяется, хотя fasm по умолчанию обычно формирует относительные адреса, поэтому скорее всего она не нужна. |
Автор: | t0serg [ 06 сен 2013, 18:57 ] |
Заголовок сообщения: | Re: UEFI на ассемблере |
phantom-84 писал(а): Макросы не помешают, если не найдется более подходящих инструментов. Вот они: Код: %macro EXE_BEGIN 0 EXE_HEAD_SIZE equ EXE_HEAD_END-$$ EXE_CODE_SIZE equ EXE_CODE_END-EXE_HEAD_END db "PE",0,0 ; метка PE dw 8664h ; 64-битный Long Mode x86-64 dw 1 ; одна секция dd 0,0,0 dw 112 ; размер шапки COFF+ dw 22h ; флаги dw 20bh ; 64-битный PE32+ db 1,0 ; версия сборщика dd EXE_CODE_SIZE dd 0,0 dd EXE_HEAD_SIZE dd EXE_HEAD_SIZE dq 0 TIMES 2 dd 1 ; выравнивание не нужно TIMES 6 dw 0 dd 0 dd EXE_CODE_END-$$ dd EXE_HEAD_SIZE dd 0 ; CRC-32 dw 10 ; это приложение EFI dw 0 TIMES 4 dq 0 dd 0 dd 0 ; нет записей в каталоге данных db ".text",0,0,0 ; стандартное имя секции dd EXE_CODE_SIZE dd EXE_HEAD_SIZE dd EXE_CODE_SIZE dd EXE_HEAD_SIZE dd 0,0 dw 0,0 dd 0e8000020h ; флаги секции (можно всё - ; чтение, запись и выполнение) EXE_HEAD_END: ORG $$-EXE_HEAD_END ; метки в коде пойдут с нуля %endmacro %macro EXE_END 0 EXE_CODE_END: %endmacro EXE_BEGIN и ENE_END вставляются соответственно в начало (после USE64) и в конец исходника. Использую NASM, не принципиально. Как показывает опыт, UEFI 2.10 с чипсета Intel Z77 большего и не требует. Считаю это правилом до первого исключения. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |