На самом деле, вопреки распространенному мнению (и некоторые ответы здесь), ответ, да, вы можете, но в зависимости от которых ОС:
В 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 это технически не должно допускаться, хотя есть умные хаки, чтобы обойти его.
Несмотря на системные вызовы действительно интерфейс между пользовательским режимом и ядром, есть удивительно довольно много случаев, когда даже производство достойный код делает так, - но за счет тщательного соблюдения предостережений.
Нет, вы не можете. Системный вызов по определению является интерфейсом между ядром и userland –
, который я знал. То, что мы делаем, называется помощником или другими функциями. Мне просто интересно, можем ли мы это сделать или нет. – liuyruc
И системный вызов, вероятно, также является точкой планирования; поэтому вы не хотите называть его функцию в произвольной точке ядра. В общем, кодирование ядра очень сложно. Вы должны объяснить гораздо больше, что и почему вы хотите сделать это. –