Linux и совместимость между процессорами

Я унаследовал встроенный проект, который был разработан для двух встроенных систем: Glomation GESBC-9G20 на основе Atmel AT91SAM9g20 и Acme Systems Aria G25 на базе Атмел AT91SAM9g25. На данный момент проект собирается с использованием стандартных компиляторов, предоставленных производителями различных плат, которые реализуют эти процессоры, и платы работают под управлением разных версий ядра Linux:

uname -a на GESBC-9G20 дает Linux 2.6.31.5 #10 Thu Nov 5 15:46:30 GMT 2009 armv5tejl GNU/Linux uname -a на Aria G25 дает Linux ariag25 3.16.1 #1 Mon Oct 13 11:44:47 BST 2014 armv5tejl GNU/Linux

Производитель предоставил инструментальные цепочки для каждого из них, они несовместимы, один использует двоичные файлы EABI, а другой нет.

Я провел некоторое исследование и обнаружил, что оба микроконтроллера работают на процессорных ядрах ARM926EJ-S, однако G20 имеет 32 КБ кэш-памяти, а G25 — 16 КБ кэш-памяти согласно даташитам здесь и здесь соответственно. Смогу ли я использовать одну и ту же цепочку инструментов для создания двоичных файлов для обоих этих микроконтроллеров? Повлияет ли разница в размере кеша на двоичные файлы/ядра, скомпилированные для этих процессоров?

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

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

Обобщить:

  1. Будут ли два микроконтроллера на базе ARM926EJ-S с разными размерами кэш-памяти совместимы?
  2. Будет ли пересборка цепочки инструментов и ядра для этих микроконтроллеров полезной и сэкономит время разработки в будущем?
  3. Учитывая эту информацию, вы бы решили перестроить цепочки инструментов и ядра или продолжили бы работу с отдельными цепочками инструментов, доступными сейчас?

person RobbG    schedule 20.04.2015    source источник
comment
Какая версия ядра Linux используется в настоящее время на ваших платах?   -  person Richard Pennington    schedule 20.04.2015
comment
@RichardPennington Я обновил исходный вопрос, включив в него вывод uname -a на обеих досках.   -  person RobbG    schedule 20.04.2015
comment
Я не уверен, как выглядит ваше приложение, но один из вариантов может заключаться в том, чтобы просто создать содержимое пользовательского пространства с помощью одной цепочки инструментов и оставить ядра нетронутыми. Если вы статически свяжете свои приложения пользовательского пространства, они, скорее всего, будут работать на обеих платах. Тогда вам не придется иметь дело со сложностями обновления ядер, но вы сможете получить некоторую выгоду от общей цепочки инструментов.   -  person Richard Pennington    schedule 21.04.2015
comment
Это не микроконтроллеры; Atmel называет их MPU. Различия в размерах кэша не имеют значения для кода. Я бы пересобрал все с помощью одного тулчейна (оптимизированного для ARM926ej-ов) и общей кодовой базы. Две платы могут использовать один и тот же образ ядра Linux, но загружаться с отдельными BLOB-объектами дерева устройств.   -  person sawdust    schedule 18.07.2015


Ответы (1)


tl;dr — Начните с объединенного ядра Linux и используйте поддержку OABI. Посмотрите, как это работает, а затем подумайте об объединении пользовательского пространства.


То, как вы сформулировали этот вопрос, делает его субъективным. На самом деле, просто дать ответ было бы. Рассмотрим некоторые факты. Во-первых, ответ будет зависеть от ваших целей и определенной организационной квалификации. Т.е. абсолютно правильного ответа ни для кого быть не может. Но если мы рассмотрим преимущества и недостатки, то для большинства все должно быть ясно.


Будут ли два микроконтроллера на базе ARM926EJ-S с разными размерами кэш-памяти совместимы?

Для аспекта генерации кода компилятора они почти наверняка на 100% идентичны. То есть у gcc не должно возникнуть проблем с генерацией кода для одного или другого. Однако есть более серьезные проблемы со сменой компилятора,

  1. Код, основанный на неопределенном поведении, может не работать.
  2. Код, использующий расширения компилятора, потребует переноса.
  3. Ошибки в компиляторе могут иметь обходные пути в исходном коде или вызывать некоторые скрытые дефекты при обновлении компилятора.
  4. Разница во времени может выявить условия гонки у очень плохих гонщиков.

Будет ли пересборка цепочки инструментов и ядра для этих микроконтроллеров полезной и сэкономит время разработки в будущем?

