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.rhkb.cn/news/25950.html

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

相关文章

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…

vscode脚本 shell 调试

插件&#xff0c;按照图片

纯代码实战--用Deepseek+SQLite+Ollama搭建数据库助手

如何用Python调用本地模型实现DeepSeek提示词模板&#xff1a;一步步教你高效解决13种应用场景 从零到一&#xff1a;纯代码联合PyQt5、Ollama、Deepseek打造简易版智能聊天助手 用外接知识库武装大模型&#xff1a;基于Deepseek、Ollama、LangChain的RAG实战解析 纯代码实战–…

Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载

一、前言说明 在做这个功能的时候&#xff0c;着实费了点心思&#xff0c;好在之前做ffmpeg加密解密的时候&#xff0c;已经打通了极速加密保存文件&#xff0c;主要就是之前的类中新增了进度提示信号&#xff0c;比如当前已经处理到哪个position位置&#xff0c;发个信号出来…

《Qt动画编程实战:轻松实现头像旋转效果》

《Qt动画编程实战&#xff1a;轻松实现头像旋转效果》 Qt 提供了丰富的动画框架&#xff0c;可以轻松实现各种平滑的动画效果。其中&#xff0c;旋转动画是一种常见的 UI 交互方式&#xff0c;广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…

AIGC生图产品PM必须知道的Lora训练知识!

hihi&#xff0c;其实以前在方向AIGC生图技术原理和常见应用里面已经多次提到Lora的概念了&#xff0c;但是没有单独拿出来讲过&#xff0c;今天就耐心来一下&#xff01; &#x1f525; 一口气摸透AIGC文生图产品SD&#xff08;Stable Diffusion&#xff09;&#xff01; 一、…

Spring Boot 3.x 基于 Redis 实现邮箱验证码认证

文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…

QT day1

作业 代码 class Widget: public QWidget {QPushButton* button; //按钮Widget* other; //显示对面 public:Widget(){button new QPushButton("按钮",this); //控件 认this作父this->resize(300,300); //界面大小button->resize(100,10…

Go红队开发—语法补充

文章目录 错误控制使用自定义错误类型错误包装errors.Is 和 errors.Aspanic捕获、recover 、defer错误控制练习 接口结构体实现接口基本类型实现接口切片实现接口 接口练习Embed嵌入文件 之前有师傅问这个系列好像跟红队没啥关系&#xff0c;前几期确实没啥关系&#xff0c;因为…

linux--多进程开发(5)--进程间通信(IPC)、linux间通信的方式、管道

进程间通讯概念 每两个进程之间都是独立的资源分配单元&#xff0c;不同进程之间不能直接访问另一个进程的资源。 但不同的进程需要进行信息的交互和状态的传递等&#xff0c;因此需要进程间通信&#xff08;IPC,inter processes cimmunication) 进程通信的目的&#xff1a; …

Uniapp开发微信小程序插件的一些心得

一、uniapp 开发微信小程序框架搭建 1. 通过 vue-cli 创建 uni-ap // nodejs使用18以上的版本 nvm use 18.14.1 // 安装vue-cli npm install -g vue/cli4 // 选择默认模版 vue create -p dcloudio/uni-preset-vue plugindemo // 运行 uniapp2wxpack-cli npx uniapp2wxpack --…

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…

对比Grok3 普通账户与 30 美元 Super 账户:默认模式、Think 和 DeepSearch 次数限制以及如何升级

面对这个马斯克旗下的"最聪明"的人工智能&#xff0c;很多人都不知道他们的基本模式&#xff0c;本期将从几个方面开始说明&#xff1a; Grok3的背景与功能 账户类型及其详细背景 使用限制 使用限制对比表 如何充值使用 Super 账户 纯干货&#xff0c;带你了解…

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

牛客NC288803 和+和

​import java.util.Comparator;import java.util.PriorityQueue;import java.util.Scanner;​public class Main {public static void main(String[] args) {// 创建Scanner对象用于读取输入Scanner sc new Scanner(System.in);// 读取两个整数n和m&#xff0c;分别表示数组的…

【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备

在开发实时数据监控应用时&#xff0c;记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架&#xff0c;介绍如何实现一个实时记录接口请求延迟的功能&#xff0c;并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…

DeepSeek能画流程图吗?分享一种我正在使用的DeepSeek画流程图教程

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌‌‌​​‍‌​‌​‌‌​​‍‌​​​‌‌‌‌‍‌​‌‌​‌‌‌‍‌‌​​‌​‌​‍‌​​‌‌​‌‌‍‌​​​‌​‌​‍‌​‌‌‌​‌‌‍‌‌​​‌‌‌‌‍‌​‌‌‌​​​‍‌…

基于Electron的应用程序安全测试基础 — 提取和分析.asar文件的案例研究

目录&#xff1a; 4.4. 案例研究 4.4.2. 情况描述 4.4.3. 信息收集 4.4.3.2. 检查隐藏目录&#xff08;点目录&#xff09;的可能性 4.4.3.3. 使用 DB Browser for SQLite 打开 .db 文件 4.4.3.4. 寻找加密算法 4.4.3.5. 找到加密算法 4.4.3.6. 理解加密流程 4.4.3.7. 找到“Ke…

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra&#xff08;朴素版&#xff09;总结 前言 今天是算法营的第64天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&#xff01;今…

WPF中对滚动条进行平滑滚动

有时候我们在动态添加内容时&#xff0c;需要将滚动条滚动到指定内容处。 一般我们会调用ScrollViewer的ScrollToVerticalOffset&#xff08;垂直方向&#xff09;函数和ScrollToHorizontalOffset&#xff08;水平方向&#xff09;函数来控制滚动条滚动到指定位置。 正常滚动效…