dong_j_t 发表于 2011-02-09 17:18

vm_area_struct 中的 pg_off 的值是怎么来的....

本帖最后由 dong_j_t 于 2011-02-09 21:57 编辑

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

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

dongjt@dongjt-desktop:~/Linux/linux-2.6.30$ sudo cat /proc/1/maps
password for dongjt:
b7e2e000-b7e2f000 rw-p 0000000000:000
b7e2f000-b7f8b000 r-xp0000000008:01434064   /lib/tls/i686/cmov/libc-2.9.so
b7f8b000-b7f8c000 ---p   0015c00008:01434064   /lib/tls/i686/cmov/libc-2.9.so
b7f8c000-b7f8e000 r--p   0015c00008:01434064   /lib/tls/i686/cmov/libc-2.9.so
b7f8e000-b7f8f000 rw-p0015e00008:01434064   /lib/tls/i686/cmov/libc-2.9.so
b7f8f000-b7f92000 rw-p0000000000:000
b7fa7000-b7fa9000 rw-p0000000000:000
b7fa9000-b7faa000 r-xp   0000000000:000               
b7faa000-b7fc6000 r-xp   0000000008:01422058   /lib/ld-2.9.so
b7fc6000-b7fc7000 r--p   0001b00008:01422058   /lib/ld-2.9.so
b7fc7000-b7fc8000 rw-p0001c00008:01422058   /lib/ld-2.9.so
b7fc8000-b7fe1000 r-xp   0000000008:0162284      /sbin/init
b7fe1000-b7fe2000 r--p    0001800008:0162284      /sbin/init
b7fe2000-b7fe3000 rw-p0001900008:0162284      /sbin/init
b9b46000-b9c94000 rw-p 00000000 00:000            
bf9e2000-bf9f7000 rw-p   0000000000:000            


每行都 是以以下形式表示:
start-endperm 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的值??

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

EZWORD 发表于 2011-02-10 19:19

http://www.kerneltravel.net/journal/v/mem.htm
以上这篇文章讲得很不错,看完了,估计就能明白的差不多。

dong_j_t 发表于 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 需要的物理地址页帧号,不是一个绝对量么(至少不是相对于文件头的一个量)?
页: [1]
查看完整版本: vm_area_struct 中的 pg_off 的值是怎么来的....