您的位置:首页 > 其它

自己动手写操作系统(二)

2017-06-17 22:18 232 查看
    系统启动流程简单来说就是下面的顺序:

   ===============================

   1.BIOS:开机主动执行的韧体,会认识到第一个可开机的设备

   2.MBR:第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序
     =>由stage1.asm编译成的boot.bin被写入mbr分区
   3.引导加载程序(Boot loader):   一支可读取内核文件来执行的软件
     [b]=>由stage2[b].asm编译成的STAGE2.SYS会被读取到内存[/b][/b]
   4.内核文件: 开始操作系统的功能
     =>由core编译成的core[b].sys被读取到内存,并且eip跳转到core[b].sys的入口函数。[/b][/b]
   ===============================
    第一步是CPU自己去负责的,我们不需要做任何处理,所以我们要做的是从第二步开始。

    代码介绍如下:

FATSize: dw 0x0000
FATDataSector: dw 0x0000
Stage2ImageName: db "STAGE2 SYS"
Stage2CurrentCluster: dw 0x0000
Stage2FileNotFoundMsg: db "FATAL**: Missing or corrupt STAGE2 image.",0
; Loading addresses
FatRootLoadLoc: dw 0x0200   ; (7C00:0200)
Stage2LoadLoc:  dw 0x0050   ; (0050:0000)
    Stage2ImageName就是第三步中的需要读取到内存的文件名(我们这里简单的叫做stage2.sys)。
    Stage2LoadLoc是指Stage2.sys需要加载到的内存地址,这个需要和stage2.asm中的[ORG 0x500] ; (0x50:0)对应。

    接下来就是一个跳转,将IP直接跳转到0x50:0即0x500上,

push WORD [Stage2LoadLoc] ; IP register..
push WORD 0x0000 ; and code segment for..
retf ; far jump
    我们看到stage2.sys的用ORG定义了起始的地址是0x500,所以这个就是stage1.sys中的跳转连接上了。 [ORG 0x500] ; (0x50:0)
jmp STAGE2_MAIN    接下来,0x500上的第一条指令就是STAGE_MAIN,这样就完成了步骤2的过程,开始步骤3的处理了。stage2.sys的处理下周再分析。
    PS:

    1.这里省略了用汇编从文件系统中查找stage2.sys的流程(FIND_FILE),有兴趣的同学可以自己研究。哈哈。我这里实际上也是直接抄袭了别人的处理流程。

    2.如果boot.bin和stage2.sys都编译成功后,我们可以通过下面的dd命令来写入mrb块。

dd if=/dev/zero of=$OUT_DIR/diska.img bs=512 count=2880
dd if=$OUT_DIR/boot.bin of=$OUT_DIR/boot.img bs=512 count=1
dd if=$OUT_DIR/diska.img of=$OUT_DIR/boot.img skip=1 seek=1 bs=512 count=2879

    谢谢。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: