Структура модуля ядра та методи його компіляції. Компілювання ядра та модулів. Установка середовища розробки

Головна / Google Play

Примітка: У майбутньому я планую використовувати систему T2, щоб компілювати ядро ​​і модулі для Puppy. T2 в даний час встановлюється, щоб компілювати ядро ​​та численні додаткові модулі, але не та версія, яка зараз використовується в Puppy. Я припускаю синхронізувати в майбутніх версіях Puppy, таким чином, ядро, відкомпільовані в T2, буде використовуватися в Puppy. Див. http://www.puppyos.net/pfs/ для подальшої інформації щодо Puppy та T2.

Puppy має дуже простий спосіб використання C/C++ компіляторів за допомогою додавання єдиного файлу devx_xxx.sfs , де xxx - номер версії. Наприклад, Puppy 2.12 мав би файл розробки відповідності названий devx_212.sfs . Працюючи в режимі LiveCD, помістіть файл devx_xxx.sfs в те саме місце, де знаходиться ваш персональний файл налаштувань pup_save.3fs , який, зазвичай, знаходиться в каталозі /mnt/home/ . Це також відноситься і для інших режимів інсталяції, які мають pup_save.3fs файл. Якщо Puppy встановлений на жорсткий диск з повною інсталяцією "Option 2", то в цьому випадку немає жодного особистого файлу, подивіться на веб-сторінках Puppy, щоб компілювати з різними опціями вибору конфігурації, таким чином модулі не сумісні. Ці версії вимагають лише одного виправлення для squashfs. Puppy 2.12 має ядро ​​2.6.18.1 та має три виправлення; squashfs , значення loglevel у консолі за замовчуванням та виправлення з вимкненням комп'ютера.

Ці команди, що виправляють ядро, дано виключно для вашої самоосвіти, оскільки доступне вже виправлене ядро.

Перше, що ви повинні спочатку зробити це ядро. Воно знаходиться , щоб знайти посилання на відповідний сайт завантаження. Це має бути «стародавнє» джерело, доступне на kernel.org або його дзеркалах.

Підключіться до інтернету, завантажте ядро ​​в папку /usr/src. Потім розпакуйте його:

cd / usr / src tar -jxf linux-2.6.16.7.tar.bz2 tar -zxf linux-2.6.16.7.tar.gz

Ви повинні бачити цю папку: /usr/src/linux-2.6.16.7. Ви повинні переконатися, що це посилання вказує на ядро:

ln -sf linux-2.6.16.7 linux ln -sf linux-2.6.16.7 linux-2.6.9

Ви повинні застосувати такі виправлення, так, щоб у Вас було точно те саме джерело, яке використовується при компілюванні ядра для Puppy. Інакше у вас будуть з'являтися повідомлення про помилки "unresolved symbols" (невирішеними символами), при компіляції драйвера і намагаєтеся використовувати його з ядром Puppy. Використання виправлення squashfs

По-друге, застосуйте виправлення Squashfs. Виправлення Squashfs додає підтримку Squashfs, яка робить файлову систему тільки для читання.

Завантажте виправлення, squashfs2.1-patch-k2.6.9.gz у папку /usr/src . Зазначте, що це виправлення було зроблено для версії 2.6.9 ядра, але продовжує працювати і в 2.6.11.x версіях, доки існує посилання на linux-2.6.9. Потім, застосуйте виправлення:

Cd/usr/src gunzip squashfs2.1-patch-k2.6.9.gz cd/usr/src/linux-2.6.11.11

Зауваження, у p1 це число 1, не символ l ... (Відмінний жарт - прим. перев.)

patch --dry-run-p1< ../ squashfs2.1-patch patch -p1 < ../ squashfs2.1-patch

Готово! Ядро готове до компілювання!

Компілювання ядра

Необхідно отримати конфігураційний файл для ядра. Копія його знаходиться в папці /lib/modules.

Потім зробіть ці кроки:

Cd/usr/src/linux-2.6.18.1

