返回顶部
首页 > 资讯 > 操作系统 >如何进行ARM64 Linux内核页表的块映射
  • 440
分享到

如何进行ARM64 Linux内核页表的块映射

2023-06-15 17:06:02 440人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关如何进行ARM64 linux内核页表的块映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内核文档Documentation/arm64/memory.rst描述了AR

这期内容当中小编将会给大家带来有关如何进行ARM64 linux内核页表的块映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

内核文档Documentation/arm64/memory.rst描述了ARM64 Linux内核空间的内存映射情况,应该是此方面最权威文档。

以典型的4K页和48位虚拟地址为例,整个内核空间的虚拟地址分布如下:

如何进行ARM64 Linux内核页表的块映射

从ffff000000000000到ffff7fffffffffff是一段针对物理地址的线性映射区,最大支持128TB的物理地址空间,这一段地址非常类似ARM32的low  memory映射区。

我们看看这种情况下的页表,我们既可以用最终的【20:12】对应的PTE映射项,以4K为单位,进行虚拟地址到物理地址的映射;又可以以【29:21】对应的PMD映射项,以2M为单位,进行虚拟地址到物理地址的映射。

如何进行ARM64 Linux内核页表的块映射

对于用户空间的虚拟地址而言,当我们进行的是PMD映射的时候,我们得到的是Huge Page,ARM64的2MB的huge  page,在虚拟和物理上都连续,它在实践工程中的好处是,可以减小TLB  miss,因为,如果进行了2MB的映射,整个2MB不再需要PTE,映射关系大为减小。

如何进行ARM64 Linux内核页表的块映射

对于内核空间而言,从ffff000000000000到ffff7fffffffffff的这段虚拟地址,如果与物理地址进行的是一种PMD映射的话,显然也可以达到同样的效果。但是,这不意味着它们就是Huge  Page。众所周知,内核开机把物理地址往虚拟地址进行线性映射,并不意味着这片内存被内核拿走了,它只是进行了一种映射,以便日后调用kmalloc(),get_free_pages()等api申请的内存是直接已经有虚实映射的。所以,即便内核进行的就是PMD映射,在内存的分割上,还是可以以4K为单位的:

如何进行ARM64 Linux内核页表的块映射

所以,即便我们在内核空间进行PMD映射,里面的每个蓝色圆圈(一个4K页),还是可以被单独分配的,这种分配可以是kmalloc、vmalloc,用户态的malloc等。内核态进行的PMD映射,不意味着相关的2MB成为了huge  page,它纯粹只是为了服务于当内核以线性映射的虚拟地址访问该物理地址的时候(我们认为内核大多数时候是用这个线性映射的虚拟地址的),减小TLB  miss。

当然,更牛逼的情况下,内核应该也可以直接用【38:30】位的PUD来进行映射,这样映射关系是1GB的,则整个1GB后面占TLB的时候,只需要占一个入口。

如何进行ARM64 Linux内核页表的块映射

当然,如果用户态的虚实映射是这样的,用户实际得到了一个1GB的巨页。但是对于内核的线性映射区域而言,即便我们进行了1GB的PUD映射,这1G内部就可以进一步切割为4KB页或者2MB的巨页。记住:内核态的线性映射区的映射只是个映射关系,不是个分配关系。比如下面的1GB的内核线性映射的1GB区域,仍然可以被4K分配走,或者被用户以huge  page以2MB为单位分配走:

如何进行ARM64 Linux内核页表的块映射

我们需要一个真实的调试手段来验证我们的想法,这个调试手段就是PTDUMP(Page Table Dump),相关的代码在ARM64内核的:

arch/arm64/mm/ptdump.c和ptdump_debugfs.c

我们把它们全部选中,这样我们可以得到一个debugfs接口:

/sys/kernel/debug/kernel_page_tables

来获知内核态页表的情况。

我用qemu启动了一个4GB内存的ARM64虚拟机,可以看到前1GB的虚拟地址空间大多数是PMD和PTE映射,后面的3GB,全是PUD映射:

如何进行ARM64 Linux内核页表的块映射

我的内核启动参数加了rodata=0:

$ cat /proc/cmdline root=/dev/vda2 rw console=ttyAMA0 ip=dhcp rodata=0

原因是内核在几种情况下,是不会做这种PMD和PUD映射的,相关代码见于:

如何进行ARM64 Linux内核页表的块映射

如何进行ARM64 Linux内核页表的块映射

rodata_full在默认情况下总是成立的,它对应着内核的一个Config选项CONFIG_RODATA_FULL_DEFAULT_ENABLED,  "Apply r/o permissions of VM areas also to their linear  aliases",这个选项提高了内核的安全性,但是减小了内核的性能。

如何进行ARM64 Linux内核页表的块映射

我在内核启动参数加的rodata=0实际上是让rodata_full为false。如果我把这个kernel启动选项去掉,我得到的内核页表是完全不一样,线性映射区也全部是PTE映射:

如何进行ARM64 Linux内核页表的块映射

最后,值得一提的是,不仅线性映射区可以使用PMD映射,vmemmap映射区也是在4K页面情况下,默认用PMD映射的:

如何进行ARM64 Linux内核页表的块映射

字节跳动的宋牧春童鞋发了一个patchset,企图在用户分得巨页的情况下,删除巨页内部的4KB的小page占用的page  struct的内存消耗,这个patchset在圣诞节前目前发到了V11:

https://lore.kernel.org/linux-mm/20201222142440.28930-1-songmuchun@bytedance.com/

如何进行ARM64 Linux内核页表的块映射

在这个patchset中,它就需要拆分vmemmap的PMD映射为PTE映射:

