Skip to content

Simple-XX/SimpleKernel

 
 

Repository files navigation

codecov workflow commit-activity last-commit-boot MIT License LICENSE 996.icu

English | 中文

SimpleKernel

intr branch

关键词

  • kernel
  • x86_64, riscv64, aarch64
  • osdev
  • bare metal
  • c++, cmake
  • uefi, opensbi

简介

提供了各个阶段完成度不同的内核,你可以从自己喜欢的地方开始。

快速开始

  1. 需要 Ubuntu 环境或使用 docker(见 tools/docker.md)

  2. 安装依赖

    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
  3. 编译并运行

    cd SimpleKernel
    # 支持三种架构
    cmake --preset build_riscv64
    # cmake --preset build_x86_64
    # cmake --preset build_aarch64
    # 进入其中一个架构
    cd build_riscv64
    # 编译内核
    make kernel
    # 在 qemu 中运行
    make run
  4. 调试

    # 进入构建目录后执行
    make debug

    在一个新的 shell 中进入 gdb

    # 进入 gdb
    gdb-multiarch
    # 连接端口
    target remote :1234
    # 加载符号表
    file image/kernel.elf
    # 开始执行
    c

执行流

  • x86_64/aarch64

  • riscv64

新增特性

  • riscv64

    1. 对 CSR 寄存器的抽象
    2. 寄存器状态打印
    3. 基于 Direct 的中断处理
    4. 中断注册函数
    5. 时钟中断
  • X86_64

    1. cpu 抽象
    2. 8259A pic 控制器抽象
    3. 8253/8254 timer 控制器抽象
    4. gdt 初始化
    5. 中断处理流程
    6. 中断注册函数
    7. 时钟中断
  • 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(调试中)

使用的第三方资源

grub2

opensbi

gnu-efi

gdbinit

opensbi_interface

printf_bare_metal

dtc

google/googletest

开发指南

代码风格:Google,已由 .clang-format 指定

命名规范:Gooele 开源项目风格指南

About

Simple kernel for learning operating systems. 用于学习操作系统的简单内核

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published