[英]Booting from iso image why memory address of bootloader is not 0x7c00
我寫了一個小bootloader來學習,它會打印出bootloader第一條指令的memory地址,肯定是0x7c00。 請參閱下面的匯編源代碼運行良好。
boot.s
.code16
.global init
init:
mov $0x07c0, %ax
mov %ax, %ds
mov $0x07e0, %ax
mov %ax, %ss
mov $0x2000, %sp
call next
next:
pop %bx
sub $(next-init), %bx # starting point of memory address, now stored in %bx
call print_register
jmp .
print_register: # always print out value in %bx
mov %bh, %cl
shr $0x4, %cl
and $0x0f, %cl
call print_digit
mov %bh, %cl
and $0x0f, %cl
call print_digit
mov %bl, %cl
shr $0x4, %cl
and $0x0f, %cl
call print_digit
mov %bl, %cl
and $0x0f, %cl
call print_digit
ret
print_digit: # %cl has digit to be printed
cmp $0x9, %cl
jg print_digit_atof
print_digit_1to9:
add $0x30, %cl
jmp print_digit_out
print_digit_atof:
add $0x57, %cl
print_digit_out:
mov %cl, %al
mov $0x0e, %ah
int $0x10
ret
.=510
.byte 0x55
.byte 0xaa
as -o boot.o boot.s
ld -o boot.bin --oformat binary -e init boot.o
在VMWare Player中,創建一個虛擬機,將boot.bin
設置為軟盤的內容,然后開機。 我可以看到屏幕上打印了7c00
。
到目前為止,一切都很好。
請參閱此答案Creating a bootable ISO image with custom bootloader ,但現在如果我通過以下命令將boot.bin
作為引導加載程序放入 iso 映像:
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc
mkdir iso
cp floppy.img iso/
genisoimage -quiet -V 'MYOS' -input-charset iso8859-1 -o myos.iso -b floppy.img \
-hide floppy.img iso/
並使用myos.iso
啟動虛擬機,屏幕上顯示0000
。
為什么不是7c00
?
閱讀答案后更新,當我打印出 %cs 時,我可以看到:
1. boot from floppy disk, start address is 0x0000:7c00
2. boot from cd rom, start address is 0x07c0:0000
這是由於對 El Torito CD-ROM 引導規范的常見誤解造成的,該規范說默認情況下應在“7C0 的傳統段”加載模擬引導扇區。 它並沒有說應該使用 07C0:0000 的非傳統起始地址來代替傳統的 0000:7C00,但 BIOS 編寫者仍然將此解釋為要求。
雖然您可以假設您的引導扇區加載在線性地址 00007C00 並且 BIOS 在引導扇區的第一個字節開始執行您的代碼,但您不能假設 CS:IP 的任何特定值。 雖然大多數引導扇區可以寫成不依賴於加載到 CS 中的段值,因為 near JMP 和 CALL 指令是相對的,如果你這樣做了,那么你需要在你的代碼中放置一個 far JMP 指令以確保 CS 加載了預期的段值:
jmp $0x07c0,$start
start:
請注意,上例中段 (0x07c0) 的選擇基於您的引導扇區的“org”為 0,因此引導扇區的第一個字節的偏移量假定為 0 而不是 0x7c00。 這意味着將上述代碼添加到引導扇區的開頭,它將始終打印0000
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.