Почему мой голый металлический привет код мира не загружается в x86_64 - PullRequest
2 голосов
/ 26 марта 2020

Я выполнял проект hello world для запуска на своем физическом компьютере с архитектурой x86, но код не запустился (загрузился), и машина перешла к следующему загрузочному устройству, я написал код в сборке, следующие шаги было то, что я сделал:

шаг 1: код для отображения символов A abd B от B ios вызывает

.L1 :
mov %ah,0x0E     
mov %bh,0x00     
mov %bl,0x07     
mov %al,65   
INT $0x10    

mov %ah,0x0E     
mov %bh,0x00     
mov %bl,0x07     
mov %al,66   
INT $0x10   
jmp .L1

шаг 2:

сборка кода и создание кода в двоичном формате:

as -o Code Code.txt
objcopy -O binary Code binfile

шаг 3:

открывает HxD и отображает двоичную форму кода сборки и дополняет его нулями до последних двух байтов первых 512 байт, в который я добавил их 55AA (в шестнадцатеричном формате), чтобы он выглядел следующим образом:

enter image description here

шаг 4:

скопировал изображение в fla sh memory:

dd bs=512 count=1 if=binfile of="\\.\e:"

(Примечание: я использую dd на windows)


  • Примечание: полагалось на то, что bootstrap код в первом секторе покажет два символа, которые не использовали, и дальнейший загрузчик, потому что это мой первый проект oi удалось сохранить его простым.

  • Главы не отображаются, и отображается сообщение о недопустимом загрузочном устройстве, устройство переходит к следующему устройству и загружается windows нормально ... что я здесь не хватает?

1 Ответ

3 голосов
/ 26 марта 2020

Сборник некоторых вопросов, обсуждаемых в комментариях:

  1. Каждая машина x86 загружается в 16-битном реальном режиме , поэтому ваш загрузочный код должен быть 16-битным код. Вам нужно указать .code16 в верхней части исходного файла, чтобы получить GNU для его создания. Если вы хотите в конечном итоге выполнить в 64-битном длинном режиме, вы должны написать код для переключения режима. Это хорошо задокументировано в руководствах по процессору, но немного сложнее. (Обратите внимание, что после этого вы больше не сможете вызывать функции int 10h B IOS, поскольку они также являются 16-битным кодом.)

  2. В сборке AT & T синтаксис, который gnu использует по умолчанию при немедленной загрузке 0x0e в регистр ah, записывается как mov $0x0e, %ah. Вместо этого ваша версия будет хранить содержимое %ah в памяти 0x0e, а это не то, что вам нужно. Это относится практически ко всем инструкциям в вашем коде. Но вместо этого вы можете использовать другой ассемблер, например nasm, который лучше подходит для работы с 16-битным кодом.

  3. Основная загрузочная запись (нулевой сектор жесткого диска). ) должен содержать таблицу разделов для диска, начиная со смещения 446. У вас там только нули. В некотором смысле это не должно иметь значения, потому что ваш код никогда не заходит так далеко, как попытка что-либо прочитать с диска, но он может заставить B IOS решить, что MBR недействительна, а диск не загрузочный.

  4. Я не уверен, что ваша команда dd фактически записывает основную загрузочную запись диска. Вместо этого он может записывать в загрузочный сектор одного из своих разделов. Я не очень знаком с dd для windows, поэтому вам нужно разобраться с этим самостоятельно.

Я не уверен, что ваша проблема вызванные одной из этих проблем или чем-то еще, но вам все равно придется в конечном итоге исправить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...