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

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

我需要修改 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 加载器位于/路径/到/源/fs/binfmt_elf.c。 下列的问题,为了编译单个模块,只需运行

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

经历了教程中,我注意到内核模块有命名约定[模块名称].ko为了将它们与用户空间目标文件区分开来。

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

编辑#1:

跑步修改给出:

$ lsmod
Module                  Size  Used by
nls_utf8               12557  1 
isofs                  39835  1 
vboxsf                 39690  0 
snd_intel8x0           38153  2 
snd_ac97_codec        130285  1 snd_intel8x0
ac97_bus               12730  1 snd_ac97_codec
snd_pcm               102099  2 snd_ac97_codec,snd_intel8x0
snd_page_alloc         18710  2 snd_intel8x0,snd_pcm
snd_seq_midi           13324  0 
snd_seq_midi_event     14899  1 snd_seq_midi
rfcomm                 69160  0 
snd_rawmidi            30144  1 snd_seq_midi
bnep                   19624  2 
bluetooth             391196  10 bnep,rfcomm
snd_seq                61560  2 snd_seq_midi_event,snd_seq_midi
snd_seq_device         14497  3 snd_seq,snd_rawmidi,snd_seq_midi
snd_timer              29482  2 snd_pcm,snd_seq
joydev                 17381  0 
snd                    69238  12 snd_ac97_codec,snd_intel8x0,snd_timer,snd_pcm,snd_seq,snd_rawmidi,snd_seq_device,snd_seq_midi
serio_raw              13462  0 
vboxguest             248441  7 vboxsf
i2c_piix4              22155  0 
soundcore              12680  1 snd
mac_hid                13205  0 
parport_pc             32701  0 
ppdev                  17671  0 
vboxvideo              12658  0 
drm                   303102  1 vboxvideo
lp                     17759  0 
parport                42348  3 lp,ppdev,parport_pc
hid_generic            12548  0 
usbhid                 52570  0 
hid                   106148  2 hid_generic,usbhid
psmouse               106678  0 
ahci                   25819  2 
libahci                32560  1 ahci
e1000                 145174  0 

哪个模块需要编译为 LKM 才能包含 ELF 加载器。默认情况下,加载器内置于基本内核中。

答案1

尝试这个:

如何构建单个树内内核模块?

或者,我通常采用以下方式。这是根据记忆进行的,可能对您有用,也可能没用。它还会构建所有模块。

安装当前内核源:

apt-get source linux-image-$(uname -r)
cd /usr/src/linux-$(uname -r)
cp /boot/config-$(uname -r) .
make menuconfig
... enable the device

then...
make modules
make modules_install
reboot

如果某些设备没有自动加载,则需要将模块名称添加到 /etc/modules。

相关内容