Humprog

Humprog

利用内存间接调用在Linux x86-64上进行系统调用插桩

作者深入探讨了在Linux x86-64环境下,如何利用指令编码特性(如Instruction Punning和Memory-Indirect Calls)来高效地插桩系统调用,以替代传统的ud2陷阱或zpoline方案。文章详细分析了不同长度指令(2字节、5字节、6字节)的内存寻址限制,解释了如何通过修改后续指令的字节来间接跳转到自定义的处理代码,从而减少虚拟地址空间的占用并避免映射低地址内存带来的安全风险。这是一篇极具深度的底层系统编程技术剖析。
评论点赞收藏54 天前

Linux x86-64内存间接调用系统调用插桩技术解析

作者深入探讨了在Linux x86-64架构下,利用内存间接调用指令进行系统调用插桩的技术尝试。文章详细分析了现有方案如Liteinst、E9Patch和zpoline的优缺点,特别是它们如何解决指令长度限制问题。作者尝试探索x86分段机制和远调用指令,发现虽然理论可行,但在实际应用中面临地址空间限制和安全性挑战。最终结论是部分尝试未达预期,但提供了宝贵的底层系统编程经验和见解。
评论点赞收藏59 天前

实现“单语言”编程:让开发环境具备多语言能力

作者认为“多语言编程”是个错误的隐喻,真正的目标应该是让开发者成为“单语言者”。核心观点是:编程环境本身应该具备多语言能力,屏蔽底层实现语言的差异,让程序员只需掌握一种语言即可使用各种库。文章回顾了GraalVM和Python CFFI等项目的尝试,指出当前技术仍面临语言间平等协作和资源管理的难题,并分享了作者在构建联邦式多租户底层支持方面的最新研究进展。
评论点赞收藏104 天前

反转抽象:一场存在主义危机

文章批评了编程语言和基础设施设计中主流的“正向抽象”和“存在主义”思维,即只关注如何从抽象实现具体并隐藏细节。作者提出应重视“逆向抽象”和“普遍主义”,即从具体实现反向推导抽象视图的能力,如调试器和ABI所体现的那样。他认为当前软件缺乏生物般的适应性,过于追求单一、完美的“晶体”结构,导致工具链封闭、碎片化和创新受阻。通过链接时优化(LTO)和自动配置(autoconf)等例子,作者论证了支持多样性、开放接口和逆向分析对于构建灵活、可扩展的软件基础设施至关重要,这不仅是技术问题,更是社会和文化层面的挑战。
评论点赞收藏178 天前

软件底物:难道只能有一个?

作者回顾了在软件底物研讨会上的观点陈述,并提到Gilad Bracha对其进行了评论。作者计划近期发布后续文章,总结相关工作进展以回应评论中关于如何获取更多实际工作信息的疑问。
评论点赞收藏286 天前

在Linux用户态进程中拦截clone()系统调用

作者深入探讨了在Linux用户态进程中拦截和修改clone系统调用的底层技术难点。由于clone会创建新线程并替换栈空间,导致父进程的栈帧在新线程中失效,使得常规的C语言信号处理逻辑无法直接复用。作者提出了一种巧妙的解决方案:在调用clone前,预先将包含信号帧和函数帧内容的内存块复制到新的子进程栈空间中,并进行指针修正(fixup),从而让子线程能像父线程一样通过sigreturn正常返回。文章详细分析了x86-64汇编实现、对齐问题、32位兼容性及保守式垃圾回收风格的指针修复策略,展示了极客级别的系统编程技巧和对编译器行为边界的探索。
评论点赞收藏343 天前

Unix、Plan 9与潜伏的Smalltalk:操作系统的收敛之路

文章对比了Unix和Smalltalk两大系统的起源与演进。作者认为,尽管Smalltalk曾设想消除操作系统,但Unix凭借“组合性”和“多孔边界”的设计哲学存活并主导了世界。有趣的是,Unix的文件抽象向Plan 9演进,以及调试反思机制的发展,正逐渐向Smalltalk的对象模型收敛。文章指出两者在底层抽象上殊途同归,未来Unix衍生系统可能融合两者的优势,而非完全取代。
评论点赞收藏393 天前

用 Rust 和 MMTk 编写可预加载的 malloc

作者尝试在 Rust 中基于 MMTk 实现一个可通过 LD_PRELOAD 劫持的 malloc 共享库。核心难点在于避免重入(reentrancy)问题:Rust 标准库或 MMTk 内部可能间接调用全局 malloc,导致死循环。作者详细分析了两种解决方案:一是构建完全自包含的共享库(静态链接第二份 libc),二是利用弱符号和链接脚本强制覆盖特定符号(如 __cxa_thread_atexit_impl)。文中还深入探讨了 Rust 构建工具链(Cargo/rustc/Make)在传递复杂链接参数时的痛点,以及 GNU binutils 的相关 Bug。这是一篇极具工程深度的底层系统编程实战记录,适合对内存管理、链接器和 Rust FFI 感兴趣的开发者。
评论点赞收藏465 天前

我开始怀疑我的工作与全职学术职位不相容

