赞
踩
先大致介绍下操作系统启动时涉及到的一些概念,见一、二章。第三章是具体详细的启动流程。
1. 实模式:
实模式下,内存地址=段基址:段偏移量
段基址由段寄存器提供,段偏移量由通用寄存器提供。
2. 保护模式:
保护模式支持多任务、实现了虚拟存储系统、拥有存储器保护等保护功能。
二者详细区别和联系,可见文章:深入浅出CPU的两种工作模式
AX:累加器,算术运算的主要寄存器
BX:基址寄存器,基址寻址时用于保护基地址
CX:计数器,在循环指令里作为隐含的计数器
DX:数据寄存器,DX和AX一块存储双字,AX为低,DX为高
SP:堆栈指针寄存器,存放栈顶偏移地址。SP初值决定了所用堆栈区的大小,堆栈的栈底(SS存储)在低地址端,进栈方向是由高地址向低地址增长。实际物理地址=SS:SP
BP:基址指针寄存器,存放堆栈区的某个基地址。因为堆栈pop和push时,BP不用动,均是SP动。所以BP能作为临时变量来存储堆栈里某个操作数地址。
堆栈详情与入栈实现见下图。出栈与下图相反,本文略过。
SI:源变址寄存器,存源操作数的偏移地址
DI:目的变址寄存器,存目的操作数的偏移地址
用于指令的间接、相对寻址,存放当前数据段中某个存储单元的偏移地址。
CS:代码段段寄存器
DS:数据段段寄存器
ES:附加段段寄存器
SS:堆栈段段寄存器
一般情况下,各段分配由OS负责,独立占有64KB
IP:指令指针寄存器,存的是下一条指令在代码段里的偏移地址,IP指向当前执行指令的下一条指令。以8086为例,总线接口单元(BIU)根据CS和IP形成下一条指令的物理地址,一旦这个地址送往存储器,下一条指令就会被从内存中取出,送往CPU指令队列。当执行单元(EU)开始执行这条指令,就会马上修改IP为IP += 这条指令长度(字节数),此举确保IP始终指向下一条指令。
Flags:用于保存状态标志和控制标志。寄存器中的各个标志位是由执行单元(EU)中的算术逻辑单元(ALU)自动生成的。
计算机工作运行大体上就是,先将程序放入存储器里,然后使用PC / IP指针指向这个程序,之后就是取指、执行的循环。
其中,IP(instruction pointer),PC(program counter),两者均指向当前执行指令的下一条指令。二者区别在于,PC是非intel厂家对IP的称呼,实际上PC与CS:IP是一样的功能。
关于CS(code segment)的补充:
CPU在执行指令时,会通过代码段寄存器CS和指令指针寄存器IP来确定要执行的下一条指令的内存地址。IP实际上存的是下一条指令在代码段里的偏移地址,而CS存的是代码段的基址。
实模式和保护模式见上第一章。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的代码。
bootsect.s会将自己本身的代码从0x07c00处移动到0x90000处(为了给之后setup模块移动操作系统代码到0地址腾出空间,避免移动代码时,导致bootsect受影响)。
将setup的四个扇区读到bootsect后面,即0x90200(因bootsect.s只有256Byte).然后显示开机logo画面。
之后再将操作系统整个system模块读取进内存。之后系统跳转到0x90200去执行setup部分。boot部分就结束了。
setup模块将system代码移动到了地址0x0。然后进入保护模式(通过设置cr0寄存器的最后一位为1来切换成保护模式),启动32位的寻址方式,从而使可访问内存变大。
之后保护模式下的地址翻译需要使用gdt(global describe table全局描述符表),gdt表的初始化由setup模块实现。之后,setup会跳到system代码起始处(0x0),结束setup流程,准备开始执行system模块。
在保护模式下,CS(也叫选择子)存放的是段表项号,用于选择gdt表中的具体某个表项。表项中存放着段基址,物理地址 = ip+段基址。
本模块的第一部分代码是head.s,功能也是初始化一些状态例如gdt表页表等等。
setup是初始化并进入保护模式,head是进入保护模式以后的初始化。
至此,操作系统要真正开始工作了,由head汇编代码会跳到用c语言编写的main函数里,然后开始执行linux内核C代码。
对于不同架构不同硬件的主机,相关地址的值还需具体分析对应的汇编.s文件才可得知。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。