当前位置: 技术问答>linux和unix
vm_area_struct什么情况下存在被映射的文件?
来源: 互联网 发布时间:2015-11-13
本文导语: //addr是系统调用发生时pt_regs.eip,该地址应该是在代码段中。 if(struct vm_area_struct *block_area = find_vma(current->mm,addr)) { struct file *image; if(!(image = block_area->vm_file)) //但是image很多时候为空????为什么? { ...
//addr是系统调用发生时pt_regs.eip,该地址应该是在代码段中。
if(struct vm_area_struct *block_area = find_vma(current->mm,addr))
{
struct file *image;
if(!(image = block_area->vm_file)) //但是image很多时候为空????为什么?
{
printk("the block file doesn't existn");
return 1;
}
*block = image->f_dentry->d_inode->i_ino;
return 0;
}
if(struct vm_area_struct *block_area = find_vma(current->mm,addr))
{
struct file *image;
if(!(image = block_area->vm_file)) //但是image很多时候为空????为什么?
{
printk("the block file doesn't existn");
return 1;
}
*block = image->f_dentry->d_inode->i_ino;
return 0;
}
|
程序刚创建的时候用的是父进程的进程描述符mm_struct,而该进程描述符对应的所有内存区域描述符vm_area_struct也是父进程的。所以父进程已经映射了该文件,并且没有被守护进程kswapd回收(系统在一般情况下会每秒一次地调用该进程回收内存中比较老的页面),那么该子进程vm_area_struct存在被映射的文件。如果父进程没有映射该文件,那么子进程在读取vm_area_struct上的地址时发生缺页中断,进入中断处理程序。中断处理程序会通过do_page_fault()处理缺页,该函数会根据情况从高缓中读取要映射的文件或间接从磁盘上读取,并把该页映射到相应的进程虚存区域vm_area_struct,这时就存在被映射的文件了。被映射的文件会在高缓中和内存中存放一段时间,如果长时间没用到的话,就会被kswapd回收。
所以说,刚创建的空程序的vm_area_struct是不存在被映射的文件的。在程序刚刚访问了该地址的时候才存在映射的文件,而在一段时间没有访问了,就会被回收,进而也就不存在被映射的文件了。结论:在刚刚访问了vm_area_struct指定的地址,并在相当短的一段时间内再访问的时候,就存在被映射的文件了。
所以说,刚创建的空程序的vm_area_struct是不存在被映射的文件的。在程序刚刚访问了该地址的时候才存在映射的文件,而在一段时间没有访问了,就会被回收,进而也就不存在被映射的文件了。结论:在刚刚访问了vm_area_struct指定的地址,并在相当短的一段时间内再访问的时候,就存在被映射的文件了。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。