2015-10-30 3 views
2

Я пытаюсь изменить ядро ​​Linux, и мне нужно получить идентификатор пользователя и идентификатор группы процессов из task_struct и pid_namespace. Хотя я искал их определения в исходном коде, я не мог найти глобальных переменных или функций (может быть, мне не хватает из-за отсутствия комментариев в кодах), чтобы получить к ним доступ.Получение идентификатора пользователя и идентификатора группы процессов из task_struct и pid_namespace

Есть ли способ получить их внутри пространства ядра, так как я не могу использовать функции пользовательского пространства, такие как getuid() и т. Д.?

ответ

4

Вы должны уметь использовать task_struct->cred->uid или task_struct->real_cred->uid. При этом я не тестировал это, и это просто из беглого чтения LXR (include/linux/sched.h line 1508 и include/linux/cred.h строка 127).

Если вы хотите PGID, попробуйте pid_vnr(task_pgrp(task_struct)). Этот код из строки ядра/sys.c 990.

+0

спасибо. Если вы знаете, можете ли вы ответить за pid_namespace? – user5508821

+0

Из моего быстрого прочтения (и я никоим образом не являюсь разработчиком ядра), похоже, что в пространствах имен PID есть какие-либо пользователи или группы, связанные с ними. См. Http://lwn.net/Articles/531419/ –

+0

Фактически я меняю fs/proc/base.c функцию has_pid_permission. По умолчанию они использовали pid-> hide_pid, pid-> pid_gid (pid - указатель на pid_namespace). Я думал, что pid_namespace - это специальная структура для процесса для хранения только своих значений pid, поэтому она должна содержать pgid, uid и т. Д. Я прав? Хотя у него есть pid_gid (группа потоков или группа процессов не такая уверенная), hide_pid, last_pid (?) Переменные, у нее нет никакой переменной типа uid. Фактически, что я хочу сделать, просто сравните текущий процесс с задачей. Я думал, что функция делает то же самое. – user5508821

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