免费注册 查看新帖 |

Chinaunix

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

vm_area_struct 中的 pg_off 的值是怎么来的.... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-09 17:18 |只看该作者 |倒序浏览
本帖最后由 dong_j_t 于 2011-02-09 21:57 编辑

继续奋战LDD3..........

在 学习LDD3 的虚拟内存区的时候,看到查看进程内存区域的方法 就自己试着查看了init的进程使用情况:

dongjt@dongjt-desktop:~/Linux/linux-2.6.30$ sudo cat /proc/1/maps
[sudo] password for dongjt:
b7e2e000-b7e2f000 rw-p 00000000  00:00  0
b7e2f000-b7f8b000 r-xp  00000000  08:01  434064     /lib/tls/i686/cmov/libc-2.9.so
b7f8b000-b7f8c000 ---p   0015c000  08:01  434064     /lib/tls/i686/cmov/libc-2.9.so
b7f8c000-b7f8e000 r--p   0015c000  08:01  434064     /lib/tls/i686/cmov/libc-2.9.so
b7f8e000-b7f8f000 rw-p  0015e000  08:01  434064     /lib/tls/i686/cmov/libc-2.9.so
b7f8f000-b7f92000 rw-p  00000000  00:00  0
b7fa7000-b7fa9000 rw-p  00000000  00:00  0
b7fa9000-b7faa000 r-xp   00000000  00:00  0               [vdso]
b7faa000-b7fc6000 r-xp   00000000  08:01  422058     /lib/ld-2.9.so
b7fc6000-b7fc7000 r--p   0001b000  08:01  422058     /lib/ld-2.9.so
b7fc7000-b7fc8000 rw-p  0001c000  08:01  422058     /lib/ld-2.9.so
b7fc8000-b7fe1000 r-xp   00000000  08:01  62284      /sbin/init
b7fe1000-b7fe2000 r--p    00018000  08:01  62284      /sbin/init
b7fe2000-b7fe3000 rw-p  00019000  08:01  62284      /sbin/init
b9b46000-b9c94000 rw-p 00000000 00:00  0              [heap]
bf9e2000-bf9f7000 rw-p   00000000  00:00  0              [stack]


每行都 是以以下形式表示:  
start-end  perm offset major:minor inode image

以上 字段中我对offset 有点疑问

开始我对offset的理解是 当一个映射文件不只一个vma时,offset 就是该vma的vm_start 映射到文件后,在文件中的位置

即如果映射文件有三个vma( 根据其vm_start由小到大排序,分别叫vm1,vm2,vm3)
则vm1 的 offset = 00000000
vm2 的    offset = vm2_start - vm1_start
vm3 的    offset = vm3_start - vm1_start

可上面cat的结果却不是这样.......

请问offset 应该怎么理解??
还有offset 是vm_area_struct 中的 pg_off的值??

内存映射搞了几天,头好晕~~

论坛徽章:
0
2 [报告]
发表于 2011-02-10 19:19 |只看该作者
http://www.kerneltravel.net/journal/v/mem.htm
以上这篇文章讲得很不错,看完了,估计就能明白的差不多。

论坛徽章:
0
3 [报告]
发表于 2011-02-12 11:32 |只看该作者
回复 2# EZWORD


   谢谢你的回答~~
不过我还是有些地方不明白:
LDD3在使用remap_pfn_range 为一段物理地址新建也表时,有一段代码
static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{
    if (remap_pfn_range(vma,vma->vm_start, vm->vm_gpoff, vm->vm_end - vm_->start, vma->vm_page_prot) )
           return  -EAGAIN;

    vma->vm_ops = &simple_remap_vm_ops;
    simple_vma_open(vma);
    return 0;
}

LDD3中在对函数 remap_pfn_range ( struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgport_t *port);
中的unsigned long pfn 参数的描述是:   与物理内存对应的页帧号,虚拟内存将要被映射到该物理内存上。

而在对vm_area_struct 结构的 unsigned long vm_pgoff 变量的描述是:
以页为单位,文件中该区域的偏移量。当映射一个文件或者设备时,它是该区域中被映射的第一页在文件中的位置

为什么在上述代码中会传递 vm_gpoff ?
vm_gpoff 是相对于文件头的一个偏移量,而pfn 需要的物理地址页帧号,不是一个绝对量么(至少不是相对于文件头的一个量)?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP