Korzyści z modułu jądra skompilowanego w jądrze?


Odpowiedzi:


7

To zależy. Jeśli masz niewielką ilość pamięci, użycie modułów może poprawić wznawianie, ponieważ nie są one ponownie ładowane za każdym razem (uznałem, że ma to znaczenie na 2 GiB pamięci RAM, ale nie na 4 GiB na tradycyjnych dyskach twardych). Jest to szczególnie prawdziwe, gdy z powodu jakiegoś błędu w module baterii (niezależnie od tego, czy został skompilowany czy jako moduł), uruchomienie trwało bardzo długo (kilka minut). Nawet bez błędów w Gentoo udało mi się skrócić czas (zgłaszany przez systemd-analysis) z 33s do 18s, po prostu zmieniając statycznie skompilowane jądro na moduły - „zaskakująco” początek jądra zmienił się z 9s na 1,5s.

Ponadto, gdy nie wiesz, jakiego sprzętu będziesz używać, moduły są wyraźnie korzystne.

PS. Możesz skompilować nawet niezbędne sterowniki jako moduły, o ile umieścisz je w initrd. Na przykład dystrybucje będą obejmować system plików /, sterowniki dysku twardego itp. W initrd podczas instalacji.


Czy możesz ponownie przeczytać tę odpowiedź, uważnie. Chciałbym, ale nie wiem, co chciałeś powiedzieć na miejscu, np. Na tradycyjnych dyskach twardych .
tshepang

Miałem na myśli magnetyczne (nie mam żadnego doświadczenia z dyskiem SSD).
Maciej Piechotka

Próbowałem uczynić to bardziej czytelnym. Czy możesz sprawdzić, czy tego nie spieprzyłem.
tshepang

Dzięki. Właśnie skończyłem sesję egzaminacyjną, więc nie miałem czasu na nią patrzeć.
Maciej Piechotka

7

O ile mi wiadomo, nie ma różnicy prędkości.

Myślę, że zyskasz kilka kB pamięci jądra, ponieważ ziarnistość alokacji wynosi jedną stronę, więc w typowej architekturze każdy moduł marnuje średnio około 2kB (½ strony) na potencjalny moduł. Nawet w systemach wbudowanych nie ma to większego znaczenia. Zyskujesz również trochę miejsca na dysku, ponieważ moduły można kompresować w tym samym czasie, co jądro; które mogą być bardziej odpowiednie w systemach wbudowanych o małej pojemności.

Jeśli możesz zrezygnować z modułów, zaoszczędzisz trochę pamięci jądra (nie wymaga modułu ładującego), miejsca na dysku (nie potrzeba narzędzi modułu) i złożoności systemu (nie musisz uwzględniać ładowania modułu jako funkcji w twojej dystrybucji ). Punkty te są dość atrakcyjne w niektórych projektach osadzonych, w których sprzęt nie jest rozszerzalny.


Dostęp do symbolu w module jest nieco wolniejszy (wymagana jest pośrednia). Ale dodatkowa elastyczność (można ładować / rozładowywać zgodnie z wymaganiami, nie trzeba budować ręcznie dostosowanego jądra dla konkretnego używanego sprzętu, ...) jest tego warta (chyba że budujesz dla bardzo ograniczonego środowiska, które nie wymaga nigdy się nie zmieni).
vonbrand

4

Kilka potencjalnych korzyści. Wydajność jest dyskusyjna. Uniknąłbyś narzutu związanego z uruchomieniem dynamicznym, ale wątpię, że to wielka sprawa, chyba że zależysz od harmonogramu w czasie rzeczywistym.

Jeśli korzystasz z dużych stron w systemie, być może utworzenie większego statycznego obrazu jądra oznacza, że ​​efektywniej wykorzystujesz pamięć podręczną deskryptora strony. Niektóre systemy będą „umieszczać” jądro w klatce, aby było szczelnie spakowane w jednej lokalizacji pamięci, co może złagodzić pewne opóźnienia z powodu drobnych i być może poważnych błędów strony.

Architektonicznie może ci się przydać jeden duży obraz, argumentując, że mniej niezależnych modułów jest łatwiejszych w utrzymaniu, a utrata elastyczności nie jest ważna. Wiele tego rodzaju rozumowań podejmuje kwestie stylu i praktyki.


2

Czasami jest to konieczne. Jeśli skompilujesz jakiś istotny sterownik (np. Sterownik SCSI) jako moduł, system nie uruchomi się.

Innym doskonałym kandydatem na nie kompilacji jako moduł jest typ systemu plików na partycji root. Jeśli jądro nie rozumie ext3czytać, w /lib/modules/jaki sposób ładuje z niego moduły?

Pomyśl o tym w ten sposób: aby użyć modułów, jądro musi wiedzieć wystarczająco dużo o twoim systemie, aby czytać i ładować moduły jądra. Skorzystaj z tego i spróbuj i błąd :-)


Myślę o jakiejś wydajności poprawić? Czy jest w ogóle coś takiego?
phunehehe,

1
W przeszłości ludzie dokładali wszelkich starań, aby wyprodukować możliwie najmniejsze jądro zawierające tylko to, co jest wymagane . Dziś to się w dużej mierze zmieniło. W rzeczywistości za każdym razem, gdy ładujesz moduł po raz pierwszy, odczujesz niewielki spadek wydajności. Nie oznacza to, że powinieneś skompilować wszystko w jądrze :-) Zobacz: articleinput.com/e/a/title/…
nc3b

czy dla nieistotnego sterownika lub funkcjonalności jest jakaś korzyść? na przykład, jeśli chcę po prostu użyć terminala i zestawu narzędzi sieciowych bez innej potrzeby lub funkcjonalności. czy jest jakaś korzyść, jeśli po prostu skompiluję cały potrzebny moduł i sterownik w jądrze bez modułu ładowalnego?
uray

3
Byk. System uruchomi się dobrze ze sterownikiem SCSI jako modułem w initrd. Po to są.
wzzrd

Tak ... pod warunkiem, że moduł jest w stanie initrd, który jądro może zrozumieć ...
Dagelf,

2

Statycznie kompiluję każdy sterownik dla wbudowanego sprzętu w jądrze. Wyjątkiem byłby sprzęt, który nie jest stały (na przykład sprzęt podłączony do USB).

Ponieważ moja konfiguracja sprzętowa prawdopodobnie nie zmieni się w najbliższym czasie, nie przejmuję się modułami.

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.