Якщо є файл .config, скопіюйте його кудись тимчасово або перейменуйте.

make clean make mrproper

Скопіюйте файл.

make menuconfig

… зробіть будь-які зміни, які ви хочете та збережете їх. У Вас тепер буде новий.config файл, і Ви повинні скопіювати його кудись для збереження. Див. примітку нижче

make bzImage

Ось тепер ви скомпілювали ядро.

Відмінно, ви знайдете ядро ​​Linux у папці /usr/src/linux-2.6.18.1/arch/i386/boot/bzImage

Компілювання модулів

Тепер увійдіть в /lib/modules і якщо вже є папка, названа 2.6.18.1, перейменуйте папку 2.6.18.1 на 2.6.18.1-old.

Тепер встановлювати нові модулі:

CD/usr/src/linux-2.6.18.1 make modules make modules_install

… після цього ви повинні знайти нові модулі встановленими в папці /lib/modules/2.6.18.1.

Відмітьте, останній крок вище виконує програму «depmod» і це може дати повідомлення про помилки про символи, що відсутні, для деяких з модулів. Не хвилюйтеся про це - один із розробників лоханувся, і це означає, що ми не можемо використовувати той модуль.

Як використовувати нове ядро ​​та модулі

Краще, якщо у вас є встановлений Puppy Unleashed. Тоді tarball розширений і існують 2 каталоги: "boot" і "kernels".

"Boot" містить структуру файлу та скрипт, щоб створити початковий віртуальний диск. Ви повинні помістити туди деякі модулі ядра.

У «kernels» каталогу є каталог kernels/2.6.18.1/ , і Ви повинні замінити модулі з Вашими оновленими. Можна і не замінювати якщо Ви перекомпілювали ту саму версію ядра (2.6.18.1).

Зауважте, що в kernels/2.6.18.1 є файл з ім'ям "System.map". Ви повинні перейменувати його та замінити новим з /usr/src/linux-2.6.18.1. Перегляньте папку kernels/2.6.18.1/ , і Ви повинні знати, що потрібно оновити.

Якщо компілювати ядро ​​в повній інсталяції Puppy, ви можете перезавантажити за допомогою нового ядра. make modules_install кроком вище, встановлювали нові модулі /lib/modules/2.6.18.1 , але ви повинні також встановити нове ядро. Я збираюсь з Grub, і просто скопіюю нове ядро ​​в каталог /boot (і перейменуйте файл з bzImage в vmlinuz).

Примітка щодо menuconfig (конфігурація меню). Я використав його цілу вічність, так що вважайте деякі речі само собою зрозумілим, проте новачок міг би бути спантеличений, бажаючи вийти від програми. У меню верхнього рівня є меню, щоб зберегти конфігурацію – ігноруйте його. Тільки натисніть клавішу TAB (або клавішу стрілки «вправо»), щоб підсвітити Exit «кнопку» і натисніть клавішу ENTER. Після цього вас запитають, чи Ви хочете зберегти нову конфігурацію, і ваша відповідь повинна бути Так (Yes)

Коли виникає необхідність створення потужної та надійної системи на основі Linux (чи обслуговування технологічних процесів, веб-хостингу тощо), то дуже часто доводиться налаштовувати системне ядро ​​таким чином, щоб вся система працювала більш ефективно і надійно. Ядро Linux хоч і є універсальним, проте бувають ситуації, коли його необхідно «підтюнінгувати» з об'єктивних причин. Та й сама архітектура ядра це припускає завдяки своїй відкритості. Таким чином, системні адміністратори Linux – це люди, яким важливо знати та розуміти деякі загальні аспекти конфігурування ядра Linux.

Способи конфігурації ядра Linux

За час розвитку Linux поступово склалися чотири основні способи конфігурування її ядра:

  • модифікація настроюваних параметрів ядра;
  • складання ядра з вихідних кодів з внесенням потрібних змін та/або доповнень у тексти вихідних кодів ядра;
  • динамічне підключення нових компонентів (функціональних модулів, драйверів) до існуючого складання ядра;
  • передача спеціальних інструкцій ядру під час початкового завантаження та/або використовуючи завантажувач (наприклад, GRUB).

Залежно від конкретної ситуації слід використати той чи інший спосіб. Але відразу слід зазначити, що насправді найпростішим є перший – налаштування параметрів ядра. Найскладнішим же є компіляція ядра з вихідних кодів.

Настроювання параметрів ядра

Системне ядро ​​Linux розроблялося таким чином, щоб завжди була можливість його максимально гнучко (втім, як і все в системах UNIX та Linux) налаштувати, адаптуючи його до необхідних умов експлуатації та апаратного оточення. Причому так, щоб це було можливо динамічно на готовому збиранні ядра. Іншими словами, системні адміністратори можуть будь-якої миті часу вносити коригувальні параметри, що впливають на роботу як самого ядра, так і його окремих компонентів.

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

Але як і все в системах UNIX і Linux, настроювання параметрів ядра по інформаційних каналах пов'язане з файловою системою. Щоб переглянути конфігурацію ядра та керувати нею, у файловій системі в каталозі /proc/sys існують спеціальні файли. Це звичайні файли, але вони відіграють роль посередників у наданні інтерфейсу для динамічної взаємодії з ядром. Однак документація, що стосується цього аспекту, зокрема про опис конкретних параметрів та їх значень досить мізерна. Одним із джерел, з якого можна отримати деякі відомості з цієї теми, є підкаталог Documentation/sysent в каталозі з вихідними кодами ядра.

Для наочності варто розглянути невеликий приклад, який показує, як через параметр ядра налаштувати максимальну кількість одночасно відкритих файлів у системі:

$ cat /рrос/sys/fs/file-max 34916 $ sudo sh -c "echo 32768 > /proc/sys/fs/file-max"

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

Також можна використовувати спеціалізовану утиліту sysctl. Вона дозволяє отримати значення змінних прямо з командного рядка, або список пар виду змінна = значення файлу. На етапі початкового завантаження утиліта зчитує початкові значення деяких параметрів, заданих у файлі /etc/sysctl.conf. Докладнішу інформацію про утиліту sysctlможна знайти на сторінках.

У наступній таблиці наводяться деякі параметри ядра, що настроюються:

Каталог Файл/параметр Призначення
З autoeject Автоматичне відкривання лотка з компакт-диском під час монтажу пристрою CD-ROM
F file-max максимальна кількість відкритих файлів. Для систем, яким доводиться працювати з великою кількістю файлів, можна збільшувати це значення до 16384
F inode-max Максимальна кількість відкритих індексних дескрипторів в одному процесі. Корисно для програм, які відкривають десятки тисяч дескрипторів файлів
До
До printk ratelimit Мінімальний інтервал між повідомленнями ядра в секундах
До printk_ratelimi_burst Кількість повідомлень, які мають бути отримані, перед тим, як значення мінімального інтервалу між повідомленнями printk стане активним
До shmmax Максимальний розмір спільно використовуваної пам'яті
N conf/default/rp_filter Включає механізм перевірки маршруту до вихідного файлу
N icmp_echo_ Ігнорування ICMP-запитів, якщо значення дорівнює 1
N icmp_echo_ Ігнорування широкомовних ICMP-запитів, якщо значення 1.
N ip_forward Перенаправлення IP-пакетів, якщо значення дорівнює 1. Наприклад, коли машина на Linux використовується як маршрутизатор, це значення потрібно встановлювати рівним 1
N ip_local_port_ Діапазон локальних портів, що виділяється під час конфігурування з'єднань. Для підвищення продуктивності серверів, що ініціюють багато вихідних з'єднань, цей параметр потрібно розширити до 1024-65000
N tcp_fin_timeout Інтервал очікування (у секундах) заключного RN-пакету. З метою підвищення продуктивності серверів, що пропускають великі обсяги трафіку, потрібно встановлювати нижчі значення (порядку 20)
N tcp_syncookies Захист від атак хвильового розповсюдження SYN-пакетів. Потрібно включати за наявності ймовірності DOS-атак

