• Linux arm64的虚拟内存布局


    原创翻译,转载请注明出处。

    页表转换
    arm64在硬件体系结构上支持4级的每页大小为4K的页表转换,也支持3级的页大小64KB的页表转换。
    在linux arm64中,如果页的大小为4KB,使用3级页表转换或者4级页表转换,用户空间和内核空间都支持有39bit(512GB)或者48bit(256TB)大小的虚拟地址空间。
    如果页的大小为64KB,就只有2级页表转换,支持42bit(4TB)大小的虚拟地址,用户空间和内核空间也大小一样。


    地址分布
    虚拟地址都用64位无符号数表示。
    用户虚拟地址从高位的63到低位的48都是0,内核虚拟地址则相反,63~48都是1. TTBR x(Translation table base register)的选择是通过虚拟地址的第63 bit位来确定的。swapper_pg_dir只包含内核地址映射,而用户

    pgd 只包含用户地址映射,swapper_pg_dir 指向的地址只会写入到 TTBR1,绝不会写入到TTBR0。

    AArch64 Linux memory layout with 4KB pages + 3 levels:
    
    Start            End            Size        Use
    -----------------------------------------------------------------------
    0000000000000000    0000007fffffffff     512GB        user
    ffffff8000000000    ffffffffffffffff     512GB        kernel
    AArch64 Linux memory layout with 4KB pages + 4 levels:
     
    Start            End            Size        Use
    -----------------------------------------------------------------------
    0000000000000000    0000ffffffffffff     256TB        user
    ffff000000000000    ffffffffffffffff     256TB        kernel
    AArch64 Linux memory layout with 64KB pages + 2 levels:
    
    Start            End            Size        Use
    -----------------------------------------------------------------------
    0000000000000000    000003ffffffffff       4TB        user
    fffffc0000000000    ffffffffffffffff       4TB        kernel
    AArch64 Linux memory layout with 64KB pages + 3 levels:
    
    Start            End            Size        Use
    -----------------------------------------------------------------------
    0000000000000000    0000ffffffffffff     256TB        user
    ffff000000000000    ffffffffffffffff     256TB        kernel

    想看内核虚拟地址布局的详细情况,可以通过观察内核boot日志。

    Translation table lookup with 4KB pages:
    +--------+--------+--------+--------+--------+--------+--------+--------+
    |63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
    +--------+--------+--------+--------+--------+--------+--------+--------+
    |                 |         |         |         |         |
    |                 |         |         |         |         v
    |                 |         |         |         |   [11:0]  in-page offset
     
    |                 |         |         |         +-> [20:12] L3 index
     
    |                 |         |         +-----------> [29:21] L2 index
     
    |                 |         +---------------------> [38:30] L1 index
     
    |                 +-------------------------------> [47:39] L0 index
     +-------------------------------------------------> [63] TTBR0/1
    Translation table lookup with 64KB pages:
    +--------+--------+--------+--------+--------+--------+--------+--------+
    |63    56|55    48|47    40|39    32|31    24|23    16|15     8|7      0|
    
    +--------+--------+--------+--------+--------+--------+--------+--------+
    |                 |    |               |              |
    |                 |    |               |              v
     
    |                 |    |               |            [15:0]  in-page offset
     
    |                 |    |               +----------> [28:16] L3 index
     
    |                 |    +--------------------------> [41:29] L2 index
     
    |                 +-------------------------------> [47:42] L1 index
     +-------------------------------------------------> [63] TTBR0/1

    当使用kvm时,虚拟机管理器(hypervisor)内核页表映射在EL2(CPU异常级别),通过对内核虚拟地址固定的偏移来确定(高24位内核虚拟地址设置为0):

    Start            End            Size        Use
    -----------------------------------------------------------------------
    0000004000000000    0000007fffffffff     256GB        kernel objects mapped in HYP
  • 相关阅读:
    docker安装nginx
    docker安装tomcat&部署javaweb程序
    linux/work
    Go语言入门篇-gRPC基于golang & java简单实现
    Go语言入门篇-jwt(json web token)权限验证
    Go语言入门篇-JSON&http调用
    Go语言入门篇-基本流程控制
    Go语言入门篇-基本类型排序和 slice 排序
    Go语言入门篇-高级数据类型
    Go语言入门篇-基本数据类型
  • 原文地址:https://www.cnblogs.com/danxi/p/6638243.html
Copyright © 2020-2023  润新知