Що містить дерево джерела ядра? Це пов’язано з заголовками ядра 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деякий час назад для якогось іншого програмного забезпечення, і я не впевнений, чи це може бути пов'язано. Я усвідомлюю, що є вагомі причини для файлів (наприклад, для встановлення модулів у підкаталозі / driver), але (в значній мірі) лише makefiles?

Відповіді:


30

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

Ви не повинні сподіватися, що бінарні файли взагалі знайдуться у вихідному каталозі ядра , за винятком збірки вихідних даних. (Якщо ви налаштовуєте і створюєте ядро ​​самостійно, каталог джерела ядра також буде містити скомпільовані об'єкти, модулі, власне вбудоване ядро ​​та кілька інших бінарних бітів та фрагментів, які змушують його працювати.)
KConfigФайли - це опис параметрів конфігурації ядра. (та їх залежності), які доступні для певного каталогу / модуля.
Крім цього, це все (в основному) C вихідний код, файли заголовків та Makefiles. Тут і там є кілька допоміжних скриптів, а також джерело збірки.

Пакети заголовків (що ви встановили) містять лише заголовну частину вищезазначеного (і не все це - лише "експортовані" заголовки), а також частину інфраструктури побудови. Тож те, що ви бачите, очікується. Пакети заголовків не містять вихідного коду С (за винятком деяких заглушок та інфраструктурного коду побудови). Весь сенс наявності цього типу пакету полягає в економії місця (і пропускної здатності) - ціле дерево вихідного ядра 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

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


Дуже дякую за цю детальну та досить повну відповідь. Це надовго мене клопіло. Якщо я не перебільшую свої вітання, і якщо ви знайдете час, чи можу я люб'язно додати, дотримуючись: каталоги повинні (можуть) містити ядро ​​C та вихідний код Assembler. Де це було б - не повний список, лише коли я переглядав 20 - 30 підкаталогів, я жодного разу не натрапляв на нього? Я завантажив вихідні файли ядра з kernel.org; Я просто маю на увазі краще зрозуміти свою систему. (б) ...
гнометорул

... так де (загалом) розташовані бінарні файли ядра, коли ви не встановлюєте ядро ​​самостійно, як у моєму випадку? (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.