免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 20276 | 回复: 42

请教大家一个mmap的问题 [复制链接]

论坛徽章:
0
发表于 2007-06-13 00:02 |显示全部楼层
在LDD2中讲到

remap_pfn_range的第二个参数phys_add是物理地址,在这个程序中

int simple_mmap( struct file *filp, struct vm_area_struct *vma )
{
    unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
   
     ...
     
     remap_pfn_range( vma, vma->start, offset, vma->vm_end - vma->vm_start, vma->vm_page_prot );

     ...
}

请教大家为什么 vma->vm_pgoff << PAGE_SHIFT 的值是物理地址。

--根据LDD3做了修改,方便大家讨论^_^

[ 本帖最后由 albcamus 于 2007-6-13 12:01 编辑 ]

论坛徽章:
0
发表于 2007-06-13 10:08 |显示全部楼层
vma->vm_pgoff是该vma在其所映射文件的偏移,以PAGE_SIZE为单位,即vm_pgoff是pfn, 左移PAGE_SHIFT即是物理地址。 不知对不?

论坛徽章:
0
发表于 2007-06-13 10:47 |显示全部楼层

回复 #2 albcamus 的帖子

如果偏移是0呢? 。。。。

论坛徽章:
0
发表于 2007-06-13 10:51 |显示全部楼层

回复 #3 rwen2012 的帖子

即是mmap时的offset是0,  vm->vm_pgoff不会是0吧? 大家讨论下。

论坛徽章:
0
发表于 2007-06-13 11:05 |显示全部楼层
原帖由 albcamus 于 2007-6-13 10:51 发表于 4楼  
即是mmap时的offset是0,  vm->vm_pgoff不会是0吧? 大家讨论下。



好像vvm_pgoff传入的就是文件偏移啊, 请确认一下

论坛徽章:
0
发表于 2007-06-13 11:08 |显示全部楼层
我觉得你首先得了解vm->vm_pgoff和PAGE_SHIFT是什么意思,vm_pgoff 代表的是这个VM被映射的物理页,而物理页号左移PAGE_SHIFT后,得到的是物理地址,物理地址右移PAGE_SHIFT得到的是物理页号。

论坛徽章:
0
发表于 2007-06-13 11:28 |显示全部楼层
原帖由 rwen2012 于 2007-6-13 11:05 发表于 5楼  

好像vvm_pgoff传入的就是文件偏移啊, 请确认一下


确认, 是这样的, 在do_map_pgoff()中是直接用pgoff赋给vm_pgoff的。

但是, 为什么LDD3用remap_pfn_range实现mmap, 却是把vm_pgoff作为第3个参数传递给它呢?  有点晕。

论坛徽章:
0
发表于 2007-06-13 11:30 |显示全部楼层
原帖由 snow_insky 于 2007-6-13 11:08 发表于 6楼  
我觉得你首先得了解vm->vm_pgoff和PAGE_SHIFT是什么意思,vm_pgoff 代表的是这个VM被映射的物理页,而物理页号左移PAGE_SHIFT后,得到的是物理地址,物理地址右移PAGE_SHIFT得到的是物理页号。


道理是这样子的,我也一直觉得vm_pgoff是pfn, 但是它是在哪里被赋值的呢?

论坛徽章:
0
发表于 2007-06-13 11:51 |显示全部楼层
filemap.c里的nopage很容易理解,这个vm_pgoff明显就是文件偏移

struct page *filemap_nopage(struct vm_area_struct *area,
                                unsigned long address, int *type)
{
        int error;
        struct file *file = area->vm_file;
        struct address_space *mapping = file->f_mapping;
        struct file_ra_state *ra = &file->f_ra;
        struct inode *inode = mapping->host;
        struct page *page;
        unsigned long size, pgoff;
        int did_readaround = 0, majmin = VM_FAULT_MINOR;

        pgoff = ((address-area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;

         ......

        /*
         * Do we have something in the page cache already?
         */
retry_find:
        page = find_get_page(mapping, pgoff);
        if (!page) {  
                 ......

论坛徽章:
0
发表于 2007-06-13 12:09 |显示全部楼层
原帖由 rwen2012 于 2007-6-13 11:51 发表于 9楼  
filemap.c里的nopage很容易理解,这个vm_pgoff明显就是文件偏移

struct page *filemap_nopage(struct vm_area_struct *area,
                                unsigned long address, int *type)
{
     ...



那如果看LDD3中 两种mmap方法的实现:

1,

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{
        if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,  //remap_pfn_mmap的第三个参数要求是pfn
                            vma->vm_end - vma->vm_start,
                            vma->vm_page_prot))
                return -EAGAIN;


2,

static int simple_nopage_mmap(struct file *filp, struct vm_area_struct *vma)
{
        unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;

        if (offset >= __pa(high_memory) || (filp->f_flags & O_SYNC))
                vma->vm_flags |= VM_IO;
       


vm_pgoff就明显是pfn了。  

差别在哪里?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2021中国数据库技术大会

【数造未来】2021年10月18日-20日第十二届中国数据库技术大会
ITPUB、大会的会员您们好: 因目前国内疫情严峻,为响应北京市最新疫情防控要求,保障参会人员的健康和安全,组委会经协商决定:DTCC2021第十二届中国数据库技术大会延期至10月18日-20日(周一~周三)在北京国际会议中心举行,由此给各位带来的不便,敬请谅解!

大会官网
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP