Linux Mem -- 关于AArch64 MTE功能的疑问

目录

1.虚拟地址和物理地址映射完成后,才可以设置虚拟地址对应的memory tag ?

2.各种memory allocator中的address tag从哪来,怎么产生?

2.1 vmalloc allocator

2.2 slub分配器

2.3 用户可以指定IRG指令产生的address tag

3.kasan_unpoison  标记的内存地址需要16byte对齐,该对齐由谁保证?

4.被标记过的内存,释放时会执行哪些特定动作?


 

       前面几篇文章是在介绍为什么需要MTE功能、MTE功能逻辑和硬件实现。从这篇文件起,结合之前MTE逻辑和硬件实现,开始介绍MTE功能在软件中的实现。首先我要通过调查推理回答自己的几个问题。

1.虚拟地址和物理地址映射完成后,才可以设置虚拟地址对应的memory tag ?

         Documentation – Arm Developer 根据文章描述和文章中图的示意,memory tag 是与16 字节的物理内存空间是关联的,存放memory tag的tag storage空间大小取决于物理内存空间大小。而且通过调查发现:系统在设置por_mtu_tag_addr_base 寄存器时使用的物理地址

        结合如上推断例如指令 stg x0, [x0] 要设置x0[59 - 56]的address tag到[x0]对应的tag storage空间时,是在x0寄存器中的虚拟地址转换为物理地址后,再找到物理地址在tag storage中对应的位置,最后将address tag做为memory tag存放到该对应空间。

        按照如上逻辑:虚拟地址需要完成其和物理地址的映射后才可以设置或则读取其对应的memory tag

        从代码逻辑也可以推断此行为,如下代码逻辑。首先进行虚拟空间分配,在进行虚拟和物理地址空间之间的映射,只有在虚拟和物理地址空间成功建立映射后才会对该内存空间进行unpoison操作(即标记该部分空间已分配)。

void *vm_map_ram(struct page **pages, unsigned int count, int node)
{unsigned long size = (unsigned long)count << PAGE_SHIFT;unsigned long addr;void *mem;//获取虚拟地址空间if (likely(count <= VMAP_MAX_ALLOC)) {mem = vb_alloc(size, GFP_KERNEL);if (IS_ERR(mem))return NULL;addr = (unsigned long)mem;} else {struct vmap_area *va;va = alloc_vmap_area(size, PAGE_SIZE,VMALLOC_START, VMALLOC_END,node, GFP_KERNEL, VMAP_RAM,NULL);if (IS_ERR(va))return NULL;addr = va->va_start;mem = (void *)addr;}//建议虚拟空间和物理内存空间之间的映射if (vmap_pages_range(addr, addr + size, PAGE_KERNEL,pages, PAGE_SHIFT) < 0) {vm_unmap_ram(mem, count);return NULL;}/** Mark the pages as accessible, now that they are mapped.* With hardware tag-based KASAN, marking is skipped for* non-VM_ALLOC mappings, see __kasan_unpoison_vmalloc().*///MTE使能时,进行tag标记mem = kasan_unpoison_vmalloc(mem, size, KASAN_VMALLOC_PROT_NORMAL);return mem;
}
 

2.各种memory allocator中的address tag从哪来,怎么产生?

2.1 vmalloc allocator

        以vmalloc分配器为例,从 __kasan_unpoison_vmalloc 函数可以获知 address tag来自于kasan_random_tag函数,通过IRG指令产生。

2.2 slub分配器

        从slab分配器可知,address tag同样来自kasan_random_tag,由IRG指令产生。

2.3 用户可以指定IRG指令产生的address tag

        如前文《Linux Mem -- MTE in AArch64 Linux-CSDN博客》介绍用户进程可以通过prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)系统函数指定特定的tag值。其内核层相关代码如下:

static void mte_update_gcr_excl(struct task_struct *task)
{/** SYS_GCR_EL1 will be set to current->thread.mte_ctrl value by* mte_set_user_gcr() in kernel_exit, but only if KASAN is enabled.*/if (kasan_hw_tags_enabled())return;// thread.mte_ctrl中的tag字段来自于用户程序设定,即prctl(PR_SET_TAGGED_ADDR_CTRL)参数设定write_sysreg_s(((task->thread.mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) &SYS_GCR_EL1_EXCL_MASK) | SYS_GCR_EL1_RRND,SYS_GCR_EL1);
}

        Tag相关寄存器说明:

GCR_EL1 : tag control register , 用于控制IRG(随机tag生成指令)生成tag值。
SYS_GCR_EL1_RRND : GCR_EL1.bit16  =  1 表示使用指定tag值,即IRG生成的tag为特定值

