系统启动

启动时计算机内存和磁盘布局:
0x0- 640k 空闲空间
-1MB BIOS 启动固件: 20位地址空间
CS:IP=0xf000:fff0
系统处于实模式,PC=16*CS+IP;
4GB 空闲空间

BIOS系统调用: BIOS以中断调用的方式 提供了基本的I/O功能, INT 10h: 字符显示
INT 13h: 磁盘扇区读写 INT 15h: 检测内存大小 INT 16h: 键盘输入
只能在x86的实模式下访问

计算机启动流程:(1)系统加电BIOS初始化硬件 (2)主引导记录:BIOS读取主引导扇区代码 (3)活动分区:主引导扇区代码读取活动分区的引导扇区代码 (4)加载程序:引导扇区代码读取文件系统的加载程序

CPU初始化:
CPU加电稳定后从0XFFFF0读第一条指令
CS:IP = 0xf000:fff0
第一条指令是跳转指令
CPU初始状态为16位实模式:CS:IP是16位寄存器,指令指针PC = 16*CS+IP,最大地址空间是1MB
BIOS初始化过程:
(1)硬件自检POST
(2) 检测系统中内存和显卡等关键部件的存在和工作状态
(3) 查找并执行显卡等接口卡BIOS,进行设备初始化;
(4) 执行系统BIOS,进行系统检测;检测和配置系统中安装的即插即用设备;
(5) 更新CMOS中的扩展系统配置数据ESCD
(6)按指定启动顺序从软盘、硬盘或光驱启动
主引导记录MBR格式:(1)启动代码:446字节:检查分区正确性,加载并跳转到磁盘上的引导程序 (2)硬盘分区表:64字节:描述分区状态和位置 ,每个分区描述信息占据16字节 (3)结束标志字:2字节(55AA):主引导记录的有效标志

分区引导扇区的格式:
JMP(跳转到启动代码:与平台相关的代码) 文件卷头结构(文件系统描述信息) 启动代码(跳转到加载程序) 结束标志 (0x55AA)
加载程序 (bootloader)
首先从文件系统中读取启动配置信息(依靠加载程序) 然后可选的操作系统内核列表和加载参数 最后 依据配置加载指定内核并跳转到内核执行(依靠操作系统内核)

在计算机运行中,内核是被信任的第三方,只有内核可以运行特权级指令

段选择子:

。但是一个段描述符有8个字节长,32位的段寄存器里放不下,这可怎么办?所以我们只能在段寄存器里放描述符在GDT或LDT中的索引,这也就是段选择子(Selector)。就像寄存器放不下一整个数组或对象,我们就用寄存器保存指向它们的指针是一个道理。也就是说在保护模式下,段寄存器不再直接保存段基地址,但它也放不下一整个段描述符,所以我们用它保存段选择子,通过段选择子间接定位到段基地址。
段选择子(16bit)由三部分构成:
• 段描述符索引:段选择子的高13位是段描述符索引,也就是段对应的描述符在描述符表中的序号。索引只有13位也是段描述符表最多只能包含8096个描述符的原因
• TI:第二位是段描述符表的指示位(Table Indicator)。TI=0表示从GDT中读取描述符;TI=1表示从LDT中读取
• RPL:最低两位是请求特权级(Requested Privilege Level),用于特权检查

进入保护模式主要分为以下五步:
1. 准备GDT:准备好要跳转到的段描述符的段基地址,即LABEL_DESC_CODE32的基地址,初始时是0。我们模拟BIU,通过(cs << 4) + LABEL_SEG_CODE32手动计算出LABEL_SEG_CODE32代码段的真实物理地址,并将此物理地址“拆分”保存到LABEL_DESC_CODE32段描述符的基地址,其中ax和al两行代码会保存到第2~4字节的段基址1,ah一行代码会保存到第7字节的段基址2。
2. 设置GDTR:同理,通过(cs << 4) + LABEL_GDT计算出GDT表基地址的真实物理地址,并将其保存到GdtPtr数据结构的高32位。GdtPtr与GDTR的结构是完全一致的,所以最后用lgdt指令将GdtPtr的值加载到GDTR中。
3. 打开A20:为了兼容8086,A20地址线关闭时地址超过1MB时会被回卷,所以必须打开A20来激活32位的寻址能力
4. 设置CR0的PE位:寄存器cr0的第0位是PE位。此位为0时CPU运行于实模式,为1时CPU运行于保护模式
5. 跳转进入:现在就可以通过选择子跳转了。因为这段代码位于16位的Section,所以要用jmp dword保证偏移量不会被截断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝鲸123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值