Как ядро ​​Linux может скомпилировать себя? - PullRequest
87 голосов
/ 30 января 2009

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

Вот некоторые вещи, которые меня смутили:

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

Я был так растерян пару дней, спасибо за ответ.

Ответы [ 7 ]

207 голосов
/ 30 января 2009

Первый круг двоичных файлов для вашего Linux-бокса был построен на каком-то другом Linux-боксе (возможно).

Двоичные файлы для первой системы Linux были построены на некоторой другой платформе.

Двоичные файлы для этого компьютера могут отследить свой корень до исходной системы, которая была построена на другой платформе.

...

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

...

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

Очень классные вещи.

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

33 голосов
/ 30 января 2009

Я думаю, вы должны различать:

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

и

install , v: Для подключения, настройки или подготовки чего-либо для использования [2] .

Компиляция создает двоичные исполняемые файлы из исходного кода. Установка просто помещает эти двоичные исполняемые файлы в нужное место для запуска их позже. Таким образом, установка и использование не требуют компиляции, если двоичные файлы доступны. Думайте о «компилировать» и «устанавливать», как о «готовить» и «подавать», соответственно.

Теперь ваши вопросы:

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

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

Обычно, когда вы устанавливаете операционную систему, вы устанавливаете предварительно скомпилированное ядро ​​(двоичный исполняемый файл). Он был составлен кем-то другим. И только если вы хотите скомпилировать ядро ​​самостоятельно, вам понадобится исходный код, компилятор и все остальные инструменты.

Даже в «исходных» дистрибутивах, таких как gentoo, вы запускаете скомпилированный двоичный файл.

Таким образом, вы можете прожить всю свою жизнь, не компилируя ядра, потому что они собраны кем-то другим.

  1. Если компилятор C установлен на моем компьютере до компиляции ядра, как сам компилятор может быть скомпилирован без установленного компилятора?

Компилятор не может быть запущен, если нет ядра (ОС). Поэтому для запуска компилятора необходимо установить скомпилированное ядро, но не нужно для компиляции самого ядра.

Опять же, наиболее распространенной практикой является установка скомпилированных двоичных файлов компилятора и использование их для компиляции чего-либо еще (включая сам компилятор и ядро).

Теперь проблема с курицей и яйцом. Первый двоичный файл составлен кем-то другим ... Смотрите отличный ответ от dmckee.

14 голосов
/ 30 января 2009

Термин, описывающий это явление, - Самозагрузка , это интересная концепция для чтения. Если вы подумаете о разработке встраиваемых систем, станет ясно, что многие устройства, например, будильники, микроволновые печи, пульты дистанционного управления, для которых требуется программное обеспечение, недостаточно мощны для компиляции собственного программного обеспечения. На самом деле, такого рода устройствам обычно не хватает ресурсов для удаленной работы, такой сложной, как компилятор.

Их программное обеспечение разрабатывается на настольном компьютере и затем копируется после компиляции.

Если вас это интересует, статья, которая приходит мне в голову: Размышления о доверии ( pdf ), это классика и весело читать.

11 голосов
/ 30 января 2009

Ядро не компилируется само по себе - оно компилируется компилятором C в пользовательском пространстве. В большинстве архитектур ЦП процессор имеет ряд битов в специальных регистрах, которые представляют, какие привилегии имеет код, выполняемый в данный момент. В x86 это текущий уровень привилегий бит (CPL) в регистре сегмента (CS). Если биты CPL равны 00, говорят, что код работает в защитном кольце 0 , также известном как режим ядра . Если биты CPL равны 11, говорят, что код выполняется в защитном кольце 3 , также известном как пользовательский режим . Две другие комбинации, 01 и 10 (защитные кольца 1 и 2 соответственно), используются редко.

Правила о том, что код может и не может делать в пользовательском режиме по сравнению с режимом ядра, довольно сложны, но достаточно сказать, что пользовательский режим сильно снизил привилегии.

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

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

В случае Linux ядро ​​состоит из двух частей: исходного кода ядра и скомпилированного исполняемого файла ядра. Любая машина с компилятором C может скомпилировать ядро ​​из исходного кода в двоичный образ. Вопрос в том, что делать с этим двоичным изображением.

Когда вы устанавливаете Linux в новой системе, вы устанавливаете предварительно скомпилированный двоичный образ, обычно с физического носителя (например, CD-DVD) или из сети. BIOS загрузит (двоичный образ) загрузчик ядра с носителя или из сети, а затем загрузчик установит (двоичный образ) ядро ​​на ваш жесткий диск. Затем, когда вы перезагружаетесь, BIOS загружает загрузчик ядра с вашего жесткого диска, а загрузчик загружает ядро ​​в память, и вы запускаетесь.

Если вы хотите перекомпилировать ваше собственное ядро, это немного сложнее, но это можно сделать.

5 голосов
/ 17 сентября 2013

Это не черепахи все время вниз. Точно так же, как вы говорите, вы не можете скомпилировать операционную систему, которая никогда ранее не компилировалась в системе, в которой работает эта операционная система. Точно так же, по крайней мере, самая первая сборка компилятора должна быть сделана на другом компиляторе (и, как правило, некоторые последующие сборки, если оказывается, что первая сборка пока не может компилировать свой собственный исходный код).

Я думаю, что самые первые ядра Linux были скомпилированы на коробке Minix, хотя я не уверен в этом. GCC был доступен в то время. Одна из самых ранних целей многих операционных систем - достаточно хорошо запустить компилятор для компиляции собственного исходного кода. В дальнейшем первый компилятор почти наверняка был написан на ассемблере. Первые ассемблеры были написаны теми бедными людьми, которые должны были писать в сыром машинном коде.

Возможно, вы захотите проверить проект Linux From Scratch . Вы фактически строите в этой книге две системы: «временную систему», построенную на системе, которую вы не создали сами, а затем «систему LFS», которая построена на вашей временной системе. Как написано в настоящее время в книге, вы фактически собираете временную систему на другом Linux-компьютере, но теоретически вы можете адаптировать ее для создания временной системы на совершенно другой ОС.

5 голосов
/ 30 января 2009

Кто был там первым? курица или яйцо?

Яйца были со времен динозавров ..

.. некоторые путают все, говоря, что куры на самом деле являются потомками великих зверей ... Короче говоря: технология (Яйцо) существовала до появления Текущего продукта (Цыпленок)

Вам нужно ядро ​​для сборки ядра, то есть вы строите одно вместе с другим.

Первое ядро ​​может быть чем угодно (желательно что-то разумное, что может создать желаемый конечный продукт ^ __ ^)

Это руководство от Bran's Kernel Development научит вас разрабатывать и создавать небольшое ядро, которое вы затем сможете протестировать на виртуальной машине по вашему выбору.

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

То, что происходит с этими установками Linux, следует той же идее с добавленной сложностью.

1 голос
/ 17 сентября 2013

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

Если вы говорили о проблеме начальной загрузки; dmckee подвел итог довольно мило.

Просто предлагая еще одну возможность ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...