C 如何获取内核模块中数组的地址,因此I';您能在用户空间应用程序中使用它吗?
我有一个名为C 如何获取内核模块中数组的地址,因此I';您能在用户空间应用程序中使用它吗?,c,linux,memory,linux-kernel,linux-device-driver,C,Linux,Memory,Linux Kernel,Linux Device Driver,我有一个名为mymodule的内核模块,其中有: static struct file_operations my_mod_fops = { .owner = THIS_MODULE .write = my_write, .open = my_open, .unlocked_ioctl = my_ioctl, .read = my_read, }; 上一个结构中映射的所有函数都经过了测试,它们都正常。 我想全局地
mymodule
的内核模块,其中有:
static struct file_operations my_mod_fops = {
.owner = THIS_MODULE
.write = my_write,
.open = my_open,
.unlocked_ioctl = my_ioctl,
.read = my_read,
};
上一个结构中映射的所有函数都经过了测试,它们都正常。
我想全局地(静态地,如果可用的话)声明一个charkernel\u 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;
}
intmain(){
char*ptr_to_kernel_arr=get_kernel_array_address();
对于(int i=0;i您需要实现mmap
功能,并从file\u operations
指向它
这将允许用户空间打开您的设备,使用文件描述符调用mmap
,并获取地址
请注意,mmap以页面分辨率工作。因此您不能映射128字节,只能映射4K的倍数。您可以映射4K页面其中包含静态缓冲区,但用户进程将能够破坏其不应接触的内存,这是非常不鼓励的。您需要实现mmap
功能,并从文件\u操作中指向它
这将允许用户空间打开您的设备,使用文件描述符调用mmap
,并获取地址
请注意,mmap以页面分辨率工作。因此您不能映射128字节,只能映射4K的倍数。您可以映射4K页面其中包含静态缓冲区,但用户进程将能够损坏其不应接触的内存,这是非常不鼓励的。如果您试图从ring3访问内核资源ring0,则只能使用系统调用,而不能直接访问。您无法将内核内存映射到用户空间。这将是一个巨大的安全漏洞意识到安全问题我唯一的目的是了解内存结构…如果您试图从ring3访问内核资源ring0,这只能使用系统调用,而不能直接访问。您无法将内核内存映射到用户空间。这将是一个巨大的安全漏洞!我意识到安全问题我唯一的目的是了解内存结构…用文件描述符调用mmap,并获取地址。你指的是什么文件描述符?我如何“共享”只有128字节???thanks@rjayavrp,我没有代码示例。有一些关于实现mmap
@0x90的网页,当您打开与驱动程序关联的设备文件时,您会得到一个文件描述符。这是一个。并且无法共享128字节-它以页面分辨率工作。您必须将128字节放在专用页面中,而re剩余的将不被使用。@ugoren..我使用remap_pfn_range()转换电路板的物理地址。然后在用户空间中使用mmap()。对虚拟地址有什么想法吗?@rjayavrp,请参阅此处示例的链接(在注释中):。使用文件描述符调用mmap,并获取地址。你指的是什么文件描述符?我如何“共享”只有128字节???thanks@rjayavrp,我没有代码示例。有一些关于实现mmap
@0x90的网页,当您打开与驱动程序关联的设备文件时,您会得到一个文件描述符。这是一个。并且无法共享128字节-它以页面分辨率工作。您必须将128字节放在专用页面中,而re剩余的将不被使用。@ugoren..我使用remap_pfn_range()转换电路板的物理地址。然后在用户空间中使用mmap()转换它。关于虚拟地址有什么想法吗?@rjayavrp,请参阅此处示例的链接(在注释中):。