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)
我的困难是:
如何获取kernel_array[128]
可以从用户空间应用程序分配值的地址?
内核如何知道其lsmod
列表中的哪个模块拥有该模块kernel_array
如何处理mmap
所有这些情况?
您需要实现该mmap
功能并指向它file_operations
.
这将允许用户空间打开您的设备,mmap
使用文件描述符调用,并获取地址.
请注意,mmap适用于页面分辨率.所以你不能映射128个字节,但只能映射4K的倍数.您可以映射包含静态缓冲区的4K页面,但是用户进程将能够破坏它不应该触摸的内存,这是非常不鼓励的.