题目
仔细阅读《自己动手写操作系统》的前三章,作者于渊,电子工业出版社。前三章,熟悉初启过程的程序开发环境,编程过程。熟悉实模式,保护模式的概念。
- 理解保护模式、特权级、页式内存概念。
- 逐个编译和测试第三章的全部9个示例程序(编号pmtest1.asm ~ pmtest9.asm)
- 在完全读懂程序的基础上,给pmtest5.asm~pmtest9.asm中的任意一个程序的源代码中写上详细的注释。注释要求:
1)每个变量,每个宏,每个函数都要有注释
2)每个函数或每段都要介绍起作用,介绍其进入和返回的参数或机制
3)每个语句设置的位或域的含义或作用
4)流程的介绍:循环,分支,跳转的条件等
5)变量、宏、函数的引用处要说明声明和定义的出处,指明文件名和行号。
说明:因为作者这本书出了第二版《ORANGE’S:一个操作系统的实现》,内容大致相同,且可读性更好,所以这里是依照第二版完成的环境配置
个人环境说明:在VMware安装Ubuntu18.04
第一阶段:在虚拟机Ubuntu中安装bochs虚拟机
1.安装bochs所需环境:
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
2.进入 bochs 官网
下载地址:https://sourceforge.net/projects/bochs/files/下载bochs-2.6.11.tar.gz
3.解压该压缩包:tar vxzf bochs-2.6.11.tar.gz
4.执行configure脚本
进入解压后的文件夹bochs-2.6.11,执行configure脚本,来开启调试和反汇编功能。
sudo ./configure --enable-debugger --enable-disasm
5.安装bochs
在文件夹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)会影响后面的实验,百度一下吧应该不难…)
6.使用bochs创建一个软盘映象
在bochs-2.6.11文件夹内有一个文件bximage,在终端打开它:
输入./bximage
我们可以把生成的lalala.img拿出来,放到一个文件夹里(博主这里是MyOS)
7.将引导扇区写入软盘
还记得第一章的那个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生成的软盘映像。
8.编写配置文件bochsrc😊
(这一步很关键,不弄好的话错误很多)
###############################################################
# 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
④:同①,你可以在该地址找到这个键盘文件
9.运行bochs -f bochsrc
输入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。
第二阶段:在虚拟机上安装freedos
但是作者并不喜欢上面那个方法,因为可能有个隐患,就是引导扇区空间有限,只有512个字节,如果我们的程序越来越大超过了512个字节这方法 就不灵了,所以我们得想个更好的方法。
1.安装freedos
从网站:http://bochs.sourceforge.net/diskimages.html下载freedos-img(需要挂梯子)
在解压之后,文件内有一个a.img,将他重命名为freedos.img,然后复制到我们的文件夹中(MyOS)
2.使用bximage重新生成一个软盘映像
自由命名,记住就可,这里我生成的是pm.img(移动到MyOS)
3.修改bochsrc(下面标红的地方修改了)
###############################################################
# 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
4.启动Bochs,待FreeDos启动完毕后格式化B:盘
输入:bochs -f bochsrc
输入:6
输入:c
在弹出的窗口上输入:format b:
关闭窗口
5.编译pmtest1.asm生成pmtest1.com
(先将第8行中的07c00h改为0100h)
nasm pmtest1.asm -o pmtest1.com
6.将pmtest1.com复制到虚拟软盘pm.img上:
(如果执行成功,什么也不会显示)
①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
7.运行bochs
输入:bochs -f bochsrc
输入:6
输入:c
在弹出的窗口上输入:b:\pmtest1.com
可以看到窗口左侧出现了一个红色的P
8.之后运行建议
只需要编译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 (执行一次)
运行结果: