Jak jądro Linuksa może się skompilować?

89

Nie do końca rozumiem proces kompilacji jądra Linuksa, kiedy instaluję Linuksa na moim komputerze.

Oto kilka rzeczy, które mnie zdezorientowały:

  1. Jądro jest napisane w C, ale w jaki sposób jądro zostało skompilowane bez zainstalowanego kompilatora?
  2. Jeśli kompilator C jest zainstalowany na moim komputerze przed skompilowaniem jądra, w jaki sposób sam kompilator może zostać skompilowany bez zainstalowanego kompilatora?

Byłem taki zdezorientowany przez kilka dni, dzięki za odpowiedź.

MainID
źródło
o ile wiadomo, kompilator C został napisany w jakimś asamblerze przez jakichś szalonych i sprytnych ludzi z laboratoriów AT&T do kompilowania UNIX-a dla danego komputera (pamiętaj, że historia zaczyna się od UNIXa, a nie Linuksa, więc obawiam się, że przegapić rozdział ... lub kilka z nich!). Krótko mówiąc, nie było potrzeby przepisywania jądra unixa dla różnych komputerów, o ile komputery te mają odpowiedni kompilator dla języka C. Te kompilatory zostały napisane w specyficznym asamblerze komputerów docelowych. Szorstkie powiedzenie „Pierwszy kompilator napisany w asamblerze danego komputera, potem UNIX napisany w języku C”
Victor

Odpowiedzi:

208

Pierwsza runda plików binarnych dla twojego Linuksa została zbudowana na innym Linuksie (prawdopodobnie).

Pliki binarne dla pierwszego systemu Linux zostały zbudowane na niektórych innej platformie.

Pliki binarne tego komputera mogą prześledzić ich root z powrotem do oryginalnego systemu, który został zbudowany na innej platformie.

...

Posuń się wystarczająco daleko, a znajdziesz kompilatory zbudowane z bardziej prymitywnych narzędzi, które z kolei zostały zbudowane na maszynach innych niż ich host.

...

Naciskaj dalej, a znajdziesz komputery zbudowane tak, aby ich instrukcje można było wprowadzać, ustawiając przełączniki na przednim panelu maszyny .

Bardzo fajne rzeczy.

Zasada brzmi: „zbuduj narzędzia, aby zbudować narzędzia do budowy narzędzi…”. Bardzo podobne do narzędzi, które sterują naszym środowiskiem fizycznym. Nazywany również „podciąganiem się za buty”.

dmckee --- kociak ex-moderator
źródło
3
Niekoniecznie nieczyste. Po prostu niezoptymalizowany. pierwszy kompilator zostanie zoptymalizowany do pracy na 386, ale przekompilowana wersja będzie zoptymalizowana pod kątem dowolnej architektury.
Breton,
1
Możesz dodać trzeci stopień, jeśli wszystko jest w porządku, moc drugiego stopnia powinna być równa mocy trzeciego stopnia.
Ismael
27
To nie tylko oprogramowanie, to sprzęt. Nie ma możliwości zbudowania czegoś takiego jak P4 (czy nawet 486) bez komputera.
BCS
1
@BCS: Och, tak. Doszliśmy do punktu, w którym oprogramowanie i narzędzia sprzętowe są ze sobą głęboko powiązane i współzależne.
dmckee --- kociak ex-moderator
4
„Złożony system, który działa, niezmiennie wyewoluował z prostego systemu, który działał”. en.wikipedia.org/wiki/Gall's_law
ajuc
33

Myślę, że powinieneś dokonać rozróżnienia między:

compile , v: Aby użyć kompilatora do przetwarzania kodu źródłowego i tworzenia kodu wykonywalnego [1] .

i

install , v: Aby połączyć, skonfigurować lub przygotować coś do użycia [2] .

Kompilacja tworzy binarne pliki wykonywalne z kodu źródłowego. Instalacja po prostu umieszcza te binarne pliki wykonywalne we właściwym miejscu do późniejszego uruchomienia. Zatem instalacja i użytkowanie nie wymagają kompilacji, jeśli dostępne są pliki binarne. Pomyśl odpowiednio o „kompilacji” i „instalacji”, jak o „gotowaniu” i „podawaniu”.

Teraz twoje pytania:

  1. Jądro jest napisane w C, ale w jaki sposób jądro zostało skompilowane bez zainstalowanego kompilatora?

Jądra nie można skompilować bez kompilatora, ale można go zainstalować ze skompilowanego pliku binarnego.

