Я разрабатываю многоядерный проект для нашей встроенной архитектуры с использованием цепочки инструментов gnu. В этой архитектуре все независимые ядра совместно используют одно и то же пространство глобальной памяти. Каждое ядро имеет собственную внутреннюю память, к которой можно обращаться из любого другого ядра через его глобальный 32-разрядный адрес.
ОС не реализована, и мы делаем низкоуровневое программирование, но на С вместо сборки. Каждое ядро имеет собственный исполняемый файл, сгенерированный отдельной компиляцией. Текущий метод, который мы используем для связи между ядрами, заключается в вычислении абсолютных адресов объектов в пространстве данных ядра назначения. Если мы создадим один и тот же код для всех ядер, то объекты будут размещены компоновщиком в одном и том же месте, поэтому доступ к объекту в удаленном ядре просто изменяет старшие биты адреса объекта в текущем ядре и совершение сделки. Подобная концепция позволяет нам делиться объектами, которые находятся во внешней DRAM.
Все становится сложнее, когда:
Код не совпадает в двух ядрах, поэтому объекты не могут быть распределены по одинаковым адресам,
Иногда мы используем «хост», который представляет собой другой процессор, на котором выполняется некоторый управляющий код, требующий доступа к объектам в ядрах, а также к общим объектам во внешней памяти.
Чтобы преодолеть эту проблему, я ищу элегантный способ размещения переменных во время сборки. Я хотел бы избежать изменения файла сценария компоновщика, насколько это возможно. Однако, похоже, что на уровне C я мог управлять размещением, используя только комбинацию атрибута section
(который слишком грубый) и атрибута align
(который не гарантирует точное место).
Возможный взлом - использовать встроенную сборку для определения объектов и их явного размещения (используя ключевые слова .org
и .global
), но это выглядит несколько уродливо (а мы еще не проверили эту идею ...) )
Итак, вот вопросы:
Существует ли полустандартный способ или элегантное решение для размещения объектов в программе на C вручную?
Могу ли я объявить в своем коде объекты "uber" -extarnel и заставить компоновщик разрешать их адреса, используя исполняемый файл другого проекта?
Этот вопрос описывает аналогичную ситуацию, но там пользователь ссылается на предварительно выделенный ресурс (например, периферийное устройство), адрес которого известен до начала сборки.