首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM Linux内核页表

问ARM Linux内核页表
EN

Stack Overflow用户
提问于 2013-05-20 11:05:19
回答 1查看 7.3K关注 0票数 2

参考Linux kernel ARM Translation table base (TTB0 and TTB1)

我对前面的链接中讨论的主题有父亲的怀疑/质疑:

  1. 0到0xbfffff是内存的较低部分(用于用户进程),由TTB0中的页表管理,它包含当前进程引用的页表。arm/include/asm/pgtable-2 pgtable.h: PTRS_PER_PGD =2048,PTRS_PER_PMD =1,PTRS_PER_PTE =512

  1. 0xc0000000到0xffffffff是由TTBR1中的页面表管理/翻译的地址空间的上部部分(OS和内存映射I/O)。TTB1表的大小和对齐方式是固定的(到16k)。每个1级条目的大小为32位,代表1MB页/段。这是将16K置于实际文本地址之下的swapper_pg_dir (ref System.map)页表。

  1. swapper_pg_dir = 0中的第一个768项(用户进程的0x0到0xbfffff)和从768到1024的有效条目(0xc0000000到0xffffff是用于操作系统和内存映射的I/O)吗?
  2. 有人喜欢在内核空间(内核模块)中共享一些示例代码来浏览这个swapper_pg_dir PGD吗?
EN

回答 1

Stack Overflow用户

发布于 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设置为此页目录的基址,并刷新缓存以安装新的地址空间。对于映射的更改,交换页也始终保持最新。

关于你的问题:

  1. 简化后的第一级页面有4096个条目。每个条目代表1MB的虚拟地址,总计4GB的ram。条目0-3071表示用户空间,条目3072-4095表示内核空间。
  2. 交换页通常位于地址0xC000400-0xc0008000 (4096个条目*每个条目= 16384 =16 in,十六进制= 0x4000 )。通过检查0xc0004000-0xc0007000的内存,您可以找到用户空间的条目(空),从0xc0007000-0xc0008000可以找到内核条目。我在命令行x /100x 0xc0007000中使用gdb来检查前100个内核条目。然后,您可以检查当前平台的技术参考手册,以便解密页面表属性。

如果您想了解更多关于Linux内核的信息,我建议您使用Qemu与gdb一起模拟Beagleboard,以检查和调试源代码。我这样做是为了了解内核是如何在初始化期间构建页面表的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16648112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档