Незважаючи на те, що більша частина коду в ядрі Linux написана на мові С, все ще існує багато частин цього коду, які є дуже специфічними для платформи, де він працює, і потрібно це враховувати.
Одним із прикладів цього є віртуальна пам’ять, яка працює аналогічно для більшості архітектур (ієрархія таблиць сторінок), але має конкретні деталі для кожної архітектури (наприклад, кількість рівнів у кожній архітектурі, і це збільшується навіть на x86 з введення нових більших чіпів.) Код ядра Linux вводить макроси для обходу цих ієрархій, які компілятор може бути усунутий для архітектур, у яких менше рівнів таблиць сторінок (так що код записується в C, але включає деталі архітектури в розгляд.)
Багато інших областей дуже специфічні для кожної архітектури і їх потрібно обробляти кодом, специфічним для арки. Більшість із них включає код у мові складання. Приклади:
Контекстна комутація : контекстна комутація передбачає збереження значення всіх регістрів для процесу, який вимикається, і відновлення регістрів із збереженого набору процесу, запланованого в ЦП. Навіть кількість та набір регістрів дуже специфічні для кожної архітектури. Цей код, як правило, реалізується в зборі, щоб забезпечити повний доступ до регістрів, а також для того, щоб він працював якомога швидше, оскільки продуктивність переключення контексту може мати вирішальне значення для системи.
Системні виклики : Механізм, за допомогою якого код простору користувача може викликати системний виклик, зазвичай є специфічним для архітектури (а іноді навіть для конкретної моделі процесора, наприклад, Intel та AMD ввели для цього різні інструкції, для старих процесорів ці інструкції можуть бути відсутні, тому детальніше для тих, хто все ще буде унікальним.)
Обробники переривань : подробиці, як керувати перервами (апаратні переривання), як правило, залежать від платформи і зазвичай вимагають деякого клею на рівні складання, щоб обробляти конкретні умови викликів, які використовуються для платформи. Крім того, примітиви для вмикання / відключення переривань, як правило, залежать від платформи і також вимагають код складання.
Ініціалізація : подробиці того, як має відбуватися ініціалізація, зазвичай включають деталі, які є специфічними для платформи та часто потребують певного коду складання для обробки точки входу до ядра. На платформах, які мають декілька процесорів (SMP), відомості про те, як підключити інші процесори до Інтернету, зазвичай також залежать від платформи.
Блокування примітивів : Реалізація примітивів, що блокуються (такі як спінкі), як правило, включає також деталі, що залежать від платформи, оскільки деякі архітектури надають (або віддають перевагу) різні інструкції ЦП для їх ефективної реалізації. Деякі будуть реалізовувати атомні операції, деякі надаватимуть cmpxchg, який може атомно тестувати / оновлювати (але виходить з ладу, якщо інший автор потрапив першим), інші включатимуть модифікатор "блокування" до інструкцій процесора. Вони також часто включають написання асемблерного коду.
Є , ймовірно , в інших областях , де від платформи або архітектури конкретний код потрібен в ядрі (або, в зокрема, в ядрі Linux.) Дивлячись на дерево вихідних кодів ядра, є архітектура конкретних піддерев під arch/
і під , include/arch/
де ви можете знайти більш приклади цього.
Деякі насправді дивують, наприклад, ви побачите, що кількість системних дзвінків, доступних для кожної архітектури, є різною, а деякі системні виклики будуть існувати в деяких архітектурах, а не в інших. (Навіть на x86 список системних викликів відрізняється між 32-бітним і 64-бітним ядром.)
Коротше кажучи, є достатньо випадків, коли ядро повинно знати, що є специфічними для платформи. Ядро Linux намагається абстрагувати більшість із них, тому алгоритми вищого рівня (наприклад, як працює управління пам’яттю та планування) можуть бути реалізовані в C та працювати однаково (або здебільшого однаково) у всіх архітектурах.