Compilando um módulo individual do kernel (Debian / Ubuntu)

3

Eu preciso modificar a implementação do kernel do carregador ELF de uma distribuição Ubuntu 14.04. Tendo baixado as fontes usando:

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

Eu executei o script de configuração:

make config

na árvore de origem raiz. Após uma sequência aparentemente interminável de solicitações de entrada, o script criou o arquivo .config necessário para construir o kernel (ou um conjunto de módulos). A versão do kernel que estou usando é linux-3.13.0 e tem o seguinte layout de árvore de fontes:

$ 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

O carregador ELF está localizado em /path/to/source/fs/binfmt_elf.c . Seguindo esta pergunta, a fim de compilar um módulo individual é suficiente para executar

make /path/to/module/directory 

Nesse caso, seria:

make ./path/to/source/fs

A compilação é bastante longa; leva cerca de vinte minutos (em uma máquina virtual) e a saída é gravada (por padrão) no mesmo diretório em que o módulo está localizado. Eu encontrei os arquivos objeto executando:

find . -name "*.o"

em / path / to / source / fs. Filtrando pelo nome, o carregador ELF pode ser localizado executando:

find . -name "*elf*.o"

Nas fontes atuais, ele é escrito (por padrão) em:

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

Tendo passado pelo tutorial , notei que os módulos do kernel têm a convenção de nomenclatura [module_name] .ko para distingui-los dos arquivos de objeto do espaço do usuário.

A minha pergunta é como posso inserir o novo carregador ELF (modificado) no kernel, dado que o carregador ELF atual está presente (como descarregar, pode impedir a execução de binários)?

Editar # 1:

A execução de lsmod fornece:

$ 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 

Qual módulo precisa ser compilado como um LKM para incluir o carregador ELF. Por padrão, o carregador é construído no kernel base.

    
por Sebi 10.03.2015 / 21:45

1 resposta

1

Tente isto:

Como faço para criar um single em Módulo do kernel -tree?

Alternativamente, a maneira que eu normalmente faço isso é algo como o seguinte. Isso é da memória e pode ou não funcionar para você. Também constrói todos os módulos.

Instale a fonte atual do kernel:

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

Alguns dispositivos precisam ser adicionados ao nome do módulo para / etc / modules se ele não for carregado automaticamente.

    
por 10.03.2015 / 23:24