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