LWN:避免对持久性内存的误写入!

ArcGIS标注(二分式、三分式、条件分类标注、上下标、牵引线、文字格式化…) ArcGIS中的各种标注方法、可能遇到的问题和细节。 阅读详情

关注了就能看到更多这么棒的文章哦~

Stray-write protection for persistent memory

By Jonathan Corbet
February 3, 2022
DeepL assisted translation
https://lwn.net/Articles/883352/

持久性内存(persistent memory)有很多优点,速度快、可以供 CPU 寻址(CPU-addressable)、可用数量大,当然还有持久性。但是,其实它也带来了更高的由于内核中其他 bug 错误而导致这里数据损坏的风险。Ira Weiny 的这组 patch set 就是希望能避免这种问题,它利用了英特尔的 "保护密钥监督器"(PKS, protection keys supervisor)功能,使内核更难以在无意中写入持久性内存。

The stray-write problem

通常,存储在机械硬盘或固态硬盘上的数据只有在 CPU 发出明确请求的情况下才能被覆盖写入,这类复杂的操作会需要好几个步骤才能完成。内核 bug 当然也可能会导致把错误的数据写入驱动器,或者正确的数据最终出现在了错误的地方。所以内核开发人员会竭力防止这种情况发生。另一方面,当内核的目标在做将一个进程移到一个新的 cgroup 或分配一块内存区域这类操作时,不太可能会意外地触发对存储设备的错误写入。确实总是会有 bug 的,但如果一个 bug 恰好完成了触发 I/O 操作的全部所有步骤,这种情况几乎是不可能发生的。

persistent memory 改变了这种情况。一个系统中可以配备几个 TB 字节数量的 persistent memory,其中任何位置都可能包含重要数据,而且所有这些地址也全部都可以由 CPU 直接寻址到。现在,要破坏这些内存的话,所需要的仅仅只是对一个错误指针进行一次写入操作了,这种错误的发生可能性就大多了。被破坏的数据可能会潜藏很多年而不被发现,例如,一些可怜的用户也许发现他们的加密货币钱包已经无法访问了。这种数据损坏似乎很有可能发生,值得努力去防止,无论人们对加密货币的看法是否正面。

要防止这种错误,一个明显方法就是设置针对 persistent memory 的保护措施,以防止内核写入。这些保护措施只有在内核实际需要写到持久性内存时才会被放开,而且只在操作的持续时间内允许改变。存储在页表中的那些常用权限 bit 可以完成这个任务,但要付出巨大性能代价,因为改变页表权限开销是很大的,对每一个持久性内存的写入都要承担这个开销的话,会使大部分的性能提升都消失了,而这些性能提升正是人们使用持久性内存的首要原因。

不过,还有一种方法,至少在英特尔 CPU 上是这样。内存保护键(memory protection keys)功能可以把一个四 bit 的键值跟每个页表条目相关联起来,每个线程都有一个 mask,用来设置当前针对每个键值的读写权限。例如,该掩码可能会要求所有标有键值 3 的页面都是可读的,但当前线程不可对其写入。改变掩码并不是一个特权操作,所以这个功能不是一个严格的安全功能,但它们可以提高恶意访问的门槛,防止意外的发生。同时,改变访问掩码的操作非常快速,可以一下子改变大量 page 的可访问权限,所以它是一个远比调整 page 权限更有效的可以用来提供这种保护的方式。

Protecting persistent memory with PKS

内存保护键值可以用在任何类型的内存上。例如有一个使用场景就是保护普通内存中的加密密钥。从 2016 年的 4.9 版本开始,Linux 就支持用户空间的内存保护密钥(memory protection keys for userspace)。但内存保护密钥也可以用在内核空间,每个页面都有一个特定的内核键值,内核的内存保护键值也被称为 PKS。不过 Linux 目前还没有利用这个功能。因此,Weiny 的 44 个 patch 的 patch set 的第一个目标就是在内核中增加对 PKS 的支持,这个任务涉及到许多小细节。

