第一篇章 BIOS(下)

第一篇章 BIOS(上)

四、基本概念

4.1 保护模式

实模式的内存寻址方式是通过:段值 × 16 + 偏移 = 物理地址。这样只能具有1MB的寻址能力。如果想要更为强大的寻址能力,就必须通过一定机制,进入具有更强大寻址能力的保护模式。在保护模式下,不光提供了强大的寻址能力,还提供了内存保护,能够防止用户程序改写内核代码,并为操作系统提供了更好的硬件保障。在该模式下,有了32位的寄存器,一个寄存器就可以表示4G的地址空间。

Protected Mode,就是为段访问提供保护机制,也就说一个段的描述符需要规定对自身的访问权限(Access)。

4.2 标志寄存器EFFLAGS

五、切换保护模式

5.1、建立中断体系

5.1.1 关闭中断

将EFFLAGS中的中断允许标志IF置0,使系统暂时停止中断响应,直至保护模式的中断服务系统建立完成并可用时,才可以重新使用中断(小彩蛋:这也是将setup程序分成两个章节的原因。控制标志位通常不会使用mov等类似指令,而是使用cli\sti等直接位操作指令)

5.1.2 内核移动

将位于SYSSEG(0X1000)位置的内核程序systeem移动至内存的起始处(0X0000)(小彩蛋:由于中断被关闭,BIOS中断体系将不会被触发,且也不需要在使用BIOS中断系统,故可以直接覆盖原有的中断向量表,甚至BIOS中断服务函数。BIOS中断向量表的被覆盖意味着实模式的中断系统被废除)

5.1.3 设置全局描述表

有了32位的寄存器,一个寄存器就可以表示4G的地址空间,但系统有时候可能会进入实模式,也有可能基于扩展需求,使用超过4GB的内存。故需要通过全局描述符来兼容实模式。同时扩展超过32位的段(页)寻址空间。全局描述符表也可视为任务描述符表,该表可主要由软件程序调用。

(1)段描述符GD

每个段描述符为64bit,故在保护模式下需要2个存储单元进行存储,其中第一个单元如下。

31                                                                                                                                  0

段基址低16位

段长度低16位

第二个单元内容如下:

63                                55                                                                   39                         32

段基址高8位

具体描述符

段基址中8位

具体描述符内容如下

55

54

53

52

51~48

47

46~45

44

43~40

G

D

X

AVL

段长度高4位

P

DPL

S

TYPE

段基址=段基址高8位+段基址中8位+段基址低16位

段长度=段长度高4位+段长度低16位

G:段单位(0=1字节,1=4KB)(小彩蛋,当G=1时,即为段页式存储,一个段(此时可称为页目录)即为1M个页,每个页4KB,即为4GB,故很多程序/游戏常规限制为4GB;当G=0时,即直接为段式存储)

D:指令或数据的宽度(0=16位,1=32位)(小彩蛋,通过该标志位可以用于实模式与保护模式切换)

X:保留

AVL:保留

P:段存在标志(0=不存在,1=存在,不存在时需要从外设中获取)

DPL:特权等级(数字越小权限越高,访问等级需要不低于描述符等级才可以访问这个段)

S:描述符类型(0=系统段/门,1=程序段/代码段)

TYPE:

(第3位=0表述数据段,第2位是否向下扩展,第1位是否支持写,第0位是否已被访问)

(第3位=1表述代码段,第2位是否一致,第1位是否支持读,第0位是否已被访问)

(2)全局描述符表GDT

系统中唯一存放段描述的数组,配合程序在保护模式下进行段寻址。该表中存储着所有任务(程序)的段描述符,根据描段描述的作用不同,人为划所有段描述符划分为任务局部描述符表LDT和任务状态段描述符TSS。

(3)设置GDTR

芯片设计者将CPU设计为可以在内存的任意位置存放GDT,当需要访问GDT时,通过GDTR寄存器获取GDT的位置。

后续可通过lgdt等指令访问直接使用GDTR对应的描述符表。

