最近把系统调用的相关部分再看一下,突然间想了解一下:在从用户态发起系统调用后,各个寄存器(比如说我们都知道系统调用号是通过eax寄存器进行传递的)的值以及用户态堆栈和内核态堆栈内容的变化过程。尝试了很多办法,最终还是kgdb比较给力的。上网翻了一下,发现很多写的都太麻烦了。在自己的机器上,配置了一下。归纳一下
1)首先下一份源代码包kernel-2.6.32-71.el6.src.rpm (用于工作的需要,下载了redhat的源代码包)
2)rpm -ivh kernel-2.6.32-71.el6.src.rpm
注意:RedHat 5系的源码包安装位置和6系是不同的
RHEL5的位置在:/usr/src/redhat
RHEL6的位置在:/root/rpmbuild
3)安装完成后
cd /root/rpmbuild/
rpmbuild SPECS/kernel.spec //此时会在同级目录BUILD下面,将源代码构建好
4)编译内核
源码有了,现在需要做的就是编译内核了
cd kernel-2.6.32-71.el6/linux-2.6.32-71.el6.i686/
熟悉的套路:
make -j10 //搞它10个线程让它编译 其实make命令 就相当于我们以前的make bzImage 和make modules 了
自动化程度更高而已。需要Makefile的支持
######################等待#####################
make install //安装内核,所干的事就是把arch/i386/boot/bzImage cp成为/boot/vmlinuz 作为启动image 以及System.map cp到/boot下面。具体参见Makefile
5)修改启动项参数
安装完成后,会自动在menu.lst中添加启动项,
- default=0
- timeout=5
- splashimage=(hd0,0)/grub/splash.xpm.gz
- hiddenmenu
- title Red Hat Enterprise Linux Server (2.6.32)
- root (hd0,0)
- kernel /vmlinuz-2.6.32 ro root=UUID=092804e5-ea0d-43d2-9114-3eb3f47bb57a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet
- initrd /initramfs-2.6.32.img
我们手动的添加kgdb0c=ttyS0,115200 (kgdb over console) 如下所示:
- default=0
- timeout=5
- splashimage=(hd0,0)/grub/splash.xpm.gz
- hiddenmenu
- title Red Hat Enterprise Linux Server (2.6.32)
- root (hd0,0)
- kernel /vmlinuz-2.6.32 ro root=UUID=092804e5-ea0d-43d2-9114-3eb3f47bb57a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet kgdb0c=ttyS0,115200
- initrd /initramfs-2.6.32.img
OK。这时可以关闭虚拟机了。因为我们马上要进行vm-->clone
6)克隆完成后,在两个虚拟机上添加Serial Port 注意名字要一致;其中一个为The end is server 另一个为The end is client
启动两个虚拟机 测试一下串口是否配置成功
一端:cat /dev/ttyS0
另一端:echo xxxx > /dev/ttyS0
7)修改clone的虚拟机启动参数
- default=0
- timeout=5
- splashimage=(hd0,0)/grub/splash.xpm.gz
- hiddenmenu
- title Red Hat Enterprise Linux Server (2.6.32)
- root (hd0,0)
- kernel /vmlinuz-2.6.32 ro root=UUID=092804e5-ea0d-43d2-9114-3eb3f47bb57a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet kgdboc=ttyS0,115200 kgdbwait
- initrd /initramfs-2.6.32.img
clone机器是作为被调试的机器存在的
8)clone 机器重启
控制台会输出如下信息:
9)进入另一台机器。
- (gdb) set remotebaud 115200
- (gdb) target remote /dev/ttyS0
- Remote debugging using /dev/ttyS0
- kgdb_breakpoint (new_kgdb_io_ops=0xc0a0b7d8) at kernel/kgdb.c:1721
- 1721 wmb(); /* Sync point after breakpoint */
- (gdb)
OK enjoy it。。
阅读(5304) | 评论(0) | 转发(1) |