<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(2)》(18)

《Linux操作系统原理分析之linux存储管理(1)》(17)

  • [6 Linux存储管理](#6 Linux存储管理)
    • [6.2 选段符与段描述符](#6.2 选段符与段描述符)
      • [6.2.1 选段符](#6.2.1 选段符)
      • [6.2.2 段描述符](#6.2.2 段描述符)
      • [6.2.3 分段机制的存储保护](#6.2.3 分段机制的存储保护)
    • [6.3 80x86 的分页机制](#6.3 80x86 的分页机制)
      • [6.3.180x86 的分页机制](#6.3.180x86 的分页机制)
      • [6.3.2 分页机制的地址转换](#6.3.2 分页机制的地址转换)
      • [6.3.3 页表目录与页表表项](#6.3.3 页表目录与页表表项)
      • [6.3.4 分页机制的存储保护](#6.3.4 分页机制的存储保护)
      • [6.3.5 快表 TLB](#6.3.5 快表 TLB)

6 Linux存储管理

6.2 选段符与段描述符

6.2.1 选段符

选段符的作用:确定所选的段描述符在段描述符表中的位置。

选段符由 3 个部分组成,如下所示:

其中:

👉RPL(Reques Privilege Level):请求特权级,即访问者的特权级,分为 0、1、2、3 四级,0 级最高,3 级最低。Linux 中仅使用其中两个级别:0 级为内核级,3 为用户级。

👉TI(Table Indictor):描述符表的种类。0 为访问全局描述符表 GDT,1 为访问局部描述符表LDT。

👉INDEX:索引值。指出段描述符在描述符表中的偏移量。INDEX 13 位,则可以最大可描述 8K 个段。

如何确定描述符在描述符表中的偏移地址?

INDEX 是描述索引表的索引值,实际上是描述符在描述符表中的序号。每个描述符的长度为8B,所以描述符相对于表基地址的偏移地址实际是:INDEX 乘以 8。而实际该值并不需要计算,只要将 INDEX 的值左移 3 位,低地址部分 3 位补 0,形成的 16 位地址就是偏移地址。

6.2.2 段描述符

在 80x86 线性地址空间中,所有的段根据它们所存放的内容可以分为两类:

👉常规段:存放代码、数据、堆栈的段,无论是用户的还是系统的。

👉系统段:存放系统管理用的各种数据结构,如进程状态段 TSS、中断矢量表、系统调用表等。相应地,段描述符也有两种:常规段描述符、系统段描述符。本书中只介绍常规段描述符。

64 位常规段描述符主要分为以下四个部分:

1.段基址:32 位(分布在段描述符 16~39 位和 56 ~63 位)指出段在线性地址空间的起始地址。

2.段限:20 位(分布在段描述符 0~ 15 位和 48~51 位)段限加 1 是段的长度。

3.访问属性:8 位(40~47 位)定义了段的类型、操作属性及保护特性。

4.辅助特性:4 位(52~55 位)定义了段的其他属性。

访问属性

访问属性 含义
P(present) 存在位。
DPL(Descriptor privilege Level) 段的访问特权级。它是段本身的访问特权分为 0、1、2、3 四级,0 级最高,3 级最低。Linux 中仅使用其中两个级别:0 级为内核级,3 为用户级。
S(Segment) 段种类。0:系统段,1:常规段。
E(Executive) 执行位。表示段的类型:0 表示数据段;1 表示代码段。
C/ED 相容性/扩展位。 代码段(S=1,E=1)中,C=1 表示在满足一定条件下段可以执行。C=0 表示段不能执行; 数据段(S=1,E=0)中,对堆栈段而言:ED =1 表示向上扩展堆栈。ED =0 表示向下扩展堆栈。
R/W 读写位。 代码段(S=1,E=1)中,R/W =1 表示可读可执行。R/W =0 表示不可读但可执行; 数据段(S=1,E=0)中,R/W =1 表示可读可写。R/W =1 表示可读禁止写。
A 访问位。A=0 表示该段尚未被访问;A=1 表示该段已被访问过。

辅助特性:

辅助特性 含义
G(granularity) 粒度,指段的单位长度,G=1 表示段长度以页面(4K)为单位,在常规段描述符中 G=1;G=0 表示段长度以字节为单位,在系统段描述符中 G=0。
D 操作长度,只用于代码段描述符中,D=1 位 32 位代码段,D=0 为 16 位代码段。
R 系统保留(值为 0)
U 可以由 os 系统程序员自行定义使用,linux 未用。

6.2.3 分段机制的存储保护

1.地址越界保护

其实 GDT、LDT 中的段限就是用于地址越界保护。

2.存取控制保护

存取控制保护从两个方面来保证信息安全:

👉设置对存储区域的访问权限

RPL:规定访问者的访问权限;

DPL:规定段本身的访问权限;

访问者的访问权限必须段本身的访问权限时,才能访问段。

👉设置对存储区域的操作权限

通过段描述符中 R/W 实现。

6.3 80x86 的分页机制

6.3.180x86 的分页机制

80x86 中,逻辑页面大小为 4KB。

80x86 中采用两级页表:简单描述就是:每个页表占用一个物理页面(4KB),每个页表项占 4B,则每个页表 1K 个表项。因此一张页表可以覆盖 1K*4K=4M 的地址空间。建立进程时,系统根据进程逻辑

页面的数目提供不同张数的页表,这样不同尺寸的进程就可以使用不同张数的页表。但是此时必须为每个进程建立一个页表目录,记录该进程的各个页表的存储位置。所以需要使用两级页表。

因为 80x86 中页表目录中的表项也占用 4B,所以每个页面可以记录 1K 个页表项,所以采用两级页表可以覆盖 1k1K4K=4G 的地址空间。也就是能覆盖最大容量的线性地址空间。

采用二级页表的好处:覆盖更大容量的线性地址空间、节省空间(因为如果采用一级页表,为了满足最大容量 4G 的需要,必须为 4G 空间中的每个页建立页表项。)

6.3.2 分页机制的地址转换

1.地址结构

2.地址转换

图中:

👉CR3 控制寄存器:记录页表目录在物理内存中的起始地址。该寄存器是一个 32 位寄存器,它的低 12 位总是 0,这样可以保证页表目录在物理地址空间总是按页面对齐的。

👉页表目录域和页表域中记录的都是查找项的索引值,即序号,因每个表项为 4B,所以需要乘 4,得到表项中的偏移地址。

6.3.3 页表目录与页表表项

1.指针。页表目录中:是页表指针,指向某一页表。

页表中:是页面指针,指向某一物理页面。

实际上它们分别是页表或物理页面起始地址的高 20 位,该地址的低 12 位总为 0,这就保证了页

表和物理页面在物理地址空间总是按页面对齐的,即它们总是位于 4K 页面的边界上。

2.AVL:供操作系统自行定义使用。

3.D:修改位(仅对页表表项有意义)

4.A:访问位。

5.U/S:访问权限,表示页表或页面本身的访问权限。U/S=1 是用户级,U/S=0 是系统级。

6.W/R:读/写保护位,操作限制。1 表示允许读写;0 表示只读

7.P:存在位。

8.表项中 0 的位域保留以备扩充。

6.3.4 分页机制的存储保护

从两方面进行:

👉地址越界保护。访问到的页表项为 0 时,地址越界。(可以参见徐德民 p194 195 的例题)

👉存取控制保护。U/S 和 W/R

6.3.5 快表 TLB

从上述的分页机制可以看出,采用两级页表,需要访问 3 次内存。为此 80x86 中也引进了快表。它放在处理器芯片中的高速缓存中,称为转换旁视缓冲存储器 TLB(Translation Look-aside Buffers)。其中存放32 个最近使用的页表项(页面地址)。

相关推荐
爱瑞瑞1 小时前
🐧深入浅出的认识 Linux 指令
linux·shell
ajassi20001 小时前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
小李飞刀李寻欢1 小时前
使用kubeadm部署Kubernetes(k8s)集群的步骤
linux·服务器·ubuntu·kubernetes·k8s
运维成长记2 小时前
阿里云实践创建实例步骤
linux·运维·服务器·阿里云·云计算
THe CHallEnge of THe BrAve2 小时前
Linux检验库是否安装成功
linux·运维·服务器
算家计算3 小时前
告别复杂文档解析噩梦!MonkeyOCR 本地部署教程:支持公式/表格多元素结构化
linux·人工智能·开源
曹勖之3 小时前
ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?
xml·linux·服务器·ros2
企鹅侠客4 小时前
ttyd:安全地通过网络共享您的 Linux 终端
linux·运维·ttyd
饭碗、碗碗香5 小时前
【开发常用命令】:服务器与本地之间的数据传输
linux·运维·服务器·笔记·学习
MonkeyBananas5 小时前
在Ubuntu中使用Apache2部署项目
linux·运维·ubuntu