根据闪客 Linux0.11 解读:https://github.com/dibingfa/flash-linux0.11-talk
MBR第一个扇区的东西,会在上电后被 BIOS 加载到内存的 0x7c00 位置
根据JYY的课程,编写一个能够打印字符串的 MBR (调用 BIOS 的 API 实现字符打印),如下:
#define SECT_SIZE 512
.code16 // 16-bit assembly
# Entry of the code
.global _start
_start:
lea (msg), %si // R[si] = &msg
again:
movb (%si), %al
incw %si
orb %al, %al
jz done
movb $0x0e, %ah
movb $0x00, %bh
int $0x10
jmp again
done:
jmp .
msg:
.asciz "Hello\r\n"
.org SECT_SIZE - 2
.byte 0x55, 0xAA
接着用如下命令编译并处理它:
gcc -ggdb -c mbr.S
ld mbr.o -Ttext 0x7c00 (把代码段放置在内存位置 0x7c00,实际上是处理代码中使用的地址,让它放在 0x7c00 可以 work,我们这里的代码都不是位置无关代码)
objcopy -S -O binary -j .text a.out mbr.img
我们就制作了磁盘镜像 mbr.img
现在我们可以使用 xxd mbr.img 来观察镜像,如下图
使用 qemu-system-x86_64 mbr.img 启动这个磁盘,可以看到 QEMU 终端打印了 Hello