Конечно, это зависит. Linux 2.6.31.5 не является стабильным ядром (т. е. не имеет исправлений сообщества), в отличие от Linux 2.6.32.65. Если поставщик не предоставляет дерево git, невозможно трудно сказать, что было/не было применено к этому дереву. Так что поддержка этой старой версии Linux, вероятно, является большой задачей. То есть исправления безопасности, обновления подсистем и общие ошибки. Если вам нужно поддерживать пользовательские драйверы на обеих платформах, аналогичный API для Linux будет несомненной победой. Если вы используете только ядра Linux поставщика и не имеете полномочий для их поддержки/изменения, это может исказить проблему.

3.16 — более современный Linux. Тем не менее, он также не будет иметь поддержки сообщества. 3.14 или 3.18 в настоящее время являются долгосрочными. Безусловно, обновление до версии 3.18 и использование дерева драйверов/устройств поставщиков из версии 3.16 — довольно простая задача. Таким образом, главный вопрос ядра Linux будет заключаться в следующем:

  1. Поддерживают ли оба ядра поставщик A и поставщик B?
  2. Сколько пользовательского кода/драйверов они предоставляют.
  3. Каковы ваши внутренние или внешние компетенции ядра?
  4. У вас есть собственные драйверы?
  5. Будете ли вы обновлять оборудование до новых чипсетов в будущем?
  6. Срок службы чипсетов.
  7. Использует ли продукт подсистемы iptables, usb и т. д. в Linux?

По моему опыту, ответ на 1 (для любого поставщика) — НИКОГДА!. Люди, поддерживающие это, перегружены работой, и компания не даст им времени, чтобы сделать все как следует. Пункты 4-6 укажут на слияние ядер. Поддержка вещей на нескольких ядрах болезненна. Не только для написания кода, но и для тестирования. Также возможно иметь один и тот же двоичный файл, поддерживающий обе платформы, что может принести другие преимущества.

Что касается цепочки инструментов, у вас есть проблемы в первом вопросе, с которыми нужно бороться за пользовательское пространство. Однако ядра Linux должны хорошо работать с различными компиляторами. Существуют различные проверки совместимости компилятора. Кроме того, современные ядра Linux поддерживают как OABI, так и EABI. Таким образом, вполне возможно объединить ядро ​​​​Linux, сохраняя при этом отдельное пользовательское пространство.

Учитывая эту информацию, вы бы решили перестроить цепочки инструментов и ядра или продолжили бы работу с отдельными цепочками инструментов, доступными сейчас?

Это мнение, как сейчас сформулировано. Крайне маловероятно, что поддержка поставщика так же хороша, как и сообщество. Однако, если у вас нет опыта работы с ядрами и/или драйверами, И вы предполагаете, что аппаратное обеспечение никогда не изменится, вы можете придерживаться предоставленных ядер Linux. Возможно, в вендоре Linux есть скрытые функции, связанные с инициализацией DDR и другими аппаратными странностями, которые никогда не попадали в основную линейку. Наличие исходного кода для этих ядер полезно.

Кажется, вы никогда не будете производить и модифицировать свое оборудование. То есть, вы используете только готовое оборудование и никогда не используете такие вещи, как iptable/nftables и т. д., поддержка поставщика сносная, и вы (организация) не компетентны в программировании драйверов/ядра, тогда может имеет смысл остаться на месте.

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


Если вы объединяете ядра, то объединение пользовательского пространства имеет больше смысла. Несмотря на то, что пользовательское пространство может быть одним и тем же кодом/компилятором, разные ядра Linux будут влиять на поведение во время выполнения. В конечном счете, объединенную кодовую базу легче поддерживать. Вопрос в том, перевешивают ли усилия, направленные на достижение этого результата, преимущества этого достижения? Это зависит от проекта и организации.

person artless noise    schedule 20.04.2015
comment
По крайней мере, стоило бы потратить некоторое время на изучение возможности обновления ядер. Вы должны получить некоторую оценку времени, чтобы сделать это портирование. 2.6.31->3.16 (или 3.18). Кроме того, проведите небольшое расследование, так как в более новых ядрах уже может быть поддержка платформы. Продавцы не всегда информируют людей об этом. Если у вас есть основная линия, проще сменить оборудование (возможно, на третью более дешевую плату). Поставщик должен как минимум иметь tarballs для соответствия GPL. Рекурсивное сравнение с той же основной версией поможет определить, какие изменения были внесены. - person artless noise; 20.04.2015