参考Linux kernel ARM Translation table base (TTB0 and TTB1)
我对前面的链接中讨论的主题有父亲的怀疑/质疑:
swapper_pg_dir (ref System.map)页表。swapper_pg_dir = 0中的第一个768项(用户进程的0x0到0xbfffff)和从768到1024的有效条目(0xc0000000到0xffffff是用于操作系统和内存映射的I/O)吗?swapper_pg_dir PGD吗?发布于 2013-08-30 12:36:06
由于ARM MMU是如何设计的,所以翻译表(TTB0和TTB1)只能用于1:1的映射内核映射。
大多数Linux内核具有3:1的映射(3GB的用户空间: 1GB的ARM内核空间)。这意味着0-0xBFFFFFF是用户空间,而0xC00000-0xFFFFFF是内核空间。
现在,对于HW内存转换,只使用TTBR0。TTBR1只保存初始交换页的地址(它包含所有内核映射),并不真正用于虚拟地址转换。TTBR0保存当前使用的页面目录( HW用于翻译的页面表)的地址。现在,每个用户进程都有自己的页表,对于每个进程开关,TTBR0都会更改到当前的用户进程页表(它们都位于内核空间)。
例如,对于每个新的用户进程,内核创建一个新的页面目录,将所有内核映射从swapper页面(3-4GB的页面帧)复制到新的页表中,并清除用户页(0-3GB的页帧)。然后将TTB0设置为此页目录的基址,并刷新缓存以安装新的地址空间。对于映射的更改,交换页也始终保持最新。
关于你的问题:
x /100x 0xc0007000中使用gdb来检查前100个内核条目。然后,您可以检查当前平台的技术参考手册,以便解密页面表属性。如果您想了解更多关于Linux内核的信息,我建议您使用Qemu与gdb一起模拟Beagleboard,以检查和调试源代码。我这样做是为了了解内核是如何在初始化期间构建页面表的。
https://stackoverflow.com/questions/16648112
复制相似问题