2013-05-20 57 views
1

Ref。 Linux kernel ARM Translation table base (TTB0 and TTB1)ARM Linux内核页表

我在以前的链接讨论了主题父亲疑问/查询:

  1. 0至0xbfffffff是存储器(用于用户进程)的下部和在TTB0由页表管理,它包含当前进程的页表

    Ref。臂/包括/ ASM/pgtable-2level.h:PTRS_PER_PGD = 2048,PTRS_PER_PMD = 1,PTRS_PER_PTE = 512

  2. 0xc00000000的为0xffffffff是地址空间的上半部分(OS和存储器映射I/O)管理/由TTBR1中的页表翻译。 TTB1表的大小和对齐方式固定(至16k)。大小的每个1级条目都是32位,代表1MB的页面/段。这是swapper_pg_dir(REF System.map)页表是放在下面的实际文本地址16K
  1. 的是,在swapper_pg_dir = 0第768项(0x0到0xbfffffff用户进程),并从768有效进入1024(0xc0000000到0xffffffff用于OS和内存映射I/O)?

  2. 任何人都喜欢在内核空间(内核模块)共享一些示例代码来浏览此swapper_pg_dir PGD?

+0

如果您阅读引用的话题,则不使用TTB0/TTB1。只使用一个版本。典型的Linux内存模型的拆分是错误的。这对其他操作系统可能有好处。 –

+0

Thx为您的更新。 –

+0

Thx为您的更新。请您确认 - (1)swapper_pg_dir中的每个条目对应1MB的内存部分? (2)任何遍历PGD列表的例子(每个条目8字节和2048个条目)? –

回答

4

由于ARM MMU的设计方式,翻译表(TTB0和TTB1)只能用于1:1映射内核映射。

大多数Linux内核具有3:1映射(3GB用户空间:1GB用于ARM的内核空间)。 这意味着0-0xBFFFFFFF是用户空间,而0xC0000000 - 0xFFFFFFFF是内核空间。

现在对于HW存储器转换,仅使用TTBR0。 TTBR1仅保存初始交换页面(包含所有内核映射)的地址,并不真正用于虚拟地址转换。 TTBR0保存当前使用的页面目录(HW用于翻译的页表)的地址。现在每个用户进程都有自己的页表,并且对于每个进程切换,TTBR0更改为当前用户进程页表(它们都位于内核空间中)。

例如,对于每个新的用户进程,内核创建一个新的页面目录,将所有内核映射从swapper页面(3-4GB的页面帧)复制到新的页面表并清除用户页面(页面从0-3GB的帧)。然后它将TTB0设置为该页面目录的基地址,并刷新缓存以安装新的地址空间。交换页面也随时更新映射。

对于你的问题:

  1. 简化,硬件上的第一级页面有4096项。每个条目代表1MB的虚拟地址,总计4GB的内存。条目0-3071代表用户空间,条目3072-4095代表内核空间。

  2. 交换页面通常位于地址0xC0004000-0xc0008000(4096个条目* 4bytes每个条目= 16384 = 16kb在十六进制= 0x4000)。通过查看0xc0004000-0xc0007000处的内存,您可以找到用户空间的条目(空),从0xc0007000-0xc0008000可以找到内核条目。我使用gdb和命令行x /100x 0xc0007000来检查前100个内核条目。然后,您可以检查当前平台的技术参考手册以破译页表属性。

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

+0

MrGigu,请让我知道你的意思是“TTBR0保存当前使用的页面目录的地址(硬件用于翻译的页表)。我很难理解页面表在两个操作系统级别和硬件级别(即MMU),所以您所说的页面目录(页表的第一级)设置了仅具有虚拟地址的Linux操作系统,并且将这些虚拟地址提供给硬件时(MMU单元)作为输入,MMU的输出是一个物理地址,但我不明白在这个过程中如何使用Harware页表? –

+0

Hello Amit,页表位于RAM的某处,用于32位Linux ARM,通常位于虚拟地址0xc0004000 - 0xc0008000。因此,页表中包含4096个条目,每个条目占用4个字节,即16KB空间。为简单起见,假设每个条目映射为1MB节页,则条目0映射虚拟地址0,条目1广告服装0x0100 0000,条目2地址0x0200 0000等最多0xFFF0 0000,即总共4GB的RAM。 – MrGigu

+0

从最后一条消息开始继续:现在每个页条目都可以映射到一个自定义物理地址,所以如果条目1映射到地址0x0a00 0000,那么对虚拟地址0x0100 0000的所有访问都将被转换为物理地址0x0a00 0000.这是页表位于软件,硬件MMU在虚拟地址空间中查看每个访问的翻译。 MMU也有一个称为TLB的缓存,其中最近的和经常翻译的条目被缓存在系统中。 – MrGigu