mmu:
cpu
|| VA
mmu
|| PA
-------------------
| |
DDR device
1.虚拟地址前20位为页表项索引,后12位为物理地址的offset。
页表项有32位,前20位为映射的物理地址,后12位为flag位,分别是rwe(read,write,exit)。
2.当执行一个程序(elf文件)时,里面有很多标记处,标记代码属性,在什么段。kernel根据elf文件创建进程,根据代码属性创建不同的页表项, r,w位填入相应的值(rodata段的代码就是r为1为0)。
3.当发生缺页中断时,判断该地址是否合法。比如堆,栈空间的地址都是动态分配的,不可能到程序中load。页表项中有就有,没有就没有。而load的代码地址不能高于data段的end。但是地址合法也不一定load成功,有些段(地址)可能没数据的。
4.mmu页表也是放在内存中,mmu里有一个寄存器存放页表首地址,从而找到页表(地址为物理地址)。当我们执行一个程序时,会把这个进程的mmu页表地址放到该寄存器中,跳转找到mmu页表执行。
5.mmu有Dmmu和Immu两个运算单元,其中有个e存在标记位,当在Dmmu时,e为0时产生data abort中断,load代码(从disk),假如代码存在的话继续load到内存中执行。在Immu时,e为0,指令不存在,产生Iabort中断,假如代码存在的话继续load到内存中执行。正常执行完程序退出时,kernel链接C库,然后执行exit,free页表。
6.mmu的protection功能实现:
mmu的低12位中有2个flag为R,W。标记map的pa是可读还是可写。当标记位为只读时,传来了一个str R0, [R1]时,R1的地址为只读,再比较option为str写指令,mmu会报一个异常给cpu(data abort),进程停止执行,cpu跳到指定处执行,向当前进程发一个信号,进程收到信号后打印出segment flaut,调用exit退出进程。
7.mmu的expansion功能实现:
我们运行程序时创建整个页表,但是只创建页表的一部分页表项,当运行到的页表项没创建链接时(有一个e flag,当为1时,该页表项有效),会产生一个中断,cpu会调度分配空间该页表,然后把程序load 到内存中继续运行。假如我们要运行一个2G的游戏,不可能一下就把所有的页表项分配好,不实际,假如物理地址只有1G也分配不了,所以动态建立页表项。
8.mmu的translation功能实现:
在MMU enable的时候,cpu发出的地址都是虚拟地址(VA),通过MMU转化为物理地址(PA)。
PA = PCB->pt[va >> 12] + va & 0xfff
9.allocation实现:
查找mmu的e flag看该页表项有没有被用,然后链接到DDR,返回虚拟地址。
阅读(5323) | 评论(5) | 转发(7) |