1.1 地址空间
- 物理地址:硬件(例如内存条)所支持地址空间,地址空间的管理由硬件完成。
- 逻辑地址(虚拟地址):运行地址所看到的地址空间,地址空间是一维的,应用程序更加容易访问和管理。
1.2 逻辑地址生成
图1
逻辑地址生成如图1所示,.c程序经过编译得到.s文件,再经过汇编得到.o文件,此时变量名和函数名都会转换成从0开始的连续地址空间,然后再经过链接把多个.o文件生成.exe文件,此时因为链接了其他函数库,所以地址会产生偏移,从图中可以看到程序地址从0-75变成了0-175。链接产生的地址0-175就是逻辑地址。
然后loader程序会把硬盘中的.exe文件加载到内存中运行。但是问题在于,假设另外一个程序的地址为0-200,那这两个程序因为地址冲突就不能一起执行了,为了解决这个问题,MMU会对程序的逻辑地址进行映射,转换成对应的物理地址。这样子,两个不同程序会映射到不同的物理地址上,避免冲突。所以程序加载时候会对逻辑地址进行重定位,转换成物理地址。
1.3逻辑地址与物理地址的映射
程序在执行指令movl %eax,$oxfffa620e,传递给CPU的地址是逻辑地址,但是一开始并不知道指令在物理内存哪个地方,需要把指令所在的逻辑地址转换成物理地址 ,然后在内存中的对应位置读取该指令并执行。CPU中有个MMU,MMU负责逻辑地址与物理地址之间的转换,转换后映射表也在内存中,查此表就可以知道逻辑地址对应哪个物理地址了。
MMU根据映射表把地址翻译成物理地址,控制器把物理地址和相关总线信号送到总线上,然后存储单元会识别总线上的地址和控制信号,如果控制信号是写,则把CPU送过来的数据写入到内存,如果是读, 那么就从内存中读出数据放到总线上,送到CPU。
1.4 地址检查
逻辑地址转换成物理地址还有检查的过程。譬如需要访问某个数据段的数据,数据段会有个段长度和段基址,访问时候,如果偏移量(逻辑地址从0开始,逻辑地址相当于偏移量)超过了段长度,那么访问是非法的。如果访问合法,那么偏移就会和段基址相加得到物理地址。