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