Мне удалось создать минимальный загрузочный сектор, который работает с QEMU 2.0.0 Ubuntu 14.04:
.code16
.global _start
_start:
cli
mov $msg, %si
mov $0x0e, %ah
loop:
lodsb
or %al, %al
jz halt
int $0x10
jmp loop
halt:
hlt
msg:
.asciz "hello world"
.org 510
.word 0xaa55
Скомпилировано с помощью
as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
Пример доступен для этого репо: https://github.com/cirosantilli/x86-bare-metal-examples/tree/2b79ac21df801fbf4619d009411be6b9cd10e6e0/no-ld-script
При:
qemu -hda main.img
он показывает hello world
на экране эмулятора, как ожидалось.
Но если я пытаюсь записать на USB-порт:
sudo dd if=main.img of=/dev/sdb
затем подключите USB к ThinkPad T400 или T430, нажмите F12 и выберите USB, что я наблюдаю:
- появляются некоторые загрузочные сообщения.
- тогда экран будет пустым, только указатель подчеркивания вверху
Я также тестировал тот же USB-образ с Ubuntu 14.04, и он загрузился отлично, поэтому USB работает.
Как мне изменить этот пример, чтобы он загружался на аппаратном обеспечении и отображал сообщение hello world?
В чем разница между изображением Ubuntu и тем, что я создал?
Где это документировано?
Я загрузил вывод sudo dmidecode
на T400: https://gist.github.com/cirosantilli/d47d35bacc9be588009f#file-lenovo-t400