Разработка загрузчика в сборке
Я уже сделал часть своей ОС на ассемблере, но теперь я хочу создать для нее и собственный загрузчик вместо GRUB. Когда я разрабатывал свою тестовую ОС на ассемблере, я помню, что загружаю ее так:
org 0x7c00
bits 16
; OS Kernel Here
times 510 - ($-$$) db 0
dw 0xAA55
Это я уже знаю. Теперь я хочу использовать это и выполнить "настоящую" ОС, которая будет *.bin-файлом, записанным во 2-й сектор дискеты. Тогда я хочу узнать кое-что
- Как я могу сделать загрузчик в ассемблере, чтобы выполнить то, что будет запускаться на 2-м секторе дискеты?
- Мне нужно добавить что-нибудь к источнику сборки, который будет размещен на 2-м секторе дискеты?
1 ответ
Ты используешь int 0x13
загрузить необходимое количество секторов и перейти к месту, где вы разместили новый код. На втором этапе вам ничего не нужно делать, но вам нужно убедиться, что вы установили DS
быть действительным для всех, где вы загружаете код.
Пример из моего маленького архива ОС:
/* BIOS loads the sectors into es:bx */
pushw $STAGE1_WORKSEG
popw %es
movw $STAGE1_OFFSET, %bx
read_stage1:
/* Try to read in a few sectors */
movb $0x2, %cl /* Sector */
movb $0x0, %ch /* Cylinder */
movb $0x0, %dh /* Head */
movb $0x0, %dl /* Drive */
movb $0x2, %ah /* BIOS read function */
/* How many sectors to load */
movb $STAGE1_SIZE, %al
int $0x13
jnc read_stage1_done
/* Reset drive */
xorw %ax, %ax
int $0x13
jmp read_stage1
read_stage1_done:
/* Perform a long jump into stage1 */
ljmp $STAGE1_WORKSEG, $STAGE1_OFFSET
call halt
halt:
/*
* Function: halt
* Synopsis: Sends the processor into a permanent halted status
* Notes:
* The only way out of this is to manually reboot
*/
hlt /* Halt the processor */
jmp halt
Это в формате GAS, поэтому вы хотите изменить порядок операндов, потому что похоже, что вы используете NASM из times
инструкция. Имена переменных должны быть самоочевидными.
Если вы разрабатываете хобби ОС, то http://forum.osdev.org/
это хорошее место, чтобы получить поддержку от других, делающих то же самое. Это немного более специализировано, чем stackru, и многие вещи ОС могут быть довольно эзотерическими.
В 16-битном режиме вы можете использовать приведенный ниже код для загрузки ядра с диска в память:
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, al
jne disk_error
ret
disk_error:
mov bx, DISK_ERROR_MSG
call print_string
jmp $
DISK_ERROR_MSG db "Disk read error !", 0
load_kernel:
mov bx, MSG_LOAD_KERNEL
call print_string
mov bx, KERNEL_OFFSET
mov dh, 54
mov dl, [BOOT_DRIVE]
call disk_load
ret