《30天自制操作系统》NASM+GCC+QEMU实现,原仓库https://gitee.com/ghosind/HariboteOS
Go to file
2022-04-05 19:35:23 +08:00
day1 Revert "Replace tabs with spaces." 2021-03-08 09:30:07 +08:00
day2 Revert "Replace tabs with spaces." 2021-03-08 09:30:07 +08:00
day3 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day4 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day5 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day6 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day7 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day8 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day9 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day10 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day11 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day12 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day13 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day14 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day15 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day16 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day17 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day18 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day19 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day20 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day21 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day22 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day23 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day24 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day25 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day26 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day27 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
day28 Add gcc option -fno-pie explicitly (#2) 2022-04-05 19:35:23 +08:00
.clang-format Add clang format. 2021-05-20 20:55:12 +08:00
.gitignore Add clang format. 2021-05-20 20:55:12 +08:00
LICENSE Initial commit 2021-02-25 22:28:18 +08:00
README.md Update readme. 2021-06-04 23:06:42 +08:00

HariboteOS

《30天自制操作系统》川合秀实 著配套代码改编版。因为作者使用了其自己编写的一套非标准的工具且无法在非Windows平台下运行所以本项目在原代码的基础上使用NASM、GCC、Qemu等工具进行编译、运行。

本项目已完成第028天内容除去第28天日文显示部分项目主要实现已经完成。因为该书后两章内容更偏向于应用层面所以便不在本项目中实现有兴趣的朋友可以根据前面的基础上继续完成。

项目特色

  • 采用GCC、NASM作为工具链可跨平台使用
  • 基于LinkerScript构建内核
  • 不依赖于作者自定义HRB文件格式支持ELF文件格式
  • 支持部分C标准库函数的简单实现libc文件
  • 头文件拆分,结构更为清晰
  • 中文键盘支持

环境依赖

  • nasm
  • gcc
  • binutils
  • qemu-system-i386
  • mtools

可选依赖

  • gdb(调试使用)

Mac下安装

MacOS下默认Xcode Command Line Tools使用的gcc为clang的别名在本项目实现中未对clang进行测试可能会存在问题。

在Mac下推荐使用x86_64-elf-gcc工具链进行编译,可使用brew install x86_64-elf-gcc x86_64-elf-binutils x86_64-elf-gdb安装。

运行

进入对应的文件夹,使用下面的命令运行:

$ make qemu
# 若使用工具链包含前缀如x86_64-elf-可以使用GCCPREFIX
$ make qemu GCCPREFIX=x86_64-elf-

若要使用GDB进行调试请设置DEBUG

$ make qemu DEBUG=1

最终目录结构

  • app:应用程序源码
  • include:系统内核头文件
  • kernel:系统内核代码
  • libc简单的C标准库部分实现

C标准库实现

  • strcmp
  • strncmp

参考自xv6实现

  • vsprintf
  • sprintf

来自《C程序设计语言》

  • rand

项目进度

  • 第1天Hello world
  • 第2天汇编与Makefile
  • 第3天进入32位模式
  • 第4天画面显示
  • 第5天GDT/IDT
  • 第6天中断处理
  • 第7天FIFO
  • 第8天鼠标与32位模式
  • 第9天内存管理
  • 第10天窗口叠加
  • 第11天窗口处理
  • 第12天定时器1
  • 第13天定时器2
  • 第14天键盘输入
  • 第15天多任务1
  • 第16天多任务2
  • 第17天命令行窗口
  • 第18天命令行命令
  • 第19天应用程序
  • 第20天API
  • 第21天保护操作系统
  • 第22天C语言应用程序修改为ELF格式
  • 第23天应用程序图形处理
  • 第24天窗口操作
  • 第25天更多窗口
  • 第26天窗口操作提速
  • 第27天LDT与库未按书上处理
  • 第28天文件操作与文字显示不包含日文显示部分

本项目不继续添加第29天以及第30天的内容有兴趣的朋友可继续阅读后续章节。

待解决问题

  • 定时器执行若使用io_sti而非io_stihlt时会卡死
  • 启动时偶尔黑屏,无法正常绘制界面
  • 多个命令行同时执行命令时会卡死
  • 第28天中__alloca无效,sosu2无法运行

博客文章

版权信息

项目中代码版权主要归原书作者所有,本人仅针对无法直接运行的部分对该代码作出部分修改。