从Limine引导加载器到第一个Shell:cavOS启动流程完整走读

📅 2026/8/24 9:09:14
从Limine引导加载器到第一个Shell:cavOS启动流程完整走读
从Limine引导加载器到第一个ShellcavOS启动流程完整走读【免费下载链接】cavOS Amd64 operating system in C. Trying to make a full OS, with a simple and readable codebase!项目地址: https://gitcode.com/gh_mirrors/ca/cavOScavOS 是一个用 C 语言编写的 x86_64 操作系统以简单、可读为核心目标。本文带你完整走读 cavOS 的启动流程从Limine 引导加载器接管硬件、内核_start()初始化序列到第一个用户态 Shell/bin/bash的诞生——哪怕你刚接触操作系统也能跟着这张路线图逐层看懂开机到可用的全过程。 cavOS 是什么cavOSCave-Like Operating System是一个类 Unix、POSIX 兼容的 x86_64 单内核操作系统用相对朴素的 C 语言加少量 Intel 汇编写成。项目作者刻意追求代码结构的清晰可读而不是极致的性能优化这使得它成为学习操作系统启动流程与内核初始化的优质案例✅ 基于Limine 引导加载器 FAT32 启动分区 Ext2 根分区✅ GDT / IDT / ISR / APIC / SSE /syscall指令等架构特性齐备✅ 完整网络栈lwIP、多文件系统、ELF 加载、musl libc、抢占式多任务✅ 系统调用层刻意对齐 Linux目标是与 Linux 二进制兼容项目文档可先读 docs/install.md编译指南与 docs/contributing.md贡献指南。 启动前的准备磁盘是怎么做出来的理解启动流程之前先要搞清楚 cavOS 的磁盘布局——这是 Limine 能接上电的前提。整个打包过程由 tools/kernel/make_disk.sh 完成核心步骤如下分区文件系统标签作用分区 1FAT32LIMINE存放 Limine 引导程序与内核镜像分区 2Ext2cavOS系统根分区/ 所在脚本会依次执行用parted划分 MS-DOS 分区表创建两个主分区运行limine bios-install写入 BIOS 引导代码复制limine-bios.sys、BOOTX64.EFI、BOOTIA32.EFI到磁盘支持 BIOS 与 UEFI 双模式挂载两个分区把构建好的内核与用户态文件写入镜像Limine 本身由 src/bootloader/assert.sh 自动拉取并编译锁定版本 10.1.1无需手动安装。构建入口则是根目录的 Makefilemake disk # 完整系统镜像 disk.img推荐新手 make qemu # 直接用 QEMU 启动 make tools # 首次构建前先编译交叉工具链 第一步Limine 接管硬件内核点单x86_64 长模式需要分页支持而 BIOS 无法直接提供——这正是 Limine 这类现代引导加载器的价值所在它在进入内核前就完成分页模式设置、帧缓冲准备等工作并通过一组请求/应答request/response机制把硬件信息传递给内核。在 src/kernel/entry/bootloader.c 中内核像点单一样向 Limine 提出了 6 项请求请求内核拿到了什么分页模式请求确认处于4 级页表X86_64_4LVL长模式内核地址请求内核的虚拟基址与物理基址HHDM 请求高位直接映射偏移内核随机定位内存映射请求全部可用内存条目用于后续统计总量SMP 请求多核 CPU 信息并定位引导核心BSPRSDP 请求ACPI 表入口地址后面配置 APIC 要用initialiseBootloaderParser()会逐一校验应答结果任何一项不满足比如没找到引导核心都会直接panic()——这是学习启动流程时很典型的快速失败设计。 第二步_start() 内核初始化序列一切就绪后Limine 跳转到内核入口_start()代码位于 src/kernel/entry/kernel.c。初始化顺序经过精心设计依赖关系严格排布值得新手对照学习串口 引导信息解析initiateSerial()先开串口排错生命线再解析 Limine 应答VGA 与控制台initiateVGA()→initiateConsole()→ 清屏。注释特别指出Limine 已备好帧缓冲此步不依赖分页内存系统initiatePMM()物理页分配→initiateVMM()虚拟内存中断体系initiateGDT()→initiateACPI()APIC 的前置依赖→initiateISR()→initiatePaging()输入设备initiateApicTimer()鼠标依赖定时器→ 挂载/dev/→ 键盘、鼠标驱动多任务initiateTasks()→initiateKernelThreads()启动内核助手线程外设与文件系统initiateNetworking()、initiatePCI()随后挂载/、/boot/AHCI 磁盘以及虚拟文件系统/sys/、/proc/收尾加载 PSF 字体 → 安装syscall指令支持 →initiateSSE()→ 打印启动横幅这里的依赖顺序例如ACPI 先于 APIC、内核线程先于文件系统操作是操作系统初学者最该带走的知识之一内核不是一口气初始化而是按依赖图逐层解锁。 第三步从内核 Shell 到第一个用户态 Shell横幅打印完毕后_start()并没有结束而是进入一个循环while (1) run(/bin/bash, true, 0, 0);这一步通过 src/kernel/utilities/shell/shell.c 中的run()完成用 ELF 加载器src/kernel/utilities/elf.c把/bin/bash加载进新任务打开stdin/stdout/stderr三个文件描述符然后handControl()交出 CPU——第一个用户态 Shell 就此诞生。如果 bash 意外退出循环会尝试重新拉起。在此之前cavOS 还提供了一个内核态临时 Shell同在 shell.c输入help可以看到它的命令清单fetch显示内存、运行时间等系统信息lspci/net查看 PCI 设备与网卡含 DHCPexec/bash运行任意 cavOS 二进制 / 进入 GNU Bashping/arptableICMP 请求与 ARP 表内核助手线程src/kernel/entry/kernel_helper.c也在同一阶段被拉起负责网络包处理、僵尸进程回收与输入轮询保证 Shell 运行期间内核后台事务无人值守。 动手实践跑一遍并调试启动流程获取代码git clone https://gitcode.com/gh_mirrors/ca/cavOS安装依赖按 docs/install.md 安装 nasm、parted、dosfstools 等Ubuntu 有现成命令编译工具链make tools首次必做构建镜像make disk启动观察make qemu可直接运行make qemu_dbg见 src/kernel/Makefile则额外提供 GDB 端口、多核与网卡流量抓包适合深挖启动细节内核内还有自带的自检入口 src/kernel/entry/testing.c_start()中的testingInit()会在启动期跑一批基础测试是阅读内核时的天然路标。 启动流程一图总览阶段执行者关键产物① BIOS/UEFI固件定位 Limine 引导代码② 分页与长模式Limine4 级页表、帧缓冲、内存映射③ 信息交接bootloader.c内核基址、SMP、ACPI 入口④ 内核初始化kernel.c内存 / 中断 / 任务 / 文件系统就绪⑤ 用户态接管run(/bin/bash)第一个 Shell 延伸阅读编译与构建docs/install.md、根目录 Makefile内核入口与引导解析src/kernel/entry/kernel.c、src/kernel/entry/bootloader.c磁盘制作脚本tools/kernel/make_disk.shShell 与 ELF 加载src/kernel/utilities/shell/shell.c、src/kernel/utilities/elf.c链接脚本内核布局src/kernel/link.ldcavOS 的价值不仅在于能开机更在于它的启动路径短、注释多、依赖清晰。沿着 Limine →_start()→ Shell 这条主线读代码你会把操作系统如何启动这门课真正学明白。【免费下载链接】cavOS Amd64 operating system in C. Trying to make a full OS, with a simple and readable codebase!项目地址: https://gitcode.com/gh_mirrors/ca/cavOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考