C语言还没死!嵌入式Linux内核开发绕不开它

张开发
2026/4/13 3:51:12 15 分钟阅读

分享文章

C语言还没死!嵌入式Linux内核开发绕不开它
C语言还没死大家都说它老了可为啥啥都绕不开它。我近来翻阅了诸多资料还询问了数位从事嵌入式以及内核工作的朋友并非是他们怠惰不愿更换新语言而是无法更换——在有一些地方确实没有选择的余地。像是Linux内核当前依旧是超过97%使用C来编写的。Rust虽说进入了几个驱动模块然而连调度器的一点关联都未曾触及到。这是为何呢原因在于上下文切换必须精确到每一条汇编指令对于寄存器如何保存、怎样恢复在C里借助一个宏、一段内联汇编就能完成要是换成其他语言仅仅是运行时那一层抽象就已然超出时间限制了。装配在汽车内部的 ESP 控制器其响应的时间限定为不能超出 1.2 微秒。这个具体的数值并非是随意确定的而是在刹车踏板被踩下之后车辆尚未出现晃动的瞬间就得及时展开干预动作。在 C 语言环境下编译完成后能够精确计算出最坏情况下的执行时间然而 Rust 当下的工具链却无法达成这一功能。更为关键的要点在于它明确禁止进行内存分配操作禁止抛出异常情况甚至就连函数调用栈也必须通过手动编写代码来进行严格控制——这些并非是一般性的限制条件而是如同钢铁般不可违背的规则。C语言凭借static、volatile、__attribute__这些特性能够将代码固定于内存的某个特定地址之上而其他语言若要进行模仿需要经过三道复杂的程序并且极容易出现错误情况。写驱动这个事儿往简单里说就是要充当“翻译官”一方面得依据芯片手册逐比特逐个对寄存器中的内容另一方面还得向操作系统清晰阐明DMA如何进行传输、中断怎样清除。在2024年存在一个用Rust重写的显卡驱动当处于休眠状态时就会出现故障经过长时间排查发现是bitfield位序与硬件不一致手册所规定的是MSB在前而Rust默认按照小端序排列在C语言里添加个packed就能够保证稳定。并非是有人编写得不好而是C语言的抽象恰好处于硬件和操作系统之间的那条缝隙之中。高级语言都要以C为基础Python能够运行是由于CPython是用C编写的Node.js速度快是因为V8将JS编译成机器码而在申请可执行内存这一步唯有C能够通用地调用mmap和mprotect。就连Rust自身的标准库堆内存分配最终还是要调用libc的malloc它根本没打算避开C它明白自己逃避不了。密码学更为厉害OpenSSL之中AES加密务必恒定时间不可以由于密钥不一样便多走一条分支不然会遭受侧信道攻击C里能够使用volatile强制读、运用内联汇编锁住指令顺序Rust的unsafe块做不到这般颗粒度的控制FIPS认证报告里所写的并非“使用了何种语言”而是“控制流图是否可验证”当前仅有C的CFG能被NIST认可的工具完整剖析。FFmpeg对HEVC视频进行解码时一帧当中存在几千个CABAC熵解码查表操作这全都依靠一个static const数组直接放入L1缓存来实现。要是换成别的语言仅仅封装一层“List”或者“Vec”内存就会多跳转一次帧率便会下降。WebRTC音频同步需要纳秒级的时间戳而在POSIX里唯一不会产生漂移的就是C语言的clock_gettime(CLOCK_MONOTONIC_RAW)。利用SQLite去写一个数据库页面校验和直接采用uint8_t*逐一字节扫描不进行字符串转换不创建对象不进入垃圾回收机制PostgreSQL的WAL日志进行刷盘操作时绕过glibc缓冲区通过write()直接作用于文件描述符实际测试结果表明相比Rust原型节省了一半的CPU资源并非Rust运行速度慢而是C语言与系统调用之间仅隔一层其他语言与系统调用之间至少间隔了三层。JWST望远镜于太空飞行代码无法重启无法调试一旦出现问题则数亿美金付诸东流。DO - 178C Level A认证规定涵盖两种结果C语言借助LDRA、VectorCAST等工具切实运行MC/DCRust仍在等待。辐射致使单粒子翻转须手动插入clrbt指令清除分支预测缓存此项操作只能于C里嵌入汇编来完成标点符号后的每句话都是独立的小分句以逗号隔开句末有标点符号。讲真C并非那种写起来让人畅快淋漓的语言而是付出诸多心力写就修改时需万分谨慎阅读尚能理解其中内容的语言。它不会替你管理内存不会帮你挑选算法不会隐匿哪怕一行多出的指令。只要你得为一块内存、一个寄存器、一个时钟周期承担起相应责任c便成了你唯一能够紧握在手的有效工具。

更多文章