构建调试Linux内核网络代码的环境MenuOS系统

主要步骤:

1.安装qemu模拟器

2.下载Linux源码并编译内核

3.制作根文件系统镜像

4.添加c/s方式的客户端程序进menu os中,使其成为menu os的一个命令

5.构建gdb环境

6.跟踪分析添加的命令执行过程对Linux内核发出的系统调用请求

7.初始化menu os的网络功能

试验环境:Ubuntu 14.04.6    Linux version 4.4.0-142-generic    gcc version 4.8.4

 

1.安装qemu模拟器

sudo apt install qemu

2.下载Linux源码并编译内核

下面是安装编译内核所依赖的库,千万不能少!

 

sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev

配置编译内核(我选择i386默认配置,并且在menuconfig中选择了添加调试信息)

make defconfig          #按照默认值生成.config
make i386_defconfig #生成32位x86的配置文件,x86_64_defconfig为64为配置
make config               #遍历选择编译内核功能
make allyesconfig      #启用内核全部功能
make allnoconfig        #内核功能选项全部为否
make menuconfig      #开启文本菜单选项,对窗口有限制,尽量调大窗口
makemake -j*       # *为cpu核心数
make menuconfig
Kernel hacking—>Compile-time checks and compiler options  ---> [*] Compile the kernel with debug info 

 

升级当前系统内核(这步我没做,不知道会不会影响)

sudo make modules_install # ⚠️安装前通过系统快照备份系统,以防出现故障前功尽弃
sudo make install
sudo update-grub
reboot
uname -a 

3.制作根文件系统镜像

可以用Menu os,也可以用busybox来制作根文件系统镜像。

 

git clone https://github.com/mengning/menu.git
cd menu
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
make rootfs
cd ..
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img # make i386_defconfig
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage  -initrd rootfs.img

 

wget https://busybox.net/downloads/busybox-1.30.1.tar.bz2
 tar -xvf busybox-1.30.1.tar.bz2
make help可以得到一些编译busybox的帮助信息
make defconfig
make menuconfig修改如下配置:
enable:Settings –> build options –> build busybox as a static binary(no share libs)
make
dd if=/dev/zero of=rootfs.img bs=1M count=128
mkfs.ext4 rootfs.img
mkdir rootfs
sudo mount -o loop rootfs.img rootfs
在busybox目录下
sudo make CONFIG_PREFIX=../rootfs/ install
在../rootfs/etc/network/interfaces添加lo设备,可以直接拷贝ubuntu下的/etc/network/interfaces
sudo umount rootfs
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash"

最后在qemu上运行内核和menu os结果如下:

构建调试Linux内核网络代码的环境MenuOS系统_第1张图片

4.添加c/s方式的客户端程序进menu os中,使其成为menu os的一个命令

这部分下次补全吧,这周两个八强课考试。

5.构建gdb环境

前面编译内核时在menuconfig中:

make menuconfig
Kernel hacking—>Compile-time checks and compiler options  ---> [*] Compile the kernel with debug info 

运行qemu命令:

qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S

构建调试Linux内核网络代码的环境MenuOS系统_第2张图片

 

 在另一个中段运行gdb运行如下命令:

file linux-5.0.1/vmlinux    #加载符号表
target remote:1234       #建立gdb和gdbserver之间连接
break start_kernel #断点的设置可以在target remote之前,也可以在之后
           #在设置好start_kernel处断点并且target remote之后可以继续运行,则在运行到start_kernel的时候会停下来,等待gdb调试命令的输入,可以使用list来显示断点处相关的源代码
           #此后可以继续设置新的断点,...

 

按c让qemu上的Linux继续运行,结果如下:

构建调试Linux内核网络代码的环境MenuOS系统_第3张图片

上面出现了内核panic,估计是busybox制作的根文件系统有问题或者其他,还是用menu os吧。

6.跟踪分析添加的命令执行过程对Linux内核发出的系统调用请求

这部分下次补全吧,这周两个八强课考试。

7.初始化menu os的网络功能

这部分下次补全吧,这周两个八强课考试。

你可能感兴趣的:(构建调试Linux内核网络代码的环境MenuOS系统)