调试环境搭建

操作系统相关的代码,始终还是代码,即肯定需要相应的调试工具。

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很相似,支持断点调试且很多命令包括简写都一致:

 

posted @ 2019-05-02 16:23  Crystal_Guang  阅读(435)  评论(0编辑  收藏  举报