到今天为止,本人的linux开发平台的建立已经基本完成,还剩下一些问题,但是这边先跟大家介绍一下本人在建立kgdb调试环境的过程。希望能帮助到linux的初学者们!
环境介绍:
名称
版本信息
下载地址
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
Kgdb
linux-2.6.15.5-kgdb-2.4.tar.tar
Gdb
gdbmod-2.4.bz2(gdb6.4)
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
(2)下载mkinitrd-4.1.18-2.i386.rpm
(3)下载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以及相应的符号链接