web-dev-qa-db-ja.com

個別のカーネルモジュールのコンパイル(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にあります。 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:

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 

ELFローダーを含めるために、LKMとしてコンパイルする必要があるモジュール。デフォルトでは、ローダーは基本カーネルに組み込まれています。

3
Sebi

これを試して:

単一のツリー内カーネルモジュールを構築するにはどうすればよいですか?

あるいは、私がこれを通常行う方法は、次のようなものです。これはメモリからのものであり、機能しない場合があります。また、すべてのモジュールをビルドします。

現在のカーネルソースをインストールします。

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にモジュール名を追加する必要があります。

2
Matt