Имеются ли у 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.
Это делается для обеспечения безопасности. Обычно мы не хотим, чтобы модули могли получать доступ, например, к внутренним или защитным функциям. Они просто идут против идеи сделать модули ядра максимально безопасными, но позволяют им делать как можно больше.