Як ядро ​​Linux може скомпілювати себе?


89

Я не зовсім розумію процес компіляції ядра Linux, коли я встановлюю систему Linux на свою машину.

Ось кілька речей, які мене збентежили:

  1. Ядро написано на мові C, проте як ядро ​​скомпілювалось без встановленого компілятора?
  2. Якщо компілятор C встановлений на моїй машині до компіляції ядра, як сам компілятор може бути скомпільований без встановленого компілятора?

Я був такий розгублений пару днів, дякую за відповідь.


наскільки відомо, C-компілятор був написаний якимось чином, якимись божевільними та кмітливими людьми в лабораторіях AT&T для компіляції UNIX для даного комп'ютера (зауважте, що історія починається з UNIX, а не з Linux, тому я боюся, що ви пропустити розділ ... або кілька з них!). Останнє полягає в тому, що не було необхідності переписувати ядро ​​unix для різних комп’ютерів, поки ці комп’ютери мають відповідний компілятор для мови C. Ці компілятори були написані в конкретному аналізі цільових комп'ютерів. Груба приказка "Спочатку компілятор написав у складі заданого комп'ютера, потім UNIX написав на C"
Віктор

Відповіді:


208

Перший раунд двійкових файлів для вашого Linux box був побудований на якомусь іншому Linux box (можливо).

Бінарні файли для першої системи Linux були побудовані на іншій платформі.

Двійкові файли для цього комп'ютера можуть прослідкувати свій корінь назад до оригінальної системи, побудованої на ще одній платформі.

...

Просуньте це досить далеко, і ви знайдете компілятори, побудовані з більш примітивними інструментами, які, в свою чергу, були побудовані на інших машинах, ніж їх хост.

...

Продовжуйте натискати, і ви виявите комп'ютери, побудовані таким чином, щоб їхні вказівки могли вводитись, встановивши перемикачі на передній панелі машини .

Дуже класні речі.

Правило: "побудувати інструменти для побудови інструментів для побудови інструментів ...". Дуже схожий на інструменти, які керують нашим фізичним середовищем. Також відомий як "підтягування себе за бутстрапи".


3
Не обов'язково нечистий. Просто неоптимізовано. перший компілятор буде оптимізований для роботи на 386, але перекомпільована версія оптимізована для будь-якої архітектури, яка у вас є.
Бретон

1
Ви можете додати третій етап, якщо все в порядку, вихід другого етапу повинен дорівнювати виходу третього етапу.
Ісмаель

27
Це не просто програмне забезпечення, це апаратне забезпечення. Немає жодного способу, як P4 (або навіть 486), можна було б побудувати без комп’ютера.
BCS

1
@BCS: О, так. Ми дійшли до того, що програмні та апаратні засоби глибоко взаємопов’язані та взаємозалежні.
dmckee --- кошеня екс-модератора

4
"Незмінно виявляється, що складна система, яка працює, перетворилася на просту, яка працювала". en.wikipedia.org/wiki/Gall's_law
серпень

33

Я думаю, вам слід розрізняти:

compile , v: використовувати компілятор для обробки вихідного коду та створення виконуваного коду [1] .

і

install , v: Щоб підключити, налаштувати або підготувати щось до використання [2] .

Компіляція створює двійкові виконувані файли з вихідного коду. Встановлення просто ставить ці двійкові виконувані файли в потрібне місце для їх подальшого запуску. Отже, встановлення та використання не вимагають компіляції, якщо двійкові файли доступні. Подумайте про "компіляцію" та "встановлення", як, наприклад, про "готувати" та "подавати", відповідно.

Тепер ваші запитання:

  1. Ядро написано на мові C, проте як ядро ​​скомпілювалось без встановленого компілятора?

Ядро не може бути скомпільовано без компілятора, але його можна встановити зі скомпільованого двійкового файлу.

Зазвичай, коли ви встановлюєте операційну систему, ви встановлюєте попередньо скомпільоване ядро ​​(двійковий виконуваний файл). Його склав хтось інший. І лише якщо ви хочете скомпілювати ядро ​​самостійно, вам потрібні джерело та компілятор, а також всі інші інструменти.

Навіть у "розподілених на основі джерел", таких як gentoo, ви починаєте з запуску скомпільованого двійкового файлу.

Отже, ви можете прожити все своє життя без компіляції ядер, тому що у вас їх компілює хтось інший.

  1. Якщо компілятор C встановлений на моїй машині до компіляції ядра, як сам компілятор може бути скомпільований без встановленого компілятора?

Компілятор не можна запустити, якщо немає ядра (ОС). Отже, для запуску компілятора потрібно встановити скомпільоване ядро, але не потрібно компілювати ядро самостійно.

Знову ж таки, найпоширенішою практикою є встановлення скомпільованих двійкових файлів компілятора та використання їх для компіляції будь-чого іншого (включаючи сам компілятор та ядро).

Тепер проблема з куркою та яйцем. Перший двійковий файл компілює хтось інший ... Дивіться чудову відповідь dmckee.


14

Термін, що описує це явище, є завантажувальним , це цікаве поняття, про яке слід прочитати далі. Якщо задуматися про вбудовану розробку, стає зрозумілим, що багато пристроїв, скажімо, будильники, мікрохвильовки, пульти дистанційного керування, для яких потрібне програмне забезпечення, недостатньо потужне для компіляції власного програмного забезпечення. Насправді у таких типів пристроїв зазвичай недостатньо ресурсів для запуску чогось віддаленого, такого складного, як компілятор.

Їх програмне забезпечення розробляється на настільному комп'ютері, а потім копіюється після його компіляції.

