x86 マシン用の小さなオペレーティング システムを作成しようとしていて、かなり最小限のブートローダーのコードを書き始めました。私が作成したブートローダーは非常に単純で、マスター ブート レコードの直後にあるセクターからスモール セカンド ブートローダーをロードし、そのコードにジャンプします。マスター ブート レコードのブートローダー コードは正常に動作しているようですが、第 2 段階のブートローダーにジャンプしようとすると問題が発生します。この第 2 段階のブートローダーは、成功を示す文字 (文字 S) を出力することになっているため、コードが実行されていることがわかります。問題は、画面に何も表示されないことです。そのため、第 2 段階のブートローダーが実行されていないと思われます。私が使用したコードは次のとおりです。
マスター ブート レコードのブートローダー:
[BITS 16] ; 16 bit mode
[ORG 0x7C00] ; Boot loader start address
Boot:
; Initial, dl contains drive number
; Set data segment to code segment
mov ax, cs
mov ds, ax
mov es, ax
; Set the stack segment to 0xA000
add ax, 0xA000
mov ss, ax
mov sp, 0x00
; Reset the drive, dl contains drive number
mov ah, 0x00
int 0x13
; Read from drive, dl contains drive number
; Set up output location to 0x7E00: 0x00
mov ax, 0x7E00
mov es, ax ; Load to 0x7E00 : 0x00
mov bx, 0x00
ReadDrive:
mov ah, 0x02
mov al, 0x01 ; Read 1 sector
mov ch, 0x00 ; Read on cylinder 0
mov cl, 0x02 ; Read sector 2
mov dh, 0x00 ; Head number 0
int 0x13
jnc Success
; Print error (character F)
mov al, 0x46
call PrintChar
jmp ReadDrive ; Retry
PrintChar: ; Prints a single character
pusha
mov ah, 0x09
mov bh, 0x00
mov bl, 0x0F
mov cx, 0x01
int 0x10
popa
ret
Success:
jmp 0x7E00:0x00 ; Jump to 2nd stage bootloader
TIMES 510 - ($ - $$) db 0
DW 0xAA55 ; Boot signature
第 2 段階のブートローダーのコード:
[BITS 16]
[ORG 0x7E00]
Boot2:
; Prints the character S to the screen
mov al, 0x53
mov ah, 0x09
mov bh, 0x00
mov bl, 0x0F
mov cx, 0x01
int 0x10
jmp $ ; Loop forever
TIMES 512 - ($ - $$) db 0 ; Fill rest of block
このコードは、次のコードを使用してコンパイルされ、ドライブに書き込まれました。
nasm boot.asm -o boot.bin -f bin
nasm boot2.asm -o boot2.bin -f bin
dd if=boot.bin of=/dev/sd3 bs=512
dd if=boot2.bin of=/dev/sd3 bs=512 seek=1
このコードが書き込まれたデバイスは、16 GB の USB ドライブでした。このコードの起動に使用したコンピューターは、USB からの起動をサポートしており、他のハード ドライブと同じように起動します。コードが実行されないように見える理由は何ですか?