操作系统启动流程


网易课堂视频课学习总结( 操作系统之基础-网易云课堂),如有错误,请各位大佬及时指出。

先大致介绍下操作系统启动时涉及到的一些概念,见一、二章。第三章是具体详细的启动流程。

一、CPU工作模式

1. 实模式:
实模式下,内存地址=段基址:段偏移量
段基址由段寄存器提供,段偏移量由通用寄存器提供。

2. 保护模式:
保护模式支持多任务、实现了虚拟存储系统、拥有存储器保护等保护功能。
二者详细区别和联系,可见文章:深入浅出CPU的两种工作模式

二、 CPU内的寄存器结构

1.通用寄存器:

1.1 数据寄存器:

AX:累加器,算术运算的主要寄存器
BX:基址寄存器,基址寻址时用于保护基地址
CX:计数器,在循环指令里作为隐含的计数器
DX:数据寄存器,DX和AX一块存储双字,AX为低,DX为高

1.2 指针寄存器:

SP:堆栈指针寄存器,存放栈顶偏移地址。SP初值决定了所用堆栈区的大小,堆栈的栈底(SS存储)在低地址端,进栈方向是由高地址向低地址增长。实际物理地址=SS:SP

BP:基址指针寄存器,存放堆栈区的某个基地址。因为堆栈pop和push时,BP不用动,均是SP动。所以BP能作为临时变量来存储堆栈里某个操作数地址。

堆栈详情与入栈实现见下图。出栈与下图相反,本文略过。
在这里插入图片描述

1.3 变址寄存器

SI:源变址寄存器,存源操作数的偏移地址
DI:目的变址寄存器,存目的操作数的偏移地址
用于指令的间接、相对寻址,存放当前数据段中某个存储单元的偏移地址。

2.段寄存器

CS:代码段段寄存器
DS:数据段段寄存器
ES:附加段段寄存器
SS:堆栈段段寄存器
一般情况下,各段分配由OS负责,独立占有64KB

3.指令指针寄存器

IP:指令指针寄存器,存的是下一条指令在代码段里的偏移地址,IP指向当前执行指令的下一条指令。以8086为例,总线接口单元(BIU)根据CS和IP形成下一条指令的物理地址,一旦这个地址送往存储器,下一条指令就会被从内存中取出,送往CPU指令队列。当执行单元(EU)开始执行这条指令,就会马上修改IP为IP += 这条指令长度(字节数),此举确保IP始终指向下一条指令。

4.标志寄存器

Flags:用于保存状态标志和控制标志。寄存器中的各个标志位是由执行单元(EU)中的算术逻辑单元(ALU)自动生成的。

三、打开电源以后,PC=?

计算机工作运行大体上就是,先将程序放入存储器里,然后使用PC / IP指针指向这个程序,之后就是取指、执行的循环。

其中,IP(instruction pointer),PC(program counter),两者均指向当前执行指令的下一条指令。二者区别在于,PC是非intel厂家对IP的称呼,实际上PC与CS:IP是一样的功能。

关于CS(code segment)的补充:
CPU在执行指令时,会通过代码段寄存器CS和指令指针寄存器IP来确定要执行的下一条指令的内存地址。IP实际上存的是下一条指令在代码段里的偏移地址,而CS存的是代码段的基址。

  • 在实模式下,能通过两者直接算出内存中实际的物理地址。以8086为例,下一条指令的实际物理地址=CS<<4+IP。
  • 在保护模式下,除了CS、IP外还需gdt表才能算出实际物理地址。

实模式和保护模式见上第一章。CS、IP等寄存器详细知识点见上第二章。

对于X86结构,刚开机时CPU处于实模式(实模式寻址 CS:IP ,即 CS<<4+IP )

开机时,默认值CS=0xFFFF,IP=0x0000,寻址0xFFFF0(这个地址是ROM BIOS映射区。BIOS —— basic input output system )。
开机后系统会直接跳到这部分代码执行,这是刚上电以后,内存中唯一有代码的地方。这部分代码会检查RAM、键盘、显示器等等。

然后这段代码会将0磁盘0磁道0扇区读入内存0x7c00处(一个扇区512Byte,0磁道0扇区是操作系统的引导扇区。引导扇区的代码就是bootsect.s。后缀.s文件是汇编文件),然后将CS设为0x07c0,ip为0x0000(即能寻址到0x7c00),即开始执行bootsect.s的代码。

1. bootsect.s模块:本部分将操作系统代码从磁盘读进内存。

bootsect.s会将自己本身的代码从0x07c00处移动到0x90000处(为了给之后setup模块移动操作系统代码到0地址腾出空间,避免移动代码时,导致bootsect受影响)。

将setup的四个扇区读到bootsect后面,即0x90200(因bootsect.s只有256Byte).然后显示开机logo画面。

之后再将操作系统整个system模块读取进内存。之后系统跳转到0x90200去执行setup部分。boot部分就结束了。

2. setup模块:本部分将完成OS启动前的初始化设置,切入保护模式。

setup模块将system代码移动到了地址0x0。然后进入保护模式(通过设置cr0寄存器的最后一位为1来切换成保护模式),启动32位的寻址方式,从而使可访问内存变大。

之后保护模式下的地址翻译需要使用gdt(global describe table全局描述符表),gdt表的初始化由setup模块实现。之后,setup会跳到system代码起始处(0x0),结束setup流程,准备开始执行system模块。
在保护模式下,CS(也叫选择子)存放的是段表项号,用于选择gdt表中的具体某个表项。表项中存放着段基址,物理地址 = ip+段基址。

3. system模块:

本模块的第一部分代码是head.s,功能也是初始化一些状态例如gdt表页表等等。

setup是初始化并进入保护模式,head是进入保护模式以后的初始化。

至此,操作系统要真正开始工作了,由head汇编代码会跳到用c语言编写的main函数里,然后开始执行linux内核C代码。

对于不同架构不同硬件的主机,相关地址的值还需具体分析对应的汇编.s文件才可得知。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值