Якщо вас цікавить подібне, стаття, яка мені спадає на думку: « Роздуми про довіру довіри» ( pdf ), це класичне та веселе читання.


1
Ви плутаєте перехресне компілювання із завантаженням. Перший включає компілятор, який існує лише на ПК і який створює коди операцій для цільової архітектури. Очевидно, що без іншого комп’ютера цього не обійтися, тому виникає дилема щодо курки та яєць. Відповіддю на дилему є завантаження, коли рукописний або вже існуючий простий компілятор використовується для створення більш складного компілятора.
Kevin Vermeer

12

Ядро не компілюється самостійно - воно компілюється компілятором С в просторі користувачів. У більшості архітектур процесора центральний процесор має ряд бітів у спеціальних регістрах, які представляють, які привілеї має код, що працює в даний час. У x86 це поточні біти рівня привілеїв (CPL) у регістрі сегмента коду (CS). Якщо біти CPL дорівнюють 00, код, як кажуть, працює в захисному кільці 0 , також відомому як режим ядра . Якщо біт CPL дорівнює 11, код, як кажуть, працює в захисному кільці 3 , також відомому як режим користувача . Інші дві комбінації, 01 та 10 (захисні кільця 1 та 2 відповідно), використовуються рідко.

Правила щодо того, що код може, а що не може робити в режимі користувача в порівнянні з режимом ядра, досить складні, але досить сказати, що режим користувача значно зменшив привілеї.

Тепер, коли люди говорять про ядро ​​операційної системи, вони мають на увазі частини коду ОС, які запускаються в режимі ядра з підвищеними привілеями. Як правило, автори ядра намагаються тримати ядро ​​якомога меншим з міркувань безпеки, щоб код, який не потребує додаткових привілеїв, не мав їх.

Компілятор C є одним із прикладів такої програми - йому не потрібні додаткові привілеї, пропоновані режимом ядра, тому він працює в користувацькому режимі, як і більшість інших програм.

У випадку з Linux ядро ​​складається з двох частин: вихідного коду ядра та складеного виконуваного файлу ядра. Будь-яка машина з компілятором C може скомпілювати ядро ​​із вихідного коду у двійковий образ. Тоді питання полягає в тому, що робити з цим двійковим зображенням.

Коли ви встановлюєте Linux у новій системі, ви встановлюєте попередньо скомпільований двійковий образ, як правило, з фізичного носія (наприклад, CD DVD) або з мережі. BIOS завантажить (двійковий образ) завантажувача ядра з носія або мережі, а потім завантажувач встановить (двійковий образ) ядра на ваш жорсткий диск. Потім, при перезавантаженні, BIOS завантажує завантажувач ядра з вашого жорсткого диска, а завантажувач завантажує ядро ​​в пам’ять, і ви вимикаєтесь і працюєте.

Якщо ви хочете перекомпілювати власне ядро, це трохи складніше, але це можна зробити.


5

Який там був першим? курка чи яйце?

Яйця існують ще з часів динозаврів ..

..дехто все плутає, кажучи, що кури насправді є нащадками великих звірів .. коротше: Коротка історія: Технологія (Яйце) існувала ще до Поточного продукту (Курка)

Вам потрібно ядро ​​для побудови ядра, тобто ви будуєте одне з іншим.

Першим ядром може бути все, що завгодно (бажано щось розумне, що може створити бажаний кінцевий продукт ^ __ ^)

Цей підручник з Розробки ядра Брана вчить вас розробляти та будувати невелике ядро, яке потім можна протестувати на вибраній вами віртуальній машині.

Значення: ви десь пишете та компілюєте ядро ​​і читаєте його на порожній (без ОС) віртуальній машині.

Те, що відбувається з цими встановленнями Linux, слідує тій самій ідеї з додатковою складністю.


5

Це не черепахи аж донизу. Як і ви говорите, ви не можете скомпілювати операційну систему, яка ніколи раніше не була скомпільована в системі, на якій працює ця операційна система. Подібним чином, принаймні найперша збірка компілятора повинна бути виконана на іншому компіляторі (і, як правило, деякі наступні збірки теж, якщо ця перша збірка виявляється ще не в змозі скомпілювати власний вихідний код).

Я думаю, що перші ядра Linux були скомпільовані на коробці Minix, хоча я не впевнений у цьому. У той час була доступна GCC. Однією з найперших цілей багатьох операційних систем є запуск компілятора, достатньо для компіляції власного вихідного коду. Далі, перший компілятор майже напевно був написаний мовою асемблера. Перші асемблери були написані тими бідними людьми, яким доводилося писати сирим машинним кодом.

Можливо, ви захочете перевірити проект Linux From Scratch . У книзі ви фактично будуєте дві системи: "тимчасову систему", яка побудована на системі, яку ви не будували самі, а потім "систему LFS", побудовану на вашій тимчасовій системі. Як написана книга в даний час, ви фактично будуєте тимчасову систему на іншому вікні Linux, але теоретично ви можете адаптувати її для побудови тимчасової системи на зовсім іншій ОС.


1

Якщо я правильно розумію ваше запитання. Ядро не "самокомпілюється" в наші дні. Сьогодні більшість дистрибутивів Linux забезпечують встановлення системи через живий компакт-диск Linux. Ядро завантажується з компакт-диска в пам'ять і працює як зазвичай, як якщо б воно було встановлено на диск. В середовищі Linux, яке працює і працює у вашій системі, легко просто записати необхідні файли на ваш диск.

Якщо ви говорили про проблему завантаження; dmckee резюмував це досить приємно.

Просто пропоную ще одну можливість ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.