当前位置: 技术问答>linux和unix
LINUX内存管理疑问,求高手解答!!
来源: 互联网 发布时间:2017-05-05
本文导语: 用户程序经过汇编编译后形成二进制指令和数据,运行之前,这些指令和数据所存放的地点是外部FLASH或硬盘,运行后,代码被调入内存。而CPU在执行代码的时候需要取线性地址,然后根据线性地址找到指令或数据,...
用户程序经过汇编编译后形成二进制指令和数据,运行之前,这些指令和数据所存放的地点是外部FLASH或硬盘,运行后,代码被调入内存。而CPU在执行代码的时候需要取线性地址,然后根据线性地址找到指令或数据,那么这些线性地址CPU从哪取?难道是从硬盘里取?还是内存有这些线性地址的拷备?求解答,被这问题困扰了好久了!
|
个人理解,程序启动,相关的数据和指令复制到内存。寻址:CPU->MMU->内存。MMU是CPU一部分。如果没有MMU或没启用,CPU直接寻址,也就所直接操作内存的物理地址,如果CPU启用了MMU,CPU发出的内存地址将被MMU截获,MMU将CPU发出的“虚拟地址”转换为内存的物理地址,然后操作内存。如果把CPU透明化,可以理解为CPU直接操作物理地址,其中经过”程序->内核->CPU(MMU)->内存“。我理解的CPU获取的内存地址为经过转换之后的物理地址,操作内存时也是直接操作内存物理地址。要是你想了解如何管理或映射内存的,可以看下内存管理方面的东西。
|
这个是内核和MMU共同转换的得来的, cpu仅仅会看到线性地址, 然后去TLB中查找, 如果TLB命中, 那么就是用已经缓存的地址, 如果没有, 那么会产生中断,MMU和内核共同将物理地址转换成线性地址然后传递给CPU。
具体细节请参考《深入理解linux内核》第二章
具体细节请参考《深入理解linux内核》第二章
|
lz学习过汇编吗?要想理解这个问题,去看一下汇编吧,要不然是理解不透的。
这些地址应该说都是程序定的,比如kernel的起始地址是0xc0000000,在uboot里你要指定cpu跳到这个地址去执行,这样子才能开始运行kernel.
|
肯定是内存啊。运行的时候就会吧程序拷贝到内存的。
|
程序都在内存里。
|
线性地址和物理地址的转换是另外一个问题了。具体怎么转换的我目前还没搞懂。
cpu取指令是从线性地址取的,不过有的时候(比如说没有MMU的时候)线性地址和物理地址是一样的。
cpu取指令是从线性地址取的,不过有的时候(比如说没有MMU的时候)线性地址和物理地址是一样的。