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