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的值??
内存映射搞了几天,头好晕~~ http://www.kerneltravel.net/journal/v/mem.htm
以上这篇文章讲得很不错,看完了,估计就能明白的差不多。 回复 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]