⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 009_mm_mlock_c.html

📁 重读linux 2.4.2o所写的笔记
💻 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-&gt;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 &amp;&amp; !capable(CAP_IPC_LOCK))<br>		return -EPERM;<br>	len = PAGE_ALIGN(len);<br>	end = start + len;<br>	if (end &lt; start)<br>		return -EINVAL;<br>	if (end == start)<br>		return 0;<br>	/*寻找指定地址对应的vma*/<br>	vma = find_vma(current-&gt;mm, start);/*只保证 start&lt;vma-&gt;end*/<br>	if (!vma || vma-&gt;vm_start &gt; start)/*如果start&lt;vm_start 说明vma不存在*/<br>		return -ENOMEM;<br><br>	for (nstart = start ; ; ) {/*遍历指定范围内的每一个vma*/<br>		unsigned int newflags;<br><br>		/* Here we know that  vma-&gt;vm_start &lt;= nstart &lt; vma-&gt;vm_end. */<br><br>		newflags = vma-&gt;vm_flags | VM_LOCKED;<br>		if (!on)<br>			newflags &amp;= ~VM_LOCKED;<br><br>		if (vma-&gt;vm_end &gt;= end) {/*已经是最后一个vma了*/<br>			        /*mlock_fixup 能够处理各种fixup的情况*/<br>			error = mlock_fixup(vma, nstart, end, newflags);<br>			break;<br>		}<br><br>		tmp = vma-&gt;vm_end;<br>		next = vma-&gt;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-&gt;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-&gt;vm_flags)<br>		return 0;<br><br>	if (start == vma-&gt;vm_start) {/*起始地址于vma start*/<br>		if (end == vma-&gt;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-&gt;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) &gt;&gt; PAGE_SHIFT;<br>		if (newflags &amp; VM_LOCKED) {<br>			pages = -pages;<br>			/*锁定后调入指定范围内页面*/<br>			make_pages_present(start, end);<br>		}<br>		vma-&gt;vm_mm-&gt;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 + -