我想知道是否可以读取filepointer的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);
当然可以。它只是struct file
的一个领域。
它旨在从文件系统接口传递仅为特定设备驱动程序所知的数据。
private_data指针是一个有用的资源,用于跨模块跨系统调用保存状态信息。在调用驱动程序的open方法之前,open系统调用将此指针设置为NULL。内核模块代码需要分配内存并释放它。因此内存在内核空间中分配 - 不能从用户空间访问,但可以从内核空间轻松访问。您可以访问它,但更改它可能会干扰驱动程序的运行。你可以在一本伟大的书籍more about private_data pointer here(archive)找到Linux Device Drivers, 3rd Edition(archive)。