OSDev

для всех
Текущее время: 28 апр 2024, 09:43

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: UEFI на ассемблере
СообщениеДобавлено: 04 сен 2013, 23:11 

Зарегистрирован: 04 сен 2013, 21:56
Сообщения: 17
Никак не могу достучаться до флэшки. Либо я неверно пинаю 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), но может кто сталкивался с таким?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 00:38 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
t0serg писал(а):
Понимаю, что ассемблер - это не модно

Ассемблер - это всегда модно, когда речь идет о железе
t0serg писал(а):
потому Си со своей инкапсуляцией

В C её нет. Она в C++


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 09:08 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом.

Вообще тема интересная. В связи с этим у меня вопрос. Есть ли хороший эмулятор загрузочного сервиса UEFI поверх BIOS, встроенный в загрузчик? И как обстоят дела с поддержкой UEFI BIOS в эмуляторах ПК?

FASM может делать UEFI-бинарники, вообще доп. обработка не нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 15:31 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
phantom-84 писал(а):
Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом.Вообще тема интересная. В связи с этим у меня вопрос. Есть ли хороший эмулятор загрузочного сервиса UEFI поверх BIOS, встроенный в загрузчик? И как обстоят дела с поддержкой UEFI BIOS в эмуляторах ПК?FASM может делать UEFI-бинарники, вообще доп. обработка не нужна.

edk2 он же DUET, это загрузчик работающий поверх BIOS.
Эмуляторы поддерживают, но не все.
С флешками насколько помню UEFI дружит так же как и BIOS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 18:27 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
edk2 он же DUET, это загрузчик работающий поверх BIOS.
Слышал о таком. Кто-нибудь пробовал его использовать? Каково качество эмуляции, много ли глюков?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 19:56 

Зарегистрирован: 04 сен 2013, 21:56
Сообщения: 17
maisvendoo писал(а):
t0serg писал(а):
Понимаю, что ассемблер - это не модно

Ассемблер - это всегда модно, когда речь идет о железе

UEFI, увы, написан не на ассемблере.

maisvendoo писал(а):
t0serg писал(а):
потому Си со своей инкапсуляцией

В C её нет. Она в C++

Инкапсуляция - свойство всех процедурных языков высокого уровня. В Си это выражается наличием локальных структур данных и строгой иерархией вызовов/контекстов функций, имеющих одну точку входа. А уж хорошо это или плохо - всё зависит от решаемой задачи.

Когда загрузчик, написанный на Си, больше ядра загружаемой системы, это выглядит нелепо.


Последний раз редактировалось t0serg 05 сен 2013, 21:04, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 05 сен 2013, 20:37 

Зарегистрирован: 04 сен 2013, 21:56
Сообщения: 17
phantom-84 писал(а):
Я читал, что UEFI, как это ни странно, плохо дружит с флешками. Хотя скорее всего проблема не в этом.

Эх, знать бы в чём. Очень не хочется глубоко зарываться в код UEFI - хоть он и читается нормально.

Думал, может кому случалось реализовать на Си описанную последовательность вызовов с иным результатом. Если так - проблема решается путём дизассемблирования либо этой реализации, либо самого UEFI. Не фатально. А вот если это не работает и на Си - значит UEFI и правда не дружит с флешками (только с ними?) - и тогда UEFI вовсе не решает проблему загрузки.

Одно непонятно: каким образом UEFI загружает приложение с флешки, а потом не дружит с нею?

phantom-84 писал(а):
FASM может делать UEFI-бинарники, вообще доп. обработка не нужна.

NASM тоже обработки не требует: пара макросов - и можно сразу навсегда забыть об этом. Приведу их здесь, если интересно.
FASM делает UEFI-бинарник который, если ему верить, "...cannot be run in DOS mode". Но я не поклонник MZ. UEFI в нём вовсе не нуждается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 06 сен 2013, 11:02 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
t0serg писал(а):
Одно непонятно: каким образом UEFI загружает приложение с флешки, а потом не дружит с нею?
Это как раз понятно: внутренняя реализация немного отличается от интерфейсной. Но это было всего лишь мое предположение, основанное даже не на личном опыте, а на прочтенном где-то и когда-то, поэтому я сразу сказал о возможной несостоятельности моего предположения. Судя по тексту в стартовом посте вы в этой теме продвинулись значительно дальше, чем большинство из здесь присутствующих. Но если мы будем ее развивать, то вполне возможно найдем решение и вашей проблемы.

Цитата:
NASM тоже обработки не требует: пара макросов - и можно сразу навсегда забыть об этом. Приведу их здесь, если интересно.
FASM делает UEFI-бинарник который, если ему верить, "...cannot be run in DOS mode". Но я не поклонник MZ. UEFI в нём вовсе не нуждается.
Я имел в виду, что сам компилятор поддерживает форматы UEFI-бинарников. Мне казалось, что UEFI-бинарники - это PE- особых типов, а MZ-заглушка - это составляющая PE-формата. Попробую сделать UEFI-бинарник fasm'ом, потом отпишусь... Макросы не помешают, если не найдется более подходящих инструментов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 06 сен 2013, 11:50 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Попробовал. MZ-заглушка присутствует. Но fasm позволяет ее переопределить (например, можно сделать заглушку, которая бы писала, что это EFI-экзэшник). Кстати релоки могут быть и в 64-разрядном формате. По крайней мере здесь таблица определяется, хотя fasm по умолчанию обычно формирует относительные адреса, поэтому скорее всего она не нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UEFI на ассемблере
СообщениеДобавлено: 06 сен 2013, 18:57 

Зарегистрирован: 04 сен 2013, 21:56
Сообщения: 17
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 большего и не требует. Считаю это правилом до первого исключения.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

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


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

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


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

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