422|1

206

帖子

0

TA的资源

一粒金砂(高级)

《奔跑吧Linux内核1:基础架构》-02-ARM64在Linux内核的实现与内存管理 [复制链接]

5.jpg

一、ARM64 架构与 Linux 内核的邂逅

在当今数字化时代,计算技术飞速发展,各种架构与系统不断涌现,ARM64 架构凭借其独特优势,在众多领域崭露头角。它是 ARM 架构的 64 位版本,相比传统的 32 位架构,有着显著的提升,如更大的内存寻址空间,理论上可支持高达 2^64 字节的内存 ,这为处理大规模数据和复杂应用提供了坚实基础。同时,ARM64 在能效比上表现出色,其精简指令集(RISC)设计,让处理器在执行指令时更高效,能耗更低,这使得它在移动设备、嵌入式系统中备受青睐。从智能手机到物联网设备,ARM64 架构无处不在,成为推动这些领域发展的重要力量。

Linux 内核作为开源操作系统的核心,以其高度的可定制性、稳定性和强大的功能,在服务器、嵌入式系统等众多场景广泛应用。它犹如一个庞大而精密的机器,协调着计算机硬件与软件之间的交互。而 ARM64 架构与 Linux 内核的结合,更是碰撞出了耀眼的火花。研究 ARM64 在 Linux 内核中的实现及内存管理,有着多方面的重要意义。从技术发展角度看,这有助于深入理解现代计算机系统底层原理,推动计算机体系结构的发展。随着物联网、人工智能等新兴技术的兴起,对计算设备的性能和能效提出了更高要求,ARM64 与 Linux 内核的优化结合,能更好地满足这些需求。在实际应用中,对于开发人员来说,掌握这方面知识,能够更高效地进行基于 ARM64 平台的软件开发与系统优化,提高产品性能和稳定性 。无论是开发高性能的服务器应用,还是低功耗的嵌入式设备程序,都离不开对 ARM64 在 Linux 内核实现及内存管理的深入理解。

1.png

二、ARM64 在 Linux 内核的实现

 

2.png

(一)ARM64 架构特点

ARM64 架构基于 ARMv8 指令集,拥有诸多独特优势。其最显著的特点便是 64 位寻址能力,这意味着它能够访问远超 32 位架构的内存空间,为运行大规模数据处理和复杂应用程序提供了广阔的内存空间。例如,在处理大型数据库或进行深度学习模型训练时,充足的内存寻址范围能确保数据的高效读取与存储,避免因内存不足导致的性能瓶颈。

在寄存器组方面,ARM64 拥有 31 个 64 位的通用寄存器,相比 ARM32 增加了不少。这些寄存器在数据处理和运算中发挥着关键作用,能够快速存储和读取数据,减少对内存的访问次数,从而提高了处理器的执行效率。以矩阵运算为例,多个通用寄存器可以并行存储矩阵元素,加速运算过程。

ARM64 的指令集也进行了优化,引入了新的指令,如高级 SIMD(NEON)指令集,这极大地增强了其在多媒体处理、信号处理等领域的能力。在处理高清视频解码时,NEON 指令集可以并行处理多个数据元素,快速完成视频的解码工作,为用户带来流畅的观看体验。

(二)Linux 内核适配 ARM64 的关键改动

为了使 Linux 内核能够在 ARM64 架构上高效运行,开发者们对内核进行了一系列关键改动。在中断处理方面,ARM64 采用了全新的通用中断控制器(GIC)架构,如 GICv3 和 GICv4。这些新架构支持更多的中断源和更高的中断处理效率,能够更好地满足现代多核处理器的需求。在多核 ARM64 处理器中,GIC 可以将中断均匀地分配到各个核心上,避免某个核心因中断过多而负载过重,确保系统的整体性能稳定。

