Что содержит дерево исходного кода ядра? Это связано с заголовками ядра Linux?


25

В книгах, я обычно читал ссылки на Linux Source Tree на /usr/src/linuxс обычным набором поддиректорий ( arch, block, crypto...).

Я ожидал, что это дерево будет содержать двоичные файлы, составляющие ядро. В моей системе (Ubuntu 10.04) ...

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

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. В подкаталогах я ожидал двоичные файлы, среди прочего. Тем не менее, я проверил достаточное количество дерева, и последний подкаталог, кажется, всегда имеет Makefile(при чтении это звучит, как правило, скорее как файл конфигурации, чем файл установки), а иногда и несколько изолированных других файлов. (в основном Kconfig).

Мой вопрос может быть наивным, но я немного запутался. Является ли (2) тем, что я должен ожидать увидеть в исходном дереве ядра; и почему у меня есть явная ссылка на «заголовки»? Мне нужно было установить linux-generic-headersкакое-то время назад какое-то другое программное обеспечение, и я не уверен, может ли это быть связано. Я понимаю, что есть хорошая причина для make-файлов (например, для установки модулей в подкаталоге / driver), но (в значительной степени) только для make-файлов?

Ответы:


30

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

Вы не должны ожидать, что вообще найдете бинарные файлы в исходном каталоге ядра , за исключением вывода сборки. (Если вы конфигурируете и собираете ядро ​​самостоятельно, исходный каталог ядра также будет содержать скомпилированные объекты, модули, само собранное ядро ​​и несколько других двоичных фрагментов, которые заставляют его работать.)
KConfigФайлы представляют собой описание параметров конфигурации ядра. (и их зависимости), которые доступны для данного каталога / модуля.
Кроме того, это все (в основном) исходный код на C, заголовочные файлы и Makefiles. Здесь и там есть несколько вспомогательных скриптов, а также источник ассемблера.

Пакеты заголовков (которые вы установили) содержат только часть заголовка из вышеперечисленного (и не все из этого - только «экспортированные» заголовки) и часть инфраструктуры сборки. Так что то, что вы видите, ожидается. Пакеты заголовков не содержат исходный код на языке C (за исключением некоторых заглушек и кода инфраструктуры сборки). Весь смысл наличия такого типа пакетов заключается в экономии места (и пропускной способности) - все дерево исходных текстов ядра Linux довольно большое и совершенно не нужно, если вы не собираетесь собирать ядро ​​самостоятельно. Пакеты заголовков создаются и поставляются дистрибутивами, чтобы обеспечить только нужные вещи, необходимые для сборки модулей, но не более того. (Они, конечно, не содержат скомпилированное ядро.)

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

Установленные двоичные файлы ядра обычно устанавливаются в /bootкаталоге вместе с двоичными файлами загрузчика и файлами конфигурации. (Это иногда независимая файловая система, по умолчанию не смонтированная.) Точное имя файлов зависит от ядра и дистрибутива. (Так же как и загрузчик.)

Установленные модули ядра находятся в подкаталогах:

/lib/modules/`uname -r`/

Так, например, в моей системе, они в настоящее время находятся в

/lib/modules/3.1.4-gentoo/

Полный исходный код ядра : в Ubuntu, если вы хотите, чтобы полные исходники ядра собирали ядро ​​самостоятельно, вам следует установить его, следуя приведенным здесь инструкциям .

Вы также можете скачать архив с исходным кодом kernel.orgи распаковать его куда-нибудь ( не перезаписывайте файлы, установленные в Ubuntu, если вы используете этот архив, сохраняйте свои личные данные и материалы, управляемые RPM отдельно).

/usr/src/linuxэто традиционное место для размещения исходных кодов ядра, но ничто не мешает вам размещать исходные коды ядра в другом месте. Этот путь также часто является просто символической ссылкой на каталог. например, у меня есть это на моей машине:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

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


Большое спасибо за этот подробный и довольно полный ответ. Это беспокоило меня некоторое время. Если я не переоцениваю свое приветствие, и если вы найдете время, могу ли я добавить следующее: (a) Я прочитал выше, что в моем случае (не самоустанавливающееся ядро), некоторые (один) из подпрограммы каталоги должны (могут) содержать исходные коды ядра C и Assembler. Где бы это было - не полный список, только когда я просматривал около 20-30 подкаталогов, я никогда не сталкивался с ними? Я скачал исходные файлы ядра с сайта kernel.org; Я просто хочу лучше понять мою систему. (б) ...
gnometorule

... так где (в общем случае) находятся двоичные файлы ядра, когда вы сами не устанавливаете ядро, как в моем случае? (c) Вы ссылаетесь на «пакеты заголовков», которые я принял за «linux-generic-headers». Это дерево, которое я вижу из этих пакетов? Если да, они перемещаются туда, где было дерево исходных текстов до их установки? Большое спасибо еще раз.
gnometorule

(если вы отвечаете, используйте «ответ», а не комментируйте, чтобы я, по крайней мере, мог бы снова поблагодарить вас за вашу помощь)
gnometorule

Немного расширился. Пакеты заголовков предназначены для заголовков. Полные исходные пакеты предоставляют полный исходный код. Двоичные пакеты предоставляют только двоичные файлы.
Мат

5
linux-sourceсодержит исходный код, apt-get source linux-image-$(uname -r)получает исходный код ядра с патчами Ubuntu.
Лекенштейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.