【译】《心悟内核:先懂设计,再读代码》—8、间接寻址的力量:单一内核如何服务所有进程
作者:Moon Hee Lee
原文: The Kernel in the Mind
心悟内核:先懂设计,再读代码——间接寻址的力量:单一内核如何服务所有进程
-
既然内核会映射至每一个进程地址空间,它如何避免相互混淆?一个线程的系统调用,为何不会干扰其他线程的内存与运行状态?一份内核镜像,无需多份副本,又该如何为所有用户与处理器提供服务?
答案,便是间接寻址。 -
间接寻址的核心逻辑:不直接访问数据,而是借助引用指针完成寻址,最终解析出的实际内容会随上下文动态变化。内核不会固定指向全局结构体,而是依托线程私有引用变量(即 current),定位当前运行任务专属的私有数据。正是依靠这套机制,共用的内核才能区分成千上万个彼此隔离的进程。
-
内核空间代码全局共享,上下文相互独立。
-
所有进程都会映射同一片高地址内核空间,其中包含内核代码、只读数据、全局符号、设备映射与动态加载的内核模块。该区域由共享物理页承载,在全局范围内高效复用、保持一致。
-
但当进程通过系统调用、页异常或中断陷入内核态时,会携带自身独有的执行上下文。至此,间接寻址的核心作用便完全体现。
-
内核不会使用全局变量存放进程私有状态。每个处理器、每个线程都会维护一个指向当前运行任务的指针,该指针通常存放于寄存器或内核栈中,并通过 current 宏向外暴露。因此,内核代码访问 current->files 时,会通过指针动态寻址,定位到当前进程专属的文件描述符表,全程在运行时动态解析。
-
这类重定向机制贯穿内核全程。无论是系统调用执行、调度器决策,还是内存映射、身份凭证、信号处理函数的访问,全部依靠间接寻址保障逻辑正确。即便所有线程、进程运行同一套内核代码,彼此状态也不会互相干扰。
-
内核栈同样遵循该设计逻辑。每个线程在创建时,都会分配独立的内核态栈。CPU 切换至内核态时,会同步切换为当前活跃线程专属的内核栈。线程之间完全不共享栈空间,局部变量、寄存器现场、返回地址全程隔离,即使是临时的运行态数据,也能保证安全互不干扰。
-
间接寻址,是内核实现高并发伸缩性与运行安全的核心基石。内核代码全局统一、固定映射,但内核所能访问、修改的上下文数据,严格绑定当前运行线程。倘若缺失这套模型,内核要么必须为每个进程单独复制一份完整镜像,要么只能放任核心数据无隔离共享,最终引发严重安全问题。

如本文对你有些许帮助,欢迎大佬支持我一下(点赞+收藏+关注、关注公众号等),您的支持是我持续创作的竭动力
支持我的方式
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)