调试Linux Kernel任意模块

2020-07-08 00:00:00 发送 编译 模块 内核 拥塞

起因

近因为遇到一件很反常识的事情:TCP能够稳定发包却没有丢包的现象。直接读论文的话有点摸不着头脑,于是得直接拿内核代码tcp_cubic.c调了。

确定模块

比如我需要调节的模块为/net/ipv4/tcp_cubic.c(本文不做任何说明都以该模块为例)。

首先确认是动态加载(写入了内核镜像,obj-y)还是编译成模块(obj-m)。

首先在/net/ipv4/Makefile中找到配置的名称CONFIG_TCP_CONG_CUBIC

之后使用cat /boot/config-$(uname -r) | grep "CONFIG_TCP_CONG_CUBIC"

得到:CONFIG_TCP_CONG_CUBIC=y

发现是被编译到了内核镜像中,必须重新编译整个内核文件获取新的镜像。如果是=m那么直接卸载相应的模块,不需要重新编译整个内核[1]

重新编译内核

首先根据自己的需求下载相关版本的内核代码。

编译内核的步骤可以参考:

在Ubuntu 18.04上编译Linux内核blog.csdn.net

为了便于后面的调试,我们将CONFIG_TCP_CONG_CUBIC=y改为CONFIG_TCP_CONG_CUBIC=m。并且我们也不需要使用menuconfig进行配置。

#将下载好的内核代码解压好,放在/usr/src文件夹下,进入该文件夹,以5.0.10为例
#配置环境
sudo apt-get install gcc make libncurses5-dev openssl libssl-dev 
sudo apt-get install build-essential 
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
​
# 修改相关的配置=y改成=m
sudo cp /boot/config-$(uname -r) .config
sudo vim .config
sudo make -j4 #开启多核编译,加快编译速度
sudo make modules_install
sudo make install
sudo mkinitramfs -o /boot/initrd.img-5.0.10 
sudo update-initramfs -c -k 5.0.10
sudo update-grub2
​
# 检验结果
sudo shutdown -r now
uname -a

相关文章