自己动手写操作系统(二)
来源:互联网 发布:天行健网络 编辑:程序博客网 时间: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
谢谢。
- 自己动手写操作系统(二)
- 自己动手写操作系统(二)
- 自己动手写操作系统(二)
- 自己动手写操作系统(二)
- 自己动手写操作系统二(编写内核Hello World 教程)
- 自己动手写OS(操作系统)
- 自己动手写操作系统(三)
- 自己动手写操作系统( 转)
- 自己动手写操作系统(三)
- 自己动手写OS(操作系统)
- 自己动手写操作系统(三)
- 自己动手写操作系统(一)
- 自己动手写操作系统(一)
- 自己动手写操作系统(三)
- 自己动手写操作系统(四)
- 自己动手写操作系统(五)
- 自己动手写操作系统(六)
- 自己动手写操作系统(七)
- 徇私舞弊不移交刑事案件罪
- yum制作(笔记)
- MySQL表的约束
- Eureka Server的高可用
- Android—Activity启动
- 自己动手写操作系统(二)
- 错误中学习--Exception occurred during processing request: null
- 线程
- 树莓派学习笔记2
- bzoj2199 [Usaco2011 Jan]奶牛议会 2-SAT
- HQL及Query的应用【全】
- CRC循环冗余校验
- office(如:Word、Excel、PPT 等)文件轻松实现在线预览
- Java程序员的日常