例如,PKS 的 access-control map 被存储在一个 MSR 寄存器(model-specific register)中,这使得改动操作会相对快速。不过,当一个线程被抢占时,CPU 并不会自动保存该 MSR 的值,所以内核必须自己处理这个细节。这涉及到对 pt_regs 结构体的一些细节改动,从而让它可以保存额外的信息而不破坏那些之前并不知道会加这些内容的代码。新增的 "auxiliary pt_regs "结构可以保存 PKS permission mask 掩码信息,以及其他一些将来肯定需要保存的信息。

还需要一种方法来分配内核中的 16 个可用键值。其中,0号键值,也就是应用于所有 page 的默认键值,必须保留 "允许所有访问" 的权限,因此还有 15 个键值可以用于其他用途。在目前的实现中,这些键是在代码中静态分配的。如果内核的密钥用完了,这种方法就必须改变,但目前还不清楚是否有那么多用户会真的全部用光 16 个。在出现这种情况之前去增加一个更复杂的密钥分配机制,似乎没有多大价值,所以静态分配的方法就占了上风。在这组 patch 中,键值 1 被保留给 kernel self tests,键值 2 用于保护 stray-write。

有了这个基础架构之后,后面的事情就很简单了,可以用新的键值来配置持久性内存 page,并将访问权限设置为拒绝写入。这就可以防止任何 stray-write 操作来破坏内存内容了,这是好事,但同时也会阻止合法的写操作,这就不太妙了。因此,最后一步是在内核需要对持久性内存 page 进行写入时改变权限。这在直接处理持久性内存的驱动代码中很容易实现。只要在在写之前和写之后加上正确的 API 调用就好。再提醒一下,对 permission mask 的改动只适用于当前线程,所以当这个操作正在进行时,内核的其他部分无法写入到持久性内存。

不过还有一个问题,就是内核更高层级的一些代码可能也需要对持久性内存进行写入。一个例子是文件系统中的 DAX 代码,它是用来直接向持久性内存读写数据、而不需要通过 page cache。试图在每一个可能写入持久性内存的位置的周围都添加相关的调用,这种做法通常注定会失败,所以需要另一种方法。

碰巧,内核代码已经被要求在访问任意的内存页之前都要进行特定调用。这些调用是以 kmap() 系列函数的形式,目前在大多数 64 位系统上并没有任何作用,但是在 32 位系统上都是需要调用的,因为这些系统上无法直接将所有的物理内存全部映射到内核的地址空间。Weiny 的 patch set 会让短期的调用(如 kmap_atomic()和 kmap_local_page())来检查相关内存是否受到持久性内存键值的保护。如果受到保护的话,权限就会被修改,从而允许在 map 生效期间对持久性内存进行写入。受保护的持久性内存不允许使用长期生效的映射(也就是用普通的 kmap() 来映射),所以对持久性内存进行写入的时间窗口会被保持得很小,并且只限于确实需要写入的线程。

这个 patch set 已经是第八次修订了,自从 2020 年中在这里介绍第二版本以来,它已经发生了很大的变化。一些核心开发人员已经仔细看过并提出了意见,所有大部分功能被重新设计过了。这个版本是否能通过 review 还有待观察,但应该是越来越接近完成了。目标似乎是非常正当的,CPU 提供了一个可以有效检测和预防事故的机制,内核应该要利用它。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

270218f66675bd0577f485875f5d7f18.png

基于STM32的家庭环境监测毕业设计(全部资料) 本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。 阅读详情

相关推荐

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 287

LWN:更加高效地保护内存不被kernel篡改!

关注了就能看到更多这么棒的文章哦~Memory protection keys for the kernelByJonathan CorbetJuly 21, 2020https://...

Linux News搬运工 1212

字符串相似度比较算法:Jaro–Winkler similarity的原理及实现

前言 在前面的文章中,笔者有对编辑距离以及Levenshtein距离进行详细的说明,其实levenshtein距离是编辑距离的其中一种定义,本文所说的Jaro距离是编辑距离的另外一种定义,它也是对两个字符串的相似度进行衡量,以得出两字符串的相似程度。下面我们一起来学习这个算法的原理以及实现吧。 标题算法定义 下面先说说Jaro distance(又称Jaro similarity),这是由Matt...

