新手LINUX内存管理疑问

 

      用户程序经过汇编编译后形成二进制指令和数据,运行之前,这些指令和数据所存放的地点是外部FLASH或硬盘,运行后,代码被调入内存。而CPU在执行代码的时候需要取线性地址,然后根据线性地址找到指令或数据,那么这些线性地址CPU从哪取?难道是从硬盘里取?还是内存有这些线性地址的拷备?

 

只做参考,不做标准:

      1、程序启动,相关的数据和指令复制到内存。寻址:CPU->MMU->内存。MMU是CPU一部分。如果没有MMU或没启用,CPU直接寻址,也就所直接操作内存的物理地址,如果CPU启用了MMU,CPU发出的内存地址将被MMU截获,MMU将CPU发出的“虚拟地址”转换为内存的物理地址,然后操作内存。如果把CPU透明化,可以理解为CPU直接操作物理地址,其中经过”程序->内核->CPU(MMU)->内存“。我理解的CPU获取的内存地址为经过转换之后的物理地址,操作内存时也是直接操作内存物理地址。要是你想了解如何管理或映射内存的,可以看下内存管理方面的东西。

      2、这个是内核和MMU共同转换的得来的, cpu仅仅会看到线性地址, 然后去TLB中查找, 如果TLB命中, 那么就是用已经缓存的地址, 如果没有, 那么会产生中断,MMU和内核共同将物理地址转换成线性地址然后传递给CPU。

      具体细节请参考《深入理解linux内核》第二章,要看书了新手朋友们。