linux 内存寻址

(持续更新)

相关概念

查看的书籍为 深入linux内核


内存地址

  当使用80x86(32位)微处理器时,一般分为三种不同的地址: 


逻辑地址

 包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址都由一个段(segment)和偏移量(offset或displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离。
所有段都从0x00000000开始,只需关注段内偏移即可。而段内偏移的值恰好等于线性地址的值。


线性地址(也称虚拟地址)

线性地址通常用十六进制数字表示,值的范围从0x00000000到0xffffffff。
物理地址
用于内存芯片级内存单元寻址。他们与从微处理器的地址引脚发送到内存总线上的电信号相对应。 

物理地址

用于内存芯片级内存单元寻址。他们与从微处理器的地址引脚发送到内存总线上的电信号相对应。 

页(page)

线性地址被分成以固定长度为单位的组,称为页。页内部连续的线性地址被映射到l连续的物理地址中。内核可以指定一个页的物理地址和其存储权限

页框(page frame)

分页单元把所有的RAM分成固定长度的页框(有时叫做物理页)。

每一个页框包含一个页,也就是说一个页框的长度与一个页的长度一致(目前操作系统应该不是)

页表 (page table)

把线性地址映射到物理地址的数据结构称为页表。

页表内存储页表项,页表项含有页所在页框的物理地址。

在启用分页单元之前必须由内核对页表进行适当的初始化。

地址转换

内存控制单元(MMU)通过一种称为分段单元的硬件电路把一个逻辑地址准换成线性地址;接着,第二个称为分页单元的硬件电路把线性地址转换成一个物理地址。 
这个地方有疑问! 逻辑地址一般等于线性地址,那不同的进程中相同的地址获取到的逻辑地址是一样?还要继续看。

段选择符

机器语言指令中出现的内存地址,都是逻辑地址。

一个逻辑地址由两部分组成: 段选择符以及偏移量。

段选择符字段

index 指定了放在GDT或LDT中的相对应段描述符的入口。 

TI      :TI (Table Indicator)标志 :指明段描述符实在GDT(TI=0)中或在LDT中 (TI=1)

RPL   :请求者特权级。

段描述符

每个段由一个8字节的段描述符表示,它描述了段的特征。段描述符放在全局描述符表(Global Descriptor Table,GDT)或局部描述符表(Local Descriptor Table, LDT中)。

Linux GDT(全局描述符表)

在单处理器系统中只有一个GDT,而在多处理器系统中每个CPU对应一个GDT。

通常只定义一个GDT,每个进程除了存放在GDT中的段之外如果还需创建附加的段,就有自己的LDT。GDT在主存中的地址和大小存放在gdtr控制寄存器中,当前正被使用的LDT地址和大小放在ldtr控制寄存器中。

段描述符类型

代码段描述符

数据段描述符

任务状态段描述符(TSSD)

局部描述符表描述符(LDTD)

段描述符字段 

Base  : 包含段的首字节的线性地址

.............

.............

分段单元

逻辑地址转换为线性地址,分段单元执行以下操作

1.通过逻辑地址(由段选择符及偏移量组成)得到段选择符;

2.先检查段选择符的TI字段,判断段选择符保存在哪一个描述符表中。TI字段指明描述符是在GDT中(在这种情况下,分段单元从gdtr寄存器中得到GDT的线性基地址)还是在LDT中(在这种情况下,分段单元从ldtr寄存器中得到LDT的线性基地址);

3.从段选择符的index 字段计算段描述符的地址,index字段的值乘以8(一个段描述符的大小),这个结果与gdtr或ldtr寄存器中的内容相加;

4.把逻辑地址的偏移量与段描述符Base字段的值相加就得到了线性地址。

简单说就是,通过逻辑地址找到段选择符,再找到对应的段描述符,最后得到最后的线性地址。

段描述符中有包含段的首地址的线性地址(base)。

常规分页

线性地址结构

32位的线性地址被分成3个域页表 (我的理解:这里怎么分具体要看有几级页表以及页的大小

Diretory(目录)                

        最高10位

Table(页表)          

        中间10位

Offset(偏移量)

        最低12位

这里分为两级页表,线性地址的转换就分两步完成,每一步都基于一种转换表,第一个种叫页目录表,第二种叫页表

个人理解:

如果进程使用全部4G线性地址空间,每个页框(物理页)代表4096个字节(2的12次方);一个页表最多存储1024个页表项(2的10次方),1个页表项含有页所在页框的物理地址,即1个页表项对应4k地址空间,一个页表能找到4M地址空间;1个页目录最多存储1024个页目录项(2的10次方),而一个页目录项指向适当的页表,那么一个页目录项就能找到一个4M地址空间,一个页目录就能找到4G地址空间。

由上图可知,一个页大小为2的10次方,那么内存就以2的十次方分页,知道页表项大小为2字节,

1.一个页表中的页表项数量为 1024(2的10次方) / 2 = 512(2的9次方)个,页号由9位表示,

2.一个页表能表示的空间大小为 512(2的9次方) *  1024(2的10次方) = 512K (2的19次方),

3.一个页目录包含表项的个数 为 总空间大小除以一个页表能表示的空间大小,即

(2的16次方) * (2的10次方) / 512K (2的19次方) = 128 (2的7次方)。

书看到这里有了疑惑点:

书上说,使用这种二级模式的目的是在于减少每个进程页表所需RAM的数量,二级模式通过只为进程实际使用的那些虚拟内存区请求页表来减少容量。

那么问题来了,我只用一级页表为什么不能对实际使用的那些虚拟内存区请求页表?

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

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

相关文章

C#简单工厂模式的实现

using System.Diagnostics.Metrics; using System.Runtime.InteropServices; using static 手写工厂模式.Program;namespace 手写工厂模式 {internal class Program{public interface eats {void eat();}//定义了一个接口public class rice : eats{public void eat() {Console.…

neo4j-01

Neo4j是: 开源的(社区版开源免费)无模式(不用预设数据的格式,数据更加灵活)noSQL(非关系型数据库,数据更易拓展)图数据库(使用图这种数据结构作为数据存储方…

Flutter第七弹 网格列表GridView

1) Flutter提供了网格列表,怎么设置列数? 2)怎么初始化每个列表项Item? 一、GridView简介 Flutter也存在网格列表组建GridView,用于展示多行多列的列表。 1.1 GridView构建 采用GridView.count() 进行构建 1.2 Gr…

HarmonyOS实战开发-自定义分享

介绍 自定义分享主要是发送方将文本,链接,图片三种类型分享给三方应用,同时能够在三方应用中展示。本示例使用数据请求 实现网络资源的获取,使用屏幕截屏 实现屏幕的截取,使用文件管理 实现对文件,文件目录的管理&…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数,官方解释为:指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法…

Collection与数据结构 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

Geeker-Admin:基于Vue3.4、TypeScript、Vite5、Pinia和Element-Plus的开源后台管理框架

Geeker-Admin&#xff1a;基于Vue3.4、TypeScript、Vite5、Pinia和Element-Plus的开源后台管理框架 一、引言 随着技术的不断发展&#xff0c;前端开发领域也在不断演变。为了满足现代应用程序的需求&#xff0c;开发人员需要使用最新、最强大的工具和技术。Geeker-Admin正是…

Ubuntu 22上安装Anaconda3。下载、安装、验证详细教程

在Ubuntu 22上安装Anaconda3&#xff0c;你可以遵循以下步骤&#xff1a; 更新系统存储库&#xff1a; 打开终端并运行以下命令来更新系统存储库&#xff1a; sudo apt update安装curl包&#xff1a; 下载Anaconda安装脚本通常需要使用curl工具。如果系统中没有安装curl&#x…

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体&#xff0c;我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的&#xff0c; 它只是一个技术名词。流媒体到底是什么&#xff1f;能给我们的生活带来什么&#xff1f;跟小德一起来看看。 流媒体是什么&a…

OSI七层网络模型 —— 筑梦之路

在信息技术领域&#xff0c;OSI七层模型是一个经典的网络通信框架&#xff0c;它将网络通信分为七个层次&#xff0c;每一层都有其独特的功能和作用。为了帮助记忆这七个层次&#xff0c;有一个巧妙的方法&#xff1a;将每个层次的英文单词首字母组合起来&#xff0c;形成了一句…

REINFORCE及进阶算法讲解笔记

REINFORCE 总结 估计VALUE-methods没有在理论上证明收敛&#xff0c;而policy-methods不需要估计value function。 本算法总结了过去的算法&#xff0c;将过去算法作为特例看待&#xff0c;证明了即使是结合函数估计和实际采样的value梯度都可以无偏估计&#xff0c;证明了某种…

PC-lint 学习之配置方法

1. 下载PC-lint 9.0后&#xff0c;点击pclint9setup.exe进行安装&#xff08;我只安装了C/C语言&#xff0c;其他语言可安装时选择&#xff09; 2.安装完成后&#xff0c;打开keil5&#xff0c;选择配置 3. 配置选项 &#xff08;1&#xff09;Lint Executable&#xff1a;在第…

知识图谱与人工智能:携手共进

知识图谱与人工智能&#xff1a;携手共进 一、引言&#xff1a;知识图谱与人工智能的融合 在这个数据驱动的时代&#xff0c;知识图谱与人工智能&#xff08;AI&#xff09;之间的融合不仅是技术发展的必然趋势&#xff0c;也是推动各行各业创新的关键。知识图谱&#xff0c;作…

docker 上达梦导入dump文件报错:本地编码:PG GBK,导入女件编码:PGGB18030

解决方案&#xff1a; 第一步进入达梦数据容器内部 docker exec -it fc316f88caff /bin/bash 第二步&#xff1a;在容器中 /opt/dmdbms/bin目录下 执行命令 cd /opt/dmdbms/bin./dimp USERIDSYSDBA/SYSDBA001 FILE/opt/dmdbms/ZFJG_LJ20240407.dmp SCHEMASZFJG_LJUSERIDSYSD…

Guava里一些比较常用的工具

随着java版本的更新提供了越来越多的语法和工具来简化日常开发&#xff0c;但是我们一般用的比较早的版本所以体验不到。这时就用到了guava这个包。guava提供了很多方便的工具方法&#xff0c;solar框架就依赖了guava的16.0.1版本&#xff0c;这里稍微介绍下。 一、集合工具类…

深度学习图像处理基础工具——opencv 实战2 文档扫描OCR

输入一个文档&#xff0c;怎么进行文档扫描&#xff0c;输出扫描后的图片呢&#xff1f; 今天学习了 opencv实战项目 文档扫描OCR 问题重构&#xff1a;输入图像 是一个含有文档的图像——> 目标是将其转化为 规则的扫描图片 那么怎么实现呢&#xff1f; 问题分解&#…

CSS快速入门

目录 一、CSS介绍 1、什么是CSS&#xff1f; ​编辑2、基本语法规范 3、引入方式 4、规范 二、CSS选择器 1、标签选择器 2、类&#xff08;class&#xff09;选择器 3、id选择器 4、通配符选择器 5、复合选择器 三、常用CSS 1、color 2、font-size 3、border 4…

对于缓冲区的理解

目录 1、回车和换行 2、缓冲区 1、回车和换行 回车换行\n其实是两个动作 回车是回到开始位置 换行是换到下一行 &#xff08;老式键盘&#xff09; 而老式键盘是从打字机来的 \r只是回车&#xff0c;回到开始位置 2、缓冲区 fflush&#xff08;stdout&#xff09;#强制刷新缓…

手写商城项目学习/复习到的知识

1.在windowr创建项目可以选择自定义/vue2/vue3,但尝试在vscode不能选择. 2.vant vant是组件库,可导入结构等.vant2用于vue2,vant3,vant\4用于vue3 vant2的使用 官网: Vant 2 - 轻量、可靠的移动端组件库 (gitee.io) 全部导入:将vant所有的组件放到了所有组件内component使…

FMix: Enhancing Mixed Sample Data Augmentation 论文阅读

1 Abstract 近年来&#xff0c;混合样本数据增强&#xff08;Mixed Sample Data Augmentation&#xff0c;MSDA&#xff09;受到了越来越多的关注&#xff0c;出现了许多成功的变体&#xff0c;例如MixUp和CutMix。通过研究VAE在原始数据和增强数据上学习到的函数之间的互信息…