操作系统基础之启动

1.冯诺依曼结构

取指执行,取IP指向的地址的指令,然后执行。
这里写图片描述

2.打开电源后计算机如何执行

对于x86cpu,一开机cpu处于实模式,CS和IP指针自动赋值,寻址CS<<4加IP,正好是ROM BIOS的映射区(0xFFFF0),BIOS中固化了一段代码,执行检查等操作,然后将磁盘0磁道0扇区(即引导扇区512字节,内含有操作系统引导程序)读入0x7c00处,并设置CSIP值。
这里写图片描述

2.1引导扇区代码bootsect.s

执行一系列操作,将7c00中代码移动到90000处。
这里写图片描述
这里写图片描述
jmpi go,INITSEG为简介跳转指令,CS置为INITSEG,ip置为go的地址,相当于继续执行go处的指令,但由于此start代码存放位置已由7c00
到90000,所以需要这么写。
然后是INT13中断,继续读取磁盘,读取2扇区(ah=0x02,cl=0x02),一次读取4个扇区(al=4),并存到内存es:bx处。
这里写图片描述
读入set模块后,接下来是显示logo:Loading system…,调用BIOS中断INT10。再接着读入system模块,最后跳转到0x9020:0x0000执行setup.s。
这里写图片描述

2.2 setup.s

setup.s开始执行时调用INT10、INT15中断,取出光标位置,获取内存等硬件参数并存入0x90000处,接下来将system模块即操作系统移动到0地址处,一直到0x8000处。这里写图片描述
移动完成后,接下来就要将控制权交给system模块,怎么交呢?首先是调用一个非常厉害的指令mov ax,#0x0001 mov cr0,ax和jmpi 0,8,cr0寄存器的最后一位如果为1,则cpu进入保护模式(之前是0为实模式),在保护模式下,寻址方式发生了改变,由原来的CS偏移加IP寻址变成了查询gdt表寻址,具体地址为查表CS的值加IP,如下图:
这里写图片描述
指CS的值要通过查询gdt表获得,所以首先要在setup.s中初始化gdt表,如下代码:
这里写图片描述
一个.word对应64位,即一个表项的大小。因此上面的jmpi 0,8 就可以得到解释了,即IP=0(32位),CS的值要查询gdt表的8地址处的那一个表项,根据表项的解释,得到CS的值为0x00000000(32位):
这里写图片描述
因此就jmp到了0x0000处,即跳到system模块执行。

2.3 head.s

前面说到程序跳到了system模块,system模块的第一部分代码就是head.s(system由很多文件组成,需要用到Makefile进行编译)。
从setup开始cpu进入保护模式,因此汇编代码也变成了32位汇编,head.s主要也是设置一些gdt表等一些页表(不懂)的工作:
这里写图片描述
设置完成后就可以调到main函数执行了,具体过程就是将main和其参数压栈,然后jmp set_paging设置页表,之后调用ret指令出栈,然后main就被弹出:
这里写图片描述
然后就进入c语言程序了:
这里写图片描述
main的主要工作就是XX_Init,包括内存、中断、设备、时钟、cpu等的初始化,以mem_init为例:
这里写图片描述
建立一个内存表(数组,每个元素代表4k,称为页),使用过的内存数组元素置为100,没使用的为0,就可以管理内存了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值