操作系统实践-1 引导扇区的编写

操作系统实践-1 引导扇区的编写

1.IBM PC的启动过程

CPU加电以后,把CS置为0xFFFF,IP置为0x0000,此时PC = CS << 4 + IP = 0XFFFF0。在IBM PC中,0xFFFF0指向写在ROM中的BIOS,当BIOS完成硬件检测后,会做两件事。

  1. 把启动磁盘上的0柱面,0磁头,1扇区中的512个字节程序读入到RAM的0x7c00
  2. 设定CS = 0x7c00 IP = 0,即PC=0x7c00,指向内存中的496KB的位置。

2.编写bootsect.s打印自己的操作系统Logo

在裸机上打印自己的Logo,根据1.可知要完成以下事情

  1. 写一段汇编程序,使用中断输出字符串,这段程序的大小必须是512字节
  2. 编译完成之后放磁盘的0柱面,0磁道,0扇区
  3. 启动操作系统

上述操作均在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.总结

  1. 编写的可执行程序大小必须位512字节,可以用org来完成
  2. 编译器会自动附上一个Header结构体给可执行程序,在把执行程序变成镜像的时候必须去除前32字节
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值