Co zawiera drzewo źródeł jądra? Czy jest to związane z nagłówkami jądra Linux?


25

W książkach, ja zazwyczaj odczytać odniesień do drzewa źródłowego Linuksa na /usr/src/linuxze zwykłym zestawem podkatalogów ( arch, block, crypto, ...).

Spodziewałem się, że to drzewo będzie zawierać pliki binarne tworzące jądro. W moim systemie (Ubuntu 10.04) ...

  1. dla różnych posiadanych przeze mnie jąder (korzystających ze zautomatyzowanego pobierania oprogramowania, które nie zostały zainstalowane ręcznie) zamiast tego w tej lokalizacji znajduję się dwa podkatalogi dla każdego jądra:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. W podkatalogach spodziewałem się między innymi plików binarnych. Jednak sprawdziłem sporą część drzewa i wydaje się, że ostatni stąd podkatalog ma zawsze Makefile(podczas odczytu, zwykle bardziej przypomina plik konfiguracyjny niż plik instalacyjny), a czasami kilka innych izolowanych plików (głównie Kconfig).

Moje pytanie może być naiwne, ale jestem trochę zdezorientowany. Czy (2) powinienem się spodziewać w drzewie źródeł jądra; i dlaczego mam wyraźne odniesienie do „nagłówków”? Musiałem zainstalować linux-generic-headersjakiś czas temu dla innego oprogramowania i nie jestem pewien, czy to może być powiązane. Zdaję sobie sprawę, że istnieje dobry powód dla plików makefiles (np. Instalowania modułów w podkatalogu / driver), ale (właściwie) tylko makefile?

Odpowiedzi:


30

kernel-headerPakiety dystrybucyjne zawierają, jak wskazuje ich nazwa, tylko pliki nagłówków jądra (plus niezbędna instalacja wodno-kanalizacyjna), które są wymagane do zbudowania oprogramowania takiego jak moduły jądra.

Nie należy oczekiwać, że w ogóle znajdziesz pliki binarne w katalogu źródłowym jądra , z wyjątkiem danych wyjściowych kompilacji. (Jeśli sam skonfigurujesz i zbudujesz jądro, katalog źródłowy jądra będzie również zawierał skompilowane obiekty, moduły, samo zbudowane jądro i kilka innych binarnych bitów i elementów, które sprawiają, że działa.)
KConfigPliki to opis opcji konfiguracji jądra (i ich zależności), które są dostępne dla danego katalogu / modułu.
Poza tym to wszystko (głównie) kod źródłowy C, pliki nagłówkowe i pliki Makefiles. Tu i tam jest kilka skryptów pomocniczych, a także źródło asemblera.

Pakiety nagłówków (to, co zainstalowałeś) zawierają tylko część nagłówka powyższego (i nie wszystko - tylko „wyeksportowane” nagłówki) oraz część infrastruktury kompilacji. Tak więc oczekuje się tego, co widzisz. Pakiety nagłówków nie zawierają kodu źródłowego C (z wyjątkiem niektórych kodów pośredniczących i kodu infrastruktury kompilacji). Istotą tego typu pakietów jest oszczędność miejsca (i przepustowości) - całe drzewo źródeł jądra Linux jest dość duże i całkowicie niepotrzebne, jeśli nie zamierzasz samodzielnie kompilować jądra. Pakiety nagłówków są budowane i wysyłane przez dystrybucje, aby zapewnić odpowiednie rzeczy niezbędne do zbudowania modułów, ale nie więcej. (Z pewnością nie zawierają skompilowanego jądra).

Adresowanie komentarza: pakiety nagłówków nigdzie się nie przenoszą. Są one zbudowane dla określonych wersji jądra, spakowanych w określonym katalogu i to wszystko. To tylko zestaw plików. (Zauważ, że pakiety nagłówkowe niekoniecznie mają tę samą wersję, co obecne stabilne pakiety binarne jądra - pakiety nagłówkowe są ogólne i mogą pozostawać w tyle za rzeczywistym jądrem, którego używasz. Nie powinny one jednak pochodzić z jądra wersja nowsza niż obecnie zainstalowane (lub docelowe) jądro).

Zainstalowane pliki binarne jądra są zwykle instalowane w /bootkatalogu wraz z plikami binarnymi programu ładującego i plikami konfiguracyjnymi. (Czasami jest to niezależny system plików, który nie jest domyślnie montowany). Dokładna nazwa plików zależy od jądra i dystrybucji. (Podobnie jak bootloader).

Zainstalowane moduły jądra znajdują się w podkatalogach:

/lib/modules/`uname -r`/

Na przykład w moim systemie są obecnie w

/lib/modules/3.1.4-gentoo/

Pełny kod źródłowy jądra : Jeśli na Ubuntu chcesz, aby pełne źródła jądra samodzielnie budowały jądro, powinieneś zainstalować postępując zgodnie z instrukcjami tutaj .

Możesz również pobrać źródłowy plik archiwum kernel.orgi rozpakować go gdzieś ( nie zastępuj plików zainstalowanych w systemie Ubuntu, jeśli używasz tego pliku archiwum, przechowuj swoje rzeczy osobiste i rzeczy zarządzane przez RPM osobno).

/usr/src/linuxto tradycyjne miejsce do umieszczania źródeł jądra, ale nic nie stoi na przeszkodzie, aby umieścić źródła jądra w innym miejscu. Ta ścieżka jest również często tylko dowiązaniem symbolicznym do katalogu. np. mam to na moim komputerze:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

Dowiązanie symboliczne ma na celu uproszczenie budowania aplikacji zależnych od źródła jądra. Łączysz tę ścieżkę z działającym (lub docelowym) jądrem, abyś nie musiał określać dokładnej wersji lub informacji o ścieżce podczas budowania modułu spoza drzewa. Pomaga grupie przynajmniej w przypadku dystrybucji opartych na źródłach.


Bardzo dziękuję za tę szczegółową i raczej kompletną odpowiedź. Przez jakiś czas mnie to denerwowało. Jeśli nie przesadzam z powitaniem, a jeśli znajdziesz czas, czy mogę uprzejmie dodać, kontynuując: (a) Przeczytałem powyższe, że w moim przypadku (niezainstalowane jądro), niektóre z katalogi powinny (mogą) zawierać jądro C i kod źródłowy asemblera. Gdzie by to nie była - pełna lista, tylko że przeglądając może 20-30 podkatalogów nigdy nie natknąłem się na jeden? Pobrałem pliki źródłowe jądra z kernel.org; Chcę tylko lepiej zrozumieć mój system. (b) ...
— gnometorule,

... więc gdzie (ogólnie) znajdują się pliki binarne jądra, gdy sam nie instalujesz jądra, jak w moim przypadku? (c) Odwołujesz się do „pakietów nagłówków”, które wziąłem jako „linux-generic-headers”. Czy drzewo, które widzę z tych pakietów? Jeśli tak, to czy przenoszą się tam, gdzie było drzewo źródłowe przed ich instalacją? Jeszcze raz wielkie dzięki.
— gnometorule

(jeśli odpowiesz, użyj „odpowiedz”, nie komentuj, abym mógł przynajmniej głosować jeszcze raz za twoją pomoc)
— gnometorule

Rozbudowałem się trochę. Pakiety nagłówków dotyczą nagłówków. Pełne pakiety źródłowe zapewniają pełny kod źródłowy. Pakiety binarne zapewniają tylko pliki binarne.
— Mat

5
linux-sourcezawiera źródło źródłowe, apt-get source linux-image-$(uname -r)pobiera źródło jądra z łatami Ubuntu.
— Lekensteyn,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.