tiny6410裸机实验第5章--------------DDR(物理地址,链接地址,虚拟地址,地址无关码)

来源:互联网 发布:数控折弯机编程视频 编辑:程序博客网 时间:2024/05/22 13:42

【说明】

             在后面的学习中,我们将遇到链接地址概念以及一种称为链接脚本的文本文件,那么什么是链接地址呢,他和我们的物理地址又有什么关系呢。

             其实链接的技术细节十分复杂,我的另一系列博文中有关于链接的学习笔记,大家可以看看,那是对《程序员的自我修养》这本书的笔记,也推荐大家看这本书。

 

【物理地址】

            物理地址就是指指令存放的内存单元格的地址,没加任何逻辑修饰,在没启动MMU的时候,CPU操作访问内存用的就是物理地址,MMU下面有简单的介绍。

            比如一条汇编指令存放在内存0地址,那么该指令的物理地址就是0,如果将它放在1地址,那它物理地址就是1,物理地址和链接地址,虚拟地址没硬性关系。

            所以,编译器是无法决定程序运行的时候的物理地址的,因为物理地址是一个实时概念,可以在运行时改变

 

【链接地址】

            链接地址是一种逻辑地址,其实它就是链接器,假设出来的物理地址,而至于它运行的时候是不是真在这个物理地址呢,不一定。

           从上边的物理地址介绍中,我们知道链接器是没法确定我们程序运行的时候到底在哪个物理地址的,所以导致什么呢?导致它根本无法确定变量的地址

           该变量放0号地址物理地址就是0,1号地址物理地址就是1,但是链接器得确定你到底是多少,因为它要把这个值写到可执行文件里去

           所以怎么办,最简单的方法不就是编译器假设一个地址,它就直接认为程序以后会在这个数值的物理地址上,比如它假设指令包括数据以后会从0X50000000地址开始,

           那么后面所有指令的地址也就可以确定了,包括变量的地址也确定了。

           只要加载这个程序之后,你乖乖得把指令和地址放在0X50000000开始的内存处,那链接器的假设不就成立啦,那它按这个假设所确定的变量的地址

           不就是现在运行的时候变量的地址嘛,一切都OK了。

           相反,如果你不放在0X50000000开始的内存处,有时候是可以正常运行的,只要是下面讲的地址无关码。但是大部分时候是不可行的

           比如一个变量,按链接器的假设,会在地址0X50001000处,所以所有对于这个变量的地址操作,就将使用这个数值,

           但是,如果你不按链接器的链接地址来放置,使得在这个0X50001000的物理地址上并不是这个变量,而是其他什么乱七八糟的东西

           那么那些访问了这个变量地址的 指令不就全都会出错了啊。

           这个链接器假设的地址,就是链接地址。

 

【虚拟地址】

            虚拟地址就是在虚拟存储器中的地址,现在的操作系统一般都采用虚拟存储系统,每一个进程有一个虚拟地址空间,32位系统为寻址大小为4G 

            虚拟存储系统一般是配合MMU使用的,MMU会判断内存访问的合法性(有些内存用户不能访问),以及进行地址转换

            CPU只根据指令中的值来访问内存,也就是说CPU直接发出来的内存地址应该是指令中写着的地址,从上边知道,指令中这种地址值是链接器按链接地址确定的

            所以,CPU发出来的地址是链接地址(在动态链接中情况非常复杂,篇幅有限,我们只说明最简单的概念)。

            MMU,根据CPU发出的链接地址,再根据页表,页表中存放着的是链接地址到物理地址的映射关系,MMU就根据页表发出真正访问内存的物理地址

            而操作系统的虚拟存储系统会保证这个物理地址上内容是链接地址要的数据(虽然它的物理地址和链接地址可能不一样,但谁在乎呢,一切目的就是为了正确取值)

            所以啊,程序在虚拟空间中的地址,往往就是链接地址,因为从虚拟地址到链接地址之间已经没有机制来转换了

            而链接地址到物理地址是可以有操作系统和MMU保证取数据不出问题的,还是那句话,只要数据内容不出问题,管你什么地址,无所谓。

            上边简单介绍了虚拟地址,链接地址和物理地址的关系,其实真正情况比这个复杂很多,我们只做简单介绍。

 

【地址无关码】

              地址无关码,这里的地址是指物理地址,也就是说是物理地址无关码。

              根据上边说的,关闭MMU情况下,如果物理地址和链接地址不正确,就会出现取数据不正确的问题,但是如果你根本就没有什么需要知道地址值的操作

              比如移位操作,比如栈操作,比如寄存器操作,根本就和地址没半点关系,只要CPU能读取执行就可以了,所以这些就叫“地址无关码”

              如果我们的程序都由这些和地址没关系的指令组成,那么我们无论将程序放在什么物理地址,都能正确按顺序执行啦。

0 0