Как использовать __attribute__((section("name"))) для глобальной переменной для процессора

Я столкнулся с кодом, который использует __attribute__((section(“name”))) для глобальных переменных процессора. Я искал об этом и узнал, что он используется для размещения данных в указанном месте памяти с помощью сценариев компоновщика. Чего я не понимаю, так это того, как его можно использовать для данных per-cpu — то есть, если глобальная переменная помещена в секцию, определенную с помощью __attribute__((section(“name”))), то каждый процессор имеет свою собственную копию этой глобальной переменная. Я могу ошибаться, но моя интуиция подсказывает, что скрипты компоновщика используются вместе с __attribute__((section)), чтобы это произошло. Но я не знаю как. Небольшой рабочий пример или подсказка, как реализовать это в коде, было бы здорово.

Примечание: этот вопрос касается языка C.


person sbhTWR    schedule 17.09.2020    source источник


Ответы (1)


Операционная система/ядро инициализирует оборудование таким образом, что данные в этой ячейке памяти не используются глобально, а специфичны для каждого процессора. Предположительно, это достигается за счет того, что на каждом процессоре установлены немного разные таблицы страниц. Все, что делает атрибут section, — это помещает переменную в эту специальную область памяти, но как только базовое оборудование настроено на отсутствие совместного использования между ЦП, этого достаточно, чтобы сделать переменную зависимой от ЦП.

person Florian Weimer    schedule 17.09.2020
comment
Ой. То есть виртуальные адреса, зарезервированные для глобальной переменной, сопоставляются с какой-то страницей машины, которая отличается для каждого процессора? - person sbhTWR; 18.09.2020
comment
Да, в типичной реализации физические адреса будут другими. - person Florian Weimer; 18.09.2020