当前位置: 代码迷 >> 驱动开发 >> LINUX内存管理疑义,求高手解答!
  详细解决方案

LINUX内存管理疑义,求高手解答!

热度:82   发布时间:2016-04-28 10:16:57.0
LINUX内存管理疑问,求高手解答!!
  用户程序经过汇编编译后形成二进制指令和数据,运行之前,这些指令和数据所存放的地点是外部FLASH或硬盘,运行后,代码被调入内存。而CPU在执行代码的时候需要取线性地址,然后根据线性地址找到指令或数据,那么这些线性地址CPU从哪取?难道是从硬盘里取?还是内存有这些线性地址的拷备?求解答,被这问题困扰了好久了!
------解决方案--------------------
以小弟愚见:
首先编译完之后就有一个代码段首地址和数据段首地址,(玩过汇编的应该很清楚的)这是逻辑地址,然后内存管理模块在装入内存执行之前要把这个逻辑地址转化为实际物理地址,然后装入(多数情况是和PC里的值做运算吧)。
------解决方案--------------------
线性地址是提供给用户编程和识别作用的  cpu真正运行的是物理地址  体系架构(特定的cpu)相关代码都有内存管理机制 是用来把线性地址转换成物理地址   vm_area_struct是进程映像的段区的结构  进程加载进去之后在实际使用的时候分配物理地址
------解决方案--------------------
引用:
  用户程序经过汇编编译后形成二进制指令和数据,运行之前,这些指令和数据所存放的地点是外部FLASH或硬盘,运行后,代码被调入内存。而CPU在执行代码的时候需要取线性地址,然后根据线性地址找到指令或数据,那么这些线性地址CPU从哪取?难道是从硬盘里取?还是内存有这些线性地址的拷备?求解答,被这问题困扰了好久了!

有个东西叫装载器(loader)
------解决方案--------------------
cpu并不认识线性地址 所以不存在是cpu去找线性地址 cpu只是运行物理指令只认识物理地址 你说的这个线性转化成物理是内存管理做的  其实可执行文件的代码段在加载之后就对应了物理地址 而你用的可见的 就是线性地址 这是加载器就做好了的  所以说对cpu来说 线性地址是不可见的