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

本文主要是介绍<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(1)》(17),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 6 Linux 存储管理
    • 6.1 80x86 的分段机制
      • 6.1.1 80x86 的虚拟存储空间
      • 6.1.2 段描述符表
      • 6.1.3 逻辑地址向线形地址的转换

6 Linux 存储管理

6.1 80x86 的分段机制

Linux 最早在 intel80386 机器上开发,当前也主要运行在 intel 80386、80486 和 pentium 系列机器上。按照管理把该机器系列统称 80x86,也称 i386。

80x86 机器中用于控制和管理内存的硬件机制称为存储器管理单元 MMU(memory manage unit)。

在 MMU 控制下,80x86 具有两种存储管理模式

👉实地址模式:cpu 只能寻址 1MB 空间,MS-DOS 操作系统就工作在实地址模式下;
👉受保护的虚地址模式(保护模式):80x86 提供了虚拟存储的硬件机制,它是 OS
实现多任务存储管理以及提供存储保护的硬件基础。Linux 就是在该模式下实现其各种功能的。

6.1.1 80x86 的虚拟存储空间

1.物理地址和虚拟地址

物理地址:通常出现在地址总线上的地址称为物理地址。内存空间有物理地址确定,所以内存又称为物理地址空间。内存的最大容量由物理地址长度决定。80x86 机器的地址总线为 32 位,故有它确定的物理地址空间的范围可达 232B,即 4GB。

虚拟地址:用户作业的地址空间是由逻辑地址确定的,逻辑地址就是机器指令中使用的地址,故逻辑地址空间的最大容量由机器地址长度决定。80x86 指令地址字长度 48 位,其中 46 位用于寻址,因此80x86 的逻辑地址地址空间最大可达 64T。故 80x86 提供给程序人员使用的逻辑地址空间远远大于实际的物理地址空间,是一个虚拟的存储空间。所以逻辑地址就是虚拟地址。

为了支持多道进行并发执行以及实现存储保护,80x86 存储管理机制把 64T 的逻辑地址空间分成性质
不同的两部分:

👉全局地址空间:所有进程共享的空间,通常存放 os 的程序和数据。
👉局部地址空间:由系统分配给各个进程使用,用于存放进程各自的程序和数据。

2. 地址转换方式
80x86 在保护模式下提供了两种地址转换方式:

👉分段机制
👉分段+分页的两级地址转换方式。(本书只介绍这种转换方式)。

  1. 分段分页地址转换
    在系统运行时,逻辑地址必须转换成物理地址才能访问物理内存。80x86 中分段分页的地址转换机制中需要两级地址转换:

👉第一级:由分段机制完成逻辑地址向线性地址的转换 由分段机制完成逻辑地址向线性地址的转换。分段机制把逻辑地址空间分成若干个相互独立的地址空间,它称为线性地址空间。线性地址空间的地址称为线性地址。每个线性地址空间从 0 开始编址,80x86 中线性地址是 32 位的,因此每个线性地址空间最大 4G。在多道系统中,每个线性地址可以供一个用户进程使用,这就保证了每个进程都有自己独立的虚拟存储空间 这就保证了每个进程都有自己独立的虚拟存储空间。

地址类型说明
逻辑地址面向用户,是用户在程序设计时使用的地址空间,也就是用户程序中指令访问的地址空间;
线性地址面向进程,使进程使用的地址空间,对用户透明

👉第二级:由分页机制完成线性地址向物理地址的转换

说明:
1)在 80x86 中,虚拟地址空间的全局和局部地址空间都被划分成不同段。64T 的虚拟地址空间最多可以分 16K 个段。每个段的最大长度可达 4G;
在这里插入图片描述

2)全局地址空间和局部地址空间各自最多可以有 8K 段,分别称为全局段和局部段。
3)由于虚拟存储空间不是实际存在的,所以其中的段的数量,段的大小是不确定的,是根据需要随时建立的。当然不能超过上面提到的最大限制。

6.1.2 段描述符表

80x86 的段描述符表就是前面原理部分提到的段表。段描述符就是段表表项,每个段描述符的长度为8B。80x86 提供两种不同的段描述符:

👉全局描述符表 GDT(Global Descriptor Table):描述全局段,故系统中只有一个全局描述符表
👉局部描述符表 LDT(Local Descriptor Table):描述各个进程的各个局部段。故系统中有多少进程就有多少 LDT。

