2014-01-25 5 views
0

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

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

+0

Использование прок для обмена переменных в пространстве пользователя обескураживают и магистральным не будет принимать никаких код, который делает это, если у вас нет действительно хорошей причины для создания записи proc. Вместо этого используйте sysfs, который был создан для решения этой самой проблемы. – tangrs

+0

@tangrs, тогда я попробую _sysfs_. Спасибо за весь ваш ответ! – 2rdv1

ответ

0

Источник: 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, этот пример показывает, как обрабатывать такие записи.

+0

Это помогло, но я перейду к _sysfs_. Спасибо – 2rdv1

0

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

struct proc_dir_entry your_proc_dir_entry{ 
.proc_fops = &your_fops, 
} 
+0

Я использую ядро ​​3.8, спасибо! – 2rdv1