1

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

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

};

前一个结构中映射的所有函数都经过测试,它们都可以。我想全局声明(如果可用,静态声明)一个字符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;
}

我的困难是:

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

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

  3. mmap所有这些场景如何关联?

我阅读了第 15 章和更多材料,但不知道该怎么做。我在网上找到的所有示例都声明了一个文件并与内核和用户空间共享它。

4

1 回答 1

5

您需要实现该mmap功能并从file_operations.

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

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

于 2012-08-08T09:06:14.873 回答