导出内核函数符号并重新编译安装
前言
实践cgroup的内核机制时,想要用到cgroup.c中的cgroup_attach_task()函数,首先这个函数属于kernel内的,并且这个函数并没有导出符号,因此在我原本的linux系统中无法使用显示调用这个函数
解决方法是,修改linux内核源码,添加cgroup_attach_task()函数的符号导出,然后重新编译并且安装修改后的linux内核,在新内核环境(有这个函数符号的环境)下进行使用
linux内核的编译安装
参考文章 https://blog.csdn.net/qq_40650634/article/details/147782354
其中我用的是make olddefconfig,并且如果无需其他具体的修改,就不用再make menuconfig
下载linux 内核源码
kernel源码下载地址:
https://cdn.kernel.org/pub/linux/kernel/
这里我选择的是5.15.189
下载并解压tar -xf linux-5.15.189.tar.xz
修改内核配置文件
在更新当前系统的内核版本的时候,可以保留当前系统的配置,对新内核引入的配置,使用默认选项填充。这里的默认选项来自于Kconfig,有内核源码提供。
先拷贝当前系统中的配置文件,再通过 make olddefconfig 向源码配置文件Kconfig进行对齐,补充当前.config 中没有的,新内核引入的配置选项。后续也通过 make menuconfig 选择特定的配置。如果没有其他特别需要,就不用再 make menuconfig 了。
注意,此情景也适用于,从其他地方拷贝的.config文件
这里我使用原本内核的配置文件
cd linux-5.15.189
# 复制当前正在运行的内核的配置文件
cp /boot/config-$(uname -r) .config
# 对齐配置文件
make olddefconfig
部署内核
# 编译内核及模块
sudo make -j$(nproc)
# 安装内核模块(安装到 /lib/modules/<version>/)
sudo make modules_install
# 安装内核
# 安装内核镜像、System.map、config 等到 /boot,并注册 grub
sudo make install
更新 grub 并且重启
sudo update-grub # 更新 GRUB 菜单
sudo reboot
其余问题
大模型给出了一个说法是,如果要添加内核函数的符号导出,在对应的头文件中也需要同时声明新函数,之后再进行内核的编译与安装,但是在我的实践中,只需要添加内核函数的符号导出即可,在头文件中声明的工作可以在内核编译安装结束之后再进行
其中以#include <linux/cgroup.h>为例,其中 cgroup.h 的位置是 /lib/modules/5.15.189/build/include/linux/cgroup.h,在文件尾部添加如下内容:
int cgroup_attach_task(struct cgroup *dst_cgrp, struct task_struct *leader,
bool threadgroup);
至此,可以使用导出符号的 cgroup_attach_task 函数了
重新编译安装后的内核中确实有我做过的修改EXPORT_SYMBOL_GPL(cgroup_attach_task);//modify
sea@fanbao~$:cd /lib/modules/5.15.189/source/kernel/cgroup
sea@fanbao:/lib/modules/5.15.189/source/kernel/cgroup$ cat cgroup.c | grep "EXPORT_SYMBOL_GPL(cgroup_attach_task)"
EXPORT_SYMBOL_GPL(cgroup_attach_task);//modify

浙公网安备 33010602011771号