2013-04-05 2 views
7

Иногда, когда мы вызываем системный вызов в системе ядра, мы вызываем его помощник или связанные с ним функции ядра, вместо этого делаем syscall. Мне все еще интересно, можно ли назвать системный вызов в пространстве ядра? Если нет, что мешает нам это делать.Можно ли назвать системный вызов в пространстве ядра?

Мой вопрос немного странный.

+0

Нет, вы не можете. Системный вызов по определению является интерфейсом между ядром и userland –

+0

, который я знал. То, что мы делаем, называется помощником или другими функциями. Мне просто интересно, можем ли мы это сделать или нет. – liuyruc

+0

И системный вызов, вероятно, также является точкой планирования; поэтому вы не хотите называть его функцию в произвольной точке ядра. В общем, кодирование ядра очень сложно. Вы должны объяснить гораздо больше, что и почему вы хотите сделать это. –

ответ

9

На самом деле, вопреки распространенному мнению (и некоторые ответы здесь), ответ, да, вы можете, но в зависимости от которых ОС:

  • В Linux, вы можете вызвать почти все системные вызовы, если вы можете найти их экспорт ядра (например, «cat/proc/kallsysms | grep sys_»). Существует незначительная «трюк», чтобы обойти защиту в большинстве системных вызовов (тех, которые принимают режим пользователя *), путем установки сегмента данных (KERNEL_DS). Это не совсем рекомендуется, но, безусловно, имеет смысл, если вам нужно получить доступ к файлам из ядра (например, SELinux).

  • В Windows большинство вызовов Nt * в ядре также доступны как Zw * calls - do "dumpbin/exports C: \ windows \ system32 \ ntoskrnl.exe | findstr Zw (или Nt)" для пример.

  • В Mac OS X это технически не должно допускаться, хотя есть умные хаки, чтобы обойти его.

Несмотря на системные вызовы действительно интерфейс между пользовательским режимом и ядром, есть удивительно довольно много случаев, когда даже производство достойный код делает так, - но за счет тщательного соблюдения предостережений.

+1

Однако, когда я вставляю insmod, он жалуется на «Неизвестный символ sys_socket». –

+0

Это может быть потому, что символ только GPL. Linux как-то как-то. попробуйте cat/grep сверху, и если вы видите экспортированный символ (T) и по-прежнему не можете ссылаться на него, то, скорее всего, это произойдет. Не все системные вызовы обязательно экспортируются. Также с сокетами, в частности, есть и другие проблемы, но давайте не будем усложнять - попробуйте это сначала – Technologeeks