Умовні позначення: F - /proc/sys/fs, N - /proc/sys/net/ipv4, К - /proc/sys/kernel, С - /proc/sys/dev/cdrom.

$ sudo sysctl net.ipv4.ip_forward=0

В результаті виконання цієї команди буде вимкнено перенаправлення IP-пакетів. Є одна особливість для синтаксису цієї команди: символи точки в net.ipv4.ip_forward замінюють символи косої риси в дорозі до файлу ip_forward.

Коли потрібно збирати нову версію ядра?

В даний час ядро ​​Linux розвивається дуже швидко та бурхливо. Найчастіше виробники дистрибутивів не встигають впроваджувати у системи нові версії ядер. Як правило, всі новомодні «фішки» більше знадобляться любителям екзотики, ентузіастам, власникам новинок пристроїв і обладнання і просто цікавим - тобто переважно тим, в чиєму розпорядженні є звичайний комп'ютер.

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

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

Якщо ж ухвалено рішення оновити версію ядра шляхом його самостійного складання, потрібно з'ясувати, чи є дана версія стабільною. Раніше система нумерування версій ядра Linux була організована таким чином, що парні номери версій означали стабільний випуск, непарні ще «сирий». В даний час цей принцип дотримується далеко не завжди і з'ясовувати цей момент слід з інформації на офіційному сайті kernel.org.

Налаштування параметрів ядра

Конфігурація для майбутнього складання ядра Linux зберігається у файлі .config. Мало хто займається ручним створенням і редагуванням цього файлу, оскільки, по-перше: це складний синтаксис, який далеко не самий «людинозрозумілий», і по-друге: існують способи для автоматичної генерації конфігурації складання ядра зі зручним графічним (або псевдографічним) інтерфейсом. Список основних команд для конфігурування збирання ядра:

  • make xconfig – рекомендується, якщо використовується графічне середовище KDE. Дуже зручний інструмент;
  • make gconfig – найкращий варіант для використання у графічному середовищі GNOME;
  • make menuconfig – цю утиліту слід використовувати у псевдографічному режимі. Вона не така зручна, як дві попередні, проте зі своїми функціями справляється гідно;
  • make config – найзручніший «консольний» варіант, який виводить запити на завдання значень кожного параметра ядра. Не дає змоги змінити вже задані параметри.

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

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

Для конфігурації складання ядра Linux потрібно перейти в каталог з вихідними кодами і запустити одну з команд генерації конфігурації.

В результаті роботи вищезгаданих команд буде згенеровано файл.conf, фрагмент вмісту з якого може бути наступним:

# # Automatically generated file; DO NOT EDIT. # Linux/x86 4.20.7 Kernel Configuration # # # Compiler: gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 # CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=70300 CONFIG_CLANG_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_USELIB=y

Як можна бачити, в даному коді немає нічого привабливого для ручного редагування, про що навіть згадує запис коментаря на початку файлу. Символ «y» в кінці якогось рядка вказує, що відповідний компонент буде скомпільований у складі ядра, «m» — як модуль, що підключається. Розшифровки або описи про кожен компонент або параметр у файлі.config не міститься - з цих питань слід вивчати відповідну документацію.

Компіляція ядра

Найскладніше у компіляції ядра Linux – це створення конфігурації складання, оскільки потрібно знати, які компоненти підключати. Хоча використання команд make xconfig, make gconfig, make menuconfig і забезпечує завдання стандартної робочої конфігурації, з якою система працюватиме на більшості апаратних платформ та конфігурацій. Питання лише тому, щоб грамотно поставити конфігурацію ядра без непотрібних і які займають зайві ресурси компонентів у його роботі.

