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

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

  • 6 Linux存储管理
    • 6.2 选段符与段描述符
      • 6.2.1 选段符
      • 6.2.2 段描述符
      • 6.2.3 分段机制的存储保护
    • 6.3 80x86 的分页机制
      • 6.3.180x86 的分页机制
      • 6.3.2 分页机制的地址转换
      • 6.3.3 页表目录与页表表项
      • 6.3.4 分页机制的存储保护
      • 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 个最近使用的页表项(页面地址)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236757.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

⭐ Unity + ARKIT 介绍 以及 平面检测的实现

在AR插件中,ARKIT是比较特殊的一个,首先他在很多追踪上的效果要比其他的AR插件要好,但是只能在IOS系统设备上运行。 1.首先ARKIT在最新版Unity已经集成在AR Foundation中,那我们就需要ARSession 和ARSessionOrigin这两个重要组件…

年终好价节买什么好?高效实用、高性价比的的数码好物推荐

前段时间,“淘宝双12不再举办”的话题上了热搜,改成了“淘宝年终好价节”。从“双12”到“好价节”,背后意味着大众跳出了一味追求低价的“买买买”的怪圈,转变为更追寻价好质优的商品。错过双11的消费者可以趁这个时间抓紧入手收…

深度学习手势识别 - yolo python opencv cnn 机器视觉 计算机竞赛

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前,问答网站已经成为人们获取知识、交流思想的重要平台。然而,对于许多开发者来说,从头开始构建一个问答网站可能会面临各种挑战。今天,小编给大家介绍一款基于PHP的开源问答网站平台源码系统,它不仅源码全部开源&am…

NOIP2007提高组第二轮T3:矩阵取数游戏

题目链接 [NOIP2007 提高组] 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n m n \times m nm 的矩阵,矩阵中的每个元素 a i , j a_{i,j} ai,j​ 均为非负整数。游戏规则如下: 每次取数时须从每行各取走一…

学习笔记7——数据库基础知识以及mysql的查询语句

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/199913.html 数据库 三个概念区分 DB:数据库,存储数据的仓库,有组织的数据容器DBMS:数据库管理系统SQL:几乎所有的DBMS都支持…

人工智能_机器学习056_拉格朗日乘子法原理推导_公式由来详解_原理详解---人工智能工作笔记0096

https://blog.csdn.net/Soft_Po/article/details/118332454 这里有老师的一篇文章介绍拉格朗日乘子法的原理推导 结合老师的这篇文章我们来看一下详细的推导过程 可以看到上一节我们说,一个有条件的,函数,可以转换为一个,无条件的函数, 根据拉格朗日乘子法,可以创建出一个等…

python使用记录

1、VSCode添加多个python解释器 只需要将对应的python.exe的目录,添加到系统环境变量中即可,VSCode会自动识别及添加 2、pip 使用 pip常用命令和一些坑 查看已安装库的版本号 pip show 库名称 通过git 仓库安装第三方库 pip install git仓库地址

Linux系统常用指令

1.使用xshell登录到云服务器的Linux系统: ssh 用户名公网IP,例如: ssh root111.11.111. 2.添加用户 adduser 用户名,例如: adduser user 3.为用户设置密码 passwd 用户名,例如: passwd …

Cloudflare Email Routing 免费邮件发送服务

Cloudflare Email Routing 免费邮件发送(作为 Service 服务)用于 Workers/Pages 项目中。 原文链接: https://willin.wang/blog/cloudflare-send-email-service 准备工作 准备一个域名,例如 example.com。现在,在 cloudflare-dashboard 中添加一个网站并构建您的域名。这…

【JavaScript】3.4 JavaScript在现代前端开发中的应用

文章目录 1. 用户交互2. 动态内容3. 前端路由4. API 请求总结 JavaScript 是现代前端开发的核心。无论是交互效果,还是复杂的前端应用,JavaScript 都发挥着关键作用。在本章节中,我们将探讨 JavaScript 在现代前端开发中的应用,包…

uniapp小程序分包页面引入wxcomponents(vue.config.js、copy-webpack-plugin)

实例:小程序添加一个源生小程序插件,按照uniapp官方的说明,要放在wxcomponents。后来发现小程序超2m上传不了。 正常的编译情况 会被编译到主包下 思路:把wxcomponents给编译到分包sub_package下 用uniapp的vue.config.js自定义…