5.1.4 设置中断描述表IDT

中断描述符表IDT将每一个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表相似,IDT也是由8字节长描述符组成的一个数组。由于最多只有256个中断或异常向量,因此IDT无需包含多于256个描述符,IDT中能够含有少于256个描述符。作者认为中断描述符表应理解位门描述表或异常描述符表,避免理解混淆,因为该表中除了中断门描述符外还有其他描述符。中断描述符中的各种内容由CPU的各种硬件电路触发。

  1. 门描述符

中断

表A 中断门描述符

31                                                            16 15 14  13 12             8  7 6 5   4              0

中断函数入口偏移地址高16位

P

DPL

TYPE

0

X

段选择符

中断函数入口偏移地址低16位

注TYPE=0D110b=中断门描述符(D=0代表16位模式,D=1代表32位模式)

表B 陷阱门描述符

31                                                            16 15 14  13 12             8  7 6 5   4              0

陷阱函数入口偏移地址高16位

P

DPL

TYPE

0

X

段选择符

中断函数入口偏移地址低16位

注TYPE=0D111b=陷阱门描述符(D=0代表16位模式,D=1代表32位模式)

表C 任务门描述符

31                                                            16 15 14  13 12             8  7 6 5   4              0

X

P

DPL

TYPE

0

X

段选择符

X

注TYPE=00101b=任务门描述符

表D 调用门描述符

31                                                            16 15 14  13 12             8  7 6 5   4              0

X

P

DPL

TYPE

0

X

段选择符

X

注TYPE=0D100b=调用门描述符(D=0代表16位模式,D=1代表32位模式)

  1. 中断描述符表IDT

同理GDT。

(3)设置IDTR

IDT表能够驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对其在8字节边界上以提升处理器的访问效率。限长值是以字节为单位的IDT表的长度。

芯片设计者系统设计为可以在内存的任意位置存放IDT,当需要访问IDT时,通过IDTR寄存器获取IDT的位置。

后续可通过lidt等指令访问直接使用IDTR对应的描述符表。

5.1.5 切换寻址模式

实模式下只能访问20位地址线,对应1MB的空间,通过以下指令可启动32位总线访问

IN      AL,0x92 ;进入南桥芯片

OR      AL,00000010b ;打开南桥芯片的第2(A20控制位)

OUT     0x92,AL ;将改动过的配置送回南桥芯片

除了通过南桥芯片直接配置也可通过8042键盘键盘输入(Long long ago时候的方式)

5.1.6 配置中断控制器

为了建立保护模式下得中断机制,需要对8259A重新编程(其实就是为了重新定义中断号对应的中断函数,因为intel说在保护模式下我要0x00~0x1F之间的中断号,这些中断号对应的中断函数你linux或其他操作系统别想屏蔽,不知道是不是为了搞后门)。

5.2、切换为保护模式

内容少但顶不住他重要

将CR0寄存器的第0位(PE标志位)置为1后,系统即正式进入保护模式

5.3、跳转head.s

当setup程序将CPU切换为保护模式后,系统的GDTR寄存器开始有效,即后续程序的位置将会通过GDTR进行确定。setup程序的工作内容即将完成(累了累了,终于快下班了,只差移交工作),。

jmpi        0, 8移交工作

0代表后续工作/代码的段内偏移地址为0

8为描述符参数参数,即0b01000,从低到高依次翻译为

00:权限等级最高

0:使用GDT

01:使用GDT表的第一项

此时GDT表中第一项的结构翻译后为

段基址=0

段长度=2K

G:段单位=4KB

D:指令或数据的宽度=32

X:保留

AVL:保留

P:段存在标志=存在

DPL:特权等级=0需要最高等级

S:描述符类型=程序段/代码段

TYPE1010=表述代码段,是一致,支持读,未被访问

也即是程序即将跳转到段基址0+偏移地址0的地方执行,该位置当前存储的system模块,而system模块前半部分即为head.s,即系统任务交接包移交到head.s

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值