📄 009_mm_mlock_c.html
字号:
<html lang="zh-CN" xmlns:gdoc=""> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <style type="text/css">/* default css */table { font-size: 1em; line-height: inherit;}div, address, ol, ul, li, option, select { margin-top: 0px; margin-bottom: 0px;}p { margin: 0px;}body { margin: 0px; padding: 0px; font-family: Verdana, sans-serif; font-size: 10pt; background-color: #ffffff;}h6 { font-size: 10pt }h5 { font-size: 11pt }h4 { font-size: 12pt }h3 { font-size: 13pt }h2 { font-size: 14pt }h1 { font-size: 16pt }blockquote {padding: 10px; border: 1px #DDD dashed }a img {border: 0}div.google_header, div.google_footer { position: relative; margin-top: 1em; margin-bottom: 1em;}/* end default css */ /* default print css */ @media print { body { padding: 0; margin: 0; } div.google_header, div.google_footer { display: block; min-height: 0; border: none; } div.google_header { flow: static(header); } /* used to insert page numbers */ div.google_header::before, div.google_footer::before { position: absolute; top: 0; } div.google_footer { flow: static(footer); } /* always consider this element at the start of the doc */ div#google_footer { flow: static(footer, start); } span.google_pagenumber { content: counter(page); } span.google_pagecount { content: counter(pages); } } @page { @top { content: flow(header); } @bottom { content: flow(footer); } } /* end default print css */ /* custom css *//* end custom css */ /* ui edited css */ body { font-family: Verdana; font-size: 10.0pt; line-height: normal; background-color: #ffffff; } .documentBG { background-color: #ffffff; } /* end ui edited css */</style> </head> <body revision="dcbsxfpf_50smwzwpff:4"> <table align=center cellpadding=0 cellspacing=0 height=5716 width=768>
<tbody>
<tr>
<td height=5716 valign=top width=100%>
<pre>2007-12-23 <br>mm/mlock.c<br> 提供系统调用 sys_mlock,sys_munlock,sys_mlockall,sys_munlockall.<br>man mlock.c获取更多信息.<br> mlock提供一种让用户参与调整内核swap策略的一种方式.用户指定的地址范围<br>内核保证不交换到磁盘.<br> 入口函数sys_mlock,sys_munlock,sys_mlockall,sys_munlockall效验参数,对<br>齐开始地址然后转交下级函数.<br> 仅以sys_mlock为例,其余函数应该不在话下.<br> sys_mlock->do_mlock(start, len, 1);/*对于unlock只是第三个参数为0*/<br>static int do_mlock(unsigned long start, size_t len, int on)<br>{<br> unsigned long nstart, end, tmp;<br> struct vm_area_struct * vma, * next;<br> int error;<br><br> if (on && !capable(CAP_IPC_LOCK))<br> return -EPERM;<br> len = PAGE_ALIGN(len);<br> end = start + len;<br> if (end < start)<br> return -EINVAL;<br> if (end == start)<br> return 0;<br> /*寻找指定地址对应的vma*/<br> vma = find_vma(current->mm, start);/*只保证 start<vma->end*/<br> if (!vma || vma->vm_start > start)/*如果start<vm_start 说明vma不存在*/<br> return -ENOMEM;<br><br> for (nstart = start ; ; ) {/*遍历指定范围内的每一个vma*/<br> unsigned int newflags;<br><br> /* Here we know that vma->vm_start <= nstart < vma->vm_end. */<br><br> newflags = vma->vm_flags | VM_LOCKED;<br> if (!on)<br> newflags &= ~VM_LOCKED;<br><br> if (vma->vm_end >= end) {/*已经是最后一个vma了*/<br> /*mlock_fixup 能够处理各种fixup的情况*/<br> error = mlock_fixup(vma, nstart, end, newflags);<br> break;<br> }<br><br> tmp = vma->vm_end;<br> next = vma->vm_next;<br> /*mlock_fixup处理vma被分割的各种情况*/<br> error = mlock_fixup(vma, nstart, tmp, newflags);<br> if (error)<br> break;<br> nstart = tmp;<br> vma = next;<br> if (!vma || vma->vm_start != nstart) {<br> error = -ENOMEM;<br> break;<br> }<br> }<br> return error;<br>}<br>/*[start,end]在[vma_start,vma_end] 之间可以相等,不会超出此范围*/<br>static int mlock_fixup(struct vm_area_struct * vma, <br> unsigned long start, unsigned long end, unsigned int newflags)<br>{<br> int pages, retval;<br><br> if (newflags == vma->vm_flags)<br> return 0;<br><br> if (start == vma->vm_start) {/*起始地址于vma start*/<br> if (end == vma->vm_end)<br> retval = mlock_fixup_all(vma, newflags);<br> else<br> retval = mlock_fixup_start(vma, end, newflags);<br> } else {/*起始地址不等*/<br> if (end == vma->vm_end)<br> retval = mlock_fixup_end(vma, start, newflags);<br> else<br> retval = mlock_fixup_middle(vma, start, end, newflags);<br> }<br> if (!retval) {<br> /* keep track of amount of locked VM */<br> pages = (end - start) >> PAGE_SHIFT;<br> if (newflags & VM_LOCKED) {<br> pages = -pages;<br> /*锁定后调入指定范围内页面*/<br> make_pages_present(start, end);<br> }<br> vma->vm_mm->locked_vm -= pages;<br> }<br> return retval;<br>}<br> 具体的fixup函数这里不再列举了.<br></pre>
</td>
</tr>
</tbody>
</table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -