编译单个内核模块(Debian / Ubuntu)

时间:2015-03-10 20:07:51

标签: c linux ubuntu linux-kernel

我需要修改一个Ubuntu 14.04发行版的ELF加载器内核实现。使用以下方式下载了源:

sudo apt-get source linux-image-$(uname -r)

我运行了配置脚本:

make config
根源树中的

。在看似无穷无尽的输入请求序列之后,脚本创建了构建内核(或一组模块)所需的.config文件。我使用的内核版本是linux-3.13.0,并具有以下源树布局:

$ ls 
arch   COPYING  crypto         Documentation  dropped.txt  FileSystemMakefile  fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security   sound  ubuntu  virt
block  CREDITS  debian.master  drivers        elf.dat      firmware            include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  shortcuts  tools  usr

ELF加载程序位于 /path/to/source/fs/binfmt_elf.c 中。在this问题之后,为了编译单个模块,运行

就足够了
make /path/to/module/directory. 

在这种情况下:

make ./path/to/source/fs

汇编很漫长;它需要大约20分钟(在虚拟机上)并且输出被写入(默认情况下)在模块所在的同一目录中。我通过运行

找到了目标文件
find . -name "*.o"
/ path / to / source / fs。按名称过滤可以通过运行:

来定位ELF加载程序
find . -name "*elf*.o"

在当前的资源中,它(默认情况下)写在:

/path/to/source/fs/binfmt_elf.o

通过this教程后,我注意到内核模块具有命名约定 [module_name] .ko ,以便将它们与用户空间对象文件区分开来。

我的问题是如何将新的(修改的)ELF加载器插入到内核中,因为当前的ELF加载器存在(因为卸载它可能会阻止二进制文件被执行)?

1 个答案:

答案 0 :(得分:0)

你所描述的并不是真正编译内核模块"因为它通常被称为。您已经构建了一个静态链接到内核的对象,并且您无法将该对象加载到正在运行的内核中。

"内核模块"通常是指'#34;可加载的内核模块" (LKM)。构建和加载fs作为LKM是您需要/想要的。看看下面的HOWTO。按照这个来构建所需的fs作为LKM。然后你可以只替换那个LKM(.ko)文件并重新启动(通常你可以动态删除和插入LKM但不知道这将如何影响像ELF fs这样的基础 - 你可以尝试rmmod / modprobe,如果你没有重启IKE)。

http://www.tldp.org/HOWTO/Module-HOWTO/x73.html