Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477985
  • 博文数量: 115
  • 博客积分: 5016
  • 博客等级: 大校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 16:03
文章分类

全部博文(115)

文章存档

2013年(1)

2010年(17)

2009年(76)

2008年(21)

我的朋友

分类: LINUX

2008-10-23 15:52:45

环境介绍:
名称
版本信息
下载地址
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补丁文件,配置内核以及编译工作了。
# rm –rf linux (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)
# tar jvxf linux-2.6.18.tar.bz2 (解压新内核)
# ln -s linux-2.6.18 linux (重新生成linux文件夹)

解压缩各个包,假设最终kernel和patch的路径如下:
/usr/src/linux
/usr/src/linux-2.6.15.5-kgdb-2.4
为内核打上kgdb的支持补丁(具体可以参考patch中README,选择需要得patch):
#cd /usr/src/linux
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core-lite.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386-lite.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/8250.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/eth.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/module.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/sysrq_bugfix.patch

我们还可以使用quilt工具()来管理patch。

$ tar jxf linux-.tar.bz2
    $ cp -a kgdb-2 linux-/patches
    $ cd linux-
    $ quilt push -a

也可以使用这样的命令:

$ tar jxf linux-.tar.bz2
$ cd linux-
$ for p in $(grep patch ../kgdb-2/series);do patch -p1 -si ../kgdb-2/$p;done

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以及相应的符号链接

    调试

    内核调试

    被调试内核的机器叫target machine,使用某一台机器去连接target machine的机器叫development machine。当在development machine上调试target machine机器上的内核时,在development machine上执行:

    $ cd linux-
    $ gdb ./vmlinux
    (gdb) set remotebaud 115200
    (gdb) target remote /dev/ttyS0

    如果是通过网络调试内核,那么内核启动参数为:

    kgdboe=@10.0.0.6/,@10.0.0.3/ (kgdboe=@LOCAL-IP/,@REMOTE-IP/)

    调试命令是:

    $ gdb ./vmlinux 
    (gdb) target remote udp:HOSTNAME:6443

    模块调试

    使用gdbmod-2.4这个二进制的命令来调试内核模块。它是基于带有KGDB模块调试补丁的gdb(6.4)。可以从这里下载:,源代码可以从这里下载: 调试命令为:

    $ gdbmod-2.4 ./vmlinux

    通过网络调试内核

    如果通过网络调试内核,则NAPI特性必须禁止。NAPI是用于在1G和10G以太网卡上快速通讯设计的。当一个包到达时,它能开启网卡的以太网驱 动模式 (ethernet driven mode)和切换到查询模式(switch to polling mode)。查询模式是尽快的关闭了到达包的暂停( The polling mode is turned off as soon as incoming packets take a pause.)。KGDB不能在这种情况下工作,即使是100M网卡,NAPI也要关闭。

    更多信息

    或在kgdb-2的源码目录下输入”make htmldocs”(或pdfdocs, psdocs等) 来获得更多信息。

  • 阅读(2485) | 评论(0) | 转发(0) |
    0

    上一篇:linux下kbhit的实现

    下一篇:内核编译故障

    给主人留下些什么吧!~~