为了理解基本的MMU *** 作原理,需要先搞清楚下面几个概念:
下图是一个典型的ARM处理器访问内存的过程,其他处理器也类型。
当ARM要访问处理器时,MMU先查找TLB中的虚拟地址表。如果ARM的结构支持分开的数据TLB(DTLB)和指令TLB(ITLB),则除了取指令使用ITLB外,其他都使用DTLB。
若TLB中没有虚拟地址的入口,则转换表遍历硬件并从存放于主存储器内的转换表中获取地址转换信息的访问权限(执行TTW),同时将这些信息放入TLB,或者被放在一个没有使用的入口或者替换一个已经存在的入口,之后,在TLB条目中控制信息的控制下,当访问权限允许时,对真实物理地址的访问将在Cache或在内存中发生,如下图:
ARM内TLB条目中的控制信息用于控制对对应地址的访问权限以及Cache的 *** 作
MMU具有虚拟地址和物理地址转换、内存访问权限保护等功能,这将使得Linux *** 作系统能单独为系统的每个用户分配独立的内存空间并保证用户空间不能访问内核空间的地址,为 *** 作系统的虚拟内存管理模块提供硬件基础。
仿真的时候,你的程序是运行在sdram里面的,也就是0x3000_0000处开始运行你的中断向量表通过仿真器已经放在了0x3000_0000处,
打开mmu是为了把0x3000_0000地址处的值映射到0x0的地方,
因为你的中断向量表是保存在0x0开始的地方,当中断发生时的第一时间
CPU会去0x0地方查中断向量表看是发生了什么中断,是reset还是IRQ还是FIQ还是取数据终止或取指令终止
按键外部中断是IRQ中断,然后CPU会去IRQ开始的地方找到你的中断服务函数,这个时候轮到了你的中断服务函数运行的时间了
所以你不打开MMU就不会进入中断服务函数
你启动了mmu,但是你页表里面没东西呀,一开始初始化都是用物理地址的。启动mmu会错。而且还要关掉看门狗,不然没有喂狗,会一直重启。。。等系统引导差不多了,就可以用mmu了,改cp15协处理器,管理mmu
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)