2012-04-13 2 views
22

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

+2

http://kernel.org/ – TJD

ответ

29

Вам понадобятся источники ядра 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); 
} 

Надежда, что очищает вещи немного.

2

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

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

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

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

1

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

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

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

+0

'entry_64.S' больше не существует в магистрали 4.8. – sherrellbc

Смежные вопросы