1.全局描述符表 GDT
1)80x86 中,全局描述符表 GDT 中一般包括 3 种不同种类的描述符:

👉系统内核代码段和数据段的描述符
👉进程状态段 TSS(Task State Segment)的描述符。系统中每个进程都有一个 TSS 段,用于保存该进程的上下文。所有进程的 TSS 段描述符都集中的保存在 GDT 中。
👉LDT 描述符:对各个进程的局部描述符表 LDT 进行描述的描述符,记录各个进程的局部描述符 LDT 在线性地址空间的位置和长度。每个进程 LDT 描述符在 GDT 中的位置,由系统记录在该进程 TSS 段的一个 16 位的位域中,该位域的值称为 LDT 选择符。

2)全局描述符表寄存器(GDTR):记录 GDT 在线性地址空间中的位置
在这里插入图片描述

其中:

表基址:指出 GDT 的起始地址;
表限:表限的值加 1 位 GDT 的长度。

说明:16 位的表限确定了 GDT 的最大地址空间为 64K,由于每个描述符长度为 8B,因此 GDT 最多可以拥有 8K 个描述符。每个描述符对应一个段,因此系统中最多可以有 8K 个全局段。

2.局部描述符表 LDT:描述进程各个局部段的。
3.定位 LDT
因为单处理机中某个时刻只能有一个进程处于运行状态,所以在某个时刻只有当前进程的 LDT 处于活动(使用)状态。系统需要能迅速定位活动的 LDT。

80x86 通过局部描述表寄存器 LDTR 和相应的 LDT 高速缓存来实现定位 LDT。

👉局部描述表寄存器 LDTR: 是一个 16 位寄存器,它的作用是指出当前进程的 LDT 描述符在GDT 中的位置,也就是前面提到的 LDT 选择符。在进程切换时,从进程的 TSS 中取出 LDT 选择 符,并将它放入 LDTR 中; 在地址映射时,首先从 LDTR 中得到 LDT 选择符;然后 GDT 中根据 LDT 选择符找到 LDT描述符(即得到 LDT 的位置等信息),接下来才能找到 LDT(即段表)。显然这样是会严重影响程序运行速度的。故引入了 LDT 高速缓存。
👉LDT 高速缓存: 保存从 GDT 中找到的 LDT 描述符。引入 LDT 高速缓存后,第一次仍需要完成上面提到的三个步骤,但是第一次完成时,将从GDT 中找到的该进程的 LDT 描述符保存在了 LDT 高速缓存中。这样以后地址映射时,可以直接从高速缓存中得到 LDT 的位置等信息。

LDT 高速缓存:
在这里插入图片描述
说明:

16 位的表限确定了 LDT 的最大地址空间为 64K,由于每个描述符长度为 8B,因此LDT 最多可以拥有 8K 个描述符。每个描述符对应一个段,因此系统中最多可以有 8K 个局部段。

6.1.3 逻辑地址向线形地址的转换

1.基本过程(参照原理部分)
在 80x86 中逻辑地址的格式如下所示:
在这里插入图片描述
在 80x86 中,程序执行中读取每一条指令时都需要访问代码段。这时系统把逻辑地址中的选段符装入寄存器 CS 中,把段内偏址装入指令计数器 EIP 中,然后经过硬件分段机制把逻辑地址转成指向代码段的32 位线性地址。

程序中执行读写数据的指令时,系统把指令中逻辑地址的选段符装入 DS 寄存器中,把段内偏址装入某个通用寄存器中,然后经过硬件分段机制把逻辑地址转成指向数据段的 32 位线性地址。

2.段描述符寄存器(参照原理部分,快表)
选段寄存器:上述中设计到的寄存器,因为包含了选择某个段的索引值,故又称其为选段寄存器。

80x86 中有 6 个段寄存器:CS、DS、SS、ES、FS 和 GS;

段描述符寄存器:根据程序的局部性原理,为了提高地址映射速度,减少访问内存的次数。80x86 分段机制在高速缓存中,为每个选段寄存器都配置了一个对应的段描述符寄存器,用于保存当前访问的那些段的段描述符。

这篇关于<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(1)》(17)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446015

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57