在vmware上建立kgdb调试linux kernel源码的平台-1

来源:百度文库 编辑:神马文学网 时间:2024/03/28 21:56:21
环境介绍:
名称
版本信息
下载地址
Vmware
5.5.1

Redhat linux9
2.4.20-8(linux 内核版本)

Gcc
3.4.6

Glibc
2.3.4

Linux调试版本
linux-2.6.15.5.tar.bz2
www.kernel.org
Kgdb
linux-2.6.15.5-kgdb-2.4.tar.tar
http://kgdb.linsyssoft.com/downloads.htm
Gdb
gdbmod-2.4.bz2(gdb6.4)
http://kgdb.linsyssoft.com/downloads.htm

Kgdb调试的一般性原理介绍:
     需要两台pc ,都运行linux ,一个是target ,一个是host 。 target就是运行打了kgdb patch的linux kernel , host端就是运行gdb的一端 。两台pc 能用串口线相连。 target端kernel 停止到某个断点上,等待着gdb连上来下指令。我们能用vmvare 虚拟出两台linux ,这样就省下了串口线。 具体设置参考下面的图。

Vmware建立调试环境:
    vmware 虚拟两台linux , 目前我们已有了一个虚拟的redhat9.0的linux 了,只需要用vmvare自带的clone的功能,再clone一个就能了。
Clone之前,要关闭虚拟的linux ,然后执行 VM->clone ,只需点击下一步就能了。
Clone之后,还必须对两台机子的串口进行设置如下:
Host:


       Target:

   


   在 target端 执行 cat /dev/ttyS0
在 host 端 执行: echo 12345 > /dev/ttyS0
转换到target端, 看是否能看到 12345 ,看到了就说明串口连接没有问题。

编译2.6内核前的准备
因为我们要调试的是2.6内核,不过我们两台机子上跑的都是2.4内核redhat。所以我们必须编译我们的2.6内核,并且还要打上相应的kgdb的补丁。在做这些操作之前,我们还需要做的是升级系统的几个工具软件,升级的软件及下载地址如下:
(1)下载module-init-tools-3.2.tar.bz2
http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2
(2)下载mkinitrd-4.1.18-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm
(3)下载lvm2-2.00.25-1.01.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm
(4)下载device-mapper-1.00.19-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm
   
下面我们就来安装这几个工具软件:
1. 安装module-init-tools工具
# tar jvxf module-init-tools-3.2.tar.bz2 (解压module-init-tools)
# cd module-init-tools-3.2 (进入module-init-tools目录下)
#./configure --prefix=/
# make moveold
# make all install
#./generate-modprobe.conf /etc/modprobe.conf

2.安装另外三个升级工具
依次执行下列3个命令来安装另外三个升级工具:
# rpm -ivh --nodeps  --replacefiles  mkinitrd-4.1.18-2.i386.rpm (注意,这里一定要加入 ?--nodeps --replacefiles参数,下同)
# rpm -ivh ?nodeps --replacefiles lvm2-2.00.25-1.01.i386.rpm
# rpm -ivh --nodeps --replacefiles  device-mapper-1.00.19-2.i386.rpm
(关于RPM的知识能参考本人blog上转载的文章:RPM的使用)
(注意:如果rpm包下载不完整,在安装的时候会校验过不去,会出现类似下面的一些提示信息:
error: V3 DSA signature: BAD.)

编译内核
我们在安装完前面的4个工具软件之后,随后要做的就是解压内核文件,打kgdb补丁文件,设置内核及编译工作了。
1.        解压内核文件
2.        解压kgdb的补丁文件
3.        将kgdb解压的目录移入内核文件的顶层目录
4.        #make mrproper
5.        在顶层目录打补丁(假设kgdb目录为:linux-2.6.15.5-kgdb-2.4),打补丁前需要看一下补丁目录下的README和series文件,这边告诉我们该打那些补丁及打补丁的顺序;
#patch ?p1 2.6.15.5-kgdb-2.4/core-lite.patch
#patch ?p1 2.6.15.5-kgdb-2.4/8250.patch
#patch ?p1 2.6.15.5-kgdb-2.4/netpoll_pass_skb_to_rx_hook.patch
#patch ?p1 2.6.15.5-kgdb-2.4/eth.patch
#patch ?p1 2.6.15.5-kgdb-2.4/i386-lite.patch
#patch ?p1 2.6.15.5-kgdb-2.4/core.patch
#patch ?p1 2.6.15.5-kgdb-2.4/i386.patch
6.        下面就是设置我们的内核了,在设置内核方面,有许多我们需要注意的:
Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;
Device Drivers--->Block Devices中选上“Loopback device support”;
Device Drivers--->Multi-device support(RAID and LVM)处要选上“device mapper support”;
Device Drivers--->Graphics support,一定要选上“ Support for frame buffer devices”; Device Drivers --->USB support --->选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)
Device Drivers --->;Network device support --->Ethernet (10 or 100Mbit) ---> AMD
PCnet32 PCI support
    Device Drivers --->Character devices -à Serial derivers -à 8250/16650 and Compatiable serial support(这一项一定要选上,不然在kgdb选项打开后,编译最后一直会报错,提示信息如下:undefined reference to `serial8250_unregister_by_port’ ,这个问题我搞了好几天,原来以为是gcc版本太低,所以把gcc从3.2.2版本升级成3.4.6版本,(关于GCC的升级,本人的blog也会有相关文章介绍的。)问题还是相同,最后才发现是这边没有选择,网上关于这个问题也非常少提到,希望对大家有点帮助)
        File system--->(以下9个选项是关于ext2和ext3文件系统设置,全部选上)
       Second extended fs support
  Ext2 extended attributes
Ext2 POSIX Access Control Lists
Ext2 Security Labels
Ext3 journalling file system support
Ext3 extended attributes
Ext3 POSIX Access Control Lists
Ext3 Security Labels JBB (ext3) debugging
support File system--->DOS/FAT/NT Filesystems --->选上“NTFS file system support”;
ext2和ext3文件系统设置非常重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:
kernel panic : no init found ,
try passing init = option to kernel.....
或是:
VFS:Cannot open root device "hdxy" or unknow-block(0,0)
Please append a correct "root=" boot option kernel panic:
VFS:Unable to mount root fs on unknown-block(0,0)
或是:
mount: error 19 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc fail: 2
Freeing unused kernel memory: 244k freed Kernel panic ? not syncing: No init found. Try passing init = option to kernel
如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选:
Device Drivers --->SCSI device support (此项不选的话,下面两项就选择不上)
Device Drivers --->SCSI device support --->SCSI disk support
Device Drivers--->SCSI device support--->SCSI low-level drivers--->; BusLogic SCSI support
Kgdb选项的支持在下面进行设置:
Kernel hacking -à
  • kernel debugging
  • compile the kernel with debug info
  • kgdb ,kernel debugging with remote kgdb
  • console messages through gdb
  • Simple selection of KGDB Serial Port
    (115200) debug serial baud rate
    (0)Serial port number for KGDB
          
          到这边我们的内核就算设置完毕了。呵呵,目前我们就能开始编译了
          #make bzImage
          编译成功后,/usr/src/linux/arch/i386/boot下生成bzImage文件,在顶层目录下生成System.map文件。我们要做的是,将这两个文件拷贝到target机子的/boot目录下。并且命名如下:
       #make modules             编译内核模块
          #make modules_install       在/lib/modules目录生成2.6.15.5目录,安装模块
          #make install    安装内核,在/boot目录下生成Systemmap vmlinuz  initrd-2.6.15.5.img及相应的符号链接