如何在内核模块中获取数组的地址,以便我能够在用户空间应用程序中使用它?

0x9*_*x90 1 c linux memory linux-device-driver linux-kernel

我有一个名为的内核模块mymodule,我有:

static struct file_operations my_mod_fops = {
        .owner = THIS_MODULE
        .write = my_write,
        .open = my_open,
        .unlocked_ioctl = my_ioctl,
        .read = my_read,

};
Run Code Online (Sandbox Code Playgroud)

测试了前一个结构中映射的所有函数,它们都没问题.我想声明全局(并且静态地,如果可用)一个char kernel_array[128],我想编写一个可以执行此操作的用户空间应用程序:

int main(){

char* ptr_to_kernel_arr = get_kernel_array_address();

for (int i=0 ; i<128;++i)
    *(ptr_to_kernel_arr+i) = i;

return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的困难是:

  1. 如何获取kernel_array[128]可以从用户空间应用程序分配值的地址?

  2. 内核如何知道其lsmod列表中的哪个模块拥有该模块kernel_array

  3. 如何处理mmap所有这些情况?

我阅读了第15章和更多材料,但无法弄清楚如何做到这一点.我在网上找到的所有例子都声明了一个文件并与内核和用户空间共享.

ugo*_*ren 5

您需要实现该mmap功能并指向它file_operations.

这将允许用户空间打开您的设备,mmap使用文件描述符调用,并获取地址.

请注意,mmap适用于页面分辨率.所以你不能映射128个字节,但只能映射4K的倍数.您可以映射包含静态缓冲区的4K页面,但是用户进程将能够破坏它不应该触摸的内存,这是非常不鼓励的.