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

本次实验环境是:Ubuntu16.0.4 和 Linux5.0.1

一、下载、编译内核

1.1 下载内核

mkdir MenuOS

cd MenuOS

xz -d linux-5.0.1.tar.xz #解压

tar -xvf linux-5.0.1.tar

cd linux-5.0.1

1.2 配置内核

//安装所需依赖包

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

cd /linux-5.0.1/

#使用现存内核的配置文件:(xxx处使用TAB补全)

sudo cp /boot/config-xxx -r .config

#生成32位x86的配置文件

make i386_defconfig

make menuconfig #开启文本菜单选项

make menuconfig出现error:Your display is too small to run menuconfig!将terminal调大即可。

2416e4c62bf91e9ad514483341a1b216.png

之后会弹出如下图形界面,依次选择 Kernel hacking ->Compile-time checks and compiler options ->[ ]Compile the kernel with debug info

然后按Y键,选择 Save ,选择Exit直到退出。

8afa5475cbeb776dde4b17c839325f01.png

make编译

make (这个过程比较慢,可以加参数-j * ,选择编译时的cpu核数,加快编译速度)

decc09ee8b8efc11bf63c569c4236fb2.png

二、Qemu加载内核

下载qemu、MenuOS

sudo apt install qemu # 安装qemu

git clone https://github.com/mengning/menu.git #下载MenuOS

制作根文件系统镜像

mkdir rootfs #为MenuOS创建根目录

cd menusudo apt-get install libc6-dev-i386#在64位环境下编译32位#此时注意在初始化根目录之前要修改Makefile的内容,因为实验楼的系统是Linux 3.18.6,这里要改为5.0.1,修改之后如下#qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img#注意在Makefile修改命令时开头需加上TAB键,否则会报错

#创建软链接sudo ln -s /usr/bin/qemu-system-i386 usr/bin/qemu

make rootfs

初始化根目录(这里使用MenuOS带的文件系统)

3b67d348a1f58872dfa49f3c9c010faa.png

Qemu启动内核,可以看到内核正常启动

qemu -kernel linux-5.0.1/arch/x86_64/boot/bzImage -initrd rootfs.img

c70404ad552d0a0c190e4c7485084fe9.png

三、验证MenuOS的网络

cd ~/MenuOS/ #下载测试程序

git clone https://github.com/mengning/linuxnet.git

cd linuxnet/lab2

make

cd ../../menu/#这里要修改Makefile文件,同上

make rootfs

#另起一个终端cd MenuOS/linuxnet/lab3#修改Makefile文件make rootfs

输入replyhi,输入hello,收到了hi,证明MenuOS的网络可以正常工作

ad93aa25b86ee4ec885f3a7dc9d8bde8.png

四、构建Linux内核gdb调试环境

Qemu中启动内核,可以看到Qemu启动显示黑屏,此时是qemu在等待gdb的连接。

cd ~/MenuOS/menuvi Makefile#修改Makefile,在qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img末尾加上-append nokaslr -s -S#这里-S freeze CPU at startup -s shorthand for -gdb tcp::1234 若不想用1234端口,可以使用-gdb tcp::xx取代-s选项make rootfs

4f5761fe97fd0a3d97e71bae34edc6ef.png

连接gdb server并调试

gdb

file ~/MenuOS/linux-5.0.1/vmlinux

target remote:1234

#设置断点对start_kernel进行跟踪

break start_kernel

1a8246954b91c2161457069c93df06f4.png

继续在rest_init函数设置断点

407531657766848246b5efdf9ada81f3.png

来源:https://www.cnblogs.com/andyflyto/p/12031421.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值