2015-03-25 3 views
2

Я маленький бит с символом типа символа ядра. Простые статические символы имеют то же значение, что и статичность C. Таким образом, локальная статическая переменная имеет локальную область и статическое распределение. Область статических функций - это файл. Но как насчет статических экспортированных символов? Как иметь дело с EXPORT_SYMBOL(), EXPORT_PER_CPU_SYMBOL(), EXPORT_UNUSED_SYMBOL() если макрос экспортирует статический символ? В чем разница между глобальными и экспортируемыми символами? Является ли линкером ответственность за добавление дополнительной информации для экспортированных символов? Является ли глобальное статическое переменное встроенное ядро ​​видимым во всем ядре и загружаемом модуле?Ядро экспортировано символов против глобальных символов против статического глобального?

Доступные к ядру символы могут быть доступны из загружаемого модуля. Хороший стиль касается таких символов внутри ядра. Когда символы разрешения ядра отображаются в таблице символов ядра?

ответ

5

Концептуально, используя ключевое слово static с объявлением функции означает внутренней связи - поэтому такая функция видна только в пределах одной единицы трансляции (* .o файлов). Это может включать в себя создание этой функции (в этом случае она будет непригодной для дальнейшего использования), но так как EXPORT_SYMBOL() принимает адрес статической функции, компилятор должен отключить оптимизацию подстроки.

Реализация немного сложнее. Это внутренние и внешние ссылки правила применяются только к статическому компоновщику ld, который работает, когда vmlinux или модуль ядра построен. Обычно символ с внешняя связь добавляется в symtab раздел ELF и когда динамический компоновщик ld.so загружает общий объект он читает этот раздел.

Но когда модуль загружен, Linux Kernel использует отдельную таблицу символов ksymtab. EXPORT_SYMBOL() добавляет символ к этой таблице, но этот процесс полностью прозрачен для инструментария-компоновщика-компоновщика, поэтому он не связан с внутренним и внешней связью.

Смежные вопросы