Tiny OS 是一个运行在 x86_64 架构上的操作系统。
本项目在 linux 系统上开发。windows 系统上可以通过安装 WSL 运行 linux 子系统。
如果你使用的是 WSL:
- 在
windows中安装一个 X Server;推荐安装 Xming 或 VcXsvr。- 需要通过
-ac启动 X Server , 或者通过 GUI 勾选disable access control。
- 需要通过
- 在
WSL中:- 如果使用的是
WSL(version 1):
export DISPLAY=:0- 如果使用的是
WSL2(version 2):
如果不想每开一个终端都输入上述语句, 就把它加在export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
~/.bashrc或者~/.profile文件的末尾。 - 如果使用的是
- 如果发生类似
Could not initialize SDL (No available video device) ...或者任何关于 GTK 等错误,请检查你的 X Server 是否启动以及是否正确设置了环境变量DISPLAY。
Rust 是一门现代的系统级编程语言,本项目主要使用 Rust 语言开发。通过Rust 官网下载并安装。注意:本项目要求安装 nightly 版工具链。
在安装完成后,通过 rustup 安装 llvm-tools:
rustup component add llvm-tools-preview通过 cargo 安装一些有用的工具,用于开发:
cargo install cargo-binutils通过 bochs 模拟器进行模拟。源代码下载链接:Source Forge -- Bochs x86 PC emulator 。下载完后, 编译安装。
命令如下:
cargo run --release编译好的内核镜像路径为 target/os.img。
通过 bximage 在 ./bochs 目录下创建一个 os.img 文件:
bximage -func=create -hd=10M -imgmode=flat ./bochs/os.img -q通过 dd 工具将 ./target/os.img 刻入 ./bochs/os.img 中:
# 注意下面的参数 count 要根据生成的 target/os.img 文件的大小进行调整
dd if=target/os.img of=bochs/os.img bs=512 count=250 conv=notrunc在目录下 bochs/conf 有如下配置文件:
bochsdbg-gdb.bxrc: 可以通过gdb远程调试,绑定localhost:1234(需要在编译bochs时,开启--enable-gdb-stub)bochsdbg-win: 在window平台上开启bochs的、带有图形界面的debuggerbochsrc.bxrc: 最基础的bochs配置文件,不带有debug功能
运行 bochs,开启模拟:
bochs -q -f bochs/conf/bochsrc.bxrc不同于 bochs,qemu 可以直接加载生成的 target/os.img:
qemu-system-x86_64 -drive format=raw,file=bochs/os.img -boot c项目根目录下有一个 Makefile 文件,里面定义了一些运行和调试的命令:
clean: 用于清理生成的文件build-release: 用于编译release版内核镜像build-debug: 用于编译debug版内核镜像 (未完成)run-bochs: 用于编译内核镜像,并启动bochs模拟run-qemu: 用于编译内核镜像,并启动qemu模拟debug-bochs: 用于编译内核镜像,启动bochs并通过rust-gdb远程debugdebug-qemu: 用于编译内核镜像,启动qemu并通过rust-gdb远程debug
本项目主要分为 4 个部分:
builder: 位于src目录下,主要用于编译、构建内核镜像boot: 位于boot目录下,是tiny OS的bootloaderboot_info: 位于boot_info目录下,提供BootInfo结构kernel: 位于kernel目录下,是tiny OS的内核代码
- bootloader
- 进入保护模式
- 开启分页管理
- 开启 VGA 的图形显示模式
- 通过 0xE820 BIOS function 获取 memory_map
- 进入
long mode - 准备
BootInfo结构用于从bootloader阶段传递信息到kernel - 加载内核的
elf文件 - 为内核代码做虚拟地址映射, 并跳转到内核运行
- kernel
- 准备
logger(用于实现tiny os的 打印函数以及内核开发时 debug ) - 处理各种异常、中断
- 初步处理时钟中断
- 初步处理键盘输入
- 初步处理
Page Fault - 初步处理
GP Fault - 处理
Double Fault
- 实现动态内存分配器
- 通过
linked_list_allocator实现初步的内存分配 - 实现
buddy system内存分配器
- 通过
- 实现多任务(抢占式调度)
- 实现内核级的协作式调度
- 初步实现
- 更好的调度算法
- 实现全局可用的
spawn
- 实现
FAT32文件系统 - 实现
shell
- 准备
- 编译
- 实现更灵活的
Builder(可以选择编译debug版和release版的镜像) - 生成
bochs可以直接加载的内核镜像,而不是通过dd工具刻入bochs/os.img中
- 实现更灵活的