蓝天白云梦的csdn博客 1万+

LWN:针对二进制格式的一些好用工具!

关注了就能看到更多这么棒的文章哦~Some useful tools for binary formatsFebruary 28, 2023This article was contributed by Koen VervloesemFOSDEMAI assisted translationhttps://lwn.net/Articles/924133/Linux 用户经常使用文本文件;grep、...

Linux News搬运工 2406

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

LWN:内核开发者的更好的工具!

关注了就能看到更多这么棒的文章哦~Better tools for kernel developersByJonathan CorbetFebruary 6, 2020原文来自:htt...

Linux News搬运工 2448

一文速览:大模型语料构建与基础训练全流程实战指南

因为模型只有看到足够丰富、高质量的数据,才能真正学到“真本事”,展现出更强大的泛化能力,也就是能够在全新的场景和任务下,做出准确的推理和判断。我们日常做饭的时候,通常会先把买回来的菜仔细清洗干净,把坏掉的叶子、泥土、杂质等去除掉。同理,训练大模型的数据就像我们的食材,如果不干净,就会影响模型的学习效果,甚至训练出逻辑紊乱的模型。在大模型的世界里,有一句名言:“Garbage in, Garbage out”,翻译过来就是“垃圾输入,垃圾输出”,说白了,就是给模型喂的是什么数据,它学到的就是什么知识。

master_hunter的博客 1669

LWN:用户空间的影子堆栈!

关注了就能看到更多这么棒的文章哦~Shadow stacks for user spaceBy Jonathan CorbetFebruary 21, 2022DeepL assisted...

Linux News搬运工 2230

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 210

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

LWN:开源语音助手的希望!

关注了就能看到更多这么棒的文章哦~Hopes and promises for open-source voice assistantsMarch 21, 2023This article was contributed by Koen VervloesemDeepL assisted translationhttps://lwn.net/Articles/926484/2022 年底,Paulu...

Linux News搬运工 2296

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1250

LWN: 5.14 中的 memfd_secret()!

关注了就能看到更多这么棒的文章哦~memfd_secret() in 5.14By Jonathan CorbetAugust 6, 2021DeepL assisted translat...

Linux News搬运工 602

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【翻译】 瞬时数据的持久存储器

LWN 订阅者的好处订阅《LWN》的主要好处是帮助我们继续出版,除此之外,订阅者还可以立即访问网站的所有内容,并使用网站的一些额外功能。 请立即注册! 作者:乔纳森-科贝特2019年1月21日 可以说,持久性内存最显著的特点就是它的持久性:它可以在电源周期中保留其内容。 据说,这些持久内存阵列很快就会随处可见,它们的另一个重要方面是体积...

超级码力 3029

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LWN: 放开kcmp()!

关注了就能看到更多这么棒的文章哦~kcmp() breaks looseBy Jonathan CorbetFebruary 11, 2021DeepL assisted translat...

Linux News搬运工 838

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LWN:定义开源硬件!

关注了就能看到更多这么棒的文章哦~Defining open hardwareOctober 18, 2023This article was contributed by Koen VervloesemChatGPT translationhttps://lwn.net/Articles/945870/开源硬件(或称为开放硬件)是指以类似开源软件的方式开发的硬件。对于开源硬件有一个被广泛接受的定...

Linux News搬运工 2634

LWN:统一Linux 随机数设备!

关注了就能看到更多这么棒的文章哦~Uniting the Linux random-number devicesBy Jake EdgeFebruary 16, 2022DeepL ass...

Linux News搬运工 1143

LWN:多代LRU方案的未来!

当一个 page 被访问时,它们会从较老的一代 list 移动到较新的一代,当需要回收内存时,会先从最古老的一代来开始回收 page。每一代的 page 都会随着时间的推移而变得老化,当最老的一代中的 page 都被回收掉了的时候,就会创造出新的一代。自这项工作的第一次发布以来最大的变动是在 "tier" (层)的定义上,tier 这个词现在被用来细分各代 page,这反过来又可以帮助更好地决定哪些 page 需要回收(reclaim),特别是在那些需要使用大量 buffered I/O 的系统中。

