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

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


(未完待续)


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

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值