2009-05-03 13 views
7

Czy można skompilować moduł jądra Linux (2.6), który obejmuje funkcje zdefiniowane przez nie-jądro?Skompiluj moduł jądra Linux (2.6), w tym nagłówki niepochodzące z jądra

Na przykład:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

Moduł jądra Pisałem i próbuje skompilować zawiera funkcje znalezione w liczba o penssl to pliki.

Standardowy plik Makefile przedstawiony powyżej nie pozwala na uwzględnianie poza nagłówkami linux. Czy jest możliwe włączenie tej funkcji, a jeśli tak, czy mógłbyś wskazać mi właściwy kierunek.

Dzięki Mike

Odpowiedz

11

Jądro nie można użyć kodu przestrzeni użytkownika i musi stanąć sam (to znaczy być całkowicie samowystarczalne, żadnych bibliotek), dlatego nie odebrać standardowych nagłówków.

Nie jest jasne, jaką korzyścią jest próba pobrania nagłówków przestrzeni użytkownika. Jeśli są tam rzeczy, które byłyby użyteczne (stałe, niektóre makra mogą być pod warunkiem, że nie wywołują żadnych funkcji przestrzeni użytkownika), to lepiej je zduplikować i uwzględnić tylko potrzebne części zgodne z jądrem.

Nie można połączyć jądra z bibliotekami przeznaczonymi do użytku w przestrzeni użytkownika - nawet jeśli nie wykonują żadnych wywołań systemu operacyjnego - ponieważ środowisko łączenia w jądrze nie może ich odebrać.

Zamiast tego należy przekompilować dowolne funkcje, które będą używane w jądrze (zakładając, że nie wykonują żadnych wywołań systemu operacyjnego ani biblioteki - np. Malloc - w takim przypadku i tak będą musiały zostać zmodyfikowane). Włącz je do swojej biblioteki, która będzie używana w modułach jądra.


Wcześniejsze wersje linuxa zawierają funkcje kryptograficzne, w tym różne skróty SHA - być może można zamiast tego użyć jednego z nich.


Innym pomysłem byłoby zaprzestanie prób tworzenia kryptografii w przestrzeni jądra i przeniesienie kodu do przestrzeni użytkownika. Kod obszaru użytkownika jest łatwiejszy do zapisu/debugowania/utrzymywania itd.

6

Pobrałem bity kodu przestrzeni użytkownika, który napisałem i przekonwertowałem, aby działał w przestrzeni jądra (tj. Używając kmalloc(), itp.), To nie jest takie trudne . Jednakże ograniczasz się do zrozumienia przez jądro C, a nie przestrzeni użytkownika, która różni się nieznacznie, szczególnie w przypadku różnych standardowych typów int.

Po prostu łączenie z przestrzenią użytkownika DSO nie jest możliwe - jądro Linuxa jest monolityczne, całkowicie samoistne. Nie korzysta z libc użytkownika, bibliotek ani innych bitów, jak zauważyli inni.

9/10 razy, znajdziesz to, czego potrzebujesz gdzieś w jądrze.Jest bardzo prawdopodobne, że ktoś inny wpadł na taką samą potrzebę i napisał kilka funkcji statycznych w jakimś module, aby zrobić to, co chcesz. Po prostu złap je i wykorzystaj ponownie.

W przypadku krypto, jak powiedzieli inni, po prostu użyj tego, co jest w jądrze. Należy pamiętać, że trzeba je włączyć w kconfig, co może się zdarzyć lub nie, w zależności od tego, co wybierze użytkownik podczas budowania. Tak więc, uważaj na zależności i bądź wyraźny, być może będziesz musiał zhakować kilka wpisów w kconfig, które również wybiorą API do kryptografii, które chcesz, kiedy twój moduł zostanie wybrany. To może być trochę uciążliwe przy budowaniu z drzewa.

Tak więc z jednej strony "po prostu kopiujemy i zmieniamy nazwy, dodając ogólny nadmiar", z drugiej strony "mówisz ludziom, że muszą mieć pełne źródło jądra". To jedno z dziwactw, które pochodzą z monolitycznego jądra.

Z mikrojądrem prawie wszystko działa w przestrzeni użytkownika, bez obaw o połączenie z OSD dla niektórych sterowników ... to nie problem. Proszę nie przyjmować tego oświadczenia jako wskazówki do ponownego rozpoczęcia filozofii projektowania jądra w komentarzach, co nie wchodzi w zakres tego pytania.

Powiązane problemy