GetnextWindow的专栏 459

WIndows内核学习笔记:分页机制——PAE分页模式

Chapter 4 Paging 4.1 分页模式和控制位 分页控制有关的寄存器 CR0 标志位:WP(bit 16)、PG(bit 31) CR4 标志位:PSE(bit 4)、PAE(bit 5)、PGE(bit 7)、PCIDE(bit 17)、SMEP(bit 20)、SMAP(bit 21)、PKE(bit 22)、CET(bit 23)、PKS(bit 24) IA32_EFER MSR 标志位:LEM(bit 8)、NXE(bit 11) EFLAGS 标志位:AC(

weixin_38526180的博客 4031

LWN:Linux图形栈简介,第二部分!

关注了就能看到更多这么棒的文章哦~The Linux graphics stack in a nutshell, part 2December 28, 2023This article was contributed by Thomas ZimmermannChatGPT translationhttps://lwn.net/Articles/955708/在屏幕上显示应用程序的图形化输出内容需要...

Linux News搬运工 791

LWN:用SCHED_EXT和IOCost改进性能!

关注了就能看到更多这么棒的文章哦~Improving performance with SCHED_EXT and IOCostBy Daroc AldenApril 1, 2024SCALEChatGLM translationhttps://lwn.net/Articles/966618/在今年的SCALE大会上,来自 Meta 的 Dan Schatzberg 和 Tejun Heo 先后连...

Linux News搬运工 979

LWN:推动 Lustre 文件系统进入上游!

作为一名 VFS 维护者,他不想成为那个做决定的人,但合并一个新的文件系统“会给整个社区带来负担”,因此这应该是一个共同的决定。客户端“每月有几百个补丁,服务器的补丁量是客户端的三到四倍”,这使得跟上内核的步伐变得更加困难。Layton 说:“小步前进是好的”,不过 Day 指出,如果没有内核中的服务器代码,测试 Lustre 会更困难。这会影响 ext4 的开发,但其他更改,例如重写 jbd2 日志层使其不再需要 buffer heads 的计划,也可能因为包含 Lustre 服务器而变得复杂,他说。

Linux News搬运工 1450

LWN:分层固定带宽服务调度器!

相反,如果没有可运行的任务,截止期限服务器就会放弃 CPU,使其可供任何可能正在争夺它的实时任务使用。当截止期限服务器运行时,它将以通常的方式调度该组内的任务,确保整个组获得分配给它的资源,即使系统中其他地方有更高优先级的实时任务试图运行。有一个 CBS 调度器,即截止期限调度器(deadline scheduler)(详情请参阅备受怀念的 Daniel Bristot de Oliveira 撰写的 这篇文章),但该调度器并非分层的,并且要求实时任务是专门为其编写的。(所需的 CPU 时间);

Linux News搬运工 1430

LWN:6.1内核开发数据(以及更多)!

关注了就能看到更多这么棒的文章哦~Development statistics for the 6.1 kernel (and beyond)By Jonathan CorbetDecember 12, 2022DeepL assisted translationhttps://lwn.net/Articles/915435/6.1 内核于 12 月 11 日发布;到这次发布时,已经有 13942...

Linux News搬运工 653

LWN:文件系统回写并行化!

在一些简单的测试中,当禁用 XFS 的大页时,他在内核回写线程饱和之前能达到大约每秒 800MB 的速度。现有单线程回写所遇到的一些性能问题,在去年峰会的一次会议上曾被提及,当时讨论了并行回写的想法。他认为,对于多线程回写的第一个版本,保持单个 inode 列表将是合理的。通过远程连接,Jan Kara 表示他听到的情况是,大多数人的兴趣在于低层并行,这将并行化单个 inode 的回写。在该层,不同类型的文件系统操作,例如 XFS 的块分配与纯覆盖写入,可以由独立的工作队列(workqueue)处理。

Linux News搬运工 1328
上一篇: LWN:针对BPF代码的内存分配器!
下一篇: LWN: 让 TCP packet size 大大增加!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值