欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

读书笔记:Orange's 一个操作系统的实现(1) - 实验环境搭建和引导扇区的编写

程序员文章站 2022-06-19 16:46:37
...

最近自己准备开始自学操作系统原理知识和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 !字样。


(未完待续)


咳咳,好不容易写完了,看上去那么简单的东西,写下来才发现要讲清楚真是不一般的费劲。

今后会不定期更新这个博客,把自己从书上学到的以自己的方式重新呈现出来,并对书中一些讲得逻辑不是很清晰的地方进行补充。

相关标签: 操作系统 汇编