博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux X86下的段地址_段内偏移_虚拟地址_线性地址_物理地址
阅读量:4056 次
发布时间:2019-05-25

本文共 585 字,大约阅读时间需要 1 分钟。

本文描述的是基于Linux下的x86的段地址、段内偏移、虚拟地址、线性地址、物理地址的转换与关系。

我们先来看一个二进制可执行程序test

 

段基地址:

test加载运行时,linux使用预先设置好的GDTRLDTR寄存器,找到对应的段描述符表,已经表项。然后,从断描述符表项(entry)中拿到段基地址。在linux实现中,所有段的基地址都是0,最大偏移为4GB(32bits机器)

 

段内偏移地址:

在上面test汇编代码截图中,黄色的框表示偏移地址,当test被加载运行时,这个地址就是段式寻址中的段内偏移地址。

 

下面,我们来描述程序从加载到运行的过程:

Linux加载二进制test到内存后,构建mmu的页表项。

将段基地址+段内偏移地址构成的虚拟地址直接用作页寻址的线性地址。然后将线性地址和test被加载到的物理内存的物理地址做页式映射,即线性地址0 映射 到test的加载地址。

同时设置pc指针的值为test文件中的entry指示的地址(entry指示test文件中入口指令地址偏移)

设置好后,cpu就能找到test的第一条指令并加载了:

cpu找第一条指令的地址转换过程:

段基地址0+段内偏移(entry指示的偏移地址<pc指针>)  构成了寻址的线性地址,这个线性地址被mmu映射到了test加载地址处开始的偏移entry指示的地址偏移处。

转载地址:http://itlci.baihongyu.com/

你可能感兴趣的文章
Java开发有必要转大数据吗?
查看>>
Scala对于大数据开发重要吗?Scala基础学习建议
查看>>
Java大数据方向:入行Java大数据值得吗
查看>>
转行大数据还是人工智能,哪个发展更好
查看>>
大数据工程师简历怎么写,更受到HR青睐?
查看>>
大数据开发就业:大数据开发有哪些岗位
查看>>
Spark计算引擎:Spark数据处理模式详解
查看>>
Hadoop生态圈:Hadoop技术入门书单
查看>>
大数据平台开发:大数据系统架构模块解析
查看>>
Java大数据开发做什么?Java大数据开发成长路线
查看>>
Java大数据:关于分布式、高并发与多线程
查看>>
Java大数据:数据库开发从入门到精通
查看>>
Java大数据:大数据开发必须掌握的四种数据库
查看>>
Java大数据:分布式存储Redis初级入门
查看>>
Java大数据:MongoDB数据库入门基础
查看>>
Java大数据:Hbase分布式存储入门
查看>>
Java大数据:全文搜索引擎Elasticsearch入门
查看>>
大数据学习:Hadoop入门学习书单
查看>>
大数据学习:Spark SQL入门简介
查看>>
大数据学习:Spark RDD操作入门
查看>>