Linux 内核针对 ARM64 的中断处理流程也进行了优化。当中断发生时,内核能够快速地响应并跳转到相应的中断处理函数,减少中断响应时间。在处理网络中断时,内核可以迅速将网络数据包从硬件缓冲区读取到内存中,并进行后续的处理,保证网络通信的及时性。

在系统调用方面,ARM64 有着独特的实现方式。系统调用是用户态程序与内核态交互的重要途径,ARM64 通过特定的寄存器传递系统调用参数,如 x0 - x7 寄存器用于传递前 8 个参数,x8 寄存器用于存放系统调用号。这种方式简洁高效,能够快速地实现用户态到内核态的切换。当用户态程序调用 open 函数打开文件时,通过这些寄存器传递文件名、打开模式等参数,内核接收到这些参数后,执行相应的文件打开操作。

(三)编译与构建:ARM64 内核之旅

在 Linux 环境下编译和构建适用于 ARM64 架构的内核,需要精心准备。首先是工具链的准备,常用的工具链如 Linaro 工具链,它提供了一套完整的编译工具,包括编译器、链接器等。可以从 Linaro 官方网站下载适合的工具链版本,下载完成后,解压工具链文件,并将其 bin 目录添加到系统的 PATH 环境变量中,确保系统能够找到相关的编译工具。

接着是配置选项的设置,这一步至关重要。进入内核源代码目录,执行 “make ARCH=arm64 defconfig” 命令,该命令会加载 ARM64 架构的默认配置。如果需要定制内核功能,如添加特定的驱动支持、启用或禁用某些内核特性,可以执行 “make ARCH=arm64 menuconfig” 命令,进入图形化配置界面。在这个界面中,可以像在菜单中选择菜品一样,根据项目需求勾选或取消相应的选项。如果要添加对 USB 设备的驱动支持,在 “Device Drivers” 选项中找到 “USB support” 并勾选;如果要禁用不必要的调试功能以减小内核体积,在 “Kernel hacking” 选项中取消相关调试选项的勾选。

完成配置后,就可以开始编译内核了。执行 “make -jN” 命令,其中 N 表示并行编译的线程数,一般根据计算机的 CPU 核心数来设置,例如 “make -j8” 表示使用 8 个线程并行编译,这样可以大大缩短编译时间。编译过程中,系统会输出详细的编译信息,显示各个模块的编译进度和结果。当编译完成后,在 arch/arm64/boot 目录下会生成 Image 文件,这就是编译好的 ARM64 内核镜像,它就像一个精心打造的 “武器”,等待着在 ARM64 架构的设备上发挥作用。

三、ARM64 在 Linux 内核中的内存管理

3.png

(一)内存布局探秘

在 ARM64 架构下,Linux 内核的内存布局犹如一幅精心绘制的蓝图,严谨而有序。ARM64 架构的物理地址拥有 48 位,理论上最大寻址空间可达 256TB ,虚拟地址同样最大支持 48 位寻址。Linux 内核巧妙地将这庞大的地址空间划分为内核空间和用户空间。

用户空间的寻址范围是从 0x0000_0000_0000_0000 至 0x0000_ffff_ffff_ffff,这里是用户进程的活动天地。各类应用程序,如手机上的游戏、办公软件等,在运行时所占用的内存都处于用户空间。当我们在手机上打开一款游戏时,游戏的代码、数据以及运行过程中产生的临时变量等,都存储在用户空间的内存中。

内核空间则从 0xffff_0000_0000_0000 延伸至 0xffff_ffff_ffff_ffff,它是操作系统内核的专属领域。内核负责管理系统的各种资源,如 CPU、内存、设备驱动等,这些关键的操作都在内核空间中进行。当设备驱动程序与硬件设备进行交互时,如网卡驱动接收网络数据包,这个过程就发生在内核空间。内核空间的稳定性和安全性至关重要,它为整个系统的正常运行提供了坚实的保障。

(二)页表管理机制

