先让机器把控制权交给内核,再把硬件差异收成内核能使用的最小接口。
| 硬件事实 | 为什么会坏 | 被迫设计 |
|---|---|---|
| CPU 只会从某个地址取指执行 | 内核在磁盘上,不在 CPU 当前执行流里 | Bootloader 负责加载内核 |
| 内核刚进入时环境极少 | 栈、中断表、内存表都可能还没准备 | Kernel entry 先做早期初始化 |
| 不同硬件入口不同 | 内核不应该到处散落硬件细节 | 硬件抽象层收口启动、内存、中断、设备接口 |
| 阶段 | 最小设计 | 验收 |
|---|---|---|
| Firmware | 初始化基本硬件,找到启动设备 | 能把控制权交给 bootloader |
| Bootloader | 读取 kernel image,放到约定内存地址 | 能校验内核镜像并跳转 |
| Kernel entry | 设置栈、清 BSS、准备最小输出 | 能打印 hello kernel |
| Kernel main | 进入内核主流程,初始化内存、中断、调度前置对象 | 控制权不再依赖 bootloader |
| 接口 | 它隐藏什么 | 内核上层怎样使用 |
|---|---|---|
cpu | 特权级切换、中断开关、寄存器保存 | 调度器和异常处理不直接依赖具体 CPU 细节 |
memory | 物理内存布局、页大小、页表格式 | 内存管理只关心分配页、映射页、设置权限 |
device | 设备寄存器、中断号、轮询方式 | 文件、终端、磁盘、网络统一走驱动接口 |
| 对象 | 字段 | 为什么够用 |
|---|---|---|
BootInfo | kernel_start、kernel_end、memory_map、boot_device | 内核知道自己在哪里、可用内存在哪里 |
InterruptTable | vector、handler、privilege | CPU 事件可以进入内核处理函数 |
PhysicalMemory | regions、free_pages、reserved_pages | 后续页分配器能避开内核和设备保留区 |
Device | id、type、mmio_base、irq、driver | 内核能枚举设备并绑定驱动 |
| 实验 | 通过标准 | 证明了什么 |
|---|---|---|
| 启动实验 | 从 bootloader 进入 kernel_entry | 内核能拿到机器控制权 |
| 内存实验 | 打印可用内存区间,并保留内核占用区 | 内核能识别自己和空闲内存 |
| 中断实验 | 触发定时器中断,进入指定 handler | CPU 事件能回到内核 |
| 设备实验 | 通过统一接口向控制台输出字符 | 设备细节开始被抽象 |