LWN:mseal() 即将确定!

mseal()系统调用最初旨在保护虚拟地址空间免受恶意修改,经过争议和改进后,它将与OpenBSD的mimmutable()功能趋近,可能在未来Linux中被广泛采用,尤其在Chrome浏览器和GCC库的支持下。

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

mseal() gets closer

By Jonathan Corbet
January 19, 2024
Gemini translation
https://lwn.net/Articles/958438/

2023 年 10 月首次提出的 mseal() 系统调用引发了一些争议。自那以后,它一直静悄悄地开发演进,并且似乎已经达到了相关评论者愿意接受的程度。预计会在未来的开发周期中合并 mseal(),届时它将看起来与当初的版本大不相同。

回顾一下,发明 mseal() 是为了防止对虚拟地址空间的部分区域进行更改。它的目的是阻止那些通过改变只读的内存或其他方式干扰进程内存布局的攻击方式。例如,能够改变内存权限或映射(mapping)的攻击者可能能够规避控制流完整性保护(control-flow-integrity protection)。通过使用 mseal(),进程可以防止这种类型的更改。预期会最开始使用的场景是 Chrome 浏览器,它将用此来进一步强化程序以抵御基于内存的攻击。

在 10 月份提出时,mseal() 具有以下原型:

int mseal(void /addr, size_t len, unsigned int types, unsigned int flags);

types 参数允许调用者微调 mseal() 所禁用的改动,这是更有争议的功能之一,许多人质疑除了彻底禁止更改之外难道还有什么别的有用处的选项么。即便如此,版本 2(在第一版本发布后不久发布)和 版本 3 (在 12 月中旬发布)还是保留了该参数。作为对后面发布的回复,Linus Torvalds 重申了他对 API 该方面的厌恶,并问道:“我想知道为什么我们不能只按 BSD 的 immutable 的方式,又为什么要这种多级别的密封机制”。

Chrome 开发者 Stephen Röttger 回答说,在其他地方可以密封区域的特定位置,Chrome 需要允许 madvise(MADV_DONTNEED) 在某些地方可用,而该操作在密封内存中是被禁止的,因为它本质上会更改映射;它会把底层内存内容废弃掉,如果是匿名页面,在再次访问的时候它将被重新填充为 0。它对于(例如)丢弃不再需要的缓存数据的场景很有用,但也有可能带来意外麻烦。在 Chrome 实例中,type 参数用于在可写的匿名内存(即使已密封,进程也有能力直接写入的内存)上允许 MADV_DONTNEED。Torvalds 答复说,正确解决方法是 mseal() 只允许在所说的映射可写时使用 MADV_DONTNEED。事实上,他认为即使没有密封,这种限制也可能是有意义的。

通过上述讨论,版本4 于 1 月初发布,实施了关于 MADV_DONTNEED 的新语义。此版本也最终放弃了 types 参数;内存现在要么处于密封状态,要么就是未密封状态。Torvalds 对这些 改动感到满意;他声称 "我觉得所有这些都很合理了",并且退出了讨论。第五个版本 仅带来一些小型改动,表明主要的疑虑已得到解决;Kees Cook 指出 "此代码看起来可以合入了"。自那以后 版本 6 已经发布,附有一些其它的小型改动。

如果 mseal() 以这种形式合并的话,其原型如下:

int mseal(void /addr, size_t len, unsigned long flags);

addr 和 len 指定要密封的内存范围;flags 参数当前未使用,且必须为零。它仅可用于 64 位系统。该文档补丁 包含有关其使用情况的更多信息。

