Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33377
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-31 10:55
文章分类

全部博文(29)

文章存档

2015年(29)

我的朋友

分类: LINUX

2015-11-04 13:07:14

一、编译Linux
1. 下载内核代码(linux-3.5.7.tar.bz2),缺省工作目录是/usr/src/work
    sudo mkdir -p /usr/src/work 
    sudo chmod 777 /usr/src/work -R 
    cd
 /usr/src/work  
    tar -jxvf linux-3.5.7.tar.bz2
2. 配置内核选项
    cd linux-3.5.7
    make defconfig
    make menuconfig
需确保如下选项被选中(使能kgdb调试,并使用kgdboc作为与gdb通信模块)
 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  
3.编译内核
 make
 如果你的机器是多核的,可以使用-j+CPU数来进行并行编译,从而加快编译速度,如:
 make -j2
 编译完成后,复制bzImage和vmlinux到工作目录下备用
 cp arch/x86/boot/bzImage /usr/src/work 
 cp vmlinux /usr/src/work 

二、制作自己的文件系统

1. 去busybox站点下载一个busybox源码包,并解压。
  cd /usr/src/work 
  tar -jxvf busybox-1.17.0.tar.bz2 
  cd busybox-1.17.0

2. 编译busybox
  make menuconfig   
  Busybox Settings 
    ---> Build Options 
    ---> [ * ] Build BusyBox as a static binary (no shared libs) Installation Options 
    ---> [ * ] Don't use /usr Miscellaneous Utilities
     ---> [ ] flashcp
       [ ] flash_lock 
         [ ] flash_unlock 
         [ ] flash_eraseall   注:[ ] 表示不选择

3. 保存配置文件后开始编译和安装

  make & make install

此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件

4. 制作文件系统

使用如下命令来创建一个虚拟文件系统磁盘文件,

在当前目录下创建一个名为busybox.img,大小为100M的文件,并将其格式化为ext3的文件系统

cd /usr/src/work dd if=/dev/zero of=./busybox.img bs=1M count=100 mkfs.ext3 busybox.img

将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,
并将生成好的busybox的文件拷贝到这个文件里。

sudo mkdir /mnt/disk
sudo mount -o loop /usr/src/work/busybox.img /mnt/disk
sudo cp -rf /usr/src/work/busybox-1.17.0/_install/* /mnt/disk
创建必须的文件系统目录 
cd /mnt/disk/ 
sudo mkdir dev sys proc etc lib mnt   
使用busybox默认的设置文件 
sudo cp -a /usr/src/work/busybox-1.17.0/examples/bootfloppy/etc/* /mnt/disk/etc 
sudo vi /mnt/disk/etc/init.d/rcS  
 将下面内容拷贝到rcS里:   
#! /bin/sh /bin/mount -a /bin/mount -t  sysfs sysfs /sys
 /bin/mount -t tmpfs tmpfs /dev 
#动态添加虚拟机环境中的设备 /
sbin/mdev -s

做完上面的工作后,我们就可以卸载虚拟磁盘文件了

cd /usr/src/work
sudo umount /mnt/disk
三、安装qemu
sudo apt-get install qemu
四、使用qemu运行自己编译的内核
qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda" -boot c -hda /usr/src/work/busybox.img -k en-us  
note: 如果你的硬盘是sata接口的,你也许需要将上面的 "root=/dev/hda" 替换为 "root=/dev/sda"
如果顺利的话,自己编译的内核+文件系统就会在那qemu黑乎乎的窗口里展现出来
五、gdb + kgdb 调试内核

使能kgdb可以在内核启动时增加使能参数,也可以在内核启动后echo kgdboc模块的参数来达到目的,这里我们采取在内核启动时增加启动参数(kgdboc=ttyS0,115200 kgdbwait)的方式:
qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda kgdboc=ttyS0,115200 kgdbwait" -boot c -hda /usr/src/work/busybox.img -k en-us -serial tcp::4321,server

这时,运行qemu的终端将提示等待远程连接到本地端口4321:
QEMU waiting for connection on: tcp:0.0.0.0:4321,server

这时使用另外一个控制台执行:
gdb /usr/src/work/vmlinux 
(gdb) target remote localhost:4321

然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:
kgdb: Waiting for connection from remote gdb…

这时gdb这边就可以看到如下的提示:
(gdb) target remote localhost:4321
Remote debugging using localhost:4321 kgdb_breakpoint () at kernel/debug/debug_core.c:983 983 wmb(); /* Sync point after breakpoint */ (gdb)

开始你的内核之旅吧~~~

如果gdb提示如下信息:
warning: Invalid remote reply:
可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:
(gdb) target remote localhost:4321
具体调试方法与gdb下没有很大区别,也可以安装ddd图形界面进行调试,这样更直观一些

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