仔细阅读《自己动手写操作系统》的前三章,作者于渊,电子工业出版社。前三章,熟悉初启过程的程序开发环境,编程过程。熟悉实模式,保护模式的概念。
i. Sudo apt-get install build-essential>
ii. Sudo apt-get install g++
iii. Sudo apt-get install xorg-dev
iv. Sudo apr-get install libgtk2.0-dev
下载地址:https://sourceforge.net/projects/bochs/files/下载bochs-2.6.11.tar.gz
进入解压后的文件夹bochs-2.6.11,执行configure脚本,来开启调试和反汇编功能。
sudo ./configure --enable-debugger --enable-disasm
在文件夹bochs-2.6.11内打开终端,执行
sudo make 2>>log.txt
2>>log.txt是一个错误输出重定向,将报错输出到log.txt中)
执行完检查一下log.txt 如果没有问题进行下一步
sudo make install 2>>log.txt
(我记得我在make install时有一个报错,但是我忘了是啥了,他没有在终端显示,但是确实(maybe)会影响后面的实验,百度一下吧应该不难…)
在bochs-2.6.11文件夹内有一个文件bximage,在终端打开它:
输入./bximage
我们可以把生成的lalala.img拿出来,放到一个文件夹里(博主这里是MyOS)
还记得第一章的那个boot.asm文件吗?编译他生成boot.bin
将生成的boot.bin与lalala.img放在同一个文件夹下,如下
在这个文件夹里打开终端,输入命令写入软盘映像:
dd if=boot.bin of=lalala.img bs=512 count=1 conv=notrunc
boot.bin就是你刚刚编译boot.asm得到的,
lalala.img就是之前bximage生成的软盘映像。
(这一步很关键,不弄好的话错误很多)
###############################################################
# 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-elpin-2.40
# what disk images will be used
floppya: 1_44=lalala.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:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
我的bochsrc会和网上的大部分教程的不一样,但是检验标准就是你报不报错,以及你的这个文件目录是否有这个文件
①:教材上给的是romimage:
file=/usr/share/bochs/BIOS-bochs-lates,但是你可以打开自己的/usr/share/文件夹,发现并没有bochs文件夹更别说BIOS-bochs-lates了,而你打开/usr/local/share/bochs/就可以找到BIOS-bochs-latest。
②:这个值其实我也不太懂为什么是这个,但是一个教程里(https://www.iteye.com/blog/sy198704-1025037)写,他在官方给出的示例中看到是这个路径,于是我就这样子写了。(usr/local/share/bochs/文件夹里我尝试了其他两个文件,发现不能输出Hello
,OS world)
③:你上面生成的lalala.img
④:同①,你可以在该地址找到这个键盘文件
输入6选择功能,会弹出一个窗口:
Hello,OS world!
另外,一些同学可能输入6后,出现bochs:1 这是处于bochs调试模式:
需要输入c,继续运行就可以了
附指令大全:
此外我们还可以:
nasm pmtest1.asm -o pmtest1.bin(先检查一下第8行地址应为07c00h)
dd if=pmtest1.bin of=lalala.img bs=512 count=1 conv=notrunc
bochs -f bochsrc
看到pmtest1.asm的效果,一个红色的P。
但是作者并不喜欢上面那个方法,因为可能有个隐患,就是引导扇区空间有限,只有512个字节,如果我们的程序越来越大超过了512个字节这方法 就不灵了,所以我们得想个更好的方法。
从网站:http://bochs.sourceforge.net/diskimages.html下载freedos-img(需要挂梯子)
在解压之后,文件内有一个a.img,将他重命名为freedos.img,然后复制到我们的文件夹中(MyOS)
自由命名,记住就可,这里我生成的是pm.img(移动到MyOS)
###############################################################
# 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-elpin-2.40
# what disk images will be used
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=pm.img, status=inserted
# choose the boot disk.
boot: a
# where do we send log messages?
log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
输入:bochs -f bochsrc
输入:6
输入:c
在弹出的窗口上输入:format b:
关闭窗口
(先将第8行中的07c00h改为0100h)
nasm pmtest1.asm -o pmtest1.com
(如果执行成功,什么也不会显示)
①sudo mount -o loop pm.img /mnt/floppy/
大概率报错mount point /mnt/floppy does not exist 就是说那个地方没有这个文件夹,创建一个就好: 进入mnt目录:sudo mkdir floppy
②sudo cp pmtest1.com /mnt/floppy/
③sudo umount /mnt/floppy
输入:bochs -f bochsrc
输入:6
输入:c
在弹出的窗口上输入:b:\pmtest1.com
可以看到窗口左侧出现了一个红色的P
只需要编译pmtest2,3…9.asm---->pmtest2,3…9.com后
①sudo mount -o loop pm.img /mnt/floppy/ (执行一次)
②sudo cp pmtest2.com /mnt/floppy/
sudo cp pmtest3.com /mnt/floppy/
……
sudo cp pmtest9.com /mnt/floppy/
③sudo umount /mnt/floppy (执行一次)