Имеются ли у kallsyms все символы функций ядра?

В ядре Linux.

Я хочу исследовать функцию ядра с именем "effective_prio", которая определяется как "static int effective_prio (struct task_struct * p)". Когда я иду искать символ его в kallsyms.I не могу его найти. У kallsyms есть все символы функций ядра? Если нет, то что не включено?

Ответ 1

Существует две возможности для функции, не отображающейся в /proc/kallsyms:

  • Если функция отмечена как static, и компилятор решает встроить функцию (с ключевым словом inline или без нее)
  • Если параметр конфигурации или другой #define удаляет скомпилированную функцию, например:

    #ifdef CONFIG_OPT
    void foo(void) {
    }
    #endif
    

Насколько я знаю, если функция не отображается в /proc/kallsyms, невозможно вызвать или проверить ее с помощью модуля. Однако /proc/kallsyms содержит все функции ядра, а не только те, которые экспортируются через EXPORT_SYMBOL/EXPORT_SYMBOL_GPL.

Ответ 2

CONFIG_KALLSYMS_ALL=y также требуется видеть нестатические переменные, например:

grep sysctl_sched_nr_migrate /proc/kallsyms

который определяется как:

const_debug unsigned int sysctl_sched_nr_migrate = 32;

Ответ 3

kallsyms отображает только символы, экспортированные макросами EXPORT_SYMBOL и EXPORT_SYMBOL_GPL.

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