30天自制操作系统
前言
手写操作系统,听起来就是一件不可能完成的工作。但如果不去了解操作系统也就无法写出高效率的程序。手写操作系统注定是一个非常艰辛的过程或者说回报是不确定的。就个人而言我比较喜欢去了解事物发生的源头,所以不去了解底层原理我的大脑中就会一直有疑问。
虽说现在学习资源很好获得,但你能用的又有多少,其实到最后你可能发现谁都无法帮你解决问题,到最后都是你自己解决问题。网上的学习资料鱼龙混杂你根本找不到你真正所需要的,搞不好会落入营销号的圈套。到最后都会回归到书本,你最讨厌学的,最枯燥的往往是重要的。
现在我基于《30天自制操作系统》这本书去实践写一个简单的操作系统。
这是一个挑战,我无法确定我是否可以完成这个艰巨的任务。
准备工作
在这本书中的内容无法完全采用。
所使用的工具gcc,make,nasm,bochs
平台:ubuntu
nask和nasm的区别
这里不使用书中的nask编译器,直接使用nasm编译器。nask和nasm区别不大。其中主要的差别如下:
1 | nask代码 NASM代码 |
如何启动bochs
启动Bochs虚拟机
-
显式方式:
bochs -f bochsrc_file -
隐式方式:
bochs -
当前目录下的启动文件优先级:
(从上往下依次查找当前目录下是否有如下启动文件)
- .bochsrc
- bochsrc
- bochsrc.txt
其中bochs启动配置
1 | #注意'#'后面为注内容 |
目前可能我们还缺软盘,好在bochs中bximage命令可以制作软盘。Bochs 自带了一个叫做 bximage
的工具,直接在控制台执行,就会看到一个 TUI 向导:
1 | ======================================================================== |
Bochs中的常用调试命令
命令 | 功能 | 示例 |
---|---|---|
b(break) | 设置断点 | b 0x7c00 |
c(continue) | 继续执行 | c |
s(step) | 单步执行 | s |
info b(info break) | 查看当前所有断点 | info b |
info cpu | 查看当前CPU状态 | info cpu |
r(reg) | 查看常规寄存器状态 | r |
sreg | 查看段寄存器状态 | sreg |
x /Nuf expression | 查看内存中的数据 | x /2bx 0x7c00 |
trace on[off] | 开关:打开执行的指令 | trace on |
trace-reg on[off] | 开关:打开寄存器的值 | trace-reg on |
第一天
代码
1 | ; hello-os |
第二天
简单介绍汇编和makefile的使用
代码ipl.asm
1 | ; hello-os |
第三天
asmhead.nas
1 | ; haribote-os boot asm |
bootpack.c
1 | /* 告诉C编译器,有一个函数在别的文件里 */ |
ipl10.nas
1 | ; haribote-ipl |
naskfunc.nas
1 | ; naskfunc |
第四天
第五天
第六天
第七天
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱宁空间!