`

利用GDB和Bochs调试内核源代码

阅读更多

   本节说明如何在现有Linux系统(例如RedHat 9)上使用Bochs模拟运行环境和gdb工具来调试Linux 0.11内核源代码。在使用这个方法之前,你的Linux系统上应该已经安装有X window系统。由于Bochs网站提供的RPM安装包中的Bochs执行程序没有编译进与gdb调试器进行通信的gdbstub模块,因此我们需要下载Bochs源代码来自行编译。

   gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 0.11内核进行C语言级的调试。当然,Linux 0.11内核也需要进行使用-g选项重新编译。

14.13.1 编译带gdbstub的Bochs系统
   Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-2.2.tar.gz):

   http://sourceforge.net/projects/bochs/

   使用tar对软件包解压后会在当前目录中生成一个bochs-2.2子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:

[root@plinux bochs-2.2]# ./configure --enable-gdb-stub
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
...
[root@plinux bochs-2.2]# make
[root@plinux bochs-2.2]# make install

   若在运行./configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。


14.13.2 编译带调试信息的Linux 0.11内核
   通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 0.11系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的0.11内核模块来调试。这两种环境下都需要对0.11内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:

LDFLAGS = -M -x                                         // 去掉 -s 标志。
CFLAGS  =-Wall -O -g -fomit-frame-pointer \             // 添加 -g 标志。

   进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:

[root@plinux linux-0.11]# find ./ -name Makefile
./fs/Makefile
./kernel/Makefile
./kernel/chr_drv/Makefile
./kernel/math/Makefile
./kernel/blk_drv/Makefile
./lib/Makefile
./Makefile
./mm/Makefile
[root@plinux linux-0.11]#

   另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsect.s文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。

Image: boot/bootsect boot/setup tools/system tools/build
       cp -f tools/system system.tmp
       strip system.tmp
       tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > Image
       rm -f system.tmp
       sync

   当然,我们也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000来处理这种情况。


14.13.3 调试方法和步骤
   下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 0.11系统上编译出的内核代码分别来说明调试方法和步骤。

1 调试现代Linux系统上编译出的Linux 0.11内核
   假设我们的Linux 0.11内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:

   http://oldlinux.org/Linux.old/bochs/linux-0.11-gdb-rh9-050619.tar.gz

   使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解开这个软件包后,可以看到其中包含以下几个文件和目录:

[root@plinux linux-gdb-rh9]# ll
total 1600
-rw-r--r--    1 root     root        18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrc
drwxr-xr-x   10 root     root         4096 Jun 18 22:55 linux
-rw-r--r--    1 root     root      1474560 Jun 18 20:21 rootimage-0.11-for-orig
-rwxr-xr-x    1 root     root           35 Jun 18 16:54 run
[root@plinux linux--gdb-rh9]#

这里的bochs配置文件与其他Linux 0.11配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:

gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

运行这个实验的基本步骤如下:

(1).启动X window系统后打开两个终端窗口;
(2).在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“./run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);
(3).在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;
(4).在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;
(5).在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/main.c的main()函数处。

下面是运行gdb和在其中执行的一些命令示例。

[root@plinux linux]# gdb tools/system        
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) break main              
Breakpoint 1 at 0x6621: file init/main.c, line 110.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481
481     namei.c: No such file or directory.
       in namei.c
(gdb) cont                        
Continuing.
Breakpoint 1, main () at init/main.c:110    
110             ROOT_DEV = ORIG_ROOT_DEV;
(gdb) list                                  
105     {                       /* The startup routine assumes (well, ...) this */
106     /*
107      * Interrupts are still disabled. Do necessary setups, then
108      * enable them
109      */
110             ROOT_DEV = ORIG_ROOT_DEV;
111             drive_info = DRIVE_INFO;
112             memory_end = (1<<20) + (EXT_MEM_K<<10);
113             memory_end &= 0xfffff000;
114             if (memory_end > 16*1024*1024)
(gdb) next
111             drive_info = DRIVE_INFO;
(gdb) next
112             memory_end = (1<<20) + (EXT_MEM_K<<10);
(gdb) print /x ROOT_DEV                      
$3 = 0x21d                                  
(gdb) quit                                  
The program is running.  Exit anyway? (y or n) y
[root@plinux linux]#

坏男孩 2007-03-23 14:18 发表评论
分享到:
评论

相关推荐

    利用GDB和Bochs调试内核源代码.txt

    利用GDB和Bochs调试内核源代码.txt

    MinGW32+insight+bochs调试linux-0.11

    总结来说,这个主题涉及了Windows下的开源开发环境搭建,源代码级别的调试技巧,早期Linux内核的架构和调试,以及虚拟化技术的应用。对于希望深入理解操作系统和内核开发的IT专业人士来说,这是一个非常有价值的学习...

    Linux 内核调试环境

    接下来,我们来看看"debug-linux.JPG",这个可能是关于如何配置Linux内核调试环境的截图教程,可能包括如何设置Bochs的配置文件以加载和调试内核,以及如何使用GDB(GNU调试器)进行远程调试的步骤。GDB是Linux下最...

    安装bochs 工具之一 linux-0.11-gdb-rh9-050619.tar.gz

    Linux-0.11-gdb-rh9-050619.tar.gz是一个针对Bochs的扩展工具包,主要包含Linux 0.11版本的源代码和GDB(GNU调试器)的Red Hat 9版本,便于在Bochs环境中进行调试。 首先,我们来详细了解一下Bochs。Bochs是一个...

    可进行调试的linux 0.11代码

    5. **修改与测试**:根据调试结果,开发者可以修改内核源代码,然后重新编译、加载,继续调试过程,直到问题解决。 通过这样的调试过程,不仅可以了解Linux 0.11内核的工作机制,还能提升对操作系统底层原理的理解...

    linux-0.11-gdb-centos6.7

    至于"linux-0.11-gdb-ldy"这个子文件,可能是Linux-0.11内核的调试版,包含了额外的调试信息(如符号表),以便于GDB更好地理解并解析内核的源代码。"ldy"可能是表示“链接和调试”的缩写,表明这个版本的内核是专为...

    windows下可编译linux 用insight+bochs源码级调试

    在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的,有了在Windows下编译Linux 0.11...

    linux0.11 调试.pdf

    通过上述步骤,你便能在Linux环境下,利用DDD和Bochs对Linux0.11内核进行详尽的源代码级调试。这不仅有助于理解内核的工作机制,还能提升调试技能,为更复杂的软件开发和故障排除打下坚实的基础。

    bochs25.rar

    总的来说,Bochs 2.5提供了一个可移植的x86模拟环境,使得用户无需实际硬件即可运行和调试Linux等操作系统,这对于教育、开发和研究具有重要意义。通过实践和探索,你可以深入了解操作系统与硬件之间的交互,以及...

    毕业论文,关注于一个操作系统框架的设计与实现。所使用的工具有gcc、nasm、bochs、gdb、vim等.zip

    在操作系统开发中,gcc用于将源代码编译成可执行的机器代码,对于理解和调试内核级代码至关重要。 2. nasm(Netwide Assembler):nasm是一款流行的x86汇编语言编译器,对于编写底层代码,特别是操作系统启动代码和...

    Linux 0.11 内核编译及在bochs 2.6.9中的调试运行.zip_Linux/Unix编程_C/C++_

    3. **代码阅读**:结合内核源代码,跟踪关键函数的调用,理解内核的运作机制。 通过以上步骤,你不仅能够学习到Linux内核的基本构建和编译过程,还能掌握在虚拟环境中运行和调试内核的方法。这对于深入理解操作系统...

    linux-0.11-dev,演示任务的内核态堆栈的位置

    在Linux操作系统中,内核态堆栈是系统执行内核代码时使用的内存空间,它对于理解和调试操作系统至关重要。本文将详细解析"linux-0.11-dev"项目,这是一个早期的Linux内核版本,用于教学和研究目的。我们将探讨如何在...

    osx下搭建操作系统开发环境之构建bochs_v1.01

    在完成编译并安装 Bochs 后,你就可以使用它来启动和调试你的操作系统项目了。结合 GDB,你可以对内核进行深层调试,理解其工作原理,修复潜在的错误。 总结起来,构建 Bochs v1.01 在 macOS 上是一项涉及安装依赖...

    基于Linux的嵌入式交叉开发技术.pdf

    - **下载和调试**:利用GDB在宿主机上进行远程调试,通过串口或其他通信方式与目标板交互,实现程序的下载、执行、单步调试和设置断点等功能。 3. **早期开发阶段的模拟器使用** - 在系统开发初期,如果资源允许...

    Bochs GUI-开源

    Bochs模拟了从CPU到I/O设备的全套硬件组件,包括内存、硬盘、显卡、声卡等,使得开发者可以在一个安全的环境中测试和调试操作系统或者应用软件。 标题“Bochs GUI-开源”指的是Bochs模拟器的图形用户界面版本,这个...

    实验环境的搭建与使用1

    CodeView是这个集成环境的一部分,旨在提高源代码浏览和调试的效率。 通过以上工具的组合使用,你将能够在虚拟环境中构建、运行和调试自定义的操作系统代码,从而深入理解操作系统的工作原理。对于想要进一步提升...

    开源操作系统arale代码

    6. **调试工具**:由于Arale可以在Bochs这样的模拟环境中运行,开发者可以利用GDB等调试工具进行内核级别的调试,深入理解系统运行过程中的问题。 7. **文档**:开源项目通常会附带详细的文档,Arale也不例外。通过...

    网络空间安全学院实验报告.docx

    - **X86 模拟器 Bochs**:Bochs 是一款开放源代码的 x86 硬件模拟器,它可以运行完整的操作系统,并提供图形界面支持,适用于教学和测试场景。 - **GCC 编译器**:作为编译工具,GCC 在 Linux 系统中扮演着重要角色...

Global site tag (gtag.js) - Google Analytics