196 lines
4.6 KiB
Markdown
196 lines
4.6 KiB
Markdown
# Tianole 路线图
|
||
|
||
## 第 0 阶段
|
||
|
||
- 建立最小 `UEFI` 启动程序。
|
||
- 在 `QEMU + OVMF` 下运行。
|
||
- 在屏幕和 `debug.log` 中输出可见的启动标记。
|
||
- 保证启动后常驻,便于后续调试。
|
||
|
||
## 第 1 阶段
|
||
|
||
- 把当前单体启动程序拆成 `boot/` 与 `kernel/`。
|
||
- 定义 `boot_info` 交接结构。
|
||
- 由 `bootloader` 加载独立 `kernel` 映像。
|
||
- 跳转到 `kernel` 入口并建立稳定栈。
|
||
|
||
## 第 2 阶段
|
||
|
||
- 获取 `UEFI memory map`。
|
||
- 正确执行 `ExitBootServices`。
|
||
- 建立最小 framebuffer 控制台。
|
||
- 开始做物理内存管理。
|
||
|
||
## 第 3 阶段
|
||
|
||
- 建立 `IDT` 和基础异常处理。
|
||
- 增加定时器来源。
|
||
- 开始早期 `ACPI` 解析。
|
||
- 逐步过渡到接近 Linux 风格的 `arch/`、`mm/`、`kernel/` 边界。
|
||
|
||
## 总体流程
|
||
|
||
这个项目要按“可中断、可回坑、每一阶段都能单独验收”的方式推进。最终目标不是只在虚拟机里亮屏,而是要在这台 `UEFI x86_64` 笔记本上独立启动,并逐步具备运行本地 `git` 的能力。
|
||
|
||
建议的长期阶段如下:
|
||
|
||
### 阶段 A:启动链
|
||
|
||
- 跑通 `UEFI app -> bootloader -> kernel`
|
||
- 保证 `kernel_main()` 真正开始执行
|
||
- 保证屏幕或串口可见输出
|
||
|
||
完成标志:
|
||
|
||
- `bootloader` 成功把控制权交给独立 `kernel`
|
||
- `kernel` 能输出第一行字并停住
|
||
|
||
### 阶段 B:早期内核基础
|
||
|
||
- 定义 `boot_info`
|
||
- 获取 `memory map`
|
||
- 正确执行 `ExitBootServices`
|
||
- 建立 early console
|
||
- 建立最小 panic / assert / log
|
||
|
||
完成标志:
|
||
|
||
- 退出 UEFI 后内核仍能稳定运行
|
||
- 崩溃时能给出可定位信息
|
||
|
||
### 阶段 C:内存与异常
|
||
|
||
- 建立物理页分配器
|
||
- 建立内核堆分配器
|
||
- 建立 `GDT/IDT`
|
||
- 处理基础异常
|
||
- 增加定时器
|
||
|
||
完成标志:
|
||
|
||
- 能稳定分配页和堆内存
|
||
- 关键异常能进入处理路径
|
||
|
||
### 阶段 D:任务模型
|
||
|
||
- 建立内核线程
|
||
- 建立调度器
|
||
- 建立上下文切换
|
||
- 增加睡眠/唤醒与同步原语
|
||
|
||
完成标志:
|
||
|
||
- 可以同时运行多个内核线程
|
||
- 调度由时钟驱动
|
||
|
||
### 阶段 E:用户态基础
|
||
|
||
- 建立用户地址空间
|
||
- 增加系统调用入口
|
||
- 增加 ELF 加载
|
||
- 增加进程创建和等待
|
||
|
||
完成标志:
|
||
|
||
- 能加载并运行最小用户程序
|
||
- 用户程序能调用系统调用输出
|
||
|
||
### 阶段 F:存储与文件系统
|
||
|
||
- 建立块设备层
|
||
- 建立 `VFS`
|
||
- 接入一个实际文件系统
|
||
- 实现路径解析、文件读写、目录操作
|
||
|
||
完成标志:
|
||
|
||
- 能挂载文件系统
|
||
- 能打开、读取、写入文件
|
||
|
||
### 阶段 G:最小用户空间
|
||
|
||
- 增加 `init`
|
||
- 增加简单 shell
|
||
- 增加基础命令
|
||
- 补最小 `libc` 能力
|
||
|
||
完成标志:
|
||
|
||
- 启动后能进入 shell
|
||
- 能执行几个基础程序
|
||
|
||
### 阶段 H:面向 git 的补齐
|
||
|
||
- 优先支持本地 `git`,不先碰网络
|
||
- 补足 `git` 依赖的文件、进程、时间、路径等接口
|
||
- 先以 `git init / status / add / commit` 为目标
|
||
|
||
完成标志:
|
||
|
||
- 能运行本地仓库的基础 `git` 操作
|
||
|
||
### 阶段 I:真机落地
|
||
|
||
- 先 `QEMU + OVMF`
|
||
- 再 `U 盘 UEFI` 启动
|
||
- 最后再考虑加入本机启动项
|
||
|
||
完成标志:
|
||
|
||
- 不破坏现有 `Windows 11 + Linux Mint + GRUB`
|
||
- 能在真机上独立启动并进入系统
|
||
|
||
## 当前所处阶段
|
||
|
||
当前只完成了第 0 阶段的最小成果:
|
||
|
||
- `UEFI` 启动程序可构建
|
||
- `QEMU + OVMF` 能执行它
|
||
- 屏幕和 `debug.log` 有可见输出
|
||
- 程序可常驻,便于调试
|
||
|
||
当前还没有完成:
|
||
|
||
- 独立 `kernel` 接管
|
||
- `bootloader -> kernel` 交接
|
||
- `memory map`
|
||
- `ExitBootServices`
|
||
- 真正的内核子系统
|
||
|
||
## 当前代码组织原则
|
||
|
||
当前先不直接复制 Linux 的完整目录树,但开始采用接近 Linux 的分层方向:
|
||
|
||
- `arch/`:架构相关实现,目前只放 `x86`
|
||
- `kernel/`:未来放架构无关的内核主体
|
||
- `include/tianole/`:内核与 bootloader 共享的项目自有接口
|
||
- `docs/`:正式设计与路线图
|
||
- `docs/agents/`:agent 协作文档
|
||
|
||
当前这样拆分的目的不是过早抽象,而是先把边界立住:
|
||
|
||
- `UEFI` 相关定义留在 `arch/x86/`
|
||
- 通用交接结构放在 `include/tianole/`
|
||
- 以后新增架构时,优先新增新的 `arch/<name>/`,而不是改写通用代码
|
||
|
||
## 接下来最近三个里程碑
|
||
|
||
### 里程碑 1:独立 kernel 接管
|
||
|
||
- 让 `bootloader` 加载独立 `kernel`
|
||
- 建立 `boot_info`
|
||
- 跳到 `kernel_main()`
|
||
- 由 `kernel` 自己输出第一行字
|
||
|
||
### 里程碑 2:退出 UEFI
|
||
|
||
- 获取并保存 `memory map`
|
||
- 正确执行 `ExitBootServices`
|
||
- `kernel` 在退出固件服务后继续稳定运行
|
||
|
||
### 里程碑 3:早期调试和内存基础
|
||
|
||
- 增加 early serial / framebuffer console
|
||
- 建立物理页分配器
|
||
- 建立基础异常处理
|