自己动手写操作系统系列之----------搭建开发环境
本帖最后由 冰琥珀 于 2015-10-17 18:59 编辑操作系统,一个庞大而又复杂的世界,让无数想学习它的同学望而却步。虽然市面上也有很多关于操作系统的书籍,但很多都是描述型的,不能自己亲自动手实践,而且又都是大部头书,往往都是看了后面就忘了前面。几年前,于渊的自己动手写操作系统横空出世,让我们自己编写一个小型的操作系统成为了可能,从今天起,我们就一起来学习下这本书,一起自己动手编写一个微型的操作系统,相信当我们学完了这本书之后,再去看其他的书籍,就不会再是云里雾里。
相关资料:http://pan.baidu.com/s/1kTERffx
首先我们需要一台安装有linux系统的机器(可以是虚拟机),我自己的电脑装的ubuntu15.04,接下来需要安装bochs,步骤如下
1.下载bochs,网址:http://bochs.sourceforge.net/
2.解压下载的压缩包
3.运行./configure --enable-debugger --enable-disasm
4.make
5.makeinstall
当然了,你也可以在ubuntu下直接运行sudo apt-get install bochs bxinmage来安装,安装完成后,我们需要一个配置文件,这样才能启动bochs,网上有很多的配置文件,我这里给出一个很简单的配置文件,其实也是网上copy下来的
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
需要注意的就是要根据实际情况修改下列的路径(可能是/usr/share/bochs 或/usr/local/share/bochs)
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
还需要注意的一点就是,如果是下载最新的安装包,可能keyboard_mapping: enabled=1, map要改为keyboard:keymap
上面这些做好之后,我们就可以通过命令
bochs -f bochsrc.bxrc
来运行bochs,其中bochsrc.bxrc 是上面的配置文件名。
虚拟机安装好了,接下来我们要安装nasm,直接运行$sudo apt-get install nasm来安装即可。到了这里,前期的准备工作基本完成,下面我们就开始写一个简单的程序来做下测试,代码如下
org 0x7c00
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
call DispMsg
jmp $
DispMsg:
mov ax, Message
mov bp, ax
mov cx, 0x0a
mov dx, 0x1500
mov bx, 0x000c
mov ax, 0x1301
int 0x10
ret
Message: db "Hello, OS!"
times 510-($-$$) db 0
dw 0xaa55
文件名保存为Boot.asm,然后我们通过如下命令来编译
$sudo nasm Boot.asm -o Boot.bin
编译完成后,我们需要在bochs中运行,在这里我们需要创建一个软盘,步骤如下
1.$sudo bximage,在界面中输入1,然后按下回车
2.我们选择创建软盘,所以这里输入fd
3.这里我们使用默认的大小,所以直接按回车
4.输入软盘的名子,默认为a.img
以上步骤如下图所示
软盘创建成功之后,我们要把刚才生成的Boot.bin写入软盘中,命令如下
$sudo dd if=Boot.bin of=boot.img bs=512 count=1 conv=notrunc
上面的命令需要根据自己的实际情况设置输入(if)和输出(of)文件路径,完成了之后,我们就把这个img文件放到bochsrc.bxrc同目录下,并修改bochsrc.bxrc中floppya: 1_44=a.img, status=inserted的a.img为刚才创建的img文件,这些都做好了之后,我们就可以使用bochs -f bochsrc.bxrc命令来运行虚拟机了,如下图
这里我们才终端输入c,然后按回车运行,就可以看到下面的界面了
上面的代码也很简单,就只是调用了一个显示函数,在屏幕中显示"Hello, OS!",有一点汇编基础的都能看懂,唯一要注意的就是下面这两行代码
times 510-($-$$) db 0
dw 0xaa55
因为我们是直接把代码写在引导记录里,而引导记录占用一个扇区(512个字节),最后两个字节是0xaa55,剩下的全部用0填充,所以是510-($-$$),其中$是当前代码行的地址,$$是当前段的地址,因为我们这里只用了一个段,所以当前代码行减去当前段就等于除去我们所写代码占用的字节后,剩余的字节数
这篇只是开始,相对来说比较简单,我们就将到这,接下来我们会讲怎么通过引导记录来找到内核并加载,汇编不太熟悉的同学可以去看看王爽的汇编语言
有不明白的就回帖提问,灌水就免了,如果灌水太多我可能就不会继续更新下去,所以希望大家能自觉
攻防小组的人就是屌:Q 攻防小组的人就是屌 看到这 我在想要不要学习英文了呢? 冰琥珀好流弊 牛逼啊,影藏的大牛 冰琥珀就是吊! 支持,看起来不错呢! 还是不错的哦,顶了 支持,看起来不错呢!