Я пытаюсь выяснить, как работает инициализация kallsyms. из kallsyms. c Я нашел эту структуру
static const struct seq_operations kallsyms_op = {
.start = s_start,
.next = s_next,
.stop = s_stop,
.show = s_show
};
, поэтому я верю, что первая запускаемая функция - это s_start.
static void *s_start(struct seq_file *m, loff_t *pos)
{
if (!update_iter(m->private, *pos))
return NULL;
return m->private;
}
и отсюда update_iter
называется. пока здесь все очень понятно. теперь я пытаюсь выяснить, как s_start инициализирует объект iter
, чтобы s_show мог его использовать.
Единственная функция, которая вызывается в s_start
, это update_iter
-
/* Returns false if pos at or past end of file. */
static int update_iter(struct kallsym_iter *iter, loff_t pos)
{
/* Module symbols can be accessed randomly. */
if (pos >= kallsyms_num_syms)
return update_iter_mod(iter, pos);
/* If we're not on the desired position, reset to new position. */
if (pos != iter->pos)
reset_iter(iter, pos);
iter->nameoff += get_ksymbol_core(iter);
iter->pos++;
return 1;
}
и эта функция действительно выглядит как функция инициализации. Я нашел это - https://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/ статья, объясняющая, как работает update_iter_nod
.
Мне не ясна мысль - почему pos >= kallsyms_num_syms
верно? как логически (по крайней мере для меня) pos
равно 0 при s_start
. поэтому update_iter нужно перейти к get_ksymbol_core
или reset_iter
и вернуть 1 ->, что приведет к возвращению NULL из s_start
, и я думаю, что это не так, как оно работает.
почему POS больше / равно чем kallsyms_num_syms?
пытался найти любую читаемую документацию по этой функции, но ничего не нашел в этой строке