donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1326回复:6

一个LINUX内核数据结构变量的含义

楼主#
更多 发布于:2002-11-28 15:43
我在读LINUX内存管理源代码时,碰见一个表示一段虚拟地址区域的数据结构vm_area_struct。其定义为:
struct vm_area_struct {
struct mm_struct * vm_mm; /* VM area parameters */
unsigned long vm_start;
unsigned long vm_end;

/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;

pgprot_t vm_page_prot;
unsigned long vm_flags;

/* AVL tree of VM areas per task, sorted by address */
short vm_avl_height;
struct vm_area_struct * vm_avl_left;
struct vm_area_struct * vm_avl_right;

/* For areas with an address space and backing store,
* one of the address_space->i_mmap{,shared} lists,
* for shm areas, the list of attaches, otherwise unused.
*/
struct vm_area_struct *vm_next_share;
struct vm_area_struct **vm_pprev_share;

struct vm_operations_struct * vm_ops;
unsigned long vm_pgoff; /* offset in PAGE_SIZE units, *not* PAGE_CACHE_SIZE */
struct file * vm_file;
unsigned long vm_raend;
void * vm_private_data; /* was vm_pte (shared mem) */
};
请问有没有人愿意告诉我其中的变量unsigned long vm_pgoff所表示的具体含义?谢谢

unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-28 15:55
offset in PAGE_SIZE units, *not* PAGE_CACHE_SIZE

#define PAGE_SIZE (1UL << PAGE_SHIFT)
PAGE_SHIFT=12
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-28 17:47
UNIX1998:你写的我都能用SOURCE INSIDE查到,我不明白的是它的具体含义是什么?是不是该vm_area_struct的开始地址vm_start》PAGE_SIZE?还是有其它的具体含义?我在多个函数中看见对它的赋值,但我看不懂它的含义,一般的分析源代码的书上也是一略而过,但我觉的这个变量应该是挺重要的。你能不能给我祥细解释一下?谢谢
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-29 10:23
因为页大小为4k,所以必须是4k的整数倍。右移12位,保证最后12位是0.
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-29 16:57
UNIX1998,非常谢谢你的回答。我不懂的是PGOFF的具体的含义。例如vm_mm是该虚拟内存区域所属的虚存空间。vm_start是该虚存的起始地址(属于该区域)。vm_end是该虚存的终止地址(不属于该区域)。vm_next是下一个区域的指针。vm_page_prot、vm_flags是该区域的属性位图。vm_avl_height是AVL树的高度。vm_avl_left、vm_avl_right是左右子树指针等等。但我不懂PGOFF的具体含义是什么?它的值是不是就是vm_start》PAGE_SIZE?你能不能祥细的给我说一说?谢谢你
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-30 17:50
就是vm_start》PAGE_SIZE。
含义就是偏移啊。但是这个值是会变的。
你可以在源代码中理解它。
我不知道该怎么详细的给你说,我想是不是你考虑多了呢?
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-30 18:58
谢谢UNIX1998
游客

返回顶部