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.上述搭建的只是内核的调试环境,如果想以后在这个环境下调试自己写的内核模块还是不行的。还需要在此基础上做改进。
阅读(1131) | 评论(0) | 转发(0) |