操作系统实践-1 引导扇区的编写
1.IBM PC的启动过程
CPU加电以后,把CS置为0xFFFF,IP置为0x0000,此时PC = CS << 4 + IP = 0XFFFF0。在IBM PC中,0xFFFF0指向写在ROM中的BIOS,当BIOS完成硬件检测后,会做两件事。
- 把启动磁盘上的0柱面,0磁头,1扇区中的512个字节程序读入到RAM的0x7c00
- 设定CS = 0x7c00 IP = 0,即PC=0x7c00,指向内存中的496KB的位置。
2.编写bootsect.s打印自己的操作系统Logo
在裸机上打印自己的Logo,根据1.可知要完成以下事情
- 写一段汇编程序,使用中断输出字符串,这段程序的大小必须是512字节
- 编译完成之后放磁盘的0柱面,0磁道,0扇区
- 启动操作系统
上述操作均在Bochs虚拟机中完成
编写bootsect.s
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10!使用0x10中断确定光标位置
mov cx,#27
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax
mov ax,#0x1301
int 0x10!将es:bp指向的内容打印在屏幕上
inf_loop:
jmp inf_loop!必须无限循环下去
!数据段
msg1:
.byte 13,10
.ascii "My os is Loading--LMC"
.byte 13,10,13,10
.org 510!填充到510字节
boot_flag:
.word 0xAA55!硬盘标志位,表示可以用,最后一行空行(我的编译器BUG)
3.用as86编译bootsect.s并用python去除其头部
编译,-0表示16位寻址,-a表示兼容
as86 -0 -a -o bootsect.o bootsect.s
链接,-s表示去除文件的表示符号
ld86 -0 -o -s bootsect bootsect.s
但是这样编写的文件大小不是512字节,因为编译器会自动附上一个32字节大小的头部
用Python来去除头部的32字节
f = open("bootsect","rb")
w = f.read(32)
w = f.read()
f.close()
f = open("bootsect","wb")
f.write(w)
f.close()
执行完之后
4.启动bootsect
5.总结
- 编写的可执行程序大小必须位512字节,可以用org来完成
- 编译器会自动附上一个Header结构体给可执行程序,在把执行程序变成镜像的时候必须去除前32字节