🥲操作一波

一系列操作

在配置好实验环境之后,先建立一个操作系统实验文件夹存放本实验代码:

$mkdir OS2022

进入创建好的文件夹,创建一个mbr.s文件:

$cd OS2022
$touch mbr.s

然后将以下内容保存到 mbr.s 中:

.code16
.global start
start:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
movw $0x7d00, %ax
movw %ax, %sp         # setting stack pointer to 0x7d00
pushw $13             # pushing the size to print into stack
pushw $message        # pushing the address of message into stack
callw displayStr      # calling the display function
loop:
jmp loop
message:
.string "Hello, World!\n\0"
displayStr:
pushw %bp
movw 4(%esp), %ax
movw %ax, %bp
movw 6(%esp), %cx
movw $0x1301, %ax
movw $0x000c, %bx
movw $0x0000, %dx
int $0x10
popw %bp
ret

接下来使用gcc编译得到mbr.s文件:

文件夹下会多一个mbr.o的文件,接下来使用ld进行链接:

我们会得到mbr.elf文件,查看一下属性。

我们发现mbr.elf的大小有3588byte,这个大小超过了一个扇区,不符合我们的要求。

exercise7:假设mbr.elf的文件大小是300byte,那我是否可以直接执行qemu-system-i386 mbr.elf这条命令?为什么?

不管是i386还是i386之前的芯片,在加电后的第一条指令都是跳转到BIOS固件进行开机自检,然 后将磁盘的主引导扇区(Master Boot Record, MBR ;0号柱面,0号磁头,0号扇区对应的扇区, 512字节,末尾两字节为魔数 0x55 和 0xaa )加载到0x7c00。

所以我们使用objcopy命令尽量减少mbr程序的大小:

再查看,发现mbr.bin的大小小于一个扇区。

然后我们需要将这个mbr.bin真正做成一个MBR,新建一个genboot.pl文件

将以下内容保存到文件中

给文件可执行权限

然后利用genboot.pl生成一个MBR,再次查看mbr.bin,发现其大小已经为512字节了

一个MBR已经制作完成了,接下来就是查看我们的成果

会弹出这样一个窗口

输出hello world成功

Last updated