linux内核 - 内核是一个分层的系统
Linux 内核并不呈现一个统一的系统视图。它提供了多个受控的视图——每个视图绑定到特定任务,由上下文塑造,并受策略约束。这些视图不是动态组装的,而是通过分层构建:虚拟层、映射层、隔离层和受控层。
这种结构的存在是为了在并发、可抢占以及硬件故障下保持行为可预测。每一层都有明确的作用范围,没有任何一层独立运作。内核避免使用全局状态,而依赖映射、间接和抽象——保证访问是有意的,执行是受控的。
执行从硬件边界开始。架构相关代码处理陷阱、故障和中断,定义 CPU 在系统调用或页故障时如何进入内核。从一开始,内核就将执行绑定到当前任务和调度上下文。
任务不是自主的。它们被排队、分配到 CPU,并在需要时被抢占。调度器执行策略和公平性。定时器、RCU 和延迟工作约束了并发性和时序。
抽象定义了内核如何暴露功能。系统调用操作内核对象,而这些对象实现了标准接口。VFS 抽象了文件系统,块层抽象了设备,网络栈抽象了协议。接口如 file_operations
和 netdev_ops
定义行为,而不暴露实现细节。
调度遵循接口表。文件、套接字和设备不暴露内部实现。read()
或 ioctl()
等操作通过函数指针路由。行为动态选择,支持替换和模块复用。
访问通过映射解析。文件描述符变为 file
结构体,虚拟地址变为物理页,路径变为 dentry
和 inode
。这些转换是任务范围内的,并且经过验证,没有任何直接访问。
间接性强制分离。内核通过引用(函数表、每任务指针、页表)路由行为和访问,而非直接访问。即使是用户空间内存也被视为请求,通过 copy_from_user()
等辅助函数解析。间接性保证所有访问都是受控且上下文感知的。
每个任务携带自己的上下文:内存映射、文件表、凭证、命名空间。这些结构定义了它能看到和能做的事情。Cgroup 限制资源使用,LSM 强制策略。默认情况下,没有输入被信任。每次转换都经过验证。
即便是面向用户的构造——系统调用、文件描述符、挂载点——也受更深层次的分层影响。用户空间只能与内核允许它看到的部分交互。
Linux 内核不仅仅是各个子系统的集合,它是一个执行与控制的分层系统——旨在在并发下保持一致性,通过抽象保证安全,并在负载下维持可控性。这些层不是可选的,它们定义了内核的行为,并解释了内核为何能在压力下保持可靠。
参考:
https://www.linkedin.com/posts/moon-hee-lee_the-kernel-as-a-system-of-layers-virtual-activity-7324553177477873664-j8-1/