linux 内核 - 内核设计原则
Linux 内核并不是按功能组织的。它是根据必须在并发、硬件交互和故障条件下保持的规则来组织的。这些规则定义了执行流、哪些代码可以被调用、以及哪些操作是允许的。它们不是实现细节——它们是设计的基础。
内核运行在所有处理器和任务上,但不会盲目地共享执行状态。每次进入内核的调用都与当前线程的身份相关:内存空间、文件描述符、信号状态和特权级别。函数在此上下文中操作,而不是全局变量。这种隔离防止了干扰,并使得代码在不同任务之间可以安全地重用。
内核的入口方式决定了它可以做什么。系统调用、陷阱、中断和内部线程在不同的约束条件下进入内核。有些路径可以休眠,有些则不能。有些涉及用户内存,有些则仅限内核空间。这些差异决定了哪些函数是有效的,哪些必须预先分配,以及如何返回控制。它们塑造了内核代码的编写方式,并规定了何时可以调用。
内核还必须表现出可预测性。快速路径避免阻塞,时间敏感的代码避免使用锁和分支。抢占和调度被严格控制。这些需求导致了每个 CPU 变量、无锁数据结构和有界的执行时间。可确定性是响应性和故障隔离的基础。
特定架构的代码在 arch/
目录下处理低级的入口、上下文切换、陷阱和分页。它将硬件行为转化为核心内核的一致接口。这种抽象使得内核能够在不妥协对 CPU 特定行为控制的情况下保持可移植性。
内存的分配遵循特定的策略。请求的原子性、对齐、设备可见性和回收性各不相同。各个子系统有不同的要求,内核通过分层分配器和受保护的 API 做出响应。这些路径是由正确性驱动的,而不是便利性。
内核是为了恢复而构建的。如果驱动程序行为不当或用户输入无效,内核不能崩溃或破坏状态。故障被隔离,缓冲区被验证,转换被守护。健壮性是核心设计考虑因素。
用户空间通过定义好的接口进入内核,但这些接口并不定义内核的结构。关键是控制流如何走,哪些资源被触及,以及必须保持哪些保证。
内核不能被当作一个功能集合来看待。它的结构存在是为了维持安全性、隔离性、可确定性和恢复能力。这就是它的写作方式——也是必须理解它的方式。
参考: https://www.linkedin.com/posts/moon-hee-lee_the-kernel-in-the-mind-a-conceptual-map-activity-7320274221882843138-o4ds/