假设缓冲区是使用基于页面的方案分配的.实现mmap的一种方法是使用remap_pfn_range,但LDD3表示这对常规内存不起作用.看来我们可以通过使用SetPageReserved标记保留的页面来解决这个问题,以便它被锁定在内存中.但是并非所有内核内存都已经不可交换,即已经保留了吗?为什么需要明确设置保留位?
这是否与从HIGH_MEM分配的页面有关?
正如在这个问题中所讨论的,我在引导时使用内核引导参数保留了一个内存块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