3.kasan_unpoison  标记的内存地址需要16byte对齐,该对齐由谁保证?

        如上是slub分配器分配内存的函数片段。MTE使能时,arch_slab_minalign()函数获取到的slub内存分配器最小对齐要求为MTE_GRANULE_SIZE(16字节,MTE对齐粒度)。因为系统内存分配器设置的对齐粒度最小为MTE_GRANULE_SIZE,所以获取到的内存空间起始地址也为MTE_GRANULE_SIZE对齐,故kasan_unpoison函数执行时判读入参object可以满足MTE_GRANULE_SIZE对齐要求。

4.被标记过的内存,释放时会执行哪些特定动作?

        如上是slub分配器的free函数调用片段。此处只关注MTE功能的影响,上slub分配器的kfree函数,最终会调用到kasan_slab_free -->poison_slab_object函数。Poision_slab_object函数只会对释放内存正确性和可访问性进行判断,如果正确、可访问则将该内存区域标记为KASAN_SLAB_FREE(0xFE)便于后续该内存的再分配。否则调用kasan_report_invalid_free函数,上报kasan检测异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-leetcode-颜色分类

75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…

【江科大STM32】TIM输出比较(学习笔记)

本章图片文字内容也为重要知识&#xff0c;请马住&#xff01; 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

飞算 JavaAI 如何让微服务开发快人一步?

在当今竞争激烈的软件开发领域&#xff0c;微服务架构因其灵活性和可扩展性备受青睐。然而&#xff0c;微服务开发过程复杂&#xff0c;从需求分析到最终代码实现&#xff0c;每个环节都需要耗费大量时间和精力。飞算 JavaAI 的出现&#xff0c;犹如一道曙光&#xff0c;为开发…

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网&#xff1a;www.ic-icois.org 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-长春 简介 2025年光电科学与智能传感国际学术会议&#xff08;ICOIS 2025&#xff09;将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务&#xff0c;广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本&#xff0c;以其高效性和准确性在实际应用中表现出色。然而&#xff0c;随着应用场景的复杂化&#xff0c;传统的卷积神经网络在处…

跟我学C++中级篇——定时器的设计

一、定时器 谈到定时器&#xff0c;理论上讲是各种语言和各种设计都无法避开的一个技术点。对于定时器来说&#xff0c;表面上就是一种时间间隔的处理约定&#xff0c;但对程序来说&#xff0c;可能就是设计层面、接口层面和库或框架以及系统应用的一个大集合。不同的系统&…

智能机器人加速进化:AI大模型与传感器的双重buff加成

Deepseek不仅可以在手机里为你解答现在的困惑、占卜未来的可能&#xff0c;也将成为你的贴心生活帮手&#xff01; 2月21日&#xff0c;追觅科技旗下Dreamehome APP正式接入DeepSeek-R1大模型&#xff0c;2月24日发布的追觅S50系列扫地机器人也成为市面上首批搭载DeepSeek-R1的…

PostgreSQL10 逻辑复制实战:构建高可用数据同步架构!

PostgreSQL10 逻辑复制实战&#xff1a;打造高可用数据同步架构&#xff01; 概述 PostgreSQL 10 引入了逻辑复制&#xff08;Logical Replication&#xff09;&#xff0c;为数据库高可用和数据同步提供了更灵活的选择。PostgreSQL 复制机制主要分为物理复制和逻辑复制两种&…

LVS+Keepalived高可用群集配置案例

以下是一个 LVSKeepalived 高可用群集配置案例&#xff1a; 1、环境准备 LVS 主调度器&#xff08;lvs1&#xff09;&#xff1a;IP 地址为 192.168.8.101&#xff0c;心跳 IP 为 192.168.4.101LVS 备调度器&#xff08;lvs2&#xff09;&#xff1a;IP 地址为 192.168.8.102…

原生家庭独立的艺术:找到自我与家庭的平衡点

原生家庭独立的艺术&#xff1a;找到自我与家庭的平衡点 &#x1f331; 引言 &#x1f308; 小林刚刚和父母结束了一次激烈的电话对峙。父母坚持认为他应该回到家乡工作&#xff0c;“这样我们也能照顾你”&#xff0c;而他则努力解释自己在大城市的职业规划。挂掉电话后&…

Java进阶——注解一文全懂

Java注解&#xff08;Annotation&#xff09;是一种强大的元数据机制&#xff0c;为代码提供了附加信息&#xff0c;能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念&#xff0c;包括其本质、作用以及核心分类&#xf…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称&#xff0c;例如 pip install requests 可以安装…

学习threejs,使用ShaderMaterial自定义着色器材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ShaderMaterial1.1.1…

从暴力破解到时空最优:LeetCode算法设计核心思维解密

一、算法优化金字塔模型&#xff08;时间复杂度/空间复杂度协同优化&#xff09; 1.1 复杂度分析的本质 大O记号的三层认知&#xff1a; ① 理论复杂度边界&#xff08;理想模型&#xff09; ② 硬件架构影响&#xff08;缓存命中率/分支预测&#xff09; ③ 语言特性损耗&am…