Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89247
  • 博文数量: 31
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-08 13:05
文章分类

全部博文(31)

文章存档

2014年(17)

2013年(11)

2012年(3)

我的朋友

分类: LINUX

2014-01-13 16:16:13

关于main.c中的错误可以参考scullp中的处理方法:
这里主要处理mmap的错误处理:

包含头文件,否则会提示struct semaphore sem没有定义之类的错误。

关键的改变在mmap.c中,由于vm_operations_struct的变化,需要对mmap.c做如下变化:

1. 包含头文件,否则在函数scull_mmap中,会提示

        vma->vm_private_data = filp->private_data;

dereferencing pointer to incomplete type.这是因为其找不到struct file的定义。

2. 以前的函数

        struct page *scullv_vma_nopage(struct vm_area_struct *vma, unsigned long address, int *type)

现在其后面的参数address, type都可以通过结构struct vm_fault来获得。该函数需要改变为:

        static int scullv_vma_fault (struct vm_area_struct *vma, struct vm_fault *vmf)

其函数体也需要作出相应改变:


  1. 点击(此处)折叠或打开

    1. static int scullv_vma_fault(struct vm_area_struct *vma,
    2.                             struct vm_fault *vmf)
    3. {
    4.     unsigned long offset;
    5.     struct scullv_dev *ptr, *dev = vma->vm_private_data;
    6.         struct page *page;
    7.     void *pageptr = NULL; /* default to "missing" */
    8.         pgoff_t pgoff = vmf->pgoff;
    9.   
    10.     down(&dev->sem);
    11.     offset = (pgoff << PAGE_SHIFT) + (vma->vm_pgoff << PAGE_SHIFT);
    12.     if (offset >= dev->size) goto out; /* out of range */
    13.   
    14.     /*
    15.      * Now retrieve the scullv device from the list,then the page.
    16.      * If the device has holes, the process receives a SIGBUS when
    17.      * accessing the hole.
    18.     */
    19.    offset >>= PAGE_SHIFT; /* offset is a number of pages */
    20.    for (ptr = dev; ptr && offset >= dev->qset;) {
    21.         ptr = ptr->next;
    22.         offset -= dev->qset;
    23.     }
    24.     if (ptr && ptr->data) pageptr = ptr->data[offset];
    25.     if (!pageptr) goto out; /* hole or end-of-file */
    26.   
    27.     /*
    28.      * After scullv lookup, "page" is now the address of the page
    29.      * needed by the current process. Since it's a vmalloc address,
    30.      * turn it into a struct page.
    31.      */
    32.      page = vmalloc_to_page(pageptr);
    33.      if (!page)
    34.           return VM_FAULT_SIGBUS;
    35.   
    36.      /* got it, now increment the count */
    37.      vmf->page = page;
    38.   
    39. out:
    40.      up(&dev->sem);
    41.      return 0;
    42. }

3. 在结构scull_vm_ops初始化时:

去掉.nopage = scullv_vma_nopage,

修改为.fault = scullv_vma_fault,

阅读(797) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~