2013-09-24 3 views
6

В чем разница между SYS_exit, sys_exit() и exit()?Системные вызовы: разница между sys_exit(), SYS_exit и exit()

Я понимаю:

  • Ядро Linux предоставляет системные вызовы, которые перечислены в man 2 syscalls.
  • Имеются функции обертки тех системных вызовов, которые предоставляются glibc, которые имеют в основном похожие имена, такие как системные вызовы.

Мой вопрос: В man 2 syscalls нет упоминания о SYS_exit и sys_exit(), например. Кто они такие?

Примечание: syscall exit вот только пример. Мой вопрос в самом деле: что такое SYS_xxx и sys_xxx()?

ответ

3

Я буду использовать exit(), как в вашем примере, хотя это относится ко всем системным вызовам.

Функции формы sys_exit() - это фактические точки входа в программу ядра, которая реализует функцию, о которой вы думаете, как exit(). Эти символы даже не доступны для программистов пользовательского режима. То есть, если вы не взламываете ядро, вы не можете ссылаться на эти функции, потому что их символы недоступны вне ядра. Если бы я писал libmsw.a имевшая область видимости функции файл как

static int msw_func() {} 

определенного в нем, не будет иметь никакого успеха, пытаясь связать с ним, потому что он не экспортируется в таблице символов libmsw; то есть:

cc your_program.c libmsw.a 

даст ошибку, как:

ld: cannot resolve symbol msw_func 

, потому что он не экспортируется; то же самое относится к sys_exit(), содержащемуся в ядре.

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

{SYS_exit, sys_exit}, 

Где SYS_exit является макрос препроцессора, который

#define SYS_exit (1) 

и был 1, так как до рождения, потому что не было причин, чтобы изменить его. Это также первая запись в таблице системных вызовов, которая ищет простой индекс массива.

Как вы заметили в своем вопросе, правильный способ для обычной программы пользовательского режима доступа к sys_exit - через тонкую оболочку в glibc (или аналогичную базовую библиотеку). Единственная причина, по которой вам когда-либо понадобится связываться с SYS_exit или sys_exit, - это если вы пишете код ядра.

+0

glibc не предоставляет обертки для каждого системного вызова, поэтому в некоторых случаях вам может понадобиться соответствующий макрос препроцессора SYS_' для вызова системного вызова непосредственно через syscall() 'в код пространства пользователя. Однако эти случаи редки. –

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