免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2287 | 回复: 5
打印 上一主题 下一主题

[进程管理] LDD3的MMAP nopage_fault 函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-03 17:36 |只看该作者 |倒序浏览
本帖最后由 wzw200 于 2014-06-03 17:58 编辑

在学习 LDD3的MMAP nopage_fault 函数,看的是头痛,
其中地址计算 看的头痛,不解,我下面的问题一个老帖子也发过,最中也没有得到结论,

struct vm_area_struct *vma 成员 vm_pgoff 是相对文件的 偏移,怎么计算着就成了 物理地址呢?
新的内核 有个vm_fault *vmf变量,vmf->pgoff成员 差不多,想不通,这应该文件的偏移地址,
  1. int simple_vma_nopage(struct vm_area_struct *vma,struct vm_fault *vmf)
  2. {
  3.     struct page *pageptr;
  4.     unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
  5.     unsigned long physaddr = (unsigned long)vmf->virtual_address - vma->vm_start + offset;
  6.     unsigned long pageframe = physaddr >> PAGE_SHIFT;

  7. // Eventually remove these printks
  8.     printk (KERN_NOTICE "---- Nopage, off %lx phys %lx,vm_pgoff:%lx\n", offset, physaddr,vma->vm_pgoff);
  9.     printk (KERN_NOTICE "VA is %p\n", __va (physaddr));
  10.     printk (KERN_NOTICE "Page at %p\n", virt_to_page (__va (physaddr)));
  11.     if (!pfn_valid(pageframe))
  12.         return 0;
  13.     pageptr = pfn_to_page(pageframe);
  14.     printk (KERN_NOTICE "page->index = %ld mapping %p\n", pageptr->index, pageptr->mapping);
  15.     printk (KERN_NOTICE "Page frame %ld\n", pageframe);
  16.     get_page(pageptr);
  17. //  if (type)
  18. //      *type = VM_FAULT_MINOR;
  19.     return VM_FAULT_NOPAGE;
  20. }
复制代码
别人说这个 vma->vm_pgoff是页帧号,
offset = vma->vm_pgoff << PAGE_SHIFT就得出了那一页的物理地址,
刚好 hysaddr = (unsigned long)vmf->virtual_address - vma->vm_start + offset;得到了 virtual_address对应的物理地址,如果 vma->vm_pgoff是页帧号那么还要 pageframe变量
做什么呢,如果  vma->vm_pgoff是文件偏移,那后面的变量怎么就计算出来了呢!相不通

  1. [size=3][size=4]#define SHARE_MEM_SIZE (PAGE_SIZE * 2)
  2. static char *sh_mem = NULL;

  3. static int nopage_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
  4. {
  5.     struct page *page;
  6.     void *kernel_vaddr = NULL;
  7.     if ((NULL == vma) || (NULL == sh_mem))
  8.     {
  9.         return VM_FAULT_SIGBUS;
  10.     }
  11.     if ((vmf->pgoff <<PAGE_SHIFT) > SHARE_MEM_SIZE)
  12.     {
  13.         return VM_FAULT_SIGBUS;
  14.     }
  15.     kernel_vaddr = sh_mem + (vmf->pgoff << PAGE_SHIFT);
  16.     page = virt_to_page(kernel_vaddr);
  17.     get_page(page);//获得页,实际是增加页的使用计数
  18.     vmf->page = page;
  19.     return 0;
  20. }
  21. static int nopage_init(void)
  22. {
  23.     sh_mem = kmalloc(SHARE_MEM_SIZE, GFP_KERNEL);
  24. }[/size][/size]
复制代码
这是我在网上查的一个例子,用的新版本内核,他的计算好像 vmf->pgoff 文件偏移 +  sh_mem 刚好是 kernel_vaddr

论坛徽章:
0
2 [报告]
发表于 2014-06-03 18:04 |只看该作者
回复 1# wzw200

mv temp.gz  temp.c  

temp.gz

3.99 KB, 下载次数: 12

论坛徽章:
0
3 [报告]
发表于 2014-06-09 09:28 |只看该作者
自己看明白了,

my_mmap.JPG (33.37 KB, 下载次数: 21)

my_mmap.JPG

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-06-09 12:12 |只看该作者
我的内核版本(3.10)中好像找不到这个函数了,详细解释一下?呵呵

论坛徽章:
0
5 [报告]
发表于 2014-06-10 18:44 |只看该作者
回复 4# humjb_1983


  unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;  //vma->vm_pgoff mmap函数的最后一个参数以页为单位  offset变成以字节为单位了
                              
  unsigned long physaddr = (unsigned long)vmf->virtual_address - vma->vm_start + offset;  //算出来的是在文件中以字节为单位的偏移了

在文件中以字节为单位的偏移算出在驱动分配的内存中的偏移-----  //scullv scullP  都是这样做的,


    struct page *pageptr;
    unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
    unsigned long physaddr = (unsigned long)vmf->virtual_address - vma->vm_start + offset;
    unsigned long pageframe = physaddr >> PAGE_SHIFT;  //上面书的这个例子simple,只是演示,没有实际映射!!!好像是有问题//他来自/driver/char/mem.c



   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-06-10 18:53 |只看该作者
哦,原来是这样。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP