Вопрос по assembly, linux – Где я могу найти исходный код системного вызова?

28

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

kernel.org TJD

Ваш Ответ

3   ответа
2

_system_call() тоже нашел этот лакомый кусочек

Actual code for system_call entry point can be found in /usr/src/linux/kernel/sys_call.S Actual code for many of the system calls can be found in /usr/src/linux/kernel/sys.c, and the rest are found elsewhere. find is your friend.

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

entry_64.SError: User Rate Limit Exceeded
2

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

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

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

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

33

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

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

Лучшее, что вы можете сделать, это искать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);
}

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

Похожие вопросы