关于MMU页表的问题

Kcuebi 2017-07-21 06:29:55
MMU地址转换表是什么时候建立的,调用程序之前建立的还是调用程序时建立的,转换表存放在内存还是外存中,调用不同的程序需不需要建立不同的转换表,是不是程序调用结束后转换表就被删除
...全文
358 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kcuebi 2017-08-03
  • 打赏
  • 举报
回复
引用 3 楼 jklinux 的回复:
[quote=引用 楼主 u011263361 的回复:] MMU地址转换表是什么时候建立的,调用程序之前建立的还是调用程序时建立的,转换表存放在内存还是外存中,调用不同的程序需不需要建立不同的转换表,是不是程序调用结束后转换表就被删除
MMU地址转换表是什么时候建立的, 这个问题得分是系统的映射表还是进程的映射表了。系统的肯定是在启动就是创建好了,每个进程都有一个映射表的,所以进程的应也是调用程序时创建了,进程退出了它相应的映射表也会回收处理的。 映射表都是存放在内存里。[/quote]非常感谢!
jklinux 2017-08-02
  • 打赏
  • 举报
回复
引用 楼主 u011263361 的回复:
MMU地址转换表是什么时候建立的,调用程序之前建立的还是调用程序时建立的,转换表存放在内存还是外存中,调用不同的程序需不需要建立不同的转换表,是不是程序调用结束后转换表就被删除
MMU地址转换表是什么时候建立的, 这个问题得分是系统的映射表还是进程的映射表了。系统的肯定是在启动就是创建好了,每个进程都有一个映射表的,所以进程的应也是调用程序时创建了,进程退出了它相应的映射表也会回收处理的。 映射表都是存放在内存里。
Kcuebi 2017-07-27
  • 打赏
  • 举报
回复
MMU页表实际就是一个二进制编码,可以称之为描述符,在这个描述符中,包含了从虚拟地址MVA物理地址映射信息,拿S3C2440来说,有4096个一级页表,每个一级页表对应着1MB的地址映射,一级页表有段页表,粗页表,细页表三种,每个描述符都是32位二进制码,拿段页表描述符来说,这个描述符在我们启动MMU之前被创建并存放到内存某个位置中去,怎样找到这个描述符所在位置呢?这就由MVA和MMU的基址寄存器C2共同来完成,我们在创建MMU页表的时候,会先往基址寄存器中写入一个地址比如0x30000000,这个地址就是4096个一级页表所在内存位置的起始地址,这4096个一级页表连续存放在0x30000000~0x30003FFF这段内存中(每个页表占32位也就是4字节),而MVA中的bit[31:20]就是每个一级页表在这4096个页表中的偏移量(就是第几个页表的意思),知道了起始地址,又知道了偏移量,我们就知道了这个段页表描述符的具体地址(这个具体地址由MMU硬件自动根据基址寄存器中的值和MVA来确定),段页表描述符中包含映射信息:1、这个映射对应的1MB物理地址的起始地址信息,这个信息就是描述符的bit[31:20](注意是描述符的bit[31:20]不要和上面说的MVA的bit[31:20]混淆了),这个12位后面填充20个0就是那1MB物理地址的起始地址,而MVA中的bit[19:0]便是在这1MB物理地址中的偏移量,描述符的bit[1:0]这两位表明了描述符是段页表还是粗页表或者细页表描述符,中间某些位还指明了这对应物理地址的访问权限这里不细说,这样,当我们访问一个虚拟地址(假设是按段映射的)时,MMU就自动根据基址寄存器和MVA中的bit[31:20]找到段页表所在位置,然后根据段页表描述符中的bit[31:20]和MVA中的bit[19:0]生成物理地址,这样就完成了从虚拟地址到物理地址的映射。粗页表和细页表稍不同,它们是两级映射,就是说先根据基址寄存器中的值和MVA中的特定位确定页表所在位置,然后再根据描述符中的特定位和MVA中特定位一起来确定下一级页表的所在位置,最后根据二级页表中的映射信息(描述映射对应的物理地址的起始地址)和MVA中剩下的位(描述偏移量)一同产生物理地址,这些动作都由MMU硬件自动完成,我们要做的就是建立页表,然后将页表位置通过基址寄存器告诉MMU就可以了
常书 2017-07-25
  • 打赏
  • 举报
回复
MMU在内核刚加载的时候创建

1,025

社区成员

发帖
与我相关
我的任务
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
  • CPU和硬件区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