最近自己准备开始自学操作系统原理知识和Qt5,因此买了本《Orange's 一个操作系统的实现》。
本人自认为自己当个老师还算是非常称职的,因此就在这里把学到的现炒现卖一遍。
废话不多说,今天开始讲最基础的。
操作系统建议使用Ubuntu,原因很简单,开源、方便。
不过可惜的是,本人的New Surface Pro暂不清楚怎么安装Ubuntu,因此就在Windows 10下搭建了。
1. 安装nasm。nasm是汇编编译器,能够把汇编代码编译为机器码在虚拟机上执行。
登录nasm官网 http://www.nasm.us/,能够下载它的最新版本,安装时,建议安装到C:\nasm,不要用它默认的那个很长的目录位置。
安装完毕之后,将安装目录(也就是刚才输入的C:\nasm)添加到环境变量PATH中,这样,你就可以在命令行中直接执行nasm了。
(如果你使用linux,那么可以用命令 apt-get install nasm进行安装。)
2. 安装dd for windows。如果你使用ubuntu,那么可以跳过这一步。
这里直接给出下载链接: http://www.chrysocome.net/downloads/dd-0.5.zip
下载完成之后,把解压出来的dd.exe拷贝到nasm的目录下,这样就可以在命令行中直接使用了。
3. 安装虚拟机Bochs。其实Bochs是一个计算机的模拟器而非虚拟机,因为它更侧重于真实地模拟一个计算机的一举一动,而不注重具体的执行效率,这正好适合我们来学习操作系统。在它的官网http://bochs.sourceforge.net/ 上,可以下载到最新版本2.6.9。安装时记得把DLX Linux Demo勾选上,将来用的时候能够参考里面的示例来编辑我们自己的配置文件。
这样,开发环境就算搭建好了。接下来,按照书上第一章的描述,我们来写一个最简单的引导扇区。
新建一个文件,更名为boot.asm,使用文本编辑器,例如Sublime Text 3, 输入以下代码
org 07c00h ;伪指令,告诉编译器,我们这段代码要被加载到内存地址7c00h处开始执行
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用子函数DispStr,打印字符串“Hello, OS world !”
jmp $ ; $表示当前行, jmp到当前行即无限循环
DispStr: ; 子函数,在寄存器中设置好参数,然后调用10号中断显示欢迎字符串。
mov ax, BootMessage
mov bp, ax ; 字符串起始地址为[es:bp]
mov cx, 16 ; 连续打印16个字符
mov ax, 01301h ; ah 为13h,表示在Teletype模式下打印字符串,
; al 为01h,表示输出模式为“属性在bl中,原始字符串不含属性,每次显示一个字符”
mov bx, 000ch ; bl 为0ch,表示字符串为红色
mov dl, 0 ; dl = 0, 从第0列开始打印
int 10h ; 调用10号中断, 打印字符串
ret
BootMessage: db "Hello, OS world !" ; 定义一个“Helloworld”字符串
times 510-($-$$) db 0 ; $$表示当前段的开头地址,$-$$即当前行到本段开头的距离,
; 510 - ($ - $$) 即用0填充,一直到本段的第510个字节处
dw 0xaa55 ; 计算机会将最后两个字节为"0xAA55"的扇区当成一个引导扇区
; 并加载到7c00h处开始执行,这也与开始处的伪代码形成呼应
这段代码作用很简单,就是在屏幕上用红字显示Hello, OS world ! ,然后就死循环。
注释中已经详细说明了每一行的作用。
其中关于10号中断,更加详细的信息请参考这个链接 http://blog.sina.com.cn/s/blog_5dc23d5d0100kebg.html
在命令行下,执行 nasm boot.asm -o boot.bin, 编译为一个二进制文件。
执行 dd if=/dev/zero of=a.img bs=1440k count=1 ,生成一个1.44M的软盘镜像
执行 dd if=boot.bin of=a.img bs=512 count=1 , 将二进制文件输出到软盘镜像。
如果你使用的是Linux,那么可以直接执行命令
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
dd for Windows 由于没有conv参数,所以不得不分为两步来执行。
然后,使用bochs虚拟机加载软盘镜像a.img (细节待补充) ,就可以看到,虚拟机启动之后在屏幕上显示了红色的 Hello, OS world !字样。
(未完待续)
咳咳,好不容易写完了,看上去那么简单的东西,写下来才发现要讲清楚真是不一般的费劲。
今后会不定期更新这个博客,把自己从书上学到的以自己的方式重新呈现出来,并对书中一些讲得逻辑不是很清晰的地方进行补充。