LWN:在另一个进程的地址空间内执行代码!

从零到一:Cadence AC仿真中的运放性能参数深度解析与实战避坑指南 本文深度解析Cadence AC仿真中运放性能参数的精确测量方法,包括开环增益、带宽和相位裕度等关键指标。通过实战案例分享常见设置错误的避坑技巧,帮助工程师提升设计成功率和仿真效率,特别针对全差分运放和工艺角分析提供专业指导。 阅读详情

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

Running code within another process's address space

By Jonathan Corbet
April 16, 2021
DeepL assisted translation
https://lwn.net/Articles/852662/

描述一个进程的时候,总会提到它的关键资源之一:地址空间(address space),这是一组映射关系用来决定任意一段内存地址(memory address)在该进程中是如何使用的。通常来说地址空间对它所属的进程来说是私有的,但在有些情况下,一个进程需要对另一个进程的内存区域进行修改,比如交互式的 debugger 调试器这种情况。ptrace()系统调用使得这种行为变得可行了,但还是很慢,有时候不那么容易使用,所以长期以来人们一直在寻找其他更好的方案。Andrei Vagin 最近提出的 process_vm_exec() 供大家 review,就是希望作为一种可能的解决方案。

事实上,对于某些场景来说已经有了很好的替代 ptrace()的方案。在 2011 年,3.2 版本内核中合入了一个名为 cross-memory attach system calls 的方案,增加的系统调用名为 process_vm_readv()和 process_vm_writev()。正如它们的名字所示,它们允许一个进程从另一个进程的 memory 中进行读取和写入。这些系统调用满足了许多场景下的需求,但有时候需要对另一个进程的地址空间进行更多的访问,这时就显得不够用了。看起来除了在目标进程地址空间内运行代码之外,没有其他选择。

Vagin 的 patch set 给出了几个例子,来说明这种访问会很有用。User-mode kernel(用户模式 Linux kernel)中,比如User-mode Linux 和 gVisor,必须能够拦截由沙盒中的进程发出的系统调用,并可能需要在该进程的地址空间内运行这段代码。Checkpoint/Restore in User space(用户空间中快照以及恢复)项目需要能够深入到一个进程中来提取 checkpoint 所需的所有信息。目前这两种情况都是用 ptrace() 来处理的,但是我们希望有更好的、更快的替代品。

Vagin 提出的替代方案是一个新的系统调用:

int process_vm_exec(pid_t pid, struct sigcontext uctx, unsigned long flags,
      siginfo_t siginfo, sigset_t *sigmask, size_t sizemask);

调用成功的话将导致调用进程的地址空间变成 pid 指定的这个进程的地址空间。Patch 的说明邮件中指出,使用 pidfd 可能更好,但这将会使得这个系统调用与 process_vm_readv()和 process_vm_writev()不再一致了。在从新的地址空间恢复代码执行之前,uctx 中的值被用来加载处理器的寄存器(包括当前指令的指针)。这个步骤非常重要,因为在新的地址空间如果使用之前的指令指针很可能会出问题。

如果 flags 为 0,process_vm_exec()将改变地址空间,然后按照 uctx 的指示恢复执行,持续到进程进行系统调用或收到 signal 为止。这两种情况都会恢复到旧的地址空间,process_vm_exec()将终止执行并返回给调用者。siginfo 结构描述了打断另一个地址空间执行的事件是什么,如果是一个系统调用 e 的话,siginfo 会被设置成好像收到了 SIGSYS 信号一样。

相反,如果 flags 里有设置 PROCESS_VM_EXEC_SYSCALL,那么这个调用的目的是在目标进程的地址空间中调用一个系统调用。在这种情况下,uctx 应该在合适的寄存器中配置好系统调用号及其参数,就像发生过真正的系统调用一样。在系统调用的过程中,地址空间将被切换,然后在返回给调用者之前被恢复。

