导出内核函数符号并重新编译安装

前言

实践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
posted @ 2025-07-28 11:28  爱吃鸡魔人zf  阅读(23)  评论(0)    收藏  举报