2016-07-21 8 views
1

Итак, за последние несколько недель я рассмотрел возможность написания загрузчика и ядра в сборке (x86/x86_64), и, хотя я пробовал более сложные решения, перед тем, как написать сам, я решил для того, чтобы опробовать какой-то код, пользователь по имени Sined опубликовано here. Мой Загрузчик код:Загрузка загрузчика/ядра только на виртуальной машине

[BITS 16] 
[ORG 0x7C00] 

MOV DL, 0x0 ;drive 0 = floppy 1 
MOV DH, 0x0 ;head (0=base) 
MOV CH, 0x0 ;track/cylinder 
MOV CL, 0x02 ;sector (1=bootloader, apparently sectors starts counting at 1 instead of 0) 
MOV BX, 0x1000 ;place in RAM for kernel - I suppose randomly chosen on examples 
MOV ES, BX ;place BX in pointer ES 
MOV BX, 0x0 ;back to zero - also has something to do with RAM position 

ReadFloppy: 
MOV AH, 0x02 
MOV AL, 0x01 
INT 0x13 
JC ReadFloppy ;if it went wrong, try again 

;pointers to RAM position (0x1000) 
MOV AX, 0x1000 
MOV DS, AX 
MOV ES, AX 
MOV FS, AX 
MOV GS, AX 
MOV SS, AX 

JMP 0x1000:0x0 

;assuming we get never back here again, so no further coding needed (kernel handles everything now) 

TIMES 510 - ($ - $$) db 0 ;fill resting bytes with zero 
DW 0xAA55 ;end of bootloader (2 bytes) 

Мой файл ядра:

;set print-registers 
MOV AH, 0x0E ;function nr 
MOV BH, 0x00 ;page 
MOV BL, 0x07 ;color 

MOV SI, msg ;move msg to SI-pointer 
CALL PrintString ;call function to print SI (msg) 

JMP $ ;hang 

PrintString: 
.next_char: 
MOV AL, [SI] ;current character 
OR AL, AL 
JZ .print_done ;if current char is zero, go to end 
INT 0x10 ;print character 
INC SI ;increase pointer to msg (next character) 
JMP .next_char 
.exit_char 
RET 

msg db 'Hello world from the kernel!', 13, 10, 0 

TIMES 512 - ($ - $$) db 0 ;fill the rest 

я могу получить все, чтобы собрать нормально, и один двоичный созданный ботинки внутри VirtualBox при подключении к контроллеру гибких дисков. Хотя это дает мне уверенность в работе с моим собственным загрузчиком и ядром, я бы хотел получить удовольствие от загрузки на голом металле.

Я попытался загрузить изображение с USB-накопителей безрезультатно, и я уверен, что я правильно рисую USB-накопители. Я начинаю испытывать чувство, что мне не хватает чего-то действительно очевидного здесь. Я подозреваю, что это связано с использованием 13h для чтения с «флоппи», где я на самом деле пытаюсь прочитать исходный двоичный файл с USB. Это так? Если да, то как я могу переписать загрузчик для чтения с неспецифического диска вместо гибкого диска?

+1

Я не смотрел код, который у вас там, так как мне потребуется щелкнуть ссылку ... однако, если код не содержит блок параметров BIOS, я могу сказать вам, что я абсолютно видел реальное оборудование быть гораздо более хитрым, чем виртуальные машины. Убедитесь, что у вас правильно отформатированный BPB и посмотрите, помогает ли это. –

+0

Я уже пытался добавить блок параметров BIOS, и он ничего не изменил. – Lobstre

+1

Пожалуйста, разместите соответствующий код в качестве [MCVE] –

ответ

1

Я написал несколько General Bootloader tips, которые относятся к этому коду. В частности, у меня есть этот совет:

  1. Когда BIOS прыгает в код, вы не можете полагаться на CS, DS, ES, SS, SP регистрирует имеющие действительные или ожидаемые значения. Они должны быть настроены надлежащим образом при запуске загрузчика. Можно гарантировать, что ваш загрузчик будет загружен и запущен с физического адреса 0x00007c00 и что номер загрузочного диска загружается в регистр DL.

Загрузочный диск первой дискеты, как правило, 0 так что ваша виртуальная машина, вероятно, работал, потому что вы загрузились гибкий образ диска установлен в качестве виртуального диска A:. Код, вызывающий проблемы, находится в коде ReadFloppy. В частности, эта строка:

MOV DL, 0x0 ;drive 0 = floppy 1 

У вас нет нулевого кода, где вы должны использовать значение, переданное BIOS. В любой системе, где вы загружались как ничего, кроме флоппи-дисковода A: она, скорее всего, потерпит неудачу. Чтобы устранить проблему, просто снимите .

Рекомендую ознакомиться с советами других загрузчиков, которые я предоставил в предоставленной ссылке.

Смежные вопросы