寒假OS笔记第一天
本次寒假的目标:自制一个toy kernal
今天准备完成的事情:
找到自制OS所需要的资料
开始第一行代码
寻找资料
在知乎的这个专题和这个专题找到了很多很有帮助的回答:
https://www.zhihu.com/question/25628124
https://www.zhihu.com/question/22463820
从中总结出来的是:
- 一个人写一个Demo级别的OS是绝对可行的
- 《30天自制操作系统》这本书只适合beginner,不适合计算机专业的学生
- 看英文材料是必经之路,逃不掉的
- …
从这些地方收集到的资料有:
-
Bran’s Kernal Development Tutorial
一个bootloader是GRUB的操作系统编写教程
https://link.zhihu.com/?target=http%3A//www.osdever.net/bkerndev/Docs/gettingstarted.htm -
Xv6
一个简单的Unix-like的教学操作系统
https://link.zhihu.com/?target=https%3A//pdos.csail.mit.edu/6.828/2011/xv6.html -
hurlex
一个github上的简短的操作系统教程
http://wiki.0xffffff.org/ -
linux 0.11内核详解/剖析
一本书,年代久远,怀疑内容会不会过时 -
BrokenThorn Entertainment
http://www.brokenthorn.com/Resources/OSDevIndex.html
稍微看了一些目录,感觉还不错 -
JamesM’s kernel development tutorials
https://link.zhihu.com/?target=http%3A//www.jamesmolloy.co.uk/tutorial_html/
现在和以前不一样了,以前什么资料都没有,一清二白,能自己写出内核的那都是真正的大佬。现在的资料比以前多多了,但是筛选资料的难度也增大了。
我准备这些都参考参考。先看一些简单的入个门,然后再深入了解。
此外,我手上目前还有的参考书有一本操作系统概念。
规划
今天先看个有中文的,构造一下概念,然后再看英语的教程。
有中文的教程目前看来只有hurlex了
http://wiki.0xffffff.org/
正式笔记
第一个参考的文档是hurlex
我发现它也是本科生写的。
而且它是基于JamesM’s kernel development tutorials写的。
先看看这个文档的架构
首先是对计算机启动过程等等的概述,其次是按部就班的各个步骤,看起来逻辑很清晰的样子,最远到了内存线程的创建和切换,估计JamesM’s kernel development tutorials最远也只到这附近
每一篇文章的篇幅都并不是很长(对我来说)
算是一个比较简单的能让我建立一个概念的教程吧
Hurlex教程学习——开发环境
这个hurlex是建立在x86架构CPU的保护模式下的。
问题1:什么是CPU的保护模式
CPU有至少两个模式:实模式,保护模式。CPU刚刚启动的时候就是以实模式启动的,是一个速度很快的8086,等到操作系统接管后,它进入实模式,有了更多的功能
实模式和保护模式最大的不同在与地址转换方式
它的开发环境、工具、语言为:
- linux系统
- C语言
- gcc编译器
- GUN make构建工具
- qemu虚拟机
第一步,下载qemu虚拟机
我用的是ubuntu 20.4 LTS
使用如下指令进行安装:
$ sudo apt install qemu
但是之后我这里并不是和教程一样,在/usr/bin
目录下面有一个qemu-system-i386
的文件
另外,使用locate qemu
也找不到我任何下载过了的蛛丝马迹
淦
深思熟虑之下决定使用sudo apt purge qemu
先卸载了,然后用bochs
bochs是另外一款虚拟机
其实还可以使用vmware,但是我嫌它太笨重了。
使用sudo apt install bochs
来进行下载
bochs从来没用过,我估计得花点时间学一学
第二步,开发过程中使用的脚本文件
这个教程直接给出了一个makefile
但是作为一个成熟的开发者,我才不会用现成的makefile,我当然得自己写一个
所以先跳过这一段
bochs的配置文件
经过十五分钟的学习后,我大概懂了bochs配置文件怎么写
# 能使用的内存大小,单位为mb
megs: 32
# ROM文件,这个文件在/usr/share/bochs里面能找到,但是bochs自己提供了BXSHARE这个环境变量
romimage: file="$BXSHARE/BIOS-bochs-latest"
vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest"
# 软盘。因为我们的目的是生成系统镜像,然后使用bochs运行,这个系统镜像就相当于软盘。有一个软盘就用floppya,两个就是 floppyb,以此类推
floppya: 1_44=floppy.img, status=inserted
# 设置启动设备
boot: floppy
# 鼠标是否启用
mouse: enabled=0
# 启用键盘映射,现在的版本的bochs使用keyboard而不是keyboard_mapping
keyboard: keymap="$BXSHARE/keymaps/x11-pc-us.map"
# CPU配置
clock: sync=realtime
使用man bochsrc
能获得详细的使用文档
在用户的家目录下创建.bochsrc
,内容就是上面的这些内容
使用bochs
试运行
提示错误:
00000000000p[ ] >>PANIC<< dlopen failed for module 'x' (libbx_x.so): file not found
使用apt-file search libbx_x.so
,发现少下载了bochs-x
$ apt-file search libbx_x.so
bochs-x: /usr/lib/bochs/plugins/libbx_x.so
bochs-x: /usr/lib/bochs/plugins/libbx_x.so.0
bochs-x: /usr/lib/bochs/plugins/libbx_x.so.0.0.0
赶紧用sudo apt install bochs-x
下一个
再次运行,出现一个小黑框。因为我们的软盘floppy.img
根本不存在,所以是小黑框
命令行输入q
就能关掉
恰个午饭再说,上午的工作就这些吧(因为我睡到十一点才起床所以啥都没干)
三,计算机启动过程、GRUB、multiboot
计算机启动过程,这篇教程给出了一篇博客:http://www.ruanyifeng.com/blog/2013/02/booting.html
此处我做一些简单的总结
首先,计算机必须先启动起来才能正常运行程序,但是不运行程序计算机又不能启动,因此,计算机的启动是一个很矛