跳转至

bocsh安装指南, 必看, 这个软件有坑

一、配置思路

首先我们要明白一件事:bochs的调试方式有好几种。你可以使用bochs自带的调试功能进行调试,也可以使用gdb进行调试。但二者是相互矛盾的,你不能在1个配置好的bochs模拟器上使用两种调试方法。举个例子,在我的之前的那期文章中,我使用的的是bochs自带的调试功能,因此我无法在这台配置好的bochs模拟器上使用gdb进行远程调试。解决方法也很简单:配置两台不同的bochs就好了。(反正也占不了多大空间)

二、配置过程

1. 下载安装包并解压

首先下载安装包,然后解压并修改bug。(至于如何下载bochs并修改bug可以去看我的第一期文章

2. 复制出第二份解压后的文件

新建一个文件夹,把修改完后的bochs-2.6.11整个文件夹放进去。把bochs-2.6.11文件夹复制两份并对其中一份进行重命名(和另一个名字不同就行)。两个文件夹分别用来配置使用自带调试功能的bochs和使用gdb远程调试的bochs。我的两个文件夹的名字分别是bochs-2.6.11(配置自带调试功能)和bochsgdb-2.6.11(配置gdb远程调试功能)。

3. 配置自带调试功能的bochs

首先我们来配置自带调试功能的bochs模拟器,在bochs-2.6.11文件夹下执行以下配置命令

./configure --with-x11 --with-wx --enable-debugger --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-plugins --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips  --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

以上部分和第一期文章完全相同。不同之处在这次多了一个配置参数:

./configure --prefix=/your_absolute_path/bochs

解释一下,prefix参数可以决定我们将bochs安装在哪里。(ubuntu系统下默认安装在/usr/local/bin目录下,好像是这个,我有点记不清了。)这次我们要装两个bochs,所以需要自定义一下目录。我选择另开一个文件夹装这两个bochs。需要注意的是,prefix接收的是绝对路径(在ubuntu下从/home开始)。

然后分别执行以下两条命令:

make
sudo make install

如果没有报错就是安装成功了,至于怎么修改.bochsrc和创建bochsrc的问题,请参考上一期文章

4. 配置使用gdb调试功能的bochs

然后我们来配置使用gdb远程调试的bochs。在bochsgdb-2.6.11文件夹下执行以下命令

./configure --with-x11 --with-wx --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-plugins --enable-a20-pin --enable-x86-64 --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips  --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo -enable-gdb-stub

这次的命令和上文的区别在于少了以下参数:

--enable-debugger

--enable-smp

此外还多了一个参数:

-enable-gdb-stub

当然了,路径还是要我们自定义的:

./configure --prefix=/your_absolute_path/bochsgdb

解释一下,

首先第一个参数的含义就是使用自带调试功能,第三个参数的含义是使用gdb远程调试功能,二者相互矛盾,所以删去第一个参数。

其次bochs-gdb的调试功能目前只支持单核,而--enable-smp和CPU多核心有关,因此我们需要把这个参数也删了。

prefix参数上文讲过,这里不再详述。

然后分别执行以下两条命令:

make
sudo make install

如果没有报错就是安装成功了。

然后我们还要做一件事:对这个新的bochs重命名,让它和之前的bochs区分。

我们只需要进入安装bochs-gdb的目录,然后执行以下命令

cd bin
sudo mv bochs bochs-gdb
sudo mv bximage bximage-gdb

至于怎么修改.bochsrc和创建bochsrcgdb(这个配置文件必须和另一个bochs的区分开)的问题,除了参考上一期文章外,我们还有个地方需要修改。这点我们后面会详述,不过首先我们需要做一件事:把bochs和bochs-gdb所在的路径添加到环境变量中。

5. 配置环境变量

Ubuntu 20.04 系统默认的shell是bash。如果你没有改过的话你需要在主目录下执行以下命令:

gedit .bashrc

如果你使用的是zsh的话把.bashrc换成.zshrc就行。

然后找个空行把以下代码加进去:

export PATH=/your_absolute_path/bochs/bin:$PATH
export PATH=/your_absolute_path/bochsgdb/bin:$PATH

这样以来环境变量也配置好了。

6. 修改bochs和bochs-gdb配置文件

bochs的文件配置方法请参考上一期文章,这里我们重点讲bochs-gdb的配置方法。

首先,bochs-gdb的配置是建立在bochs配置的基础上(bochs要配置的那些bochs-gdb一个也少不了,除了gui_debug)。而bochs-gdb多出的地方就是以下所展示的内容。

首先在bochsgdb-2.6.11文件夹下执行以下命令:

bochs-gdb

如果你把之前的那些东西配置好了的话,那么它是能正常运行的,这里我们选择选项3

img

然后选择选项16

img

然后选择选项2

img

再选择选项1

img

这里我们把no改成yes, 它会自动帮你把远程连接的端口设置为1234,然后一直按回车键返回最开始的菜单,选择选项4保存配置文件, 然后它会让你重命名文件,把配置文件命名为bochsrcgdb(或者什么其它名字)就行。执行的时候使用以下命令

bochs-gdb -q -f bochsrcgdb

把-f 后面的文件名改成你自己的bochs-gdb配置文件的名称就行了。

三、配置vscode

我的最终目标是在vscode中像调试普通程序一样调试系统内核。因此我们还得再做一些额外工作。

首先在vscode中打开你写操作系统的文件夹,然后配置.vscode文件夹。该文件夹里面要有两个文件:task.json和lauch.json。这里我把我的配置文件放上来以供各位参考:

//task.json
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc-9 生成活动文件",
            "command": "/usr/bin/gcc-9",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}
//launch.json
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "bochs-gdb: build and debug OS kernel",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/kernel.bin",//这个是我放编译好的内核文件的地方,你们看着修改
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerServerAddress": "localhost:1234",//远程调试的端口
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "/usr/bin/gdb"
        },
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc-9 生成活动文件",
            "miDebuggerPath": "/usr/bin/gdb"
        }

    ]
}

然后们就可以愉快的使用vscode调试系统内核了

有一些问题目前我用的编译命令

./configure   --prefix=/usr --without-wx --with-x11 --with-x --with-term --disable-docbook --enable-cpu-level=6 --enable-fpu --enable-3dnow --enable-disasm --enable-long-phy-address --enable-disasm --enable-pcidev --enable-usb --enable-all-optimizations --enable-gdb-stub --with-nogui --prefix=/home/coder/bochs-2.7/opt

clion的远程gdb调试配置

使用clion进行远程开发

img

如果调试不了, 查看clion的gdb控制台, 如果是提示找不到tmp/filepath目录之类的, 那么需要我们添加一个, 上面设置之后clion会给我们添加一个部署的配置, 里面添加映射

image-20230408114503406

注意, clion是不能对asm文件打断点的, 我们可以由外部函数,跳转进去

vscode任意文件打断点设置

image-20230408121421519