Отже, для успішного конфігурування та компіляції ядра необхідно виконати такі дії:

  • перейти до каталогу з вихідними кодами ядра. Зазвичай "вихідники" для ядра Linux поміщаються в каталог /usr/src, або можна завантажити з сайту kernel.org в будь-яке зручне місце;
  • виконати команду make xconfig, make gconfig чи make menuconfig;
  • виконати команду make dep (можна не виконувати для ядер версії 2.6.x та пізніших);
  • виконати команду make clean (для очищення від того, що може завадити успішному складання);
  • виконати команду make;
  • виконати команду make modules_install;
  • скопіювати файл /arch/ім'я_архітектури/boot/bzImage в /boot/vmlinuz. Тут каталог /arch знаходиться в каталозі з вихідними кодами ядра Linux, имя_архитектуры - каталог, що має ім'я відповідної архітектури (зазначеної на етапі конфігурування). Ім'я зібраного бінарного образу ядра bzImage може бути іншим;
  • скопіювати файл /arch/ім'я_архітектури/boot/System.map у /boot/System.map;
  • внести зміни до конфігураційних файлів системних завантажувачів /etc/lilo.conf (для LILO) або /boot/grub/grub.conf - для GRUB, а також додати до них відповідні конфігураційні та параметри завантаження для нового ядра.

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Linux: Повне керівництво Колісниченко Денис Миколайович

28.2. Компіляція модуля

28.2. Компіляція модуля

Компілювати ми будемо файл module.c. Для цього знадобиться встановлений компілятор gcc, файли заголовків і вихідні тексти ядра. Якщо ви дочитали книгу до цього розділу, то у вас уже мають бути встановлені пакети:

1. cpp – препроцесор cpp;

2. binutils - набір різних утиліт (as, gprof, ld);

3. glibc-kerheaders – заголовні файли ядра;

4. glibc-devel – допоміжні файли для розробки додатків з використанням стандартної бібліотеки С;

5. gcc – компілятор gcc.

Залишилося встановити пакет kernel-source – вихідні тексти ядра Linux. Крім того, потрібно переконатися, що ваше ядро ​​підтримує модулі, що динамічно завантажуються (п. 20.3.2.3). Якщо опція Enable loadable module support вимкнено, її потрібно увімкнути, зберегти файл конфігурації ядра і перекомпілювати ядро.

Компілятор gcc потрібно викликати з безліччю опцій, тому для полегшення роботи ми напишемо make-файл (п. 21.2):

Лістинг 28.5. Makefile для збирання модуля

PATH=/usr/include /usr/src/linux-2.4/include

MODFLAGS:= -O3 -Wall -DLINUX -D__KERNEL__ -I$(PATH)

module.o: module.с

$(CC) $(MODFLAGS) -c module.с

Опції компілятора означають таке:

O3: буде використано третій рівень оптимізації (що це таке, ви дізнаєтесь у довідковій системі gcc: man gcc);

Wall: включаємо усі попередження;

DLINUX: генеруємо код для Linux;

I$(РАТН): визначаємо шлях пошуку заголовних файлів. За замовчуванням компілятор шукає файли заголовків у каталозі /usr/include, але може й не бути потрібних файлів. Наприклад, для дистрибутива ALT Linux (ядро 2.4.21) файли заголовків знаходяться у каталозі /usr/include/linux-2.4.21rel-std-up.

Помістіть файл make в той же каталог, де знаходиться module.c, і виконайте команду make . Після її виконання ви отримаєте файл module.o, який буде знаходитись у тому ж каталозі.

# insmod module.o

Ви побачите повідомлення My module: Starting... Це повідомлення буде записано у файл протоколу /var/log/messages .

З книги C++ автора Хілл Мюррей

1.1.2 Компіляція Звідки з'явилися вихідний потік cout та код, що реалізує операцію виведення ««? Для отримання виконуваного коду написана на З++ програма має бути скомпільована. За своєю суттю процес компіляції такий самий, як і для С, і в ньому бере участь більшість вхідних

З книги Fedora 8 Посібник користувача автора