所以这个故事可能已经到头了,但仍有一方面有点被忽视了。OpenBSD 有一个类似的系统调用 m[[https://lwn.net/Articles/915640/]mmmimmimmutable(),已于 2022 年发布。它也能阻止对地址空间特定范围进行修改。在交流过程中,有人多次提出简单地为 Linux 实现 mimmutable() 。mseal() 的开发人员 Jeff Xu 一直对这一建议置之不理,以至于 mimmutable() 的创建者 Theo de Raadt, 建议 ""或许此提案应该使用 chromesyscall() 作为名称""。这似乎意味着为 Linux 实现 mimmutable() 这个建议从未被认真考虑过。

然而,随着 mseal() 变得更加简单,将其与 mimmutable() 区分开的功能也不再存在了,以至于现在二者的作用几乎相同。唯一区别在于 mimmutable() 允许降级权限(即使内存已经过密封,也可以将其设置为只读),而 mseal() 不允许;不过,OpenBSD 可能还会去除 这项功能,进一步减少了两个系统调用之间的语义区别。考虑到这一点,或许再问一次这个问题有它的价值,即 Linux 为什么不采用现有接口并添加 mimmutable()。这并不是一个有直接答案的问题。

可能的答案确实存在。来自 长期的实践 的经验告诫我们, mseal() 采用 flags 参数是个好主意,即使尚不能明确说出可能的使用场景。也有可能是这个系统调用的用途一直非常专用且底层,以至于使用该调用的任何代码无论如何都需要针对特定系统进行设计,在这种情况下,使用相同名称的意义并不大。最后,如果认为有价值,可以在 C 库中为 mseal() 添加一个 mimmutable() 包装器,这几乎不需要花费什么精力。

当 mseal() 合并之后,它最初只会使 Chrome 浏览器(及其小部分用户)受益。但正如 mseal() 的附言信指出,Rottger 正在致力于为 GNU C 库添加支持,以便大多数程序能够自动运行大量的密封操作。该操作将极大地增加此新系统调用的使用,而且能在 C 库中使用它就可以提高对 API 正确性的信心。这似乎有望一锤定音。

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

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

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

017616f2c418c85563d924f7f05a9735.jpeg

内容概要:本文提出了一种基于角蜥蜴优化算法(Harris Hawks Optimization-inspired Lizard Search Algorithm, HLOA)优化BP神经网络的风电功率预测模型,旨在解决传统BP神经网络在风电功率预测中易陷入局部最优、收敛速度慢、预测精度不高等问题。通过HLOA算法对BP网络的初始权重和阈值进行全局优化,提升了模型的泛化能力与训练效率。研究在Matlab平台上完成算法实现,并采用真实风电场数据进行实验验证,结果表明,相较于标准BP及其他优化算法(如GA、PSO)优化的模型,HLOA-BP模型在均方根误差(RMSE)、平均绝对误差(MAE)等关键评价指标上表现更优,具有更强的预测稳定性和准确性。该方法为可再生能源领域的时间序列预测提供了有效的技术路径与实践参考。; 适合人群:具备机器学习、智能优化算法及电力系统基础知识的研究生、科研人员以及从事新能源预测、电力调度等相关工作的工程技术人员。; 使用场景及目标:①提升风电功率预测精度,支撑电网安全稳定运行与能源调度决策;②学习并掌握智能优化算法与神经网络融合建模的方法论;③开展基于Matlab的仿真实验、算法对比与性能评估;④拓展应用于光伏发电、负荷预测等其他非线性时间序列预测任务。; 阅读建议:建议结合提供的Matlab代码深入实践,重点理解HLOA算法的搜索机制及其对BP网络参数的优化过程,通过更换数据集、调整参数配置等方式进行消融实验与对比分析,全面掌握模型构建与调优技巧,进而将其迁移至实际工程项目中应用。
内容概要:本文系统阐述了基于多尺度集成极限学习机(ELM)的回归方法及其Matlab代码实现,旨在通过融合多尺度特征提取与集成学习策略,提升传统极限学习机在复杂非线性回归任务中的预测精度与模型鲁棒性。该方法充分发挥ELM训练高效、泛化能力强的优势,同时引入多尺度输入构造机制以捕获数据的多层次特征表示,并结合多个基学习器的集成架构有效缓解单一ELM对初始参数敏感、稳定性差等问题。文档不仅详述了算法的核心思想与技术流程,还提供了完整的Matlab实现代码,涵盖数据预处理、多尺度特征生成、ELM训练与集成输出等模块,适用于能源功率预测、环境数据分析等实际应用场景。; 适合人群:具备一定机器学习理论基础和Matlab编程能力的高校研究生、科研人员及工程技术人员,特别适合从事智能算法开发、新能源系统建模、时间序列预测等相关领域研究的专业人士。; 使用场景及目标:①应用于风电、光伏等可再生能源出力的高精度回归建模与短期预测;②解决对训练效率要求高且具有强非线性的系统建模问题;③帮助研究人员深入理解多尺度特征融合与集成学习框架在极限学习机中的具体设计与实现路径,推动其在实际项目中的迁移与优化应用。; 阅读建议:建议读者结合所提供的Matlab代码逐模块剖析其实现细节,重点理解多尺度输入的构建方式、基模型多样性保障机制以及集成策略的设计逻辑,并鼓励在自有数据集上进行实验验证与参数调优,以充分掌握该方法的适用条件与性能边界。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值