今天闲来无事,把于渊的大作《一个操作系统的实现》的第一章又仔细看了一遍.
这里把实验过程记录下来,供后来者参考.
主要参考了
https://www.cnblogs.com/lfri/p/11489223.html
和
https://www.jianshu.com/p/dca5270d7310
两篇文章里的步骤.这里表示感谢.
一、安装bochs
1、我的硬件环境为dell笔记本insprion 5580
2、首先在dell上安装ubutn16.04 lts.过程略
3、下载bochs源码.地址为
https://jaist.dl.sourceforge.net/project/bochs/bochs/2.6.11/bochs-2.6.11.tar.gz
4.进入到源码所在目录.执行
sudo tar zxvf bochs-2.6.11.tar.gz
cd bochs-2.6.11
5.执行
sudo ./configure --enable-debugger --enable-disasm
注意参数开头是两个减号,我第一次实验的时候就少输了一个,然后就得到一堆错误...
6.此时会自动生成一个Makefile文件
要修改它的内容,把第88行改为
CXXFLAGS = -std=c++11 -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -pthread $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"'
即在右边的开头加入编译选项 -std=c+11,
否则的话下一步的make会编译不过!
7.执行
sudo make
8执行
sudo make install
9.执行bochs命令如果有输出,就说明bochs安装成功
二、写一个最简单的loader
1、把随书源码中的第一章的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 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
2、执行
nasm -o boot.bin boot.asm
编译成功后会得到一个boot.bin文件
3、执行
bximage
这个命令的功能是制作一个软盘镜像文件
选择1制作软盘,然后选择fd,然后剩下的直接回车就好了。现在的工作文件夹下生成一个a.img文件,这就是我们的软盘了。
如果想用命令行一次生成a.img,可以用下面的命令
bximage -q -mode=create -fd=1.44M a.img
4、执行
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
这是把刚才写好的二进制启动代码写入软盘的引导扇区
5、新建一个bochsrc文件,内容为:
# 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=1
# enable key mapping, using US layout as default.
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
这里的关键点就是要正确设置romimage和vgaromimage的路径.
6、执行
bochs -q -f bochsrc
如果不加-q参数,运行后可能无法结束虚拟机
7、
然后在终端窗口输入c,表示真正执行这个虚拟机,就会看到helloword
8、在虚拟机窗口里用鼠标点右上角的电源图标,即可关闭虚拟机