操作系统相关的代码,始终还是代码,即肯定需要相应的调试工具。
Bochs是一种十分轻便的使用c++编写的开源IA-32(x86)电脑模拟器,可以运行在最受欢迎的平台上。能仿真英特尔x86 CPU、常见的I/O设备、和定制的BIOS,支持断点调试,调试方法和GDB非常相似。
现在官网下载Bochs的源码:
然后将其拷贝到ubuntu下:解压缩:tar -zxvf bochs-2.4.5.tar.gz
然后执行:
./configure --enable-debugger --enable-disasm
此时可能会报错 :
ERROR: X windows gui was selected, but X windows libraries were not found.
解决办法:
sudo apt install xorg-dev
但是此时可能又会出现这样的情况:
0% [Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]
解决办法:
先执行:sudo nano /etc/gai.conf
然后找到这行命令:#precedence ::ffff:0:0/96 100 把“#“去掉,保存退出即可。
再次执行 sudo apt install xorg-dev即可安装成功。
然后,再运行:./configure --enable-debugger --enable-disasm
又可能出现:
Package gtk+-2.0 was not found in the pkg-config search path.Perhaps you should add the directory containing `gtk+-2.0.pc'to the PKG_CONFIG_PATH environment variableNo package 'gtk+-2.0' foundERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.Install pkg-config and the gtk+ development package,or disable the gui debugger, or the wxWidgets display library (whichever is being used).
解决办法:
sudo apt install libgtk2.0-dev
之后,再次执行./configure --enable-debugger --enable-disasm,紧接着执行make,又可能出现:
解决办法:
在Makefile的92行增加链接库 pthread:
然后,再make,最后sudo make install即可安装完成。
安装成功之后,执行bochs,选择选项6,得到:
现在即完成了第一阶段的任务,虽然此时的bochs有发出不能打开硬件设备的错误信息。
主引导程序肯定是使用汇编编写的,同时微软的.asm后缀汇编,无法使用gcc编译(特意查了一下,使用gcc编译.asm文件,似乎很棘手):
所以我们安装了nasm这个工具,NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序。apt install nasm 安装即可:
然后我们准备一份汇编代码,boot.asm,使用nasm将其编译成bin文件:nasm boot.asm -o boot.bin( 之所以这样,还是因为参考资料使用.asm后缀的汇编,但是什么编译器并不是重点,这段boot.asm的X86汇编也不是重点,目前我主要是使用ARM 汇编,但是这个教程是X86的,也不排除之后在公司是开发X86,但是汇编只用作简单了解即可,重点是先搭建好环境并调试程序,让我们对引导操作系统有个全局认识)。
在使用bximage(一个制作软盘的工具)生成a.img软盘文件:
最后,我们需要将编译好的二进制文件导入在软盘中,使用dd命令,将boot.bin文件导入软盘a.img中:
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,参考链接(点击)
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc 其中if表示输入文件名, of表示输出文件名, bs=bytes:同时设置读入/输出的块大小为bytes个字节, count=blocks:仅拷贝blocks个块,块大小等于bs的字节数,conv=conversion:用指定的参数转换文件,notrunc:不截短输出文件。
boot.asm:
org 0x7c00 start: mov ax, cs mov ss, ax mov ds, ax mov es, ax mov si, msg print: mov al, [si] add si, 1 cmp al, 0x00 je last mov ah, 0x0e mov bx, 0x0f int 0x10 jmp print last: hlt jmp last msg: db 0x0a, 0x0a db "Hello, YGOS!" db 0x0a, 0x0a times 510-($-$$) db 0x00 db 0x55, 0xaa
现在,我们还需要配置Bochs的启动项:
############################################################### # 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/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 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
上面的红色部分是需要填写的路径。同时,我们又需要apt install vgabios这个显卡工具,需要注意的是,这个步骤完成之后,才有
vgaromimage: file=/usr/share/vgabios/vgabios.bin 这条指令的路径。
安装之后,我们可以使用which bochs ,whereis vgabiso找到主路径,然后根据上面的标红路径完成bochs的启动文件配置。
在终端输入bochs之后,系统会自动在当前目录下寻找 .bochsrc或bochsrc或bochsrc.txt文件,如果找到有三者之一并语法和逻辑正确,则根据启动文件正常执行bochs。本文使用bochsrc作为其启动文件。bochs也可以显示使用bochs -f bochsrc_file(启动文件名)的方式,这和make寻找makefile的规则一致。
配置好bochs的启动问价那之后,输入bochs之后,调试界面不再出错,并且停止在程序最开始的地方:
此时,和GDB操作一样,我们输入continue或者c,得到:
可以看到,我们的汇编程序,即引导程序,在X86模拟器上的开机画面,打印出了Hello,YGOS!这样,我们就成功安装好了调试环境,并且,还成功将一个简单的引导程序使用bochs模拟器正确运行了起来尽管目前主引导程序并不完善。
前面也有说到,bochs和GDB很相似,支持断点调试且很多命令包括简写都一致: