Strona 1 z 1

[SOLVED]Dodawanie modułu do jądra linuksa

: 30 mar 2013, 18:59
autor: namruf15
Witam, mam takie pytanie. Otóż stworzyłem plik o rozszerzeniu .c, który po kompilacji miałby mi dać możliwy do dodania do jądra moduł linuksa (o rozszerzeniu .o jeżeli się nie mylę). Próbowałem poleceń ze strony http://home.agh.edu.pl/~kozlak/PS2010/t ... dulow.html jednak niestety nie powodzi mi się załadowanie tym sposobem. Również próby kompilacji kompilatorem gcc lecz dostałem błędy tego typu:

Kod: Zaznacz cały

trivial.c:1:9: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â<â token
trivial.c:13:1: warning: data definition has no type or storage class [enabled by default]
trivial.c:13:1: warning: parameter names (without types) in function declaration [enabled by default]
trivial.c:14:1: warning: data definition has no type or storage class [enabled by default]
trivial.c:14:1: warning: parameter names (without types) in function declaration [enabled by default]
Kod modułu to:

Kod: Zaznacz cały

include <linux/module.h>

MODULE_LICENSE("GPL")
static int trivial_init(void) {
    printk("<1>Hello world! I'ma a trivial module!\n");
    return;
}

static void trivial_exit(void) {
    printk("<1>Oh no, why are you doing this to me? Argh!\n");
}

module_init(trivial_init);
module_exit(trivial_exit);
Proszę o pomoc lub ewentualne wsparcie w formie literatury lub strony gdzie można na ten temat doczytać.

Re: Dodawanie modułu do jądra linuksa

: 31 mar 2013, 07:00
autor: jacekalex
Nie mógłbyś wypakować źródeł jakiegoś modułu, np z xtables-addons, i zobaczyć, jak to się je?

Bo moduł, jak sama nazwa wskazuje, musi być częścią znacznie większej całości,
a API kernela jest "w ciągłym ruchu".

Edyta:
To howto:
http://home.agh.edu.pl/~kozlak/PS2010/t ... dulow.html
ma "tylko" 4 lata, w kernelu to mała epoka, w dodatku nadaje się tylko po to, żeby wydrukować i w buty schować (jako onuce) :twisted:

Wg tej dokumentacji:
http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
właśnie skompilowałem moduł (2 wersje), działają ładnie.

Kod: Zaznacz cały

root ~> dmesg | grep testowy
[ 9833.903018] Cześć, jestem moduł testowy 1.
[ 9993.215423] Dobranoc -powiada moduł testowy 1.
[10001.432367] Cześć, jestem moduł testowy 1.
[10102.935102] Dobranoc -powiada moduł testowy 1.
[10210.967145] Cześć, jestem moduł testowy 2
[10244.104314] Goodbye, żegna moduł testowy 2
[10258.719075] Cześć, jestem moduł testowy 2
[10399.071226] Goodbye, żegna moduł testowy 2
Pozdrawiam
:craz:

Re: Dodawanie modułu do jądra linuksa

: 01 kwie 2013, 00:20
autor: namruf15
Dziękuję bardzo, mam tylko takie pytanie - nie wiem dlaczego ale podczas próby kompilacji modułu poprzez plik Makefile dostaje komunikat:

Kod: Zaznacz cały

make: Nie ma nic do zrobienia w `all
Kiedy próbuje kompilacji bezpośrednio poleceniem z segmentu "all" to moduł się kompiluje, chociaż ostatnia informacja w informacji zwrotnej jest niepokojąca:

Kod: Zaznacz cały

make: WejĹie do katalogu `/usr/src/linux-headers-3.2.0-39-generic'
  CC [M]  /home/susers/s196075/Dokumenty/trivial.o
^[[?6c  Building modules, stage 2.
make[1]: Uwaga: Plik `/home/susers/s196075/Dokumenty/trivial.o' ma czas modyfikacji 0.17 s w przyszĹoĹi
  MODPOST 1 modules
^[[?6c  CC      /home/susers/s196075/Dokumenty/trivial.mod.o
  LD [M]  /home/susers/s196075/Dokumenty/trivial.ko
make[1]: uwaga:  Wykryto przestawienie zegara. Budowanie moĹźe byÄ niekompletne.
make: Opuszczenie katalogu `/usr/src/linux-headers-3.2.0-39-generic'
Tutaj dodaje oczywiście również zawartość pliku "Makefile":

Kod: Zaznacz cały

obj-m += trivial.o

all:
make -C /lib/modules/3.2.0-39-generic/build M=/home/susers/s196075/Dokumenty modules

clean:
make -C /lib/modules/3.2.0-39-generic/build M=/home/susers/s196075/Dokumenty clean
Proszę o pomoc czy coś z powyższego zostało zrobione błędnie i czy niepokojąca informacja przy kompilacji wpływa na moduł? Z racji tymczasowych ograniczeń na mnie nałożonych związanych z brakiem możliwości korzystania z sudo na serwerze testowym nie mogłem sprawdzić skompilowanego modułu,więc przepraszam za swoją niewiedzę na temat wyników :D.

Drugie pytanie: czytałem dokumentacje Makefile'a ale nic na ten temat nie znalazłem - myślałem, że po kompilacji modułu dostne jedynie plik objektowy lub (na ten czas) kobject a ja dostałem całą masę plików:

Kod: Zaznacz cały

 ls
Makefile       Module.symvers  trivial.ko     trivial.mod.o
modules.order  trivial.c       trivial.mod.c  trivial.o
Tak z ciekawości: co to za pliki?

Pozdrawiam :)

Re: Dodawanie modułu do jądra linuksa

: 01 kwie 2013, 08:21
autor: jacekalex
Kiepski masz ten Makefile, tam się używa zmiennych:

Kod: Zaznacz cały

obj-m := testmod.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Tak z ciekawości: co to za pliki?
Zajrzyj lepiej do

Kod: Zaznacz cały

/lib/modules/`uname -r`
Tam znajdziesz kompletną strukturę modułów ładowalnych kernela wraz z pomocniczymi plikami konfiguracyjnymi, potrzebnymi do ładowania modułów.

Re: Dodawanie modułu do jądra linuksa

: 02 kwie 2013, 10:55
autor: namruf15
Może się ot wydać śmieszne ale mój problem tkwił w tym, że nie dawałem znaku tabulacji w pliku Makefile, po segmencie all i clean i z tego względu żądanie o kompilacje oddawało komunikat, że nie ma nic do zrobienia :D. Dziękuję za pomoc, temat do zamknięcia.