簡體   English   中英

從 iso 映像引導為什么引導加載程序的 memory 地址不是 0x7c00

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM