2012-06-16 2 views
2

Мне интересно, можно ли прочитать private_data файла-указателя? Или это действительно «частное» ?!C: read filp-> private_data файла-файла в модуле ядра

Я в модуле ядра!

struct file *intercepted_fp; 

intercepted_fp = filp_open("/dev/snd/pcmC0D0p_bak", O_RDWR, (S_IRWXU | S_IRWXG | S_IRWXO)); 

if (intercepted_fp == NULL) { 
    LOGI("Cannot open intercepted device!"); 
    return -ENODEV; 
} 

mm_segment_t old_fs = get_fs(); 
set_fs(get_ds()); 

LOGI("private data: %p", intercepted_fp->private_data); // -> prints "private data: ffffffff" 
LOGI("buffer: %d", ((struct snd_pcm_file*) intercepted_fp->private_data)->substream->runtime->buffer_size); // -> Unable to handle kernel paging request at virtual address ffffffff 
set_fs(old_fs); 

ответ

1

Конечно, вы можете. Это всего лишь поле в struct file.

Он предназначен для передачи данных, известных только конкретному драйверу устройства, из интерфейса файловой системы.

0

Указатель private_data - полезный ресурс для сохранения информации о состоянии модулем через системные вызовы. Открытый системный вызов устанавливает этот указатель в NULL перед вызовом метода open для драйвера. Код модуля ядра должен выделять память и освобождать ее. Итак, память выделяется в пространстве ядра - недоступна из-под места пользователя, но легко доступна из пространства ядра. Вы можете получить к нему доступ, но его изменение может нарушить работу драйвера.more about private_data pointer here(archive) в отличной книге Linux Device Drivers, 3rd Edition(archive).

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

  • Нет связанных вопросов^_^