3.4.3. Компіляція Як правило, вихідні коди програм розповсюджуються у вигляді архіву з подвійним розширенням -.tar.gz. Вихідний код прийнято розпаковувати у каталог /usr/src. Тому для розпакування архіву вам потрібно виконати наступні команди: sucd /usr/srcgunzip архів. tar.gztar xvf

З книги Linux для користувача автора Костромін Віктор Олексійович

З книги 200 найкращих програм для Linux автора Яремчук Сергій Акимович

17.5.6. Компіляція модулів Якщо ви конфігурували якісь драйвери як окремі модулі (вибирали при конфігурації варіант "m" при відповіді на деякі питання), то ви повинні ще виконати команду make modules, а потім ще команду make modules_install. У файлі Documentation/modules.txt можна

З книги Мова програмування С# 2005 та платформа.NET 2.0. автора Троелсен Ендрю

Компіляція програм Навіть після появи пакетів, які були вже скомпіловані програми, компіляція тривалий час залишалася і для деяких залишається основним засобом встановлення. Примітка Перші комбіновані набори з'явилися в

З книги Asterisk™: майбутнє телефонії Друге видання автора Меггелен Джим Ван

Умовна компіляція Інший пакет директив препроцесора (#if, #elif, #else, #endif) дозволяє компіляцію блоку програмного коду за умовою, базуючись на попередньо заданих символах. Класичним варіантом використання цих директив є ідентифікація блоку

З книги Мережеві засоби Linux автора Сміт Родерік В.

З книги Мова програмування Сі для персонального комп'ютера автора Бочков C. О.

Компіляція libpri Для бібліотек libpri не використовується програма autoconf для налаштування середовища збирання або вікна вибору компонентів збирання, оскільки вони не потрібні; таким чином установка спрощується. libpri застосовується різними виробниками апаратних засобів

З книги Linux: Повне керівництво автора Колісниченко Денис Миколайович

Компіляція Asterisk Після компіляції та встановлення пакетів zaptel та libpri (якщо вони потрібні) можна переходити до установки Asterisk. У цьому розділі розглядається стандартна установка та представлені деякі альтернативні аргументи make, які можуть

З книги Linux програмування у прикладах автора Роббінс Арнольд

Компіляція ядра Після того як ви налаштували ядро ​​системи, виконавши make xconfig або іншу команду, наведену на початку цього розділу, ви повинні скомпілювати ядро ​​та встановити його модулі. Для цього необхідно виконати наступні команди: # make dep # make bzImage # make modules # make

З книги Мова Сі - керівництво для початківців автора Прата Стівен

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

З книги Linux очима хакера автора Фльонов Михайло Євгенович

20.5. Компіляція ядра 20.5.1. Навіщо оновлювати ядро? Linux розвивається швидше за будь-яку іншу операційну систему. Регулярно з'являються нові версії ядра, реалізують нові функції. Наприклад, щойно встиг вийти дистрибутив Fedora Core 4 на ядрі 2.6.11, а на www.kernel.org вже лежить стабільна

З книги Операційна система UNIX автора Робачевський Андрій М.

15.2. Компіляція для налагодження Для використання відладчика вихідного коду, виконуваний файл, що налагоджується, повинен бути відкомпільований з опцією компілятора -g. Ця опція змушує компілятор впроваджувати до об'єктного коду додаткові налагоджувальні ідентифікатори; тобто

З книги автора

Чому компіляція? Читачі, які користувалися мовою Бейсік, можуть здивуватися, навіщо стільки кроків для виконання програми. Здається, що такий спосіб компіляції вимагає більше часу (і в деяких випадках це може бути дійсно так). Але, оскільки в

З книги автора

3.8.3. Компіляція ядра При встановленні з RPM-пакета ми отримуємо модульне ядро, в якому драйвери пристроїв можуть бути як скомпільовані в одне з ядром, так і завантажуватися окремо. Таке ядро ​​повільніше в роботі, але дозволяє оновлювати драйвери простою заміною

З книги автора

Компіляція Процедура створення більшості програм є загальною та наведена на рис. 2.2. Рис. 2.2. Схема компіляції програми Першою фазою є стадія компіляції, коли файли з вихідними текстами програми, включаючи файли заголовків, обробляються компілятором

Деякі особливості модульного програмування та загальні рекомендації щодо побудови підпрограм модульної структури.

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

Порядок виконання модулів може впливати на доступ бібліотечних даних та підпрограму.

Наприклад, якщо модулі з іменами М1,М2 містять однойменні тип А, змінна і підпрограма З, то після підключення цих моделей USES звернення до А, В, С в цій ПЕ будуть еквівалентні зверненням до об'єктів до модуля М2.

Але щоб характеризувати коректність звернень до потрібних однойменних об'єктів різних підключених модулів, доцільно при зверненні до модуля спочатку вказувати ім'я модуля, а через точку імені об'єкта: М1.А М1.В М1.С М2.В.

Вочевидь, що дуже нескладно розділити велику програму на частини (ПЕ), тобто. основна програма+модулі.

Розміщуючи кожну ПЕ у свій сегмент пам'яті та у свій дисковий файл.

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

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

При розподілі підпрограм за модулями у складному проекті особлива увага має бути приділена черговість і місце їх написання.

У середовищі ТР є засоби, що управляють різними способами компіляції модулів.

Compile Alt+F9 RUN Cntr+F9

Destination Memory

Ці режими відрізняються лише способом зв'язку та основною програмою.

Режим Compile

Компілює основну програму або модуль, який в даний момент знаходиться в активному вікні редактора. Якщо в цій ПЕ міститься звернення до нестандартних модулів користувача, цей режим вимагає наявності заздалегідь однойменних дискових файлів з розширенням ___.tpu для кожного такого модуля.



При наявності Destination збережені в пам'яті, ці файли залишаються тільки в пам'яті, а дисковий файл не створюється.

Однак набагато простіше створювати tpu-файли разом з компілятором всієї програми за допомогою інших режимів, які не вимагають завдання Disk для опції destination.

Режим Make

При компіляції в цьому режимі попередньо (до компілювання основної програми) для кожного модуля перевіряється:

1) Існування дискового tpu-файлу; якщо його немає, він створюється автоматично шляхом компілювання вихідного тексту модуля, тобто. його pas-файл

