这些测试,暴露出了不少隐藏在内核内存管理子系统深处的缺陷。比,在极度碎片化的情况下,内存分配器的效率会急剧下降,导致系统卡顿;lmk机制在判断进程优先级时,偶尔会因为状态更新不及时而“误杀”正在后台下载文件的网络进程;某个蓝牙驱动程序中存在一个极其隐蔽的内存泄漏,连续运行几天后会导致系统可用内存减少……
每一次缺陷的发现,都伴随着痛苦的调试和艰难的修复。老刘和他的团队成员们,常常需要深入到内核最底层的伙伴系统、slab\/slub分配器、页面回收算法中去,仔细分析代码逻辑,优化数据结构,调整控制参数。
多核处理器的引入,极大地提升了性能,但也带来了无处不在的并发冲突风险。多个cpu核同时访问共享数据、争抢硬件资源,如果同步机制设计不当,就可能导致数据损坏、死锁、或者难以复现的竞态条件。
内核团队必须像拿着最高倍数的电子显微镜一样,去审视内核中所有可能存在并发访问的代码区域:
对于需要保护的共享数据结构,不能简单地使用粗粒度的全局锁,而是需要设计更细粒度的自旋锁、互斥锁、读写锁,并仔细分析锁的持有时间、竞争频率,避免死锁和性能瓶颈。他们甚至开始探索当时还比较新的rcu等无锁或低锁技术的可行性。
确保中断处理程序尽可能短小精悍,将耗时较长的处理逻辑放到可延迟执行的下半部中,并设计安全的、避免并发冲突的上下文切换和数据同步机制。
对于需要在不同cpu核之间进行通信和同步的任务,需要设计高效且可靠的核间中断和同步原语。
李志远的eda团队也提供了强大的支持。他们利用“盘古”平台的形式化验证工具,对内核中一些关键的并发控制逻辑进行了形式化的正确性证明,帮助发现了一些极其隐蔽的逻辑漏洞。
除了常规的性能和稳定性,一个健壮的操作系统内核,还必须具备强大的异常处理和容错能力,能够在面对各种意外情况时,尽可能地保持系统的可用性,或者实现“优雅的失败”,保护用户数据不丢失。
为关键的硬件驱动程序(基带、wifi、显示等)设计“看门狗