#c #linux-kernel
#c #linux-ядро
Вопрос:
Я хочу найти путь к файлу в модуле ядра. Единственная информация, которая у меня есть, — это дескриптор файла.
Я прочитал несколько сообщений и увидел, что с помощью dentry_path_raw(filp->f_path.dentry,buf,buflen) можно получить путь, где filp — указатель на файл структуры.
После некоторого поиска я знаю, что «файловая структура представляет собой открытый файл. (Это не относится к драйверам устройств; каждый открытый файл в системе имеет связанный файл структуры в пространстве ядра.) Он создается ядром при открытии и передается любой функции, которая работает с файлом «.
Но как получить этот файл структуры в первую очередь?
Комментарии:
1. Файл структуры существует в пространстве ядра. Найдите драйвер, связанный с файлом, и затем вы можете получить указатель на файл структуры в функциях, работающих с файлом.
2. Вы можете получить
struct file *
из дескриптора файла для текущего контекста задачи только сfget()
помощью . Вызовитеfput()
после этого.3. @user7176709 Не могли бы вы уточнить, пожалуйста? Например, какой драйвер для файла? Я впервые что-то делаю с модулем ядра.
4. @Ian Abbott: Возможно, это глупый вопрос, но я не нашел функции fget() . Вы имеете в виду fgets()? Разрешено ли его использовать в пространстве ядра? и он не принимает дескриптор файла в качестве одного из своих аргументов.
5. Я имел в виду функцию ядра
fget
, объявленную#include <linux/file.h>
.
Ответ №1:
struct file
обычно передается функциям open
and release
модуля ядра.
В вашем модуле ядра вы обычно заполняете file_operations
объект:
static struct file_operations my_fops = {
.owner = THIS_MODULE,
.open = my_open,
.release = my_release,
};
Затем реализуйте функции:
static int my_open(struct inode *inode, struct file *filp) {
// Here you get the `filp`
return 0;
}
static int my_release(struct inode *inode, struct file *filp) {
// Here you get the `filp`
return 0;
}
После установки вашего модуля система автоматически вызовет my_open
, когда приложение вызывает open()
функцию для этого модуля, передавая filp
указатель.