2) Відповідність знайденого tpu -файлу вихідного тексту модуля, куди могли бути внесені зміни; інакше tpu –файл автоматично створюється заново

3) Постійність інтерфейсного розділу модуля: якщо він змінився, то перекомпілюються також всі ті модулі (їх вихідні pas-файли), у яких даний модуль вказаний у реченні USES.

Якщо зміна у вихідних текстах модулів був, то компілятор роботи взаємодіє з цими tpu –файлами і використовує час для компіляції.

Режим Build

На відміну від режиму Make, обов'язково вимагає наявність вихідних pas-файлів; проводить компіляцію (перекомпіляцію) кожного модуля і цим гарантує облік всіх змін у текстах pas-файлів. Це збільшує час компіляції програми загалом.

На відміну від режиму compile режим Make і Build дозволяють починати компілювати програму модульної структури з будь-якого заданого pas-файлу (його називають первинним) незалежно від того, який файл (або частина програми) знаходиться в активному вікні редактора. Для цього в пункті sompile вибирають опцію Primary file, натискають Enter і записують ім'я первинного pas-файлу і тоді компіляція почнеться саме з цього файлу.

Якщо первинний файл так не вказується, то компіляція в режимах Make, Build і RUN можлива тільки в тому випадку, якщо в активному вікні редактора знаходиться основна програма.