一位英国高校研究员反思自己陷入学术体制的平庸与混乱,认为过度管理、行政琐事和缺乏激励的环境正在扼杀创造力。他计划转为兼职,减少教学行政负担,留出时间进行编程、写作等创造性工作,并探索众筹等新收入模式以维持独立性。文章坦诚分享了在学术体系中的挣扎、对“波塞松式干扰”的困扰,以及寻求更好工作生活平衡的思考,引发关于现代学术职业困境和个人职业转型的共鸣。
评论点赞收藏533 天前

寻找类型的本质:关于编程语言中“类型”概念的六十年辨析

剑桥大学Stephen Kell在2014年发表了一篇深度理论文章,指出编程语言中“类型(Type)”一词在过去60年里缺乏统一定义。文章梳理了“工程传统”与“符号逻辑传统”两大脉络,认为两者对抽象的本质和目的持有不同态度,导致术语混用和概念混淆。作者详细拆解了数据类型的四个核心角色:命名解释、存储契约、操作定义性和语义良构性,并以BCPL为例论证了仅有“命名解释”的类型系统依然具有实用价值。文章主张重新审视并统一这些概念,以解决当前语言设计中的理论分歧。这是一篇适合对编程语言理论、类型系统历史及基础概念辨析感兴趣的技术读者的深度好文。
评论点赞收藏591 天前

追寻类型的本质:厘清编程中“类型”概念的六十载混淆

剑桥大学学者Stephen Kell指出,编程界对“类型”一词的使用存在长达60年的概念混淆。文章梳理了类型的四种角色:命名解释、存储契约、操作定义性、语义健全性,并区分了“工程传统”与“逻辑传统”。作者认为,将逻辑中的类型检查强行套用到工程抽象上导致了误解,呼吁重新厘清这些概念以指导未来的语言设计。
评论点赞收藏649 天前

编译器优化代码的源码级调试:看似无解,实则可行

这篇论文挑战了“代码优化与源码调试互斥”的传统观点。作者指出核心问题在于状态丢失而非优化本身。文章对比了动态去优化(如Java JVM)和元数据映射(如LLVM/DWARF)两种方案,认为后者虽然复杂且存在时间精度问题,但在保持高性能的同时实现全源码级调试是可行的。作者提出了基于状态映射密度、高度和保真度的新框架,并探讨了调试元数据的正确性标准。适合对编译器原理、底层系统调试和编程语言实现感兴趣的工程师阅读。
评论点赞收藏662 天前

单文件C程序自重建方案的改进与思考

作者改进了单文件C程序自重建的技术方案。旧方案依赖hash-bang,导致二进制文件无法调试源码;新方案利用双斜杠注释行作为Shell命令,在不改变文件结构的前提下实现启动时自动编译和运行,解决了调试难题。文章进一步探讨了自重建与实时编程的关系,并提出通过修改链接器支持增量链接(如保留输入section元数据)来实现大规模程序的快速自重建,邀请感兴趣的人交流这一研究方向。
评论点赞收藏667 天前

如何真正封装C编译器和预处理器

作者深入探讨了如何构建一个鲁棒的C编译器包装脚本。文章指出传统的“前门”解析命令行方法容易出错且依赖特定编译器实现。作者提出了一种“后门”方案,利用GCC和Clang的内部选项(如-wapper和-###)来自动拆解编译驱动器的子命令。文中详细分析了处理集成预处理器分离、精确扫描命令行参数以区分选项与文件、以及解释内部子命令(如cc1)差异等关键技术难点,并提供了解决思路。这是一篇极具工程价值的底层工具开发经验分享。
评论点赞收藏709 天前

一个能自我重建的微型C程序

作者展示了一个极简的单文件C程序,利用shell技巧实现自动重新编译和运行。核心观点是构建过程应被视为执行的第一阶段,而非独立的字符串操作。作者进一步探讨了将测试集成到构建中的利弊,并以xz后门事件为例,反思了构建系统的透明度和安全性问题。这是一篇具有工程哲学思考的技术随笔,适合喜欢底层机制和构建系统设计的开发者阅读。
评论点赞收藏709 天前

如何正确地包装C编译器和预处理器

作者提出了一种比传统脚本解析更稳健的方法来包装C编译器。传统方法需要重新实现复杂的命令行解析逻辑,容易出错且依赖特定语言环境。本文介绍利用GCC和Clang的内部选项(如-wapper和-###),在编译器驱动程序的“后门”拦截子命令,从而简化输入输出文件的识别和处理。文章详细讨论了如何处理预处理与编译集成、精确扫描命令行参数以区分选项和文件,以及解释编译器内部子命令(如cc1)的差异。这是一种针对编译器研究和工具开发的工程实践分享。
评论点赞收藏713 天前

如何让 Shell 脚本也能被 Make 管理

作者分享了一个将 Makefile 和 Shell 脚本合并到同一个文件中的技巧。利用两者语法解析的差异(如 define 关键字和分号行为),实现了代码互斥执行。作者动机是在低权限服务器上,利用 CGI 和文件系统替代数据库和 PHP,编写极简的单文件 Web 应用。这是一个典型的黑客风格工程技巧,展示了如何巧妙利用工具特性解决部署约束问题。
评论点赞收藏956 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。