ARM64 虚拟地址长度判别

ARM64 支持多种虚拟地址长度,在运行时可通过 vabits_actual 变量判别。 vabits_actual 由 5383cc6efed1 (“arm64: mm: Introduce vabits_actual”) 于 v5.4 引入(patchwork 链接 ),由 67e7fdfcc682 (“arm64: mm: introduce 52-bit userspace support”) 引入的 vabits_user 演进而来。 在 v5.10 中,该变量的赋值位于 arch/arm64/kernel/head.S 的 __create_page_tables: …

ARMv8.3 的 PAC 特性

名词释义: PAC: Pointer Authentication Code PA: Pointer Authentication SCTLR: System ConTroL Register 该特性为指针值提供【签名】和【校验】的能力。ARM64 硬件上提供 5 个秘钥,分别用于为三种地址生成 PAC: 代码地址:API{A,B}Key 数据地址:APD{A,B}Key 通用地址:APGAKey PAC 的值是关于以下三者的函数:1、指针本身;2、上下文相关值(也称 Modifier)1;3、秘钥。 生成后,PAC 会被附在指针值上(即“签在上面”),其所处的位置和长度与当前处理器:1)设置的虚拟地址长度以及;2) …

内核代码中的编译时检查

之前在工作中涉及对 2022 年 Linux Security Summit North America(LSS-NA)的调研,并向同事们介绍了其中一个演讲:Meaningful Bounds Checking in the Linux Kernel (演讲材料 )。在分享过程中,有这样一段内容: 1__FORTIFY_INLINE void *memcpy(void *dst, const void *src, size_t size) 2{ 3 size_t dst_size = __builtin_object_size(dst, 1); 4 size_t src_size = …

SLUB 的类三级缓存结构

前言 本文基于 6.1 版本的 Linux 内核代码,阐述笔者对 SLUB 分配器原理的个人理解。本文的分析忽略以下内容: 所有 debug 相关特性(如 KASAN) 所有安全增强特性(如 CONFIG_SLAB_FREELIST_HARDENED) SLUB per-cpu partial cache 特性(CONFIG_SLUB_CPU_PARTIAL=n) 换言之,本文只关注最底层最基础的 SLUB 运行逻辑——一种类三级缓存的结构。该想法是在上班通勤途中阅读此文 获得的启发,遂希望通过阅读代码和画图整理,将之梳理清楚。 概述 一级缓存:per-cpu SLAB cache 代表结构:struct …

用于内核测试的内核模块

背景 在调试内核时,最常用的方式就是添加打印。这个方法简单直接,但有个问题:若添加打印的函数会被频繁地调用执行,那这很可能使系统在启动或运行阶段触发海量的打印,反而将关键的信息淹没;或者由此导致系统运行卡顿甚至无法启动。 还有另一种常见的调试需求:我们需要在内核中模拟某种故障,并且是以我们所能掌控的时机和方式来触发。关于这点我们一般会想到内核故障注入,但其手段和所涉及的软件工具比较复杂,且其所能模拟的故障种类和故障位置一般是给定的,无法随意调整。 对于上述两个场景,我们其实可以用同一个方法解决:在内核中预埋一个“开关”,并在内核的用户态接口(如 proc 文件系统)上创建一个专门的接口来控制这个开关。对于第一个场景,我们可以将那些打 …