Где я могу найти исходный код системного вызова?
В 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, так что вам придется посмотреть и посмотреть, действительно ли это то, что вы хотели.