相关疑难解决方法(0)

如何将Linux内核缓冲区映射到用户空间?

假设缓冲区是使用基于页面的方案分配的.实现mmap的一种方法是使用remap_pfn_range,但LDD3表示这对常规内存不起作用.看来我们可以通过使用SetPageReserved标记保留的页面来解决这个问题,以便它被锁定在内存中.但是并非所有内核内存都已经不可交换,即已经保留了吗?为什么需要明确设置保留位?

这是否与从HIGH_MEM分配的页面有关?

linux linux-device-driver linux-kernel

16
推荐指数
2
解决办法
2万
查看次数

将mmap内核启动参数保留的内存映射到用户空间

正如在这个问题中所讨论的,我在引导时使用内核引导参数保留了一个内存块memmap=8G$64G

我编写了一个字符驱动程序内核模块,在初始化期间会执行此保留内存块的ioremap. 正如这里所解释的,在我的驱动程序中,mmap我需要做的就是remap_pfn_range为此返回的内存块指针ioremap.

我在3.0 linux内核上运行它.我的用户空间应用程序打开此内存块作为驱动程序安装的设备.当我 mmap从使用空间应用程序,我看到系统挂起.dmesg不提供太多信息.

有什么投入?

static int __init myDev_module_init(void)
{
   int retval;

   myDev_major = register_chrdev(0, DEVICE_NAME, &myDevfops);
   if (myDev_major < 0) 
   {
       err("failed to register device: error %d\n", myDev_major);
       retval = myDev_major;
       goto FAILED_CHRDEVREG;
   }

   myDev_class = class_create(THIS_MODULE, CLASS_NAME);
   if (IS_ERR(myDev_class)) 
   {   
       err("failed to register device class '%s'\n", CLASS_NAME);
       retval = PTR_ERR(myDev_class);
       goto FAILED_CLASSREG;
   }


   myDev_device = …
Run Code Online (Sandbox Code Playgroud)

kernel kernel-module linux-device-driver linux-kernel embedded-linux

6
推荐指数
1
解决办法
3662
查看次数