C:在内核模块中读取filepinter的filp-> private_data

问题描述 投票:2回答:2

我想知道是否可以读取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);
c kernel-module file-pointer
2个回答
1
投票

当然可以。它只是struct file的一个领域。

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


0
投票

private_data指针是一个有用的资源,用于跨模块跨系统调用保存状态信息。在调用驱动程序的open方法之前,open系统调用将此指针设置为NULL。内核模块代码需要分配内存并释放它。因此内存在内核空间中分配 - 不能从用户空间访问,但可以从内核空间轻松访问。您可以访问它,但更改它可能会干扰驱动程序的运行。你可以在一本伟大的书籍more about private_data pointer here(archive)找到Linux Device Drivers, 3rd Edition(archive)

© www.soinside.com 2019 - 2024. All rights reserved.