Навіщо взагалі самому компілювати ядро?
Мабуть, головне питання, яке ставлять із приводу компіляції ядра: "А навіщо мені це робити?".
Багато хто вважає це безглуздою тратою часу для того, щоб показати себе розумним і просунутим "лінуксоїдом". Насправді компіляція ядра це дуже важлива справа. Допустимо, ви купили новий ноутбук, у якому у вас не працює веб-камера. Ваші події? Ви заглядаєте в пошукову систему і шукайте вирішення проблеми з цього питання. Досить часто може виявитися, що ваша веб-камера працює на ядрі новішої версії, ніж у вас. Якщо ви не знаєте, яка у вас версія - введіть у терміналі uname -r, в результаті ви отримаєте версію ядра (наприклад, linux-2.6.31-10). Також компіляція ядра широко застосовується збільшення продуктивності: річ у тому, що за замовчуванням у дистрибутивах ядра компілюються " всім " , через це у ньому включено дуже багато драйверів, які вам можуть знадобитися. Так що якщо ви добре знаєте обладнання, що використовується, то можете відключити непотрібні драйвера на етапі конфігурування. Також є можливість включити підтримку більш ніж 4х Гігабайт оперативної пам'яті, не змінюючи розрядність системи. Отже, якщо вам все ж таки необхідно мати своє ядро, приступимо до компіляції!

Отримання вихідного коду ядра.
Перше, що необхідно зробити – отримати вихідний код потрібної версії ядра. Зазвичай необхідно отримати найновішу стабільну версію. Всі офіційні версії ядра доступні на kernel.org. Якщо у вас вже встановлений сервер X (домашній комп'ютер), то ви можете перейти на сайт у вашому улюбленому браузері і завантажити потрібну версію в архіві tar.gz (стиснутий gzip). Якщо ж ви працюєте в консолі (наприклад, ще не встановлювали X сервер або конфігуруєте сервер), можете скористатися текстовим браузером (наприклад elinks). Також можна скористатися стандартним менеджером завантажень wget:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.1.tar.gz
Але майте на увазі, що ви повинні знати точний номер потрібної версії.

Розпакування архіву вихідного коду.
Після того, як ви отримали архів з вихідним кодом, вам необхідно розпакувати архів у папку. Це можна зробити з графічних файлових менеджерів (dolphin, nautilus тощо) або через mc. Або скористайтеся традиційною командою tar:
tar -zxvf шлях_до_архіву
Тепер у вас є папка та вихідним кодом, перейдіть до неї, використовуючи команду cd каталог_вихідного_коду_ядра(щоб переглянути список каталогів у папці, використовуйте команду ls ).

Конфігурація ядра.
Після того як ви перейшли до каталогу з вихідним кодом ядра, необхідно виконати "20 хвилинну" конфігурацію ядра. Мета її - залишити лише потрібні драйвера та функції. Усі команди вже потрібно виконувати від імені суперкористувача.

make config – консольний режим конфігуратора.

make menuconfig – консольний режим у вигляді списку.

make xconfig – графічний режим.

Після внесення змін, збережіть налаштування та вийдіть із конфігуратора.

Компіляція.
Настав час завершального етапу складання - компіляція. Це робиться двома командами:
make && make install
Перша команда скомпілює у машинний код усі файли, а друга встановить нове ядро ​​у вашу систему.
Чекаємо від 20 хвилин до кількох годин (залежно від потужності комп'ютера). Ядро встановлено. Щоб воно з'явилося в списку grub(2), введіть (від суперкористувача)
update-grub
Тепер після перезавантаження натисніть Escape, і ви побачите нове ядро ​​в списку. Якщо ж ядро ​​не вмикається, просто завантажтеся зі старим ядром і конфігуруйте більш акуратно.

KernelCheck - компіляція ядра, не заходячи в консоль.
дозволяє зібрати ядро ​​у повністю графічному режимі для Debian та заснованих на ньому дистрибутивів. Після запуску, KernelCheck запропонує свіжі версії ядра та патчі, і після вашої згоди, завантажить вихідний код, запустить графічний конфігуратор. Програма збере ядро ​​в.deb пакети та встановить їх. Вам залишиться лише перезавантажитися.

© 2022 androidas.ru - Все про Android