linux 内存寻址

news/2024/5/21 19:22:50

(持续更新)

相关概念

查看的书籍为 深入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.mrgr.cn/p/61245085

相关文章

Python的基础知识学习路线2—运算符与变量类型(使用jupyter notebook进行操作:最全路线,每部分附有代码操作结果)

一、更改jupyter notebook 打开文件的位置 1、打开Anaconda Prompt终端,输入以下命令,创建配置文件:jupyter_notebook_config.py jupyter notebook --generate-config2、打开生成的配置文件 3、编辑配置文件jupyter_notebook_config.py&…

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…

LLM大语言模型微调方法和技术汇总

本文详细介绍了机器学习中的微调技术,特别是在预训练模型上进行微调的方法和技术。文章首先解释了什么是微调,即在预训练模型的基础上,通过特定任务的数据进行有监督训练,以提高模型在该任务上的性能。随后,详细介绍了…

【配电网故障定位】基于二进制粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#78】

文章目录 【获取资源请见文章第6节:资源获取】1. 配电网故障定位2. 二进制粒子群算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节:资源获取】 1. 配电网故障定位 配电系统故障定位,即在配电网络发生故障…

Linux文件和目录管理

一、目录与路径 绝对路径:一定由根目录/写起 相对路径:不是由根目录/写起,转换路径的时候使用 . 代表当前所在的目录 .. 代表上层目录 -代表前一个工作目录 ~代表自己的家目录 ~user代表userd的个人的家目录 目录的相关操作和路径变量 (1)cd 变换目录(2)pwd 显示当前所在…

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

少年有梦,不应至于心动,更要付诸行动 —— 24.4.12 pymysql 除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库 在Python中,使用第三方库:pymysql来完成对MySQl数据库的操作 安装 pip install py…

解析HMI面板实例

拆解一个已有的画面面板实例来看看画面面板是怎么实现的。使用实例,需要从项目库里面拖出来。拖出来之后画面如图,它是一个组合画面。这个画面有四个属性,以及一个事件。需要传入的数据类型FnCselInHMI属性需要传入一个bool类型数据 H_lAnim需要传入一个DWORD类型数据 Type和…

滚雪球学Java(74):深入理解JavaSE输入输出流:掌握数据流动的奥秘

咦咦咦,各位小可爱,我是你们的好伙伴 bug菌,今天又来给大家手把手教学Java SE系列知识点啦,赶紧出来哇,别躲起来啊,听我讲干货记得点点赞,赞多了我就更有动力讲得更欢哦!所以呀&…

c语言,单链表的实现----------有全代码!!!!

1.单链表的定义和结构 单链表是一种链式的数据结构,它用一组不连续的储存单元存反线性表中的数据元素。链表中的数据是以节点的形式来表示的,节点和节点之间相互连接 一般来说节点有两部分组成 1.数据域 :数据域用来存储各种类型的数据&…

这些Git事故灾难, 你经历过几个?

在大规模的协作中, git pull和push是远远不够使用的. 笔者介绍了自己在一线的工作中遇到了各种事故现场, 以及相应的解决方案. 快进来学习下, 也许以后用得上.前言 关于Git, 相信大家最常用的就是pull和push. 但随着协作规模的提升, 遇到的问题也会越来越多. 本篇文章并不科普一…

Ranorex无法使用spy识别element(只能识别外部container) --针对edge浏览器

1.问题 问题如标题,这是一个很严重的问题,表明我们不仅不能通过track识别元素,更重要的是spy无法识别UI元素,就会导致我们无法通过自动化脚本来控制UI元素,实现自动化测试!!! 2.解决 2.1 确保不要同时开启两个Chrome用例(chorme或者edge) 2.2 可以开启 Internet Explorer 模式(…

秋叶Stable diffusion的创世工具安装-带安装包链接

来自B站up秋葉aaaki,近期发布了Stable Diffusion整合包v4.7版本,一键在本地部署Stable Diffusion!! 适用于零基础想要使用AI绘画的小伙伴~本整合包支持SDXL,预装多种必须模型。无需安装git、python、cuda等任何内容&am…

SAP在中国的合作伙伴有哪些?

SAP作为一家全球领先的企业管理解决方案供应商,深受全球各行各业各规模企业的信赖。SAP拥有超过40年的专业经验,被称为ERP系统的“最后一道防线”。无论是面向中小型企业的Business one,还是面向中、大型集团的S/4HANA,不同规模、行业的企业都能从SAP的多样化企业管理解决方…

ubuntu安装python3.10

1. 官网下载源程序 2. 解压进入文件夹: ./configure --prefix/usr/local/python3/ 3. 编译安装: make && make install 4. 添加环境变量: vim ~/.bashrc PATH/usr/local/python3/bin:$PATH #保存后,刷新配置文件 sour…

EQ-BDS面板部署机器人

一、机器人配置教程 0.预处理 首先处理杀毒软件误报问题。在服务器上安装火绒安全当然,您也可以不选择火绒,使用其他杀毒软件,到时候给插件加上信任即可安装完成后禁用Windows Defender,详见EQ-BDS面板用户手册 1.下载然后解压压缩包 点我跳转到下载页面 这个网盘不需要开会…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索AI大模型与函数式编程模式融合之旅✨ 在编程世界的广阔疆域里,两大…

基于ChatGPT打造安全脚本工具流程

基于ChatGPT打造安全脚本工具流程前言 以前想要打造一款自己的工具,想法挺好实际上是难以实现,第一不懂代码的构造,只有一些工具脚本构造思路,第二总是像重复造轮子这种繁琐枯燥工作,抄抄改改搞不清楚逻辑,想打造一款符合自己工作的自定义的脚本工具难度倍增,但是随着AI…

-sh: ./example: No such file or directory

接上文的问题,咨询了隔壁部门的技术大佬后,认为是使用的交叉编译工具太旧了。因此在ARM官网重新下载工具包:下载到虚拟机后配置,完成后运行source命令使配置生效: source /etc/profile 重新编译目标代码并下载到开发板后运行:看到编译输出,已经能够找到文件了,只是缺少…

lua基本语法

Lua语法入门 初识lua vi hello.lua print("hello,lua") lua hello.lua 变量和循环 变量 循环 条件控制、函数 条件控制