多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【译】《心悟内核:先懂设计,再读代码》—15、从 vmlinuz 到 eBPF:Linux 内核内部究竟在运行什么

【译】《心悟内核:先懂设计,再读代码》—15、从 vmlinuz 到 eBPF:Linux 内核内部究竟在运行什么 作者Moon Hee Lee原文 The Kernel in the Mind心悟内核:先懂设计再读代码——从 vmlinuz 到 eBPFLinux 内核内部究竟在运行什么Linux 内核并非单纯的静态二进制文件而是一套具备动态扩展能力的完整系统。多种类型的代码会在不同阶段、基于不同诉求进入内核态并执行。一切始于 vmlinuz也就是系统引导阶段加载的核心内核镜像。它包含系统最基础的核心组件调度器、内存管理器、中断处理程序以及系统调用分发逻辑。该镜像始终完成地址映射、常驻内存但不会像普通进程那样被调度执行。内核的运行模式以响应式为主仅在触发异常陷入、系统调用或硬件中断时切入执行处理完毕后立刻退出不会主动阻塞等待或循环轮询只负责按需响应事件。内核配置决定了哪些功能会被编译进核心镜像、哪些功能外置模块化、哪些功能直接剔除。通过 .config 配置文件开发者可以划定常驻内置功能、按需动态加载模块以及完全禁用的组件。从系统启动之初这套配置就决定了内核的资源占用、功能权限与运行行为。其次是内核模块即以 .ko 为后缀的文件用于在系统运行阶段动态扩展内核能力。设备驱动、文件系统、网络协议栈等功能大多以模块形式实现。模块不属于静态内核镜像可按需加载一旦载入内核其运行权限与内置代码完全一致能够调用内核内部接口、直接访问内核内存。模块支持热卸载与热更新无需重启系统赋予内核高度的灵活性与模块化特性。eBPF 则采用了完全不同的实现思路。eBPF 程序基于受限的 C 语言或 Rust 语言开发编译为安全字节码经内核严格校验后在运行时注入内核。这类程序挂载于特定钩子点位例如系统调用、跟踪探针、网络网口仅在事件触发时执行。它既不内嵌于内核镜像也不以内核模块形式存在而是在严格的安全约束下运行于内核态。启用后eBPF 能够安全、高效地观测并扩展内核行为。借助 bpftrace 等工具运维人员可在不修改内核代码、无需重启设备的前提下对线上系统进行动态跟踪排障。热补丁是另一种运行时代码形态用于在内核持续运行的过程中修复程序缺陷与安全漏洞。热补丁会替换内存中的指定函数重定向执行流转全程无需重启系统在运行周期内持续生效。但热补丁无法跨重启持久保留除非重新注入或整合进新版内核镜像。在所有组件启动之前还有临时根文件系统 initramfs。尽管它运行在用户态却在内核启动完成后立即受控执行负责前期系统环境初始化加载必要内核模块、挂载临时文件系统最终将系统控制权移交至真正的初始化进程。它不属于内核代码却决定了内核早期运行所依赖的基础环境。因此内核中运行的代码绝不局限于编译内置的原生程序还包含常驻代码、可加载模块、可注入程序、可替换补丁等多种形态。所有代码均源自内核源码体系或严格遵循内核运行规则。内核不再是单一固化的程序镜像而是一套可通过配置裁剪、原生支持扩展、动态迭代的活态运行系统。如本文对你有些许帮助欢迎大佬支持我一下点赞收藏关注、关注公众号等您的支持是我持续创作的竭动力支持我的方式
返回列表