如何进行ARM64 Linux内核页表的块映射

这个patchset的原理建立在,当内核以4KB分页的时候,每个page需要64字节的page  struct。但是,当用户把它分配为巨页的时候,时候,我们不再需要一个个4KB单独用page struct描述,对于这种compound  page的情况,我们应该可以把后面的page struct的内存直接释放掉,因为情况完全是雷同的,这样可以剩下不少内存。

上述就是小编为大家分享的如何进行ARM64 Linux内核页表的块映射了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 如何进行ARM64 Linux内核页表的块映射

本文链接: https://lsjlt.com/news/280994.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何进行ARM64 Linux内核页表的块映射
    这期内容当中小编将会给大家带来有关如何进行ARM64 Linux内核页表的块映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内核文档Documentation/arm64/memory.rst描述了AR...
    99+
    2023-06-15
  • 如何进行linux内核模块调试
    这篇文章将为大家详细讲解有关如何进行linux内核模块调试,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 开启虚拟机,虚拟机运行到 kgdb: Waiting for connection ...
    99+
    2023-06-16
  • 如何进行linux-2.6内核升级
    这篇文章主要讲解了“如何进行linux-2.6内核升级”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何进行linux-2.6内核升级”吧!     一、01....
    99+
    2023-06-10
  • 如何强制关闭linux的内核模块
    这篇文章主要介绍了如何强制关闭linux的内核模块,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装 Kgotobed确保你已经安装了 dkms。它在大多数 Linux 发行...
    99+
    2023-06-16
  • linux如何罗列状态的内核模块
    ...
    99+
    2024-04-02
  • 如何进行Linux 2.6 内核的嵌入式系统应用
    这篇文章给大家介绍如何进行Linux 2.6 内核的嵌入式系统应用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数...
    99+
    2023-06-16
  • Python中如何利用PyVista进行mesh的色彩映射
    这篇文章给大家分享的是有关Python中如何利用PyVista进行mesh的色彩映射的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PyVista简介PyVista是什么PyVista 是一个:VTK for hu...
    99+
    2023-06-14
  • 如何进行python核心模块中pickle和cPickle的分析
    如何进行python核心模块中pickle和cPickle的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。pickle模块使用的数据格式是python专用的,并且不同版...
    99+
    2023-06-04
  • Linux内核中的数据双链表如何理解
    这篇文章给大家介绍Linux内核中的数据双链表如何理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会首...
    99+
    2023-06-28
  • 如何进行Nginx内核优化的源代码分析
    如何进行Nginx内核优化的源代码分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Nginx内核优化在不断的使用中有很多的问...
    99+
    2024-04-02
  • 如何进行linux内存的Hugepages优化
    本篇文章给大家分享的是有关如何进行linux内存的Hugepages优化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Hugepages是从Linux kernal 2.6后被...
    99+
    2023-06-06
  • 如何进行网站的页面内链接优化
    网站页面内链接优化主要涉及以下几个方面:1、确定目标关键词,2、使用锚文本策略,3、创建高质量内容,4、链接布局和层次结构,5、关注用户体验,6、维护和更新链接。首先,你需要明确每个页面要优化的目标关键词。这样,当你进行内部链接时,可以围绕...
    99+
    2023-10-29
    链接 页面内 网站
  • 如何使用Node的内置模块zlib进行gzip压缩
    这篇文章主要介绍了如何使用Node的内置模块zlib进行gzip压缩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Node的内置模块zlib进行gzip压缩文章都会有所...
    99+
    2024-04-02
  • 如何在Linux用户空间执行内核空间的事务
    今天就跟大家聊聊有关如何在Linux用户空间执行内核空间的事务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如今,Linux 的使用范围在世界上是最大的,而这些应用又有着世界上最大的...
    99+
    2023-06-28
  • 如何在ArchLinux中进行内核和驱动程序的更新和管理
    在ArchLinux中,可以使用以下步骤来更新和管理内核和驱动程序: 更新系统:首先,使用以下命令来更新系统的软件包列表和已安装的...
    99+
    2024-04-02
  • java 进程是如何在Linux服务器上进行内存分配的
    众所周知,Java进程在启动的时候我们可以通过 -Xms 和-Xmx来设置内存的上限和下限。直到我发现使用top命令监控的Java进程在-Xms设置4g的情况下占用的内存并不是4g,这就产生了一个疑问Linux服务器...
    99+
    2022-06-03
    java 进程 java 进程内存分配 linux 服务器内存分配
  • 如何显示Linux系统的内置模块和设备驱动列表
    这篇文章主要讲解了“如何显示Linux系统的内置模块和设备驱动列表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何显示Linux系统的内置模块和设备驱动列表”吧!提问:我想要知道Linux...
    99+
    2023-06-12
  • 如何进行Python pandas两个表格内容模糊匹配的实现
    如何进行Python pandas两个表格内容模糊匹配的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、方法2此方法是两个表构建某一相同字段,然后全连接,...
    99+
    2023-06-25
  • Java数组如何在Linux和Windows中进行有效的内存管理?
    Java数组是一种非常常用的数据结构,它可以帮助我们存储和处理大量数据。在Linux和Windows系统中,Java数组的内存管理非常重要,因为它直接影响着程序的性能和稳定性。本文将介绍Java数组在Linux和Windows中的内存管理方...
    99+
    2023-08-26
    linux windows 数组
  • 如何进行mysqldump单表备份加--single-transaction --master-data=2参数执行过程的内部剖析
    今天就跟大家聊聊有关如何进行mysqldump单表备份加--single-transaction --master-data=2参数执行过程的内部剖析,可能很多人都不太了解,为了让大家更加了解,小编给大家总...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作