2

我想知道是否可以读取文件指针的 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);
4

2 回答 2

1

当然可以。它只是struct file.

它旨在从文件系统接口传递只有特定设备驱动程序知道的数据。

于 2014-03-07T01:36:36.413 回答
0

private_data 指针是一个有用的资源,用于在系统调用中保存模块的状态信息。open 系统调用在调用驱动程序的 open 方法之前将此指针设置为 NULL。内核模块代码需要分配内存并释放它。所以内存是在内核空间中分配的——从用户空间不太容易访问,但从内核空间很容易访问。您可以访问它,但更改它会干扰驱动程序的功能。您可以在一本好书Linux Device Drivers, 3rd Edition (archive)中找到有关 private_data 指针的更多信息。

于 2016-08-31T08:30:28.713 回答