Задача
У меня есть небольшой модуль ядра, который я написал для моего Raspberry Pi 2, которая реализует дополнительный системный вызов для формирования показателей энергопотребления. Я хотел бы изменить системный вызов, чтобы он вызывался только тогда, когда его выдает специальный пользователь (например, «root» или «pi» пользователя). В противном случае вызов просто пропускает основную часть своего тела и возвращает успех.Убедитесь, что проверка UID/GID в системном вызове выполняется в РКГ-критической секции
Фоновая работа
Я прочитал в вопрос подробно, и I've found a similar question on SO, но есть многочисленные проблемы, связанные с ней, с моей точки зрения (указано ниже).
Вопрос
Связанный вопрос отмечает, чтоstruct task_struct
содержит элемент указателя наstruct cred
, как это определено вlinux/sched.h
иlinux/cred.h
. Последний из двух заголовков не существует в моей системе (системах), а первый не показывает объявление указателя на элементstruct cred
. Имеет ли это смысл?- Глупые ошибки. Это присутствует во всей полноте в заголовках ядра (то есть:
/usr/src/linux-headers-$(uname -r)/include/linux/cred.h
), я искал в заголовках gcc-build в/usr/include/linux
.
- Глупые ошибки. Это присутствует во всей полноте в заголовках ядра (то есть:
Даже если вышеуказанное работало, оно не упоминает, если бы я получил the real, effective, or saved UID for the process. Возможно ли даже получить каждое из этих трех значений из системного вызова?cred.h
уже содержит все эти данные.
Есть ли безопасный способ в модуле ядра, чтобы быстро определить, какие группы пользователь принадлежит без разбора/etc/group
?cred.h
уже содержит все эти данные.
Update
Итак, единственный правильный вопрос остальные заключается в следующем:
Обратите внимание, что переборе процессов и чтения учетных данных процесса должно быть сделано в рамках РКО критический раздел.
...
Как обеспечить мой чек работает в этой критической секции? Есть ли какие-либо рабочие примеры того, как это сделать?I've found some existing kernel documentation that instructs readers to wrap the relevant code withrcu_read_lock()
andrcu_read_unlock()
. Нужно ли просто обертывать операции чтения с структурами данныхstruct cred
и/илиstruct task_struct
?
Хороший читать. Спасибо. – DevNull
'/ proc' предназначен для информации процесса. Также есть некоторые устаревшие материалы, но новый материал, который не связан с процессом, должен находиться под '/ sys'. – Gilles