ARM64 的页表结构是实现内存管理的关键所在,它就像一个精密的导航系统,指引着虚拟地址与物理地址之间的转换。ARM64 支持最多 4 级页表,以 48 位地址总线位宽为例,虚拟地址被划分为不同的部分,用于在各级页表中查找对应的物理地址。

当虚拟地址的最高位 bit [63] 为 1 时,该地址用于内核空间,页表的基地址寄存器使用 TTBR1_EL1;若 bit [63] 等于 0,则虚拟地址属于用户空间,页表基地址寄存器为 TTBR0。以 4KB 大小页面、48 位地址宽度、4 级映射为例,L0 页表中有 512 个表项,以虚拟地址的 bit [47:39] 作为索引值在 L0 页表中查找相应的表项,每个表项包含下一级页表(L1 页表,即 PUD)的基地址。接着,在 PUD 页表中,以虚拟地址的 bit [38:30] 为索引值查找,每个表项又含有下一级页表(L2 页表,即 PMD)的基地址。在 PMD 页表中,以虚拟地址的 bit [29:21] 为索引值查找,得到下一级页表(L3 页表,即 PTE)的基地址。最后,在 PTE 页表中,以虚拟地址的 bit [20:12] 为索引值查找,每个 PTE 表项中含有最终的物理地址的 bit [47:12],再和虚拟地址中 bit [11:0] 合并,从而完成地址翻译过程。

这种页表管理方式,使得 ARM64 能够高效地管理内存,实现虚拟地址到物理地址的准确转换,同时也为内存的保护和隔离提供了支持。不同进程拥有各自独立的页表,彼此的地址空间相互隔离,提高了系统的安全性和稳定性。

4.jpg

(三)内存分配与回收策略

Linux 内核针对 ARM64 提供了一系列完善的内存分配与回收策略,以确保系统内存的高效利用。在内存分配方面,常用的函数如 kmalloc,用于在内核空间分配内存。kmalloc 函数根据所需内存的大小,从内核的内存池中分配一块连续的内存块。当内核需要创建一个新的内核数据结构时,就可以使用 kmalloc 来分配内存。它的分配过程相对高效,能够快速满足内核的内存需求。

除了 kmalloc,还有 vmalloc 函数,它用于分配非连续的内存空间。在一些情况下,内核需要分配较大的内存块,但连续的内存空间可能不足,这时 vmalloc 就派上了用场。它通过在虚拟地址空间中建立映射,将分散的物理内存块映射为连续的虚拟地址空间,从而满足内核对于大内存块的需求。不过,由于需要进行额外的地址映射操作,vmalloc 的分配效率相对较低。

在内存回收方面,Linux 内核采用了多种机制。当系统内存不足时,会触发页面回收机制。其中,kswapd 内核线程负责周期性地回收内存。它会扫描系统中的内存页面,将那些长时间未被访问的页面回收,释放内存供其他进程使用。当系统中某个进程占用了大量内存,而其他进程又急需内存时,kswapd 线程就会被唤醒,开始回收内存。

直接页面回收机制也会在内存分配时发挥作用。当调用页面分配接口函数 alloc_pages () 分配物理页面时,如果系统内存短缺,不能满足分配请求,内核会直接自陷到页面回收机制,尝试回收内存来解决当前的燃眉之急。这种直接回收机制是同步进行的,会阻塞调用者进程的执行,直到回收足够的内存或者确定无法满足分配需求。

这些内存分配与回收策略相互配合,使得 Linux 内核在 ARM64 架构上能够灵活、高效地管理内存,确保系统在不同负载情况下都能稳定运行。

 

此帖出自Linux开发论坛

最新回复

当年学内核,页表这块扣了很久arm和intel芯片手册   详情 回复 发表于 2025-1-26 13:33

回复
举报

7676

帖子

2

TA的资源

五彩晶圆(高级)

当年学内核,页表这块扣了很久arm和intel芯片手册

此帖出自Linux开发论坛
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表