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

Tutaj można zadać pytanie, jeśli Linuksa widzi się pierwszy raz w życiu ;)
Awatar użytkownika
namruf15
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 20 lis 2009, 22:20
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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ć.
Ostatnio zmieniony 02 kwie 2013, 11:16 przez namruf15, łącznie zmieniany 1 raz.
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: Dodawanie modułu do jądra linuksa

Post 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:
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
Awatar użytkownika
namruf15
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 20 lis 2009, 22:20
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Dodawanie modułu do jądra linuksa

Post 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 :)
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: Dodawanie modułu do jądra linuksa

Post 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.
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
Awatar użytkownika
namruf15
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 20 lis 2009, 22:20
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Dodawanie modułu do jądra linuksa

Post 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.
ODPOWIEDZ

Wróć do „Przedszkole Linuksa”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości