操做系统相关的代码,始终仍是代码,即确定须要相应的调试工具。html
Bochs是一种十分轻便的使用c++编写的开源IA-32(x86)电脑模拟器,能够运行在最受欢迎的平台上。能仿真英特尔x86 CPU、常见的I/O设备、和定制的BIOS,支持断点调试,调试方法和GDB很是类似。ios
如今官网下载Bochs的源码:c++
而后将其拷贝到ubuntu下:解压缩:tar -zxvf bochs-2.4.5.tar.gz 编程
而后执行:ubuntu
./configure --enable-debugger --enable-disasmwindows
此时可能会报错 :app
ERROR: X windows gui was selected, but X windows libraries were not found.ide
解决办法:工具
sudo apt install xorg-dev
可是此时可能又会出现这样的状况:
解决办法:ui
先执行: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很类似,支持断点调试且不少命令包括简写都一致: