Как мне вызвать системный вызов Linux из пространства ядра? - PullRequest
5 голосов
/ 15 января 2010

Я портирую модуль ядра Linux, написанный для Linux 2.4, для работы с Linux 2.6. В коде использовались некоторые системные вызовы, объявленные с помощью макросов syscallN() и заключенные в вызовы set_fs(). Как я могу все еще использовать sycalls в Linux 2.6, где эти макросы отсутствуют?

Я знаю, что использовать системные вызовы из пространства ядра - это плохой вкус, и макросы syscallN() на большинстве платформ не работают. Любой разумный способ заменить системные вызовы getuid, geteuid, mknod, chown, unlink, sched_yield в пространстве ядра приветствуется.

1 Ответ

3 голосов
/ 15 января 2010

current->uid и current->euid могут заменить первые два.

schedule() должно работать для последнего.

Операции с файловой системой выглядят более сложными: вы можете попробовать посмотреть, экспортируются ли sys_chown(), sys_mknod() и sys_unlink() (доступно для использования любым модулем). Если они работают, отлично. Вот несколько полезных советов . В противном случае вам придется копать немного глубже:

Системный вызов chown определен в fs/open.c. На первый взгляд, я не понимаю, почему вы не можете скопировать этот код в свою собственную функцию «kernel_chown» и попробовать.

Системные вызовы mknodat и unlink находятся в fs/namei.c; в итоге они звонят vfs_mknod() и vfs_unlink() соответственно. Может быть, вы можете скопировать этот код или выяснить, как это делается оттуда.

...