Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231514
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: LINUX

2011-04-23 14:06:02

最近把系统调用的相关部分再看一下,突然间想了解一下:在从用户态发起系统调用后,各个寄存器(比如说我们都知道系统调用号是通过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中添加启动项,
  1. default=0
  2. timeout=5
  3. splashimage=(hd0,0)/grub/splash.xpm.gz
  4. hiddenmenu
  5. title Red Hat Enterprise Linux Server (2.6.32)
  6.         root (hd0,0)
  7.         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
  8.         initrd /initramfs-2.6.32.img
我们手动的添加kgdb0c=ttyS0,115200 (kgdb over console) 如下所示:
  1. default=0
  2. timeout=5
  3. splashimage=(hd0,0)/grub/splash.xpm.gz
  4. hiddenmenu
  5. title Red Hat Enterprise Linux Server (2.6.32)
  6.         root (hd0,0)
  7.         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
  8.         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的虚拟机启动参数
  1. default=0
  2. timeout=5
  3. splashimage=(hd0,0)/grub/splash.xpm.gz
  4. hiddenmenu
  5. title Red Hat Enterprise Linux Server (2.6.32)
  6.         root (hd0,0)
  7.         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
  8.         initrd /initramfs-2.6.32.img
clone机器是作为被调试的机器存在的
8)clone 机器重启
控制台会输出如下信息:
 
9)进入另一台机器。
  1. (gdb) set remotebaud 115200
  2. (gdb) target remote /dev/ttyS0
  3. Remote debugging using /dev/ttyS0
  4. kgdb_breakpoint (new_kgdb_io_ops=0xc0a0b7d8) at kernel/kgdb.c:1721
  5. 1721 wmb(); /* Sync point after breakpoint */
  6. (gdb)

OK enjoy it。。

 

 
阅读(5282) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~