Требования к переносу Linux на другую платформу [закрыто]

htop отображает командную строку процесса с пробелами между аргументами. (Первый аргумент, номер аргумента 0, обычно является именем команды, переданным родительским процессом.)

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

Также можно запустить процесс без аргументов командной строки. Это очень необычно: обычно первым аргументом является имя команды. Но технически это возможно.

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

cat -A /proc/12727/cmdline; echo

Это отображает аргументы с управляющими символами, замененными визуальным представлением. Аргументы разделяются ^ @ .

Вы можете найти другую информацию, исследуя / proc / 12727 , например / proc / 12727 / exe - это символическая ссылка на исполняемый файл, который выполняется в этом процессе, и ] / proc / 12727 / fd показывает, какие файлы открыл процесс. Вы также можете отобразить эту информацию с помощью lsof -p12727 .

ps l 12727 покажет другую информацию об этом процессе, в частности его идентификатор родительского процесса (PPID). (Вы также можете настроить htop для отображения этой информации, активировав соответствующий столбец в настройках.)

28
28.02.2019, 10:36
3 ответа

Несмотря на то, что большая часть кода ядра Linux написана на C, все еще есть много частей этого кода, которые очень специфичны для платформы, на которой он работает, и это необходимо учитывать.

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

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

  • Переключение контекста:Переключение контекста включает в себя сохранение значения всех регистров для переключаемого процесса и восстановление регистров из сохраненного набора процесса, запланированного в ЦП. Даже количество и набор регистров очень специфичны для каждой архитектуры. Этот код обычно реализуется на ассемблере, чтобы обеспечить полный доступ к регистрам, а также убедиться, что он работает как можно быстрее, поскольку производительность переключения контекста может быть критической для системы.

  • Системные вызовы:Механизм, с помощью которого код пользовательского пространства может инициировать системный вызов, обычно зависит от архитектуры (, а иногда даже от конкретной модели ЦП.например, Intel и AMD представили разные инструкции для этого, в старых процессорах эти инструкции могут отсутствовать, поэтому детали для них по-прежнему будут уникальными.)

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

  • Инициализация:Подробная информация о том, как должна происходить инициализация, также обычно включает детали, специфичные для платформы, и часто требует некоторого ассемблерного кода для обработки точки входа в ядро. На платформах с несколькими ЦП (SMP )сведения о том, как подключить другие ЦП, обычно также зависят от платформы -.

  • Примитивы блокировки:Реализация примитивов блокировки (, таких как спин-блокировки, )обычно также включает детали, специфичные для платформы -, поскольку некоторые архитектуры предоставляют (или предпочитают )различные инструкции ЦП для эффективной реализации те. Некоторые будут реализовывать атомарные операции, некоторые предоставят cmpxchg, который может атомарно тестировать/обновлять (, но терпит неудачу, если другой писатель вошел первым ), другие будут включать модификатор «блокировки» в инструкции ЦП. Они часто также включают в себя написание ассемблерного кода.

Возможно, есть и другие области, где в ядре (или, в частности, в ядре Linux требуется специфичный для платформы -или архитектуры -код. )Глядя на дерево исходных кодов ядра, можно увидеть -специфичные для архитектуры поддеревья в arch/и в include/arch/, где вы можете найти больше примеров этого.

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

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

59
27.01.2020, 19:38

В дополнение к переносу ядра Linux вам потребуется определитьдвоичный интерфейс приложения(ABI )для программ «пространства пользователя» и портировать самые нижние уровни программного стека пространства пользователя. Linux обычно используется с низкоуровневыми -компонентами пользовательского пространства из проекта GNU, наиболее важными из которых являются:

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

Многие другие части программного обеспечения имеют дополнительные компоненты, -зависимые от платформы; например, просмотр веб-страниц будет значительно быстрее, если вы напишете вручную -оптимизированные криптографические примитивы для NSS и OpenSSL для вашей новой архитектуры ЦП и просто -в -время компиляции назад -заканчивается для IonMonkey и V8 . Но это не обязательно для создания новой платформы.

11
27.01.2020, 19:38

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

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

1
27.01.2020, 19:38

Теги

Похожие вопросы