默认读者会基本的Linux命令,以及会用Linux下任意一种编辑器
这本书的第一版《自己动手写操作系统》里作者似乎使用的是windows来进行开发,到了第二版主要使用Linux,书里第二章还专门论述了一下换平台的原因……总之,作为程序员,会Linux是很必要的,因此,我也决定使用Linux来进行学习。
Linux版本:ubuntu16.04 LTS 32位(因为之前用来改过Linux-0.11的源码,当时配置的环境就是32位,所以就懒得再换64位了)
直接官网下载用VM-ware安装就好了。
然后安装第一章中需要的NASM
sudo apt install nasm
然后用编辑器之神vim编辑引导程序保存为boot.asm
org 07c00h ; 告诉编译器程序加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串例程 jmp $ ; 无限循环DispStr: mov ax, BootMessage mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串长度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h ; 10h 号中断 retBootMessage: db "Hello, OS world!"times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55 ; 结束标志
然后在shell中将其汇编
nasm boot.asm -o boot.bin
接下来要安装 bochs 直接到这里下载 https://sourceforge.net/projects/bochs/files/ 我选择的是当前最新版,2.6.9下载后解压
sudo tar zxvf bochs-2.6.9.tar.gz
安装bochs的步骤就照着书上的来,但是可能会出现一些问题,因为bochs是用gtk开发的,所以首先要安装gtk
sudo apt-get install build-essential xorg-dev libgtk2.0-dev
之后再
cd bochs-2.6.9./configure --enable-debugger --enable-disasmsudo makesudo make install
然后要创建一个软盘映像文件img
bximage
bochs 2.6.9是这样的界面,和书上不一样,所幸没有什么太难的英文,这里一看就选1
选1之后的界面就和书上的一致了,除了第一个要输入的地方输入fd以外,后面就回车就好了,不再截图。
接下来要把引导程序写到软盘映像img里面
使用dd命令
dd if=boot.bin of=a.img count=1 conv=notrunc
接下来要配置bochs环境参数
# Configuration file for Bochs################################################################ how much memory the emulated machine will havemegs: 32# filename of ROM imagesromimage: file=/usr/share/bochs/BIOS-bochs-latestvgaromimage: file=/usr/share/vgabios/vgabios.bin# 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 mousemouse: enabled=0# enable key mapping, using US layout as default.keyboard:keymap=/usr/share/bochs/keymaps/x11-pc-us.map #注意:这一行我改动过了,和书上的不一样,因为bochs的版本变动,关于keyboard参数书写的格式有变动, #要把keyboard_mapping改成keyboard,还有map要改成keymap,还有中间的那句enabled=1也要删掉,这里真是纠结半天-_-||对了,这个环境参数保存成bochsrc和上面几个文件放一起,方便
接着输入
bochs -f bochsrc
然后按6回车就可以开始进行调试啦
注意:这里黑框框啥都没有是正常的,因为这个模拟是单步运行的,所以需要你输入命令来让他运行,所以这里直接输入c让他运行直到碰到断点(当然我并没有设断点),然后回车
就 Hello, OS world!了