Linux arm64的虚拟内存布局

转自:https://blog.csdn.net/bin_linux96/article/details/79325461?utm_source=blogxgwz0

页表转换
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。

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
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日志.

  Virtual kernel memory layout:
   vmalloc : 0xffffff8000000000 - 0xffffffbdbfff0000   (   246 GB)
   vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
              0xffffffbdc0000000 - 0xffffffbde4000000   (   576 MB actual)
   fixed   : 0xffffffbffa7fd000 - 0xffffffbffac00000   (  4108 KB)
   PCI I/O : 0xffffffbffae00000 - 0xffffffbffbe00000   (    16 MB)
   modules : 0xffffffbffc000000 - 0xffffffc000000000   (    64 MB)
   memory  : 0xffffffc000000000 - 0xffffffc900000000   ( 36864 MB)
   .init : 0xffffffc0010b6000 - 0xffffffc001178000   (   776 KB)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt5.5是一个跨平台的应用程序开发框架,可以在不同的操作系统上运行。虚拟键盘是一种软件键盘,可以通过屏幕触摸或鼠标点击进行输入。 在ARM Linux平台上,使用Qt5.5进行虚拟键盘的开发可以很方便地实现。首先,需要在Qt中创建一个窗口,并在窗口中设计键盘的布局和样式。可以使用Qt提供的控件,例如按钮、文本框等来创建键盘的各个按键。 然后,需要在代码中设置键盘的响应事件,即键盘按下或释放时的操作。可以通过重写QWidget类的keyPressEvent和keyReleaseEvent方法,来获取键盘输入事件并进行相应的处理。例如,当按下某个按键时,可以将按键的字符或者对应的键值添加到输入的文本框中。 同时,还可以通过Qt的信号与槽机制来实现键盘的功能。可以将每个按键与一个槽函数进行连接,当按键被点击时,触发相应的槽函数进行操作。 最后,在ARM Linux平台上进行虚拟键盘的部署。首先,需要将代码编译为ARM架构的可执行文件。然后,将可执行文件和相关的资源文件(如键盘的布局和样式文件)一起打包,并在ARM Linux上进行安装。 总的来说,使用Qt5.5进行虚拟键盘的开发是相对容易的,可以在ARM Linux平台上实现一个功能完善的虚拟键盘应用程序。 ### 回答2: 在ARM Linux平台上使用Qt5.5开发虚拟键盘是可行的。Qt是一个跨平台的开发框架,支持基于ARM架构的Linux系统。虚拟键盘是一个常见的输入界面,可以通过Qt5.5提供的功能和API来实现。 首先,需要在ARM Linux系统上安装Qt5.5开发环境。可以从Qt官网下载相应的Qt安装包,并按照官方指南进行安装。安装完成后,可以在开发环境中打开Qt Creator创建一个新的项目。 在项目中,可以使用Qt提供的QWidget或QML来进行虚拟键盘的界面设计。QWidget是一个传统的窗口小部件,而QML是一种声明式的语言用于快速创建用户界面。选择合适的界面设计方式,根据需求进行布局、设计键位、样式等。 接下来,使用Qt提供的事件处理机制来处理虚拟键盘的用户输入。通过重写键盘事件处理函数,可以捕捉到用户的按键操作。根据按键事件的类型和内容,可以在代码中实现相应的逻辑,如字符输入、特殊功能键等。 最后,编译并部署程序到ARM Linux设备上进行测试。Qt提供了丰富的交叉编译工具链支持,可以将应用程序编译为ARM架构下的可执行文件。将编译后的程序拷贝到ARM Linux设备上,运行即可测试虚拟键盘的功能。 总而言之,在ARM Linux平台上使用Qt5.5实现虚拟键盘是可行的。通过合适的界面设计和事件处理,可以实现一个用户友好的虚拟键盘应用。同时,Qt的跨平台特性还可以方便地将虚拟键盘移植到其他平台上使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值