Как получить идентификатор процесса программы, вызвавшей системную функцию - PullRequest
1 голос
/ 03 февраля 2020

Я пишу небольшой драйвер ядра, который выполняет роль приманки и отслеживает действия, выполняемые над конкретным файлом c в системе. Для начала Я использовал код в этом репозитории , который я затем слегка модифицировал по соображениям простоты, чтобы он работал только для одного системного вызова: sys_open.

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

В заключение, есть ли способ, который мог бы дать мне PID процесса, который неявно называется sys_open?

1 Ответ

1 голос
/ 03 февраля 2020

При запуске в коде ядра информация о текущем выполняющемся процессе сохраняется в глобальной переменной current (на самом деле это макрос, определяющий платформу c, а не глобальную переменную, если быть точным), то есть struct task_struct. Если вы находитесь в обработчике системного вызова (или подключитесь к нему), то current будет процессом, который запустил системный вызов, и вы можете просто проверить current->pid, чтобы получить его PID.

Чтобы получить UID, GID, EUID, EGID (и т. д.) текущего процесса, вы можете использовать набор макросов, определенный в linux/cred.h. Со страницы относительной документации ядра :

Существуют удобные оболочки для получения определенных c аспектов учетных данных задачи (значение просто возвращается в каждом случае):

uid_t current_uid(void)     // Current's real UID
gid_t current_gid(void)     // Current's real GID
uid_t current_euid(void)    // Current's effective UID
gid_t current_egid(void)    // Current's effective GID
/* ... */
...