Назад | Перейти на главную страницу

Компиляция отдельного модуля ядра (Debian / Ubuntu)

Мне нужно изменить реализацию ядра загрузчика ELF дистрибутива Ubuntu 14.04. Скачав исходники, используя:

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. Следующий этот вопрос, чтобы скомпилировать отдельный модуль, достаточно запустить

make /path/to/module/directory 

В этом случае это будет:

make ./path/to/source/fs

Сборник довольно длинный; это занимает около двадцати минут (на виртуальной машине), и вывод записывается (по умолчанию) в том же каталоге, в котором расположен модуль. Я нашел объектные файлы, выполнив:

find . -name "*.o"

в / путь / к / источнику / fs. Фильтруя по имени, можно найти загрузчик ELF, запустив:

find . -name "*elf*.o"

В текущих источниках это записано (по умолчанию) на:

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

Пройдя через этот Я заметил, что модули ядра имеют соглашение об именах [имя_модуля] .ko чтобы отличить их от объектных файлов пользовательского пространства.

У меня вопрос: как я могу вставить новый (модифицированный) загрузчик ELF в ядро, учитывая, что текущий загрузчик ELF присутствует (поскольку его выгрузка может помешать выполнению двоичных файлов)?

Редактировать # 1:

Бег lsmod дает:

$ 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. По умолчанию загрузчик встроен в базовое ядро.

Попробуй это:

Как создать единый модуль ядра в виде дерева?

В качестве альтернативы я обычно делаю это примерно так. Это по памяти и может сработать, а может и не сработать. Он также строит все модули.

Установите текущий исходный код ядра:

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, если оно не загружается автоматически.