知识全景图/ 软件工程与系统/ 如何设计系统/ 如何设计操作系统/ 裸机启动与硬件抽象层

如何设计裸机启动与硬件抽象层

先让机器把控制权交给内核,再把硬件差异收成内核能使用的最小接口。

定位:这页不是计算机组成原理,也不是 BIOS / UEFI 教程。它只讲操作系统设计前必须解决的第一件事:内核怎样从一段磁盘上的二进制,变成正在 CPU 上运行、能接中断、能认内存、能访问设备的代码。
一、坏场景:内核代码躺在磁盘上,CPU 不认识它
失败:你写好了 kernel.bin,但 CPU 上电后不会自动理解“这是操作系统”。它只会从固件约定的入口执行,然后找启动设备。没有启动链路,内核永远不会成为内核。
硬件事实为什么会坏被迫设计
CPU 只会从某个地址取指执行内核在磁盘上,不在 CPU 当前执行流里Bootloader 负责加载内核
内核刚进入时环境极少栈、中断表、内存表都可能还没准备Kernel entry 先做早期初始化
不同硬件入口不同内核不应该到处散落硬件细节硬件抽象层收口启动、内存、中断、设备接口
二、最小启动链路
阶段最小设计验收
Firmware初始化基本硬件,找到启动设备能把控制权交给 bootloader
Bootloader读取 kernel image,放到约定内存地址能校验内核镜像并跳转
Kernel entry设置栈、清 BSS、准备最小输出能打印 hello kernel
Kernel main进入内核主流程,初始化内存、中断、调度前置对象控制权不再依赖 bootloader
firmware find boot device load bootloader bootloader read kernel image verify image header jump kernel_entry kernel_entry setup_stack() clear_bss() early_console_print("hello kernel") kernel_main()
三、硬件抽象层只收三类接口
接口它隐藏什么内核上层怎样使用
cpu特权级切换、中断开关、寄存器保存调度器和异常处理不直接依赖具体 CPU 细节
memory物理内存布局、页大小、页表格式内存管理只关心分配页、映射页、设置权限
device设备寄存器、中断号、轮询方式文件、终端、磁盘、网络统一走驱动接口
收敛点:硬件抽象层不是为了“优雅”,而是为了不让进程、内存、文件系统都直接依赖具体硬件。
四、第一版最小对象
对象字段为什么够用
BootInfokernel_start、kernel_end、memory_map、boot_device内核知道自己在哪里、可用内存在哪里
InterruptTablevector、handler、privilegeCPU 事件可以进入内核处理函数
PhysicalMemoryregions、free_pages、reserved_pages后续页分配器能避开内核和设备保留区
Deviceid、type、mmio_base、irq、driver内核能枚举设备并绑定驱动
五、验收实验
实验通过标准证明了什么
启动实验从 bootloader 进入 kernel_entry内核能拿到机器控制权
内存实验打印可用内存区间,并保留内核占用区内核能识别自己和空闲内存
中断实验触发定时器中断,进入指定 handlerCPU 事件能回到内核
设备实验通过统一接口向控制台输出字符设备细节开始被抽象
六、回到操作系统主线
下一页:进程与调度器
机器进入内核后,下一步是让用户程序运行,并在它失控时夺回 CPU。继续看 如何设计进程与调度器
回总页
如果你想看完整 ToyOS 设计路线,回到 如何设计操作系统
一句话:裸机启动与硬件抽象层解决的不是“懂硬件”,而是让内核先活过来,并把硬件差异收成后续 OS 机制能依赖的稳定接口。