MMU虚拟地址空间布局

描述

   当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。

  (1)-虚拟地址位宽

  虚拟地址的最大宽度是48位 内核虚拟地址在64位地址空间的顶部,高16位是全1,范围是[0xFFFF 0000 0000 0000,0xFFFF FFFF FFFF FFFF];

  用户虚拟地址在64位地址空间的底部,高16位是全0,范围是[0x00000000 0000 0000,0x0000 FFFF FFFF FFFF];

  高16位是全1或全0的地址称为规范的地址,两者之间是不规范的地址,不允许使用。

  如果处理器实现了ARMv8.2标准的大虚拟地址(Large Virtual Address,LVA)支持,并且页长度是64KB,那么虚拟地址的最大宽度是52位。这个也就是大页表,可以提升内存与访问速度。

  可以为虚拟地址配置比最大宽度小的宽度,并且可以为内核虚拟地址和用户虚拟地址配置不同的宽度。

  转换控制寄存器(Translation Control Register)TCR_EL1的字段T0SZ定义了必须是全0的最高位的数量,字段T1SZ定义了必须是全1的最高位的数量,用户虚拟地址的宽度是(64-TCR_EL1.T0SZ),内核虚拟地址的宽度是(64-TCR_EL1.T1SZ)。(全是0是代表的用户,全是1代表的是内核。)

  (2)编译ARM64架构的Linux内核时,可以选择虚拟地址宽度

  • (1)如果选择页长度4KB,默认的虚拟地址宽度是39位。

  • (2)如果选择页长度16KB,默认的虚拟地址宽度是47位。

  • (3)如果选择页长度64KB,默认的虚拟地址宽度是42位。

  • (4)可以选择48位虚拟地址。

  在ARM64架构的Linux内核中,内核虚拟地址和用户虚拟地址的宽度相同。

  • 所有进程共享内核虚拟地址空间,

  • 每个进程有独立的用户虚拟地址空间,

  • 同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分