Zwykle podczas instalowania systemu operacyjnego instaluje się wstępnie skompilowane jądro (binarny plik wykonywalny). Został skompilowany przez kogoś innego. I tylko jeśli chcesz samemu skompilować jądro, potrzebujesz źródła, kompilatora i wszystkich innych narzędzi.

Nawet w dystrybucjach opartych na źródłach, takich jak gentoo, zaczynasz od uruchomienia skompilowanego pliku binarnego.

Możesz więc przeżyć całe życie bez kompilowania jąder, ponieważ masz je skompilowane przez kogoś innego.

  1. Jeśli kompilator C jest zainstalowany na moim komputerze przed skompilowaniem jądra, w jaki sposób sam kompilator może zostać skompilowany bez zainstalowanego kompilatora?

Nie można uruchomić kompilatora, jeśli nie ma jądra (systemu operacyjnego). Trzeba więc zainstalować skompilowane jądro, aby uruchomić kompilator, ale nie trzeba samodzielnie kompilować jądra.

Ponownie, najczęstszą praktyką jest instalowanie skompilowanych plików binarnych kompilatora i używanie ich do kompilowania czegokolwiek innego (w tym samego kompilatora i jądra).

Teraz problem z kurczakiem i jajkiem. Pierwszy plik binarny został skompilowany przez kogoś innego ... Zobacz doskonałą odpowiedź dmckee.

śastanin
źródło
14

Terminem opisującym to zjawisko jest bootstrap , jest to ciekawa koncepcja do przeczytania. Jeśli myślisz o rozwoju systemów wbudowanych, staje się jasne, że wiele urządzeń, na przykład budziki, kuchenki mikrofalowe, piloty zdalnego sterowania, które wymagają oprogramowania, nie jest wystarczająco wydajnych, aby skompilować własne oprogramowanie. W rzeczywistości tego rodzaju urządzenia zazwyczaj nie mają wystarczających zasobów, aby uruchomić coś tak skomplikowanego jak kompilator.

Ich oprogramowanie jest tworzone na komputerze stacjonarnym, a następnie kopiowane po skompilowaniu.

Jeśli cię to interesuje, to na myśl przychodzi mi do głowy artykuł: Refleksje na temat zaufania ( pdf ), to klasyczna i zabawna lektura.

a2800276
źródło
1
Mylisz kompilację krzyżową z ładowaniem początkowym. Pierwsza dotyczy kompilatora, który istnieje tylko na komputerze PC i który tworzy rozkazy dla docelowej architektury. Oczywiście nie da się tego zrobić bez innego komputera, więc istnieje dylemat „jajko i kura”. Odpowiedzią na dylemat jest bootstrap, w którym do wygenerowania bardziej złożonego kompilatora używany jest napisany odręcznie lub istniejący wcześniej prosty kompilator.
Kevin Vermeer,
12

Jądro nie kompiluje się samo - jest kompilowane przez kompilator C w przestrzeni użytkownika. W większości architektur procesora CPU ma pewną liczbę bitów w specjalnych rejestrach, które reprezentują uprawnienia aktualnie uruchomionego kodu. W x86 są to bieżące bity poziomu uprawnień (CPL) w rejestrze segmentu kodu (CS). Jeśli bity CPL mają wartość 00, mówi się, że kod działa w pierścieniu bezpieczeństwa 0 , znanym również jako tryb jądra . Jeśli bity CPL mają wartość 11, mówi się, że kod działa w pierścieniu zabezpieczającym 3 , znanym również jako tryb użytkownika . Pozostałe dwie kombinacje, 01 i 10 (odpowiednio pierścienie zabezpieczające 1 i 2) są rzadko używane.

Zasady dotyczące tego, co kod może, a czego nie może robić w trybie użytkownika w porównaniu z trybem jądra, są dość skomplikowane, ale wystarczy powiedzieć, że tryb użytkownika ma znacznie ograniczone uprawnienia.

Teraz, kiedy ludzie mówią o jądrze systemu operacyjnego, mają na myśli fragmenty kodu systemu operacyjnego, które uruchamiają się w trybie jądra z podwyższonymi uprawnieniami. Ogólnie rzecz biorąc, autorzy jądra starają się, aby jądro było jak najmniejsze ze względów bezpieczeństwa, aby kod, który nie wymaga dodatkowych uprawnień, ich nie miał.

Kompilator C jest jednym z przykładów takiego programu - nie potrzebuje dodatkowych uprawnień oferowanych przez tryb jądra, więc działa w trybie użytkownika, jak większość innych programów.

