Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
armlinux内核页表_Linux_Arm_Mmu - Fatal编程技术网

armlinux内核页表

armlinux内核页表,linux,arm,mmu,Linux,Arm,Mmu,参考文献 我对上一个链接中讨论的主题有疑问/疑问: 0到0xBFFFFF是内存的较低部分(用于用户进程),由TTB0中的页表管理,它包含当前进程的页表 参考arm/include/asm/pgtable-2 h级:PTRS_PER_PGD=2048,PTRS_PER_PMD=1,PTRS_PER_PTE=512 0xc0000000到0xFFFFFF是由TTBR1中的页表管理/转换的地址空间的上部(操作系统和内存映射I/O)。 TTB1表的尺寸和对齐方式是固定的(至16k)。每个级别1条目的大

参考文献

我对上一个链接中讨论的主题有疑问/疑问:

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

  • 0xc0000000到0xFFFFFF是由TTBR1中的页表管理/转换的地址空间的上部(操作系统和内存映射I/O)。 TTB1表的尺寸和对齐方式是固定的(至16k)。每个级别1条目的大小为32位,表示1MB页/段。这是
    swapper\u pg\u dir
    (ref
    System.map
    )页面表格,将16K置于实际文本地址下方
  • 这是
    swapper\u pg\u dir=0中的第一个768条目(用户进程为0x0到0xbffffff)和768到1024之间的有效条目(0xc000000到0xffffff用于操作系统和内存映射的I/O)

  • 有人想在内核空间(内核模块)中共享一些示例代码来浏览这个
    swapper\u pg\u dir
    PGD吗


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

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

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

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

    关于你的问题:

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

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


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

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

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

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

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

    关于你的问题:

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

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


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

    如果阅读引用的线程,则不使用TTB0/TTB1。仅使用一个版本。对于典型的Linux内存模型,拆分是错误的。这可能对其他OSs.Thx有好处。请确认:(1)交换者目录中的每个条目,好吗