这组 patch 是作为一个原型来发布的,目的是希望得到大家对这种 API 反馈意见。Jann Horn 很快就回应说,这个新提出的系统调用似乎并不适合所述的应用场景,它对一个应用场景来说做了太多工作,对另一个用例来说又还不够。对于在不同的地址空间内运行代码的情况(如 User-mode Linux),他建议,不需要创建一个全新的进程,可能更好的做法是有一个系统调用来允许单独创建出新的地址空间。不过,对于 checkpoint/restore 的情况,可能仍然需要访问进程中除了地址空间之外的资源,尽管他没有明确指出这些资源可能是什么。Vagin 回应说,一个相对通用的系统调用似乎比创建多个分门别类的的系统调用要更好,哪怕这个通用系统调用并不完全适合所有应用场景。

不过,Florian Weimer 确实想到了另一种资源,会对 GNU C 库很有好处。Linux 实现 setuid()的方式和 POSIX 的要求是有区别的。Linux 只会改变当前调用线程的凭证信息(credential),而 POSIX 规定应该要改变这个进程中所有线程的凭证信息。目前,glibc 是通过向所有线程发送信号从而在 Linux 上按 POSIX 语义实现,这样它们就可以一起调用 setuid(),这种方案不是很理想。如果能在每个线程的上下文中调用 setuid(),而不用实际打断线程,那就最好了。他说,这样的功能对于实现 memory barrier 也很有用。

一方面希望创造一个在某些情况下有用的功能,另一方面又试图解决更大、更复杂的问题,这两种需求之间显然存在一些矛盾。在这种情况下,开发者必须谨慎选择他们后续的道路。如果试图做得太多,那么会非常有效地阻止其进入 mainline kernel,反而一点帮助也没有了。目前看来 process_vm_exec() 今后前景尚不清楚。它可能最终会被接受,但在这之前可能需要进行巨大的改变。

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

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

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

硬件学习笔记(器件篇)—— 磁珠与磁环 因为有这些差别,所有经常会让人们觉得他们并不是一类器件,但实际上他们的原理是一样的。我们使用磁珠是为了利用损耗消耗高频能量,所以如果我们理解了磁珠是如何消耗高频能量的,我们就能理解磁珠的工作原理。 阅读详情

相关推荐

claude使用教程

提供了三种模型:claude,codex, gemini,三种模型都共用同一个apikey, 有开发需求使用claude效果较好,知识问答等场景gemini效果会更好些,本文只提供了claude的安装方式,剩下两种按需按照以下参考链接安装下即可,安装有问题参考文档:https://www.aicodemirror.com/dashboard/official-installation/macos-linux (不需要挂梯子,自己手机号注册就好)

lichao19871216的博客 3471

process_vm_readv/writev进程间数据传输

process_vm_readv/writev进程间数据传输 process_vm_readv readv,writev,preadv,pwritev,preadv2,pwrite2 函数声明 #include <sys/uio.h> ssize_t process_vm_readv(pid_t pid, const struct iovec *local_iov, unsigned long l

qq_42045349的博客 7069

台达伺服B3驱动器参数的设定和CN1的接法

3. B2的电子齿轮比是直接设定P1-44(分子)和P1-45(分母)就就可以的,但是B3的有个隐藏的细节,就是P1-44的默认值77216不用去更改,这是官方客服说的,需要改的是P1-45这个参数,比如说,我使用的丝杆螺距是5mm的,那么就是以5000脉冲走完5mm为一圈,则就把P1-45设定为5000即可;我的是三菱FX3S系列的PLC,是NPN型的,输出点是24V-作为信号的,所以接41、37,具体可参考B3的。,跟着客服的讲解操作才解决的,以下就是解决方法,希望能够帮到需要的各位。

qq_38681017的博客 1万+

PHP查看堆栈信息,php-stacktrace: PHP进程外查看函数调用堆栈

生产环境多多少少会遇到CPU占用很高或者卡住的PHP进程,这时怎样才能知道这个进程在干啥呢?一个方法是strace跟踪系统调用和参数,这样能大概知道PHP进程在干啥。要看到具体的PHP函数就需要用PHP扩展(xdebug、xhprof)或者用GDB调试,高级点还可以用DTrace。上周发现了ruby-stacktrace,它直接读取ruby进程的内存来获取堆栈信息,不用GDB和扩展,所以性能很好,...

weixin_34641420的博客 745

某二级支行网络的设计与实现——配置脚本(1)

【代码】某二级支行网络的设计与实现——配置脚本(1)

u010311846的博客 577

WorkBuddy结合DeepSeek与Skill:文献检索自动化与Token成本控制实战

Agent工具与大模型API的结合正重塑知识工作者的日常流程。在实际工程中,调用大模型处理批量任务常面临Token消耗过快、成本不可控的痛点,而国产大模型DeepSeek以极低的API定价和兼容OpenAI接口的特性,为规模化文本处理提供了“Token自由”的可能。同时,可复用的Skill机制能够将特定领域的工作流固化为标准化步骤,让Agent自动执行检索式生成、文献筛选与摘要归纳等复杂操作。本文从这一技术背景出发,以科研文献检索为应用场景,演示如何利用WorkBuddy、DeepSeek API与自建文献

weixin_29061509的博客 485

linux内核read函数,Linux VFS中readv,writev系统调用实现原理

readv函数对应系统调用在内核里面的入口函数为sys_readv用户空间writev函数对应系统调用在内核里面的入口函数为sys_writev[root@syslab ~]# grep readv /usr/include/asm/unistd_64.h#define __NR_readv19__SYSCALL(__NR_readv, sys_readv)#define __NR_preadv2...

weixin_34672875的博客 714

告别手动画图!用SUMO的netedit快速搭建高速公路交织区路网(附完整XML文件)

本文详细介绍了如何使用SUMO的netedit工具高效构建高速公路交织区路网,避免手动绘图的低效与错误。通过实战案例和XML文件示例,帮助交通工程专业学生快速掌握复杂道路结构建模技巧,特别解析了spreadType参数设置和速度单位换算等关键操作。

weixin_29085865的博客 259

Python 学习 --->Python调试:ipdb、pdbpp、rpdb 、pudb、web-pdb、ripdb、Py-Spy

Python调试:ipdb、pdbpp、rpdb 、pudb、web-pdb、ripdb、Py-Spy

freeking101的博客 4894

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 499

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

process_vm_writev系统调用及示例

和是Linux系统提供的两个系统调用,用于在不同进程之间直接传输数据。它们允许一个进程直接读取或写入另一个进程的内存空间,而无需通过传统的管道、套接字等IPC机制。这种直接内存访问方式提供了更高的性能,特别适用于调试工具、进程监控、内存分析等场景。// 内存区域的起始地址// 内存区域的长度(字节数)

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 971

视觉媒体通信作业记录(六)端到端的视频传输系统

将采集、编码、传输、显示各模块连接起来,形成一个端到端的视频通信系统,开发一个特色模块,将其加入系统;

weixin_45774698的博客 1967

LWN:针对可执行代码的另一个内存分配方案!

关注了就能看到更多这么棒的文章哦~Yet another memory allocator for executable codeBy Jonathan CorbetJune 8, 2023DeepL assisted translationhttps://lwn.net/Articles/933867/内核的代码越来越动态了,也就是随时会出现新的 text 段代码。目前,为新内核代码分配内存的责...

Linux News搬运工 1110

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

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

LWN: 通用的地址空间隔离

Generalizing address-space isolationByJonathan CorbetNovember 5, 2019OSS EU原文来自:http...

Linux News搬运工 672

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LWN:在GNU C库实现内存封印!

关注了就能看到更多这么棒的文章哦~Memory sealing for the GNU C LibraryBy Jonathan CorbetJune 12, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/978010/mseal()系统调用允许进程阻止其地址空间未来进行任何更改(因此被称为“密封 sealing”);它借鉴了...

Linux News搬运工 1736

WINCC7.3破解文件

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

LWN:呼吁再次考虑地址空间隔离!

关注了就能看到更多这么棒的文章哦~A call to reconsider address-space isolationBy Jonathan CorbetSeptember 29, 2022LPCDeepL assisted translationhttps://lwn.net/Articles/909469/内核运行时可以访问到地址空间中的全部内容,通常就包括了所有的物理内存,尽管其实这个地...

Linux News搬运工 417

LWN:madvise()只能对本进程做,没想过控制别的进程吗?

点击上方蓝色字关注我们~New system calls for memory managementByJonathan CorbetMay 24, 2019社区提出一...

Linux News搬运工 916

LWN:通用的地址空间隔离方案!

关注了就能看到更多这么棒的文章哦~Generalized address-space isolationBy Jonathan CorbetMarch 3, 2022DeepL assisted translationhttps://lwn.net/Articles/886494/Meltdown 和 Spectre 漏洞的披露,让人们看到了太广泛地地址空间共享会带来的风...

Linux News搬运工 689

LWN:地址空间隔离的两个patch!(重发)

关注了就能看到更多这么棒的文章哦~Two address-space-isolation patches get closerBy Jonathan CorbetOctober 27, ...

Linux News搬运工 288

LWN:用DAMON来优化memory-management!

关注了就能看到更多这么棒的文章哦~Memory-management optimization with DAMONByJonathan CorbetFebruary 20, 2020...

Linux News搬运工 1028

LWN:配置透明巨页的一个新方法!

他提议的接口将是一个“结构体配置函数(struct-configured function)”,它接受一个描述所用应用程序编程接口(API)版本的新结构体,以及几种可能的操作之一。一个可选的 pidfd 可以将操作应用于一个单独的进程,并且一组布尔标志将配置该调用如何响应错误或请求范围中的空洞。尽管这些补丁集尚未公布,但邮件列表上的讨论清楚表明,设置进程特定 THP 策略的用例是存在的。Arif 认为Stoakes 的提议没有必要,并且会“引入大量代码来解决可以用非常非常简单的方式完成的事情”。

Linux News搬运工 2051

LWN:PID的复仇!以及process_madvise(), pidfd capabilities

关注了就能看到更多这么棒的文章哦~process_madvise(), pidfd capabilities, and the revenge of the PIDsByJonath...

Linux News搬运工 2116

LWN:让 CPU 调度器考虑 Cache!

最后一级缓存(LLC)(Last-Level Cache),离 CPU 最远,因此也是最慢的,但它往往是最大的,并且被最大数量的 CPU 共享。检测没有这种直接关系的任务中的缓存共享可能是困难的,如果它可能的话。如果感兴趣的线程一直在其他地方运行,它将被移动到所选的 CPU,在那里它将更接近其他线程,并且如果运气好,可以从与它们共享缓存空间中获益。因此,添加另一个启发式方法(“将进程的线程集中在单个缓存域中”)的补丁系列肯定会带来更多令人惊讶的交互,这些交互可能需要用更多的启发式方法来解决。

Linux News搬运工 1345

假设一个进程的页表如下所示_LWN 717293:五级页表

原文:Five-level page tables原创:By corbet @ Mar. 15, 2017 翻译:By unicornx of TinyLab.org校对:By simowceNear the beginning of 2005, the merging of the four-level page tables patches for 2.6.10 was an ...

weixin_39603265的博客 380

LWN:看一下动态链接过程!

关注了就能看到更多这么棒的文章哦~A look at dynamic linkingBy Daroc AldenFebruary 13, 2024Gemini translationhttps://lwn.net/Articles/961117/动态链接程序是现代 Linux 系统的关键组件,负责设置大多数进程的地址空间。虽然随着最初推动动态链接的因素变得越来越没有那么重要了,使得静态链接二进制文...

Linux News搬运工 248
上一篇: LWN: Fedora将缺省提供debuginfod!
下一篇: LWN:为了写论文而提交的错误commit
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值