【问题标题】:in kernel driver, why does not mmap work in procfs?在内核驱动程序中,为什么 mmap 在 procfs 中不起作用?
【发布时间】:2016-03-23 16:58:10
【问题描述】:

我实现了 mmap 功能,并将其挂载到文件操作。 并在 /proc 中创建一个文件。 但是当我 insmod 时,它响应“mmap_example2:未知符号_page_cachable_default insmod:无法插入'mmap_example2.ko':模块中的未知符号或未知参数“

当我从文件操作中删除 mmap 函数时,它可以插入。 所以我忽略了什么?如何使 mmap 在 procfs 中工作?

代码如下

#include <linux/init.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/vmalloc.h>

#define FILE_NAME "test"

typedef enum ALLOC_TYPE
{
    KMALLOC = 0, VMALLOC, MAX_ALLOC_TYPE,
} eAllocType;

static unsigned char array[10]={0,1,2,3,4,5,6,7,8,9};
static unsigned char *buffer;

static int file_open(struct inode *pInode, struct file *pFile)
{
    printk("%s\n", __FUNCTION__);
    return 0;
}

static int file_release(struct inode *pInode, struct file *pFile)
{
    printk("%s\n", __FUNCTION__);
    return 0;
}

static int file_mmap(struct file *pFile, struct vm_area_struct* pVMA)
{
    unsigned long page;
    unsigned char i;
    unsigned long start = (unsigned long)pVMA->vm_start;
    unsigned long size = (unsigned long)(pVMA->vm_end - pVMA->vm_start);

    page = virt_to_phys(buffer);

    if(remap_pfn_range(pVMA,start,page>>PAGE_SHIFT,size,PAGE_SHARED))
    return -1;

     for(i=0;i<10;i++)
         buffer[i] = array[i];
     return 0;
}

struct file_operations file_ops =
{
    .open       = file_open,
    .release    = file_release,
    .mmap       = file_mmap,
};

static int mmap_example2_init(void)
{
    struct proc_dir_entry* entry = NULL;
    printk("%s init\n", __FUNCTION__);
    if(!(entry = create_proc_entry(FILE_NAME,0666,NULL)))
    {
    printk("%s fail to create proc file\n",__FUNCTION__);
    return -EINVAL;
    }
    entry->proc_fops = &file_ops;
    buffer = kmalloc(10,GFP_KERNEL);
    if (!buffer)
    {
    printk("allocate mem error\n");
    return -1;
    }
    SetPageReserved(virt_to_page(buffer));
    return 0;
}

static void mmap_example2_exit(void)
{
    printk("%s exit\n", __FUNCTION__);
    remove_proc_entry(FILE_NAME,NULL);
    ClearPageReserved(virt_to_page(buffer));
    kfree(buffer);
}

module_init(mmap_example2_init);
module_exit(mmap_example2_exit);

【问题讨论】:

    标签: linux-kernel linux-device-driver embedded-linux


    【解决方案1】:

    要添加 file_operations 使用 proc_create 而不是 create_proc_entry 并将您的 file_operation 对象传递给它

    static struct file_operations myops = 
    {
        .read = myread,
        .mmap = mymmap,
    };
    static int simple_init(void)
    {
        ent=proc_create("mytest",0660,NULL,&myops);
        printk(KERN_ALERT "hello, module %d...\n",irq);
        return 0;
    }
    

    【讨论】:

    • 它不起作用。仍然响应“mmap_example2: Unknown symbol _page_cachable_default insmod: can't insert 'mmap_example2.ko': unknown symbol in module, or unknown parameter”
    • 内核版本是多少
    • 它仍然不起作用,使用 proc_create。内核版本是 2.6.27.29。应该启用哪个配置?
    • 先尝试将 mmap 留空(只返回 0),看看是否会遇到同样的错误。如果不添加,只需添加 virt_to_phys 并再次测试
    • 当我将 mmap 留空时,它可以工作。当此函数有 remap_pfn_range 时,会发生错误。所以这个功能使这种情况发生。但我把这个 mmap 放到 char 设备驱动程序中,它工作成功。但是我还是不知道为什么procfs可以使用mmap?
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多