免费注册 查看新帖 |

Chinaunix

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

009 mm/mlock.c [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-31 22:02 |只看该作者 |倒序浏览

   
   
   
       
       
               
               
2007-12-23   
mm/mlock.c
   提供系统调用 sys_mlock,sys_munlock,sys_mlockall,sys_munlockall.
man mlock.c获取更多信息.
   mlock提供一种让用户参与调整内核swap策略的一种方式.用户指定的地址范围
内核保证不交换到磁盘.
   入口函数sys_mlock,sys_munlock,sys_mlockall,sys_munlockall效验参数,对
齐开始地址然后转交下级函数.
   仅以sys_mlock为例,其余函数应该不在话下.
   sys_mlock->do_mlock(start, len, 1);/*对于unlock只是第三个参数为0*/
static int do_mlock(unsigned long start, size_t len, int on)
{
        unsigned long nstart, end, tmp;
        struct vm_area_struct * vma, * next;
        int error;
        if (on && !capable(CAP_IPC_LOCK))
                return -EPERM;
        len = PAGE_ALIGN(len);
        end = start + len;
        if (end mm, start);/*只保证 startend*/
        if (!vma || vma->vm_start > start)/*如果startvm_start vm_end. */
                newflags = vma->vm_flags | VM_LOCKED;
                if (!on)
                        newflags &= ~VM_LOCKED;
                if (vma->vm_end >= end) {/*已经是最后一个vma了*/
                                /*mlock_fixup 能够处理各种fixup的情况*/
                        error = mlock_fixup(vma, nstart, end, newflags);
                        break;
                }
                tmp = vma->vm_end;
                next = vma->vm_next;
                /*mlock_fixup处理vma被分割的各种情况*/
                error = mlock_fixup(vma, nstart, tmp, newflags);
                if (error)
                        break;
                nstart = tmp;
                vma = next;
                if (!vma || vma->vm_start != nstart) {
                        error = -ENOMEM;
                        break;
                }
        }
        return error;
}
/*[start,end]在[vma_start,vma_end] 之间可以相等,不会超出此范围*/
static int mlock_fixup(struct vm_area_struct * vma,
        unsigned long start, unsigned long end, unsigned int newflags)
{
        int pages, retval;
        if (newflags == vma->vm_flags)
                return 0;
        if (start == vma->vm_start) {/*起始地址于vma start*/
                if (end == vma->vm_end)
                        retval = mlock_fixup_all(vma, newflags);
                else
                        retval = mlock_fixup_start(vma, end, newflags);
        } else {/*起始地址不等*/
                if (end == vma->vm_end)
                        retval = mlock_fixup_end(vma, start, newflags);
                else
                        retval = mlock_fixup_middle(vma, start, end, newflags);
        }
        if (!retval) {
                /* keep track of amount of locked VM */
                pages = (end - start) >> PAGE_SHIFT;
                if (newflags & VM_LOCKED) {
                        pages = -pages;
                        /*锁定后调入指定范围内页面*/
                        make_pages_present(start, end);
                }
                vma->vm_mm->locked_vm -= pages;
        }
        return retval;
}
   具体的fixup函数这里不再列举了.
       
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/79526/showart_1356088.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP