整理行文思路.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2022-04-26 15:36:18 +08:00
parent 8208ffa597
commit eb80a42de6
1 changed files with 25 additions and 14 deletions

View File

@ -23,36 +23,47 @@ Intel 引入段寄存器的另一个好处是能够将内粗数据段、代码
### 分段管理的内存安全
x86/64 系列处理器在实模式下,其段地址+偏移地址即可以得到线性地址。而进入保护模式后,段寄存器中的数据被分割为不同的功能区域:
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/002.png)
其中Index 域用于在段描述符表中定位具体的表项。通过表项中的基地址+程序给出的偏移地址才能够得到真正的线性地址。
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/003.png)
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/004.png)
x86/64 系列处理器通过段描述符、段寄存器和段选择子中的如下信息去实现系统内存安全机制:
* DPLDescriptor Privilege Level段描述符的 DPL 域。
* CPLCurrnet Privilege LevelCS 或 SS 寄存器的 Bit0 和 Bit1 位。
* RPLRequest Privilege Level段选择子的 Bit0 和 Bit1。
段选择子只是一个带有固定结构的数据,它被加载到对应的段寄存器之后才有实际意义。
所谓段选择子,即一个带有固定结构的数据(被加载到对应的段寄存器之后才有实际意义),它指定了将要使用 GDT全局段描述符表 或 LDT局部段描述符表 表中的那一项(段寄存器指定了正在使用的表项)
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/002.png)
段选择子指定了将要使用 GDT 或 LDT 表中的那一项,段寄存器指定了正在使用的表项。而 GDTR 和 LDTR 指定了当前所用 GDT 和 LDT 所在内存的起始位置。
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/003.png)
段寄存器和段描述符组合形成了线性地址。
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/004.png)
GDTR 和 LDTR 指定了当前所用 GDT 和 LDT 所在内存的起始位置。
***注x86/64 系列处理器进入保护模式时必须开启段式管理机制;进入长模式时必须开启分页机制。***
程序运行时,必然有需要修改段寄存器的需求,此时需要将载段选择子加载到段寄存器,而段选择子的 RPL 代表了请求的操作级别。Intel 有 4 个操作级别(运行级别/安全级别),数字越大,运行级别越低:
程序运行时,必然有需要修改段寄存器的需求,此时需要通过指令将载段选择子加载到段寄存器,而段选择子的 RPL 代表了请求的操作级别。Intel 有 4 个操作级别(运行级别/安全级别),数字越大,运行级别越低:
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/005.png)
处理器加载段选择子到段寄存器之前,会检查 CPL、RPL 以及 DPL 的权限,只有当 DPL 同时大于或等于 CPL 和 RPL 时,才允许将段选择子加载进段寄存器。否则将产生通用保护异常。
当使用类似下列指令去修改段寄存器时,处理器将加载段选择子到对应的段寄存器:
***注与内存类似的Intel 架构下还有一组为中断和任务准备的数据结构,用于保证中断和任务安全。***
```asm
mov ax, 0008H ;段选择子为 0008H 的数据
mov ds, ax ;加载段选择子到 DS 段寄存器
```
段描述符不仅包含了该段允许的访问级别,也包含了段长度等信息,从而避免越界访问高权限内存的可能,这些机制共同起到了内存保护的作用。
在处理器加载段选择子到段寄存器之前,会先检查 CPL、RPL 以及 DPL 的权限,只有当 DPL 同时大于或等于 CPL 和 RPL 时,才允许将段选择子加载进段寄存器,否则将产生通用保护异常。
段描述符不仅包含了该段允许的访问级别,也包含了段长度等信息,从而避免越界访问高权限内存的可能,伴随的其他安全机制共同起到了内存保护的作用。
通过段保护机制,可以将内核代码段与用户代码段分割开来。用户代码只有经过特殊的门调用,并进行足够的安全检查后,才能够提升权限,进入内核空间。
***注与内存类似的Intel 架构下还有一组为中断和任务准备的数据结构,用于保证中断和任务安全。***
### 分页管理的内存安全
Intel 分页机制的实现采用了页目录、页表和页的机制同时将线性地址拆分成不同的区域用于实现页目录、页表、页的寻址。Intel 4k 页分页机制如下: