利用内存间接调用在Linux x86-64上进行系统调用插桩
作者深入探讨了在Linux x86-64环境下,如何利用指令编码特性(如Instruction Punning和Memory-Indirect Calls)来高效地插桩系统调用,以替代传统的ud2陷阱或zpoline方案。文章详细分析了不同长度指令(2字节、5字节、6字节)的内存寻址限制,解释了如何通过修改后续指令的字节来间接跳转到自定义的处理代码,从而减…
Humprog
作者深入探讨了在Linux x86-64环境下,如何利用指令编码特性(如Instruction Punning和Memory-Indirect Calls)来高效地插桩系统调用,以替代传统的ud2陷阱或zpoline方案。文章详细分析了不同长度指令(2字节、5字节、6字节)的内存寻址限制,解释了如何通过修改后续指令的字节来间接跳转到自定义的处理代码,从而减…
作者深入探讨了在Linux x86-64架构下,利用内存间接调用指令进行系统调用插桩的技术尝试。文章详细分析了现有方案如Liteinst、E9Patch和zpoline的优缺点,特别是它们如何解决指令长度限制问题。作者尝试探索x86分段机制和远调用指令,发现虽然理论可行,但在实际应用中面临地址空间限制和安全性挑战。最终结论是部分尝试未达预期,但提供了宝贵的…
作者认为“多语言编程”是个错误的隐喻,真正的目标应该是让开发者成为“单语言者”。核心观点是:编程环境本身应该具备多语言能力,屏蔽底层实现语言的差异,让程序员只需掌握一种语言即可使用各种库。文章回顾了GraalVM和Python CFFI等项目的尝试,指出当前技术仍面临语言间平等协作和资源管理的难题,并分享了作者在构建联邦式多租户底层支持方面的最新研究进展。
文章批评了编程语言和基础设施设计中主流的“正向抽象”和“存在主义”思维,即只关注如何从抽象实现具体并隐藏细节。作者提出应重视“逆向抽象”和“普遍主义”,即从具体实现反向推导抽象视图的能力,如调试器和ABI所体现的那样。他认为当前软件缺乏生物般的适应性,过于追求单一、完美的“晶体”结构,导致工具链封闭、碎片化和创新受阻。通过链接时优化(LTO)和自动配置(a…
作者回顾了在软件底物研讨会上的观点陈述,并提到Gilad Bracha对其进行了评论。作者计划近期发布后续文章,总结相关工作进展以回应评论中关于如何获取更多实际工作信息的疑问。
作者深入探讨了在Linux用户态进程中拦截和修改clone系统调用的底层技术难点。由于clone会创建新线程并替换栈空间,导致父进程的栈帧在新线程中失效,使得常规的C语言信号处理逻辑无法直接复用。作者提出了一种巧妙的解决方案:在调用clone前,预先将包含信号帧和函数帧内容的内存块复制到新的子进程栈空间中,并进行指针修正(fixup),从而让子线程能像父线…
文章对比了Unix和Smalltalk两大系统的起源与演进。作者认为,尽管Smalltalk曾设想消除操作系统,但Unix凭借“组合性”和“多孔边界”的设计哲学存活并主导了世界。有趣的是,Unix的文件抽象向Plan 9演进,以及调试反思机制的发展,正逐渐向Smalltalk的对象模型收敛。文章指出两者在底层抽象上殊途同归,未来Unix衍生系统可能融合两者…
作者尝试在 Rust 中基于 MMTk 实现一个可通过 LD_PRELOAD 劫持的 malloc 共享库。核心难点在于避免重入(reentrancy)问题:Rust 标准库或 MMTk 内部可能间接调用全局 malloc,导致死循环。作者详细分析了两种解决方案:一是构建完全自包含的共享库(静态链接第二份 libc),二是利用弱符号和链接脚本强制覆盖特定符…
一位英国高校研究员反思自己陷入学术体制的平庸与混乱,认为过度管理、行政琐事和缺乏激励的环境正在扼杀创造力。他计划转为兼职,减少教学行政负担,留出时间进行编程、写作等创造性工作,并探索众筹等新收入模式以维持独立性。文章坦诚分享了在学术体系中的挣扎、对“波塞松式干扰”的困扰,以及寻求更好工作生活平衡的思考,引发关于现代学术职业困境和个人职业转型的共鸣。
剑桥大学Stephen Kell在2014年发表了一篇深度理论文章,指出编程语言中“类型(Type)”一词在过去60年里缺乏统一定义。文章梳理了“工程传统”与“符号逻辑传统”两大脉络,认为两者对抽象的本质和目的持有不同态度,导致术语混用和概念混淆。作者详细拆解了数据类型的四个核心角色:命名解释、存储契约、操作定义性和语义良构性,并以BCPL为例论证了仅有“…