Где я могу найти исходный код системного вызова?

В linux, где я могу найти исходный код для всех системных вызовов, учитывая, что у меня есть исходное дерево? Также, если мне захочется найти исходный код и сборку для конкретного системного вызова, есть ли что-то, что я могу ввести в терминал, например -my_system_call?

Ответ 1

Вам понадобятся источники ядра Linux, чтобы увидеть фактический источник системных вызовов. Ручные страницы, если они установлены в вашей локальной системе, содержат только документацию о вызовах, а не их источник.

К сожалению, для вас системные вызовы не сохраняются только в одном конкретном месте во всем дереве ядра. Это связано с тем, что различные системные вызовы могут относиться к различным частям системы (управление процессами, управление файловой системой и т.д.), И поэтому было бы невозможно хранить их отдельно от части дерева, относящегося к этой конкретной части системы.

Лучшее, что вы можете сделать, это найти макрос SYSCALL_DEFINE[0-6]. Он используется (очевидно) для определения данного блока кода как системного вызова. Например, fs/ioctl.c имеет следующий код:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}

Такое определение означает, что syscall ioctl объявлен и принимает три аргумента. Число рядом с SYSCALL_DEFINE означает количество аргументов. Например, в случае getpid(void), объявленного в kernel/timer.c, мы имеем следующий код:

SYSCALL_DEFINE0(getpid)
{
        return task_tgid_vnr(current);
}

Надеюсь, что немного прояснится.

Ответ 2

С точки зрения приложения системный вызов является элементарной и атомной операцией, выполняемой kernel.

Assembly Howto объясняет, что происходит с точки зрения машинной инструкции.

Конечно, ядро ​​много чего делает при работе с syscall.

На самом деле вы почти могли поверить, что весь код ядра предназначен для обработки всех системных вызовов (это не совсем так, но почти, с точки зрения приложений, ядро ​​видно только через системные вызовы). Другой ответ Daniel Kamil Kozar объясняет, какая функция ядра начинает обработку какого-либо системного вызова (но очень часто многие другие части ядра косвенно участвуют в системных вызовах, например, планировщик участвует косвенно в реализации fork, поскольку он управляет дочерним процессом, созданным успешным syscall fork).

Ответ 3

Я знаю это старый, но я искал источник для _system_call() тоже и нашел этот лакомый кусочек

Фактический код для точки входа system_call можно найти в /usr/src/linux/kernel/sys _call.S Фактический код для многих системных вызовов можно найти в /usr/src/linux/kernel/sys.c, а остальные - в другом месте. найдите своего друга.

Я предполагаю, что это датировано, потому что у меня даже нет этого файла. Однако grep нашел ENTRY(system_call) в arch/x86/kernel/entry_64.S и, похоже, это то, что вызывает индивидуальные системные вызовы. Я сейчас не нахожусь в моем синтаксисе x86 asm, поэтому вам нужно будет посмотреть, не хочет ли это того, чего вы хотели.