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

Попаднах на код, който използва __attribute__((section(“name”))) за глобални променливи на процесор. Търсих за него и разбрах, че се използва за поставяне на данните в определено място в паметта с помощта на скриптове за свързване. Това, което не разбирам, е как може да се използва за данни за per-cpu - тоест, ако глобална променлива е поставена в секция, дефинирана с __attribute__((section(“name”))), тогава всеки процесор има свое копие на тази глобална променлива. Може да греша, но интуицията ми е, че скриптовете за свързване се използват заедно с __attribute__((section)), за да се случи това. Но не знам как. Малък работещ пример или намек за това как да реализирате това в код би било чудесно.

Забележка: този въпрос е по отношение на езика C.


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


Отговори (1)


Операционната система/ядрото инициализира хардуера по такъв начин, че данните в това място в паметта не се споделят глобално, а са специфични за всеки процесор. Предполага се, че това се постига чрез инсталиране на малко по-различни таблици на страници на всеки процесор. Всичко, което атрибутът на секцията прави, е да постави променливата в този специален регион на паметта, но след като базовият хардуер е конфигуриран да позволява липсата на споделяне между процесори, това е всичко, което е необходимо, за да се направи променливата специфична за процесора.

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