Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349419
  • 博文数量: 161
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-13 11:04
文章分类

全部博文(161)

文章存档

2015年(15)

2014年(144)

2013年(2)

我的朋友

分类: LINUX

2014-11-24 09:25:01

VMware环境下内核调试环境的搭建(KGDB):

一、软硬件准备:
1. VMware下的两台虚拟机:开发机(Redhat Linux, 2.6.18的内核)和目标机(2.6.38的内核);
2. 开发机上装有必备的内核编译环境;
3. 2.6.38的linux内核;

二、环境搭建:
1.用串口将两台虚拟机连接起来,并测试两台虚拟机能通过串口通信:
1>开发机:
  添加一块Serial Port硬件;
  Use named pipe: "\\.\pipe\com_1", "This end is client", "The other end is a virtual machine";
  I/O mode的复选框不选。
2>目标机:
  类似开发机,不同的是:"This end is server"  勾上I/O mode的复选框。
3>开发机:
  在终端上敲minicom命令,配置开发机的串口:
  Serial Device:/dev/ttyS0  Bps/Par/Bits: 115200 8N1  Hardware Flow Control:No  Software Flow Control:No
4>目标机:
  类似开发机,只不过将Serial Device配为:/dev/ttyS1

在一端的minicom上敲字,在另一端能看到,就说明串口配置正确。

2.在开发机上,下载2.6.38的linux内核,配置,编译:
1>配置:
make defconfig
make menuconfig :
-------------------------------------------------------------------
 General setup  ---> 
     [ * ] Prompt for development and/or incomplete code/drivers
Kernel hacking  --->
     [ * ] Compile the kernel with debug info
     [ * ] Compile the kernel with frame pointers
     [ * ] KGDB: kernel debugger  --->
           < * >   KGDB: use kgdb over the serial console
-------------------------------------------------------------------
2>编译:
make -j4
四核编译速度更快

3.将源代码目录下的arch/x86/boot/bzImage拷到目标机的/boot目录下:
假如在此处目标机是一个嵌入式设备,那么该咋办?目标机只有一个bootloader。
目标机的bootloader通过NFS或者串口将bzImage,下载到内存,然后烧到Flash中。

4.配置目标机上的grub,grub.conf如下所示:
-----------------------------------------------------------------------------------------------------
default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.38.2)
         root (hd0,0)
         kernel /boot/bzImage root=/dev/sda kgdboc=ttyS1,115200 kgdbwait KEYBOARDTYPE=pc KEYTABLE=us
         initrd /boot/ramdisk.img.gz
-----------------------------------------------------------------------------------------------------
假如在此处目标机是一个嵌入式设备,那么该咋办?目标机只有一个bootloader。
就应该在bootloader命令行下将内核参数告诉给bootloader,以便在引导内核时传递参数。
(其中,ramdisk.img.gz是手动做的一个简单的初始RAM磁盘)

5.重启目标机:
目标机会在打印出"kgdb: Waiting for connection from remote gdb..."阻塞住,且此时CPU占有率稳定在100%。
嵌入式上,就直接让bootloader引导内核。

6.在开发机上通过串口连接开发机,并调试内核:
---------------------------------------------------------
#gdb vmlinux
(gdb)set remotebaud 115200
(gdb)target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
kgdb_breakpoint () at kernel/debug/debug_core.c:983
983 wmb(); /* Sync point after breakpoint */
(gdb)
---------------------------------------------------------
此时如果敲continue,内核继续执行,直到文件系统起来。

三、总结:
上述就是完整的搭建内核调试环境的步骤。但需要说明的是:
1.老版本的内核需要打上kgdb补丁才能支持gdb远程调试,现在版本的内核已经集成了支持远程调试的
功能。
2.用make menuconfig配置内核的时候,老版本的配置菜单和新版本的配置菜单是不一样的。
3.上述搭建的只是内核的调试环境,如果想以后在这个环境下调试自己写的内核模块还是不行的。还需要在此基础上做改进。
阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~