Перенесення Linux на інші вимоги до платформи [закрито]


28

Я знаю, що Linux доступний і переноситься для багатьох різних платформ, таких як X86, ARM, PowerPC тощо.

Однак, що стосується перенесення, що саме потрібно?

Я розумію, що Linux - це програмне забезпечення, написане на C. Тому, наприклад, при перенесенні Linux спочатку з X86 в ARM чи інші, чи не лише питання перекомпіляції коду з компілятором для конкретної цільової архітектури?

Відклавши драйвери пристроїв для різних периферійних пристроїв, що ще потрібно зробити при перенесенні Linux в нову архітектуру. Невже компілятор не подбає про все за нас?


11
Чи можна припустити, що ви подивилися на джерела архітектури ядра? git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/…
Kusalananda

Відповіді:


57

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

Одним із прикладів цього є віртуальна пам’ять, яка працює аналогічно для більшості архітектур (ієрархія таблиць сторінок), але має конкретні деталі для кожної архітектури (наприклад, кількість рівнів у кожній архітектурі, і це збільшується навіть на x86 з введення нових більших чіпів.) Код ядра Linux вводить макроси для обходу цих ієрархій, які компілятор може бути усунутий для архітектур, у яких менше рівнів таблиць сторінок (так що код записується в C, але включає деталі архітектури в розгляд.)

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

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

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

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

  • Ініціалізація : подробиці того, як має відбуватися ініціалізація, зазвичай включають деталі, які є специфічними для платформи та часто потребують певного коду складання для обробки точки входу до ядра. На платформах, які мають декілька процесорів (SMP), відомості про те, як підключити інші процесори до Інтернету, зазвичай також залежать від платформи.

  • Блокування примітивів : Реалізація примітивів, що блокуються (такі як спінкі), як правило, включає також деталі, що залежать від платформи, оскільки деякі архітектури надають (або віддають перевагу) різні інструкції ЦП для їх ефективної реалізації. Деякі будуть реалізовувати атомні операції, деякі надаватимуть cmpxchg, який може атомно тестувати / оновлювати (але виходить з ладу, якщо інший автор потрапив першим), інші включатимуть модифікатор "блокування" до інструкцій процесора. Вони також часто включають написання асемблерного коду.

Є , ймовірно , в інших областях , де від платформи або архітектури конкретний код потрібен в ядрі (або, в зокрема, в ядрі Linux.) Дивлячись на дерево вихідних кодів ядра, є архітектура конкретних піддерев під arch/і під , include/arch/де ви можете знайти більш приклади цього.

Деякі насправді дивують, наприклад, ви побачите, що кількість системних дзвінків, доступних для кожної архітектури, є різною, а деякі системні виклики будуть існувати в деяких архітектурах, а не в інших. (Навіть на x86 список системних викликів відрізняється між 32-бітним і 64-бітним ядром.)

Коротше кажучи, є достатньо випадків, коли ядро ​​повинно знати, що є специфічними для платформи. Ядро Linux намагається абстрагувати більшість із них, тому алгоритми вищого рівня (наприклад, як працює управління пам’яттю та планування) можуть бути реалізовані в C та працювати однаково (або здебільшого однаково) у всіх архітектурах.


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

10

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

  • Компілятор C, асемблер та лінкер: GCC та GNU Binutils . Для абсолютно нової архітектури процесора вам потрібно перенести це програмне забезпечення ще до того, як ви почнете переносити ядро, оскільки ядро ​​саме по собі є програмою на C і його потрібно компілювати. Якщо підтримка процесора вашої платформи вже є "зворотним", тільки не з Linux як ядром ОС, у вас значно менше роботи, і ви, можливо, зможете піти з відкладанням більшої частини роботи, поки ядро ​​не працює і біг.
  • Бібліотека часу виконання C: " GNU libc ". Ця бібліотека включає код, який здійснює системні дзвінки та іншим чином взаємодіє безпосередньо з ядром.
  • Бібліотека "іноземних функціональних інтерфейсів", libffi , яка є важливою складовою багатьох перекладачів мови високого рівня, виконує одне з небагатьох завдань, що залишаються, що потребує невеликої кількості рукописного мовного мовлення.

Багато інших програмного забезпечення мають додаткові компоненти, що залежать від платформи; наприклад, веб-перегляд буде значно швидшим, якщо ви пишете оптимізовані вручну криптографічні примітиви для NSS та OpenSSL для вашої нової архітектури процесора, а також зворотні компіляції, що складаються в часі для IonMonkey і V8 . Але це не суттєво для створення нової платформи.


1

Ви повинні повідомити ядро ​​про апаратне забезпечення, яке ви переносите. Завдання ядра полягає в безпосередньому взаємодії з апаратним забезпеченням, тому для того, щоб воно нормально функціонувало, ядро ​​повинно знати про процесор, генератори (годинники) та будь-які периферійні пристрої, як і різні види послідовних портів (SPI, CAN, I2C тощо).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.