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?

gnometorule
źródło

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.

Mata
źródło
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,