linux内核获取物理地址,逻辑地址,虚拟地址,物理地址--深入理解linux内核-程序员宅基地

技术标签: linux内核获取物理地址  

先简单说明一下逻辑地址,虚拟地址,物理地址这三个地址的理解,然后再举个例子,结合实际运行程序的时候深入理解地址概念。

1.逻辑地址:

概念上的地址。通常在机器语言指令中来指定操作数或者指令的地址。(补充:机器语言就是计算机能够直接识别和执行的指令,即二进制形式)。

每一个逻辑地址,包括段地址segment和段内偏移量offset,即逻辑地址=【16位的段标识:20位的偏移offset】

MS-DOS或windows把不同的程序划分为独立的逻辑段。逻辑地址在80*86分段结构中表现得很具体。

为什么会有逻辑地址这个概念?逻辑地址可以理解为分段结构意义上的地址。因为windows或者早起的intel为了让每个程序都只有自己的独立空间,所以就将每个程序作为一个单独的逻辑单元,也就是分段单元。在这个逻辑单元内的意义上的地址就是逻辑地址了。

2.虚拟地址(线性地址):

32位的无符号整数,地址范围:0x00000000 到0xffffffff。

在二级页表结构中,虚拟地址=【10位的页目录:10位的页表:12位的偏移量】

在一级页表结构中,虚拟地址=【1位的页表:22位的偏移量】

为什么会有虚拟地址?虚拟地址其实就是分页结构对应的地址。因为linux kernel将内存划分为大小相等的页,方便内存管理和分配。在分段结构中,每个段的大小不一定相等,不便于管理和分配。

3. 物理地址:

实际存在的地址,用于内存芯片级的内存单位寻址。它们与微处理器的地址引脚发送到内存总线上的电信号相对应。

物理地址由32位或者36位无符号整数表示。(硬件上地址总线为36位,高四位和低32位)。

4. 逻辑地址转换为线性地址:

(1)逻辑地址=[16位的段标识:32位offset]

(2)段标识存储在段寄存器中,段标识=[13位index,1位flag,2位的cpu level].若flag=1,表示段描述符存储在GDT,否则在LDT。

(3)如果段描述符存储在GDT中,则从GDT控制器读取出GDT(全局描述表)的首地址。GDT每个元素是8字节的段描述符,因此,可计算出段标识指向的段描述符地址为:GDT首地址+8*13位的index.  如果在LDT中,计算过程同理。

(4)计算出段标识指向的段描述符地址后,内核将该段描述符从内存读取出来,存放在CPU控制的寄存器中。

(5)段描述符位8个字节大小,存放了段的属性,包括基地址,段长度,等等。

(6)那么,虚拟地址=基地址+32位的offset.

整个转换过程,是由一个硬件电路计算的,效率很高。相当于由段标识映射到段描述符,段描述符中有该段的基地址,基地址+offset就是虚拟地址了。

5.线性地址转换为物理地址:

对于一级页表结构来说, 地址计算过程如下:

(1)页表在内存中的地址存储在cr3寄存器中,我们标记为页表的物理地址;

(2)线性地址的高10位为页目录索引。 页目录的每一项存储了该页的物理地址。所以页的物理地址=(页表的物理地址 + 页目录索引)所指向的页的物理地址。

(3)页的物理地址+偏移量offset 就是该线性地址对应的物理地址。

0818b9ca8b590ca3270a3433284dd417.png

6.小结:

用户程序经过编译连接后生成由机器语言组成的可执行程序,该可执行程序中的地址是逻辑上的逻辑地址。

当CPU执行可执行程序的指令时,会由一个硬件电路将逻辑地址转换为虚拟地址,再经过一个硬件电路将虚拟地址转换为物理地址。然后CPU就直接从该物理地址指向的内存单元去读数据。      为什么先要转换为虚拟地址呢?是因为逻辑地址是段结构意义上的地址,而内存会被划分为页结构。也就是说,操作系统展现出来的地址是由页地址和页内偏移量组成,而这个就是虚拟地址。至于这个页结构上的虚拟地址如何转换为物理地址,是有硬件电路去计算的。内核不用去管。     因此,可以这样理解, 操作系统把硬件上的物理地址屏蔽掉,抽象出虚拟地址。这样对于程序来说,处于内核层面上的虚拟地址空间,程序不用管内存的物理地址是否够用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36040777/article/details/116878129

智能推荐

源代码字符编码不一致导致显示乱码_linux 服务器编码与传输数据不一致导致的乱码-程序员宅基地

文章浏览阅读3.7k次。从服务器端传过来的字符串,显示在网页上,居然是乱码!设置网页的编码,不行;试图将该字符串解码,也不行。而且更奇怪的是,同样是这份WEB项目,有些同事的机器上跑,却很正常。当时正在加班,项目很赶,就没有处理。静下来后,想了想,可能是对应的源代码文件编码不对。在VS2015上打开该文件,点菜单栏上的 文件 - 高级保存选项,赫然显示编码是GB2312,而其他代码文件是UTF-8。改过来后,问题修正。其实_linux 服务器编码与传输数据不一致导致的乱码

mysql kill process解决死锁-程序员宅基地

文章浏览阅读9.6k次。show processlist和show full processlistprocesslist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showprocesslist只能列出当前100条。如果想全部列出,可以使用SH..._mysql kill process

x265 命令行参数大全(比较详细)_x265参数-程序员宅基地

文章浏览阅读2.2k次。除非一个参数被标记为 CLI ONLY,否则该参数也被x265_param_parse() 支持。CLI使用getopt 函数来解释命令行参数,长短版本的参数都可以使用,长参数在不引起歧义的情况下可以截断成短参数。API用户必须把完整的参数名传递给 x265_param_parse()。Preset和tune 有特殊的含义,API用户需要在调用x265_param_parse()设置其他参数之前使..._x265参数

阿里发布的Java高并发开发文档,涵盖了所有的高并发操作!-程序员宅基地

文章浏览阅读307次。而今天分享的这份阿里内网“M9级全彩高并发编程手册”,让大家不仅能够学到深度、专业的编程知识,还能感受到阿里专注地提高编程技能的态度,始终如一地贡献、分享Java专业知识与经验的精神,以及持续学习、持续成长的进取精神,文末附高清电子版。看干货获取方式扫描下方公众号【java1234】回复:9966,可获取下载链接????????????????长按上方二维码2 秒回复「9966」即可如果不会领取,或者需要其他java..._m9级全彩高并发编程手册

-----已搬运-------关于prreg_match()的绕过 ----- %0a ------ 数组 --------preg的回调次数 ----科学计数法绕过。。。_regmatch 绕过-程序员宅基地

文章浏览阅读1.3k次。1. 例题一<?phpshow_source(__FILE__);function areyouok($greeting){ return preg_match('/$Merry.*Christmas/is',$greeting);}$greeting=@$_REQUEST['greeting'];if(!areyouok($greeting)){ if(strpos($greeting,'Merry Christmas')!==false){ echo_regmatch 绕过

【摄影】入门教程_摄影学习博客-程序员宅基地

文章浏览阅读493次。焦距是视野的范围的区间,焦距越小,视野越大,画面所容纳的东西越多,同时单个主题的占比就会越小。焦距的单位是mm(毫米)。其他分类镜头上的f值来表示光圈,光圈越大,f值越小。恒定光圈镜头优于浮动光圈镜头,恒定光圈越大,镜头等级越高。变焦镜头还包括外变焦镜头(拧动变焦环的时候,镜头长短有变化)和内变焦镜头(镜头长短没有变化)利用手机完全可以学好摄影,拍出好看的照片,如下是苹果手机摄影获奖作品。_摄影学习博客

随便推点

大数据法律监督模型优势特色及应用场景_大数据监管算法模型-程序员宅基地

文章浏览阅读1.4k次。大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。_大数据监管算法模型

29-Nor Flash电路设计-程序员宅基地

文章浏览阅读1.2k次,点赞11次,收藏32次。nor flash硬件电路设计_nor flash电路设计

基于Springboot高校校园教室预约系统设计与实现_大学校园教室预约系统-程序员宅基地

文章浏览阅读1.9k次,点赞6次,收藏2次。《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,程序员宅基地专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,免费项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!_大学校园教室预约系统

html label设置行高,UILabel 显示HTML 设置行高-程序员宅基地

文章浏览阅读197次。UILabel *label = [[UILabel alloc] init];label.font = [UIFont systemFontOfSize:15];UIFont*font = label.font;//转换HTML 字符串NSDictionary *options = @{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,..._html label行高

2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用_脚本自动生成视频 软件-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏23次。2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用。_脚本自动生成视频 软件

echarts 柱状图图例点击事件并动态调整平均值_echarts 图例 selected动态赋值-程序员宅基地

文章浏览阅读846次。今天来记录一下之前遇到的问题,当时有个需求是点击柱状图的图例,显示不同的堆叠图,并且其中有一条虚线来显示当前高亮的堆叠图的数据平均值,页面功能效果实现代码如下 myChart.on('legendselectchanged', barfunction) function barfunction(obj) { let selectedItem = [] // 当前选中的高亮名 let totalArr = [] // 分母 let unitP_echarts 图例 selected动态赋值