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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Конечно, ядро ​​делает много вещей при обработке системного вызова.

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

Я знаю, что он старый, но я искал источник для _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 и, кажется, вызывает те, кто вызывает системные вызовы. Я сейчас не разбираюсь в своем asm-синтаксисе x86, так что вам придется посмотреть и посмотреть, действительно ли это то, что вы хотели.

Другие вопросы по тегам