我们知道,程序文件一般放在硬盘上,当把程序运行起来时,程序被放入内存中,通过内存放入cache,通过cache进入cpu,下图中预取器就是负责从cache取出指令,然后由译码器译码,译码的作用就是要知道需要哪些寄存器配合完成指令,如该指令是一个加法运算,则译码器译码后发现需要使用到add,eax和ebx寄存器,然后交给ALU算数逻辑单元进行算数运算,结果放回寄存器,再放入cache,再放入内存,之后交给IO总线,再交给物理设备显示到屏幕上。
下图是一个0到4G的虚拟地址空间,.text存放代码,.data存放数据,heap是堆区,stack是栈区,这0到3G是用户区,3到4G是内核区,当程序运行的时候便会产生这样一个虚拟地址空间,程序运行时所需的所有资源都放到虚拟内存中。虚拟内存不是真实存在的,图中所示的4G大小的虚拟内存是指程序运行可用的地址空间有4G,程序运行的资源最终还是要放到物理内存中。那虚拟地址和物理地址如何对应?就是使用MMU。MMU:内存管理单元,用于完成虚拟内存和物理内存的映射,位于CPU内部;MMU将虚拟内存映射到物理内存,以及设置修改CPU的访问级别,如printf函数,要调用系统函数write,要进入内核空间,此时CPU的访问级别由3级用户空间转换到0级内核空间。
下图所示为在同一个机器上运行两份可执行程序a.out,产生两个虚拟地址空间,其中,两个进程的用户态虚拟地址被MMU映射到物理内存的不同地址,但是内核态映射到同一个地址(针对单核来讲),而PCB虽然位于内核中,两个进程的PCB是不一样的,只是位于同一个物理地址处。
综上,程序运行的时候产生虚拟地址空间,预取器取处指令后需要MMU的配合,将虚拟地址和物理地址做映射才能正确取出数据。
现在,进一步分析,如下图所示,进程a.out的PCB中有一个指针,指向页目录,页目录中有一个个的指针,其中一个指向页表,页表中也有一个个的指针,其中一个指向物理页面,物理页面中是一个个的内存单元,然后才通过MMU完成虚拟地址和物理地址的映射。
简而易懂的CPU和MMU画图讲解
最新推荐文章于 2023-09-13 23:42:59 发布