intr branch
- kernel
- x86_64, riscv64, aarch64
- osdev
- bare metal
- c++, cmake
- uefi, opensbi
提供了各个阶段完成度不同的内核,你可以从自己喜欢的地方开始。
-
需要 Ubuntu 环境或使用 docker(见 tools/docker.md)
-
安装依赖
sudo apt install --fix-missing -y gcc g++ gcc-riscv64-linux-gnu g++-riscv64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu sudo apt install --fix-missing -y cmake qemu-system gdb-multiarch sudo apt install --fix-missing -y doxygen graphviz sudo apt install --fix-missing -y doxygen graphviz sudo apt install --fix-missing -y clang-format clang-tidy cppcheck libgtest-dev lcov
git submodule update --init --recursive
-
编译并运行
cd SimpleKernel # 支持三种架构 cmake --preset build_riscv64 # cmake --preset build_x86_64 # cmake --preset build_aarch64 # 进入其中一个架构 cd build_riscv64 # 编译内核 make kernel # 在 qemu 中运行 make run
-
调试
# 进入构建目录后执行 make debug
在一个新的 shell 中进入 gdb
# 进入 gdb gdb-multiarch # 连接端口 target remote :1234 # 加载符号表 file image/kernel.elf # 开始执行 c
-
riscv64
- 对 CSR 寄存器的抽象
- 寄存器状态打印
- 基于 Direct 的中断处理
- 中断注册函数
- 时钟中断
-
X86_64
- cpu 抽象
- 8259A pic 控制器抽象
- 8253/8254 timer 控制器抽象
- gdt 初始化
- 中断处理流程
- 中断注册函数
- 时钟中断
-
TODO
riscv64 PLIC
x86_64 APIC
-
全局对象
对象名 位置 用途 static ostream cout
src/kernel/libcxx/include/iostream 内核中的 std::cout 实现 static Singleton<KernelElf> kKernelElf
src/kernel/include/kernel_elf.hpp 解析内核自身的 elf 信息 static Singleton<KernelFdt> kKernelFdt
src/kernel/include/kernel_fdt.hpp 解析 dtb 信息 static Singleton<BasicInfo> kBasicInfo
src/kernel/include/basic_info.hpp 内核基本信息 static cpu::Serial kSerial(cpu::kCom1)
src/kernel/arch/x86_64/arch_main.cpp X86_64 下的串口
-
[BUILD] 使用 CMake 的构建系统
-
[BUILD] 使用 gdb remote 调试
-
[BUILD] 第三方资源集成
-
[COMMON] C++ 全局对象的构造
-
[COMMON] C++ 静态局部对象构造
-
[COMMON] C 栈保护支持
-
[COMMON] printf 支持
-
[COMMON] 简单的 C++ 异常支持
-
[COMMON] 带颜色的字符串输出
-
[x86_64] 基于 gnuefi 的 bootloader
-
[x86_64] 基于 serial 的基本输出
-
[x86_64] 物理内存信息探测
-
[x86_64] 显示缓冲区探测
-
[x86_64] 调用栈回溯
-
[riscv64] gp 寄存器的初始化
-
[riscv64] 基于 opensbi 的基本输出
-
[riscv64] device tree 硬件信息解析
-
[riscv64] ns16550a 串口驱动
-
[riscv64] 调用栈回溯(仅打印地址)
-
[aarch64] 基于 gnuefi 的 bootloader(调试中)
代码风格:Google,已由 .clang-format 指定
命名规范:Gooele 开源项目风格指南