Проверьте файл /proc из модуля ядра C

Я хотел бы использовать переменную между ядром и пользовательским пространством, и я обнаружил, что это возможно с помощью procfs. Модуль ядра должен действовать определенным образом, если задано данное значение. Программа пользовательского пространства отвечает за изменение этого значения, но модуль ядра должен считывать его при необходимости.

Я знаю, что должен создать файл /proc в модуле ядра. У меня вопрос: как прочитать файл из модуля ядра?


person 2rdv1    schedule 25.01.2014    source источник
comment
Использование proc для обмена переменными в пользовательском пространстве не рекомендуется, и mainline не примет никакого кода, который делает это, если у вас нет очень, очень веской причины для создания записи proc. Вместо этого используйте sysfs, который был создан для решения этой проблемы.   -  person tangrs    schedule 25.01.2014
comment
@tangrs, тогда я попробую sysfs. Спасибо за ваш ответ!   -  person 2rdv1    schedule 26.01.2014


Ответы (2)


Источник: linux.die.net/lkmpg/x769.html

/**
 * This function is called with the /proc file is written
 *
 */

int procfile_write(struct file *file, const char *buffer, unsigned long count,
           void *data)

{
/* get buffer size */
procfs_buffer_size = count;
if (procfs_buffer_size > PROCFS_MAX_SIZE ) {
    procfs_buffer_size = PROCFS_MAX_SIZE;
}

/* write data to the buffer */
if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) {
    return -EFAULT;
}

return procfs_buffer_size;
}

Чтобы уточнить, в вашем модуле всякий раз, когда пользователь пишет в ваш файл в procfs, этот пример показывает, как обрабатывать такую ​​​​запись.

person brainovergrow    schedule 25.01.2014
comment
Это помогло, но я перейду на sysfs. Спасибо - person 2rdv1; 26.01.2014

В ядре >= 3.10 proc_write перемещен в структуру file_operations, где объявление записи отличается, поэтому в новейшей версии ваше решение не будет работать. Вы можете реализовать типичный file_operations.write(struct file *, const char __user *, size_t, loff_t *) и сослаться на это:

struct proc_dir_entry your_proc_dir_entry{
.proc_fops = &your_fops,
}
person marcinioski    schedule 25.01.2014