W przypadku Linuksa jądro składa się z dwóch części: kodu źródłowego jądra i skompilowanego pliku wykonywalnego jądra. Każda maszyna z kompilatorem C może skompilować jądro z kodu źródłowego do obrazu binarnego. Powstaje zatem pytanie, co zrobić z tym binarnym obrazem.

Kiedy instalujesz Linuksa w nowym systemie, instalujesz prekompilowany obraz binarny, zwykle z fizycznego nośnika (takiego jak CD DVD) lub z sieci. BIOS załaduje (binarny obraz) bootloadera jądra z nośnika lub sieci, a następnie bootloader zainstaluje (binarny obraz) jądra na dysku twardym. Następnie, po ponownym uruchomieniu, BIOS ładuje bootloader jądra z twojego twardego dysku, a bootloader ładuje jądro do pamięci i jesteś gotowy do pracy.

Jeśli chcesz ponownie skompilować własne jądro, jest to trochę trudniejsze, ale można to zrobić.

Adam Rosenfield
źródło
5

Który był tam pierwszy? Kura czy jajko?

Jajka istnieją od czasów dinozaurów.

..niektóre zmylić wszystko, mówiąc, że kurczaki są w rzeczywistości potomkami wielkich bestii. Krótko mówiąc: technologia (jajko) istniała przed obecnym produktem (kurczak)

Potrzebujesz jądra do zbudowania jądra, tj. Budujesz jedno z drugim.

Pierwszym jądrem może być wszystko, co chcesz (najlepiej coś rozsądnego, co może stworzyć pożądany produkt końcowy ^ __ ^)

Ten poradnik od Brana Kernel Development nauczy Cię jak opracować i zbudować niewielkie jądro, które możesz następnie przetestować za pomocą wybranej maszyny wirtualnej.

Znaczenie: piszesz i kompilujesz jądro gdzieś i czytasz je na pustej (bez systemu operacyjnego) maszynie wirtualnej.

To, co dzieje się z tymi instalacjami Linuksa, jest zgodne z tym samym pomysłem z dodatkową złożonością.

Ric Tokyo
źródło
5

To nie żółwie do samego końca. Tak jak mówisz, nie możesz skompilować systemu operacyjnego, który nigdy wcześniej nie był kompilowany w systemie, na którym działa ten system operacyjny. Podobnie, przynajmniej pierwsza kompilacja kompilatora musi być wykonana na innym kompilatorze (i zwykle również niektóre kolejne kompilacje, jeśli ta pierwsza kompilacja okaże się, że nie jest jeszcze w stanie skompilować własnego kodu źródłowego).

Myślę, że pierwsze jądra Linuksa zostały skompilowane na pudełku Minix, chociaż nie jestem tego pewien. GCC było wtedy dostępne. Jednym z bardzo wczesnych celów wielu systemów operacyjnych jest uruchomienie kompilatora na tyle dobrze, aby skompilować własny kod źródłowy. Idąc dalej, pierwszy kompilator był prawie na pewno napisany w języku asemblera. Pierwsze asemblery zostały napisane przez tych biednych ludzi, którzy musieli pisać w surowym kodzie maszynowym.

Możesz sprawdzić projekt Linux From Scratch . W tej książce faktycznie budujesz dwa systemy: „system tymczasowy”, który jest zbudowany na systemie, którego sam nie zbudowałeś, a następnie „system LFS”, który jest zbudowany na twoim systemie tymczasowym. Sposób, w jaki książka jest obecnie napisana, w rzeczywistości tworzysz system tymczasowy na innym komputerze z Linuksem, ale teoretycznie możesz go dostosować do budowy systemu tymczasowego na zupełnie innym systemie operacyjnym.

The Spooniest
źródło
1

Jeśli dobrze rozumiem twoje pytanie. W dzisiejszych czasach jądro się nie „kompiluje”. Większość dzisiejszych dystrybucji Linuksa zapewnia instalację systemu za pomocą linuxa na żywo CD. Jądro jest ładowane z dysku CD do pamięci i działa tak, jak normalnie, tak jakby zostało zainstalowane na dysku. Z uruchomionym i działającym środowiskiem linux w systemie łatwo jest po prostu zatwierdzić potrzebne pliki na dysk.

Jeśli mówiłeś o kwestii ładowania początkowego; dmckee podsumował to całkiem nieźle.

Oferuję tylko inną możliwość ...

in70x
źródło