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

来源:互联网 发布:天行健网络 编辑:程序博客网 时间:2024/04/30 01:40

    系统启动流程简单来说就是下面的顺序:

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

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

   2.MBR:第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序

     =>由stage1.asm编译成的boot.bin被写入mbr分区

   3.引导加载程序(Boot loader):   一支可读取内核文件来执行的软件

     =>由stage2.asm编译成的STAGE2.SYS会被读取到内存

   4.内核文件: 开始操作系统的功能

     =>由core编译成的core.sys被读取到内存,并且eip跳转到core.sys的入口函数。

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

    第一步是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

    谢谢。



    




原创粉丝点击