一、准备环境
1. 下载Fedora,版本Fedora-Live-Desktop-x86_64-20-1.iso
2. 安装VMware10.0.0 build-1295980
3. VMware 虚拟两台Fedora, 第一台名为Fedora-Client-host:
step 1:
step2:
step3:
step4:
step5:
step6:
step7:
step 8:
4. Fedora安装之后,要接着安装必要的软件:
[root@localhost xxxxx]# yum install gcc
[root@localhost xxxxx]# yum install perl
[root@localhost xxxxx]# yum install ncurses-devel
5. 现在的内核是没有开启KGDB调试的,所以需要重新编译内核。Fedora-Live-Desktop-x86_64-20-1kernel版本为3.11.10-301.fc20.x86_64,从网站 https://www.kernel.org/ 下载源代码linux-3.12.1版本,解压缩并将解压后的内容拷贝到/usr/work/目录下, 注意用Root账号,因为内核编译是要Root的权限。
6. 进入源码目录linux-3.12.1,执行make menuconfig进行KGDB的内核选项配置(这些选项default就有,不需要修改)。
(1)CONFIG_DEBUG_INFO = y 该选项可以使得编译的内核包含一些调试信息,使得调试更容易。
位置:---->Kernel hacking
---->Compile-time checks and compiler options
---->Compile the kernel with debug info
(2)CONFIG_FRAME_POINTER = y 该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。
位置:---->Kernel hacking
---->Compile-time checks and compiler options
---->Compile the kernel with frame pointers
(3)CONFIG_MAGIC_SYSRQ = y (如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上) 激活"魔术 SysRq"键. 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。
位置:---->Kernel hacking
---->Magic SysRq key
//关闭的选项
(4)CONFIG_DEBUG_RODATA = n 该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的设置软断点功能失效。所以推荐将该选项关闭。
位置:---->Kernel hacking
---->Write protect kernel read-only data structures
(5)CONFIG_DEBUG_SET_MODULE_RONX =n,该选项会将内核模块空间设置为只读,这样会导致调试内核模块时设置断点功能失效,设置断点时出现以下错误,(调试内核模块时吃过亏又重新编译的内核)所以将其关闭。
Cannot insert breakpoint 1.
Error accessing memory address 0xf90f6000: Unknown error -1.
位置:---->Kernel hacking
---->Set loadable kernel module data as NX and test as RO.
//必须使能的选项
(5)CONFIG_KGDB = y
位置:---->Kernel hacking
---->KGDB: kernel debugger
(6)CONFIG_KGDB_SERIAL_CONSOLE = y 使KGDB使用串口进行通信。
位置:---->Kernel hacking
---->KGDB: kernel debugger
---->KGDB: use kgdb over the serial console
(7)其余:
在Kernel hacking-->KGDB: kernel debugger目录下,除了KGDB:internal test suite外的选项全部使能y。
7.编译内核 执行make, 完成之后关机。
8.创建第二台虚拟机,名为Fedora-Server-target, 从前面一台克隆如下所示
9. 克隆完成之后,打开“编辑虚拟机设置”,更改串口配置如下所示:
10. 测试串口通信,现在VMware 有两台虚拟机了,Fedora-Server-target和Fedora-Client-host,现在将这两台虚拟机启动起来。
在Fedora-Server-target端 执行 cat /dev/ttyS1 【之所以是ttyS1是因为上图的管道为com_1】
在Fedora-Client-host端执行 echo qwerrttt > /dev/ttyS1 【之所以是ttyS1是因为上图的管道为com_1】
切换到Fedora-Server-target端, 看是否能看到 qwerrttt ,看到了就说明串口连接没有问题。
11. 在Fedora-Server-target安装内核模块,执行make modules_install 模块被安装到 /lib/modules/3.12.1 目录下。
12. 在Fedora-Server-target安装内核二进制映象文件,执行make install:
(1)在此过程中,会在/boot目录下生成config-3.12.1 文件,自动生成根文件系统initrd.img-3.12.1 文件,内核映像文件vmlinuz-3.12.1 文件,以及符号表System.map-3.12.1 文件。
(2)并且会自动修改grub.cfg文件,在该文件中自动添加3.12.1 内核的启动选项。
(3)注意原来旧内核boot目录下的文件不要删掉,以防新内核启动不了。
13. 重启Fedora-Server-target,用uname -a命令查看一下内核版本。并再次测试一下串口通信,测试通过后修改/boot/grub2/grub.cfg 在新内核先项里添加kgdbwait kgdboc=1【串口号或ttyS1】,115200【波特率】并把quiet 去掉【显示一些信息,例如波特率】波特率设置命令:stty ispeed 115200 ospeed 115200 -F /dev/ttyS1
(1)kgdboc=0,9600 :kgdb over console,这里将kgdb连接的console设置为ttyS0,波特率为9600,如果不在内核启动项中配置该参数
(2)kgdbwait:使 kernel 在启动过程中等待 gdb 的连接。
(3)然后重启target,系统就会暂停在kgdbwait处,等待host端的gdb连接。
14.Fedora-Client-host端
(1) 进入/usr/work/linux-3.12.1目录下
(2)gdb vmlinux //装入未压缩的内核映像
(3)set remotebaud 9600 //设置串口速率
(4)target remote /dev/ttyS1 //连接串口1
【注意】要确定两台机器在所设置的波特率下要能通信