tag:blogger.com,1999:blog-21414663252805393552024-02-07T04:55:43.027-08:00Linux Stuffhfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.comBlogger235125tag:blogger.com,1999:blog-2141466325280539355.post-29714935553675110632014-06-12T01:23:00.001-07:002014-06-16T18:07:58.391-07:00Understanding Garbage Collector in ART of Android<div class="WordSection1">
<div align="left" class="MsoNormal" style="text-align: left;">
<b><span style="font-family: 宋体;">大纲</span><span lang="EN-US"><o:p></o:p></span></b></div>
<ul>
<li><b>前言</b></li>
<li><b>Mark-Sweep Collector</b></li>
<ul>
<li>Mark Stage</li>
<li>Sweep Stage</li>
<li>Finish Stage</li>
</ul>
<li><b>Semi-Space Collector</b></li>
</ul>
<div align="left" class="MsoListParagraph" style="margin-left: 21pt; text-indent: -21pt;">
</div>
<div align="left" class="MsoNormal" style="text-align: left;">
<b><span style="font-family: 宋体;"><br /></span></b>
<b><span style="font-family: 宋体;"><br /></span></b>
<b><span style="font-family: 宋体;">前言</span></b></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">ART</span><span style="font-family: 宋体;">目前采取了垃圾追踪的回收策略,即若某个对象没有被引用,则被认为是可以回收的垃圾,释放垃圾占用的内存。</span><span lang="EN-US">ART</span><span style="font-family: 宋体;">实现了两种垃圾回收技术,一种是</span><span lang="EN-US">Mark-Sweep, </span><span style="font-family: 宋体;">另一种是</span><span lang="EN-US">Semi-Space.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">Mark-Sweep</span><span style="font-family: 宋体;">:它的大致思想是,将所有的对象在内存中的位置记录在位图</span><span lang="EN-US">A</span><span style="font-family: 宋体;">中。然后,从所有对象的根出发,扫描根对象的所有引用,扫描根对象的所有引用的引用,一层层逐级扫描,直到叶子节点的对象。在这个逐级扫描的过程中,将涉及到的对象的位置都记录在位图</span><span lang="EN-US">B</span><span style="font-family: 宋体;">中。扫描结束后,对比两张位图</span><span lang="EN-US">A</span><span style="font-family: 宋体;">和</span><span lang="EN-US">B</span><span style="font-family: 宋体;">:所有</span><span lang="EN-US">A</span><span style="font-family: 宋体;">中置位的位置,却没有</span><span lang="EN-US">B</span><span style="font-family: 宋体;">中被置位,被视为垃圾。并根据位图中的索引检索得到对象,然后释放该对象占用的内存。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">Semi-Space</span><span style="font-family: 宋体;">:</span> <span style="font-family: 宋体;">它的特色是,有两个</span><span lang="EN-US">space</span><span style="font-family: 宋体;">空间,其中一个备用。另一个被系统拿来分配对象。在做垃圾扫描的时候,将所有在空间</span><span lang="EN-US">A</span><span style="font-family: 宋体;">中被有效引用的对象移动到空间</span><span lang="EN-US">B</span><span style="font-family: 宋体;">中。那么在空间</span><span lang="EN-US">A</span><span style="font-family: 宋体;">中剩余的对象就是垃圾了,直接释放垃圾对象所在的整个空间就可以了。这个回收速度很快。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<b><span lang="EN-US">Mark-Sweep Collector<o:p></o:p></span></b></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">要了解</span><span lang="EN-US">Android</span><span style="font-family: 宋体;">的垃圾回收策略,需要首先弄清楚对于每一个</span><span lang="EN-US">Android</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">,有哪些</span><span lang="EN-US">Space.</span><span style="font-family: 宋体;">对于普通的</span><span lang="EN-US">Android VM</span><span style="font-family: 宋体;">进程来说,其</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">都是从</span><span lang="EN-US">Zygote</span><span style="font-family: 宋体;">继承过来。所以,每一个</span><span lang="EN-US">VM </span><span style="font-family: 宋体;">进程</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">的虚拟地址区间基本上都是一样的(区间的末端范围会有些不同)。对于一个普通的</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">的区间一般是这样划分的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1ZDkwbKyIy3CC0SwjRtEYI4dV3cKX7wc4zCO5rM0qHoPMhXwJbITymR2nbz1cK9tkrapcaJlgaDWZl9XzHu_6RCI6FcnQ-ZWM9UzuIQoSG55MwOmvE6ryNp68Z1lrKqE1hdJDfYhajxY/s1600/image002-730694.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1ZDkwbKyIy3CC0SwjRtEYI4dV3cKX7wc4zCO5rM0qHoPMhXwJbITymR2nbz1cK9tkrapcaJlgaDWZl9XzHu_6RCI6FcnQ-ZWM9UzuIQoSG55MwOmvE6ryNp68Z1lrKqE1hdJDfYhajxY/s320/image002-730694.png" id="BLOGGER_PHOTO_ID_6023955478771289810" /></a><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">1. Heap</span><span style="font-family: 宋体;">中的空间</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">Image Space</span><span style="font-family: 宋体;">的容量取决于</span><span lang="EN-US">boot.art</span><span style="font-family: 宋体;">和</span><span lang="EN-US">boot.oat</span><span style="font-family: 宋体;">的容量大小(具体可以到</span><span lang="EN-US">/data/dalvik-cache/</span><span style="font-family: 宋体;">下查看这两个文件的大小)。在</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">后面紧接着的就是</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">。顾名思义,由于</span><span lang="EN-US">Zygote</span><span style="font-family: 宋体;">是所有</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程的祖先,因此在普通的</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程孵化出之前,</span><span lang="EN-US">Zygote</span><span style="font-family: 宋体;">是需要一些</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的,这些</span><span lang="EN-US">object</span><span style="font-family: 宋体;">都被压缩放在</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">中(为什么是压缩,后面讲</span><span lang="EN-US">Semi-Space</span><span style="font-family: 宋体;">时会有涉及)。紧挨着</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">的是</span><span lang="EN-US">Main Space, Main Space</span><span style="font-family: 宋体;">的</span><span lang="EN-US">limit</span><span style="font-family: 宋体;">被设置为了</span><span lang="EN-US">176MB. </span><span style="font-family: 宋体;">其实从</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">的起始到</span><span lang="EN-US">Non Moving Space</span><span style="font-family: 宋体;">的结束位置是有</span><span lang="EN-US">512MB</span><span style="font-family: 宋体;">大小的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Mark-Sweep Collector</span><span style="font-family: 宋体;">只针对</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">、</span><span lang="EN-US">Main Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Non Moving Space</span><span style="font-family: 宋体;">做垃圾回收处理</span><span lang="EN-US">. Temp Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Bump pointer Space</span><span style="font-family: 宋体;">的垃圾回收归属于</span><span lang="EN-US">Semi-Space Collector</span><span style="font-family: 宋体;">来处理。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Mark-Sweep Collector</span><span style="font-family: 宋体;">根据轻重程度不同,可以分为三类:</span><span lang="EN-US">Sticky, Partial, Full. </span><span style="font-family: 宋体;">又根据做</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的过程中是否暂停所有的</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程分为</span><span lang="EN-US">ConCurrent</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Non-Concurrent. </span><span style="font-family: 宋体;">所以,</span><span lang="EN-US">ART</span><span style="font-family: 宋体;">系统一共定义了</span><span lang="EN-US">6</span><span style="font-family: 宋体;">中</span><span lang="EN-US">MS</span><span style="font-family: 宋体;">的垃圾回收器。即,</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">333 // Create our garbage collectors.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">334 for (size_t i = 0; i < 2; ++i) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">335 const bool concurrent = i != 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">336 garbage_collectors_.push_back(new collector::MarkSweep(this, concurrent));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">337 garbage_collectors_.push_back(new collector::PartialMarkSweep(this, concurrent));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">338 garbage_collectors_.push_back(new collector::StickyMarkSweep(this, concurrent));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">339 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">根据情况的不同,系统选择不同的垃圾回收器进行垃圾回收工作。当然,对系统的工作线程影响最小的应该是</span><span lang="EN-US">Concurrent Sticky Mark Sweep Collector</span><span style="font-family: 宋体;">了。影响最大的就是</span><span lang="EN-US">Full Mark Sweep Collector</span><span style="font-family: 宋体;">。而最复杂的属于</span><span lang="EN-US">Concurrent Mark Sweep Collector</span><span style="font-family: 宋体;">。如果理解了最繁琐的</span><span lang="EN-US">Concurrent Mark Sweep</span><span style="font-family: 宋体;">(下文成为</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">)算法,其他</span><span lang="EN-US">5</span><span style="font-family: 宋体;">中垃圾回收器的工作原理就也理解了。</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">工作从整体上可以划分两个大的阶段:</span><span lang="EN-US">Mark </span><span style="font-family: 宋体;">和</span><span lang="EN-US"> Sweep</span><span style="font-family: 宋体;">。</span> <span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span lang="EN-US">1</span></b><b><span style="font-family: 宋体;">)</span><span lang="EN-US"> Mark</span></b><b><span style="font-family: 宋体;">阶段</span></b><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">做标记工作,即从根对象出发,递归广度优先<b>标记</b>所有引用的对象。一个被引用的对象在标记的过程中,先被标记,然后放在栈中,等该对象的父对象全部被标记完成后,依次弹出栈中的每一个对象,并标记其引用,然后把其引用再丢到栈中</span><span lang="EN-US">…</span><span style="font-family: 宋体;">。在整个</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">的过程中,把处于不同状态的对象可以形象的用颜色:黑、灰、白来描述。未进行标记前,所有的对象都是<b>白色</b>的,那些进过栈并出栈的对象又被称之为被标记过的对象称之为<b>黑色</b>的,而在栈中的对象被称之为<b>灰色</b>的。当</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">阶段完成后,所有的对象要不是黑色的,要不是白色的。白色的就是可以被回收的垃圾了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Mark</span><span style="font-family: 宋体;">是从所有对象的根出发,这些根会有很多,最简单的根比如在当前函数栈里面的对象对其他对象的引用。由于是</span><span lang="EN-US">Concurrent</span><span style="font-family: 宋体;">,因此</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">的线程是和当前进程中的工作</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程</span><sup><span lang="EN-US">[1]</span></sup><span style="font-family: 宋体;">一起工作的,因此在</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">的过程中,</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程也会新分配对象或者修改对象的引用。因此,必须有一个阶段是需要</span><span lang="EN-US">Stop-The-World</span><span style="font-family: 宋体;">,暂停所有的</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程,以方便</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">进行</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">操作。如果整个</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">阶段都</span><span lang="EN-US">Stop-The-World</span><span style="font-family: 宋体;">,显然对</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">工作线程的影响太大了。</span><span lang="EN-US">ART</span><span style="font-family: 宋体;">的做法是,先</span><span lang="EN-US">Concurrent</span><span style="font-family: 宋体;">标记两遍,然后再</span><span lang="EN-US">Non-Concurrent</span><span style="font-family: 宋体;">标记一遍。两遍的原因是尽可能多的把需要标记的对象都在不暂停</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">的情况下标记了。具体的标记过程和代码罗列如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level2 lfo5; text-indent: -18.0pt;">
<b><span lang="EN-US"><span style="mso-list: Ignore;">1.1<span style="font: 7.0pt "Times New Roman";"> </span></span></span></b><b><span lang="EN-US">Initialize Phase<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">118 void MarkSweep::InitializePhase() {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> …<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 121 mark_stack_ = heap_->mark_stack_.get();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> …<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 123 immune_region_.Reset();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 140 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在初始预备阶段,为后面的</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">准备好</span><span lang="EN-US">mark_stack_</span><span style="font-family: 宋体;">和</span><span lang="EN-US">immune_region. <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.1 Mark_stack_</span><span style="font-family: 宋体;">是做什么呢?</span><span lang="EN-US">mark_stack_</span><span style="font-family: 宋体;">是一个</span><span lang="EN-US">FIFO</span><span style="font-family: 宋体;">的栈。由于标记是按照深度优先递归标记的,</span><span lang="EN-US">mark_stack_</span><span style="font-family: 宋体;">栈来进行配合进行深度递归。理论上,递归是不需要辅助栈的,利用函数本身的栈就可以实现深度递归。但是,采用了</span><span lang="EN-US">mark_stack_</span><span style="font-family: 宋体;">栈的好处是:</span><span lang="EN-US">1. </span><span style="font-family: 宋体;">可以并行多线程来做,当</span><span lang="EN-US">mark_stack_</span><span style="font-family: 宋体;">栈中数量达到一定数目的时候(</span><span lang="EN-US">128</span><span style="font-family: 宋体;">个)就可以用多线程,将栈进行分段,多个线程共同将栈中的数据递归标记。</span><span lang="EN-US">2. </span><span style="font-family: 宋体;">另外一个显而易见的好处是,可以避免函数栈的深度过深。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV6GFclU2xkbcxdi2X5Yb7Iz8EFac-x_1Htxa0NSE4QkoA0GnMq0gYqiOCMUf6p0RVw-MawAXLXC9aCrnVovGybmeE8z8M9jaouGXQn-RHeQI_5XjvV_mPz5UCO6f6hiebx5gCnUSEFx8/s1600/image001-733721.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV6GFclU2xkbcxdi2X5Yb7Iz8EFac-x_1Htxa0NSE4QkoA0GnMq0gYqiOCMUf6p0RVw-MawAXLXC9aCrnVovGybmeE8z8M9jaouGXQn-RHeQI_5XjvV_mPz5UCO6f6hiebx5gCnUSEFx8/s320/image001-733721.png" id="BLOGGER_PHOTO_ID_6023955487374199650" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">例如根据上图,假设在栈中存在</span><span lang="EN-US">B,C</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">a). </span><span style="font-family: 宋体;">弹出</span><span lang="EN-US">C</span><span style="font-family: 宋体;">,标记</span><span lang="EN-US">C</span><span style="font-family: 宋体;">的引用</span><span lang="EN-US">F</span><span style="font-family: 宋体;">并压入</span><span lang="EN-US">F</span><span style="font-family: 宋体;">,标记</span><span lang="EN-US">G</span><span style="font-family: 宋体;">压入</span><span lang="EN-US">G</span><span style="font-family: 宋体;">。然后弹出</span><span lang="EN-US">G<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">b). G</span><span style="font-family: 宋体;">没有其他的引用,弹出</span><span lang="EN-US">F</span><span style="font-family: 宋体;">,</span><span lang="EN-US">F</span><span style="font-family: 宋体;">没有其他的引用。弹出</span><span lang="EN-US">B<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">c). </span><span style="font-family: 宋体;">标记</span><span lang="EN-US">B</span><span style="font-family: 宋体;">的引用</span><span lang="EN-US">D</span><span style="font-family: 宋体;">,压入</span><span lang="EN-US">D. </span><span style="font-family: 宋体;">标记</span><span lang="EN-US">B</span><span style="font-family: 宋体;">的引用</span><span lang="EN-US">E</span><span style="font-family: 宋体;">,压入</span><span lang="EN-US">E</span><span style="font-family: 宋体;">。弹出</span><span lang="EN-US">E<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">d). E</span><span style="font-family: 宋体;">没有任何引用。弹出</span><span lang="EN-US">D</span><span style="font-family: 宋体;">,</span><span lang="EN-US">D</span><span style="font-family: 宋体;">没有任何引用。栈空。结束。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.2 immune_region</span><span style="font-family: 宋体;">是做什么的?</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在一个</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中有几个</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">区,这些</span><span lang="EN-US">space</span><span style="font-family: 宋体;">的用途是不一样的,比如</span><span lang="EN-US">Image Space, </span><span style="font-family: 宋体;">其中放的是</span><span lang="EN-US">boot.art</span><span style="font-family: 宋体;">和</span><span lang="EN-US">boot.oat</span><span style="font-family: 宋体;">的代码段数据段。对于</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">,其中的数据是不经常更改的,因此,</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">是不会完整地扫描该区域。还有</span><span lang="EN-US">Zygote Space, </span><span style="font-family: 宋体;">该区放的是</span><span lang="EN-US">Zygote</span><span style="font-family: 宋体;">在</span><span lang="EN-US">Fork</span><span style="font-family: 宋体;">该进程之前的</span><span lang="EN-US">Zygote</span><span style="font-family: 宋体;">内容,因此也是不经常改变的。根据当前系统的内存短缺情况,采取不同程度的</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">扫描策略,于是凡将某个</span><span lang="EN-US">space</span><span style="font-family: 宋体;">指定给</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">的,</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">便不会去扫描。可是,不扫描的话,如果该</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">中有</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的引用修改了,怎么办呢,比如</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">有个对象</span><span lang="EN-US">A</span><span style="font-family: 宋体;">本来引用了</span><span lang="EN-US">B</span><span style="font-family: 宋体;">,但后来更改,</span><span lang="EN-US">A</span><span style="font-family: 宋体;">引用</span><span lang="EN-US">C</span><span style="font-family: 宋体;">了,于是在</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的时候,需要把</span><span lang="EN-US">B</span><span style="font-family: 宋体;">当作垃圾,而</span><span lang="EN-US">C</span><span style="font-family: 宋体;">被</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">。这就需要额外的数据结构</span><span lang="EN-US">ModUnionTable</span><span style="font-family: 宋体;">以及</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.3 ModUnionTable</span><span style="font-family: 宋体;">与</span><span lang="EN-US">CardTable<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">ModUnionTable</span><span style="font-family: 宋体;">是需要和</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">配合使用的。</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">可以看作是一个数组,每一项被称作</span><span lang="EN-US">Card</span><span style="font-family: 宋体;">,占用一个字节的空间。代表</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中连续的</span><span lang="EN-US">128</span><span style="font-family: 宋体;">个字节的内存是否有更改。第</span><span lang="EN-US">0</span><span style="font-family: 宋体;">个字节(</span><span lang="EN-US">0</span><span style="font-family: 宋体;">号索引)对应</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">起始的</span><span lang="EN-US">128</span><span style="font-family: 宋体;">个字节,第</span><span lang="EN-US">1</span><span style="font-family: 宋体;">个字节(</span><span lang="EN-US">1</span><span style="font-family: 宋体;">号索引)对应</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中后续的</span><span lang="EN-US">128</span><span style="font-family: 宋体;">个字节,以此类推。因此</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">要覆盖这个</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">的所有连续</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">区间</span><span lang="EN-US">(</span><span style="font-family: 宋体;">包括</span><span lang="EN-US">Bumper Space)</span><span style="font-family: 宋体;">。</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">Card</span><span style="font-family: 宋体;">可以有</span><span lang="EN-US">3</span><span style="font-family: 宋体;">个值,分别是</span><span lang="EN-US">0, 0x70,0x6F. </span><span style="font-family: 宋体;">非</span><span lang="EN-US">0</span><span style="font-family: 宋体;">代表该项对应的</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中相应的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">有更改。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在做</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">时,凡是</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">中属于</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">0x70</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Card, </span><span style="font-family: 宋体;">被记录到</span><span lang="EN-US">ModUnionTable </span><span style="font-family: 宋体;">中有一个类似于</span><span lang="EN-US">set</span><span style="font-family: 宋体;">的</span><span lang="EN-US">c++</span><span style="font-family: 宋体;">数据结构中,同时将该</span><span lang="EN-US">Card</span><span style="font-family: 宋体;">的值减去</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,即</span><span lang="EN-US">0x6F</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.4 RememberedSet</span><span style="font-family: 宋体;">与</span><span lang="EN-US">CardTable<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">RememberedSet</span><span style="font-family: 宋体;">与</span><span lang="EN-US">ModUnionTable</span><span style="font-family: 宋体;">的作用是一样的,不同的是</span><span lang="EN-US">ModUnionTable</span><span style="font-family: 宋体;">记录</span><span lang="EN-US">Image Space, Zygote Space</span><span style="font-family: 宋体;">对其他</span><span lang="EN-US">space</span><span style="font-family: 宋体;">的引用的修改。而</span><span lang="EN-US">RememberedSet</span><span style="font-family: 宋体;">记录的是</span><span lang="EN-US">Non Moving Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Main Space</span><span style="font-family: 宋体;">对</span><span lang="EN-US">Semi Space</span><span style="font-family: 宋体;">引用的修改。RememberedSet虽然只在Semi-Space Collector中起作用,但在CMS的ProcessCards中也会对CardTable中属于Non Moving Space和Main Space的Dirty Card 在RememberedSet中做备份。</span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.5 Live_Bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Mark_Bitmap<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">如前所述,</span><span lang="EN-US">Mark Sweep</span><span style="font-family: 宋体;">垃圾回收策略采取的是标记跟踪法。</span><span lang="EN-US">Live_Bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Mark_Bitmap</span><span style="font-family: 宋体;">便是用来做标记的。他们都是位图的数据结构,每一位代表</span><span lang="EN-US">8</span><span style="font-family: 宋体;">个字节的空间。</span><span lang="EN-US">Live_Bitmap</span><span style="font-family: 宋体;">记录了当前存在于</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程中所有的未标记的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">和标记过的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">。</span><span lang="EN-US">Mark_Bitmap</span><span style="font-family: 宋体;">经过了</span><span lang="EN-US">Mark </span><span style="font-family: 宋体;">的过程,记录了当前</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程中所有被引用的</span><span lang="EN-US">object. Live_Bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Mark_Bitmap</span><span style="font-family: 宋体;">中间的差集,便是所有为被系统引用的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">,即是可以回收的垃圾了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.1.6 allocation_stack</span><span style="font-family: 宋体;">和</span><span lang="EN-US">live_stack<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">所有新分配的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">会被</span><span lang="EN-US">allocation_stack</span><span style="font-family: 宋体;">来记录,然后在</span><span lang="EN-US">Marking</span><span style="font-family: 宋体;">的时候,再在</span><span lang="EN-US">Live_Bitmap</span><span style="font-family: 宋体;">中打上</span><span lang="EN-US">live</span><span style="font-family: 宋体;">的标记。</span><span lang="EN-US">allocation_stack</span><span style="font-family: 宋体;">和</span><span lang="EN-US">live_stack</span><span style="font-family: 宋体;">其实是一个工作栈和备份栈。当在</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的时候,需要处理</span><span lang="EN-US">allocation_stack</span><span style="font-family: 宋体;">,那么会把两个</span><span lang="EN-US">stack</span><span style="font-family: 宋体;">互换。</span><span lang="EN-US">Mutator</span><span style="font-family: 宋体;">线程新分配的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">会压倒备份栈中(备份栈就当作新的工作栈了)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">1.1.7 Concurrent</span><br />
<span style="font-family: 宋体;">系统在什么情况下用</span><span lang="EN-US">concurrent</span><span style="font-family: 宋体;">,什么时候不用呢?</span><span style="font-family: 宋体;">系统定义了</span><span lang="EN-US">6</span><span style="font-family: 宋体;">中垃圾收集器,那么具体在做垃圾回收的时候,选择哪一种垃圾收集器呢?在系统初始化的时候,会定义一个</span><span lang="EN-US">collector_type_</span><span style="font-family: 宋体;">,一个</span><span lang="EN-US">collector_type_</span><span style="font-family: 宋体;">可以选择为:</span><span lang="EN-US">kCollectorTypeSS/kCollectorTypeGSS/kCollectorTypeMS/kCollectorTypeCMS. </span><span style="font-family: 宋体;">对于前三种,都是</span><span lang="EN-US">NonConcurrent</span><span style="font-family: 宋体;">的,只有后一种是</span><span lang="EN-US">Concurrent. </span><span style="font-family: 宋体;">目前系统默认选择的是最后一种</span><span lang="EN-US">kCollectorTypeCMS.</span><span style="font-family: 宋体;">于是在做垃圾回收的时候,根据</span><span lang="EN-US">sticky/partial/full</span><span style="font-family: 宋体;">,选择</span><span lang="EN-US">Concurrent</span><span style="font-family: 宋体;">的</span><span lang="EN-US">mark-sweep</span><span style="font-family: 宋体;">的垃圾收集器。</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span lang="EN-US">1.2 Marking Phase<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.1 </span><span style="font-family: 宋体;">在</span><span lang="EN-US">Marking</span><span style="font-family: 宋体;">阶段,如果是</span><span lang="EN-US">sticky/partial</span><span style="font-family: 宋体;">的</span><span lang="EN-US">CMS, </span><span style="font-family: 宋体;">会把</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">都加入到</span><span lang="EN-US">Immune_region</span><span style="font-family: 宋体;">中。并且,对于</span><span lang="EN-US">sticky</span><span style="font-family: 宋体;">的</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">,还会将</span><span lang="EN-US">Main Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Non moving Space</span><span style="font-family: 宋体;">的</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">绑定(绑定的意思是</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">指向同样的</span><span lang="EN-US">bitmap,</span><span style="font-family: 宋体;">这样做的目的是在</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">的时候直接把</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">都标记了,就不会对这两个</span><span lang="EN-US">space</span><span style="font-family: 宋体;">做垃圾回收处理了)。</span><span lang="EN-US">Sticky CMS</span><span style="font-family: 宋体;">是为了处理新分配出来的对象中的垃圾而不会处理其他</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">中的垃圾,因此采用了绑定的方法。而</span><span lang="EN-US">Partial Space</span><span style="font-family: 宋体;">把</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">放在</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">的原因是,</span><span lang="EN-US">Partial CMS</span><span style="font-family: 宋体;">不会把</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">完整得扫描一遍,只会扫描在</span><span lang="EN-US">card table</span><span style="font-family: 宋体;">上有修改的部分。对于</span><span lang="EN-US">Full CMS</span><span style="font-family: 宋体;">,只会把</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">加入到</span><span lang="EN-US">Immune_region</span><span style="font-family: 宋体;">中。可以看出无论是哪一种的</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">都会把</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">加入到</span><span lang="EN-US">Immune_region</span><span style="font-family: 宋体;">中,他们都不会完整的扫描</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">,因为</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">里面存放的是</span><span lang="EN-US">boot.art</span><span style="font-family: 宋体;">和</span><span lang="EN-US">boot.oat</span><span style="font-family: 宋体;">,</span><span lang="EN-US">VM</span><span style="font-family: 宋体;">进程对其更改的可能性比较小,完整地对这个</span><span lang="EN-US">60+MB</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">扫描一遍性价比太低了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.2 </span><span style="font-family: 宋体;">处理</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">。扫描</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">,凡是对应于</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Zygote Space</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">0x70(kCardDirty)</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Card</span><span style="font-family: 宋体;">都被插入到</span><span lang="EN-US">ModUnionTableCardCache</span><span style="font-family: 宋体;">中,并在</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">中对该</span><span lang="EN-US">Card</span><span style="font-family: 宋体;">进行</span><span lang="EN-US">Aged, Aged</span><span style="font-family: 宋体;">的做法就是其值为</span><span lang="EN-US">0x70</span><span style="font-family: 宋体;">的减去</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,非</span><span lang="EN-US">0x70</span><span style="font-family: 宋体;">且非</span><span lang="EN-US">0</span><span style="font-family: 宋体;">的设置为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">;凡是对应于</span><span lang="EN-US">Main Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Non Moving Space</span><span style="font-family: 宋体;">的更改的</span><span lang="EN-US">card</span><span style="font-family: 宋体;">,都存储在</span><span lang="EN-US">RememberedSet</span><span style="font-family: 宋体;">中。其他非</span><span lang="EN-US">Semi Space</span><span style="font-family: 宋体;">在</span><span lang="EN-US">CardTable</span><span style="font-family: 宋体;">中有对应的修改的</span><span lang="EN-US">Card, </span><span style="font-family: 宋体;">只进行</span><span lang="EN-US">Aged(</span><span style="font-family: 宋体;">好像没有其他的</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">了</span><span lang="EN-US" style="font-family: Wingdings;">L</span><span lang="EN-US">).<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2227 void Heap::ProcessCards(TimingLogger& timings, bool use_rem_sets) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2228 // Clear cards and keep track of cards cleared in the mod-union table.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2229 for (const auto& space : continuous_spaces_) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2230 accounting::ModUnionTable* table = FindModUnionTableFromSpace(space);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2231 accounting::RememberedSet* rem_set = FindRememberedSetFromSpace(space);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2232 if (table != nullptr) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2233 const char* name = space->IsZygoteSpace() ? "ZygoteModUnionClearCards" :<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2234 "ImageModUnionClearCards";<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2235 TimingLogger::ScopedSplit split(name, &timings);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2236 table->ClearCards();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2237 } else if (use_rem_sets && rem_set != nullptr) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2238 DCHECK(collector::SemiSpace::kUseRememberedSet && collector_type_ == kCollectorTypeGSS)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2239 << static_cast<int>(collector_type_);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2240 TimingLogger::ScopedSplit split("AllocSpaceRemSetClearCards", &timings);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2241 rem_set->ClearCards();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2242 } else if (space->GetType() != space::kSpaceTypeBumpPointerSpace) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2243 TimingLogger::ScopedSplit split("AllocSpaceClearCards", &timings);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2244 // No mod union table for the AllocSpace. Age the cards so that the GC knows that these cards<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2245 // were dirty before the GC started.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2246 // TODO: Need to use atomic for the case where aged(cleaning thread) -> dirty(other thread)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2247 // -> clean(cleaning thread).<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2248 // The races are we either end up with: Aged card, unaged card. Since we have the checkpoint<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2249 // roots and then we scan / update mod union tables after. We will always scan either card.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2250 // If we end up with the non aged card, we scan it it in the pause.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2251 card_table_->ModifyCardsAtomic(space->Begin(), space->End(), AgeCardVisitor(), VoidFunctor());<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2252 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2253 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2254 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在目前的</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">中,所有的</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">在</span><span lang="EN-US">2230</span><span style="font-family: 宋体;">~</span><span lang="EN-US">2242</span><span style="font-family: 宋体;">行都已经涉及到了,因此</span><span lang="EN-US">2251</span><span style="font-family: 宋体;">行似乎很多余。</span><span lang="EN-US">2232</span><span style="font-family: 宋体;">行处理的是</span><span lang="EN-US">Image Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Zygote Space,2237</span><span style="font-family: 宋体;">行处理的是</span><span lang="EN-US">Non Moving Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Main Space. </span><span style="font-family: 宋体;">而</span><span lang="EN-US">card table</span><span style="font-family: 宋体;">不包含</span><span lang="EN-US">Large Object Space.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.3 MarkRoots. </span><span style="font-family: 宋体;">从各个入口开始</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">操作(可以看作是每一个入口所引用的对象看作一棵树,这样在</span><span lang="EN-US">ART</span><span style="font-family: 宋体;">里面所有的对象组成了一个森林,那些没有挂载在根树上的对象都是被回收的对象)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.4 MarkReachableObjects. </span><span style="font-family: 宋体;">首先会更新</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">ModUnionTable</span><span style="font-family: 宋体;">中记录的</span><span lang="EN-US">dirty Card</span><span style="font-family: 宋体;">,对之进行</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">。并压入</span><span lang="EN-US">mark_stack</span><span style="font-family: 宋体;">栈中。然后进行</span><span lang="EN-US">RecursiveMark</span><span style="font-family: 宋体;">,即递归</span><span lang="EN-US">Mark.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">至此,所有在根对象的</span><span lang="EN-US">reference</span><span style="font-family: 宋体;">链上的对象都已经标记了,貌似已经可以进行</span><span lang="EN-US">Sweep</span><span style="font-family: 宋体;">。可是,不要忘了,之前标记是在</span><span lang="EN-US">ConCurrent</span><span style="font-family: 宋体;">的情况下,也就是说由于</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程仍然在同步地跑着,他们在</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">工作的时候仍然可以</span><span lang="EN-US">allocate</span><span style="font-family: 宋体;">新的对象,并修改已经</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">过的对象的引用。例如在之前</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">操作的时候</span><span lang="EN-US">A->B,</span><span style="font-family: 宋体;">将</span><span lang="EN-US">A</span><span style="font-family: 宋体;">以及</span><span lang="EN-US">B</span><span style="font-family: 宋体;">都已经</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">后,</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程新分配了对象</span><span lang="EN-US">C</span><span style="font-family: 宋体;">,并将</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的引用指向</span><span lang="EN-US">C</span><span style="font-family: 宋体;">,即</span><span lang="EN-US">A->C</span><span style="font-family: 宋体;">。如果对象</span><span lang="EN-US">C</span><span style="font-family: 宋体;">不再次被标记,当作垃圾的话,那么下次访问</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的引用的时候,就可能造成</span><span lang="EN-US">Segment Fault</span><span style="font-family: 宋体;">了。所以,需要在</span><span lang="EN-US">Suspend</span><span style="font-family: 宋体;">所有</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">的情况下再进行一遍</span><span lang="EN-US">Mark. </span><span style="font-family: 宋体;">可是,</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">的目的是尽可能的减少</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">线程</span><span lang="EN-US">pause</span><span style="font-family: 宋体;">的时间。于是</span><span lang="EN-US">CMS</span><span style="font-family: 宋体;">的策略是,再从头再来标记一遍。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.5 PreCleanCards. <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(1)</span><span style="font-family: 宋体;">首先会重复步骤</span><span lang="EN-US">1.2.2</span><span style="font-family: 宋体;">,不过这一次被操作的对象就是在</span><span lang="EN-US">1.2.2</span><span style="font-family: 宋体;">~</span><span lang="EN-US">1.2.4</span><span style="font-family: 宋体;">的过程中新产生的对象或者被修改的对象引用了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(2)</span><span style="font-family: 宋体;">从各个入口开始</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">操作,在操作的过程中对于遇到的没有在</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">上</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">过的,在</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">上做</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">标记。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(3)</span><span style="font-family: 宋体;">扫描</span><span lang="EN-US">card table</span><span style="font-family: 宋体;">中</span><span lang="EN-US">1.2.5</span><span style="font-family: 宋体;">刚开始时</span><span lang="EN-US">aged</span><span style="font-family: 宋体;">过的</span><span lang="EN-US">card</span><span style="font-family: 宋体;">以及在这个过程中</span><span lang="EN-US">dirty</span><span style="font-family: 宋体;">的</span><span lang="EN-US">card</span><span style="font-family: 宋体;">对应的对象都进行</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">操作(即在</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">上标记,同时丢到</span><span lang="EN-US">mark_stack</span><span style="font-family: 宋体;">中)(</span><span lang="EN-US">233</span><span style="font-family: 宋体;">行和</span><span lang="EN-US">922</span><span style="font-family: 宋体;">行)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(4)</span><span style="font-family: 宋体;">递归处理</span><span lang="EN-US">mark_stack</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">并递归处理</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的引用。(</span><span lang="EN-US">923</span><span style="font-family: 宋体;">行)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">233 RecursiveMarkDirtyObjects(false, accounting::CardTable::kCardDirty - 1);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">921 void MarkSweep::RecursiveMarkDirtyObjects(bool paused, byte minimum_age) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">922 ScanGrayObjects(paused, minimum_age);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">923 ProcessMarkStack(paused);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">924 }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.6 </span><span style="font-family: 宋体;">前面在</span><span lang="EN-US">ConCurrent</span><span style="font-family: 宋体;">的情况下,经过了两轮的扫描,基本上已经扫描的差不多了。但由于</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">是在一直运行的,不可避免地会修改我们之前已经</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">过的"地图"。因此,需要第三遍扫描,在</span><span lang="EN-US">Stop-The-World</span><span style="font-family: 宋体;">的情况下进行扫描。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">62 void PausePhase() EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">这次扫描的时候,除了</span><span lang="EN-US">remarkroot</span><span style="font-family: 宋体;">外,还需要扫描</span><span lang="EN-US">cardtable</span><span style="font-family: 宋体;">中</span><span lang="EN-US">Dirty Card</span><span style="font-family: 宋体;">的部分</span><span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">185 RecursiveMarkDirtyObjects(true, accounting::CardTable::kCardDirty);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1.2.7 </span><span style="font-family: 宋体;">经过了前面</span><span lang="EN-US">3</span><span style="font-family: 宋体;">次扫描以及</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">,我们的</span><span lang="EN-US">mark"</span><span style="font-family: 宋体;">地图</span><span lang="EN-US">"</span><span style="font-family: 宋体;">已经完备了。可是,我们需要注意,由于</span><span lang="EN-US">Sweep</span><span style="font-family: 宋体;">的操作是对应于</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">,在</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">中标记过,却在</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">中没有标记的视为垃圾。换句话说,</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">中标记的对象是</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">中标记对象的子集。但目前为止</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">标记的对象还不全,因为</span><span lang="EN-US">allocation_stack</span><span style="font-family: 宋体;">中的对象,我们还没有来得及在</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">中做</span><span lang="EN-US">mark. </span><span style="font-family: 宋体;">因此,</span><span lang="EN-US">allocation_stack</span><span style="font-family: 宋体;">先"搁置"起来不让后面的</span><span lang="EN-US">mutator</span><span style="font-family: 宋体;">使用,启用备份的的</span><span lang="EN-US">live_stack.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2185 void Heap::SwapStacks(Thread* self) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2186 if (kUseThreadLocalAllocationStack) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2187 live_stack_->AssertAllZero();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2188 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2189 allocation_stack_.swap(live_stack_);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2190 }<o:p></o:p></span></div>
<div class="MsoNormal">
<b><span lang="EN-US">2</span></b><b><span style="font-family: 宋体;">)</span><span lang="EN-US"> Sweep</span></b><b><span style="font-family: 宋体;">阶段</span><span lang="EN-US"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US">Sweep</span><span style="font-family: 宋体;">阶段就是把那些白色的对象所占用的内存回收掉。下面这个代码片段基本上就把</span><span lang="EN-US">Sweep</span><span style="font-family: 宋体;">的事情说清楚了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">155 for (size_t i = start; i <= end; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">156 word garbage = live[i] & ~mark[i];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">157 if (UNLIKELY(garbage != 0)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">158 uintptr_t ptr_base = IndexToOffset(i) + live_bitmap.heap_begin_;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">159 do {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">160 const size_t shift = CLZ(garbage);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">161 garbage ^= static_cast<size_t>(kWordHighBitMask) >> shift;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">162 *pb++ = reinterpret_cast<mirror::Object*>(ptr_base + shift * kAlignment);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">163 } while (garbage != 0);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">164 // Make sure that there are always enough slots available for an<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">165 // entire word of one bits.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">166 if (pb >= &pointer_buf[buffer_size - kBitsPerWord]) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">167 (*callback)(pb - &pointer_buf[0], &pointer_buf[0], arg);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">168 pb = &pointer_buf[0];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">169 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">170 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">171 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">156</span><span style="font-family: 宋体;">行把</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">中置位的,却没有在</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">中置位的对象当作垃圾。</span><span lang="EN-US">157</span><span style="font-family: 宋体;">~</span><span lang="EN-US">170</span><span style="font-family: 宋体;">行就是把垃圾占用的空间给释放掉。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span lang="EN-US">3</span></b><b><span style="font-family: 宋体;">)</span> <span lang="EN-US">Finish </span></b><b><span style="font-family: 宋体;">阶段</span><span lang="EN-US"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在</span><span lang="EN-US">1.2.1</span><span style="font-family: 宋体;">的时候,说过,有些情况下会</span><span lang="EN-US">bind mark_bitmap to live_bitmap</span><span style="font-family: 宋体;">,这样不会回收某个</span><span lang="EN-US">space</span><span style="font-family: 宋体;">的垃圾。因此在这个阶段需要</span><span lang="EN-US">unbind</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1541 void Heap::UnBindBitmaps() {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1542 for (const auto& space : GetContinuousSpaces()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1543 if (space->IsContinuousMemMapAllocSpace()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1544 space::ContinuousMemMapAllocSpace* alloc_space = space->AsContinuousMemMapAllocSpace();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1545 if (alloc_space->HasBoundBitmaps()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1546 alloc_space->UnBindBitmaps();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1547 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1548 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1549 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1550 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">另外,之前说过</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">是</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">的一个子集,</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">中包含了所有的存活的非垃圾对象,因此交换</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">和</span><span lang="EN-US">live_bitmap</span><span style="font-family: 宋体;">的指针,使</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">作为下一次</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的</span><span lang="EN-US">live_bitmap. </span><span style="font-family: 宋体;">同时</span><span lang="EN-US">reset </span><span style="font-family: 宋体;">新的</span><span lang="EN-US">mark_bitmap</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">300 SwapBitmaps();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2789 void Heap::ClearMarkedObjects() {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2790 // Clear all of the spaces' mark bitmaps.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2791 for (const auto& space : GetContinuousSpaces()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2792 accounting::ContinuousSpaceBitmap* mark_bitmap = space->GetMarkBitmap();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2793 if (space->GetLiveBitmap() != mark_bitmap) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2794 mark_bitmap->Clear();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2795 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2796 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2797 // Clear the marked objects in the discontinous space object sets.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2798 for (const auto& space : GetDiscontinuousSpaces()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2799 space->GetMarkBitmap()->Clear();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2800 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2801 } <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">由于</span><span lang="EN-US">mark_stack</span><span style="font-family: 宋体;">的目的是为了</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">,所以在</span><span lang="EN-US">Finish</span><span style="font-family: 宋体;">阶段,也需要把</span><span lang="EN-US">mark_stack</span><span style="font-family: 宋体;">给清掉。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1292 mark_stack_->Reset();<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span lang="EN-US">Semi-Space Collector<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Semi-Space Collector </span><span style="font-family: 宋体;">在做垃圾回收的步骤和</span><span lang="EN-US">Mark Sweep</span><span style="font-family: 宋体;">是相同的。不过</span><span lang="EN-US">Semi-Space </span><span style="font-family: 宋体;">是在</span><span lang="EN-US">NonConcurrent</span><span style="font-family: 宋体;">的情况下对</span><span lang="EN-US">Heap</span><span style="font-family: 宋体;">进行垃圾回收的。这样看起来好像简单了很多</span><span lang="EN-US" style="font-family: Wingdings;">J</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Semi-Space Collector</span><span style="font-family: 宋体;">(下文的</span><span lang="EN-US">SS</span><span style="font-family: 宋体;">是其简称)在</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">之前,会指定一个</span><span lang="EN-US">From_Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">To_Space. </span><span style="font-family: 宋体;">以及一个</span><span lang="EN-US">promoted_space. </span><span style="font-family: 宋体;">凡是在</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">的过程中位于</span><span lang="EN-US">From_Space</span><span style="font-family: 宋体;">的对象就会被</span><span lang="EN-US">move</span><span style="font-family: 宋体;">到</span><span lang="EN-US">To_Space</span><span style="font-family: 宋体;">中。当</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">结束后,</span><span lang="EN-US">From_Space</span><span style="font-family: 宋体;">留下来的全是需要清除的垃圾,而</span><span lang="EN-US">To_Space</span><span style="font-family: 宋体;">就是</span><span lang="EN-US">mark</span><span style="font-family: 宋体;">后存活的对象,并且这些对象都紧凑排列,达到了"压缩"的效果。为了达到</span><span lang="EN-US">generation promotion</span><span style="font-family: 宋体;">的效果,在一次</span><span lang="EN-US">Mark</span><span style="font-family: 宋体;">结束后,</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">的最后一个对象的边界记录为</span><span lang="EN-US">last_gc_end. </span><span style="font-family: 宋体;">然后</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">from_space</span><span style="font-family: 宋体;">交换指针,之前的</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">就作为</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">之后的</span><span lang="EN-US">From_space</span><span style="font-family: 宋体;">使用,即新的在</span><span lang="EN-US">Bumper Space</span><span style="font-family: 宋体;">对象都会在心的</span><span lang="EN-US">From_space</span><span style="font-family: 宋体;">中分配,并且分配的位置会在</span><span lang="EN-US">last_gc_end</span><span style="font-family: 宋体;">之后。等到下一次</span><span lang="EN-US">Semi-Space Collector</span><span style="font-family: 宋体;">来临后,凡是在</span><span lang="EN-US">From_Space</span><span style="font-family: 宋体;">中</span><span lang="EN-US">last_gc_end</span><span style="font-family: 宋体;">位置之前存活下来的对象就不再</span><span lang="EN-US">move</span><span style="font-family: 宋体;">到</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">了,而是</span><span lang="EN-US">move</span><span style="font-family: 宋体;">到</span><span lang="EN-US">promoted_space</span><span style="font-family: 宋体;">了,一般</span><span lang="EN-US">promoted_space</span><span style="font-family: 宋体;">会指定为</span><span lang="EN-US">main_space. </span><span style="font-family: 宋体;">这就是</span><span lang="EN-US">SS</span><span style="font-family: 宋体;">的</span><span lang="EN-US">promotion generation</span><span style="font-family: 宋体;">的概念。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">当位于</span><span lang="EN-US">from_space</span><span style="font-family: 宋体;">的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">被</span><span lang="EN-US">move</span><span style="font-family: 宋体;">到</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">promo_dest_space</span><span style="font-family: 宋体;">的时候,老的</span><span lang="EN-US">object->monitor</span><span style="font-family: 宋体;">会告诉其他引用的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">,新的位置。这样就可以便于更新了。比如:对象</span><span lang="EN-US">A</span><span style="font-family: 宋体;">和</span><span lang="EN-US">C</span><span style="font-family: 宋体;">都引用了对象</span><span lang="EN-US">B</span><span style="font-family: 宋体;">,</span><span lang="EN-US">A->B C->B. </span><span style="font-family: 宋体;">如果在</span><span lang="EN-US">A</span><span style="font-family: 宋体;">引用</span><span lang="EN-US">B</span><span style="font-family: 宋体;">的时候扫描后把</span><span lang="EN-US">B</span><span style="font-family: 宋体;">搬移到了</span><span lang="EN-US">to_space</span><span style="font-family: 宋体;">中新的位置,那么更新</span><span lang="EN-US">A->B', </span><span style="font-family: 宋体;">同时</span><span lang="EN-US">B->Monitor = 11|B'</span><span style="font-family: 宋体;">的地址。这样当</span><span lang="EN-US">C</span><span style="font-family: 宋体;">在</span><span lang="EN-US">Marking</span><span style="font-family: 宋体;">其引用的时候,发现</span><span lang="EN-US">B</span><span style="font-family: 宋体;">的</span><span lang="EN-US">monitor</span><span style="font-family: 宋体;">的高两位是</span><span lang="EN-US">11</span><span style="font-family: 宋体;">了,就知道</span><span lang="EN-US">B</span><span style="font-family: 宋体;">已经被移到新的位置了,只需要改变其引用就好了</span><span lang="EN-US">C->B'.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">正如前言所述,</span><span lang="EN-US">Semi-Space Collector</span><span style="font-family: 宋体;">会根据情况不同来做</span><span lang="EN-US">GSS</span><span style="font-family: 宋体;">还是</span><span lang="EN-US">whole heap collection</span><span style="font-family: 宋体;">的</span><span lang="EN-US">SS</span><span style="font-family: 宋体;">。</span><span lang="EN-US">GSS</span><span style="font-family: 宋体;">只会对</span><span lang="EN-US">Bump Pointer Space</span><span style="font-family: 宋体;">采用</span><span lang="EN-US">Semi-Space Collector</span><span style="font-family: 宋体;">的方法进行垃圾回收。而</span><span lang="EN-US">whole heap collection</span><span style="font-family: 宋体;">的方法除了</span><span lang="EN-US">Bump pointer Space</span><span style="font-family: 宋体;">外,还会扫描</span><span lang="EN-US">main space, non moving Space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Large Object Space.</span><span style="font-family: 宋体;">(见下面的代码片段,重点是</span><span lang="EN-US">85</span><span style="font-family: 宋体;">~</span><span lang="EN-US">88</span><span style="font-family: 宋体;">行以及</span><span lang="EN-US">92</span><span style="font-family: 宋体;">~</span><span lang="EN-US">95</span><span style="font-family: 宋体;">行)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">71 void SemiSpace::BindBitmaps() {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 72 timings_.StartSplit("BindBitmaps");<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 73 WriterMutexLock mu(self_, *Locks::heap_bitmap_lock_);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 74 // Mark all of the spaces we never collect as immune.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 75 for (const auto& space : GetHeap()->GetContinuousSpaces()) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 76 if (space->GetLiveBitmap() != nullptr) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 77 if (space == to_space_) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 78 CHECK(to_space_->IsContinuousMemMapAllocSpace());<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 79 to_space_->AsContinuousMemMapAllocSpace()->BindLiveToMarkBitmap();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 80 } else if (space->GetGcRetentionPolicy() == space::kGcRetentionPolicyNeverCollect<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 81 || space->GetGcRetentionPolicy() == space::kGcRetentionPolicyFullCollect<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 82 // Add the main free list space and the non-moving<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 83 // space to the immune space if a bump pointer space<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 84 // only collection.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 85 || (generational_ && !whole_heap_collection_ &&<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 86 (space == GetHeap()->GetNonMovingSpace() ||<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 87 space == GetHeap()->GetPrimaryFreeListSpace()))) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 88 CHECK(immune_region_.AddContinuousSpace(space)) << "Failed to add space " << *space;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 89 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 90 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 91 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 92 if (generational_ && !whole_heap_collection_) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 93 // We won't collect the large object space if a bump pointer space only collection.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 94 is_large_object_space_immune_ = true;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 95 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 96 timings_.EndSplit();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 97 } <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">从</span><span lang="EN-US">85</span><span style="font-family: 宋体;">~</span><span lang="EN-US">88</span><span style="font-family: 宋体;">行,可见,若</span><span lang="EN-US">generational_</span><span style="font-family: 宋体;">为</span><span lang="EN-US">true, </span><span style="font-family: 宋体;">且</span><span lang="EN-US">whole_heap_collection_</span><span style="font-family: 宋体;">为</span><span lang="EN-US">false</span><span style="font-family: 宋体;">的情况下,会把</span><span lang="EN-US">non moving space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">main space</span><span style="font-family: 宋体;">都会加入到</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">中。而若</span><span lang="EN-US">whole_heap_collection</span><span style="font-family: 宋体;">为</span><span lang="EN-US">true</span><span style="font-family: 宋体;">,则</span><span lang="EN-US">non moving space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">main space</span><span style="font-family: 宋体;">不会加入到</span><span lang="EN-US">immune_region</span><span style="font-family: 宋体;">中,并且也会扫描</span><span lang="EN-US">lage object space</span><span style="font-family: 宋体;">(</span><span lang="EN-US">94</span><span style="font-family: 宋体;">行)。</span><span lang="EN-US">Whole_heap_collection</span><span style="font-family: 宋体;">除了对</span><span lang="EN-US">bumper pointer space</span><span style="font-family: 宋体;">做</span><span lang="EN-US">SS</span><span style="font-family: 宋体;">之外,还会对</span><span lang="EN-US">non moving space</span><span style="font-family: 宋体;">和</span><span lang="EN-US">main space</span><span style="font-family: 宋体;">做</span><span lang="EN-US">mark sweep garbage collector.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">那么什么时候需要</span><span lang="EN-US">Whole heap collection</span><span style="font-family: 宋体;">呢,</span><span lang="EN-US">SemiSpace</span><span style="font-family: 宋体;">刚开始的时候是每</span><span lang="EN-US">5</span><span style="font-family: 宋体;">次</span><span lang="EN-US">Generational Semi-Space Collector,</span><span style="font-family: 宋体;">做一次</span><span lang="EN-US">Whole heap collection</span><span style="font-family: 宋体;">。后来优化的措施是,被</span><span lang="EN-US">promoted</span><span style="font-family: 宋体;">的</span><span lang="EN-US">object</span><span style="font-family: 宋体;">数量达到一定阈值后,进行一次</span><span lang="EN-US">Whole heap collection. </span><span style="font-family: 宋体;">或者从上一次</span><span lang="EN-US">whole heap collection </span><span style="font-family: 宋体;">至今分配的</span><span lang="EN-US">Large Object bytes</span><span style="font-family: 宋体;">超过了阈值</span><span lang="EN-US">16MB</span><span style="font-family: 宋体;">(</span><span lang="EN-US">kLargeObjectBytesAllocatedThreshold</span><span style="font-family: 宋体;">)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-family: 宋体;">注:</span><span lang="EN-US"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US">[1].</span></b><span lang="EN-US"> http://www.ibm.com/developerworks/library/j-ibmjava2/<b><o:p></o:p></b></span></div>
<div class="MsoNormal">
<b><span style="font-family: 宋体;">参考</span><span lang="EN-US"><o:p></o:p></span></b></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo4; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US"><a href="https://android.googlesource.com/">https://android.googlesource.com/</a><o:p></o:p></span></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-20180423583355506972014-04-15T01:43:00.001-07:002014-04-15T01:58:59.448-07:00Understanding ROS Memory Allocator in ART Virtual Machine<div class="WordSection1">
<div class="MsoNormal">
<span lang="EN-US">Agenda<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Run</span><span style="font-family: 宋体;">基本结构</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">主要算法</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l3 level2 lfo2; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">a)<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Allocate<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l3 level2 lfo2; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">b)<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Free<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><o:p>正文</o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><o:p><br /></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">ROS memory allocator </span><span style="font-family: 宋体;">是</span><span lang="EN-US">Android ART virtual machine </span><span style="font-family: 宋体;">中</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">的一个内存分配器。</span> <span lang="EN-US">ROS </span><span style="font-family: 宋体;">是</span><span lang="EN-US">Run-of-Slots</span><span style="font-family: 宋体;">的缩写。</span> <span style="font-family: 宋体;">在</span><span lang="EN-US">ROS allocator</span><span style="font-family: 宋体;">中,分配的都是虚拟地址区间(具体的物理内存什么时候分配是由</span><span lang="EN-US">kernel</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">来负责的)。</span><span lang="EN-US">ROS allocator</span><span style="font-family: 宋体;">的基本分配单元是</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">。</span><span lang="EN-US">slot大小</span><span style="font-family: 宋体;">从</span><span lang="EN-US">16Bytes</span><span style="font-family: 宋体;">到</span><span lang="EN-US">2048Bytes</span><span style="font-family: 宋体;">,分别是</span><span lang="EN-US">16,32,48,… n*16,512,1024,2048. </span><span style="font-family: 宋体;">不同大小的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">对应不同种类的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">,换句话说,一种</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">提供大小相同的</span><span lang="EN-US">slot. </span><span style="font-family: 宋体;">一共有</span><span lang="EN-US">34</span><span style="font-family: 宋体;">种</span><span lang="EN-US">Run.<o:p></o:p></span><br />
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">一</span><span lang="EN-US">, Run</span><span style="font-family: 宋体;">的基本结构</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">一个</span><span lang="EN-US">Run,</span><span style="font-family: 宋体;">可以分为两大部分,分别是</span><span lang="EN-US">Run header</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Data Area</span><span style="font-family: 宋体;">。如下所示:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHLQG8qtdlFnKAQxDewJRhFH3rVZSunHv3eNaQNhlQrRaLtRq1tmTpyqbVHnVDTQpSGpKonlNQSLnHq7LWCd3cUejeu6nxFTJollZ5K2TJkkxS1nl3-3fKEWC2UKvG2MHD1BRwYwr5AU/s1600/image001-702706.gif"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHLQG8qtdlFnKAQxDewJRhFH3rVZSunHv3eNaQNhlQrRaLtRq1tmTpyqbVHnVDTQpSGpKonlNQSLnHq7LWCd3cUejeu6nxFTJollZ5K2TJkkxS1nl3-3fKEWC2UKvG2MHD1BRwYwr5AU/s320/image001-702706.gif" id="BLOGGER_PHOTO_ID_6002437571407426658" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">Run header</span><span style="font-family: 宋体;">里面包含了</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Magic number: Debug</span><span style="font-family: 宋体;">相关</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Size_bracket_idx_: </span><span style="font-family: 宋体;">表示了该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的</span><span lang="EN-US">size</span><span style="font-family: 宋体;">是多大。比如</span><span lang="EN-US">Size_bracket_idx_</span><span style="font-family: 宋体;">是</span><span lang="EN-US">10</span><span style="font-family: 宋体;">,那么该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的</span><span lang="EN-US">size</span><span style="font-family: 宋体;">是(</span><span lang="EN-US">10+1</span><span style="font-family: 宋体;">)</span><span lang="EN-US">*16=176 Bytes.<o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Is_thread_local:</span><span style="font-family: 宋体;">表示了该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是否是</span><span lang="EN-US">Thread local area. ROS allocator</span><span style="font-family: 宋体;">规定每个线程都会持有一组</span><span lang="EN-US">Thread local Run</span><span style="font-family: 宋体;">,该组</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">的</span><span lang="EN-US">slot size</span><span style="font-family: 宋体;">最大为</span><span lang="EN-US">176Bytes. </span><span style="font-family: 宋体;">即,如果某个线程需要分配一个</span><span lang="EN-US">space</span><span style="font-family: 宋体;">,若该</span><span lang="EN-US">space</span><span style="font-family: 宋体;">不大于</span><span lang="EN-US">176Bytes</span><span style="font-family: 宋体;">,那么就从该线程的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中获得虚拟内存,而不会从</span><span lang="EN-US">ART runtime</span><span style="font-family: 宋体;">中获取。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">to_be_bulk_freed_: </span><span style="font-family: 宋体;">该字段是一个</span><span lang="EN-US">flag</span><span style="font-family: 宋体;">,用来辅助处理一次释放多个对象的情况。若该标志置位,说明该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">有多个</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">正在被释放。若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的,那么</span><span lang="EN-US">bulk_free_bitmap</span><span style="font-family: 宋体;">的置位信息将会更新到</span><span lang="EN-US">thread_local_free_bitmap</span><span style="font-family: 宋体;">中。</span><span lang="EN-US">thread_local_free_bitmap_</span><span style="font-family: 宋体;">的信息会在分配</span><span lang="EN-US">thread local slot</span><span style="font-family: 宋体;">的时候存在失败的情况下,会更新</span><span lang="EN-US">thread_local_free_bitmap_</span><span style="font-family: 宋体;">中的信息到</span><span lang="EN-US">alloc_bitmap_</span><span style="font-family: 宋体;">中。若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">不是</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的,那么在</span><span lang="EN-US">bulk free</span><span style="font-family: 宋体;">的时候,会同步到</span><span lang="EN-US">alloc_bit_map_</span><span style="font-family: 宋体;">字段中。</span><span lang="EN-US">alloc_bit_map_</span><span style="font-family: 宋体;">是用来在分配</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的时候指示哪些</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">已经被分配出去了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">top_slot_idx_: </span><span style="font-family: 宋体;">一个</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">在分配</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的时候,</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">在</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Data Area</span><span style="font-family: 宋体;">中的分配顺序是从小到大的。因此该字段表示当前</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">分配到哪里了。若需要分配新的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">,只需要在该字段的基础上</span><span lang="EN-US">+1</span><span style="font-family: 宋体;">就可以了。可是,在</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">分配</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的时候,也会有某些被分配过的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">又被释放的情形。因此若</span><span lang="EN-US">top_slot_idx_</span><span style="font-family: 宋体;">到头的情况下,会根据</span><span lang="EN-US">alloc_bit_map_</span><span style="font-family: 宋体;">看一下该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中是否还有空闲的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">可供分配。若有,那么就分配出去。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">alloc_bit_map_[]: </span><span style="font-family: 宋体;">该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中的每一个</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">在该字段代表一位。若为</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,说明</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">被分配出去了。若为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">,说明该</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">还是空闲的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">bulk_free_bit_map_[]: </span><span style="font-family: 宋体;">每一个</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">在该字段中代表</span><span lang="EN-US">1</span><span style="font-family: 宋体;">位。若</span><span lang="EN-US">free</span><span style="font-family: 宋体;">,置</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,该字段会在适当的时候,更新到</span><span lang="EN-US">thread_local_free_bit_map_[]</span><span style="font-family: 宋体;">然后在适当的时候更新到</span><span lang="EN-US">alloc_bit_map[]</span><span style="font-family: 宋体;">或者直接更新到</span><span lang="EN-US">alloc_bit_map_[]</span><span style="font-family: 宋体;">,前者对应于该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是</span><span lang="EN-US">thread_local</span><span style="font-family: 宋体;">的情况,后者对应于该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是非</span><span lang="EN-US">thread_local</span><span style="font-family: 宋体;">的情况。至于为什么要有这个</span><span lang="EN-US">bulk_free_bit_map_[]</span><span style="font-family: 宋体;">字段,是为了性能的考虑,可以减少锁冲突。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">thread_local_free_bit_map_[]: </span><span style="font-family: 宋体;">若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的,那么该字段会在</span><span lang="EN-US">slot free</span><span style="font-family: 宋体;">的时候置</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,当在适当的时候会更新到</span><span lang="EN-US">alloc_bit_map_[]</span><span style="font-family: 宋体;">字段中(具体的时机见前面</span><span lang="EN-US">to_be_bulk_freed_</span><span style="font-family: 宋体;">的说明)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 21.0pt; mso-list: l2 level1 lfo4; text-align: left; text-indent: -21.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">∙<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">padding </span><span style="font-family: 宋体;">是为了对齐的需要。由于每种</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">占用的空间不同(占用的空间包含</span><span lang="EN-US">Run header</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Data Area</span><span style="font-family: 宋体;">),</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的大小,</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的数量都不同,因此三个</span><span lang="EN-US">bitmap(alloc_bit_map_[],bulk_free_bit_map_[],thread_local_free_bit_map_[])</span><span style="font-family: 宋体;">所占用的空间大小也不同。而</span><span lang="EN-US">last slot</span><span style="font-family: 宋体;">是需要页对其的,因此</span><span lang="EN-US">Data area</span><span style="font-family: 宋体;">部分是需要</span><span lang="EN-US">n*slot_size</span><span style="font-family: 宋体;">页对其,所以这个</span><span lang="EN-US">padding</span><span style="font-family: 宋体;">的空间大小也是每种</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">都是不一样的。</span><br />
<span style="font-family: 宋体;"><br /></span>
<span lang="EN-US" style="text-indent: -21pt;">slot0,slot 1,…,last slot</span><span style="font-family: 宋体; text-indent: -21pt;">,是真正的数据区。若没有被分配出去,就是空闲的,若分配出去了,就是已经被使用了。</span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">二,主要算法</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo6; text-align: left; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">分配</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">当系统向</span><span lang="EN-US">garbage collection</span><span style="font-family: 宋体;">请求为一个</span><span lang="EN-US">object</span><span style="font-family: 宋体;">分配空间的时候,首先计算该</span><span lang="EN-US">object</span><span style="font-family: 宋体;">所占用的空间大小</span><span lang="EN-US">request_size, </span><span style="font-family: 宋体;">若</span><span lang="EN-US">request_size</span><span style="font-family: 宋体;">大于</span><span lang="EN-US">2048Bytes</span><span style="font-family: 宋体;">,则直接申请页。否则,根据</span><span lang="EN-US">request_size</span><span style="font-family: 宋体;">,查找对应的</span><span lang="EN-US">Run. </span><span style="font-family: 宋体;">系统正在被分配的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">都组织为数组,这些</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">数组分为两类,一类是用于分配大于</span><span lang="EN-US">176Bytes</span><span style="font-family: 宋体;">的数据块的,另一类是用于分配小于</span><span lang="EN-US">176Bytes</span><span style="font-family: 宋体;">的数据块,这类是</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的。如开头所述,每一</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">大小的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">对应于一个索引,</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">大小为</span><span lang="EN-US">16</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">对应数组中的第</span><span lang="EN-US">0</span><span style="font-family: 宋体;">个,数组第</span><span lang="EN-US">n</span><span style="font-family: 宋体;">个对应于</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">大小为</span><span lang="EN-US">(n+1)*16</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Run. </span><span style="font-family: 宋体;">找到</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">后,</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l4 level1 lfo9; text-align: left; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">(1)<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">为空,表示,该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">还没有向系统申请空间。不过这种情况下并不会立即向系统申请空间,而是会查一下,是否有该种类的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">之前已经全部被分配出去后,又因为有些</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">被释放,而又可以被复用的情况。如果有,就用可以复用的</span><span lang="EN-US">Run. </span><span style="font-family: 宋体;">否则,就像系统申请若干虚拟页,每一类的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">在一次填充的时候,需要的页数都是不一样的,具体的页数存放在</span><span lang="EN-US">numOfPages[]</span><span style="font-family: 宋体;">数组中。所有</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">用完的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">都存放在</span><span lang="EN-US">full_runs_</span><span style="font-family: 宋体;">的</span><span lang="EN-US">hash_set</span><span style="font-family: 宋体;">中。而由于有</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">被释放而又有可用的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">则存放在</span><span lang="EN-US">non_full_runs_</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Set</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l4 level1 lfo9; text-align: left; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">(2)<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">非空,先查一下</span><span lang="EN-US">top_slot_idx_</span><span style="font-family: 宋体;">字段,若该字段并没有到达结尾,就返回一个</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">,并把</span><span lang="EN-US">top_slot_idx_</span><span style="font-family: 宋体;">字段加</span><span lang="EN-US">1</span><span style="font-family: 宋体;">。若</span><span lang="EN-US">top_slot_idx_</span><span style="font-family: 宋体;">字段已经到达结尾,那么会搜索一下有没有在该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中已经分配出去的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">由释放的情况,如果有,分配出去。若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">都用满了,那就看看该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是不是</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的,如果是的话,将</span><span lang="EN-US">thread_local_free_bit_map_[]</span><span style="font-family: 宋体;">中的信息同步过来,看是否有用的</span><span lang="EN-US">slot. </span><span style="font-family: 宋体;">若至此仍然没有找到一个可用的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">,那把该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">加入到</span><span lang="EN-US">full_runs_</span><span style="font-family: 宋体;">的</span><span lang="EN-US">hash_set</span><span style="font-family: 宋体;">中。重新分配一个</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">,向系统申请页</span><span lang="EN-US">. </span><span style="font-family: 宋体;">然后在从该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中分配</span><span lang="EN-US">slot. </span><span style="font-family: 宋体;">每分配一个</span><span lang="EN-US">slot </span><span style="font-family: 宋体;">就会将</span><span lang="EN-US">alloc_bit_map_</span><span style="font-family: 宋体;">中对应的</span><span lang="EN-US">bit</span><span style="font-family: 宋体;">置</span><span lang="EN-US">1</span><span style="font-family: 宋体;">,表示该</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">被分配出去了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo6; text-align: left; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">释放</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">若某个</span><span lang="EN-US">object</span><span style="font-family: 宋体;">被释放后,根据该</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的地址,</span><span lang="EN-US">rundown</span><span style="font-family: 宋体;">成页地址,根据页地址去查询该页的用途。对于一个</span><span lang="EN-US">ROS</span><span style="font-family: 宋体;">系统所拥有的虚拟页都是连续的,事先通过</span><span lang="EN-US">mmap</span><span style="font-family: 宋体;">的方式分配得到。</span><span lang="EN-US">ROS</span><span style="font-family: 宋体;">系统维护了一个</span><span lang="EN-US">page_map_</span><span style="font-family: 宋体;">的数组。每一页对应一个</span><span lang="EN-US">Byte. </span><span style="font-family: 宋体;">如果该页用于</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">分配的</span><span lang="EN-US">Run,</span><span style="font-family: 宋体;">该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">占用的第一页在</span><span lang="EN-US">page_map_</span><span style="font-family: 宋体;">中对应的</span><span lang="EN-US">byte</span><span style="font-family: 宋体;">设置为枚举常量</span><span lang="EN-US">kPageMapRun, </span><span style="font-family: 宋体;">剩余页被设置为枚举</span><span lang="EN-US">kPageMapRun</span><span style="font-family: 宋体;">。因此当释放某个</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的时候,根据地址以及</span><span lang="EN-US">page_map_</span><span style="font-family: 宋体;">可以得到</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">在内存中的地址。</span> <span style="font-family: 宋体;">如果该</span><span lang="EN-US">object</span><span style="font-family: 宋体;">属于</span><span lang="EN-US">Largeobject</span><span style="font-family: 宋体;">(</span><span lang="EN-US">page_map_</span><span style="font-family: 宋体;">中对应的</span><span lang="EN-US">byte</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">kPageMapLargeObject</span><span style="font-family: 宋体;">),那就直接释放该页。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">若该页在</span><span lang="EN-US">page_map_</span><span style="font-family: 宋体;">中对应的</span><span lang="EN-US">byte</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">kPageMapRun</span><span style="font-family: 宋体;">,就在对应的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中将</span><span lang="EN-US">alloc_bit_map </span><span style="font-family: 宋体;">该</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">的对应位清</span><span lang="EN-US">0.</span><span style="font-family: 宋体;">说明该</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">空闲了。若该</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">对应的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">并非系统正在使用的</span><span lang="EN-US">Run(</span><span style="font-family: 宋体;">该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">因为</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">被用完后,系统又分配了新的</span><span lang="EN-US">slot)</span><span style="font-family: 宋体;">,那么就将该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">从</span><span lang="EN-US">full_runs_</span><span style="font-family: 宋体;">中移到</span><span lang="EN-US">non_full_runs</span><span style="font-family: 宋体;">中。如果该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">此时全部为</span><span lang="EN-US">free</span><span style="font-family: 宋体;">了,就会将该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">分解掉,其占用的</span><span lang="EN-US">pages</span><span style="font-family: 宋体;">退回到</span><span lang="EN-US">free_pages_</span><span style="font-family: 宋体;">的</span><span lang="EN-US">set</span><span style="font-family: 宋体;">中。而如果该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">为</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的,那么该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">是不会被退回的,因为若该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">为</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的情况下,该</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">一定属于当前正在使用的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">。如果</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Run</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">slot</span><span style="font-family: 宋体;">全部被消耗完了,会被扔到</span><span lang="EN-US">full_runs_</span><span style="font-family: 宋体;">中,其</span><span lang="EN-US">thread local</span><span style="font-family: 宋体;">的属性也会被去掉。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">三,参考</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo8; text-align: left; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US"><a href="https://android.googlesource.com/platform/art/+/master/runtime/gc/allocator/">https://android.googlesource.com/platform/art/+/master/runtime/gc/allocator/</a><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-5887469910023114342013-09-24T01:11:00.001-07:002013-09-24T18:07:49.711-07:00理解ARMV8 Device Memory的三个属性<div dir="ltr">
ARMV8的spec.对device memory新引入了3个概念,分别是:Gathering, Reordering和Early Write acknowledge.下面从软件工程师的角度去阐述这三个概念。<br />
<br />
Gathering<br />
<br />
<blockquote class="gmail_quote" style="border-left-color: rgb(204,204,204); border-left-style: solid; border-left-width: 1px; margin: 0px 0px 0px 0.8ex; padding-left: 1ex;">
The Gathering attribute determines whether it is permissible for either:<br />
• Multiple memory accesses of the same type, read or write, to the same memory location to be merged into a single transaction.<br />
• Multiple memory accesses of the same type, read or write, to different memory locations to be merged into a single memory transaction on an interconnect.</blockquote>
<br />
当某条load/store指令在pipeline的access memory阶段,发生cache miss(对于non-cacheable的memory就直接跳过,不过对于device memory一般都是non-cacheable的)后,需要将access memory请求发到总线上(例如AXI总线),通过AXI总线访问device memory,这个通过总线访问memory的过程被称为一次transaction. 为了优化性能考虑,在core内,会引入一个Buffer, 当发生一个access memory请求后,会将这个请求信息丢到Buffer中,若某条指令和上一条指令共享同一个cache line或者是访问同一个地址,那么,该条指令便不会再向总线发送transaction了,它share上一条指令 读到buffer中的结果。这个share的过程称为gathering. 读到buffer中的数据,如果是cacheable的,会在某个时间内腾到cache中。<br />
<br />
Reordering<br />
reordering也是针对device memory的transaction, that is, 某个device memory的连续access的transaction或者device memory之间的连续access的transaction. 对某个device memory的一次transaction 必须等到上一次device memory的transaction结束后(上一次load或者 write的ack发生后)才可以进行,这叫non-reordering. 若这些transaction可以乱序,不需要等待上一次access的ack就可以进行transaction,这种方式叫reordering.<br />
<br />
Early Write acknowledge<br />
<br />
<blockquote class="gmail_quote" style="border-left-color: rgb(204,204,204); border-left-style: solid; border-left-width: 1px; margin: 0px 0px 0px 0.8ex; padding-left: 1ex;">
Early Write Acknowledgement is a hint to the platform memory system. Assigning the No Early Write Acknowledgement attribute to a Device memory location recommends that only the endpoint of the write access returns a write acknowledgement of the access, and that no earlier point in the memory system returns a write acknowledge. This means that a DSB barrier, executed by the processor that performed the write to the No Early Write Acknowledgement location, completes only after the write has reached its endpoint in the memory system. Typically, this endpoint is a peripheral or physical memory.</blockquote>
<div>
<br /></div>
当对某个Device memory进行write时,需要ACK,下一个对device memory进行access的transaction才能进行。为了性能优化的考虑,device会提供一个类似与寄存器的程序员不可见的buffer,这样当CPU通过总线向device memory写数据的时候,直接写到buffer里就可以了。这样buffer就可以向cpu返回一个ACK,表示写successfully.至于何时buffer将数据真正腾到device memory就看device内部的协议了。</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-40613152710984677592013-09-13T02:55:00.001-07:002013-09-13T03:55:09.683-07:00Understanding DMB<div dir="ltr">
<span class="" style="border-collapse: separate; border-spacing: 0px; color: black; font-family: sans-serif; font-size: 13px;"></span><br />
<div style="margin: 5px 0px;">
<span class="" style="border-collapse: separate; border-spacing: 0px; color: black; font-family: sans-serif; font-size: 13px;">DMB: Data memory barrier</span></div>
<div style="margin: 5px 0px;">
<span class="" style="border-collapse: separate; border-spacing: 0px; color: black; font-family: sans-serif; font-size: 13px;">理解DMB指令,先看下面例子,在core 0和core1上同时跑两个不同的指令(如下表所示)</span></div>
<table style="border-collapse: collapse; margin-bottom: 10px;"><tbody>
<tr><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><span style="text-decoration: underline;">core 0</span></td><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><span style="text-decoration: underline;">core 1</span></td> </tr>
<tr><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><div style="margin: 0px; padding: 0px;">
Write A;</div>
<div style="margin: 0px; padding: 0px;">
Write B;</div>
</td><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><div style="margin: 0px; padding: 0px;">
Load B;</div>
<div style="margin: 0px; padding: 0px;">
Load A;</div>
</td></tr>
<tr><td colspan="2" rowspan="1" style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top">这里core0在执行两个指令,写A B两个值的时候,<strong>可能会发生乱序</strong>也可能<strong>Write A时发生Cache Miss</strong>,那么就会导致在cache中 A的最新值更新慢于B的最新值。于是在core1中的指令Load B就会拿到新值,而Load A 就会拿到旧值。如果A与B有相互关系的话,便可能产生死锁等问题。这里有一个典型的例子:<a href="https://lkml.org/lkml/2012/7/13/123">https://lkml.org/lkml/2012/7/13/123</a> </td> </tr>
</tbody></table>
<div style="margin: 5px 0px;">
<span class="" style="border-collapse: separate; border-spacing: 0px; color: black; font-family: sans-serif; font-size: 13px;">于是,就有了下面的解决方法:</span></div>
<table style="border-collapse: collapse; margin-bottom: 10px;"><tbody>
<tr><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><span style="text-decoration: underline;">core 0</span></td><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><span style="text-decoration: underline;">core 1</span></td> </tr>
<tr><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><div style="margin: 0px; padding: 0px;">
Write A</div>
<div style="margin: 0px; padding: 0px;">
DMB;</div>
<div style="margin: 0px; padding: 0px;">
Write B</div>
</td><td style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top" width="337"><div style="margin: 0px; padding: 0px;">
Load B</div>
<div style="margin: 0px; padding: 0px;">
Load A</div>
</td></tr>
<tr><td colspan="2" rowspan="1" style="border: 1px solid rgb(221,221,221); padding: 5px 10px; word-break: break-all;" valign="top">在core0所执行的两条指令之间加入一个DMB. 这样,若core1在Load B时,拿到了最新值。那么Load A 也一定拿到了最新值。这就是DMB的作用:<strong>DMB前面的LOAD/STORE读写的最新值的acknowledgement在时间上一定先于DMB之后的指令。</strong></td></tr>
</tbody></table>
DSB 和DMB容易混淆。他们的区别在于:DMB可以继续执行之后的指令,只要这条指令不是内存访问指令。而DSB不管它后面的什么指令,都会强迫CPU等待它之前的指令执行完毕。其实在很多处理器设计的时候,DMB和DSB没有区别(DMB完成和DSB同样的功能)。他们以及ISB在arm reference中的解释如下[1]:<br />
<ul style="background-color: white; font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size: small; margin-bottom: 0.2em; margin-top: 0.8em;">
<li style="margin-bottom: 0.2em; margin-top: 0.6em;">A <strong style="margin-bottom: 0.2em; margin-top: 0.4em;">Data Synchronization Barrier (DSB)</strong> completes when all instructions before this instruction complete.</li>
<li style="margin-bottom: 0.2em; margin-top: 0.6em;">A <strong style="margin-bottom: 0.2em; margin-top: 0.4em;">Data Memory Barrier (DMB)</strong> ensures that all explicit memory accesses before the DMB instruction complete before any explicit memory accesses after the DMB instruction start.</li>
<li style="margin-bottom: 0.2em; margin-top: 0.6em;">An <strong style="margin-bottom: 0.2em; margin-top: 0.4em;">Instruction Synchronization Barrier (ISB)</strong> flushes the pipeline in the processor, so that all instructions following the ISB are fetched from cache or memory, after the ISB has been completed.</li>
</ul>
<div>
<br />
ISB不仅做了DSB所做的事情,还将流水线清空[2]。于是他们的重量级排序可以是:ISB>DSB>DMB :-)</div>
<div>
<span style="font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></div>
<div>
参考:</div>
<div>
<span style="font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; font-size: x-small;">1. </span><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14041.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14041.html</a></div>
<div>
2. <a href="http://blog.csdn.net/nxpzmj/article/details/7882015">http://blog.csdn.net/nxpzmj/article/details/7882015</a></div>
<div>
</div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-53785068192977234812013-06-02T19:53:00.000-07:002013-06-03T03:21:26.583-07:00How to Debug Crash Linux for ARM<span style="font-family: Calibri, sans-serif; font-size: x-small;"> </span><br />
<div style="text-align: justify;">
<div class="MsoNormal">
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">It’s
known that there are many tools to debug crash Linux for X86 architecture, such
as kdump, LKCD, etc. Although many debugging tools claim that they could
support ARM architecture, they are unstable. Is there a reliable method for ARM
SOC? Yes, this blog will show a stable method for debugging ARM Linux. There is
a premise that you could dump the memory snapshot by some assistive hardware
tools when crash happen. This premise is easy for ARM SOC company. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">This
method for debugging ARM Linux is to compose a crash image and analyze the
crash kernel with the aid of <a href="http://people.redhat.com/anderson/crash_whitepaper/">Crash Utility.</a><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Now I
will explain this method by step.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l8 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Build Linux Kernel for ARM SOC. Please make
sure that the feature<i> kexec</i> and <i>debug info</i> are enable.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 72.0pt; mso-list: l3 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Symbol; font-size: 10.0pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Boot options ---> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 108.0pt; mso-list: l5 level1 lfo3; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Symbol; font-size: 10.0pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">[*] Kexec system call (EXPERIMENTAL)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 108.0pt; mso-list: l5 level1 lfo3; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Symbol; font-size: 10.0pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">[*] Export atags in procfs (NEW) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 72.0pt; mso-list: l9 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Symbol; font-size: 10.0pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Kernel hacking ---><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 108.0pt; mso-list: l6 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Symbol; font-size: 10.0pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">[*] Compile the kernel with debug info<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l7 level1 lfo6; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Modify kernel source code for
kernel/kexec.c<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;"> <a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999;">12</span></a> --- a/kernel/kexec.c</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 13</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
+++ b/kernel/kexec.c</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 14</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
@@ -1089,14 +1089,16 @@ void crash_kexec(struct pt_regs *regs)</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 15</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
* sufficient. But since I reuse the memory...</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 16</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
*/</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 17</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
if (mutex_trylock(&kexec_mutex)) {</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 18</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
- if (kexec_crash_image) {</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 19</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
+// if (kexec_crash_image) {</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 20</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
struct pt_regs fixed_regs;</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 21</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;"> </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 22</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
crash_setup_regs(&fixed_regs, regs);</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 23</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
crash_save_vmcoreinfo();</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 24</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
machine_crash_shutdown(&fixed_regs);</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 25</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
- machine_kexec(kexec_crash_image);</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 26</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
- }</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 27</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
+ flush_cache_all();</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 28</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
+// machine_kexec(kexec_crash_image);</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 29</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
+// }</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 30</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
mutex_unlock(&kexec_mutex);</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="http://10.38.50.15/gitweb/?p=dump-tool.git;a=blob;f=0001-Use-xdb-insteading-of-kdump-to-debug.patch;h=0d125ce1106f32fd9c18b652be95ffc806b77d74;hb=ac44817a73a8944058a0a892a1764772d65495b0"><span style="color: #999999; font-family: "Courier New";"> 31</span></a></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 10.0pt;">
}</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l4 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Build Linux Kernel.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l4 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">After the Linux Kernel run and the console
shows, please output two physical address.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 42.0pt; mso-list: l1 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">a.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">cpu_notes_paddr: $<i>cat
sys/devices/system/cpu/cpu0/crash_notes </i><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 42.0pt; mso-list: l1 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">b.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">vmcore_notes_paddr: $<i>cat
/sys/kernel/vmcoreinfo </i><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l0 level1 lfo9; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">5.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">When crash happens, please use some
assistive hardware method to dump the memory snapshot.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l0 level1 lfo9; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">6.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Compose a available image for <a href="http://people.redhat.com/anderson/crash_whitepaper/">Crash Utility</a>.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;">
</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: "Times New Roman";">This image is ELF format. There are
some program headers. If the memory is flat sequence , two program headers are
enough. One program header is for cpu_notes and vmcore_notes, the other is for
memory snapshot. I have write this which could be referenced. The code could be
found at </span><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 10.0pt;"><a href="https://github.com/tek-life/dump-crash-tool"><span style="font-family: "Calibri","sans-serif";">https://github.com/tek-life/dump-crash-tool</span></a></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: "Times New Roman";">.</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l2 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 36.0pt; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt; mso-bidi-font-family: Calibri; mso-fareast-font-family: Calibri;">7.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">After step 6 is completed, new file
‘newvmcore’ could be got. Then we could use Crash Utility to analyze the crash
Linux Kernel.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">$./crash
vmlinux newvmcore <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">‘vmlinux’
is the kernel image with debug information. ‘newvmcore’ is got from step 6. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Following
text is the <a href="http://people.redhat.com/anderson/crash_whitepaper/">Crash
Utility</a> output.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">$
./crash examples/vmlinux examples/vmcore<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">crash
6.1.5<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2002-2013 Red Hat, Inc.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2004, 2005, 2006, 2010 IBM Corporation<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 1999-2006 Hewlett-Packard Co<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2005, 2006, 2011, 2012 Fujitsu Limited<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2006, 2007 VA Linux Systems Japan K.K.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2005, 2011 NEC Corporation<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 1999, 2002, 2007 Silicon Graphics, Inc.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">This
program is free software, covered by the GNU General Public License,<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">and
you are welcome to change it and/or distribute copies of it under<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">certain
conditions. Enter "help copying" to see the conditions.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">This
program has absolutely no warranty. Enter "help warranty" for
details.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">GNU
gdb (GDB) 7.3.1<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">Copyright
(C) 2011 Free Software Foundation, Inc.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">License
GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html">http://gnu.org/licenses/gpl.html</a>><o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">This
is free software: you are free to change and redistribute it.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">There
is NO WARRANTY, to the extent permitted by law. Type "show
copying"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">and
"show warranty" for details.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">This
GDB was configured as "--host=i686-pc-linux-gnu
--target=arm-linux-gnueabi"...<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
KERNEL: examples/vmlinux<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
DUMPFILE: examples/vmcore<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
CPUS: 1<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 21pt;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
DATE: Sat Jan 1 10:29:39 2000<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
UPTIME: 00:00:51<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">LOAD
AVERAGE: 0.08, 0.03, 0.01<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
TASKS: 22<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
NODENAME: Linux<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
RELEASE: 3.4.5-00527-g320e261-dirty<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
VERSION: #506 Fri May 10 15:57:51 CST 2013<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
MACHINE: armv7l (unknown Mhz)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
MEMORY: 128 MB<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
PANIC: "[ 51.520000] Internal error: Oops: 817 [#1] ARM"
(check log for details)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
PID: 297<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
COMMAND: "sh"<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
TASK: c7870900 [THREAD_INFO: c793a000]<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
CPU: 0<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">
STATE: TASK_RUNNING (PANIC)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">crash><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</div>
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="padding-left: 31pt; text-align: justify;">
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span> hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-19545242284764782472013-04-26T20:36:00.001-07:002013-04-26T20:45:47.615-07:00Understanding Kdump (How to make crashnote)<div class="mobile-photo">
<br />
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">crashnote
contains register status when crash happens. In kernel, this data is stored
“note_buf_t __percpu *crash_notes”.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">include/linux/kexec.h<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">typedef
u32 note_buf_t[KEXEC_NOTE_BYTES/4];</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">crashnote
is also one part of /proc/vmcore. At first, crashnotes[] address, got by
reading sys/devices/system/cpu/cpu0/crash_notes, is stored as one program
header, which could be got from “elfcorehdr”. Making crash_notes is done by
crash_save_cpu().<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">crash_kexec->machine_crash_shutdown->crash_save_cpu:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1206
void crash_save_cpu(struct pt_regs *regs, int cpu)</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1207 {</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1208
struct elf_prstatus prstatus;</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1209
u32 *buf;</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1210</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1211
if ((cpu < 0) || (cpu >= nr_cpu_ids))</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1212
return;</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1213</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1214
/* Using ELF notes here is opportunistic.</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1215
* I need a well defined structure format</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1216
* for the data I pass, and I need tags</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1217
* on the data to indicate what information I have</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1218
* squirrelled away. ELF notes happen to provide</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1219
* all of that, so there is no need to invent something new.</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1220
*/</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1221
buf = (u32*)per_cpu_ptr(crash_notes, cpu);</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1222
if (!buf)</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1223
return;</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1224
memset(&prstatus, 0, sizeof(prstatus));</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1225
prstatus.pr_pid = current->pid;</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1226
elf_core_copy_kernel_regs(&prstatus.pr_reg, regs);</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1227
buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS,</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1228
&prstatus, sizeof(prstatus));</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1229
final_note(buf);</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">1230 }</span></i><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="text-align: justify; text-justify: inter-ideograph;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.0pt;">The
final layout illustrate below.<o:p></o:p></span></div>
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;"><div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggyVOdKk7A1zibGRmmbhn02yU-l-pnsuWCPYttqtRErKiwjWYcf5B68ge4-cuIJnFXiC_nIu47uj6eC9oo956HJWTwq_8sGy8iWIzCJT71IZdVFsnjF5gjA3tOTKqeCWRYPQSUKYAWr34/s1600/Picture+%2528Device+Independent+Bitmap%2529+1-775094.jpg" style="font-family: Simsun; font-size: medium; text-align: start;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5871365359693592162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggyVOdKk7A1zibGRmmbhn02yU-l-pnsuWCPYttqtRErKiwjWYcf5B68ge4-cuIJnFXiC_nIu47uj6eC9oo956HJWTwq_8sGy8iWIzCJT71IZdVFsnjF5gjA3tOTKqeCWRYPQSUKYAWr34/s320/Picture+%2528Device+Independent+Bitmap%2529+1-775094.jpg" /></a></div>
</div>
</span> hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-70937194393488518812013-04-26T20:04:00.000-07:002013-04-27T00:17:37.609-07:00Understanding Kdump (How to make vmcoreinfo_note)<div class="mobile-photo">
<br />
<div class="MsoNormal" style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.63636302947998px; line-height: 16.363636016845703px; text-align: justify;">
<span style="background-color: transparent;">vmcoreinfo_note contains crash kernel general information, include os version, page size etc.. In kernel, vmcoreinfo_note is stored on vmcoreinfo_note[]. And, vmcoreinfo_note is one part of /proc/vmcore, which is used for debugging with capture kernel brings up. In blog "</span><a href="http://hfli0.blogspot.com/2013/04/unstanding-kdump-loading-part.html" style="background-color: transparent;">Understanding Kdump (Loading Part)</a><span style="background-color: transparent;">", one program header including vmcoreinfo_note's address and length was referenced, and this program header could be got from "elfcorehdr". vmcoreinfo_note[]'s address and length could be got by reading /sys/kernel/vmcoreinfo.</span></div>
<br />
When kexec is configured, this function
will be triggered with kernel brings up.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1458 static int __init
crash_save_vmcoreinfo_init(void)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1459 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1460
VMCOREINFO_OSRELEASE(init_uts_ns.name.release);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1461
VMCOREINFO_PAGESIZE(PAGE_SIZE);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1462</span></div>
<div class="MsoNormal">
<span lang="EN-US">1463
VMCOREINFO_SYMBOL(init_uts_ns);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1464
VMCOREINFO_SYMBOL(node_online_map);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1465
VMCOREINFO_SYMBOL(swapper_pg_dir);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1466
VMCOREINFO_SYMBOL(_stext);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1467
VMCOREINFO_SYMBOL(vmlist);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1468</span></div>
<div class="MsoNormal">
<span lang="EN-US">1469 #ifndef CONFIG_NEED_MULTIPLE_NODES</span></div>
<div class="MsoNormal">
<span lang="EN-US">1470
VMCOREINFO_SYMBOL(mem_map);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1471
VMCOREINFO_SYMBOL(contig_page_data);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1472 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">1473 #ifdef CONFIG_SPARSEMEM</span></div>
<div class="MsoNormal">
<span lang="EN-US">1474
VMCOREINFO_SYMBOL(mem_section);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1475
VMCOREINFO_LENGTH(mem_section, NR_SECTION_ROOTS);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1476
VMCOREINFO_STRUCT_SIZE(mem_section);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1477
VMCOREINFO_OFFSET(mem_section, section_mem_map);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1478 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">1479
VMCOREINFO_STRUCT_SIZE(page);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1480
VMCOREINFO_STRUCT_SIZE(pglist_data);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1481
VMCOREINFO_STRUCT_SIZE(zone);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1482
VMCOREINFO_STRUCT_SIZE(free_area);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1483
VMCOREINFO_STRUCT_SIZE(list_head);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1484
VMCOREINFO_SIZE(nodemask_t);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1485
VMCOREINFO_OFFSET(page,
flags);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1486
VMCOREINFO_OFFSET(page, _count);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1487
VMCOREINFO_OFFSET(page, mapping);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1488
VMCOREINFO_OFFSET(page, lru);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1489
VMCOREINFO_OFFSET(pglist_data, node_zones);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1490
VMCOREINFO_OFFSET(pglist_data, nr_zones);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1491 #ifdef CONFIG_FLAT_NODE_MEM_MAP</span></div>
<div class="MsoNormal">
<span lang="EN-US">1492
VMCOREINFO_OFFSET(pglist_data, node_mem_map);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1493 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">1494
VMCOREINFO_OFFSET(pglist_data, node_start_pfn);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1495
VMCOREINFO_OFFSET(pglist_data, node_spanned_pages);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1496
VMCOREINFO_OFFSET(pglist_data, node_id);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1497
VMCOREINFO_OFFSET(zone, free_area);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1498
VMCOREINFO_OFFSET(zone, vm_stat);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1499
VMCOREINFO_OFFSET(zone, spanned_pages);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1500
VMCOREINFO_OFFSET(free_area, free_list);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1501
VMCOREINFO_OFFSET(list_head, next);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1502
VMCOREINFO_OFFSET(list_head, prev);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1503
VMCOREINFO_OFFSET(vm_struct, addr);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1504
VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1505
log_buf_kexec_setup();</span></div>
<div class="MsoNormal">
<span lang="EN-US">1506
VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1507
VMCOREINFO_NUMBER(NR_FREE_PAGES);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1508
VMCOREINFO_NUMBER(PG_lru);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1509
VMCOREINFO_NUMBER(PG_private);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1510
VMCOREINFO_NUMBER(PG_swapcache);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1511</span></div>
<div class="MsoNormal">
<span lang="EN-US">1512
arch_crash_save_vmcoreinfo();</span></div>
<div class="MsoNormal">
<span lang="EN-US">1513
update_vmcoreinfo_note();</span></div>
<div class="MsoNormal">
<span lang="EN-US">1514</span></div>
<div class="MsoNormal">
<span lang="EN-US">1515
return 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1516 }</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">149 #define VMCOREINFO_OSRELEASE(value) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">150
vmcoreinfo_append_str("OSRELEASE=%s\n", value)</span></div>
<div class="MsoNormal">
<span lang="EN-US">151 #define VMCOREINFO_PAGESIZE(value) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">152
vmcoreinfo_append_str("PAGESIZE=%ld\n", value)</span></div>
<div class="MsoNormal">
<span lang="EN-US">153 #define VMCOREINFO_SYMBOL(name) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">154
vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned
long)&name)</span></div>
<div class="MsoNormal">
<span lang="EN-US">155 #define VMCOREINFO_SIZE(name) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">156
vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \</span></div>
<div class="MsoNormal">
<span lang="EN-US">157 (unsigned
long)sizeof(name))</span></div>
<div class="MsoNormal">
<span lang="EN-US">158 #define VMCOREINFO_STRUCT_SIZE(name) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">159
vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \</span></div>
<div class="MsoNormal">
<span lang="EN-US">160 (unsigned long)sizeof(struct name))</span></div>
<div class="MsoNormal">
<span lang="EN-US">161 #define VMCOREINFO_OFFSET(name, field)
\</span></div>
<div class="MsoNormal">
<span lang="EN-US">162
vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \</span></div>
<div class="MsoNormal">
<span lang="EN-US">163 (unsigned
long)offsetof(struct name, field))</span></div>
<div class="MsoNormal">
<span lang="EN-US">164 #define VMCOREINFO_LENGTH(name, value)
\</span></div>
<div class="MsoNormal">
<span lang="EN-US">165
vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned
long)value)</span></div>
<div class="MsoNormal">
<span lang="EN-US">166 #define VMCOREINFO_NUMBER(name) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">167
vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name)</span></div>
<div class="MsoNormal">
<span lang="EN-US">168 #define VMCOREINFO_CONFIG(name) \</span></div>
<div class="MsoNormal">
<span lang="EN-US">169
vmcoreinfo_append_str("CONFIG_%s=y\n", #name)</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">1428 void vmcoreinfo_append_str(const char
*fmt, ...)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1429 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1430
va_list args;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1431
char buf[0x50];</span></div>
<div class="MsoNormal">
<span lang="EN-US">1432
int r;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1433</span></div>
<div class="MsoNormal">
<span lang="EN-US">1434
va_start(args, fmt);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1435
r = vsnprintf(buf, sizeof(buf), fmt, args);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1436
va_end(args);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1437</span></div>
<div class="MsoNormal">
<span lang="EN-US">1438
if (r + vmcoreinfo_size > vmcoreinfo_max_size)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1439 r = vmcoreinfo_max_size -
vmcoreinfo_size;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1440</span></div>
<div class="MsoNormal">
<span lang="EN-US">1441
memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1442</span></div>
<div class="MsoNormal">
<span lang="EN-US">1443
vmcoreinfo_size += r;</span></div>
<div style="border-bottom: solid windowtext 1.0pt; border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-element: para-border-div; padding: 0cm 0cm 1.0pt 0cm;">
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1444 }</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">vmcoreinfo_append_str()
store necemmory vmcore information to vmcoreinfo_data[]. The address&length will be got by reading /proc/kernel/vminfo.</span></div>
</div>
<div class="MsoNormal">
<span lang="EN-US">1411 static void
update_vmcoreinfo_note(void)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1412 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1413
u32 *buf = vmcoreinfo_note;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1414</span></div>
<div class="MsoNormal">
<span lang="EN-US">1415
if (!vmcoreinfo_size)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1416 return;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1417
buf = append_elf_note(buf, VMCOREINFO_NOTE_NAME, 0, vmcoreinfo_data,</span></div>
<div class="MsoNormal">
<span lang="EN-US">1418
vmcoreinfo_size);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1419
final_note(buf);</span></div>
<div style="border-bottom: solid windowtext 1.0pt; border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-element: para-border-div; padding: 0cm 0cm 1.0pt 0cm;">
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1420 }</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">update_vmcoreinfo_note-> update_vmcoreinfo_note</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1179 static u32
*append_elf_note(u32 *buf, char *name, unsigned type, void *data,</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1180 size_t data_len)</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1181 {</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1182 struct elf_note note;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1183</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1184 note.n_namesz = strlen(name) + 1;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1185 note.n_descsz = data_len;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1186 note.n_type = type;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1187 memcpy(buf, &note, sizeof(note));</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1188 buf += (sizeof(note) + 3)/4;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1189 memcpy(buf, name, note.n_namesz);</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1190 buf += (note.n_namesz + 3)/4;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1191 memcpy(buf, data, note.n_descsz);</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1192 buf += (note.n_descsz + 3)/4;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1193</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1194 return buf;</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">1195 }</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US">update_vmcore_info
will transfer vmcoreinfo_data to vmcoreinfo_note. When crash happens, another
string “CRASHTIME=xxx” will append vmcoreinfo_data, which also will overwrite
vmcoreinfo_note. The final layout of the vmcoreinfo_note illustrate below.</span></div>
<div class="MsoNormal" style="border: none; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;">
<span lang="EN-US"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PhdxeYRz_7ruiIYD4W-z0rt1XRtiAIrlOJ5kDHnBI9Ki9SDfkSpJpmUDSz1EKsBCHylBkCgeZtt1dyEmoXZaY5Iufo6Pk4_rmcaJhwmS2GP96FZDkel6LyG_5j9q_2Odll94xkPNVyI/s1600/Picture+%2528Device+Independent+Bitmap%2529+1-722303.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5871358260231242050" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PhdxeYRz_7ruiIYD4W-z0rt1XRtiAIrlOJ5kDHnBI9Ki9SDfkSpJpmUDSz1EKsBCHylBkCgeZtt1dyEmoXZaY5Iufo6Pk4_rmcaJhwmS2GP96FZDkel6LyG_5j9q_2Odll94xkPNVyI/s320/Picture+%2528Device+Independent+Bitmap%2529+1-722303.jpg" /></a></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-79277727018818774722013-04-25T22:56:00.000-07:002013-04-26T20:10:37.257-07:00Understanding Kdump (Executing Part)<span style="text-align: justify;">Capture kernel brings up when panic
happens. The specific location in source code and the routine will be analyzed
in this blog.</span><br />
<div style="text-align: justify;">
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">69 void panic(const char *fmt, ...)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 70 {</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 71
static DEFINE_SPINLOCK(panic_lock);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 72
static char buf[1024];</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 73
va_list args;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 74
long i, i_next = 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 75
int state = 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 76</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 77
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 78
* It's possible to come here directly from a panic-assertion and</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 79
* not have preempt disabled. Some functions called from here want</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 80
* preempt to be disabled. No point enabling it later though...</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 81
*</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 82
* Only one CPU is allowed to execute the panic code from here. For</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 83
* multiple parallel invocations of panic, all other CPUs either</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 84
* stop themself or will wait until they are stopped by the 1st CPU</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 85
* with smp_send_stop().</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 86
*/</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 87
if (!spin_trylock(&panic_lock))</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 88 panic_smp_self_stop();</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 89</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 90
console_verbose();</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 91
bust_spinlocks(1);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 92
va_start(args, fmt);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 93
vsnprintf(buf, sizeof(buf), fmt, args);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 94
va_end(args);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 95
printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 96
#ifdef CONFIG_DEBUG_BUGVERBOSE</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 97
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 98
* Avoid nested stack-dumping if a panic occurs during oops processing</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 99
*/</span></div>
<div class="MsoNormal">
<span lang="EN-US">100
if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)</span></div>
<div class="MsoNormal">
<span lang="EN-US">101 dump_stack();</span></div>
<div class="MsoNormal">
<span lang="EN-US">102 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">103</span></div>
<div class="MsoNormal">
<span lang="EN-US">104
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US">105
* If we have crashed and we have a crash kernel loaded let it handle</span></div>
<div class="MsoNormal">
<span lang="EN-US">106
* everything else.</span></div>
<div class="MsoNormal">
<span lang="EN-US">107
* Do we want to call this before we try to display a message?</span></div>
<div class="MsoNormal">
<span lang="EN-US">108
*/</span></div>
<div class="MsoNormal">
<span lang="EN-US">109
crash_kexec(NULL);</span></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec:</span></div>
<div class="MsoNormal">
<span lang="EN-US">1081 void crash_kexec(struct pt_regs *regs)</span></div>
<div class="MsoNormal">
<span lang="EN-US">1082 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1083
/* Take the kexec_mutex here to prevent sys_kexec_load</span></div>
<div class="MsoNormal">
<span lang="EN-US">1084 * running on one cpu from replacing
the crash kernel</span></div>
<div class="MsoNormal">
<span lang="EN-US">1085
* we are using after a
panic on a different cpu.</span></div>
<div class="MsoNormal">
<span lang="EN-US">1086 *</span></div>
<div class="MsoNormal">
<span lang="EN-US">1087 * If the crash kernel was not located
in a fixed area</span></div>
<div class="MsoNormal">
<span lang="EN-US">1088 * of memory the
xchg(&kexec_crash_image) would be</span></div>
<div class="MsoNormal">
<span lang="EN-US">1089 * sufficient. But since I reuse the memory...</span></div>
<div class="MsoNormal">
<span lang="EN-US">1090 */</span></div>
<div class="MsoNormal">
<span lang="EN-US">1091
if (mutex_trylock(&kexec_mutex)) {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1092 if (kexec_crash_image) {</span></div>
<div class="MsoNormal">
<span lang="EN-US">1093 struct pt_regs
fixed_regs;</span></div>
<div class="MsoNormal">
<span lang="EN-US">1094</span></div>
<div class="MsoNormal">
<span lang="EN-US">1095
crash_setup_regs(&fixed_regs, regs);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1096
crash_save_vmcoreinfo();</span></div>
<div class="MsoNormal">
<span lang="EN-US">1097
machine_crash_shutdown(&fixed_regs);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1098
machine_kexec(kexec_crash_image);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1099 }</span></div>
<div class="MsoNormal">
<span lang="EN-US">1100
mutex_unlock(&kexec_mutex);</span></div>
<div class="MsoNormal">
<span lang="EN-US">1101
}</span></div>
<div class="MsoNormal">
<span lang="EN-US">1102 }</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">From the post, when a capture kernel is
loaded into memory, kexec_crash_image is be filled. There are 4 steps, which
each step corresponds with each line.</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">crash_setup_regs(). Save the
panic spot’s register. regs is the parameter of panic, and it is passed by
exception process handler. Here, the regs will be stored to fixed_regs.</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">crash_save_vmcoreinfo().
Recording the time <b>now </b>to vmcoreinfo_data[].
Then transfer to vmcoreinfo_note[].It's address will be got by reading /sys/kernel/vmcoreinfo.</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">machine_crash_shutdown(). Save
the fixed_regs to crash_notes[], which will be read by “/sys/devices/system/cpu/cpu0/crash_notes”.
Then disable irq by machine_kexec_mask_interrupts(). </span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">machine_kexec(). Copy relocate_new_kernel
code to reboot_code_buffer. Then give the control to reboot_code_buffer.</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 82
void machine_kexec(struct kimage *image)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 83 {</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 84
unsigned long page_list;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 85
unsigned long reboot_code_buffer_phys;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 86
void *reboot_code_buffer;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 87</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 88</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 89
page_list = image->head & PAGE_MASK;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 90</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 91
/* we need both effective and real address here */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 92
reboot_code_buffer_phys =</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 93
page_to_pfn(image->control_code_page) << PAGE_SHIFT;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 94
reboot_code_buffer = page_address(image->control_code_page);</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 95</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 96
/* Prepare parameters for reboot_code_buffer*/</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 97
kexec_start_address = image->start;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 98
kexec_indirection_page = page_list;</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 99
kexec_mach_type = machine_arch_type;</span></div>
<div class="MsoNormal">
<span lang="EN-US">100
kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET +
KEXEC_ARM_ATAGS_OFFSET;</span></div>
<div class="MsoNormal">
<span lang="EN-US">101</span></div>
<div class="MsoNormal">
<span lang="EN-US">102
/* copy our kernel relocation code to the control code page */</span></div>
<div class="MsoNormal">
<span lang="EN-US">103
memcpy(reboot_code_buffer,</span></div>
<div class="MsoNormal">
<span lang="EN-US">104 relocate_new_kernel,
relocate_new_kernel_size);</span></div>
<div class="MsoNormal">
<span lang="EN-US">105</span></div>
<div class="MsoNormal">
<span lang="EN-US">106</span></div>
<div class="MsoNormal">
<span lang="EN-US">107
flush_icache_range((unsigned long) reboot_code_buffer,</span></div>
<div class="MsoNormal">
<span lang="EN-US">108 (unsigned long)
reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);</span></div>
<div class="MsoNormal">
<span lang="EN-US">109
printk(KERN_INFO "Bye!\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US">110</span></div>
<div class="MsoNormal">
<span lang="EN-US">111
if (kexec_reinit)</span></div>
<div class="MsoNormal">
<span lang="EN-US">112 kexec_reinit();</span></div>
<div class="MsoNormal">
<span lang="EN-US">113</span></div>
<div class="MsoNormal">
<span lang="EN-US">114
soft_restart(reboot_code_buffer_phys);</span></div>
<div class="MsoNormal">
<span lang="EN-US">115 }</span></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec->soft_restart</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">131 void soft_restart(unsigned long addr)</span></div>
<div class="MsoNormal">
<span lang="EN-US">132 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">133
u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack);</span></div>
<div class="MsoNormal">
<span lang="EN-US">134</span></div>
<div class="MsoNormal">
<span lang="EN-US">135
/* Disable interrupts first */</span></div>
<div class="MsoNormal">
<span lang="EN-US">136
local_irq_disable();</span></div>
<div class="MsoNormal">
<span lang="EN-US">137
local_fiq_disable();</span></div>
<div class="MsoNormal">
<span lang="EN-US">138</span></div>
<div class="MsoNormal">
<span lang="EN-US">139
/* Disable the L2 if we're the last man standing. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">140
if (num_online_cpus() == 1)</span></div>
<div class="MsoNormal">
<span lang="EN-US">141 outer_disable();</span></div>
<div class="MsoNormal">
<span lang="EN-US">142</span></div>
<div class="MsoNormal">
<span lang="EN-US">143
/* Change to the new stack and continue with the reset. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">144
call_with_stack(__soft_restart, (void *)addr, (void *)stack);</span></div>
<div class="MsoNormal">
<span lang="EN-US">145</span></div>
<div class="MsoNormal">
<span lang="EN-US">146
/* Should never get here. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">147
BUG();</span></div>
<div class="MsoNormal">
<span lang="EN-US">148 }</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec->soft_restart->call_with_stack</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> 24
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 25 *
void call_with_stack(void (*fn)(void *), void *arg, void *sp)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 26 *</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 27 *
Change the stack to that pointed at by sp, then invoke fn(arg) with</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 28 *
the new stack.</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 29 */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 30
ENTRY(call_with_stack)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 31
str sp, [r2, #-4]!</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 32
str lr, [r2, #-4]!</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 33</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 34
mov sp, r2</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 35
mov r2, r0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 36
mov r0, r1</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 37</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 38
adr lr, BSYM(1f)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 39
mov pc, r2</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 40</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 41
1: ldr lr, [sp]</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 42
ldr sp, [sp, #4]</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 43
mov pc, lr</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 44
ENDPROC(call_with_stack)</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec->soft_restart->call_with_stack->__soft_restart</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">107 static void __soft_restart(void *addr)</span></div>
<div class="MsoNormal">
<span lang="EN-US">108 {</span></div>
<div class="MsoNormal">
<span lang="EN-US">109
phys_reset_t phys_reset;</span></div>
<div class="MsoNormal">
<span lang="EN-US">110</span></div>
<div class="MsoNormal">
<span lang="EN-US">111
/* Take out a flat memory mapping. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">112
setup_mm_for_reboot();</span></div>
<div class="MsoNormal">
<span lang="EN-US">113</span></div>
<div class="MsoNormal">
<span lang="EN-US">114
/* Clean and invalidate caches */</span></div>
<div class="MsoNormal">
<span lang="EN-US">115
flush_cache_all();</span></div>
<div class="MsoNormal">
<span lang="EN-US">116</span></div>
<div class="MsoNormal">
<span lang="EN-US">117
/* Turn off caching */</span></div>
<div class="MsoNormal">
<span lang="EN-US">118
cpu_proc_fin();</span></div>
<div class="MsoNormal">
<span lang="EN-US">119</span></div>
<div class="MsoNormal">
<span lang="EN-US">120
/* Push out any further dirty data, and ensure cache is empty */</span></div>
<div class="MsoNormal">
<span lang="EN-US">121
flush_cache_all();</span></div>
<div class="MsoNormal">
<span lang="EN-US">122</span></div>
<div class="MsoNormal">
<span lang="EN-US">123
/* Switch to the identity mapping. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">124
phys_reset = (phys_reset_t)(unsigned long)virt_to_phys(cpu_reset);</span></div>
<div class="MsoNormal">
<span lang="EN-US">125
phys_reset((unsigned long)addr);</span></div>
<div class="MsoNormal">
<span lang="EN-US">126</span></div>
<div class="MsoNormal">
<span lang="EN-US">127
/* Should never get here. */</span></div>
<div class="MsoNormal">
<span lang="EN-US">128
BUG();</span></div>
<div class="MsoNormal">
<span lang="EN-US">129 }</span></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec->soft_restart->call_with_stack->__soft_restart->cpu_v7_reset</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> 41
* cpu_v7_reset(loc)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 42 *</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 43
* Perform a soft reset of the
system. Put the CPU into the</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 44
* same state as it would be
if it had been reset, and branch</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 45
* to what would be the reset
vector.</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 46 *</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 47
* - loc - location to jump to for soft reset</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 48 *</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 49
* This code must be executed
using a flat identity mapping with</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 50
* caches disabled.</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 51 */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 52
.align 5</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 53
.pushsection .idmap.text,
"ax"</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 54
ENTRY(cpu_v7_reset)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 55
mrc p15, 0, r1, c1, c0, 0 @ ctrl register</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 56
bic r1, r1, #0x1 @ ...............m</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 57
THUMB( bic r1, r1, #1 <<
30 ) @ SCTLR.TE (Thumb
exceptions)</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 58
mcr p15, 0, r1, c1, c0, 0 @ <b><span style="color: red;">disable MMU</span></b></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 59
isb</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 60 mov
pc, r0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 61
ENDPROC(cpu_v7_reset)</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">painc->crash_kexec->machine_kexec->soft_restart->call_with_stack->__soft_restart->cpu_v7_reset->
relocate_new_kernel</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">
7 .globl
relocate_new_kernel</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 8
relocate_new_kernel:</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 9</span></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 10
ldr r0,kexec_indirection_page
//image->head is 0<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 11
ldr
r1,kexec_start_address //
“image->start” is reserved memory start+32KB.<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 12<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 13
/*<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 14
* If there is no indirection page (we are doing crashdumps)<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 15 * skip any relocation.<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 16
*/<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 17
cmp r0, #0<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 18
beq 2f<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US"> 19</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 20
0: /* top, read another word for the
indirection page */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 21
ldr r3, [r0],#4</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 22</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 23
/* Is it a destination page. Put destination address to r4 */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 24
tst r3,#1,0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 25
beq 1f</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 26
bic r4,r3,#1</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 27
b 0b</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 28
1:</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 29
/* Is it an indirection page */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 30
tst r3,#2,0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 31
beq 1f</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 32
bic r0,r3,#2</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 33 b
0b</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 34
1:</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 35</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 36
/* are we done ? */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 37
tst r3,#4,0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 38
beq 1f</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 39
b 2f</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 40</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 41
1:</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 42
/* is it source ? */</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 43
tst r3,#8,0</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 44
beq 0b</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 45
bic r3,r3,#8</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 46
mov r6,#1024</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 47
9:</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 48
ldr r5,[r3],#4</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 49
str r5,[r4],#4</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 50
subs r6,r6,#1</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 51
bne 9b</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 52
b 0b</span></div>
<div class="MsoNormal">
<span lang="EN-US"> 53</span></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 54 2:<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 55
/* Jump to relocated kernel */<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 56
mov lr,r1<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 57 mov r0,#0<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 58
ldr r1,kexec_mach_type<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 59
ldr r2,kexec_boot_atags<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 60
ARM( mov pc, lr )<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US"> 61
THUMB( bx lr )</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Actual code for kdump feature in
relocate_new_kernel is Line 10~18 and Line 54~60.</span></div>
<div class="MsoNormal">
<span lang="EN-US">When pc move to capture kernel’s start
address, the registers value lists below.</span></div>
<div class="MsoNormal">
<span lang="EN-US">r0:0</span></div>
<div class="MsoNormal">
<span lang="EN-US">r1: MACH_TYPE_INTEGRATOR</span></div>
<div class="MsoNormal">
<span lang="EN-US">r2:Reserved memory start+1KB</span></div>
<div class="MsoNormal">
<span lang="EN-US">PC:Reserved memory start+32KB</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">In a word, before soft reboot, system will </span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">IRQ&FIQ disable (in
soft_restart)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Turn off cache (in
__soft_restart)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Disable MMU(in __soft_restart).</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Meanwhile, because of the cache
synchronization, flush cache will be necessary.</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><b>NOTE</b>, atags elfcorehdr and capture kernel
image are loaded by sys_kexec_load.</span></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-8146592943033087662013-04-24T20:06:00.000-07:002013-04-25T03:53:44.665-07:00Unstanding Kdump (Loading Part)<span style="font-family: Calibri, sans-serif; font-size: x-small;"> </span><br />
<div style="text-align: justify;">
<h3>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">Table of Contents</span></h3>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1. Introduction</span><br />
<span style="font-family: Calibri, sans-serif; font-size: x-small;">2. Routine of User Mode</span><br />
<span style="font-family: Calibri, sans-serif; font-size: x-small;">3. Routine of Kernel Mode</span><br />
<span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span>
<span style="font-family: Calibri, sans-serif; font-size: x-small;"></span><br />
<h3>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1. Introduction</span></h3>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">kdump, based on kexec, is to debug Linux Kernel. Currently, kdump and kexec are integration in <span style="color: blue;"><u><a href="http://lse.sourceforge.net/kdump/">kexec-tools program</a>. </u></span>After compiling the program, please use "build/sbin/kexec" and "-l" parameter to execute kexec function. Instead, "-p" parameter is for kdump. More difference between kexec and kdump lists below.</span><br />
<br />
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1. kexec's second kernel will overwrite first kernel.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;">2. If you want to use kdump, you should build the first kernel with "crashkernel=x@y" in cmdline. After second kernel bring up, you will found the cmdline is added, by kexec-tools, two parameters: "-mem=A" and "-elfcorehdr=B". "-mem" means the second kernel's available memory size. "-elfcorehdr" tell to kdump where could be got debug information.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: x-small;">Now, let's analyze the kdump load routine simply.</span><ol>
</ol>
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
<h3>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
2. Routine of User Mode</span></h3>
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
</div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1061 int main(int argc, char *argv[])</span></div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1062 {</span></div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1063 int do_load = 1;</span></div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
</span>
<div style="text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: x-small;">1064 int do_exec = 0;</span></div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;">
<div style="text-align: justify;">
1065 int do_load_jump_back_helper = 0;</div>
<div style="text-align: justify;">
1066 int do_shutdown = 1;</div>
<div style="text-align: justify;">
1067 int do_sync = 1;</div>
<div style="text-align: justify;">
1068 int do_ifdown = 0;</div>
<div style="text-align: justify;">
1069 int do_unload = 0;</div>
<div style="text-align: justify;">
1070 int do_reuse_initrd = 0;</div>
<div style="text-align: justify;">
1071 void *entry = 0;</div>
<div style="text-align: justify;">
1072 char *type = 0;</div>
<div style="text-align: justify;">
1073 char *endptr;</div>
<div style="text-align: justify;">
1074 int opt;</div>
<div style="text-align: justify;">
1075 int result = 0;</div>
<div style="text-align: justify;">
1076 int fileind;</div>
<div style="text-align: justify;">
1077 static const struct option options[] = {</div>
<div style="text-align: justify;">
1078 KEXEC_ALL_OPTIONS</div>
<div style="text-align: justify;">
1079 { 0, 0, 0, 0},</div>
<div style="text-align: justify;">
1080 };</div>
<div style="text-align: justify;">
1081 static const char short_options[] = KEXEC_ALL_OPT_STR;</div>
<div style="text-align: justify;">
1082</div>
<div style="text-align: justify;">
1083 while ((opt = getopt_long(argc, argv, short_options,</div>
<div style="text-align: justify;">
1084 options, 0)) != -1) {</div>
<div style="text-align: justify;">
1085 switch(opt) {</div>
<div style="text-align: justify;">
1086 case '?':</div>
<div style="text-align: justify;">
1087 case OPT_HELP:</div>
<div style="text-align: justify;">
1088 usage();</div>
<div style="text-align: justify;">
1089 return 0;</div>
<div style="text-align: justify;">
1090 case OPT_VERSION:</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
1152 case OPT_PANIC:</div>
<div style="text-align: justify;">
1153 do_load = 1;</div>
<div style="text-align: justify;">
1154 do_exec = 0;</div>
<div style="text-align: justify;">
1155 do_shutdown = 0;</div>
<div style="text-align: justify;">
1156 do_sync = 0;</div>
<div style="text-align: justify;">
1157 kexec_flags = KEXEC_ON_CRASH;</div>
<div style="text-align: justify;">
1158 break;</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
1187 if ((kexec_flags & KEXEC_ON_CRASH) && !is_crashkernel_mem_reserved()) {</div>
<div style="text-align: justify;">
1188 printf("Memory for crashkernel is not reserved\n");</div>
<div style="text-align: justify;">
1189 printf("Please reserve memory by passing ");</div>
<div style="text-align: justify;">
1190 printf("\"crashkernel=X@Y\" parameter to the kernel\n");</div>
<div style="text-align: justify;">
1191 die("Then try loading kdump kernel\n");</div>
<div style="text-align: justify;">
1192 }</div>
<div style="text-align: justify;">
1193</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
1201 fileind = optind;</div>
<div style="text-align: justify;">
1202 /* Reset getopt for the next pass; called in other source modules */</div>
<div style="text-align: justify;">
1203 opterr = 1;</div>
<div style="text-align: justify;">
1204 optind = 1;</div>
<div style="text-align: justify;">
1205</div>
<div style="text-align: justify;">
1206 result = arch_process_options(argc, argv);</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
1227 if (do_load && (result == 0)) {</div>
<div style="text-align: justify;">
1228 result = my_load(type, fileind, argc, argv, kexec_flags, entry);</div>
<div style="text-align: justify;">
1229 }</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
main->my_load:</div>
<div style="text-align: justify;">
648 /*</div>
<div style="text-align: justify;">
649 * Load the new kernel</div>
<div style="text-align: justify;">
650 */</div>
<div style="text-align: justify;">
651 static int my_load(const char *type, int fileind, int argc, char **argv,</div>
<div style="text-align: justify;">
652 unsigned long kexec_flags, void *entry)</div>
<div style="text-align: justify;">
653 {</div>
<div style="text-align: justify;">
654 char *kernel;</div>
<div style="text-align: justify;">
655 char *kernel_buf;</div>
<div style="text-align: justify;">
656 off_t kernel_size;</div>
<div style="text-align: justify;">
657 int i = 0;</div>
<div style="text-align: justify;">
658 int result;</div>
<div style="text-align: justify;">
659 <b>struct kexec_info info</b>;</div>
<div style="text-align: justify;">
660 long native_arch;</div>
<div style="text-align: justify;">
661 int guess_only = 0;</div>
<div style="text-align: justify;">
662</div>
<div style="text-align: justify;">
<b> 663 memset(&info, 0, sizeof(info));</b></div>
<div style="text-align: justify;">
<b> 664 info.segment = NULL;</b></div>
<div style="text-align: justify;">
<b> 665 info.nr_segments = 0;</b></div>
<div style="text-align: justify;">
<b> 666 info.entry = NULL;</b></div>
<div style="text-align: justify;">
<b> 667 info.backup_start = 0;</b></div>
<div style="text-align: justify;">
<b> 668 info.kexec_flags = kexec_flags;</b></div>
<div style="text-align: justify;">
669</div>
<div style="text-align: justify;">
670 result = 0;</div>
<div style="text-align: justify;">
671 if (argc - fileind <= 0) {</div>
<div style="text-align: justify;">
672 fprintf(stderr, "No kernel specified\n");</div>
<div style="text-align: justify;">
673 usage();</div>
<div style="text-align: justify;">
674 return -1;</div>
<div style="text-align: justify;">
675 }</div>
<div style="text-align: justify;">
676 kernel = argv[fileind];</div>
<div style="text-align: justify;">
677 /* slurp in the input kernel */</div>
<div style="text-align: justify;">
<b> 678 kernel_buf = slurp_decompress_file(kernel, &kernel_size);</b></div>
<div style="text-align: justify;">
679</div>
<div style="text-align: justify;">
680 dbgprintf("kernel: %p kernel_size: %lx\n",</div>
<div style="text-align: justify;">
681 kernel_buf, kernel_size);</div>
<div style="text-align: justify;">
682</div>
<div style="text-align: justify;">
683 if (<b>get_memory_ranges(&info.memory_range, &info.memory_ranges,</b></div>
<div style="text-align: justify;">
<b> 684 info.kexec_flags</b>) < 0 || info.memory_ranges == 0) {</div>
<div style="text-align: justify;">
685 fprintf(stderr, "Could not get memory layout\n");</div>
<div style="text-align: justify;">
686 return -1;</div>
<div style="text-align: justify;">
687 }</div>
<div style="text-align: justify;">
688 /* if a kernel type was specified, try to honor it */</div>
<div style="text-align: justify;">
689 if (type) {</div>
<div style="text-align: justify;">
690 for (i = 0; i < file_types; i++) {</div>
<div style="text-align: justify;">
691 if (strcmp(type, file_type[i].name) == 0)</div>
<div style="text-align: justify;">
692 break;</div>
<div style="text-align: justify;">
693 }</div>
<div style="text-align: justify;">
694 if (i == file_types) {</div>
<div style="text-align: justify;">
695 fprintf(stderr, "Unsupported kernel type %s\n", type);</div>
<div style="text-align: justify;">
696 return -1;</div>
<div style="text-align: justify;">
697 } else {</div>
<div style="text-align: justify;">
698 /* make sure our file is really of that type */</div>
<div style="text-align: justify;">
699 if (file_type[i].probe(kernel_buf, kernel_size) < 0)</div>
<div style="text-align: justify;">
700 guess_only = 1;</div>
<div style="text-align: justify;">
701 }</div>
<div style="text-align: justify;">
702 }</div>
<div style="text-align: justify;">
<b> 703 if (!type || guess_only) {</b></div>
<div style="text-align: justify;">
704 for (i = 0; i < file_types; i++) {</div>
<div style="text-align: justify;">
705 if (file_type[i].probe(kernel_buf, kernel_size) >= 0)</div>
<div style="text-align: justify;">
706 break;</div>
<div style="text-align: justify;">
707 }</div>
<div style="text-align: justify;">
708 if (i == file_types) {</div>
<div style="text-align: justify;">
709 fprintf(stderr, "Cannot determine the file type "</div>
<div style="text-align: justify;">
710 "of %s\n", kernel);</div>
<div style="text-align: justify;">
711 return -1;</div>
<div style="text-align: justify;">
712 } else {</div>
<div style="text-align: justify;">
713 if (guess_only) {</div>
<div style="text-align: justify;">
714 fprintf(stderr, "Wrong file type %s, "</div>
<div style="text-align: justify;">
715 "file matches type %s\n",</div>
<div style="text-align: justify;">
716 type, file_type[i].name);</div>
<div style="text-align: justify;">
717 return -1;</div>
<div style="text-align: justify;">
718 }</div>
<div style="text-align: justify;">
719 }</div>
<div style="text-align: justify;">
720 }</div>
<div style="text-align: justify;">
721 /* Figure out our native architecture before load */</div>
<div style="text-align: justify;">
722 native_arch = physical_arch();</div>
<div style="text-align: justify;">
723 if (native_arch < 0) {</div>
<div style="text-align: justify;">
724 return -1;</div>
<div style="text-align: justify;">
725 }</div>
<div style="text-align: justify;">
<b> 726 info.kexec_flags |= native_arch;</b><b>//Now there are two flags, </b>KEXEC_ON_CRASH|KEXEC_ARCH_ARM</div>
<div style="text-align: justify;">
727</div>
<div style="text-align: justify;">
728 result = file_type[i].load(argc, argv, kernel_buf, kernel_size, &info);//0: success</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load:</div>
<div style="text-align: justify;">
218 int zImage_arm_load(int argc, char **argv, const char *buf, off_t len,</div>
<div style="text-align: justify;">
219 struct kexec_info *info)</div>
<div style="text-align: justify;">
220 {</div>
<div style="text-align: justify;">
221 unsigned long base;</div>
<div style="text-align: justify;">
222 unsigned int atag_offset = 0x1000; /* 4k offset from memory start */</div>
<div style="text-align: justify;">
223 unsigned int offset = 0x8000; /* 32k offset from memory start */</div>
<div style="text-align: justify;">
224 const char *command_line;</div>
<div style="text-align: justify;">
225 char *modified_cmdline = NULL;</div>
<div style="text-align: justify;">
226 off_t command_line_len;</div>
<div style="text-align: justify;">
227 const char *ramdisk;</div>
<div style="text-align: justify;">
228 char *ramdisk_buf;</div>
<div style="text-align: justify;">
229 int opt;</div>
<div style="text-align: justify;">
230 int use_atags;</div>
<div style="text-align: justify;">
231 char *dtb_buf;</div>
<div style="text-align: justify;">
232 off_t dtb_length;</div>
<div style="text-align: justify;">
233 char *dtb_file;</div>
<div style="text-align: justify;">
234 off_t dtb_offset;</div>
<div style="text-align: justify;">
235 dbgprintf("buf:%p, len:%lx\n",buf,len);</div>
<div style="text-align: justify;">
236 /* See options.h -- add any more there, too. */</div>
<div style="text-align: justify;">
237 static const struct option options[] = {</div>
<div style="text-align: justify;">
238 KEXEC_ARCH_OPTIONS</div>
<div style="text-align: justify;">
239 { "command-line", 1, 0, OPT_APPEND },</div>
<div style="text-align: justify;">
240 { "append", 1, 0, OPT_APPEND },</div>
<div style="text-align: justify;">
241 { "initrd", 1, 0, OPT_RAMDISK },</div>
<div style="text-align: justify;">
242 { "ramdisk", 1, 0, OPT_RAMDISK },</div>
<div style="text-align: justify;">
243 { "dtb", 1, 0, OPT_DTB },</div>
<div style="text-align: justify;">
244 { "atags", 0, 0, OPT_ATAGS },</div>
<div style="text-align: justify;">
245 { 0, 0, 0, 0 },</div>
<div style="text-align: justify;">
246 };</div>
<div style="text-align: justify;">
247 static const char short_options[] = KEXEC_ARCH_OPT_STR "a:r:";</div>
<div style="text-align: justify;">
248</div>
<div style="text-align: justify;">
249 /*</div>
<div style="text-align: justify;">
250 * Parse the command line arguments</div>
<div style="text-align: justify;">
251 */</div>
<div style="text-align: justify;">
252 command_line = 0;</div>
<div style="text-align: justify;">
253 command_line_len = 0;</div>
<div style="text-align: justify;">
254 ramdisk = 0;</div>
<div style="text-align: justify;">
255 ramdisk_buf = 0;</div>
<div style="text-align: justify;">
256 initrd_size = 0;</div>
<div style="text-align: justify;">
257 use_atags = 0;</div>
<div style="text-align: justify;">
258 dtb_file = NULL;</div>
<div style="text-align: justify;">
259 while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1) {</div>
<div style="text-align: justify;">
260 switch(opt) {</div>
<div style="text-align: justify;">
261 default:</div>
<div style="text-align: justify;">
262 /* Ignore core options */</div>
<div style="text-align: justify;">
263 if (opt < OPT_ARCH_MAX) {</div>
<div style="text-align: justify;">
264 break;</div>
<div style="text-align: justify;">
265 }</div>
<div style="text-align: justify;">
266 case '?':</div>
<div style="text-align: justify;">
267 usage();</div>
<div style="text-align: justify;">
268 return -1;</div>
<div style="text-align: justify;">
<b>269 case OPT_APPEND:</b></div>
<div style="text-align: justify;">
<b>270 command_line = optarg;</b></div>
<div style="text-align: justify;">
<b>271 break;</b></div>
<div style="text-align: justify;">
272 case OPT_RAMDISK:</div>
<div style="text-align: justify;">
273 ramdisk = optarg;</div>
<div style="text-align: justify;">
274 break;</div>
<div style="text-align: justify;">
275 case OPT_DTB:</div>
<div style="text-align: justify;">
276 dtb_file = optarg;</div>
<div style="text-align: justify;">
277 break;</div>
<div style="text-align: justify;">
<b>278 case OPT_ATAGS:</b></div>
<div style="text-align: justify;">
<b>279 use_atags = 1;</b></div>
<div style="text-align: justify;">
<b>280 break;</b></div>
<div style="text-align: justify;">
281 }</div>
<div style="text-align: justify;">
282 }</div>
<div style="text-align: justify;">
283</div>
<div style="text-align: justify;">
284 if (use_atags && dtb_file) {</div>
<div style="text-align: justify;">
285 fprintf(stderr, "You can only use ATAGs if you don't specify a "</div>
<div style="text-align: justify;">
286 "dtb file.\n");</div>
<div style="text-align: justify;">
287 return -1;</div>
<div style="text-align: justify;">
288 }</div>
<div style="text-align: justify;">
289</div>
<div style="text-align: justify;">
<b>290 if (command_line) {</b></div>
<div style="text-align: justify;">
<b>291 command_line_len = strlen(command_line) + 1;</b></div>
<div style="text-align: justify;">
<b>292 if (command_line_len > COMMAND_LINE_SIZE)</b></div>
<div style="text-align: justify;">
<b>293 command_line_len = COMMAND_LINE_SIZE;</b></div>
<div style="text-align: justify;">
<b>294 }</b></div>
<div style="text-align: justify;">
295 if (ramdisk) {//Read init ramdisk to memory.</div>
<div style="text-align: justify;">
296 ramdisk_buf = slurp_file(ramdisk, &initrd_size);</div>
<div style="text-align: justify;">
297 }</div>
<div style="text-align: justify;">
298</div>
<div style="text-align: justify;">
299 /*</div>
<div style="text-align: justify;">
300 * If we are loading a dump capture kernel, we need to update kernel</div>
<div style="text-align: justify;">
301 * command line and also add some additional segments.</div>
<div style="text-align: justify;">
302 */</div>
<div style="text-align: justify;">
303 if (info->kexec_flags & KEXEC_ON_CRASH) {</div>
<div style="text-align: justify;">
304 uint64_t start, end;</div>
<div style="text-align: justify;">
305</div>
<div style="text-align: justify;">
306 modified_cmdline = xmalloc(COMMAND_LINE_SIZE);</div>
<div style="text-align: justify;">
307 if (!modified_cmdline)</div>
<div style="text-align: justify;">
308 return -1;</div>
<div style="text-align: justify;">
309</div>
<div style="text-align: justify;">
310 if (command_line) {</div>
<div style="text-align: justify;">
311 (void) strncpy(modified_cmdline, command_line,</div>
<div style="text-align: justify;">
312 COMMAND_LINE_SIZE);</div>
<div style="text-align: justify;">
313 modified_cmdline[COMMAND_LINE_SIZE - 1] = '\0';</div>
<div style="text-align: justify;">
314 }</div>
<div style="text-align: justify;">
315</div>
<div style="text-align: justify;">
316 if (load_crashdump_segments(info, modified_cmdline) < 0) {</div>
<div style="text-align: justify;">
317 free(modified_cmdline);</div>
<div style="text-align: justify;">
318 return -1;</div>
<div style="text-align: justify;">
319 }</div>
<div style="text-align: justify;">
320</div>
<div style="text-align: justify;">
321 command_line = modified_cmdline;</div>
<div style="text-align: justify;">
322 command_line_len = strlen(command_line) + 1;</div>
<div style="text-align: justify;">
323</div>
<div style="text-align: justify;">
324 /*</div>
<div style="text-align: justify;">
325 * We put the dump capture kernel at the start of crashkernel</div>
<div style="text-align: justify;">
326 * reserved memory.</div>
<div style="text-align: justify;">
327 */</div>
<div style="text-align: justify;">
328 if (parse_iomem_single("Crash kernel\n", &start, &end)) {</div>
<div style="text-align: justify;">
329 /*</div>
<div style="text-align: justify;">
330 * No crash kernel memory reserved. We cannot do more</div>
<div style="text-align: justify;">
331 * but just bail out.</div>
<div style="text-align: justify;">
332 */</div>
<div style="text-align: justify;">
333 return -1;</div>
<div style="text-align: justify;">
334 }</div>
<div style="text-align: justify;">
335 base = start;</div>
<div style="text-align: justify;">
336 } else {</div>
<div style="text-align: justify;">
337 dbgprintf("len:%lx,offset:%ux,len+offset:%lx\n",len,offset,len+offset);</div>
<div style="text-align: justify;">
338 base = locate_hole(info,len+offset,0,0,ULONG_MAX,INT_MAX);</div>
<div style="text-align: justify;">
339 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
303~314,321~322 handle the cmdline. 335 should be paid more attention. Now let's look at 316Line.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments</div>
<div style="text-align: justify;">
255 /**</div>
<div style="text-align: justify;">
256 * load_crashdump_segments() - loads additional segments needed for kdump</div>
<div style="text-align: justify;">
257 * @info: kexec info structure</div>
<div style="text-align: justify;">
258 * @mod_cmdline: kernel command line</div>
<div style="text-align: justify;">
259 *</div>
<div style="text-align: justify;">
260 * This function loads additional segments which are needed for the dump capture</div>
<div style="text-align: justify;">
261 * kernel. It also updates kernel command line passed in @mod_cmdline to have</div>
<div style="text-align: justify;">
262 * right parameters for the dump capture kernel.</div>
<div style="text-align: justify;">
263 *</div>
<div style="text-align: justify;">
264 * Return %0 in case of success and %-1 in case of error.</div>
<div style="text-align: justify;">
265 */</div>
<div style="text-align: justify;">
266 int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline)</div>
<div style="text-align: justify;">
267 {</div>
<div style="text-align: justify;">
268 unsigned long elfcorehdr;</div>
<div style="text-align: justify;">
269 unsigned long bufsz;</div>
<div style="text-align: justify;">
270 void *buf;</div>
<div style="text-align: justify;">
271 int err;</div>
<div style="text-align: justify;">
272</div>
<div style="text-align: justify;">
273 /*</div>
<div style="text-align: justify;">
274 * First fetch all the memory (RAM) ranges that we are going to pass to</div>
<div style="text-align: justify;">
275 * the crashdump kernel during panic.</div>
<div style="text-align: justify;">
276 */</div>
<div style="text-align: justify;">
277 err = crash_get_memory_ranges();</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments->crash_get_memory_ranges</div>
<div style="text-align: justify;">
155 static int crash_get_memory_ranges(void)</div>
<div style="text-align: justify;">
156 {</div>
<div style="text-align: justify;">
157 /*</div>
<div style="text-align: justify;">
158 * First read all memory regions that can be considered as</div>
<div style="text-align: justify;">
159 * system memory including the crash area.</div>
<div style="text-align: justify;">
160 */</div>
<div style="text-align: justify;">
161 kexec_iomem_for_each_line(NULL, crash_range_callback, NULL);</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
167</div>
<div style="text-align: justify;">
168 /*</div>
<div style="text-align: justify;">
169 * Exclude memory reserved for crashkernel (this may result a split memory</div>
<div style="text-align: justify;">
170 * region).</div>
<div style="text-align: justify;">
171 */</div>
<div style="text-align: justify;">
172 crash_exclude_range();</div>
<div style="text-align: justify;">
173</div>
<div style="text-align: justify;">
174 /*</div>
<div style="text-align: justify;">
175 * Make sure that the memory regions are sorted.</div>
<div style="text-align: justify;">
176 */</div>
<div style="text-align: justify;">
177 qsort(usablemem_rgns.ranges, usablemem_rgns.size,</div>
<div style="text-align: justify;">
178 sizeof(*usablemem_rgns.ranges), range_cmp);</div>
<div style="text-align: justify;">
179</div>
<div style="text-align: justify;">
180 return 0;</div>
<div style="text-align: justify;">
181 }</div>
<div style="text-align: justify;">
Line161, kexec_iomem_for_each_line() will:</div>
</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><div>
<span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span></div>
1. Lookup "System RAM" in /proc/iomem, and stored at usablemem_rgns.ranges. Also usablemem_rgns.size++.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;">2. Lookup "Crash kernel" in /proc/iomem, and stored at crash_reserved_mem.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /><ol style="margin-bottom: 0pt; margin-left: 18pt; margin-top: 0pt;">
</ol>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Then, Line 172, crash_exclude_range() will delete crash_reserved_mem range from "System RAM" range in usablemem_rgns.ranges. So, usablemem_rgns will splite two ranges.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments (cont'd)</div>
<div style="text-align: justify;">
281 /*</div>
<div style="text-align: justify;">
282 * Now that we have memory regions sorted, we can use first memory</div>
<div style="text-align: justify;">
283 * region as PHYS_OFFSET.</div>
<div style="text-align: justify;">
284 */</div>
<div style="text-align: justify;">
285 phys_offset = usablemem_rgns.ranges->start;</div>
<div style="text-align: justify;">
286 dbgprintf("phys_offset: %#lx\n", phys_offset);</div>
<div style="text-align: justify;">
287</div>
<div style="text-align: justify;">
288 err = crash_create_elf32_headers(info, &elf_info,</div>
<div style="text-align: justify;">
289 usablemem_rgns.ranges,</div>
<div style="text-align: justify;">
290 usablemem_rgns.size, &buf, &bufsz,</div>
<div style="text-align: justify;">
291 ELF_CORE_HEADER_ALIGN);</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> crash_create_elf32_headers\(FUNC\)</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
elf_info is defined below.</div>
<div style="padding-left: 10pt; text-align: justify;">
48 static struct crash_elf_info elf_info = {</div>
<div style="padding-left: 10pt; text-align: justify;">
49 .class = ELFCLASS32,</div>
<div style="padding-left: 10pt; text-align: justify;">
50 .data = ELFDATA2LSB,</div>
<div style="padding-left: 10pt; text-align: justify;">
51 .machine = EM_ARM,</div>
<div style="padding-left: 10pt; text-align: justify;">
52 .page_offset = PAGE_OFFSET,</div>
<div style="padding-left: 10pt; text-align: justify;">
53 };</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
29 int FUNC(struct kexec_info *info,</div>
<div style="text-align: justify;">
30 struct crash_elf_info *elf_info,</div>
<div style="text-align: justify;">
31 struct memory_range *range, int ranges,</div>
<div style="text-align: justify;">
32 void **buf, unsigned long *size, unsigned long align) //buf and size is for return.</div>
<div style="text-align: justify;">
33 {</div>
<div style="text-align: justify;">
34 EHDR *elf;</div>
<div style="text-align: justify;">
35 PHDR *phdr;</div>
<div style="text-align: justify;">
36 int i;</div>
<div style="text-align: justify;">
37 unsigned long sz;</div>
<div style="text-align: justify;">
38 char *bufp;</div>
<div style="text-align: justify;">
39 long int nr_cpus = 0;</div>
<div style="text-align: justify;">
40 uint64_t notes_addr, notes_len;</div>
<div style="text-align: justify;">
41 uint64_t vmcoreinfo_addr, vmcoreinfo_len;</div>
<div style="text-align: justify;">
42 int has_vmcoreinfo = 0;</div>
<div style="text-align: justify;">
43 int (*get_note_info)(int cpu, uint64_t *addr, uint64_t *len);</div>
<div style="text-align: justify;">
44</div>
<div style="text-align: justify;">
45 if (xen_present())</div>
<div style="text-align: justify;">
46 nr_cpus = xen_get_nr_phys_cpus();</div>
<div style="text-align: justify;">
47 else</div>
<div style="text-align: justify;">
48 nr_cpus = sysconf(_SC_NPROCESSORS_CONF);</div>
<div style="text-align: justify;">
49</div>
<div style="text-align: justify;">
50 if (nr_cpus < 0) {</div>
<div style="text-align: justify;">
51 return -1;</div>
<div style="text-align: justify;">
52 }</div>
<div style="text-align: justify;">
53</div>
<div style="text-align: justify;">
54 if (xen_present()) {</div>
<div style="text-align: justify;">
55 if (!get_xen_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len))</div>
<div style="text-align: justify;">
56 has_vmcoreinfo = 1;</div>
<div style="text-align: justify;">
57 } else</div>
<div style="text-align: justify;">
58 if (!get_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len))</div>
<div style="text-align: justify;">
59 has_vmcoreinfo = 1;</div>
<div style="text-align: justify;">
get_kernel_vmcoreinfo get vmcore information's address and length from /sys/kernel/vmcoreinfo. Let's see the detail below.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> crash_create_elf32_headers\(FUNC\)-> get_kernel_vmcoreinfo</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
139 /* Returns the physical address of start of crash notes buffer for a kernel. */</div>
<div style="text-align: justify;">
140 int get_kernel_vmcoreinfo(uint64_t *addr, uint64_t *len)</div>
<div style="text-align: justify;">
141 {</div>
<div style="text-align: justify;">
142 return get_vmcoreinfo("/sys/kernel/vmcoreinfo", addr, len);</div>
<div style="text-align: justify;">
143 }</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> crash_create_elf32_headers\(FUNC\)-> get_kernel_vmcoreinfo-> get_vmcoreinfo</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
113 static int get_vmcoreinfo(const char *kdump_info, uint64_t *addr, uint64_t *len)</div>
<div style="text-align: justify;">
114 {</div>
<div style="text-align: justify;">
115 char line[MAX_LINE];</div>
<div style="text-align: justify;">
116 int count;</div>
<div style="text-align: justify;">
117 FILE *fp;</div>
<div style="text-align: justify;">
118 unsigned long long temp, temp2;</div>
<div style="text-align: justify;">
119</div>
<div style="text-align: justify;">
120 *addr = 0;</div>
<div style="text-align: justify;">
121 *len = 0;</div>
<div style="text-align: justify;">
122</div>
<div style="text-align: justify;">
123 if (!(fp = fopen(kdump_info, "r")))</div>
<div style="text-align: justify;">
124 return -1;</div>
<div style="text-align: justify;">
125</div>
<div style="text-align: justify;">
126 if (!fgets(line, sizeof(line), fp))</div>
<div style="text-align: justify;">
127 die("Cannot parse %s: %s\n", kdump_info, strerror(errno));</div>
<div style="text-align: justify;">
128 count = sscanf(line, "%Lx %Lx", &temp, &temp2);</div>
<div style="text-align: justify;">
129 if (count != 2)</div>
<div style="text-align: justify;">
130 die("Cannot parse %s: %s\n", kdump_info, strerror(errno));</div>
<div style="text-align: justify;">
131</div>
<div style="text-align: justify;">
132 *addr = (uint64_t) temp;</div>
<div style="text-align: justify;">
133 *len = (uint64_t) temp2;</div>
<div style="text-align: justify;">
134</div>
<div style="text-align: justify;">
135 fclose(fp);</div>
<div style="text-align: justify;">
136 return 0;</div>
<div style="text-align: justify;">
137 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> crash_create_elf32_headers\(FUNC\) (cont'd)</div>
<div style="text-align: justify;">
61 sz = sizeof(EHDR) + (nr_cpus + has_vmcoreinfo) * sizeof(PHDR) +</div>
<div style="text-align: justify;">
62 ranges * sizeof(PHDR);</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
EHDR is `struct Elf32_Ehdr`. PHDR is program header. Now there are two memory ranges, and vmcore-info, So sz= sizeof(EHDR)+sizeof(PHDR)+2*sizeof(PHDR).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> crash_create_elf32_headers\(FUNC\) (cont'd)</div>
<div style="text-align: justify;">
63</div>
<div style="text-align: justify;">
64 /*</div>
<div style="text-align: justify;">
65 * Certain architectures such as x86_64 and ia64 require a separate</div>
<div style="text-align: justify;">
66 * PT_LOAD program header for the kernel. This is controlled through</div>
<div style="text-align: justify;">
67 * elf_info->kern_size.</div>
<div style="text-align: justify;">
68 *</div>
<div style="text-align: justify;">
69 * The separate PT_LOAD program header is required either because the</div>
<div style="text-align: justify;">
70 * kernel is mapped at a different location than the rest of the</div>
<div style="text-align: justify;">
71 * physical memory or because we need to support relocatable kernels.</div>
<div style="text-align: justify;">
72 * Or both as on x86_64.</div>
<div style="text-align: justify;">
73 *</div>
<div style="text-align: justify;">
74 * In the relocatable kernel case this PT_LOAD segment is used to tell</div>
<div style="text-align: justify;">
75 * where the kernel was actually loaded which may be different from</div>
<div style="text-align: justify;">
76 * the load address present in the vmlinux file.</div>
<div style="text-align: justify;">
77 *</div>
<div style="text-align: justify;">
78 * The extra kernel PT_LOAD program header results in a vmcore file</div>
<div style="text-align: justify;">
79 * which is larger than the size of the physical memory. This is</div>
<div style="text-align: justify;">
80 * because the memory for the kernel is present both in the kernel</div>
<div style="text-align: justify;">
81 * PT_LOAD program header and in the physical RAM program headers.</div>
<div style="text-align: justify;">
82 */</div>
<div style="text-align: justify;">
83</div>
<div style="text-align: justify;">
84 if (elf_info->kern_size && !xen_present()) {</div>
<div style="text-align: justify;">
85 sz += sizeof(PHDR);</div>
<div style="text-align: justify;">
86 }</div>
<div style="text-align: justify;">
elf_info->kern_size is zero here. Next, will fill elf header.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
99 sz = _ALIGN(sz, align);</div>
<div style="text-align: justify;">
100</div>
<div style="text-align: justify;">
101 bufp = xmalloc(sz);</div>
<div style="text-align: justify;">
102 memset(bufp, 0, sz);</div>
<div style="text-align: justify;">
103</div>
<div style="text-align: justify;">
104 *buf = bufp;</div>
<div style="text-align: justify;">
105 *size = sz;</div>
<div style="text-align: justify;">
106</div>
<div style="text-align: justify;">
107 /* Setup ELF Header*/</div>
<div style="text-align: justify;">
108 elf = (EHDR *) bufp;</div>
<div style="text-align: justify;">
109 bufp += sizeof(EHDR);</div>
<div style="text-align: justify;">
110 memcpy(elf->e_ident, ELFMAG, SELFMAG);</div>
<div style="text-align: justify;">
111 elf->e_ident[EI_CLASS] = elf_info->class;</div>
<div style="text-align: justify;">
112 elf->e_ident[EI_DATA] = elf_info->data;</div>
<div style="text-align: justify;">
113 elf->e_ident[EI_VERSION]= EV_CURRENT;</div>
<div style="text-align: justify;">
114 elf->e_ident[EI_OSABI] = ELFOSABI_NONE;</div>
<div style="text-align: justify;">
115 memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD);</div>
<div style="text-align: justify;">
116 elf->e_type = ET_CORE;</div>
<div style="text-align: justify;">
117 elf->e_machine = crash_architecture(elf_info);</div>
<div style="text-align: justify;">
118 elf->e_version = EV_CURRENT;</div>
<div style="text-align: justify;">
119 elf->e_entry = 0;</div>
<div style="text-align: justify;">
120 elf->e_phoff = sizeof(EHDR);</div>
<div style="text-align: justify;">
121 elf->e_shoff = 0;</div>
<div style="text-align: justify;">
122 elf->e_flags = 0;</div>
<div style="text-align: justify;">
123 elf->e_ehsize = sizeof(EHDR);</div>
<div style="text-align: justify;">
124 elf->e_phentsize= sizeof(PHDR);</div>
<div style="text-align: justify;">
125 elf->e_phnum = 0;</div>
<div style="text-align: justify;">
126 elf->e_shentsize= 0;</div>
<div style="text-align: justify;">
127 elf->e_shnum = 0;</div>
<div style="text-align: justify;">
128 elf->e_shstrndx = 0;</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Then, get crash notes information by get_crash_notes_per_cpu. This function will read "/sys/devices/system/cpu/cpu0/crash_notes" and get address. Meanwhile, the length is 1024.</div>
<div style="text-align: justify;">
after get the cpu crash notes, then fill to corresponding program header.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
141 for (i = 0; i < nr_cpus; i++) {</div>
<div style="text-align: justify;">
142 if (get_note_info(i, &notes_addr, &notes_len) < 0) {</div>
<div style="text-align: justify;">
143 /* This cpu is not present. Skip it. */</div>
<div style="text-align: justify;">
144 continue;</div>
<div style="text-align: justify;">
145 }</div>
<div style="text-align: justify;">
146</div>
<div style="text-align: justify;">
147 phdr = (PHDR *) bufp;</div>
<div style="text-align: justify;">
148 bufp += sizeof(PHDR);</div>
<div style="text-align: justify;">
149 phdr->p_type = PT_NOTE;</div>
<div style="text-align: justify;">
150 phdr->p_flags = 0;</div>
<div style="text-align: justify;">
151 phdr->p_offset = phdr->p_paddr = notes_addr;</div>
<div style="text-align: justify;">
152 phdr->p_vaddr = 0;</div>
<div style="text-align: justify;">
153 phdr->p_filesz = phdr->p_memsz = notes_len;</div>
<div style="text-align: justify;">
154 /* Do we need any alignment of segments? */</div>
<div style="text-align: justify;">
155 phdr->p_align = 0;</div>
<div style="text-align: justify;">
156</div>
<div style="text-align: justify;">
157 /* Increment number of program headers. */</div>
<div style="text-align: justify;">
158 (elf->e_phnum)++;</div>
<div style="text-align: justify;">
159 dbgprintf_phdr("Elf header", phdr);</div>
<div style="text-align: justify;">
160 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
After get cpu crash notes, it's turn to be vmcoreinfo. It get above and stored vmcoreinfo_addr and vmcoreinfo_len.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
162 if (has_vmcoreinfo && !(info->kexec_flags & KEXEC_PRESERVE_CONTEXT)) {</div>
<div style="text-align: justify;">
163 phdr = (PHDR *) bufp;</div>
<div style="text-align: justify;">
164 bufp += sizeof(PHDR);</div>
<div style="text-align: justify;">
165 phdr->p_type = PT_NOTE;</div>
<div style="text-align: justify;">
166 phdr->p_flags = 0;</div>
<div style="text-align: justify;">
167 phdr->p_offset = phdr->p_paddr = vmcoreinfo_addr;</div>
<div style="text-align: justify;">
168 phdr->p_vaddr = 0;</div>
<div style="text-align: justify;">
169 phdr->p_filesz = phdr->p_memsz = vmcoreinfo_len;</div>
<div style="text-align: justify;">
170 /* Do we need any alignment of segments? */</div>
<div style="text-align: justify;">
171 phdr->p_align = 0;</div>
<div style="text-align: justify;">
172</div>
<div style="text-align: justify;">
173 (elf->e_phnum)++;</div>
<div style="text-align: justify;">
174 dbgprintf_phdr("vmcoreinfo header", phdr);</div>
<div style="text-align: justify;">
175 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Then, it's the time to set program header of Memory ranges.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
194 /* Setup PT_LOAD type program header for every system RAM chunk.</div>
<div style="text-align: justify;">
195 * A seprate program header for Backup Region*/</div>
<div style="text-align: justify;">
196 for (i = 0; i < ranges; i++, range++) {</div>
<div style="text-align: justify;">
197 unsigned long long mstart, mend;</div>
<div style="text-align: justify;">
198 if (range->type != RANGE_RAM)</div>
<div style="text-align: justify;">
199 continue;</div>
<div style="text-align: justify;">
200 mstart = range->start;</div>
<div style="text-align: justify;">
201 mend = range->end;</div>
<div style="text-align: justify;">
202 if (!mstart && !mend)</div>
<div style="text-align: justify;">
203 continue;</div>
<div style="text-align: justify;">
204 phdr = (PHDR *) bufp;</div>
<div style="text-align: justify;">
205 bufp += sizeof(PHDR);</div>
<div style="text-align: justify;">
206 phdr->p_type = PT_LOAD;</div>
<div style="text-align: justify;">
207 phdr->p_flags = <span style="color: red;">PF_R|PF_W|PF_X</span>;</div>
<div style="text-align: justify;">
208 phdr->p_offset = <span style="color: red;">mstart</span>;</div>
<div style="text-align: justify;">
209</div>
<div style="text-align: justify;">
210 if (mstart == info->backup_src_start</div>
<div style="text-align: justify;">
211 && (mend - mstart + 1) == info->backup_src_size)</div>
<div style="text-align: justify;">
212 phdr->p_offset = info->backup_start;</div>
<div style="text-align: justify;">
213</div>
<div style="text-align: justify;">
214 /* We already prepared the header for kernel text. Map</div>
<div style="text-align: justify;">
215 * rest of the memory segments to kernel linearly mapped</div>
<div style="text-align: justify;">
216 * memory region.</div>
<div style="text-align: justify;">
217 */</div>
<div style="text-align: justify;">
218 phdr->p_paddr = <span style="color: red;">mstart</span>;</div>
<div style="text-align: justify;">
219 phdr->p_vaddr = <b>phys_to_virt(elf_info, mstart);</b><b>//</b> paddr + elf_info->page_offset - phys_offset</div>
<div style="text-align: justify;">
220 phdr->p_filesz = phdr->p_memsz = mend - mstart + 1;</div>
<div style="text-align: justify;">
221 /* Do we need any alignment of segments? */</div>
<div style="text-align: justify;">
222 phdr->p_align = 0;</div>
<div style="text-align: justify;">
223</div>
<div style="text-align: justify;">
224 /* HIGMEM has a virtual address of -1 */</div>
<div style="text-align: justify;">
225</div>
<div style="text-align: justify;">
226 if (elf_info->lowmem_limit</div>
<div style="text-align: justify;">
227 && (mend > (elf_info->lowmem_limit - 1)))</div>
<div style="text-align: justify;">
228 phdr->p_vaddr = -1;</div>
<div style="text-align: justify;">
229</div>
<div style="text-align: justify;">
230 /* Increment number of program headers. */</div>
<div style="text-align: justify;">
231 (elf->e_phnum)++;</div>
<div style="text-align: justify;">
232 dbgprintf_phdr("Elf header", phdr);</div>
<div style="text-align: justify;">
233 }</div>
<div style="text-align: justify;">
234 return 0;</div>
<div style="text-align: justify;">
235 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Now, in load_crashdump_segments function, we has allocated ELF core header @ the end of the memory area reserved for the crashkernel.<br />
<br /></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
From that, elf file is composed of </div>
</span><span style="font-family: Calibri, sans-serif; font-size: x-small;">1. elf header</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;">2. crash notes program header for pre CPU (</span><b style="font-family: Calibri, sans-serif; font-size: small;">Note</b><span style="font-family: Calibri, sans-serif; font-size: x-small;">: if you processor contains Hyper-Threading technology, the core is not equal to physical core. But, here, it's logic core. Get more information by </span><a href="http://en.wikipedia.org/wiki/Hyper-threading" style="font-family: Calibri, sans-serif; font-size: small;"><span style="color: blue;"><u>http://en.wikipedia.org/wiki/Hyper-threading</u></span></a><span style="font-family: Calibri, sans-serif; font-size: x-small;">. By the way, for ARM processor, Hyper-Threading technology is not be applied). crash notes's stored address could be get by reading "/sys/devices/system/cpu/cpuN/crash_notes"</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;">3. vmcore info program header. vmcore info stored address could be get by reading /sys/kernel/vmcoreinfo.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Calibri, sans-serif; font-size: x-small;">4. memory range program header. This is got from usablemem_rgns parameters.</span><span style="font-family: Calibri, sans-serif; font-size: x-small;"><br /><ol style="margin-bottom: 0pt; margin-left: 18pt; margin-top: 0pt;">
</ol>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments (cont'd)</div>
<div style="text-align: justify;">
292 if (err)</div>
<div style="text-align: justify;">
293 return err;</div>
<div style="text-align: justify;">
294</div>
<div style="text-align: justify;">
295 /*</div>
<div style="text-align: justify;">
296 * We allocate ELF core header from the end of the memory area reserved</div>
<div style="text-align: justify;">
297 * for the crashkernel. We align the header to SECTION_SIZE (which is</div>
<div style="text-align: justify;">
298 * 1MB) so that available memory passed in kernel command line will be</div>
<div style="text-align: justify;">
299 * aligned to 1MB. This is because kernel create_mapping() wants memory</div>
<div style="text-align: justify;">
300 * regions to be aligned to SECTION_SIZE.</div>
<div style="text-align: justify;">
301 */</div>
<div style="text-align: justify;">
302 elfcorehdr = add_buffer_phys_virt(info, buf, bufsz, bufsz, 1 << 20,</div>
<div style="text-align: justify;">
303 crash_reserved_mem.start,</div>
<div style="text-align: justify;">
304 crash_reserved_mem.end, -1, 0);</div>
<div style="text-align: justify;">
305</div>
<div style="text-align: justify;">
306 dbgprintf("elfcorehdr: %#lx\n", elfcorehdr);</div>
<div style="text-align: justify;">
307 cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr);</div>
<div style="text-align: justify;">
308</div>
<div style="text-align: justify;">
309 /*</div>
<div style="text-align: justify;">
310 * Add 'mem=size' parameter to dump capture kernel command line. This</div>
<div style="text-align: justify;">
311 * prevents the dump capture kernel from using any other memory regions</div>
<div style="text-align: justify;">
312 * which belong to the primary kernel.</div>
<div style="text-align: justify;">
313 */</div>
<div style="text-align: justify;">
314 cmdline_add_mem(mod_cmdline, elfcorehdr - crash_reserved_mem.start);</div>
<div style="text-align: justify;">
315</div>
<div style="text-align: justify;">
316 dump_memory_ranges();</div>
<div style="text-align: justify;">
317 dbgprintf("kernel command line: \"%s\"\n", mod_cmdline);</div>
<div style="text-align: justify;">
318</div>
<div style="text-align: justify;">
319 return 0;</div>
<div style="text-align: justify;">
320 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
302Line get elfcorehdr, which is pre-allocated for elf header and program header. Then add the "elfcorehdr=X" to cmdline, which is used to capture kernel. 314Line will add "mem=Z" to cmdline. The Z is equal to (Crash reserved memory size - 1MB).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load-> load_crashdump_segments-> add_buffer_phys_virt</div>
<div style="text-align: justify;">
First, let's walk through the parameters. info is initialized in my_load. buf and bufsz is the elf header, program header buffer. memsz here is same to bufsz. buf_align is assigned by 1MB. buf_min and buf_max is reserved memory range. buf_end is -1, phys is 0.</div>
<div style="text-align: justify;">
357 unsigned long add_buffer_phys_virt(struct kexec_info *info,</div>
<div style="text-align: justify;">
358 const void *buf, unsigned long bufsz, unsigned long memsz,</div>
<div style="text-align: justify;">
359 unsigned long buf_align, unsigned long buf_min, unsigned long buf_max,</div>
<div style="text-align: justify;">
360 int buf_end, int phys)</div>
<div style="text-align: justify;">
361 {</div>
<div style="text-align: justify;">
362 unsigned long base;</div>
<div style="text-align: justify;">
363 int result;</div>
<div style="text-align: justify;">
364 int pagesize;</div>
<div style="text-align: justify;">
365</div>
<div style="text-align: justify;">
366 result = sort_segments(info);</div>
<div style="text-align: justify;">
367 if (result < 0) {</div>
<div style="text-align: justify;">
368 die("sort_segments failed\n");</div>
<div style="text-align: justify;">
369 }</div>
<div style="text-align: justify;">
370</div>
<div style="text-align: justify;">
371 /* Round memsz up to a multiple of pagesize */</div>
<div style="text-align: justify;">
372 pagesize = getpagesize();</div>
<div style="text-align: justify;">
373 memsz = _ALIGN(memsz, pagesize);</div>
<div style="text-align: justify;">
374</div>
<div style="text-align: justify;">
375 base = locate_hole(info, memsz, buf_align, buf_min, buf_max, buf_end);</div>
<div style="text-align: justify;">
376 if (base == ULONG_MAX) {</div>
<div style="text-align: justify;">
377 die("locate_hole failed\n");</div>
<div style="text-align: justify;">
378 }</div>
<div style="text-align: justify;">
379</div>
<div style="text-align: justify;">
380 <b> add_segment_phys_virt</b>(info, buf, bufsz, base, memsz, phys);</div>
<div style="text-align: justify;">
381 return base;</div>
<div style="text-align: justify;">
382 }</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Here base is the last 1MB of reserved memory from crashkernel=x@y. Then add the segment to info by add_segment_phys_virt on Line 380. </div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
main->my_load->zImage_arm_load(cont'd)</div>
<div style="text-align: justify;">
From 335Line, base is the start of reserved memory range.</div>
<div style="text-align: justify;">
340</div>
<div style="text-align: justify;">
341 if (base == ULONG_MAX)</div>
<div style="text-align: justify;">
342 return -1;</div>
<div style="text-align: justify;">
343</div>
<div style="text-align: justify;">
344 /* assume the maximum kernel compression ratio is 4,</div>
<div style="text-align: justify;">
345 * and just to be safe, place ramdisk after that</div>
<div style="text-align: justify;">
346 */</div>
<div style="text-align: justify;">
347 initrd_base = base + len * 4;</div>
<div style="text-align: justify;">
348</div>
<div style="text-align: justify;">
349 if (use_atags) {</div>
<div style="text-align: justify;">
350 /*</div>
<div style="text-align: justify;">
351 * use ATAGs from /proc/atags</div>
<div style="text-align: justify;">
352 */</div>
<div style="text-align: justify;">
353 if (atag_arm_load(info, base + atag_offset,</div>
<div style="text-align: justify;">
354 command_line, command_line_len,</div>
<div style="text-align: justify;">
355 ramdisk_buf, initrd_size, initrd_base) == -1)</div>
<div style="text-align: justify;">
356 return -1;</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
427 add_segment(info, buf, len, base + offset, len);</div>
<div style="text-align: justify;">
428</div>
<div style="text-align: justify;">
429 info->entry = (void*)base + offset;</div>
<div style="text-align: justify;">
430</div>
<div style="text-align: justify;">
431 return 0;</div>
<div style="text-align: justify;">
432 }</div>
<div style="text-align: justify;">
<br />
Now we should deal with the parameter "-atags" by atag_arm_load reading /proc/atags @353. Then add the atags to segments in info. At the end, add the kernel buffer into segments.</div>
<div style="text-align: justify;">
main->my_load:</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
777</div>
<div style="text-align: justify;">
778 result = kexec_load(</div>
<div style="text-align: justify;">
779 info.entry, info.nr_segments, info.segment, info.kexec_flags);</div>
<div style="text-align: justify;">
…</div>
<div style="text-align: justify;">
788 return result;</div>
<div style="text-align: justify;">
789 }<br />
<br /></div>
<div style="text-align: justify;">
After fill the elf, then add elf information, atags and kernel buffer to segments. Then pass the segments to sys_kexec_load system call.<br />
<br />
<br />
<div class="MsoNormal">
<span lang="EN-US">Now, we have analyzed the routine of kexec
loading in user space. Next, the kernel space code is analysed.<o:p></o:p></span></div>
<div class="MsoNormal">
<br />
<h3>
3. Routine of Kernel Mode</h3>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">In kexec-tools source code, info->entry
is be filled by crash memory reserved adding 32KB offset. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">218 int zImage_arm_load(int argc, char
**argv, const char *buf, off_t len,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">219
struct kexec_info *info)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">328 if
(parse_iomem_single("Crash kernel\n", &start, &end)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">329 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">330 * No crash kernel
memory reserved. We cannot do more<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">331 * but just bail out.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">332 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">333 return -1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">334 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">335 base = start;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">427
add_segment(info, buf, len, base + offset, len);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">428<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">429
print_segment(stderr,info);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">430
info->entry = (void*)base + offset;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">For our case, the crashkernel =64MB@98MB.
So, info->entry=64MB+32KB. If we use kdump as “kexec -p”, the flags is KEXEC_ARCH_ARM|
KEXEC_ON_CRASH. <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">The parameter segments is allocated by
kexec-tools for recording atags, ramdisk, kernel and elfcorehdr. Add atags,ramdisk,kernel
buffer to info->segment[] call add_segment(). add elfcorehdr call
add_segment_phys_virt(). The picture below illustrate the segments.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisiYK8lZlOWzXJKR89stYLgAsiuvMr6BFCtb4qQk0Yq4Uh36KIFrIxdJGhBJDZOIXX9-ewTMop4w2i0WWcInw48HCc3Oaag9UqEI4a53Q5kYun-MlW3XDvcGWhwzyA9OOSV53NUEo9IK8/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisiYK8lZlOWzXJKR89stYLgAsiuvMr6BFCtb4qQk0Yq4Uh36KIFrIxdJGhBJDZOIXX9-ewTMop4w2i0WWcInw48HCc3Oaag9UqEI4a53Q5kYun-MlW3XDvcGWhwzyA9OOSV53NUEo9IK8/s320/Untitled.png" width="320" /></a></div>
<div class="MsoNormal">
<span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">941 SYSCALL_DEFINE4(kexec_load, unsigned
long, entry, unsigned long, nr_segments,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 942 struct kexec_segment __user *,
segments, unsigned long, flags)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 943
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 944
struct kimage **dest_image, *image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 945
int result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> …<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 969
image = NULL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 970
result = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 971<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 972
/* Because we write directly to the reserved memory<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 973
* region when loading crash kernels we need a mutex here to<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 974
* prevent multiple crash kernels
from attempting to load<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 975
* simultaneously, and to prevent a crash kernel from loading<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 976
* over the top of a in use crash kernel.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 977
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 978
* KISS: always take the mutex.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 979
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 980
if (!mutex_trylock(&kexec_mutex))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 981 return -EBUSY;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 984
if (flags & KEXEC_ON_CRASH)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 985 dest_image =
&kexec_crash_image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 986
if (nr_segments > 0) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 987
unsigned long i;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 988<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 989 /* Loading another kernel to
reboot into */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> …<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 994 else if (flags &
KEXEC_ON_CRASH) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 995 /* Free any current
crash dump kernel before<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 996 * we corrupt it.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 997 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 998
kimage_free(xchg(&kexec_crash_image, NULL));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 999 result =
kimage_crash_alloc(&image, entry,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1000
nr_segments, segments);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1001
crash_map_reserved_pages();//Null here.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1002 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1003 if (result)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1004 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1005<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1006 if (flags & KEXEC_PRESERVE_CONTEXT)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1007
image->preserve_context = 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1008 result =
machine_kexec_prepare(image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1009 if (result)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1010 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1011<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1012 for (i = 0; i < nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1013 result =
kimage_load_segment(image, &image->segment[i]);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1014 if (result)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1015 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1016 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1017 kimage_terminate(image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1018 if (flags &
KEXEC_ON_CRASH)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1019
crash_unmap_reserved_pages();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1020
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1021
/* Install the new kernel, and
Uninstall the old */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1022
image = xchg(dest_image, image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1023<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1024 out:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1025
mutex_unlock(&kexec_mutex);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1026
kimage_free(image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1027<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1028
return result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1029 }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">kexec_load-> kimage_crash_alloc<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">In this
function, There are three steps below.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="color: red; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-font-kerning: 0pt;">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="color: red; mso-font-kerning: 0pt;">Allocate and initializing a struct kimage object.(Corresponding with Line 999)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="color: red; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-font-kerning: 0pt;">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="color: red; mso-font-kerning: 0pt;">Allocate a control page(The control page will be filled when soft reboot happens.)(Corresponding
with Line 999)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="color: red; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-font-kerning: 0pt;">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US" style="color: red; mso-font-kerning: 0pt;">Copy buffer recording in info->segment[] to memory reserved range(1012~1016Line).<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> 272 static int kimage_crash_alloc(struct
kimage **rimage, unsigned long entry,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 273 unsigned long
nr_segments,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 274 struct
kexec_segment __user *segments)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 275 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 276
int result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 277
struct kimage *image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 278
unsigned long i;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 279<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 280
image = NULL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 281
/* Verify we have a valid entry point */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 282
if ((entry < crashk_res.start) || (entry > crashk_res.end)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 283 result = -EADDRNOTAVAIL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 284 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 285
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 286<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 287
/* Allocate and initialize a controlling structure */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 288
result = do_kimage_alloc(&image, entry, nr_segments, segments);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 289
if (result)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 290 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 291<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 292
/* Enable the special crash kernel control page<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 293
* allocation policy.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 294
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 295
image->control_page = crashk_res.start;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 296
image->type = KEXEC_TYPE_CRASH;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 297<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 298
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 299
* Verify we have good destination addresses. Normally<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 300
* the caller is responsible for making certain we don't<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 301
* attempt to load the new image into invalid or reserved<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 302
* areas of RAM. But crash kernels
are preloaded into a<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 303
* reserved area of ram. We must
ensure the addresses<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 304
* are in the reserved area otherwise preloading the<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 305
* kernel could corrupt things.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 306
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 307
result = -EADDRNOTAVAIL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 308
for (i = 0; i < nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 309 unsigned long mstart, mend;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 310<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 311 mstart = image->segment[i].mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 312 mend = mstart +
image->segment[i].memsz - 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 313 /* Ensure we are within the
crash kernel limits */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 314 if ((mstart <
crashk_res.start) || (mend > crashk_res.end))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 315 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 316
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 317<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 318
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 319
* Find a location for the control code buffer, and add<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 320
* the vector of segments so that it's pages will also be<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 321
* counted as destination pages.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 322
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 323
result = -ENOMEM;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 324
image->control_code_page = kimage_alloc_control_pages(image,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 325
get_order(KEXEC_CONTROL_PAGE_SIZE));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 326
if (!image->control_code_page) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 327 printk(KERN_ERR "Could
not allocate control_code_buffer\n");<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 328 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 329
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 330<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 331
result = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 332 out:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 333
if (result == 0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 334 *rimage = image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 335
else<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 336 kfree(image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 337<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 338
return result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 339 }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">288Line
allocate a struct kimage object and initialize it.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Line 308~316 will
check segment’s memsz range. It won’t be out of crashkernel reserved memory
range.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">kexec_load-> kimage_crash_alloc-> do_kimage_alloc<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">118 static int do_kimage_alloc(struct
kimage **rimage, unsigned long entry,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 119 unsigned long
nr_segments,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 120 struct
kexec_segment __user *segments)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 121
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 122
size_t segment_bytes;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 123
struct kimage *image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 124
unsigned long i;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 125
int result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 126<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 127
/* Allocate a controlling structure */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 128
result = -ENOMEM;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 129
image = kzalloc(sizeof(*image), GFP_KERNEL);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 130
if (!image)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 131 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 132<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 133
image->head = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 134
image->entry =
&image->head;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 135
image->last_entry = &image->head;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 136
image->control_page = ~0; /* By default this does not apply */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 137
image->start = entry;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 138
image->type = KEXEC_TYPE_DEFAULT;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 139<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 140
/* Initialize the list of control pages */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 141
INIT_LIST_HEAD(&image->control_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 142<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 143
/* Initialize the list of destination pages */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 144
INIT_LIST_HEAD(&image->dest_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 145<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 146
/* Initialize the list of unusable pages */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 147
INIT_LIST_HEAD(&image->unuseable_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 148<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 149
/* Read in the segments */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 150
image->nr_segments = nr_segments;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 151
segment_bytes = nr_segments * sizeof(*segments);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 152
result = copy_from_user(image->segment, segments, segment_bytes);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 153
if (result) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 154 result = -EFAULT;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 155 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 156
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 157<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 158
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 159
* Verify we have good destination addresses. The caller is<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 160
* responsible for making certain we don't attempt to load<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 161
* the new image into invalid or reserved areas of RAM. This<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 162
* just verifies it is an address we can use.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 163
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 164
* Since the kernel does everything in page size chunks ensure<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 165
* the destination addresses are page aligned. Too many<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 166
* special cases crop of when we don't do this. The most<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 167
* insidious is getting overlapping destination addresses<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 168
* simply because addresses are changed to page size<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 169
* granularity.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 170
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 171
result = -EADDRNOTAVAIL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 172
for (i = 0; i < nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 173 unsigned long mstart, mend;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 174<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 175 mstart =
image->segment[i].mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 176 mend = mstart + image->segment[i].memsz;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 177 if ((mstart & ~PAGE_MASK)
|| (mend & ~PAGE_MASK))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 178 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 179 if (mend >=
KEXEC_DESTINATION_MEMORY_LIMIT)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 180 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 181
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 182<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 183
/* Verify our destination addresses do not overlap.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 184
* If we alloed overlapping destination addresses<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 185
* through very weird things can happen with no<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 186
* easy explanation as one segment stops on another.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 187
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 188
result = -EINVAL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 189
for (i = 0; i < nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 190 unsigned long mstart, mend;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 191
unsigned long j;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 192<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 193 mstart =
image->segment[i].mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 194 mend = mstart + image->segment[i].memsz;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 195 for (j = 0; j < i; j++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 196 unsigned long pstart,
pend;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 197 pstart =
image->segment[j].mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 198 pend = pstart + image->segment[j].memsz;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 199 /* Do the segments
overlap ? */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 200 if ((mend > pstart)
&& (mstart < pend))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 201 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 202 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 203
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 204<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 205
/* Ensure our buffer sizes are strictly less than<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 206
* our memory sizes. This should
always be the case,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 207
* and it is easier to check up front than to be surprised<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 208
* later on.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 209
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 210
result = -EINVAL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 211
for (i = 0; i < nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 212 if (image->segment[i].bufsz
> image->segment[i].memsz)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 213 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 214
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 215<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 216
result = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 217
out:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 218
if (result == 0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 219 *rimage = image;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 220
else<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 221 kfree(image);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 222<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 223
return result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 224<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 225
}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">kexec_load-> kimage_crash_alloc->kimage_alloc_control_pages-> kimage_alloc_crash_control_pages<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">There function complete step 2, which lists
before.<o:p></o:p></span><br />
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US">467 static struct page
*kimage_alloc_crash_control_pages(struct kimage *image,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 468
unsigned int order)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 469
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 470
/* Control pages are special, they are the intermediaries<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 471
* that are needed while we copy the rest of the pages<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 472
* to their final resting place.
As such they must<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 473
* not conflict with either the destination addresses<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 474
* or memory the kernel is already using.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 475
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 476
* Control pages are also the only pags we must allocate<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 477
* when loading a crash kernel.
All of the other pages<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 478
* are specified by the segments and we just memcpy<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 479
* into them directly.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 480
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 481
* The only case where we really need more than one of<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 482
* these are for architectures where we cannot disable<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 483
* the MMU and must instead generate an identity mapped<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 484
* page table for all of the memory.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 485
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 486
* Given the low demand this implements a very simple<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 487 * allocator that finds the first hole
of the appropriate<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 488
* size in the reserved memory region, and allocates all<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 489
* of the memory up to and including the hole.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 490
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 491
unsigned long hole_start, hole_end, size;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 492
struct page *pages;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 493<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 494
pages = NULL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 495
size = (1 << order) << PAGE_SHIFT;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 496
hole_start = (image->control_page + (size - 1)) & ~(size - 1);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 497
hole_end = hole_start + size - 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 498 while (hole_end <= crashk_res.end)
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 499 unsigned long i;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 500<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 501 if (hole_end >
KEXEC_CRASH_CONTROL_MEMORY_LIMIT)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 502 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 503 if (hole_end > crashk_res.end)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 504 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 505 /* See if I overlap any of the
segments */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 506 for (i = 0; i <
image->nr_segments; i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 507 unsigned long mstart,
mend;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 508<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 509 mstart =
image->segment[i].mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 510 mend = mstart + image->segment[i].memsz - 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 511 if ((hole_end >=
mstart) && (hole_start <= mend)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 512 /* Advance the hole to the end of the segment
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 513 hole_start =
(mend + (size - 1)) & ~(size - 1);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 514 hole_end = hole_start + size - 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 515 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 516 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 517 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 518 /* If I don't overlap any
segments I have found my hole! */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 519 if (i ==
image->nr_segments) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 520 pages =
pfn_to_page(hole_start >> PAGE_SHIFT);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 521 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 522 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 523
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 524
if (pages)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 525 image->control_page =
hole_end;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 526<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 527
return pages;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 528
}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Next, we will copy the buffer to memory
which is allocated among crash memory reserved range. Complete step 3, which
lists before.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">kexec_load ->kimage_load_segment->kimage_load_crash_segment:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 845
static int kimage_load_crash_segment(struct kimage *image,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 846 struct
kexec_segment *segment)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 847
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 848
/* For crash dumps kernels we simply copy the data from<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 849
* user space to it's destination.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 850
* We do things a page at a time for the sake of kmap.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 851
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 852
unsigned long maddr;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 853
unsigned long ubytes, mbytes;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 854
int result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 855
unsigned char __user *buf;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 856<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 857 result = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 858
buf = segment->buf;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 859
ubytes = segment->bufsz;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 860
mbytes = segment->memsz;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 861
maddr = segment->mem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 862 while (mbytes) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 863 struct page *page;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 864 char *ptr;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 865 size_t uchunk, mchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 866<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 867 page = pfn_to_page(maddr
>> PAGE_SHIFT);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 868 if (!page) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 869 result = -ENOMEM;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 870 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 871 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 872 ptr = kmap(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 873 ptr += maddr & ~PAGE_MASK;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 874 mchunk = PAGE_SIZE - (maddr
& ~PAGE_MASK);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 875 if (mchunk > mbytes)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 876 mchunk = mbytes;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 877<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 878 uchunk = mchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 879 if (uchunk > ubytes) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 880 uchunk = ubytes;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 881 /* Zero the trailing
part of the page */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 882 memset(ptr + uchunk,
0, mchunk - uchunk);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 883 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 884 result = copy_from_user(ptr,
buf, uchunk);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 885 kexec_flush_icache_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 886 kunmap(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 887 if (result) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 888
result = -EFAULT;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 889 goto out;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 890 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 891 ubytes -= uchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 892 maddr += mchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 893 buf += mchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 894 mbytes -= mchunk;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 895
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 896
out:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 897
return result;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 898
}</span></div>
</div>
<div style="text-align: justify;">
</div>
</span> hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路399号 邮政编码: 20120331.2042481 121.5886909999999331.2041951 121.58861199999993 31.204301100000002 121.58876999999993tag:blogger.com,1999:blog-2141466325280539355.post-72675197003718123142013-04-11T23:58:00.001-07:002013-04-12T05:40:40.937-07:00How to boot Linux on Pandaboard<div class="entry-content">
<h1>
</h1>
<span style="color: red;">Better display @ </span><a href="http://tek-life.github.io/blog/how-to-boot-linux-on-pandaboard/">http://tek-life.github.io/blog/how-to-boot-linux-on-pandaboard/</a><br />
<h2>
Pandaboard Specification</h2>
<ul>
<li>CPU:OMAP4460 ES1.1</li>
<li>Board: OMAP4 Panda rev B2</li>
<li>DRAM: 1 GiB</li>
</ul>
Detailed information about Pandaboard could be found <a href="http://pandaboard.org/content/pandaboard-es">here</a>.<br />
<h2>
Serial Port Settings</h2>
<ul>
<li>BAUD RATE: 115200</li>
<li>DATA: 8bit</li>
<li>PARITY: none</li>
<li>STOP: 1bit</li>
<li>FLOW CONTROL: none</li>
</ul>
<h2>
Preparation of SD card</h2>
For pandaboard, SD Card should have 2 partitions at least: one for the boot and one for the rootfs. A script below could make partitions for SD Card.<br />
<pre><code>$wget <a href="http://git.openembedded.org/openembedded/plain/contrib/angstrom/omap3-mkcard.sh">http://git.openembedded.org/openembedded/plain/contrib/angstrom/omap3-mkcard.sh</a> </code></pre>
<pre><code>$chmod 777 omap3-mkcard.sh </code></pre>
<pre><code>$./omap3-mkcard.sh /dev/sdb </code></pre>
After running the script, then mount the SD card partitions on host to verify:<br />
<pre><code>$mkdir /tmp/mmc1 </code></pre>
<pre><code>$mkdir /tmp/mmc2 </code></pre>
<pre><code>$sudo mount /dev/sdb1 /tmp/mmc1 </code></pre>
<pre><code>$sudo mount /dev/sdb2 /tmp/mmc2 </code></pre>
<h2>
Preparation for UBoot</h2>
<pre><code>$git clone git://<a href="http://git.denx.de/u-boot.git">git.denx.de/u-boot.git</a> </code></pre>
<pre><code>$git checkout -b v2013.4 v2013.4 <set ARCH and CROSS_COMPILE environment variables> </code></pre>
<pre><code>$make omap4_panda_config </code></pre>
<pre><code>$make </code></pre>
That will generate the following files:<br />
<pre><code>MLO u-boot.img u-boot.bin </code></pre>
<code>MLO</code> is the x-loader binary with a header containing the memory location to load the file to and the size of the file.<br />
<code>u-boot.img</code> is exactly the same as <code>u-boot.bin</code>, but a u-boot header has been appended (using mkimage). Nowadays , with current version of u-boot it is expected to use u-boot.img, as this filename is hardcoded in the initial bootloader (MLO).<br />
So now you can copy the 2 files (MLO and u-boot.img) onto the SD boot partition.<br />
<pre><code>$cp MLO u-boot.img /media/boot </code></pre>
Linaro is also maintaining its own stable version of u-boot which is being used for Linaro and Canonical releases. The git tree is located <a href="http://git.linaro.org/gitweb?p=boot/u-boot-linaro-stable.git">here</a>.<br />
More information about uboot could be found <a href="http://elinux.org/PandaBoard_ES_uboot_howto">here</a>.<br />
<h2>
Preparation for Linux Kernel</h2>
<pre><code>$git clone git://<a href="http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git">git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git</a>
$git checkout -b v3.4 v3.4
$make omap2plus_defconfig
$make uImage </code></pre>
The default <code>omap2plus_defconfig</code> is the kernel configuration that works on any OMAP2+ boards. There are default settings, that you might want to change. For example, you can enable USB EHCI and that will bring support for the USB host on the Panda. Of course there are tons of other settings that you can change.<br />
<pre><code>$cp arch/arm/boot/uImage /media/boot </code></pre>
<h2>
Preparation for File System</h2>
Get file system from below URL.<br />
<pre><code><a href="http://cdimage.ubuntu.com/ubuntu-core/releases/12.04/release/ubuntu-core-12.04.1-core-armhf.tar.gz">http://cdimage.ubuntu.com/ubuntu-core/releases/12.04/release/ubuntu-core-12.04.1-core-armhf.tar.gz</a> </code></pre>
Untar the filesystem onto the SDCard:<br />
<pre><code>$cd /media/rootfs
$sudo tar --numeric-owner ubuntu-core-12.04.1-core-armhf.tar.gz </code></pre>
<h2>
Boot script for uBoot</h2>
Create the boot script file boot.script with the following content:<br />
<pre><code>fatload mmc 0:1 0x80000000 uImage
setenv bootargs rw vram=32M fixrtc mem=1G@0x80000000 root=/dev/mmcblk0p2 console=ttyO2,115200n8 rootwait
bootm 0x80000000 </code></pre>
Generate the boot.scr file:<br />
<pre><code>mkimage -A arm -T script -C none -n "Boot Image" -d boot.script boot.scr </code></pre>
Copy the boot.scr to SD card boot partition.<br />
<pre><code>cp boot.scr /media/boot </code></pre>
<strong>NOTE</strong>: the boot.scr is not necessary, you <strong><em>could</em></strong> input this script to uBoot shell by hand.<br />
Now, everything is ok. It't time to plug in the SD card to pandaboard.<br />
<h2>
More…</h2>
<ol>
<li>OMAP™ 4 Platform, <a href="http://www.ti.com/general/docs/wtbu/wtbugencontent.tsp?templateId=6123&navigationId=11988&contentId=4638&DCMP=wtbu_omap&HQS=Other+OT+omapwireless#omap4">http://www.ti.com/general/docs/wtbu/wtbugencontent.tsp?templateId=6123&navigationId=11988&contentId=4638&DCMP=wtbu_omap&HQS=Other+OT+omapwireless#omap4</a></li>
<li><a href="http://omappedia.org/wiki/Minimal-FS">http://omappedia.org/wiki/Minimal-FS</a></li>
</ol>
</div>
<span class="byline author vcard"></span> hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-55344743013219629292013-03-19T03:58:00.000-07:002013-04-12T05:50:25.093-07:00How to deal with VIPT alias? – Page colour<br />
<span style="font-weight: normal;"><span style="color: red;">为获得更好的阅读体验,请移步:</span></span><a href="http://tek-life.github.io/blog/how-to-deal-with-vipt-alias-page-color/">http://tek-life.github.io/blog/how-to-deal-with-vipt-alias-page-color/</a><br />
<h2 style="background-color: #f8f8f8; background-image: none; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
Agenda</h2>
<ol style="background-color: #f8f8f8; border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1.5em 1.3em; padding: 0px; vertical-align: baseline;">
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Introduction</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Cache aliases issue for VIPT</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">How to solve alias</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Implement in Linux</li>
</ol>
<h2 style="background-image: url(data:image/png; background-position: 0% 0%; background-repeat: repeat no-repeat; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
Introduction</h2>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
VIPT是Cache的一种Policy。如果<code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">Cache_Size/numbers_of_way > Page_Size/Cache_Line_Size</code>就会产生alias问题。</div>
<h2 style="background-image: url(data:image/png; background-position: 0% 0%; background-repeat: repeat no-repeat; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
Cache aliases issue for VIPT</h2>
<h3 style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 1.3em; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
何谓alias</h3>
<blockquote style="border-left-color: rgba(170, 170, 170, 0.498039); border-left-style: solid; border-width: 0px 0px 0px 4px; color: #222222; font-family: Lato, sans-serif; font-size: 1.2em; font-style: italic; line-height: 1.5em; margin: 0px 0px 1.5em; padding: 0px 0px 0px 1.5em; position: relative; quotes: none; vertical-align: baseline;">
<div style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
If the same PA is mapped into the different VAs, they could have different virtual indexes and certainly has the same physical tags, so multiple cacheline might have data for the single PA.</div>
</blockquote>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
Reference From: http://mail-index.netbsd.org/port-sh3/2006/09/07/0000.html</div>
<h3 style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 1.3em; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
alias会造成什么问题</h3>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
由于相同的物理页在Cache中有多份拷贝,那么某一份拷贝更改而没有及时刷(<em style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">clean</em>)到Memory中,其他的Cache拷贝就不能获知其更改,而造成错误。</div>
<h2 style="background-image: url(data:image/png; background-position: 0% 0%; background-repeat: repeat no-repeat; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
How to solve alias issue</h2>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
解决alias问题的方法有以下三种<br />
1. 存在多VA映射的物理页的PTE(page table entry)中的属性全部设置为 uncacheable.<br />
2. flush cache<br />
3. 多VA映射相同的物理页,如果能让VA在索引Cache的时候,都索引到相同的Cache sets中,那就不会产生alias问题了(因为在Cache set中识别Cache是否命中是用Physical Address Tag)。</div>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
第一种uncacheable的方法让memory不进Cache缓存的方式不可取,因为会导致系统的性能急剧下降。<br />
第二种flush Cache的方法会需要系统程序员非常小心才可。<br />
第三种的方法被称之为page colour。本文重点介绍这种方法。</div>
<h3 style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 1.3em; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
理解 page colour</h3>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
举个例子来说明page colour。以PIPT/32KB/32Bytes/4-way VM中页面的大小是4KB为例。<br />
第0页所对应的Cache sets Index为0~127,第1页所对应的Cache Sets Index为128~255。有人将一个页所占用的Cache Sets称之为一个Cache Bin.<br />
该Cache的set Index一共为32KB/(32B * 4way)=2<sup style="border: 0px; display: inline-block; font-family: inherit; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 0; margin: 0px; padding: 0px; position: relative; top: -0.5em; vertical-align: baseline;">15</sup> / 2<sup style="border: 0px; display: inline-block; font-family: inherit; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 0; margin: 0px; padding: 0px; position: relative; top: -0.5em; vertical-align: baseline;">7</sup> = 2<sup style="border: 0px; display: inline-block; font-family: inherit; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 0; margin: 0px; padding: 0px; position: relative; top: -0.5em; vertical-align: baseline;">8</sup> 每个页所用的Sets为2<sup style="border: 0px; display: inline-block; font-family: inherit; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 0; margin: 0px; padding: 0px; position: relative; top: -0.5em; vertical-align: baseline;">7。因此,一共有两个Cache</sup> Bin. 第2个页和第0个页共用一个Cache Bin,第3个页和第0个页共用一个Cache Bin.依次类推:<br />
二进制索引第00,10,100,110,…的虚拟页面共用一个Cache Bin;第01,11,101,111,…的虚拟页面共用一个Cache Bin.<br />
由此,可以得到页面的索引最低为决定了页面放在哪个Cache Bin中。即,对于虚拟页面的Virtual Address来说,第13位既是决定了该页面放在哪个Cache Bin中。<br />
在页面的virtual address中决定该页面放在哪个Cache Bin的bit(s)称之为page colour. 在本例中,page colour位只有1位(第13位)。</div>
<h2 style="background-image: url(data:image/png; background-position: 0% 0%; background-repeat: repeat no-repeat; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
Implement in Linux</h2>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
在Linux中,利用page colour解决alias issue问题有两个地方。<br />
1. 分配零页面<br />
2. COW(copy-on-write)时拷贝页面。 这两个地方运用page colour来解决alias的核心思想就是内核态在操作物理页时,所使用的虚拟地址要和该物理页在用户空间虚拟地址的page colour位相同。在ARMV6的spec.中有所描述:</div>
<blockquote style="border-left-color: rgba(170, 170, 170, 0.498039); border-left-style: solid; border-width: 0px 0px 0px 4px; color: #222222; font-family: Lato, sans-serif; font-size: 1.2em; font-style: italic; line-height: 1.5em; margin: 0px 0px 1.5em; padding: 0px 0px 0px 1.5em; position: relative; quotes: none; vertical-align: baseline;">
<ul style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1.5em 1.3em; padding: 0px; vertical-align: baseline;">
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">If multiple virtual addresses are mapped onto the same physical addresses, then for all mappings bits [13:12] of the virtual address must be equal, and must also be equal to bits [13:12] of the physical address. The same physical address can be mapped by TLB entries of different page sizes. These can be 4KB, 64KB, or sections.</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">If all mappings to a physical address are of a page size equal to 4KB, the restriction that bits [13:12] of the virtual address must equal bits [13:12] of the physical address is not required. Bits [13:12] of all virtual address aliases must still be equal.</li>
</ul>
</blockquote>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
Reference From: DDI0406B.P1985.</div>
<h3 style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 1.3em; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
分配零页面</h3>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
kernel通过page fault给分配匿名页的时候,需要分配零页面。分配零页面运用page colour思想来解决VIPT alias问题的函数是:<code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">__alloc_zeroed_user_highpage-> clear_user_highpage->cpu_user.cpu_clear_user_highpage->v6_clear_user_highpage_aliasing</code></div>
<pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-color: #002b36; background-image: url(http://tek-life.github.com/images/noise.png?1363686921); background-position: 0% 0%; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(5, 35, 43); box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 1.45em; margin-bottom: 2.1em; overflow: auto; padding: 0.8em 1em; vertical-align: baseline;"><code style="border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">107 /*
108 * Clear the user page. We need to deal with the aliasing issues,
109 * so remap the kernel page into the same cache colour as the user
110 * page.
111 */
112 static void v6_clear_user_highpage_aliasing(struct page *page, unsigned long vaddr)
113 {
114 unsigned int offset = CACHE_COLOUR(vaddr);
115 unsigned long to = to_address + (offset << PAGE_SHIFT);
116
117 /* FIXME: not highmem safe */
118 discard_old_kernel_data(page_address(page));
119
120 /*
121 * Now clear the page using the same cache colour as
122 * the pages ultimate destination.
123 */
124 raw_spin_lock(&v6_lock);
125
126 set_pte_ext(TOP_PTE(to_address) + offset, pfn_pte(page_to_pfn(page), PAGE_KERNEL), 0);
127 flush_tlb_kernel_page(to);
128 clear_page((void *)to);
129
130 raw_spin_unlock(&v6_lock);
131 }
</code></pre>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
114~115行,根据用户空间虚拟地址设置内核区间虚拟地址的Page color位,然后通过128行的<code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">clear_page()</code>函数调用<code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">memset()</code>操作内核区间虚拟地址达到给物理页面清0的目的。</div>
<h3 style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 1.3em; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
COW时拷贝页面</h3>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
在发生COW时,内核需要操纵物理页面对应的内核区间地址帮助用户进程进行页面的拷贝。 <code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">cow_user_page->copy_user_highpage->__cpu_copy_user_highpage->cpu_user.cpu_copy_user_highpage->v6_copy_user_highpage_aliasing</code></div>
<pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-color: #002b36; background-image: url(http://tek-life.github.com/images/noise.png?1363686921); background-position: 0% 0%; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(5, 35, 43); box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 1.45em; margin-bottom: 2.1em; overflow: auto; padding: 0.8em 1em; vertical-align: baseline;"><code style="border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> 72 /*
73 * Copy the page, taking account of the cache colour.
74 */
75 static void v6_copy_user_highpage_aliasing(struct page *to,
76 struct page *from, unsigned long vaddr, struct vm_area_struct *vma)
77 {
78 unsigned int offset = CACHE_COLOUR(vaddr);
79 unsigned long kfrom, kto;
80
81 if (!test_and_set_bit(PG_dcache_clean, &from->flags))
82 __flush_dcache_page(page_mapping(from), from);
83
84 /* FIXME: not highmem safe */
85 discard_old_kernel_data(page_address(to));
86
87 /*
88 * Now copy the page using the same cache colour as the
89 * pages ultimate destination.
90 */
91 raw_spin_lock(&v6_lock);
92
93 set_pte_ext(TOP_PTE(from_address) + offset, pfn_pte(page_to_pfn(from), PAGE_KERNEL), 0);
94 set_pte_ext(TOP_PTE(to_address) + offset, pfn_pte(page_to_pfn(to), PAGE_KERNEL), 0);
95
96 kfrom = from_address + (offset << PAGE_SHIFT);
97 kto = to_address + (offset << PAGE_SHIFT);
98
99 flush_tlb_kernel_page(kfrom);
100 flush_tlb_kernel_page(kto);
101
102 copy_page((void *)kto, (void *)kfrom);
103
104 raw_spin_unlock(&v6_lock);
105 }
</code></pre>
<div style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; margin-bottom: 1em; padding: 0px; text-align: justify; vertical-align: baseline;">
kfrom和kto分别是内核虚拟地址的源地址和目的地址。他们具有相同的page colour。<code style="background-color: white; border-bottom-left-radius: 0.4em; border-bottom-right-radius: 0.4em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border: 1px solid rgb(221, 221, 221); color: #555555; display: inline-block; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.8em; font-style: inherit; font-variant: inherit; line-height: 1.5em; margin: -1px 0px; padding: 0px 0.3em; vertical-align: baseline;">copy_page</code>通过调用memcpy使kfrom对应的物理页的内容拷贝到kto中。</div>
<h2 style="background-image: url(data:image/png; background-position: 0% 0%; background-repeat: repeat no-repeat; border: 0px; color: #222222; font-family: Lato, sans-serif; font-weight: normal; line-height: 24px; margin: 0px 0px 1em; padding: 0.8em 0px 0px; text-rendering: optimizelegibility; vertical-align: baseline;">
Reference</h2>
<ol style="border: 0px; color: #222222; font-family: Lato, sans-serif; font-size: 16px; line-height: 24px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1.5em 1.3em; padding: 0px; vertical-align: baseline;">
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">ARMV7 Spec,DDI0406B,P1985.</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">http://mail-index.netbsd.org/port-sh3/2006/09/07/0000.html.</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">浅谈高端CPU Cache Page-Coloring,陈怀临.</li>
<li style="border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Page Colouring on ARMv6 (and a bit on ARMv7),http://blogs.arm.com/software-enablement/716-page-colouring-on-armv6-and-a-bit-on-armv7/</li>
</ol>
<br />
<ol>
</ol>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-54341509508429263372013-03-12T05:29:00.002-07:002013-03-12T05:33:21.657-07:00Cache Behaviour in Linux -- Cache Policy识别情景分析<span style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px;">Linux在boot的过程中判断cache policy的入口是cacheid_init().</span><br />
<pre style="background-color: #f9f9f9; color: #333333; font-family: monospace, serif; font-size: 14px; line-height: 22px; white-space: pre-wrap; word-wrap: break-word;"><code class="javascript" style="background-color: #2d2d2d; color: #cccccc; display: block; font-family: monospace, serif; font-size: 1em; margin-bottom: 0px; margin-top: 0px; padding: 0.5em;"><span class="number" style="color: #f99157; margin-top: 0px;"> 297</span> static <span class="keyword" style="color: #cc99cc;">void</span> __init cacheid_init(<span class="keyword" style="color: #cc99cc;">void</span>)
<span class="number" style="color: #f99157;">298</span> {
<span class="number" style="color: #f99157;">299</span> unsigned int cachetype = read_cpuid_cachetype();
<span class="number" style="color: #f99157;">300</span> unsigned int arch = cpu_architecture();
<span class="number" style="color: #f99157;">301</span>
<span class="number" style="color: #f99157;">302</span> <span class="keyword" style="color: #cc99cc;">if</span> (arch >= CPU_ARCH_ARMv6) {
<span class="number" style="color: #f99157;">303</span> <span class="keyword" style="color: #cc99cc;">if</span> ((cachetype & (<span class="number" style="color: #f99157;">7</span> << <span class="number" style="color: #f99157;">29</span>)) == <span class="number" style="color: #f99157;">4</span> << <span class="number" style="color: #f99157;">29</span>) {
<span class="number" style="color: #f99157;">304</span> <span class="comment" style="color: #999999;">/* ARMv7 register format */</span>
<span class="number" style="color: #f99157;">305</span> arch = CPU_ARCH_ARMv7;
<span class="number" style="color: #f99157;">306</span> cacheid = CACHEID_VIPT_NONALIASING;
<span class="number" style="color: #f99157;">307</span> <span class="keyword" style="color: #cc99cc;">switch</span> (cachetype & (<span class="number" style="color: #f99157;">3</span> << <span class="number" style="color: #f99157;">14</span>)) {
<span class="number" style="color: #f99157;">308</span> <span class="keyword" style="color: #cc99cc;">case</span> (<span class="number" style="color: #f99157;">1</span> << <span class="number" style="color: #f99157;">14</span>):
<span class="number" style="color: #f99157;">309</span> cacheid |= CACHEID_ASID_TAGGED;
<span class="number" style="color: #f99157;">310</span> <span class="keyword" style="color: #cc99cc;">break</span>;
<span class="number" style="color: #f99157;">311</span> <span class="keyword" style="color: #cc99cc;">case</span> (<span class="number" style="color: #f99157;">3</span> << <span class="number" style="color: #f99157;">14</span>):
<span class="number" style="color: #f99157;">312</span> cacheid |= CACHEID_PIPT;
<span class="number" style="color: #f99157;">313</span> <span class="keyword" style="color: #cc99cc;">break</span>;
<span class="number" style="color: #f99157;">314</span> }
<span class="number" style="color: #f99157;">315</span> } <span class="keyword" style="color: #cc99cc;">else</span> {
<span class="number" style="color: #f99157;">316</span> arch = CPU_ARCH_ARMv6;
<span class="number" style="color: #f99157;">317</span> <span class="keyword" style="color: #cc99cc;">if</span> (cachetype & (<span class="number" style="color: #f99157;">1</span> << <span class="number" style="color: #f99157;">23</span>))
<span class="number" style="color: #f99157;">318</span> cacheid = CACHEID_VIPT_ALIASING;
<span class="number" style="color: #f99157;">319</span> <span class="keyword" style="color: #cc99cc;">else</span>
<span class="number" style="color: #f99157;">320</span> cacheid = CACHEID_VIPT_NONALIASING;
<span class="number" style="color: #f99157;">321</span> }
<span class="number" style="color: #f99157;">322</span> <span class="keyword" style="color: #cc99cc;">if</span> (cpu_has_aliasing_icache(arch))
<span class="number" style="color: #f99157;">323</span> cacheid |= CACHEID_VIPT_I_ALIASING;
<span class="number" style="color: #f99157;">324</span> } <span class="keyword" style="color: #cc99cc;">else</span> {
<span class="number" style="color: #f99157;">325</span> cacheid = CACHEID_VIVT;
<span class="number" style="color: #f99157; margin-bottom: 0px;">326</span> }
</code></pre>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
303行,根据cache type register的第31位判断是否为ARMV7. 31-29位是100:代表ARM v7;000代表ARMV6.</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
判断ARMV7的ICache的Policy呢?307~313行便是做这部分工作。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
307行,比较cache type register中的第14和15位(0 based)。在V7的spec(P)中,该位写死了,其值为:10. 在PJ4C的spec中,其值是11,代表PIPT。(official v7 spec估计是笔误。)</div>
<blockquote style="border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 5px; color: #555555; font-family: sans-serif; font-size: 14px; line-height: 22px; margin: 1em 0px; padding: 0px 0px 0px 1em;">
<div style="font-size: 1em; margin-bottom: 1em;">
Level 1 instruction cache policy. Indicates the indexing and tagging policy for the L1 instruction cache. </div>
<div style="font-size: 1em; margin-bottom: 1em; margin-top: 1em;">
00 Reserved</div>
<div style="font-size: 1em; margin-bottom: 1em; margin-top: 1em;">
01 ASID-tagged Virtual Index, Virtual Tag (AIVIVT)</div>
<div style="font-size: 1em; margin-bottom: 1em; margin-top: 1em;">
10 Virtual Index, Physical Tag (VIPT)</div>
<div style="font-size: 1em; margin-top: 1em;">
11 Physical Index, Physical Tag (PIPT)</div>
</blockquote>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
引用自:DDI0406B.P1358.<br />
<br />
315~320是ARMv6的代码。根据其代码,可以看到V6的Dcache全部都是VIPT。那么,到底是否存在cache aliasing问题呢?看317行。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
317行根据第23位(0 based),来判断是否存在cache aliasing问题。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
如果存在cache aliasing问题,那么cacheid的值为CACHEID_VIPT_ALIASING. 若Cache存在aliasing问题,则会产生很多异常。例如:VA1和VA2同时mapping到PA上,VA1通过VIPT的policy到cache中的某些连续的sets中去hit页,VA2也通过VIPT的policy到cache中的某些连续的sets中去hit页,如果VA1和VA2在cache中的mapping不一样,就会造成:同一份物理页在cache中有两份copy的问题,这个问题造成的直接后果是:进程通过VA1修改的数据后,通过VA2并不能立即得到最新的数据。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
v6是如何解决这种问题的呢:</div>
<blockquote style="border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 5px; color: #555555; font-family: sans-serif; font-size: 14px; line-height: 22px; margin: 1em 0px; padding: 0px 0px 0px 1em;">
<ul style="margin-bottom: 0px; margin-top: 0px;">
<li style="margin-top: 0px;">If multiple virtual addresses are mapped onto the same physical addresses, then for all mappings bits [13:12] of the virtual address must be equal, and must also be equal to bits [13:12] of the physical address. The same physical address can be mapped by TLB entries of different page sizes. These can be 4KB, 64KB, or sections.</li>
<li style="margin-bottom: 0px;">If all mappings to a physical address are of a page size equal to 4KB, the restriction that bits [13:12] of the virtual address must equal bits [13:12] of the physical address is not required. Bits [13:12] of all virtual address aliases must still be equal.</li>
</ul>
</blockquote>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
引用自:DDI0406B.P1985.</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
即,v6的spec.要求映射同一块物理地址的虚拟地址,第13,12位必须相同(相同的page colour),这样,就保证了VA1和VA2在cache中的mapping是一样的。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
322行是判断ICache是否具有aliasing,其代码如下:</div>
<pre style="color: #333333; font-family: monospace, serif; font-size: 14px; line-height: 22px; white-space: pre-wrap; word-wrap: break-word;"><code class="javascript" style="background-color: #2d2d2d; color: #cccccc; display: block; font-family: monospace, serif; font-size: 1em; margin-bottom: 0px; margin-top: 0px; padding: 0.5em;"> <span class="number" style="color: #f99157; margin-top: 0px;">264</span> static int cpu_has_aliasing_icache(unsigned int arch)
<span class="number" style="color: #f99157;">265</span> {
<span class="number" style="color: #f99157;">266</span> int aliasing_icache;
<span class="number" style="color: #f99157;">267</span> unsigned int id_reg, num_sets, line_size;
<span class="number" style="color: #f99157;">268</span>
<span class="number" style="color: #f99157;">269</span> <span class="comment" style="color: #999999;">/* PIPT caches never alias. */</span>
<span class="number" style="color: #f99157;">270</span> <span class="keyword" style="color: #cc99cc;">if</span> (icache_is_pipt())
<span class="number" style="color: #f99157;">271</span> <span class="keyword" style="color: #cc99cc;">return</span> <span class="number" style="color: #f99157;">0</span>;
<span class="number" style="color: #f99157;">272</span>
<span class="number" style="color: #f99157;">273</span> <span class="comment" style="color: #999999;">/* arch specifies the register format */</span>
<span class="number" style="color: #f99157;">274</span> <span class="keyword" style="color: #cc99cc;">switch</span> (arch) {
<span class="number" style="color: #f99157;">275</span> <span class="keyword" style="color: #cc99cc;">case</span> CPU_ARCH_ARMv7:
<span class="number" style="color: #f99157;">276</span> asm(<span class="string" style="color: #99cc99;">"mcr p15, 2, %0, c0, c0, 0 @ set CSSELR"</span>
<span class="number" style="color: #f99157;">277</span> : <span class="comment" style="color: #999999;">/* No output operands */</span>
<span class="number" style="color: #f99157;">278</span> : <span class="string" style="color: #99cc99;">"r"</span> (<span class="number" style="color: #f99157;">1</span>));
<span class="number" style="color: #f99157;">279</span> isb();
<span class="number" style="color: #f99157;">280</span> asm(<span class="string" style="color: #99cc99;">"mrc p15, 1, %0, c0, c0, 0 @ read CCSIDR"</span>
<span class="number" style="color: #f99157;">281</span> : <span class="string" style="color: #99cc99;">"=r"</span> (id_reg));
<span class="number" style="color: #f99157;">282</span> line_size = <span class="number" style="color: #f99157;">4</span> << ((id_reg & <span class="number" style="color: #f99157;">0x7</span>) + <span class="number" style="color: #f99157;">2</span>);
<span class="number" style="color: #f99157;">283</span> num_sets = ((id_reg >> <span class="number" style="color: #f99157;">13</span>) & <span class="number" style="color: #f99157;">0x7fff</span>) + <span class="number" style="color: #f99157;">1</span>;
<span class="number" style="color: #f99157;">284</span> aliasing_icache = (line_size * num_sets) > PAGE_SIZE;
<span class="number" style="color: #f99157;">285</span> <span class="keyword" style="color: #cc99cc;">break</span>;
<span class="number" style="color: #f99157;">286</span> <span class="keyword" style="color: #cc99cc;">case</span> CPU_ARCH_ARMv6:
<span class="number" style="color: #f99157;">287</span> aliasing_icache = read_cpuid_cachetype() & (<span class="number" style="color: #f99157;">1</span> << <span class="number" style="color: #f99157;">11</span>);
<span class="number" style="color: #f99157;">288</span> <span class="keyword" style="color: #cc99cc;">break</span>;
<span class="number" style="color: #f99157;">289</span> <span class="keyword" style="color: #cc99cc;">default</span>:
<span class="number" style="color: #f99157;">290</span> <span class="comment" style="color: #999999;">/* I-cache aliases will be handled by D-cache aliasing code */</span>
<span class="number" style="color: #f99157;">291</span> aliasing_icache = <span class="number" style="color: #f99157;">0</span>;
<span class="number" style="color: #f99157;">292</span> }
<span class="number" style="color: #f99157;">293</span>
<span class="number" style="color: #f99157;">294</span> <span class="keyword" style="color: #cc99cc;">return</span> aliasing_icache;
<span class="number" style="color: #f99157; margin-bottom: 0px;">295</span> }
</code></pre>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
判断V6的ICache是否具有cache alias的方法和判断DCache的方法是一样的。不同的是Dcache取决于CTR(Cache Type Register)的第23位, ICache取决于CTR的第11位(286~289行)。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
在cacheid_init()函数中,判断了ARMV7是PIPT还是VIPT还是其他,那么如何判断其是否具有Alias问题呢?就要看“log2(Way_Size) > log2(PAGE_SIZE)”的值了(284行)。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
以上,主要分析了<i style="margin-bottom: 0px; margin-top: 0px;"><b style="margin-bottom: 0px; margin-top: 0px;">ARM V7的Icache的Cache Policy以及是否存在Alias</b></i>在Linux的识别过程。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-bottom: 1em; margin-top: 1em;">
<i style="margin-bottom: 0px; margin-top: 0px;"><b style="margin-bottom: 0px; margin-top: 0px;">ARM V7的Dcache的Cache Policy</b></i>是怎样的呢?cacheid_init()函数的306行已经写死了。其值是CACHEID_VIPT_NOALIASING的。</div>
<div style="color: #333333; font-family: sans-serif; font-size: 14px; line-height: 22px; margin-top: 1em;">
即,Linux认为对于V7来说,DCache一定是VIPT with no alias或者PIPT,ICache可能是VIPT with alias或者PIPT或者ASID Taged的VIVT。对于VIPT,是否具有alias问题呢,要看log2(Way_size)与log2(PAGE_SIZE)的比较结果了。</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-4358525819550448542013-03-06T02:01:00.000-08:002013-03-06T20:46:20.169-08:00认识Linux物理内存回收机制<div class="WordSection1">
<div class="MsoNormal">
<b><span lang="EN-US" style="font-size: 15.0pt;">Agenda<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">All channels for page freeing<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Overview for page frame reclaiming<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Sync. Reclaiming<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Async. Reclaiming <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span lang="EN-US" style="font-size: 15.0pt;">Introduction<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">本文所讲的物理页面回收是指动态的回收:即,空闲的内存不够用的时候,系统采取相应的方法将正在使用的内存释放,补充空闲内存,以满足内存的分配。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span lang="EN-US" style="font-size: 15.0pt;">Text<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l1 level1 lfo4; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.</span></span><span lang="EN-US">All channels for page freeing</span><span style="font-family: 宋体;">。首先先简单看一下系统中的内存释放的三种渠道。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: 0cm;">
<span lang="EN-US">1-1>. </span><span style="font-family: 宋体;">在用户进程退出的时候,释放内存。当用户进程退出的时候,会调用</span><span lang="EN-US">do_exit. do_exit</span><span style="font-family: 宋体;">最终会调用</span><span lang="EN-US">free_pagetables</span><span style="font-family: 宋体;">函数。该函数的作用是:遍历</span><span lang="EN-US">vma</span><span style="font-family: 宋体;">,根据</span><span lang="EN-US">vma</span><span style="font-family: 宋体;">中的虚拟地址找到实际的物理页,将其释放。在之前讲过,对于用户进程的虚拟地址区间,是以红黑树组织的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: 0cm;">
<span lang="EN-US">1-2>. </span><span style="font-family: 宋体;">手动的释放。在驱动中,分配内存使用</span><span lang="EN-US">alloc_pages()</span><span style="font-family: 宋体;">,释放内存用</span><span lang="EN-US">free_pages(</span><span style="font-family: 宋体;">这一点,类似于</span><span lang="EN-US">c</span><span style="font-family: 宋体;">语言中的</span><span lang="EN-US">malloc</span><span style="font-family: 宋体;">和</span><span lang="EN-US">free)</span><span style="font-family: 宋体;">。必须配对使用。否则会造成内存泄漏。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: 0cm;">
<span lang="EN-US">1-3>. </span><span style="font-family: 宋体;">按需求调用内存回收例程来释放内存。这个区别于前两种的最大不同:它是动态的,按需的。当内存不够的时候,系统会自动按照一定的方式,将某些正在使用的内存释放掉,放进</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中再利用。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: 0cm;">
<br /></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l1 level1 lfo4; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Overview for page frame reclaiming</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span lang="EN-US">2-1>. </span><span style="font-family: 宋体;">先来看一下内存将会回收哪些页面</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span style="font-family: 宋体;">用户进程的页面都是通过</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">进行分配的。通过</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">进行分配的页面都是可以进行回收的。</span> <span style="font-family: 宋体;">这些页面总体可以划分为两种,分别是文件页</span><span lang="EN-US">(file cache)</span><span style="font-family: 宋体;">和匿名页</span><span lang="EN-US">(anonymous cache). </span><span style="font-family: 宋体;">文件页,顾名思义,它是和外部存储设备上的某个文件相对应。匿名页,其内容不来自于外部存储设备,例如用户进程中的堆栈。这两种页面是内存回收的目标页面。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span lang="EN-US">2-2>. </span><span style="font-family: 宋体;">内存回收采用的主要算法是近似于</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">的算法。位于</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">链表前面的页是活跃的,位于</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">链表后面的页是不活跃的。为什么说是近似呢?</span><span lang="EN-US">1. </span><span style="font-family: 宋体;">页面在链表上排序并不是严格依据</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">不断移动的。他们挂上去后是不移动的。除非在进行页面回收的时候,有些页面从后面,可能会插入到前面;</span><span lang="EN-US">2. Linux</span><span style="font-family: 宋体;">在</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">的基础上又引入了一个</span><span lang="EN-US">Referrenced</span><span style="font-family: 宋体;">标志。这种带</span><span lang="EN-US">Referenced</span><span style="font-family: 宋体;">标志的近似</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">的算法被有些人称之为</span><span lang="EN-US">Second-Chance Algorithm.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span style="font-family: 宋体;">简单看一下</span><span lang="EN-US">Second-Chance Algorithm. </span><span style="font-family: 宋体;">当一个页从一个</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">链表上除去的时候,需要再看一下</span><span lang="EN-US">Referenced</span><span style="font-family: 宋体;">标志。如果该标志设置了,就将其置为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">,不能将该页移出。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="margin-left: 21.0pt; text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj8BTVhG-DWBVqTvrAMZ3hv8VK4pM1MFoTMQgmvygUrNtCSTWyqnhFdtdyGygSfF6tf6fw54P7e-GBtjKjaa72WsJuocxvuhBv68dgVO-qj8GE31lPQnLWFghyphenhyphen1ekgFtGb8fXGzRtS3CI/s1600/image001-773941.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169427706917186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj8BTVhG-DWBVqTvrAMZ3hv8VK4pM1MFoTMQgmvygUrNtCSTWyqnhFdtdyGygSfF6tf6fw54P7e-GBtjKjaa72WsJuocxvuhBv68dgVO-qj8GE31lPQnLWFghyphenhyphen1ekgFtGb8fXGzRtS3CI/s320/image001-773941.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="margin-left: 21.0pt; text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">1<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span style="font-family: 宋体;">以图一为例,当某个页面被访问后,</span><span lang="EN-US">Referenced</span><span style="font-family: 宋体;">标志被设置。当需要从该</span><span lang="EN-US">list</span><span style="font-family: 宋体;">上面回收某些页时,<b>从后向前</b>扫描该</span><span lang="EN-US">list</span><span style="font-family: 宋体;">上的页面。对于那些设置为</span><span lang="EN-US">1(Referenced</span><span style="font-family: 宋体;">标志被设置</span><span lang="EN-US">)</span><span style="font-family: 宋体;">,</span><span lang="EN-US">reset</span><span style="font-family: 宋体;">为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">,不被移出链表。对于那些设置为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">的页面,移出链表。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span lang="EN-US">2-3>. Linux</span><span style="font-family: 宋体;">为了实现该算法,给每个</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">都提供了</span><span lang="EN-US">5</span><span style="font-family: 宋体;">个</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">链表。这</span><span lang="EN-US">5</span><span style="font-family: 宋体;">个</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">链表分为</span><span lang="EN-US">3</span><span style="font-family: 宋体;">类,一类是活跃链表</span><span lang="EN-US">(active list)</span><span style="font-family: 宋体;">,活跃链表有两个:一个是链接</span><span lang="EN-US">file page cache</span><span style="font-family: 宋体;">的</span><span lang="EN-US">LRU list, </span><span style="font-family: 宋体;">另一个是链接</span><span lang="EN-US">anonymous page cache</span><span style="font-family: 宋体;">的</span><span lang="EN-US">LRU list. </span><span style="font-family: 宋体;">另一类是非活跃链表</span><span lang="EN-US">(inactive list)</span><span style="font-family: 宋体;">,非活跃链表也有两个:一个是链接</span><span lang="EN-US">file page cache </span><span style="font-family: 宋体;">的</span><span lang="EN-US">LRU list, </span><span style="font-family: 宋体;">另一个是链接</span><span lang="EN-US">anonymous page cache</span><span style="font-family: 宋体;">的</span><span lang="EN-US">LRU list. </span><span style="font-family: 宋体;">内存回收例程从</span><span lang="EN-US">inactive list</span><span style="font-family: 宋体;">链表上获取页进行回收。第三类是</span><span lang="EN-US">unevictable</span><span style="font-family: 宋体;">链表,这个链表上挂载的是那些被</span><span lang="EN-US">mlock()</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">locked</span><span style="font-family: 宋体;">的页面。</span><span lang="EN-US">Mlock(),</span><span style="font-family: 宋体;">是一个系统调用,用户程序通过该系统调用锁定某些页阻止系统将其换出。被</span><span lang="EN-US">Locked</span><span style="font-family: 宋体;">的页面通常是文件系统防止其他进程</span><span lang="EN-US">touch</span><span style="font-family: 宋体;">的页面。被锁定的页面都挂载</span><span lang="EN-US">unevictable</span><span style="font-family: 宋体;">链表上。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span style="font-family: 宋体;">加入到</span><span lang="EN-US">active list</span><span style="font-family: 宋体;">链表上的页其</span><span lang="EN-US">page->flags</span><span style="font-family: 宋体;">上都要设置</span><span lang="EN-US">PG_active</span><span style="font-family: 宋体;">标志。凡是设置了</span><span lang="EN-US">PG_unevictable</span><span style="font-family: 宋体;">标志的都要挂载</span><span lang="EN-US">unevictable LRU list</span><span style="font-family: 宋体;">上。没有设置</span><span lang="EN-US">PG_active/PG_unevictable</span><span style="font-family: 宋体;">标志的都处于</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">状态。处于相关状态的页面通过</span><span lang="EN-US">page->lru </span><span style="font-family: 宋体;">链接到对应的链表上。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span style="font-family: 宋体;">当某个页被访问后,提高该页面的活跃度。提高活跃度的方法是</span><span lang="EN-US">:</span><span style="font-family: 宋体;">或者对</span><span lang="EN-US">page->flags</span><span style="font-family: 宋体;">设置</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">标志,或者对</span><span lang="EN-US">page->flags</span><span style="font-family: 宋体;">设置</span><span lang="EN-US">PG_active(</span><span style="font-family: 宋体;">同时该物理页面从</span><span lang="EN-US">inactive_list</span><span style="font-family: 宋体;">链表上转移到</span><span lang="EN-US">active_list</span><span style="font-family: 宋体;">链表上</span><span lang="EN-US">). </span><span style="font-family: 宋体;">有</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">和</span><span lang="EN-US">PG_active</span><span style="font-family: 宋体;">标志,可以得到页面的状态,该活跃度由低到高依次为:</span><span lang="EN-US">00->01->10->11<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<span lang="EN-US">2-4>. </span><span style="font-family: 宋体;">对于一个可回收页面,按照</span><span lang="EN-US">LRU</span><span style="font-family: 宋体;">的算法,只有处于</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">状态的页并且没有设置</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">标志位的页才能被回收。但实际上</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">在实现的时候并没有严格按照这中算法,</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">位只是用来参考的。从下面的状态转换图中可以看出这一点。状态转换图一共有</span><span lang="EN-US">4</span><span style="font-family: 宋体;">种状态。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="margin-left: 21.0pt; text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkxmdmc6JdOveUZrzSNO6PuncfVkD18YUz3kVBeHugD6H2-sgB6zLMw8-AWuHtdcfVTsnU7RBQtLHH_6Oym58XupdzkhcfZedEPHEhIpmA7X-8shL7ANoZEeM7vs1yKMMzdRb936YE7kQ/s1600/image002-775214.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169429396942114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkxmdmc6JdOveUZrzSNO6PuncfVkD18YUz3kVBeHugD6H2-sgB6zLMw8-AWuHtdcfVTsnU7RBQtLHH_6Oym58XupdzkhcfZedEPHEhIpmA7X-8shL7ANoZEeM7vs1yKMMzdRb936YE7kQ/s320/image002-775214.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="margin-left: 21.0pt; text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">2<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">当页面通过</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">被分配的时候,</span><span lang="EN-US">file page cache </span><span style="font-family: 宋体;">被加入到非活动链表中</span><span lang="EN-US">(inactive list)</span><span style="font-family: 宋体;">,</span> <span style="font-family: 宋体;">匿名页</span><span lang="EN-US">(anonymous page cache)</span><span style="font-family: 宋体;">被加入到活动链表中</span><span lang="EN-US">(active list)</span><span style="font-family: 宋体;">。该状态迁移图所涉及的函数主要有以下几个:</span><span lang="EN-US">shrink_active_list</span><span style="font-family: 宋体;">,</span><span lang="EN-US">make_page_accessed</span><span style="font-family: 宋体;">,</span><span lang="EN-US">page_check_references</span><span style="font-family: 宋体;">。</span><b><span lang="EN-US"><o:p></o:p></span></b></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">1)</span><span style="font-family: 宋体;">当</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">链表上的页数不够的时候,会调用</span><span lang="EN-US">shrink_active_list</span><span style="font-family: 宋体;">,该函数会将</span><b><span lang="EN-US">active</span></b><span style="font-family: 宋体;">链表上的页</span><span lang="EN-US">move</span><span style="font-family: 宋体;">到</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">链表上。对应于上图标号为</span><span lang="EN-US">1</span><span style="font-family: 宋体;">的转移;</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">2). make_page_accessed(). <o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">355 /*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">356 * Mark a page as having seen activity.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">357 *<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">358 * inactive,unreferenced -> inactive,referenced<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">359 * inactive,referenced -> active,unreferenced<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">360 * active,unreferenced -> active,referenced<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">361 */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">362 void mark_page_accessed(struct page *page)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">363 {<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">364 if (!PageActive(page) && !PageUnevictable(page) &&<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">365 PageReferenced(page) && PageLRU(page)) {<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">366 activate_page(page);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">367 ClearPageReferenced(page);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">368 } else if (!PageReferenced(page)) {<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">369 SetPageReferenced(page);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">370 }<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">371 }<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">372 EXPORT_SYMBOL(mark_page_accessed);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">当通过</span><span lang="EN-US">read()</span><span style="font-family: 宋体;">系统调用或者读已经在</span><span lang="EN-US">cache</span><span style="font-family: 宋体;">中的页面时,会提高页面的活跃度。对应于上图标号为</span><span lang="EN-US">2</span><span style="font-family: 宋体;">的转移</span><span lang="EN-US">(00->01->10->11)</span><span style="font-family: 宋体;">;</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">3) shrink_page_list->page_check_references() <i><o:p></o:p></i></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">704 static enum page_references page_check_references(struct page *page,<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">705 struct mem_cgroup_zone *mz,<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">706 struct scan_control *sc)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">707 {<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">708 int referenced_ptes, referenced_page;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">709 unsigned long vm_flags;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">710<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">711 referenced_ptes = page_referenced(page, 1, mz->mem_cgroup, &vm_flags);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">712 referenced_page = TestClearPageReferenced(page);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">713<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">714 /* Lumpy reclaim - ignore references */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">715 if (sc->reclaim_mode & RECLAIM_MODE_LUMPYRECLAIM)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">716 return PAGEREF_RECLAIM;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">717<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">718 /*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">719 * Mlock lost the isolation race with us. Let try_to_unmap()<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">720 * move the page to the unevictable list.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">721 */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">722 if (vm_flags & VM_LOCKED)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">723 return PAGEREF_RECLAIM;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">724<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">725 if (referenced_ptes) {<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">726 if (PageAnon(page))<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">727 return PAGEREF_ACTIVATE;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">728 /*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">729 * All mapped pages start out with page table<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">730 * references from the instantiating fault, so we need<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">731 * to look twice if a mapped file page is used more<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">732 * than once.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">733 *<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">734 * Mark it and spare it for another trip around the<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">735 * inactive list. Another page table reference will<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">736 * lead to its activation.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">737 *<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">738 * Note: the mark is set for activated pages as well<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">739 * so that recently deactivated but used pages are<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">740 * quickly recovered.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">741 */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">742 SetPageReferenced(page);<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">743<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">744 if (referenced_page || referenced_ptes > 1)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">745 return PAGEREF_ACTIVATE;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">746<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">747 /*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">748 * Activate file-backed executable pages after first usage.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">749 */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">750 if (vm_flags & VM_EXEC)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">751 return PAGEREF_ACTIVATE;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">752<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">753 return PAGEREF_KEEP;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">754 }<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">755<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">756 /* Reclaim if clean, defer dirty pages to writeback */<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">757 if (referenced_page && !PageSwapBacked(page))<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">758 return PAGEREF_RECLAIM_CLEAN;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">759<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">760 return PAGEREF_RECLAIM;<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">761 }<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">该函数被</span><span style="font-family: 宋体;">真正的页面回收函数</span><span lang="EN-US">shrink_page_list</span><span style="font-family: 宋体;">调用。所处理的对象是处于</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">状态的页面。分以下几种情况:</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US"> 3-a). </span><span style="font-family: 宋体;">如果是匿名页,并且最近被访问过</span><span lang="EN-US">(PTE_young</span><span style="font-family: 宋体;">置位</span><span lang="EN-US">)</span><span style="font-family: 宋体;">,对应</span><span lang="EN-US">3-a</span><span style="font-family: 宋体;">的转移</span><span lang="EN-US">(Line 726)</span><span style="font-family: 宋体;">。即</span><span lang="EN-US">(inactive+PG_referenced)->active</span><span style="font-family: 宋体;">,</span><span lang="EN-US">inactive->active. (01->10</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">00->10). <o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US"> 3-b). </span><span style="font-family: 宋体;">如果是已经映射的文件页</span><span lang="EN-US">,</span><span style="font-family: 宋体;">最近被访问过</span><span lang="EN-US">(PTE_young</span><span style="font-family: 宋体;">置位</span><span lang="EN-US">)</span><span style="font-family: 宋体;">,如果</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">置位或者被两个进程最近访问过</span><span lang="EN-US">(</span><span style="font-family: 宋体;">这一点不知道理解的对否</span><span lang="EN-US">)(Line 744~745)</span><span style="font-family: 宋体;">,对应于</span><span lang="EN-US">3-b</span><span style="font-family: 宋体;">的转移</span><span lang="EN-US">(01->11)</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US"> 3-c). </span><span style="font-family: 宋体;">如果是已经映射的文件页</span><span lang="EN-US">,</span><span style="font-family: 宋体;">最近被访问过</span><span lang="EN-US">(PTE_young</span><span style="font-family: 宋体;">置位</span><span lang="EN-US">), </span><span style="font-family: 宋体;">并且该</span><span lang="EN-US">page cache</span><span style="font-family: 宋体;">中的内容是可执行的</span><span lang="EN-US">(</span><span style="font-family: 宋体;">例如,用户进程的代码段</span><span lang="EN-US">)</span><span style="font-family: 宋体;">,则</span><span lang="EN-US">inactive->(active+PG_referenced).(00->11, 01->11)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US"> 3-d). </span><span style="font-family: 宋体;">如果是已经映射的文件页</span><span lang="EN-US">,</span><span style="font-family: 宋体;">最近被访问过</span><span lang="EN-US">(PTE_young</span><span style="font-family: 宋体;">置位</span><span lang="EN-US">), </span><span style="font-family: 宋体;">则,设置</span><span lang="EN-US">PG_referenced</span><span style="font-family: 宋体;">标志,仍旧保留</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">状态,不进行回收。</span><span lang="EN-US">(00->01,01-01)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US"> 3-e). </span><span style="font-family: 宋体;">除了以上情况,均进行回收。即:最近没有被访问过</span><span lang="EN-US">(PTE_YOUNG</span><span style="font-family: 宋体;">没有设置</span><span lang="EN-US">)</span><span style="font-family: 宋体;">的匿名页和文件页。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">对于</span><span lang="EN-US">page_check_references()</span><span style="font-family: 宋体;">中的返回值,简单介绍一下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">PAGEREF_RECLAIM</span><span style="font-family: 宋体;">:进行回收;</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">PAGEREF_RECLAIM_CLEAN</span><span style="font-family: 宋体;">:若该页是干净的</span><span lang="EN-US">(clean)</span><span style="font-family: 宋体;">,则进行回收;</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">PAGEREF_KEEP</span><span style="font-family: 宋体;">:仍然保持在</span><span lang="EN-US">inactive LRU list</span><span style="font-family: 宋体;">上,不进行回收。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">PAGEREF_ACTIVATE</span><span style="font-family: 宋体;">:不进行回收,并将该页转移到</span><span lang="EN-US">active LRU list</span><span style="font-family: 宋体;">上。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span lang="EN-US">2-5>. </span><span style="font-family: 宋体;">由以上的状态转换图,简单了解一下一个可回收的物理页面可能的生命周期。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 72.0pt; text-align: left;">
<span lang="EN-US">Free->inactive->[active]<-->inactive->reclaimable->free<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">对于一个文件页,其在</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中未被分配时,处于</span><span lang="EN-US">free</span><span style="font-family: 宋体;">状态。当被分配后,首先挂载在</span><span lang="EN-US">inactive LRU list</span><span style="font-family: 宋体;">上。若被进程访问,便会被</span><span lang="EN-US">active</span><span style="font-family: 宋体;">。当一段时间没有被访问后,就处于</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">状态,挂载在</span><span lang="EN-US">inactive </span><span style="font-family: 宋体;">链表上等待回收。被回收例程回收后,就进入</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中,回归到</span><span lang="EN-US">free</span><span style="font-family: 宋体;">状态。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 72.0pt;">
<span lang="EN-US">Free->Active<-->[inactive]->reclaimable->free<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">对于一个匿名页,通过</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">被分配后,挂载在</span><span lang="EN-US">active</span><span style="font-family: 宋体;">链表上,然后经过</span><span lang="EN-US">deactive</span><span style="font-family: 宋体;">变为</span><span lang="EN-US">inactive</span><span style="font-family: 宋体;">然后被回收进</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<span style="font-family: 宋体;">对于匿名页和文件页,刚被分配后所设置的状态,可以得出:系统总是想尽快老化文件页面。在系统的眼中,文件页的换出成本要低于匿名页。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo4; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Synchronization Reclaiming<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family: 宋体;">当内存分配不足的时候,内存回收例程就会被调用了。相关的代码在</span><span lang="EN-US">__alloc_pages</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Y62xgi-6CAnawfbIzNxLrWf1VlW4_svNKDyUthl7Mecc68x11fIkmQcVtvy7mK9SYGQIzdIcobHGqYblQdrh6Y64YKqY0B45we6kyWU-5pJC6PCnRVoqNhDv4Ut1SwIL6L98LokLuMI/s1600/image005-777951.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169442415423730" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Y62xgi-6CAnawfbIzNxLrWf1VlW4_svNKDyUthl7Mecc68x11fIkmQcVtvy7mK9SYGQIzdIcobHGqYblQdrh6Y64YKqY0B45we6kyWU-5pJC6PCnRVoqNhDv4Ut1SwIL6L98LokLuMI/s320/image005-777951.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">3<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family: 宋体;">若分配失败,就会进入到</span><span lang="EN-US">__alloc_pages_slowpath</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGdZSD8NV5NsnY1tR8I1hOjjQF6hidMbqdskX6NqBt6IJy5dlA6D5a4goW1KZIAow6EYNxwaUNJMzoN-PEaQXAPf__a848k5-bdP9ee0TfWqbmeOEaoKwSiMiHxnKDXiBOXCavr0dTHw0/s1600/image006-779329.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169449292556082" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGdZSD8NV5NsnY1tR8I1hOjjQF6hidMbqdskX6NqBt6IJy5dlA6D5a4goW1KZIAow6EYNxwaUNJMzoN-PEaQXAPf__a848k5-bdP9ee0TfWqbmeOEaoKwSiMiHxnKDXiBOXCavr0dTHw0/s320/image006-779329.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">4<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"> </span><span style="font-family: 宋体;">该函数功能正如其名字所属,属于</span><span lang="EN-US">slow path</span><span style="font-family: 宋体;">。首先会唤醒各个</span><span lang="EN-US">node</span><span style="font-family: 宋体;">上的</span><span lang="EN-US">kswapd</span><span style="font-family: 宋体;">例程。</span><span lang="EN-US">kswapd</span><span style="font-family: 宋体;">是一个</span><span lang="EN-US">kernel thread,</span><span style="font-family: 宋体;">每一个</span><span lang="EN-US">node</span><span style="font-family: 宋体;">都有一个例程。该例程的函数体是</span><span lang="EN-US">kswapd().</span><span style="font-family: 宋体;">该例程会在第</span><span lang="EN-US">4</span><span style="font-family: 宋体;">节中降到。唤醒</span><span lang="EN-US">kwspad</span><span style="font-family: 宋体;">后,尝试重新调用</span><span lang="EN-US">get_page_from_freelist</span><span style="font-family: 宋体;">,分配内存。若失败,继续往下,如果需要分配内存的主儿在系统中的地位比较重要的话,会调用</span><span lang="EN-US">__alloc_pages_high_priority(). </span><span style="font-family: 宋体;">该函数不会顾及系统设置的安全警告线</span><span lang="EN-US">(min water mark. </span><span style="font-family: 宋体;">对于</span><span lang="EN-US">1GB</span><span style="font-family: 宋体;">左右的内存是</span><span lang="EN-US">min water mark</span><span style="font-family: 宋体;">是</span><span lang="EN-US">16MB)</span><span style="font-family: 宋体;">,分配内存。如果仍然失败;则会调用</span><span lang="EN-US">__alloc_pages_direct_compat</span><span style="font-family: 宋体;">来</span><span lang="EN-US">migrate</span><span style="font-family: 宋体;">内存来达到</span><span lang="EN-US">compat</span><span style="font-family: 宋体;">的目的。这个内存的</span><span lang="EN-US">compat</span><span style="font-family: 宋体;">类似于磁盘的压缩整理,把在物理内存中正在使用的分散内存,给迁移整合,以便腾出大的连续的物理内存,满足某些进程大页面的需求。需要注意的是,压缩内存需要在</span><span lang="EN-US">build kernel</span><span style="font-family: 宋体;">的时候</span><span lang="EN-US">enable CONFIG_COMPACTION</span><span style="font-family: 宋体;">。若仍然失败,就调用</span><span lang="EN-US">__alloc_pages_direct_reclaim</span><span style="font-family: 宋体;">来回收内存了。回收内存后,会继续调用</span><span lang="EN-US">get_page_from_freelist,</span><span style="font-family: 宋体;">尝试看是否能否分配成功。如果仍然失败,并且分配内存的时候要求不允许失败,那么就进入</span><span lang="EN-US">OOM</span><span style="font-family: 宋体;">中。</span><span lang="EN-US">OOM</span><span style="font-family: 宋体;">主要的功能是选择一个占用内存量比较大的用户进程,杀掉以释放内存。释放结束后,跳到</span><span lang="EN-US">__alloc_pages_slowpath</span><span style="font-family: 宋体;">函数的开头,重新执行一遍,以满足内存分配。如果,允许内存分配失败,则就不会</span><span lang="EN-US">OOM</span><span style="font-family: 宋体;">了。以分配失败返回给调用者。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"> __alloc_pages_direct_reclaim</span><span style="font-family: 宋体;">函数主要调用</span><span lang="EN-US">try_to_free_pages.<o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9tZLGDSJflxmYDagguLJsI0QR8QSS2Ds059SlqIpzR1r4ljHtBHfZL4DH4LXnfGKwb8vHB22mner8oKmlnfpZAqM3VuNHPtBys_nRpGDSV3hD_QKn_Urq2mW4F5skW-rY5MZ-K3LNkkU/s1600/image007-781720.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169455330847026" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9tZLGDSJflxmYDagguLJsI0QR8QSS2Ds059SlqIpzR1r4ljHtBHfZL4DH4LXnfGKwb8vHB22mner8oKmlnfpZAqM3VuNHPtBys_nRpGDSV3hD_QKn_Urq2mW4F5skW-rY5MZ-K3LNkkU/s320/image007-781720.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">5<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"> try_to_free_pages()</span><span style="font-family: 宋体;">做的事情是,按照自定义的优先级从</span><span lang="EN-US">12</span><span style="font-family: 宋体;">开始,递减循环(优先级越小代表级别越高,回收的程度越剧烈)从要分配内存的</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">以及其</span><span lang="EN-US">fall-back zone list</span><span style="font-family: 宋体;">中回收可用内存释放到</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中。它通过调用</span><span lang="EN-US">shrink_zones</span><span style="font-family: 宋体;">来达到依次扫描</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">以及</span><span lang="EN-US">fall-back zone list</span><span style="font-family: 宋体;">的目的。对各个</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">进行回收结束后,对</span><span lang="EN-US">slab</span><span style="font-family: 宋体;">也进行回收(本文不对</span><span lang="EN-US">slab</span><span style="font-family: 宋体;">的回收做分析)。如果至此,已经回收了足够多的内存(</span><span lang="EN-US">32</span><span style="font-family: 宋体;">个页),那么就返回。如果没有回收到</span><span lang="EN-US">32</span><span style="font-family: 宋体;">个页,则是否需要唤醒</span><span lang="EN-US">pdflush</span><span style="font-family: 宋体;">进程,该进程的作用是唤醒块设备的读写进程将脏页写到块设备上。唤醒</span><span lang="EN-US">pdflush</span><span style="font-family: 宋体;">的条件是看是否扫描了超过</span><span lang="EN-US">48</span><span style="font-family: 宋体;">个页。之后,如果这是的扫描优先级已经小于</span><span lang="EN-US">10</span><span style="font-family: 宋体;">了,那么睡眠</span><span lang="EN-US">1/10HZ</span><span style="font-family: 宋体;">,即</span><span lang="EN-US">1S.</span><span style="font-family: 宋体;">然后递减优先级,进行下一遍的循环。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR6MD_GV5rQrkyaSliABQ-Xfw2j30ERiNGJW9QKNSzH1huY_zv1UT1EUEuGQ-zJdwiJ5BvpirBrYrPwJzU6SvVA-Pw_ink0J3ITnJvz8uQIvDdTV6hY9xKHQEt73sLpmbKAmx3TafOYsg/s1600/image008-783998.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169472192984482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR6MD_GV5rQrkyaSliABQ-Xfw2j30ERiNGJW9QKNSzH1huY_zv1UT1EUEuGQ-zJdwiJ5BvpirBrYrPwJzU6SvVA-Pw_ink0J3ITnJvz8uQIvDdTV6hY9xKHQEt73sLpmbKAmx3TafOYsg/s320/image008-783998.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">6<o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv6AMFYRqbnJys9EQscIGSZQyYLUQSo8saFF3gvqS9bcaFtVCAbWvCFHSy5yuwFi6K9Y15liNiCNKBwLCiiZCfzdU9pf7rucs6d7mADrm7tDR_Xh9FydVFvYgW6qtknLOw7vpQV6Khnes/s1600/image010-786162.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169476882591330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv6AMFYRqbnJys9EQscIGSZQyYLUQSo8saFF3gvqS9bcaFtVCAbWvCFHSy5yuwFi6K9Y15liNiCNKBwLCiiZCfzdU9pf7rucs6d7mADrm7tDR_Xh9FydVFvYgW6qtknLOw7vpQV6Khnes/s320/image010-786162.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">7<o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP49oDH-w8B-K18iAwYGtyqLNzpvUtfNdriuU8GkDVhl0DUOvqDfokTIW5-MuwBDeVwikF1AhATwF0Eyp4A1FLYpt6h9ffsEbBPgqKMlNGP9RazLKOelZmBQ7PWCwXtOE-qkkPB5IXc0A/s1600/image012-788538.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169485499769138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP49oDH-w8B-K18iAwYGtyqLNzpvUtfNdriuU8GkDVhl0DUOvqDfokTIW5-MuwBDeVwikF1AhATwF0Eyp4A1FLYpt6h9ffsEbBPgqKMlNGP9RazLKOelZmBQ7PWCwXtOE-qkkPB5IXc0A/s320/image012-788538.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">8<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"> </span><span style="font-family: 宋体;">关于</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体;">的作用,请看下图(图</span><span lang="EN-US">9</span><span style="font-family: 宋体;">)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy7VvvOsHk28Cq0rC605mmmINirU9stDxNPi9rNAtF0_2sb_vEVgfYFkejQvFnnXsEmkqnIhxql_9-Ixnl7WIJqlN37jxUMj7KVWCDXHAUvY3tuFZh6fCRGaZD2yChdA7ZHlAXFz655X4/s1600/image013-790553.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5852169496228330338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy7VvvOsHk28Cq0rC605mmmINirU9stDxNPi9rNAtF0_2sb_vEVgfYFkejQvFnnXsEmkqnIhxql_9-Ixnl7WIJqlN37jxUMj7KVWCDXHAUvY3tuFZh6fCRGaZD2yChdA7ZHlAXFz655X4/s320/image013-790553.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">9<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"> </span><span style="font-family: 宋体;">有关对</span><span lang="EN-US">swap cache </span><span style="font-family: 宋体;">作用的描述,最靠谱的分析是来自</span><span lang="EN-US">Understanding Linux Kernel. </span><span style="font-family: 宋体;">摘录如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt; mso-para-margin-left: 2.0gd;">
<span lang="EN-US">Consider a page P that is shared among two processes, A and B. Initially, the Page Table entries of both processes contain a reference to the page frame, and the page has two owners; this case is illustrated in Figure 17-8(a). When the PFRA selects the page for reclaiming, shrink_list( ) inserts the page frame in the swap cache. As illustrated in Figure 17-8(b), now the page frame has three owners, while the page slot in the swap area is referenced only by the swap cache. Next, the PFRA invokes try_to_unmap( ) to remove the references to the page frame from the Page Table of the processes; once this function terminates, the page frame is referenced only by the swap cache, while the page slot is referenced by the two processes and the swap cache, as illustrated in Figure 17-8(c). Let's suppose that, while the page's contents are being written to disk, process B accesses the pagethat is, it tries to access a memory cell using a linear address inside the page. Then, the page fault handler finds the page frame in the swap cache and puts back its physical address in the Page Table entry of process B, as illustrated in Figure 17-8(d). Conversely, if the swap-out operation terminates without concurrent swap-in operations,the shrink_list( ) function removes the page frame from the swap cache and releases the page frame to the Buddy system, as illustrated in Figure 17-8(e).<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 21.0pt; mso-para-margin-left: 2.0gd;">
<span lang="EN-US">Remark:<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 39.0pt; mso-list: l2 level1 lfo7; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Figure 17-8 </span><span style="font-family: 宋体;">请对照图</span><span lang="EN-US">9.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 39.0pt; mso-list: l2 level1 lfo7; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">上图的函数都是来自于</span><span lang="EN-US">2.6.11</span><span style="font-family: 宋体;">内核。本文所参考的内核是</span><span lang="EN-US">3.4.</span><span style="font-family: 宋体;">因此引用中的函数可能和本文所述的函数不匹配。</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US"><span style="mso-list: Ignore;">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span></span><span lang="EN-US">Asynchronization reclaiming.</span></div>
<div align="left" class="MsoNormal" style="margin-left: 21.0pt; text-align: left;">
<br /></div>
<div class="MsoNormal" style="margin-left: 21.0pt;">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">References<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo6; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Understanding Linux Kernel (3rd).<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo6; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Understanding virtual memory manager (2nd).<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo6; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Professional Linux Kernel Architecture.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路399号 邮政编码: 20120331.204173 121.588694000000034.100556000000001 80.280100000000033 58.30779 162.89728800000003tag:blogger.com,1999:blog-2141466325280539355.post-11889396183161907772013-03-01T01:48:00.001-08:002013-03-01T02:03:12.262-08:00page frame reclaiming 两个链表的总结<div style="background-color: whitesmoke;">
<table border="0" cellpadding="0" cellspacing="0" style="margin: 0 auto; width: 720px;"> <tbody>
<tr> <td><div style="background-color: white; border-top: 4px solid #0582ed; padding: 0px;">
<div>
<span style="font-size: medium;"><b>Agenda</b></span></div>
<div>
1. Introduction</div>
<div>
2. lru_rotate_pvecs链表的作用。</div>
<div>
3. lru_deactive_pvecs链表的作用。</div>
<div>
<br /></div>
<div>
<span style="font-size: medium;"><b>Text</b></span></div>
<div>
1. Introduction</div>
<div>
在swap.c文件中,定义了几个链表:</div>
<div>
<div>
39 static DEFINE_PER_CPU(struct pagevec[NR_LRU_LISTS], lru_add_pvecs);</div>
<div>
40 static DEFINE_PER_CPU(struct pagevec, lru_rotate_pvecs);</div>
<div>
41 static DEFINE_PER_CPU(struct pagevec, lru_deactivate_pvecs);</div>
</div>
<div>
lru_add_pvecs这个链表的作用很清除。加入到zone中对应链表的时候,需要它来进行中转过渡。其余的两个链表是在"<a href="https://lkml.org/lkml/2007/9/11/130">902aaed0d983dfd459fcb</a>"这个patch中加入的。</div>
<div>
<br /></div>
<div>
2. lru_rotate_pvecs这个链表的作用:</div>
<div>
对于正在writeback的页,如果被回收,那么需要把该页移到inactive链表的尾部。等待再次被回收。使用该链表的函数是:rotate_reclaimable_page(). 调用该函数的上层函数是: end_page_writeback().</div>
<div>
与end_page_writeback()配对的是set_page_writeback(). 当一个页要写出到外部存储设备的时候,先设置set_page_writeback, 然后将该页的写指令提交到通用块设备队列中。当写完后(unlock_page()成功返回),调用end_page_writeback(). </div>
<div>
end_page_writeback所做的工作是:</div>
<div>
<div>
598 /**</div>
<div>
599 * end_page_writeback - end writeback against a page</div>
<div>
600 * @page: the page</div>
<div>
601 */</div>
<div>
602 void end_page_writeback(struct page *page)</div>
<div>
603 {</div>
<div>
604 if (TestClearPageReclaim(page))</div>
<div>
605 rotate_reclaimable_page(page);</div>
<div>
606</div>
<div>
607 if (!test_clear_page_writeback(page))</div>
<div>
608 BUG();</div>
<div>
609</div>
<div>
610 smp_mb__after_clear_bit();</div>
<div>
611 wake_up_page(page, PG_writeback);</div>
<div>
612 }</div>
<div>
613 EXPORT_SYMBOL(end_page_writeback);</div>
</div>
<div>
上述函数的功能是:</div>
<div>
a. 如果该页面之前被回收进程试图回收过,但因为PG_dirty,所以没有成功,因此,仍然待在inactive_list链表中,同时设置该页PG_reclaimable以告诉writeback进程,该页需要尽快被回收。当writeback进程writeback该页成功后,清除页面回收标志,并将该页放在inactive队列的末尾(Line 604~605),以尽快被回收(因为回收进程总是从inactive_list链表的尾部开始回收的)。</div>
<div>
b. 清除该页PG_writeback标志(Line 607)</div>
<div>
c. 唤醒之前因为该页在writeback的过程中而睡眠的那些进程(Line 611),比如回收页面的 shrink_page_list()->wait_on_page_writeback().</div>
<div>
end_page_writeback->rotate_reclaimable_page</div>
<div>
<div>
258 /*</div>
<div>
259 * <b>Writeback is about to end against a page which has been marked for immediate</b></div>
<div>
260 *<b> reclaim</b>. If it still appears to be reclaimable, move it to the tail of the</div>
<div>
261 * inactive list.</div>
<div>
262 */</div>
<div>
263 void rotate_reclaimable_page(struct page *page)</div>
<div>
264 {</div>
<div>
265 if (!PageLocked(page) && !PageDirty(page) && !PageActive(page) &&</div>
<div>
266 !PageUnevictable(page) && PageLRU(page)) {</div>
<div>
267 struct pagevec *pvec;</div>
<div>
268 unsigned long flags;</div>
<div>
269</div>
<div>
270 page_cache_get(page);</div>
<div>
271 local_irq_save(flags);</div>
<div>
272 pvec = &__get_cpu_var(lru_rotate_pvecs);</div>
<div>
273 if (!pagevec_add(pvec, page))</div>
<div>
274 pagevec_move_tail(pvec);</div>
<div>
275 local_irq_restore(flags);</div>
<div>
276 }</div>
<div>
277 }</div>
</div>
<div>
<br /></div>
<div>
3. lru_deactivate_pvecs的作用是中转那些强制deactive 页的过渡链表。它的唯一上层调用函数是:invalidate_mapping_pages().</div>
<div>
凡是经过deactive_page的页面,其active程度要降一级。</div>
<div>
<div>
317 /**</div>
<div>
318 * invalidate_mapping_pages -<b> Invalidate all the unlocked pages of one inode</b></div>
<div>
319 * @mapping: the address_space which holds the pages to invalidate</div>
<div>
320 * @start: the offset 'from' which to invalidate</div>
<div>
321 * @end: the offset 'to' which to invalidate (inclusive)</div>
<div>
322 *</div>
<div>
323 * This function only removes the unlocked pages, if you want to</div>
<div>
324 * remove all the pages of one inode, you must call truncate_inode_pages.</div>
<div>
325 *</div>
<div>
326 * invalidate_mapping_pages() will not block on IO activity. It will not</div>
<div>
327 * invalidate pages which are dirty, locked, under writeback or mapped into</div>
<div>
328 * pagetables.</div>
<div>
329 */</div>
<div>
330 unsigned long invalidate_mapping_pages(struct address_space *mapping,</div>
<div>
331 pgoff_t start, pgoff_t end)</div>
<div>
332 {</div>
<div>
333 struct pagevec pvec;</div>
<div>
334 pgoff_t index = start;</div>
<div>
335 unsigned long ret;</div>
<div>
336 unsigned long count = 0;</div>
<div>
337 int i;</div>
<div>
338</div>
<div>
339 /*</div>
<div>
340 * Note: this function may get called on a shmem/tmpfs mapping:</div>
<div>
341 * pagevec_lookup() might then return 0 prematurely (because it</div>
<div>
342 * got a gangful of swap entries); but it's hardly worth worrying</div>
<div>
343 * about - it can rarely have anything to free from such a mapping</div>
<div>
344 * (most pages are dirty), and already skips over any difficulties.</div>
<div>
345 */</div>
<div>
346</div>
<div>
347 pagevec_init(&pvec, 0);</div>
</div>
<div>
<div>
348 while (index <= end && pagevec_lookup(&pvec, mapping, index,</div>
<div>
349 min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1)) {</div>
<div>
350 mem_cgroup_uncharge_start();</div>
<div>
351 for (i = 0; i < pagevec_count(&pvec); i++) {</div>
<div>
352 struct page *page = pvec.pages[i];</div>
<div>
353</div>
<div>
354 /* We rely upon deletion not changing page->index */</div>
<div>
355 index = page->index;</div>
<div>
356 if (index > end)</div>
<div>
357 break;</div>
<div>
358</div>
<div>
359 if (!trylock_page(page))</div>
<div>
360 continue;</div>
<div>
361 WARN_ON(page->index != index);</div>
<div>
362 ret = invalidate_inode_page(page);</div>
<div>
363 unlock_page(page);</div>
<div>
364 /*</div>
<div>
365 * Invalidation is a hint that the page is no longer</div>
<div>
366 * of interest and try to speed up its reclaim.</div>
<div>
367 */</div>
<div>
368 if (!ret)</div>
<div>
369 <b> deactivate_page(page);</b></div>
<div>
370 count += ret;</div>
<div>
371 }</div>
<div>
372 pagevec_release(&pvec);</div>
<div>
373 mem_cgroup_uncharge_end();</div>
<div>
374 cond_resched();</div>
<div>
375 index++;</div>
<div>
376 }</div>
<div>
377 return count;</div>
</div>
<div>
<div>
378 }</div>
</div>
<div>
invalidate_mapping_pages-><b> deactivate_page:</b></div>
<div>
<div>
528 /**</div>
<div>
529 * deactivate_page - forcefully deactivate a page</div>
<div>
530 * @page: page to deactivate</div>
<div>
531 *</div>
<div>
532 * This function hints the VM that @page is a good reclaim candidate,</div>
<div>
533 * for example if its invalidation fails due to the page being dirty</div>
<div>
534 * or under writeback.</div>
<div>
535 */</div>
<div>
536 void deactivate_page(struct page *page)</div>
<div>
537 {</div>
<div>
538 /*</div>
<div>
539 * In a workload with many unevictable page such as mprotect, unevictable</div>
<div>
540 * page deactivation for accelerating reclaim is pointless.</div>
<div>
541 */</div>
<div>
542 if (PageUnevictable(page))</div>
<div>
543 return;</div>
<div>
544</div>
<div>
545 if (likely(get_page_unless_zero(page))) {</div>
<div>
546 struct pagevec *pvec = &get_cpu_var(lru_deactivate_pvecs);</div>
<div>
547</div>
<div>
548 if (!pagevec_add(pvec, page))</div>
<div>
549 pagevec_lru_move_fn(pvec, lru_deactivate_fn, NULL);</div>
<div>
550 put_cpu_var(lru_deactivate_pvecs);</div>
<div>
551 }</div>
<div>
552 }</div>
<div style="font-weight: bold;">
<br /></div>
</div>
<div>
<b><span style="font-size: medium;">Remarks</span></b></div>
<div>
1. https://lkml.org/lkml/2007/9/11/130</div>
<div>
<br /></div>
</div>
</td> </tr>
</tbody></table>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-61894013802128754632013-02-19T20:37:00.000-08:002013-02-25T01:07:28.392-08:00How to swap out the anonymous page?<br />
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">匿名页被换出,以增加空闲内存的数量,</span> <span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页面被换出,首先需要为非活跃</span><span lang="EN-US">(inactive)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">状态。当处于</span><span lang="EN-US">inactive</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">状态的页面被选中换出时,其逻辑集中体现在</span><span lang="EN-US">shrink_page_list</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">函数中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 762
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 763 *
shrink_page_list() returns the number of reclaimed pages<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 764 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 765
static unsigned long shrink_page_list(struct list_head *page_list,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 766 struct
mem_cgroup_zone *mz,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 767 struct
scan_control *sc,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 768 int
priority,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 769 unsigned
long *ret_nr_dirty,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 770 unsigned
long *ret_nr_writeback)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 771
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 772
LIST_HEAD(ret_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 773
LIST_HEAD(free_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 774
int pgactivate = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 775
unsigned long nr_dirty = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 776
unsigned long nr_congested = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 777
unsigned long nr_reclaimed = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 778
unsigned long nr_writeback = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 779<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 780
cond_resched();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 781<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 782
while (!list_empty(page_list)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 783 enum page_references
references;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 784 struct address_space *mapping;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 785 struct page *page;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 786 int may_enter_fs;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 787<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 788 cond_resched();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 789<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 790 page = lru_to_page(page_list);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 791 list_del(&page->lru);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 792<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 793 if (!trylock_page(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 794 goto keep;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 795<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 796 VM_BUG_ON(PageActive(page));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 797 VM_BUG_ON(page_zone(page) !=
mz->zone);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 798<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 799 sc->nr_scanned++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 800<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 801 if
(unlikely(!page_evictable(page, NULL)))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 802 goto cull_mlocked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 803<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 804 if (!sc->may_unmap
&& page_mapped(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 805 goto keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 806<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 807 /* Double the slab pressure
for mapped and swapcache pages */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 808 if (page_mapped(page) ||
PageSwapCache(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 809 sc->nr_scanned++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 810<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 811 may_enter_fs =
(sc->gfp_mask & __GFP_FS) ||<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 812 (PageSwapCache(page)
&& (sc->gfp_mask & __GFP_IO));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 813<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 814 if (PageWriteback(page)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 815 nr_writeback++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 816 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 817
* Synchronous
reclaim cannot queue pages for<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 818 * writeback due to
the possibility of stack overflow<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 819 * but if it
encounters a page under writeback, wait<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 820 * for the IO to
complete.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 821 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 822 if
((sc->reclaim_mode & RECLAIM_MODE_SYNC) &&<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 823 may_enter_fs)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 824
wait_on_page_writeback(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 825 else {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 826
unlock_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 827 goto
keep_lumpy;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 828 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 829 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 830<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 831 references = page_check_references(page,
mz, sc);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 832 switch (references) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 833 case PAGEREF_ACTIVATE:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 834 goto activate_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 835 case PAGEREF_KEEP:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 836 goto keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 837
case PAGEREF_RECLAIM:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 838 case PAGEREF_RECLAIM_CLEAN:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 839 ; /* try to reclaim
the page below */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 840 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 841<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 842 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 843 * Anonymous process memory
has backing store?<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 844 * Try to allocate it some
swap space here.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 845 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 846 if (PageAnon(page) &&
!PageSwapCache(page)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 847 if (!(sc->gfp_mask
& __GFP_IO))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 848 goto keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 849 if
(!add_to_swap(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 850 goto
activate_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 851 may_enter_fs = 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 852 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 853<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 854 mapping = page_mapping(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 855<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 856 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 857 * The page is mapped into the
page tables of one or more<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 858 * processes. Try to unmap it
here.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 859 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 860
if (page_mapped(page)
&& mapping) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 861 switch
(try_to_unmap(page, TTU_UNMAP)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 862 case SWAP_FAIL:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 863 goto
activate_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 864 case SWAP_AGAIN:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 865 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 866 case SWAP_MLOCK:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 867 goto
cull_mlocked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 868 case SWAP_SUCCESS:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 869 ; /* try to
free the page below */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 870 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 871 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 872<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 873 if (PageDirty(page)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 874 nr_dirty++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 875<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 876 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 877 * Only kswapd can writeback
filesystem pages to<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 878 * avoid risk of stack
overflow but do not writeback<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 879 * unless under
significant pressure.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 880 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 881 if
(page_is_file_cache(page) &&<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 882
(!current_is_kswapd() || priority >= DEF_PRIORITY - 2)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 883 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 884 * Immediately
reclaim when written back.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 885 * Similar in
principal to deactivate_page()<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 886 * except we
already have the page isolated<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 887 * and know
it's dirty<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 888 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 889
inc_zone_page_state(page, NR_VMSCAN_IMMEDIATE);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 890
SetPageReclaim(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 891<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 892 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 893
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 894<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 895 if (references ==
PAGEREF_RECLAIM_CLEAN)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 896 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 897 if (!may_enter_fs)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 898 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 899 if (!sc->may_writepage)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 900 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 901<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 902 /* Page is dirty, try
to write it out here */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 903 switch (pageout(page,
mapping, sc)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 904
case PAGE_KEEP:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 905
nr_congested++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 906 goto
keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 907 case PAGE_ACTIVATE:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 908 goto
activate_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 909 case PAGE_SUCCESS:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 910 if
(PageWriteback(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 911 goto
keep_lumpy;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 912 if
(PageDirty(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 913 goto keep;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 914<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 915 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 916 * A
synchronous write - probably a ramdisk.
Go<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 917 * ahead and
try to reclaim the page.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 918 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 919 if
(!trylock_page(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 920 goto
keep;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 921 if
(PageDirty(page) || PageWriteback(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 922 goto keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 923 mapping =
page_mapping(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 924 case PAGE_CLEAN:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 925 ; /* try to
free the page below */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 926 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 927
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 928<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 929 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 930 * If the page has buffers,
try to free the buffer mappings<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 931 * associated with this page.
If we succeed we try to free<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 932 * the page as well.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 933
*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 934 * We do this even if the page
is PageDirty().<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 935 * try_to_release_page() does
not perform I/O, but it is<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 936 * possible for a page to have
PageDirty set, but it is actually<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 937
* clean (all its buffers
are clean). This happens if the<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 938 * buffers were written out
directly, with submit_bh(). ext3<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 939 * will do this, as well as
the blockdev mapping.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 940 * try_to_release_page() will
discover that cleanness and will<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 941 * drop the buffers and mark
the page clean - it can be freed.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 942 *<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 943 * Rarely, pages can have
buffers and no ->mapping. These are<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 944 * the pages which were not
successfully invalidated in<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 945 *
truncate_complete_page(). We try to drop
those buffers here<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 946 * and if that worked, and the
page is no longer mapped into<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 947 * process address space
(page_count == 1) it can be freed.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 948 * Otherwise, leave the page
on the LRU so it is swappable.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 949 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 950 if (page_has_private(page)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 951
if
(!try_to_release_page(page, sc->gfp_mask))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 952 goto
activate_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 953 if (!mapping
&& page_count(page) == 1) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 954
unlock_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 955 if
(put_page_testzero(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 956 goto
free_it;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 957 else {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 958 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 959 * rare race with speculative reference.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 960 * the
speculative reference will free<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 961 *
this page shortly, so we may<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 962 *
increment nr_reclaimed here (and<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 963 *
leave it off the LRU).<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 964 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 965
nr_reclaimed++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 966 continue;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 967 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 968 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 969 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 970<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 971 if (!mapping ||
!__remove_mapping(mapping, page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 972 goto keep_locked;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 973<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 974 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 975 * At this point, we have no
other references and there is<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 976 * no way to pick any more up
(removed from LRU, removed<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 977 * from pagecache). Can use
non-atomic bitops now (and<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 978 * we obviously don't have to
worry about waking up a process<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 979 * waiting on the page lock,
because there are no references.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 980 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 981 __clear_page_locked(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 982
free_it:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 983 nr_reclaimed++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 984<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 985 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 986 * Is there need to
periodically free_page_list? It would<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 987 * appear not as the counts
should be low<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 988 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 989 list_add(&page->lru,
&free_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 990 continue;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 991<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 992
cull_mlocked:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 993 if (PageSwapCache(page))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 994
try_to_free_swap(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 995 unlock_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 996 putback_lru_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 997 reset_reclaim_mode(sc);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 998 continue;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 999<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1000 activate_locked:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1001 /* Not a candidate for
swapping, so reclaim swap space. */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1002 if (PageSwapCache(page)
&& vm_swap_full())<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1003
try_to_free_swap(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1004 VM_BUG_ON(PageActive(page));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1005 SetPageActive(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1006 pgactivate++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1007 keep_locked:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1008 unlock_page(page);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1009 keep:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1010 reset_reclaim_mode(sc);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1011 keep_lumpy:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1012 list_add(&page->lru,
&ret_pages);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1013 VM_BUG_ON(PageLRU(page) ||
PageUnevictable(page));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1014
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1015<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1016
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1017 * Tag a zone as congested if all the
dirty pages encountered were<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1018 * backed by a congested BDI. In this
case, reclaimers should just<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1019 * back off and wait for congestion to
clear because further reclaim<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1020 * will encounter the same problem<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1021
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1022
if (nr_dirty && nr_dirty == nr_congested &&
global_reclaim(sc))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1023 zone_set_flag(mz->zone,
ZONE_CONGESTED);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1024<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1025
free_hot_cold_page_list(&free_pages, 1);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1026<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1027
list_splice(&ret_pages, page_list);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1028
count_vm_events(PGACTIVATE, pgactivate);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1029
*ret_nr_dirty += nr_dirty;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1030
*ret_nr_writeback += nr_writeback;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1031
return nr_reclaimed;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1032 }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
匿名页换出的步骤是:<br />
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">该匿名页是否在</span><span lang="EN-US">swap
cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中。如果不在,则加入到</span><span lang="EN-US">swap cache. (Line842~852).</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">加入到</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所做的事情是:将该页插入到</span><span lang="EN-US">swap
cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中,并在</span><span lang="EN-US">swap area</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中分配一个</span><span lang="EN-US">swap slot</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,设置</span><span lang="EN-US">page->flgas</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">为</span><span lang="EN-US">PG_dirty.</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">如果在这个过程中出错,则将该页插入到活跃链表上</span><span lang="EN-US">(Line 850)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">若该匿名页仍然被其他进程映射</span><span lang="EN-US">(Line 860)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,那么就通过</span><span lang="EN-US">try_to_unmap()</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">解除映射</span><span lang="EN-US">(Line 861). Try_to_unmap()</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">函数的作用正如其注释中所说:</span><span lang="EN-US">”try_to_unmap
- try to remove all page table mappings to a page”.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">当该匿名页的</span><span lang="EN-US">PG_dirty</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">被设置</span><span lang="EN-US">(Line 873)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,说明该页需要写到块设备上,就需要调用</span><span lang="EN-US">pageout()</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">将该页的内容写出到磁盘上</span><span lang="EN-US">(Line 142)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所有的匿名也在写到外部块设备后,该页就被回收了。那么回收之前,需要先从</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中删掉。为什么要从</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中删掉呢?因为页在</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中待着就是告诉其他进程,你需要从</span><span lang="EN-US">swap area</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中,换进该页的时候,该页已经被其他进程换入了,你用我这个就可以啦,不用做无用功了。因此,当该页要被回收掉重新分配做其他用途的时候,就需要从</span><span lang="EN-US">swap cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中删除</span><span lang="EN-US">(Line 210)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">5.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">一切就绪,将该匿名也加入到</span><span lang="EN-US">free_pages</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">队列中,等待被回收到伙伴系统中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">相关讨论,可参考:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">http://www.spinics.net/lists/kernel/msg1485370.html<o:p></o:p></span></div>
<br />hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-30369714483786809982012-10-21T22:45:00.000-07:002014-04-15T02:35:40.321-07:00windows下putty自动登陆Linux主机注意事项<div class="Section1">
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US">Windows </span><span style="font-family: 宋体;">下的</span><span lang="EN-US">putty</span><span style="font-family: 宋体;">不识别</span><span lang="EN-US">linux</span><span style="font-family: 宋体;">下用</span><span lang="EN-US">ssh-keygen</span><span style="font-family: 宋体;">生成的</span><span lang="EN-US">rsa</span><span style="font-family: 宋体;">私钥</span><span lang="EN-US">,</span><span style="font-family: 宋体;">因此,如果用</span><span lang="EN-US">windows</span><span style="font-family: 宋体;">下的</span><span lang="EN-US">putty</span><span style="font-family: 宋体;">自动登陆</span><span lang="EN-US">linux</span><span style="font-family: 宋体;">主机,需要用</span><span lang="EN-US">puttyGen</span><span style="font-family: 宋体;">程序转换一下</span><span lang="EN-US">(</span><span style="font-family: 宋体;">转换之后的扩展名为</span><span lang="EN-US">.ppk)</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">在</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">主机中,需要生成的公钥</span><span lang="EN-US">id_rsa.pub</span><span style="font-family: 宋体;">改为</span><span lang="EN-US">authorized_keys</span><span style="font-family: 宋体;">,否则用</span><span lang="EN-US">putty</span><span style="font-family: 宋体;">登陆的时候会提示</span><span lang="EN-US">"Server refused our key".<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<span lang="EN-US"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: 宋体;">在</span><span lang="EN-US">windows</span><span style="font-family: 宋体;">下的</span><span lang="EN-US">putty</span><span style="font-family: 宋体;">中填写</span><span lang="EN-US">host name,</span><span style="font-family: 宋体;">需要加上用户名</span><span lang="EN-US">:xxx@10.38.50.xxx.</span><span style="font-family: 宋体;">否则,每次登陆都会提示需要填写登陆</span><span lang="EN-US">id.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><o:p><br /></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><o:p> 设置过程可以参考:</o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><o:p><a href="http://www.phpvim.net/os/ubuntu/auto-login-using-putty.html">http://www.phpvim.net/os/ubuntu/auto-login-using-putty.html</a></o:p></span></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-88283877858236784372012-09-04T05:51:00.000-07:002014-10-22T18:51:40.190-07:00认识Linux物理内存管理系统--Buddy System<div class="MsoNormal">
<span lang="EN-US">Agenda</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Linux </span><span style="font-family: 宋体;">如何管理物理内存</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">什么是</span><span lang="EN-US">Buddy System</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">如何从</span><span lang="EN-US">Buddy System</span><span style="font-family: 宋体;">中分配内存</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">如何释放页到</span><span lang="EN-US">Buddy System</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">5.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">冷热页</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">6.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">关于</span><span lang="EN-US">fall-back zone lists</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Linux</span><span style="font-family: 宋体;">如何管理物理内存</span></div>
<div class="MsoNormal">
<span lang="EN-US">
</span><span style="font-family: 宋体;">为了有效的管理物理内存(分配、回收),</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">将整个物理内存划分为若干个页,对每一个页,都有相关的数据结构来记录该页的状态和使用信息。在</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">中,每个页的大小是</span><span lang="EN-US">4KB. </span><span style="font-family: 宋体;">对于一个</span><span lang="EN-US">512MB</span><span style="font-family: 宋体;">的物理内存一共有(</span><span lang="EN-US">512*1024*1024</span><span style="font-family: 宋体;">)</span><span lang="EN-US">/</span><span style="font-family: 宋体;">(</span><span lang="EN-US">4*1024</span><span style="font-family: 宋体;">)个页。对于每一个页,在</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">中都有一个</span><span lang="EN-US">struct page</span><span style="font-family: 宋体;">数据结构来记录该物理页的使用情况。所有页的</span><span lang="EN-US">struct page</span><span style="font-family: 宋体;">结构组成一个连续的数组存放在物理内存的某个地方。某页在物理内存中的物理地址除以</span><span lang="EN-US">4KB,</span><span style="font-family: 宋体;">就得到该页是第几个物理页索引,然后索引就可以查询</span><span lang="EN-US">struct page</span><span style="font-family: 宋体;">数组得到该页的具体信息。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-IwXn2gZiMXXWF6EKFkOgJZILJnDMNBA9bX7bzxnVgusv4gHccQi6watPMJPA8HGFMUvrGrL-qemxuWWVlbANSZCgmp7sjQaubO_J60tD1ePIJI-gXeQV3eMz7bkIeqIwRcyl3ZhqJk4/s1600/Picture1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-IwXn2gZiMXXWF6EKFkOgJZILJnDMNBA9bX7bzxnVgusv4gHccQi6watPMJPA8HGFMUvrGrL-qemxuWWVlbANSZCgmp7sjQaubO_J60tD1ePIJI-gXeQV3eMz7bkIeqIwRcyl3ZhqJk4/s320/Picture1.png" height="320" width="244" /></a></div>
<div class="MsoNormal">
<span style="font-family: 宋体;"><br /></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN;"><!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="Picture_x0020_2" o:spid="_x0000_i1025" type="#_x0000_t75"
alt="cid:image003.png@01CD8AAC.C5FF8E00" style='width:313.5pt;height:411pt'>
<v:imagedata src="file:///C:\Users\HFLI~1.MAR\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png"
o:href="cid:image003.png@01CD8AAC.C5FF8E00"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><!--[endif]--></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">1. Memory Page</span></div>
<div class="MsoNormal">
<span lang="EN-US">
</span><span style="font-family: 宋体;">除了使用</span><span lang="EN-US">struct page</span><span style="font-family: 宋体;">来记录某个</span><span lang="EN-US">4KB</span><span style="font-family: 宋体;">物理页的状态和使用信息外,</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">还将整个物理内存根据物理地址划分为不同的区域(</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">)。</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">的划分是与体系结构相关的,对于</span><span lang="EN-US">X86</span><span style="font-family: 宋体;">,</span><span lang="EN-US">ZONE</span><span style="font-family: 宋体;">可以划分为</span><span lang="EN-US">DMA</span><span style="font-family: 宋体;">区</span><span lang="EN-US">[0</span><span style="font-family: 宋体;">,</span><span lang="EN-US">16MB]</span><span style="font-family: 宋体;">、</span><span lang="EN-US">NORMAL</span><span style="font-family: 宋体;">区</span><span lang="EN-US">[16MB</span><span style="font-family: 宋体;">,</span><span lang="EN-US">min(memory length, 896MB)]</span><span style="font-family: 宋体;">和</span><span lang="EN-US">HIGHMEM</span><span style="font-family: 宋体;">区</span><span lang="EN-US">[min(memory length,896MB)</span><span style="font-family: 宋体;">,</span><span lang="EN-US">memory length]</span><span style="font-family: 宋体;">。对于</span><span lang="EN-US">ARM</span><span style="font-family: 宋体;">,</span><span lang="EN-US">ZONE</span><span style="font-family: 宋体;">划分为</span><span lang="EN-US">NORMAL</span><span style="font-family: 宋体;">区和</span><span lang="EN-US">HIGHMEM</span><span style="font-family: 宋体;">区。其中</span><span lang="EN-US">NORMAL</span><span style="font-family: 宋体;">区对应线性映射的物理内存,</span><span lang="EN-US">HIGHMEM</span><span style="font-family: 宋体;">区对应非线性映射的物理内存。其地址范围是:</span><span lang="EN-US">NORMAL[0,min(768MB</span><span style="font-family: 宋体;">,</span><span lang="EN-US">memory Length)] HIGHMEM[min(memory
length,896MB)</span><span style="font-family: 宋体;">,</span><span lang="EN-US">memory
length]</span><span style="font-family: 宋体;">。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZxd1H3GCFlLSepkEi72L-BjbwUACpGAunXCtSZTXI9yGtcS_MsmSJTMrGzdXsCqsIaqJccdvp7WqkTPVP7I9pd0lilP6oa-p27iBN8S4C_g4tLDw1WnNSj1nqEqKPeZx1L4Aw36rDdQ/s1600/Picture2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZxd1H3GCFlLSepkEi72L-BjbwUACpGAunXCtSZTXI9yGtcS_MsmSJTMrGzdXsCqsIaqJccdvp7WqkTPVP7I9pd0lilP6oa-p27iBN8S4C_g4tLDw1WnNSj1nqEqKPeZx1L4Aw36rDdQ/s320/Picture2.jpg" height="185" width="320" /></a></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><br /><!--[endif]--></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">2. Memory Zone</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">什么是</span><span lang="EN-US">Buddy System?</span></div>
<div class="MsoNormal">
<span lang="EN-US">
Buddy System</span><span style="font-family: 宋体;">是</span><span lang="EN-US">Linux
Kernel </span><span style="font-family: 宋体;">进行物理内存页管理的一个子系统。在</span><span lang="EN-US">Buddy System</span><span style="font-family: 宋体;">中,管理的一个基本单位是</span><span lang="EN-US">block</span><span style="font-family: 宋体;">,每一个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">有若干个连续的物理页组成,物理页的个数为</span><span lang="EN-US">2<sup>n</sup></span><span style="font-family: 宋体;">,这个</span><span lang="EN-US">n</span><span style="font-family: 宋体;">在</span><span lang="EN-US">buddy
system</span><span style="font-family: 宋体;">中被称为</span><span lang="EN-US">order</span><span style="font-family: 宋体;">。相同</span><span lang="EN-US">order</span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">,挂载一条双向链表上。当某个block空闲时,只要发现对应的伙伴也是空闲的,就和伙伴组成一个页数为</span><span lang="EN-US">2</span><sup><span style="font-family: 宋体;">(</span><span lang="EN-US">n+1</span></sup><sup><span style="font-family: 宋体;">)</span></sup><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">,挂载在</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">(n+1)</span><span style="font-family: 宋体;">的双向链表上,换句话说一个页数为</span><span lang="EN-US">2<sup>n</sup></span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">,是由两个页数为</span><span lang="EN-US">2</span><sup><span style="font-family: 宋体;">(</span><span lang="EN-US">n-1</span></sup><sup><span style="font-family: 宋体;">)</span></sup><span style="font-family: 宋体;">的伙伴</span><span lang="EN-US">block</span><span style="font-family: 宋体;">组成的。因此,一个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的伙伴肯定是和这个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">在物理地址上是连续的。在</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">中,</span><span lang="EN-US">order</span><span style="font-family: 宋体;">的默认的取值范围是</span><span lang="EN-US">[0,10]</span><span style="font-family: 宋体;">。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin33dEy2cImub5HpnpX-Co4Vw_ChK9iNv2US_rw4kfXmEwwpG1-P8_twPumBo2OC9_QYY7zE_Zybhu1iOn5hLgI9UKiFjcEwczGDG7LJsnA1EH5OldmJL1KGau29EVLDTTzcx9e5FxJRg/s1600/Picture3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin33dEy2cImub5HpnpX-Co4Vw_ChK9iNv2US_rw4kfXmEwwpG1-P8_twPumBo2OC9_QYY7zE_Zybhu1iOn5hLgI9UKiFjcEwczGDG7LJsnA1EH5OldmJL1KGau29EVLDTTzcx9e5FxJRg/s320/Picture3.jpg" height="171" width="320" /></a></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><br /><!--[endif]--></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">3. Buddy Organize</span></div>
<div align="left" class="MsoNormal" style="margin-left: 5.25pt; text-align: left; text-indent: -5.25pt;">
<span style="font-family: 宋体;">在</span><span lang="EN-US">buddy
system</span><span style="font-family: 宋体;">中,存入一个页会进行一次伙伴整合的迭代操作,直到不能再合并为止。那么,如何查找某个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的伙伴呢?在</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">中,一个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的伙伴信息记录在该</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的第一个物理页的</span><span lang="EN-US">struct page</span><span style="font-family: 宋体;">上。也就是说,假若一个页在伙伴系统中,</span><span lang="EN-US">page->private</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">n,</span><span style="font-family: 宋体;">则后面连续的</span><span lang="EN-US">2<sup>n</sup>-1</span><span style="font-family: 宋体;">个页面就在</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">中。一个页面在</span><span lang="EN-US">buddy System</span><span style="font-family: 宋体;">中,就代表了该页是空闲的,可以被分配。查找一个页数为</span><span lang="EN-US">2<sup>n</sup></span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的伙伴计算方法是</span><span lang="EN-US">buddy_index=page_index^(1<<n)</span><span style="font-family: 宋体;">,</span><span lang="EN-US">buddy_index </span><span style="font-family: 宋体;">表示伙伴块首页的页索引,</span><span lang="EN-US">page_index</span><span style="font-family: 宋体;">是该</span><span lang="EN-US">block</span><span style="font-family: 宋体;">首页的页索引,</span><span lang="EN-US">n</span><span style="font-family: 宋体;">代表</span><span lang="EN-US">order</span><span style="font-family: 宋体;">。</span></div>
<div align="left" class="MsoNormal" style="margin-left: 5.25pt; text-align: left; text-indent: -5.25pt;">
<br /></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-align: left; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">从</span><span lang="EN-US">buddy System</span><span style="font-family: 宋体;">中分配页</span></div>
<div align="left" class="MsoListParagraph" style="text-align: left; text-indent: 18.0pt;">
<span lang="EN-US">buddy System</span><span style="font-family: 宋体;">用来管理空闲的物理内存,接受进程的内存页申请。</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">提供给用户进程申请内存的接口函数中包含两个参数:一个是</span><span lang="EN-US">GFP_***</span><span style="font-family: 宋体;">,另一个是</span><span lang="EN-US">order</span><span style="font-family: 宋体;">。前者表示分配标志信息,从标志中可以知道进程要从哪个</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">中申请物理内存,并在内存紧缺的情况下指导内存何时回收内存;后者表示需要分配</span><span lang="EN-US">2<sup>order</sup></span><span style="font-family: 宋体;">个连续的物理页。</span></div>
<div align="left" class="MsoListParagraph" style="text-align: left; text-indent: 18.0pt;">
<span lang="EN-US">buddy system</span><span style="font-family: 宋体;">根据参数</span><span lang="EN-US">order</span><span style="font-family: 宋体;">,在要求的</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">中查找对应的链表。若该</span><span lang="EN-US">order</span><span style="font-family: 宋体;">的双向链表非空,则把该双向链表上的第一个</span><span lang="EN-US">block</span><span style="font-family: 宋体;">从</span><span lang="EN-US">buddy
system</span><span style="font-family: 宋体;">中脱链,同时更新该双向链表上的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的数量,完成内存分配。若该</span><span lang="EN-US">order</span><span style="font-family: 宋体;">的双向链表为空,则查找</span><span lang="EN-US">order+1</span><span style="font-family: 宋体;">的双向链表,如果</span><span lang="EN-US">order+1</span><span style="font-family: 宋体;">的双向链表为空,则查找</span><span lang="EN-US">order+2</span><span style="font-family: 宋体;">的双向链表,直到查找到。假设查找到了第</span><span lang="EN-US">n</span><span style="font-family: 宋体;">个双向链表</span><span lang="EN-US">(n>order)</span><span style="font-family: 宋体;">,由于查找到的连续物理内存页的数量大于</span><span lang="EN-US">order</span><span style="font-family: 宋体;">,因此将该</span><span lang="EN-US">block</span><span style="font-family: 宋体;">一分为二,将后半部分</span><span lang="EN-US">block</span><span style="font-family: 宋体;">挂载到</span><span lang="EN-US">2<sup>(n-1)</sup></span><span style="font-family: 宋体;">的双向链表上,将前半部分再一分为二,将前半部分的后半部分挂载到</span><span lang="EN-US">2<sup>(n-2)</sup></span><span style="font-family: 宋体;">的双向链表上,将前半部分的前半部分再一分为二。。。直到与请求的</span><span lang="EN-US">order</span><span style="font-family: 宋体;">相等为止。如图四。</span></div>
<div align="left" class="MsoListParagraph" style="text-align: left; text-indent: 18.0pt;">
<span style="font-family: 宋体;">在图四中,假如要申请</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">1</span><span style="font-family: 宋体;">的页,但</span><span lang="EN-US">buddy System</span><span style="font-family: 宋体;">中只有</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">5</span><span style="font-family: 宋体;">的页。分配示意图如下:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM5LDE1RjmHwiEvh_sc9tvWqvE0MZTPIHn59IPCtVsI_9XsW59AbBxSWXYcidz2GP1lOxggkvzrn4pAVStjzsWEFVZ7cueCyR27cNr0yHwuhUKg2ZeD1uUfD-kO2tNi1M4PBpV9IfHTEQ/s1600/Picture4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM5LDE1RjmHwiEvh_sc9tvWqvE0MZTPIHn59IPCtVsI_9XsW59AbBxSWXYcidz2GP1lOxggkvzrn4pAVStjzsWEFVZ7cueCyR27cNr0yHwuhUKg2ZeD1uUfD-kO2tNi1M4PBpV9IfHTEQ/s320/Picture4.jpg" height="179" width="320" /></a></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US"><br /><!--[endif]--></span></div>
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: 宋体;">图</span><span lang="EN-US">4. Allocate Pages</span><br />
<div style="text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, Geneva, sans-serif; font-size: 12px; line-height: 18px;"> 注: 从buddy的空闲页面组织方式中,可以得出,有时候即使buddy 系统中有连续的2^N个空闲页面,对2^N个空闲页面的申请也不一定会成功。这里(http://lwn.net/Articles/368869/)有一个例子,可以说明这一点。</span></div>
</div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-align: left; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">4.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">释放页到</span><span lang="EN-US">buddy System</span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; text-align: left; text-indent: 0cm;">
<span style="font-family: 宋体;">当非空闲的页被进程释放后,需要把页放回到伙伴系统中。由于</span><span lang="EN-US">block</span><span style="font-family: 宋体;">是作为一个整体被申请的,因此其释放也是以</span><span lang="EN-US">block</span><span style="font-family: 宋体;">为单位。若该</span><span lang="EN-US">block</span><span style="font-family: 宋体;">有</span><span lang="EN-US">2<sup>n</sup></span><span style="font-family: 宋体;">个连续的物理页,在释放的时候,根据</span><span lang="EN-US">buddy_index =
page_index^(1<<n)</span><span style="font-family: 宋体;">查找该</span><span lang="EN-US">block</span><span style="font-family: 宋体;">的</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">n</span><span style="font-family: 宋体;">的伙伴。若查找到伙伴,则将两个</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">n</span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">合并为一个</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">n+1</span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">。同时再查找</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">n+1 block</span><span style="font-family: 宋体;">的伙伴,若找到则两个</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">n+1</span><span style="font-family: 宋体;">的</span><span lang="EN-US">block</span><span style="font-family: 宋体;">继续合并</span><span lang="EN-US">…</span><span style="font-family: 宋体;">直到其不能合并为止,插入到最终</span><span lang="EN-US">order</span><span style="font-family: 宋体;">的双向链表的最前端。释放的迭代过程是分配页的逆过程</span><span lang="EN-US">.</span></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; text-align: left; text-indent: 0cm;">
<br /></div>
<div align="left" class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-align: left; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">5.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">冷热页</span></div>
<div align="left" class="MsoNormal" style="background: white; margin-top: 9.0pt; text-align: left;">
<span style="font-family: 宋体;">对于</span><span lang="EN-US">multi-processors</span><span style="font-family: 宋体;">,由于多个</span><span lang="EN-US">core</span><span style="font-family: 宋体;">共享存储器,进程并发执行。在一个</span><span lang="EN-US">core</span><span style="font-family: 宋体;">上运行的进程需要从某个</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">的伙伴系统中申请页必须首先锁住该</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">,这样其他</span><span lang="EN-US">core</span><span style="font-family: 宋体;">上跑的进程需要申请页的时候就需要等待该</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">的锁。为了提高</span><span lang="EN-US">buddy system</span><span style="font-family: 宋体;">的性能,</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">提出了冷热页的概念。冷热页是每</span><span lang="EN-US">CPU</span><span style="font-family: 宋体;">的。在每个</span><span lang="EN-US">core</span><span style="font-family: 宋体;">上对每个</span><span lang="EN-US">zone</span><span style="font-family: 宋体;">都维护了一条双向链表。该链表上链接的都是单个页,当进程申请</span><span lang="EN-US">order</span><span style="font-family: 宋体;">为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">的页是,就需要先从该</span><span lang="EN-US">cpu</span><span style="font-family: 宋体;">的冷热页链表上去拿页。关于冷热页的详细介绍,请猛击:</span><span lang="EN-US"><a href="http://hfli0.blogspot.com/2012/08/linuxarm.html"><span lang="EN-US" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span lang="EN-US">认识</span></span>Linux/ARM <span lang="EN-US" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span lang="EN-US">中的冷热页</span></span></a></span><span lang="EN-US" style="color: #222222; font-family: "Arial","sans-serif"; font-size: 16.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 18.0pt;">
<br /></div>
<div class="MsoNormal" style="margin-left: 18.0pt;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">6.<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: 宋体;">关于</span><span lang="EN-US">Fall-back zone lists</span></div>
<h3 style="background: white; margin-bottom: .0001pt; margin-bottom: 0cm; margin-left: 0cm; margin-right: 0cm; margin-top: 9.0pt;">
<span style="font-size: 10.5pt; font-weight: normal;">当内存管理单元在某个</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">zone</span><span style="font-size: 10.5pt; font-weight: normal;">分配可用内存页的时候,如果该</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">zone</span><span style="font-size: 10.5pt; font-weight: normal;">中的空闲内存不足,则会到候补</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">zone</span><span style="font-size: 10.5pt; font-weight: normal;">中进行分配。候补</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">zone</span><span style="font-size: 10.5pt; font-weight: normal;">不止一个,特别是对于</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">NUMA</span><span style="font-size: 10.5pt; font-weight: normal;">的存储架构。因此对于候补</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">zone</span><span style="font-size: 10.5pt; font-weight: normal;">也有一个列表,排在最前面的作为第一候补,依照排队的顺序优先级逐步降低。关于</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;">fall-back zone lists</span><span style="font-size: 10.5pt; font-weight: normal;">的详细介绍,请猛击:</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; font-weight: normal;"><a href="http://hfli0.blogspot.com/2012/08/how-linuxarm-initialize-fallback-zone.html">How
Linux/ARM initialize fallback-zone-lists</a><o:p></o:p></span></h3>
<div class="MsoListParagraph" style="text-indent: 0cm;">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">==</span><span style="font-family: 宋体;">全文完</span><span lang="EN-US">==</span></div>
<div class="MsoNormal">
<br /></div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com4中国上海市浦东新区科苑路399号31.204173 121.58869431.2007775 121.5837585 31.2075685 121.5936295tag:blogger.com,1999:blog-2141466325280539355.post-89751827302878549832012-08-27T00:50:00.000-07:002012-08-31T20:24:35.123-07:00认识Linux/ARM 中的冷热页<style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","sans-serif";} a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed {mso-style-priority:99; color:purple; text-decoration:underline;} span.EmailStyle17 {mso-style-type:personal-compose; font-family:"Calibri","sans-serif"; color:windowtext;} span.sc11 {mso-style-name:sc11;} span.sc0 {mso-style-name:sc0;} span.sc4 {mso-style-name:sc4;} span.sc10 {mso-style-name:sc10;} span.sc5 {mso-style-name:sc5;} span.sc16 {mso-style-name:sc16;} span.sc1 {mso-style-name:sc1;} span.sc6 {mso-style-name:sc6;} span.sc2 {mso-style-name:sc2;} .MsoChpDefault {mso-style-type:export-only;} /* Page Definitions */ @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="1026" /> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1" /> </o:shapelayout></xml><![endif]--> <br />
<div class="Section1">
<div align="left" class="MsoNormal" style="text-align: left;">
</div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Agenda</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">何谓冷热页?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">冷热页到底起到什么作用?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">多大的冷热页最合适?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">在Linux</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">ARM中如何维护冷热页?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.1</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">初始化</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">怎样增加冷热页库存</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.3</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">怎样分配冷热页</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">何谓冷热页?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">在Linux</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Kernel的物理内存管理的buddy</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">system中,引入了冷热页的概念。冷页表示该空闲页已经不再高速缓存中了</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">一般是指L2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Cache</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">,热页表示该空闲页仍然在高速缓存中。冷热页是针对于每CPU的,每个zone中,都会针对于所有的CPU初始化一个冷热页的per</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">冷热页到底起到什么积极作用?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">作用有3点:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2.1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">).</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Buddy</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Allocator在分配order为0的空闲页的时候,如果分配一个热页,那么由于该页已经存在于L2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Cache中了。CPU写访问的时候,不需要先把内存中的内容读到Cache中,然后再写。如果分配一个冷页,说明该页不在L2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Cache中。一般情况下,尽可能用热页,是容易理解的。什么时候用冷页呢?While</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">allocating</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">physical</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">frame</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">there</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">is</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">bit</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">specifying</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">whether</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">we</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">would</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">like</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">hot</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">or</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">that</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">is</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">likely</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">in</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">the</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CPU</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cache</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">or</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">not</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">likely</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">there</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">).</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">If</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">the</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">will</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">used</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">by</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">the</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CPU</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">hot</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">will</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">faster</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">If</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">the</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">will</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">used</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">for</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">device</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">DMA</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">the</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CPU</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cache</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">would</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">be</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">invalidated</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">anyway</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">and</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">a</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">does</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">not</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">waste</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">precious</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cache</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">contents</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.[</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2.2</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">).</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Buddy</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">System在给某个进程分配某个zone中空闲页的时候,首先需要用自旋锁锁住该zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">然后分配页。这样,如果多个CPU上的进程同时进行分配页,便会竞争。引入了per</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">set后,当多个CPU上的进程同时分配页的时候,竞争便不会发生,提高了效率。另外当释放单个页面时,空闲页面首先放回到per</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset中,以减少zone中自旋锁的使用。当页面缓存中的页面数量超过阀值时,再将页面放回到伙伴系统中。</span><br />
<span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"><span style="color: blue;">2.3).使用每CPU冷热页还有一个好处是,能保证某个页一直黏在1个CPU上,这有助于提高Cache的命中率。</span>
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">多大的冷热页最合适?</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">由于冷热页是在一条链表上进行管理。热页在前,冷页在后。CPU每释放一个order为0的页,如果per</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset中的页数少于其指定的阈值,便会将释放的页插入到冷热页链表的开始处。这样,之前插入的热页便会随着其后热页源源不断的插入向后移动,其页由热变冷的几率便大大增加。那么,要彻底让一个热页变冷需要维持一个多大数量的链表呢?Linux</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Kernel是这样运算的:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3638</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone_batchsize</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3639</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3640</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">ifdef</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CONFIG_MMU</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3641</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3642</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3643</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
3644 * The per-cpu-pages pools are set to around 1000th of the
3645 * size of the zone. But no more than 1/2 of a meg.
3646 *
3647 * OK, so we don't know how big the cache is. So guess.
3648 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3649</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">present_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1024</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3650</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">PAGE_SIZE</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">></span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">512</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1024</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3651</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">512</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1024</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">PAGE_SIZE</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3652</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* We effectively *= 4 below */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3653</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;"><</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3654</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3655</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3656</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
3657 * Clamp the batch to a 2^n - 1 value. Having a power
3658 * of 2 value was found to be more likely to have
3659 * suboptimal cache aliasing properties in some cases.
3660 *
3661 * For example if 2 tasks are alternately allocating
3662 * batches of pages, one task can end up with a lot
3663 * of pages of one half of the possible page colors
3664 * and the other with pages of the other colors.
3665 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3666</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">rounddown_pow_of_two</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">+</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3667</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3668</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">return</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3669</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3670</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">else</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3671</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* The deferral and batching of frees should be suppressed under NOMMU
3672 * conditions.
3673 *
3674 * The problem is that NOMMU needs to be able to allocate large chunks
3675 * of contiguous memory as there's no hardware page translation to
3676 * assemble apparent contiguous memory from discontiguous pages.
3677 *
3678 * Queueing large contiguous runs of pages for batching, however,
3679 * causes the pages to actually be freed in smaller chunks. As there
3680 * can be a significant delay between the individual batches being
3681 * recycled, this leads to the once large chunks of space being
3682 * fragmented and becoming unavailable for high-order allocations.
3683 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3684</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">return</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3685</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">endif</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3686</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone区的容量超过512MB,一律按照512MB的容量来算</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3650</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">~</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3651行</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">,其batch为31</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">对不不超过512MB的,算法为3649,3652行。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3688</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">setup_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pageset</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unsigned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">long</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3689</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3690</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3691</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3692</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3693</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">memset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">sizeof</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3694</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3695</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3696</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3697</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">high</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">6</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3698</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">max</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1UL</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3699</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">for</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;"><</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">++)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3700</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">INIT_LIST_HEAD</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3701</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">因此,如果是超过512MB的区,其pcp的high值是6</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">31</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">186个page.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">也即是其count的值不能超过186个page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">Linux</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">/</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">ARM如何维护冷热页</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">在Linux中,对于UMA的架构,冷热页在一个链表中。热页在前,冷页在后,插入页遵循FILO法则。热页被移动到后面就会变冷。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.1</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">初始化:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">先看一下在Linux中,冷热页的数据结构。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">197</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">198</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* number of pages in the list */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">199</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">high</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* high watermark, emptying needed */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">200</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* chunk size for buddy add/remove */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">201</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">202</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* Lists of pages, one per migrate type stored on the pcp-lists */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">203</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_head</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">];</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">204</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">};</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">206</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pageset</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">207</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">208</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">ifdef</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CONFIG_NUMA</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">209</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">s8</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">expire</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">210</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">endif</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">211</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">ifdef</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">CONFIG_SMP</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">212</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">s8</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">stat_threshold</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">213</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">s8</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">vm_stat_diff</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">NR_VM_ZONE_STAT_ITEMS</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">];</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">214</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">endif</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">215</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">};</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3291</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">DEFINE_PER_CPU</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">boot_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3819</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__meminit</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone_pcp_init</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3820</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3821</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
3822 * per cpu subsystem is not up at this point. The following code
3823 * relies on the ability of the linker to provide the
3824 * offset of a (static) per cpu variable into the per cpu area.
3825 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3826</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">boot_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3827</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3828</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">present_pages</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3829</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">printk</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">KERN_DEBUG</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc6" style="color: grey; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">" %s zone: %lu pages, LIFO batch:%u\n"</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3830</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">name</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">present_pages</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3831</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone_batchsize</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3832</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">初始化:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">start_kernel</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">build_all_zonelists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__build_all_zonelists</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3329</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">for_each_possible_cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3330</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">setup_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">boot_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">),</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">start_kernel</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">build_all_zonelists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__build_all_zonelists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">setup_pageset</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3688</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">setup_pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pageset</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unsigned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">long</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3689</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3690</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3691</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3692</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3693</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">memset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">sizeof</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3694</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3695</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">p</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3696</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3697</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">high</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">6</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3698</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">max</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1UL</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3699</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">for</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;"><</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">++)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3700</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">INIT_LIST_HEAD</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3701</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">怎样增加冷热页的库存</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2458</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unsigned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">order</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2459</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2460</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">put_page_testzero</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2461</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">order</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">==</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2462</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_hot_cold_page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2463</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">else</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2464</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages_ok</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">order</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2465</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2466</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2461~2464行,若返回1页,则调用free_hot_cold_page,将空间页存进每CPU</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset中。否则调用__free_pages_ok</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_all_bootmem</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_all_bootmem_core</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages_bootmem</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_hot_cold_page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1213</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
1214 * Free a 0-order page
1215 * cold == 1 ? free a cold page : free a hot page
1216 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1217</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_hot_cold_page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1218</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1219</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page_zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1220</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1221</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unsigned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">long</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1222</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1223</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">wasMlocked</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__TestClearPageMlocked</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1224</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1225</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(!</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_pages_prepare</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1226</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">return</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1227</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1228</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">get_pageblock_migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1229</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">set_page_private</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1230</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">local_irq_save</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1231</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unlikely</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">wasMlocked</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1232</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_page_mlock</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1233</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__count_vm_event</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">PGFREE</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1234</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1235</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
1236 * We only track unmovable, reclaimable and movable on pcp lists.
1237 * Free ISOLATE pages back to the allocator because they are being
1238 * offlined but treat RESERVE as movable pages so we can get those
1239 * areas back if necessary. Otherwise, we may have to free
1240 * excessively into the page allocator
1241 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1242</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">>=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1243</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unlikely</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">==</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_ISOLATE</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1244</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_one_page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1245</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">goto</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">out</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1246</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1247</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_MOVABLE</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1248</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1249</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1250</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">this_cpu_ptr</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1251</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1252</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_add_tail</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1253</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">else</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1254</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_add</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1255</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">++;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1256</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">>=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">high</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1257</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_pcppages_bulk</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1258</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1259</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1260</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1261</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">out</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1262</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">local_irq_restore</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1263</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">注意1229行,对于冷热页,page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">private存放的是其migratetype。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">从1251~1254行,可以看出,若是热页加入到前面,若是冷页放在尾部。若加入的也数量太多,则批量</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">按照batch的数值</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">减少。假若目前zone区域中物理内存的容量是512MB,则batch的值是31</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">.</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">即若冷热页中的数量超过186页,则减少31页。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_all_bootmem</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_all_bootmem_core</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages_bootmem</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_pages</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_hot_cold_page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_pcppages_bulk</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">621</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
622 * Frees a number of pages from the PCP lists
623 * Assumes all pages on list are in same zone, and of same order.
624 * count is the number of pages to free.
625 *
626 * If the zone was previously in an "all pages pinned" state then look to
627 * see if this freeing clears that state.
628 *
629 * And clear the zone's pages_scanned counter, to hold off the "all pages are
630 * pinned" detection logic.
631 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">632</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">void</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">free_pcppages_bulk</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">633</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">634</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">635</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">636</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">637</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">638</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">639</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">spin_lock</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lock</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">640</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">all_unreclaimable</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">641</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pages_scanned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">642</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">643</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">while</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to_free</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">644</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">645</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_head</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">646</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">647</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/*
648 * Remove pages from lists in a round-robin fashion. A
649 * batch_free count is maintained that is incremented when an
650 * empty list is encountered. This is so more pages are freed
651 * off fuller lists instead of spinning excessively around empty
652 * lists
653 */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">654</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">do</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">655</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">++;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">656</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(++</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">==</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">657</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">658</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">];</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">659</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">while</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_empty</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">660</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">661</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* This is the only non-empty list. Free them all. */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">662</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">==</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">663</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to_free</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">664</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">665</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">do</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">666</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_entry</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">prev</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">667</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* must delete as __free_one_page list manipulates */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">668</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_del</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">669</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* MIGRATE_MOVABLE list may include MIGRATE_RESERVEs */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">670</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__free_one_page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page_private</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">671</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">trace_mm_page_pcpu_drain</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page_private</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">672</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">while</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(--</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">to_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&&</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">--</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&&</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">!</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_empty</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">));</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">673</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">674</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__mod_zone_page_state</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">NR_FREE_PAGES</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">675</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">spin_unlock</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lock</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">676</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">该函数是一个while循环中套用另一个while循环。整体实现思路是,在pcp空闲页链表中根据类别不同一共有三类页,分别是:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">38</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">define</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_UNMOVABLE</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">39</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">define</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_RECLAIMABLE</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">40</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">define</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_MOVABLE</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">41</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> #</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">define</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_PCPTYPES</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">3</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc1" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">/* the number of types on the pcp lists */</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">顺序越靠后的释放的页数越多。对于MIGRATE_UNMOVABLE的页,一次释放一页</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">。对于MIGRATE_RECLAIMABLE的页,一次释放2页</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch_free</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2:655~672行的do</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{}</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">while循环跑两遍,每次释放一个页</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">。对于最后一级链表</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">MIGRATE_MOVABLE</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">),</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">释放的最多,剩余多少释放多少。</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">]</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">4.3怎样分配冷热页</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">在分配order为0页的时候,先找到合适的zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">然后根据需要的migratetype类型定位冷热页链表(每个zone,对于每个cpu</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">有3条冷热页链表,对应于:MIGRATE_UNMOVABLE、MIGRATE_RECLAIMABLE、MIGRATE_MOVABLE)。若需要热页,则从链表头取下一页(此页最</span><span class="sc6" style="color: grey; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">"热"</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">);若需要冷页,则从链表尾取下一页(此页最</span><span class="sc6" style="color: grey; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">"冷"</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">)。看下相关实现:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1350</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">static</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">inline</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1351</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">buffered_rmqueue</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">preferred_zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1352</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">order</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">gfp_t</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">gfp_flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1353</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1354</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1355</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unsigned</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">long</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1356</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1357</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">int</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">!!(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">gfp_flags</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">__GFP_COLD</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1358</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1359</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">again</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1360</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">likely</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">order</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">==</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1361</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">per_cpu_pages</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1362</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_head</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">*</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1363</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1364</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">local_irq_save</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">flags</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1365</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">this_cpu_ptr</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pageset</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1366</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lists</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">[</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">];</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1367</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_empty</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1368</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">+=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">rmqueue_bulk</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">zone</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">0</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1369</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">batch</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1370</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">migratetype</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1371</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">unlikely</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_empty</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)))</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1372</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">goto</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">failed</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1373</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1374</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1375</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">if</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">cold</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">)</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1376</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_entry</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">prev</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1377</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">else</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1378</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">=</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_entry</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">next</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc16" style="color: #8000ff; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">struct</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">,</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1379</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1380</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">list_del</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">(&</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">page</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">lru</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">);</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1381</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">pcp</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">-></span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">count</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">--;</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1382</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">}</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc5" style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">else</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"> </span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">{</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1367~1373行,如果缺少对应类型的页,会从伙伴分配系统中再次申请页。</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc11" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">参考:</span><span class="sc0" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">1.http</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">:</span><span class="sc2" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">//www.win.tue.nl/~aeb/linux/lk/lk-9.html
</span><span class="sc4" style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">2.http</span><span class="sc10" style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold; text-align: -webkit-auto; white-space: pre;">:</span><span class="sc2" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">//blog.chinaunix.net/uid-25845340-id-3039220.html</span>
<br />
<span class="sc2" style="color: green; font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;"><br /></span>
<span style="color: blue;"><span class="sc2" style="font-family: 'Courier New'; font-size: 10pt; text-align: -webkit-auto; white-space: pre;">注:2012.8.30,添加了 “2.</span><span style="font-family: 'Courier New'; font-size: 13px; text-align: -webkit-auto; white-space: pre;">冷热页到底起到什么积极作用”的2.3点。</span></span></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路399号31.204173 121.58869431.202475500000002 121.58622650000001 31.2058705 121.5911615tag:blogger.com,1999:blog-2141466325280539355.post-70806706503661207692012-08-20T02:55:00.000-07:002012-08-21T07:05:49.365-07:00How Linux/ARM initialize fallback-zone-lists<span style="font-family: 宋体; font-size: 10pt; text-align: left;">本文按照《</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">Linux</span><span style="font-family: 宋体; font-size: 10pt; text-align: left;">内核源代码情景分析》的方式分析</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">Linux</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">ARM</span><span style="font-family: 宋体; font-size: 10pt; text-align: left;">如何初始化</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">fallback</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">zone</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;">lists</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span style="font-family: 宋体; font-size: 10pt; text-align: left;">并按照缩进的方式组织函数调用</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt; text-align: left;"> </span><span style="font-family: 宋体; font-size: 10pt; text-align: left;">没有说清楚的地方敬请指正</span><b style="text-align: left;"><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><br />
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zonelist</span><span style="font-family: 宋体; font-size: 10pt;">准确说,应该是</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">fallback zone list</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span style="font-family: 宋体; font-size: 10pt;">其存在的意义:当内存管理单元在某个区分配可用内存页的时候,如果内存不足,则会在其他区进行分配。其他区可能不止一个,先后顺序就定义在某个</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node</span><span style="font-family: 宋体; font-size: 10pt;">节点的</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_zonelists</span><span style="font-family: 宋体; font-size: 10pt;">成员变量上。并且,当某个节点的内存不足时,可以分配其他节点的内存。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span><br />
<span style="font-family: 宋体; font-size: 10pt;"><br /></span><span style="color: blue; font-family: 宋体; font-size: 10pt;">在V2.6.23以及之前的内核中,每个node节点拥有(node's number* zones per_node)个fall back zonelists.其排序规则是:</span><br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;">1.对于UMA,假设其zone type有HIGHMEM、NORMAL、DMA,其节点的zone_lists的情况是:zone_lists[ZONE_DMA]={DMA,NULL},zone_lists[ZONE_NORMAL]={NORMAL,DMA,NULL},zone_lists[ZONE_HIGHMEM]={HIGHMEM,NORMAL,DMA}.</span><br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;">2.对于NUMA,节点有A、B、C、D四个,zone type有HIGHMEM、NORMAL、DMA,那么其节点的zone_lists为:</span><br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;">B.zone_lists[ZONE_HIGHMEM]={B.HIGHMEM,B.NORMAL,B.DMA,C.HIGHMEM,C.NORMAL,C.DMA,A.HIGHMEM,A.NORMAL,A.DMA}</span><br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;">这一排序规则在《<span style="font-family: 'Courier New'; font-size: 13px; text-align: -webkit-auto;">Professional Linux Kernel Architecture</span>》中有非常准确的描述。</span><br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;"><span style="font-family: 宋体; font-size: 10pt;">但是,在后续的Kernel中,将每个节点拥有的多个zone_lists合并为两个(对于NUMA是2个,UMA是1个),其相应的patch以及对应的讨论在:</span><a href="https://lkml.org/lkml/2007/8/8/302">https://lkml.org/lkml/2007/8/8/302</a></span><br />
<br />
<span style="color: blue; font-family: 宋体; font-size: 10pt;">本文的代码分析是针对于V3.3的Kernel Code.</span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">start_kernel</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_all_zonelists<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3349</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3350 * Called with zonelists_mutex held always<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3351 * unless system_state == SYSTEM_BOOTING.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3352 */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3353</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> __ref build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">data</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3354</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3355</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> set_zonelist_order</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">();</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3356</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3357</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">system_state </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">==</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> SYSTEM_BOOTING</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3358</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> __build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3359</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> mminit_verify_zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">();</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3360</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> cpuset_init_current_mems_allowed</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">();</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3355</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,设置</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">zonelist</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">的排序规则。当在分配页框的时候,如果要分配区域中的页框数量不足,则从候补区中查找页。候补区的排队顺序依照</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">current_zonelist_order</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">设置的值。不同的值代表不同的意义。如下:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> start_kernel</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">set_zonelist_order</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">:</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3226</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">static</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> set_zonelist_order</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3227</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3228</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> current_zonelist_order </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> ZONELIST_ORDER_ZONE</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3229</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> ZONELIST_ORDER_ZONE</span><span style="font-family: 宋体; font-size: 10pt;">代表将来</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zonelist</span><span style="font-family: 宋体; font-size: 10pt;">的排序规则。不过,对于</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">UMA</span><span style="font-family: 宋体; font-size: 10pt;">来说,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONELIST_ORDER_NODE</span><span style="font-family: 宋体; font-size: 10pt;">和</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONELIST_ORDER_ZONE</span><span style="font-family: 宋体; font-size: 10pt;">是一样的。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2827</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2828
* zonelist_order:<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2829
* 0 = automatic detection of
better ordering.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2830
* 1 = order by ([node] distance,
-zonetype)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2831
* 2 = order by (-zonetype, [node]
distance)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2832
*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2833
* If not NUMA,
ZONELIST_ORDER_ZONE and ZONELIST_ORDER_NODE will create<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2834
* the same zonelist. So only NUMA
can configure this param.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 2835
*/</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2836</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define ZONELIST_ORDER_DEFAULT </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2837</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define ZONELIST_ORDER_NODE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2838</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define ZONELIST_ORDER_ZONE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3357</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,在</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">system_state</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">默认的值是</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0.</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">由于</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">system_state</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">是个枚举变量,因此,其值为</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">SYSTEM_BOOTING.</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">108</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">enum</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> system_states system_state
__read_mostly</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">109</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> EXPORT_SYMBOL</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">system_state</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3358</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,建立</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">zonelists.</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">每个</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">zone_type</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">对应于</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">pgdata</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[]</span></b><span style="font-family: 宋体; font-size: 10pt;">数组的一个元素。每个元素由有一个指针数组(下面代码中的</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">_zonerefs</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[]</span></b><span style="font-family: 宋体; font-size: 10pt;">)构成。先来看下相关数据结构,再看处理过程:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">603</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">604</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist_cache </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zlcache_ptr</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">// NULL or
&zlcache<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">605</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zoneref _zonerefs</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">MAX_ZONES_PER_ZONELIST
</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">+</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">];</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">606</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #ifdef CONFIG_NUMA<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">607</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist_cache zlcache</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">// optional ...<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">608</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #endif<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">609</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">};</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">636</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">typedef</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> pglist_data </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">637</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zone node_zones</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">MAX_NR_ZONES</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">];</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">638</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist node_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">MAX_ZONELISTS</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">];</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">...</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">668</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">对于</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">UMA</span><span style="font-family: 宋体; font-size: 10pt;">体系结构,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">573</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MAX_ZONELISTS
</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">对于</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">NUMA</span><span style="font-family: 宋体; font-size: 10pt;">体系结构,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">498</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 499
* The NUMA zonelists are doubled because we need zonelists that restrict
the<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 500
* allocations to a single node for GFP_THISNODE.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 501
*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 502
* [0] : Zonelist with fallback<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 503
* [1] : No fallback
(GFP_THISNODE)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 504
*/</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">505</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MAX_ZONELISTS
</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">493</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* Maximum number
of zones on a zonelist */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">494</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MAX_ZONES_PER_ZONELIST
</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">MAX_NUMNODES </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> MAX_NR_ZONES</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> start_kernel</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">__build_all_zonelists<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3301</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">static</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> __init_refok </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">int</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> __build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">data</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3302</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3303</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">int</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> nid</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3304</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">int</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3305</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3306</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #ifdef CONFIG_NUMA<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3307</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> memset</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_load</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">sizeof</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_load</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">));</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3308</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #endif<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3309</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> for_each_online_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">nid</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3310</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> pg_data_t </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> NODE_DATA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">nid</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3311</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3312</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3313</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelist_cache</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3314</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3315</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3316</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3317 * Initialize the boot_pagesets that
are going to be used<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3318 * for bootstrapping processors. The
real pagesets for<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3319 * each zone will be allocated later
when the per cpu<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3320 * allocator is available.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3321
*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3322 * boot_pagesets are used also for
bootstrapping offline<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3323 * cpus if the system is already
booted because the pagesets<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3324 * are needed to initialize allocators
on a specific cpu too.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3325
* F.e. the percpu allocator needs
the page allocator which<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3326 * needs the percpu allocator in order
to allocate its pagesets<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3327 * (a chicken-egg dilemma).<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3328 */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3329</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> for_each_possible_cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3330</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> setup_pageset</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(&</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">per_cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">boot_pageset</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">),</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3331</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3332</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #ifdef CONFIG_HAVE_MEMORYLESS_NODES<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3333</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3334 * We now know the "local
memory node" for each node--<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3335 * i.e., the node of the first zone in the
generic zonelist.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3336 * Set up numa_mem percpu
variable for on-line cpus. During<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3337 * boot, only the boot cpu
should be on-line; we'll init the<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3338 * secondary cpus' numa_mem as they come
on-line. During<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3339 * node/memory hotplug, we'll
fixup all on-line cpus.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3340 */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3341</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu_online</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">))</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3342</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> set_cpu_numa_mem</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> local_memory_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu_to_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">cpu</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)));</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3343</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #endif<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3344</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3345</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3346</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">return</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3347</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">看</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">3312</span><span style="font-family: 宋体; font-size: 10pt;">行,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> start_kernel</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">__build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">:</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3231</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">static</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pg_data_t </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3232</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3233</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">int</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> local_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3234</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">enum</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zone_type j</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3235</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3236</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3237</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> local_node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_id</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3238</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3239</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">&</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">];</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3240</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> j </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelists_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> MAX_NR_ZONES </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3241</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3242</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3243 * Now we build the zonelist so that
it contains the zones<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3244 * of all the other nodes.<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3245 * We don't want to pressure a
particular node, so when<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3246 * building the zones for node N, we
make sure that the<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3247 * zones coming right after the local
ones are those from<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3248 * node N+1 (modulo N)<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"> 3249 */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3250</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">for</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> local_node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">+</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"><</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> MAX_NUMNODES</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">++)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3251</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(!</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_online</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">))</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3252</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">continue</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3253</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> j </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelists_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">NODE_DATA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">),</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> j</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3254</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">
MAX_NR_ZONES </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3255</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3256</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">for</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> node </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"><</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> local_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">++)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3257</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(!</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_online</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">))</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3258</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">continue</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3259</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> j </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelists_node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">NODE_DATA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">),</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> j</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3260</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> MAX_NR_ZONES </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3261</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3262</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3263</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">_zonerefs</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">j</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">].</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zone </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3264</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">_zonerefs</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">j</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">].</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zone_idx </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3265</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">该函数实现的结果是:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">如果是</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">UMA</span><span style="font-family: 宋体; font-size: 10pt;">,则:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zone_lists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">]={</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_HIGHMEM</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_NORMAL</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_DMA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span style="font-family: 宋体; font-size: 10pt;">。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">如果是</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">NUMA</span><span style="font-family: 宋体; font-size: 10pt;">,对于多个节点。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">A</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">B</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">C</span><span style="font-family: 宋体; font-size: 10pt;">则:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> B</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zone_lists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">]={</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">B</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_HIGHMEM</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">B</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_NORMAL</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">B</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_DMA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">C</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_HIGHMEM</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">C</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_NORMAL</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">C</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_DMA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">A</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_HIGHMEM</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">A</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_NORMAL</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">A</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">ZONE_DMA</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">NULL</span><span style="font-family: 宋体; font-size: 10pt;">表示结束,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">3263</span><span style="font-family: 宋体; font-size: 10pt;">~</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">3264</span><span style="font-family: 宋体; font-size: 10pt;">行</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)[</span></b><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">]</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">看</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">3313</span><span style="font-family: 宋体; font-size: 10pt;">行,</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> start_kernel</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">__build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">build_zonelist_cache<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3267</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* non-NUMA
variant of zonelist performance cache - just NULL zlcache_ptr */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3268</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">static</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">void</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> build_zonelist_cache</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pg_data_t </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3269</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3270</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> pgdat</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">-></span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">node_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">].</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">zlcache_ptr </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3271</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3329</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">~</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3330</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,涉及到冷热页表</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span style="font-family: 宋体; font-size: 10pt;">具体查看:物理内存管理之冷热页。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3359</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,依赖于</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">CONFIG_DEBUG_MEMORY_INIT</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3360</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,依赖于</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">CONFIG_CPUSETS</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">,此又依赖于</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">Control</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> Group Support</span><span style="font-family: 宋体; font-size: 10pt;">。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3361</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">else</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">{</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3362</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* we have to stop
all cpus to guarantee there is no user<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3363 of zonelist */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3364</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #ifdef CONFIG_MEMORY_HOTPLUG<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3365</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">data</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3366</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> setup_zone_pageset</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">((</span></b><span lang="EN-US" style="color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">struct</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zone </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*)</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">data</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3367</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #endif<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3368</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> stop_machine</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">__build_all_zonelists</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">NULL</span></b><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3369</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* cpuset refresh
routine should be here */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3370</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3371</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> vm_total_pages </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> nr_free_pagecache_pages</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">();</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3372</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/*<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3373 * Disable grouping by mobility if the
number of pages in the<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3374 * system is too low to allow the
mechanism to work. It would be<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3375 * more accurate, but expensive to
check per-zone. This check is<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3376 * made on memory-hotadd so a system
can start with mobility<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3377 * disabled and enable it later<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3378 */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3379</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">if</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">vm_total_pages </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"><</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">pageblock_nr_pages
</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">*</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> MIGRATE_TYPES</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">))</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3380</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> page_group_by_mobility_disabled
</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3381</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">else</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3382</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> page_group_by_mobility_disabled </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">=</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">;</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3383</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3384</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> printk</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">"Built %i
zonelists in %s order, mobility grouping %s.
"</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3385</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">"Total pages:
%ld\n"</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3386</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> nr_online_nodes</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3387</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zonelist_order_name</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">current_zonelist_order</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">],</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3388</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> page_group_by_mobility_disabled
</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">?</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">"off"</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">:</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">"on"</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3389</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> vm_total_pages</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3390</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #ifdef CONFIG_NUMA<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3391</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> printk</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">(</span></b><span lang="EN-US" style="color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">"Policy zone:
%s\n"</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> zone_names</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">[</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">policy_zone</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">]);</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3392</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #endif<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3393</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">}</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3371</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行计算满足各个区最低要求的情况下,剩余物理内存的页框数。</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3379</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">~</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3382</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">行,根据得到的剩余内存页框书,判断是否采用</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">MOVABLE</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">类型的页分类。这个是</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">Linux</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">的一个反页碎片机制,将剩余内存分类连接到各个空闲链表上。分类情况为:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">38</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_UNMOVABLE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">0</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">39</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_RECLAIMABLE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">40</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_MOVABLE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">41</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_PCPTYPES </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* the number of
types on the pcp lists */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">42</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_RESERVE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">3</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">43</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_ISOLATE </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">4</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: green; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">/* can't allocate
from here */</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">44</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> #define MIGRATE_TYPES </span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">5</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span style="font-family: 宋体; font-size: 10pt;">注意:</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">1.</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"> </span><span style="font-family: 宋体; font-size: 10pt;">这一点和</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;"><</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">Professional Linux
Kernel Architecture</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">>,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">Wolfgang Mauerer</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">,</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">Wiley Publishing</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">Inc</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">P166</span><span style="font-family: 宋体; font-size: 10pt;">~</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">168</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.</span></b><span style="font-family: 宋体; font-size: 10pt;">所述的完全不同。我反复看代码确认在</span><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">v3</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">.3</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">的</span><span lang="EN-US" style="color: #ff8000; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">Kernel</span><span style="color: #ff8000; font-family: 宋体; font-size: 10.0pt; mso-ascii-font-family: "Courier New"; mso-bidi-font-family: "Courier New"; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: "Courier New";">中确实是这样的。</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">^</span></b><span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;">_</span><b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">^</span></b><span lang="EN-US"><o:p></o:p></span><br />
<b><span lang="EN-US" style="color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt;">2. 蓝色部分是2012/8/21号新加内容</span></b></div>
<br />hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路399号31.204173 121.58869431.202475500000002 121.58622650000001 31.2058705 121.5911615tag:blogger.com,1999:blog-2141466325280539355.post-74141592116538890952012-08-10T00:05:00.001-07:002012-08-10T00:57:06.732-07:00Linux/ARM 通过软件方法遍历页表<div class="tr_bq">
翻译地址、遍历页表本是硬件MMU所做的工作。如何用软件来模拟出来呢?之前曾经写过一个简单的伪码实现:</div>
<br />
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US">unsigned long va2pa(unsigned long address)</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US">{</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pgd_t * pgd;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pud_t * pud;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pmd_t * pmd;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pte_t * pte;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<br /></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pgd=cpu_get_pgd();</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pud=pud_offset(pgd,address);</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pmd=pmd_offset(pud,address);</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pte=pte_offset_map(pmd,address);</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">pa=(*pte->pte>>12)<<12;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<br /></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt 10.5pt; text-align: justify;">
<span lang="EN-US">return pa;</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US">}</span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<br /></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US">不曾想,Kernel内部已经有此实现了^_^.</span></div>
<div class="x_MsoNormal" style="margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US"><span style="font-family: Calibri, sans-serif;">arch/arm/mm/fault.c</span></span></div>
<div class="x_MsoNormal" style="font-family: Calibri, sans-serif; font-size: 14px; margin: 0cm 0cm 0.0001pt; text-align: justify;">
<span lang="EN-US"></span></div>
<br />
<pre style="background-color: white; white-space: pre-wrap;"><span class="lnr" style="color: yellow;"> 1 </span><span class="Comment" style="color: #8080ff;">/*</span>
<span class="lnr" style="color: yellow;"> 2 </span><span class="Comment" style="color: #8080ff;"> * This is useful to dump out the page tables associated with</span>
<span class="lnr" style="color: yellow;"> 3 </span><span class="Comment" style="color: #8080ff;"> * 'addr' in mm 'mm'.</span>
<span class="lnr" style="color: yellow;"> 4 </span><span class="Comment" style="color: #8080ff;"> </span><span class="Comment" style="color: #8080ff;">*/</span>
<span class="lnr" style="color: yellow;"> 5 </span><span class="Type" style="color: lime;">void</span> show_pte(<span class="Type" style="color: lime;">struct</span> mm_struct *mm, <span class="Type" style="color: lime;">unsigned</span> <span class="Type" style="color: lime;">long</span> addr)
<span class="lnr" style="color: yellow;"> 6 </span>{
<span class="lnr" style="color: yellow;"> 7 </span> pgd_t *pgd;
<span class="lnr" style="color: yellow;"> 8 </span>
<span class="lnr" style="color: yellow;"> 9 </span> <span class="Statement" style="color: yellow;">if</span> (!mm)
<span class="lnr" style="color: yellow;">10 </span> mm = &init_mm;
<span class="lnr" style="color: yellow;">11 </span>
<span class="lnr" style="color: yellow;">12 </span> printk(KERN_ALERT <span class="Constant" style="color: #ff6060;">"pgd = </span><span class="Special" style="color: #ff40ff;">%p</span><span class="Special" style="color: #ff40ff;">\n</span><span class="Constant" style="color: #ff6060;">"</span>, mm->pgd);
<span class="lnr" style="color: yellow;">13 </span> pgd = pgd_offset(mm, addr);
<span class="lnr" style="color: yellow;">14 </span> printk(KERN_ALERT <span class="Constant" style="color: #ff6060;">"[</span><span class="Special" style="color: #ff40ff;">%08lx</span><span class="Constant" style="color: #ff6060;">] *pgd=</span><span class="Special" style="color: #ff40ff;">%08llx</span><span class="Constant" style="color: #ff6060;">"</span>,
<span class="lnr" style="color: yellow;">15 </span> addr, (<span class="Type" style="color: lime;">long</span> <span class="Type" style="color: lime;">long</span>)pgd_val(*pgd));
<span class="lnr" style="color: yellow;">16 </span>
<span class="lnr" style="color: yellow;">17 </span> <span class="Statement" style="color: yellow;">do</span> {
<span class="lnr" style="color: yellow;">18 </span> pud_t *pud;
<span class="lnr" style="color: yellow;">19 </span> pmd_t *pmd;
<span class="lnr" style="color: yellow;">20 </span> pte_t *pte;
<span class="lnr" style="color: yellow;">21 </span>
<span class="lnr" style="color: yellow;">22 </span> <span class="Statement" style="color: yellow;">if</span> (pgd_none(*pgd))
<span class="lnr" style="color: yellow;">23 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">24 </span>
<span class="lnr" style="color: yellow;">25 </span> <span class="Statement" style="color: yellow;">if</span> (pgd_bad(*pgd)) {
<span class="lnr" style="color: yellow;">26 </span> printk(<span class="Constant" style="color: #ff6060;">"(bad)"</span>);
<span class="lnr" style="color: yellow;">27 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">28 </span> }
<span class="lnr" style="color: yellow;">29 </span>
<span class="lnr" style="color: yellow;">30 </span> pud = pud_offset(pgd, addr);
<span class="lnr" style="color: yellow;">31 </span> <span class="Statement" style="color: yellow;">if</span> (PTRS_PER_PUD != <span class="Constant" style="color: #ff6060;">1</span>)
<span class="lnr" style="color: yellow;">32 </span> printk(<span class="Constant" style="color: #ff6060;">", *pud=</span><span class="Special" style="color: #ff40ff;">%08llx</span><span class="Constant" style="color: #ff6060;">"</span>, (<span class="Type" style="color: lime;">long</span> <span class="Type" style="color: lime;">long</span>)pud_val(*pud));
<span class="lnr" style="color: yellow;">33 </span>
<span class="lnr" style="color: yellow;">34 </span> <span class="Statement" style="color: yellow;">if</span> (pud_none(*pud))
<span class="lnr" style="color: yellow;">35 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">36 </span>
<span class="lnr" style="color: yellow;">37 </span> <span class="Statement" style="color: yellow;">if</span> (pud_bad(*pud)) {
<span class="lnr" style="color: yellow;">38 </span> printk(<span class="Constant" style="color: #ff6060;">"(bad)"</span>);
<span class="lnr" style="color: yellow;">39 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">40 </span> }
<span class="lnr" style="color: yellow;">41 </span>
<span class="lnr" style="color: yellow;">42 </span> pmd = pmd_offset(pud, addr);
<span class="lnr" style="color: yellow;">43 </span> <span class="Statement" style="color: yellow;">if</span> (PTRS_PER_PMD != <span class="Constant" style="color: #ff6060;">1</span>)
<span class="lnr" style="color: yellow;">44 </span> printk(<span class="Constant" style="color: #ff6060;">", *pmd=</span><span class="Special" style="color: #ff40ff;">%08llx</span><span class="Constant" style="color: #ff6060;">"</span>, (<span class="Type" style="color: lime;">long</span> <span class="Type" style="color: lime;">long</span>)pmd_val(*pmd));
<span class="lnr" style="color: yellow;">45 </span>
<span class="lnr" style="color: yellow;">46 </span> <span class="Statement" style="color: yellow;">if</span> (pmd_none(*pmd))
<span class="lnr" style="color: yellow;">47 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">48 </span>
<span class="lnr" style="color: yellow;">49 </span> <span class="Statement" style="color: yellow;">if</span> (pmd_bad(*pmd)) {
<span class="lnr" style="color: yellow;">50 </span> printk(<span class="Constant" style="color: #ff6060;">"(bad)"</span>);
<span class="lnr" style="color: yellow;">51 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">52 </span> }
<span class="lnr" style="color: yellow;">53 </span>
<span class="lnr" style="color: yellow;">54 </span> <span class="Comment" style="color: #8080ff;">/*</span><span class="Comment" style="color: #8080ff;"> We must not map this if we have highmem enabled </span><span class="Comment" style="color: #8080ff;">*/</span>
<span class="lnr" style="color: yellow;">55 </span> <span class="Statement" style="color: yellow;">if</span> (PageHighMem(pfn_to_page(pmd_val(*pmd) >> PAGE_SHIFT)))
<span class="lnr" style="color: yellow;">56 </span> <span class="Statement" style="color: yellow;">break</span>;
<span class="lnr" style="color: yellow;">57 </span>
<span class="lnr" style="color: yellow;">58 </span> pte = pte_offset_map(pmd, addr);
<span class="lnr" style="color: yellow;">59 </span> printk(<span class="Constant" style="color: #ff6060;">", *pte=</span><span class="Special" style="color: #ff40ff;">%08llx</span><span class="Constant" style="color: #ff6060;">"</span>, (<span class="Type" style="color: lime;">long</span> <span class="Type" style="color: lime;">long</span>)pte_val(*pte));
<span class="lnr" style="color: yellow;">60 </span><span class="PreProc" style="color: #ff40ff;">#ifndef CONFIG_ARM_LPAE</span>
<span class="lnr" style="color: yellow;">61 </span> printk(<span class="Constant" style="color: #ff6060;">", *ppte=</span><span class="Special" style="color: #ff40ff;">%08llx</span><span class="Constant" style="color: #ff6060;">"</span>,
<span class="lnr" style="color: yellow;">62 </span> (<span class="Type" style="color: lime;">long</span> <span class="Type" style="color: lime;">long</span>)pte_val(pte[PTE_HWTABLE_PTRS]));
<span class="lnr" style="color: yellow;">63 </span><span class="PreProc" style="color: #ff40ff;">#endif</span>
<span class="lnr" style="color: yellow;">64 </span> pte_unmap(pte);
<span class="lnr" style="color: yellow;">65 </span> } <span class="Statement" style="color: yellow;">while</span>(<span class="Constant" style="color: #ff6060;">0</span>);
<span class="lnr" style="color: yellow;">66 </span>
<span class="lnr" style="color: yellow;">67 </span> printk(<span class="Constant" style="color: #ff6060;">"</span><span class="Special" style="color: #ff40ff;">\n</span><span class="Constant" style="color: #ff6060;">"</span>);
<span class="lnr" style="color: yellow;">68 </span>}</pre>hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com4中国上海浦东新区科苑路399号31.204173 121.58869431.202475500000002 121.58622650000001 31.2058705 121.5911615tag:blogger.com,1999:blog-2141466325280539355.post-61499616655674704482012-08-07T21:06:00.000-07:002013-09-09T02:04:04.671-07:00Virtual Memory Initialization in Linux/ARM Kernel<br />
<div class="MsoNormal">
<span lang="EN-US">Agenda<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 21.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -21.0pt;">
<span lang="EN-US">一、</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">启动的几个阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 21.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -21.0pt;">
<span lang="EN-US">二、</span><span lang="EN-US">Virtual
Address</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的划分</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 21.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -21.0pt;">
<span lang="EN-US">三、</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页表建立的第一阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 21.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -21.0pt;">
<span lang="EN-US">四、</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页表建立的第二阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 21.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1; text-indent: -21.0pt;">
<span lang="EN-US">五、</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">怎样维护页表</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">本文讨论了虚拟内存系统在</span><span lang="EN-US">Linux Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中的初始化过程。</span><span lang="EN-US">Kernel Code</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">版本为</span><span lang="EN-US">V3.3.0,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">不涉及</span><span lang="EN-US">LPAE</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以及</span><span lang="EN-US">SMP</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的情况。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -26.25pt;">
<span lang="EN-US">一.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">启动的几个阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">当一个嵌入式</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">系统启动后,</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值是设定好的,可能是</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,也可能是其他的值。在</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">触及的地方,常见的情况是</span><span lang="EN-US">SOC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">存放的一段程序,该程序称之为</span><span lang="EN-US">Boot Monitor</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。每当机器硬重启,或者开机的时候,都会最先执行这段</span><span lang="EN-US">Boot Monitor</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">程序</span><sup><span lang="EN-US" style="font-size: 12.0pt; mso-bidi-font-size: 11.0pt;">[1]</span></sup><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。之后,</span><span lang="EN-US">Boot
Monitor</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">会将</span><span lang="EN-US">CPU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">转交给</span><span lang="EN-US">Uboot</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。这一过程类似于</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">机的</span><span lang="EN-US">BIOS</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">将执行权转交给</span><span lang="EN-US">Grub</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US">Uboot</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">将</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">Image</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">加载到内存中,让</span><span lang="EN-US">CPU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">转向</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">执行。众所周知</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">Image</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">包括两部分,第一部分是一个解压程序,第二部分才属于真正的</span><span lang="EN-US">OS</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。解压程序首先运行,建立页表、启动</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、</span><span lang="EN-US">Enable Cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,解压缩</span><span lang="EN-US">Kernel<sup>[2]</sup></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。之后,将</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">关闭,</span><span lang="EN-US">Disable Cache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,进入</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">启动过程。本文所介绍的</span><span lang="EN-US">Virtual Memory Initialization</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">都是在</span><span lang="EN-US">Linux Startup</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">阶段,不涉及解压过程中的</span><span lang="EN-US">Virtual
Memory.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -26.25pt;">
<span lang="EN-US">二.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span lang="EN-US">Virtual Address</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的划分</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">Virtual Address</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">共有</span><span lang="EN-US">4GB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的空间,该空间分为两部分,一部分是</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,另一部分是</span><span lang="EN-US">User Space.</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">这两部分在</span><span lang="EN-US">4GBSpace</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所占的比重可以在</span><span lang="EN-US">build Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的时候配置。通常的比例大约是</span><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US">User Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">~</span><span lang="EN-US">3G-16MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的空间,</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用</span><span lang="EN-US">3G-16MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">~</span><span lang="EN-US">4GB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的空间。每个进程都有不同的地址空间,这个地址空间指的是</span><span lang="EN-US">User Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对于所有的进程都是一样的。这也是为什么每一个进程都能够通过系统调用进入特权模式使用内核提供资源的原因。不过</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">并不是铁板一块,其空间划分为不同的部分</span><sup><span lang="EN-US">[3]</span></sup><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCXv2VVlbCiFaODtiMb3dn9O9RYY8j4nMRRIln_JZplHl5ru-FB_HrjTyM_8v8ULBQD0W3cJ5bxvm2-yBOg5ua4H7UJknDaUb8lBXOLjq45xQkSUv0HTrP-yzYaHdH8g4dzTuHKk_Lbrg/s1600/Picture1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCXv2VVlbCiFaODtiMb3dn9O9RYY8j4nMRRIln_JZplHl5ru-FB_HrjTyM_8v8ULBQD0W3cJ5bxvm2-yBOg5ua4H7UJknDaUb8lBXOLjq45xQkSUv0HTrP-yzYaHdH8g4dzTuHKk_Lbrg/s640/Picture1.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 10.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN;"><br /></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -26.25pt;">
<span lang="EN-US">三.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页表建立的第一阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">支持</span><span lang="EN-US">Virtual Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的硬件是</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">必须开启,</span><span lang="EN-US">CPU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">才能运行在</span><span lang="EN-US">Virtual Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">模式中。</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开启之后,</span><span lang="EN-US">CPU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">拿到的</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值是虚拟地址,在寻址的时候需要</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的参与,将虚拟地址转化为物理地址并将物理地址发送到地址总线上在</span><span lang="EN-US">Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中进行寻址。而将虚拟地址转化为物理地址的依据是</span><span lang="EN-US">OS</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">提供的页表。软件就是页表。页表由操作系统创建和维护。建立页表的过程分为两个阶段,为什么要分为两个阶段呢?原因是,在开启</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之前,</span><span lang="EN-US">OS</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">还不清楚有多少物理内存可用,所以,在这个阶段暂且保证</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开启之后,</span><span lang="EN-US">OS</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">部分</span><span lang="EN-US">built-in</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">部分的代码可以正常运行。在</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开启之后,系统探测完物理内存有多少可用后,再进行第二阶段的映射。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">第一阶段映射三段内存。其一是对开启</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的函数进行映射,其虚拟地址等于物理地址;其二是将</span><span lang="EN-US">Linux Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US">Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中的镜像进行映射,其虚拟地址</span><span lang="EN-US">==</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">物理地址</span><span lang="EN-US">+3G-</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">物理内存偏移量;其三是对</span><span lang="EN-US">UART I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">进行映射,其虚拟地址由驱动开发者指定。映射图如下所示:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoG5m7JCk6g5OaDOm6rWliRze8BFElyIQMTmkWCVmvr1p7Ssy4OJlwPfhJCWB6uX1V0-bzg1LzUIb6uKpV-2DGIGiW0xRqMt72HGpD-My6S3ZN4SCkT81lyTGHHwr2YEvfDw76QXSGnY/s1600/Picture2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="513" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoG5m7JCk6g5OaDOm6rWliRze8BFElyIQMTmkWCVmvr1p7Ssy4OJlwPfhJCWB6uX1V0-bzg1LzUIb6uKpV-2DGIGiW0xRqMt72HGpD-My6S3ZN4SCkT81lyTGHHwr2YEvfDw76QXSGnY/s640/Picture2.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">为什么要单独给</span><span lang="EN-US">__turn_mmu_on</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">函数进行映射呢?因为在</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开启之前,</span><span lang="EN-US">CPU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">拿到的地址都是物理地址,在寻址的时候,不用经过</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,直接发在地址总线上到</span><span lang="EN-US">Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中进行寻址。所以,当开启</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之后,但由于</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的存在,</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">拿到的地址需要先经过</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的转化再发送到地址总线上进行寻址,于是,必须建立对</span><span lang="EN-US">__turn_mmu_on</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">建立一个页表</span><span lang="EN-US">,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使得虚拟地址与物理地址相等。可是,</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">不可能总是拿和物理地址相等的虚拟地址吧,必须想办法让</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值拿到</span><span lang="EN-US">3G</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以上虚拟空间的地址。默认情况下,</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值是根据上一次</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值</span><span lang="EN-US">+4</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">得到的。要使</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值来一次跨越,需要使用</span><span lang="EN-US">mov</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">指令。在进入</span><span lang="EN-US">__turn_mmu_on</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之前,采用</span><span lang="EN-US">adr</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">指令,让某个寄存器拿到某函数的链接地址,然后通过</span><span lang="EN-US">mov</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">指令,使</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值从“物理地址”跨越到虚拟地址。来看下代码是怎么实现的:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">arch/arm/kernel/head.S<o:p></o:p></span></div>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" name="L139"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L139"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 139</span></a><span lang="EN-US"> </span><span lang="EN-US" style="color: red;">ldr r13, =__mmap_switched </span><span lang="EN-US"> @ address to jump to after<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L140" name="L140"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L140"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 140</span></a><span lang="EN-US"> @ mmu has been enabled<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L141" name="L141"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L141"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 141</span></a><span lang="EN-US"> adr lr, BSYM(1f) @ return (PIC) address<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L142" name="L142"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L142"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 142</span></a><span lang="EN-US"> mov r8, r4 @ set TTBR1 to swapper_pg_dir<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L143" name="L143"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L143"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 143</span></a><span lang="EN-US"> ARM( add pc, r10, #PROCINFO_INITFUNC )<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L144" name="L144"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L144"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 144</span></a><span lang="EN-US"> THUMB( add r12, r10, #PROCINFO_INITFUNC )<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L145" name="L145"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L145"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 145</span></a><span lang="EN-US"> THUMB( mov pc, r12 )<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L146" name="L146"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L146"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 146</span></a><span lang="EN-US">1: b __enable_mmu<o:p></o:p></span></pre>
<pre style="background: white;"><span lang="EN-US">__enable_mmu->__turn_mmu_on:<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" name="L451"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L451"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 451</span></a><span lang="EN-US">ENTRY(__turn_mmu_on)<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L452" name="L452"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L452"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 452</span></a><span lang="EN-US"> mov r0, r0<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L453" name="L453"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L453"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 453</span></a><span lang="EN-US"> instr_sync<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L454" name="L454"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L454"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 454</span></a><span lang="EN-US"> mcr p15, 0, r0, c1, c0, 0 @ write control reg<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L455" name="L455"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L455"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 455</span></a><span lang="EN-US"> mrc p15, 0, r3, c0, c0, 0 @ read id reg<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L456" name="L456"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L456"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 456</span></a><span lang="EN-US"> instr_sync<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L457" name="L457"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L457"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 457</span></a><span lang="EN-US"> mov r3, r3<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L458" name="L458"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L458"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 458</span></a><span lang="EN-US"> </span><span lang="EN-US" style="color: red;">mov r3, r13</span><span lang="EN-US"><o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L459" name="L459"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L459"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 459</span></a><span lang="EN-US"> </span><span lang="EN-US" style="color: red;">mov pc, r3</span><span lang="EN-US"><o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L460" name="L460"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L460"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 460</span></a><span lang="EN-US">__turn_mmu_on_end:<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L461" name="L461"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L461"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 461</span></a><span lang="EN-US">ENDPROC(__turn_mmu_on)<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L462" name="L462"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L462"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 462</span></a><span lang="EN-US"> .popsection<o:p></o:p></span></pre>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">Linux Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">mapping</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所建立的内存区域是</span><span lang="EN-US">PHYS_OFFSET~_END</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。该区域映射到了</span><span lang="EN-US">0xC0000000</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之上的虚拟地址。映射的内容包括</span><span lang="EN-US">uBoot</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">传给</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的参数</span><span lang="EN-US">atags</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">号进程使用的页表,以及</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">被加载到内存中的各个</span><span lang="EN-US">Section</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对</span><span lang="EN-US">UART</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">驱动的映射比较搞。</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">只获取了</span><span lang="EN-US">UART</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">驱动的起始地址。映射的区域是起始地址~</span><span lang="EN-US">min(0xFFFFFFF,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">起始地址</span><span lang="EN-US">+512MB)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。对应的代码段是:</span><span lang="EN-US"><o:p></o:p></span></div>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" name="L269"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L269"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 269</span></a><span lang="EN-US"> /*<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L270" name="L270"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L270"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 270</span></a><span lang="EN-US"> * Map in IO space for serial debugging.<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L271" name="L271"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L271"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 271</span></a><span lang="EN-US"> * This allows debug messages to be output<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L272" name="L272"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L272"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 272</span></a><span lang="EN-US"> * via a serial console before paging_init.<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L273" name="L273"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L273"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 273</span></a><span lang="EN-US"> */<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L274" name="L274"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L274"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 274</span></a><span lang="EN-US"> addruart r7, r3, r0<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L275" name="L275"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L275"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 275</span></a><span lang="EN-US"><o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L276" name="L276"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L276"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 276</span></a><span lang="EN-US"> mov r3, r3, lsr #SECTION_SHIFT<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L277" name="L277"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L277"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 277</span></a><span lang="EN-US"> mov r3, r3, lsl #PMD_ORDER<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L278" name="L278"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L278"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 278</span></a><span lang="EN-US"><o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L279" name="L279"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L279"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 279</span></a><span lang="EN-US"> add r0, r4, r3<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L280" name="L280"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L280"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 280</span></a><span lang="EN-US"> rsb r3, r3, #0x4000 @ PTRS_PER_PGD*sizeof(long)<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L281" name="L281"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L281"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 281</span></a><span lang="EN-US"> cmp r3, #0x0800 @ limit to 512MB<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L282" name="L282"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L282"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 282</span></a><span lang="EN-US"> movhi r3, #0x0800<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L283" name="L283"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L283"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 283</span></a><span lang="EN-US"> add r6, r0, r3<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L284" name="L284"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L284"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 284</span></a><span lang="EN-US"> mov r3, r7, lsr #SECTION_SHIFT<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L285" name="L285"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L285"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 285</span></a><span lang="EN-US"> ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L286" name="L286"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L286"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 286</span></a><span lang="EN-US"> orr r3, r7, r3, lsl #SECTION_SHIFT<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L287" name="L287"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L287"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 287</span></a><span lang="EN-US">#ifdef CONFIG_ARM_LPAE<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L288" name="L288"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L288"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 288</span></a><span lang="EN-US"> mov r7, #1 << (54 - 32) @ XN<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L289" name="L289"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L289"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 289</span></a><span lang="EN-US">#else<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L290" name="L290"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L290"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 290</span></a><span lang="EN-US"> orr r3, r3, #PMD_SECT_XN<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L291" name="L291"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L291"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 291</span></a><span lang="EN-US">#endif<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L292" name="L292"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L292"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 292</span></a><span lang="EN-US">1: str r3, [r0], #4<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L293" name="L293"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L293"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 293</span></a><span lang="EN-US">#ifdef CONFIG_ARM_LPAE<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L294" name="L294"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L294"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 294</span></a><span lang="EN-US"> str r7, [r0], #4<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L295" name="L295"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L295"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 295</span></a><span lang="EN-US">#endif<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L296" name="L296"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L296"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 296</span></a><span lang="EN-US"> add r3, r3, #1 << SECTION_SHIFT<o:p></o:p></span></pre>
<pre style="background: white;"><a href="http://www.blogger.com/blogger.g?blogID=2141466325280539355" id="L297" name="L297"></a><a href="http://lxr.linux.no/linux+v3.3/arch/arm/kernel/head.S#L297"><span lang="EN-US" style="background: #F0F0F0; border: solid black 1.0pt; mso-border-alt: solid black .75pt; padding: 0cm;"> 297</span></a><span lang="EN-US"> cmp r0, r6<o:p></o:p></span></pre>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在这三段页表建立后,软件还需要为硬件做的事情是:开启</span><span lang="EN-US">DCache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、</span><span lang="EN-US">Icache</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><span lang="EN-US"> invalidate TLB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">(</span><span lang="EN-US">I+D</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">),配置</span><span lang="EN-US">Domain Access Control Register.</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以及配置</span><span lang="EN-US">PRRR</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">和</span><span lang="EN-US">NRRR</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,然后将页表的基值(</span><span lang="EN-US">PHYS_OFFSET+0x4000</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">)放到</span><span lang="EN-US">TTBR0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">和</span><span lang="EN-US">TTBR1</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中,将</span><span lang="EN-US">TTBCR</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">赋值为</span><span lang="EN-US">0.</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">然后</span><span lang="EN-US">enable MMU.</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">从此</span><span lang="EN-US">Virtual
Memory System</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">正式建立。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -26.25pt;">
<span lang="EN-US">四.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页表建立的第二阶段</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">第一阶段建立完成后,</span><span lang="EN-US">I/O </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以及</span><span lang="EN-US">Main Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">还都没有建立映射呢。所以,在之后还要进一步建立页表。建立第二部分的页表也分为三部分:</span><span lang="EN-US">1. Main Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US">2. I/O Memory. 3. Vector Page.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; mso-list: l0 level2 lfo2; tab-stops: list 72.0pt; text-indent: -18.0pt;">
<span lang="EN-US">1.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span lang="EN-US">Main Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">Main Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">是主存。在第一阶段中,对</span><span lang="EN-US">Main Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">只映射了很小一部分的物理空间。在</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开启之后,需要将全部的物理内存都进行映射。可是,主存到底有多大,目前我们还不知道。如何知道?有两种渠道,三种方式。第一种渠道是通过</span><span lang="EN-US">Boot Loader</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">;第二种渠道是通过配置</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">时候的</span><span lang="EN-US">CONFIG_CMDLINE</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。对于通过</span><span lang="EN-US">Boot Loader</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">得到主存大小的,有两种方式,其一是</span><span lang="EN-US">FDT,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">其二是</span><span lang="EN-US">Atags</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。这两种方式的原理是一样的,都是</span><span lang="EN-US">Boot Loader</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">将硬件信息存放在特定的数据结构中,其数据结构的地址存放在</span><span lang="EN-US">R2</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">寄存器中传递到</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中。通常其数据结构的地址存放在物理地址最开始的</span><span lang="EN-US">16KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">空间中,其大小不超过一个页(</span><span lang="EN-US">4KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">是怎样将这些信息检测出来呢?在</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中对于通过</span><span lang="EN-US">Atags</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">可能传递的每一个类型参数,设置了对应的处理函数,并将这些类型和处理函数放在特殊的</span><span lang="EN-US">.section</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中</span><span lang="EN-US">,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对于</span><span lang="EN-US">Atags</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">传递的每一个参数,</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">都要遍历这个</span><span lang="EN-US">section</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,找到匹配的类型,然后调用处理函数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对与</span><span lang="EN-US">CONFIG_CMDLINE</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">方式指定主存大小的方法,</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对于其处理方式和</span><span lang="EN-US">Atags</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的处理是类似的。关于这两种方式,内核详细的处理过程可以在查看之前的博文:</span><u><span lang="EN-US"><a href="http://haifeng-hust.blogspot.com/2012/07/arm-linux-1-cmdline.html"><span style="color: windowtext;">Linux/ARM</span><span lang="EN-US" style="color: windowtext; font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span lang="EN-US">物理内存探测</span></span><span style="color: windowtext;">(1) - CMDLINE</span></a></span></u><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><u><span lang="EN-US"><a href="http://haifeng-hust.blogspot.com/2012/07/arm2-uboot-tags.html"><span style="color: windowtext;">Linux/ARM</span><span lang="EN-US" style="color: windowtext; font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span lang="EN-US">物理内存探测</span></span><span style="color: windowtext;">(2)-uBoot tags</span></a></span></u><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">得到具体的内存信息后,就要建立映射了。建立映射的方式线性映射的。物理内存开始的地方对应</span><span lang="EN-US">0xC0000000. </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在第二部分虚拟地址划分中谈到过:</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">默认的</span><span lang="EN-US">vmalloc</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的大小是</span><span lang="EN-US">240MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,即最小的</span><span lang="EN-US">VMALLOC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">区间的大小是</span><span lang="EN-US">240MB(3G+768MB~0xFF000000).</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">于是,</span><span lang="EN-US">1). </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">当主存的大小超过</span><span lang="EN-US">768MB,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">超过</span><span lang="EN-US">768MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的主存将不会<b>线性</b>映射到</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中。</span><span lang="EN-US">2). </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">当主存小于</span><span lang="EN-US">768MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的时候,主存全部<b>线性</b>映射到</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中。这样</span><span lang="EN-US">VMALLOC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">区间将为:</span><span lang="EN-US">3G+physical
Memory Length~0xFF000000.</span><br />
<span lang="EN-US"><br /></span>
注1:<br />
<span style="color: red;">vmalloc区间默认大小是240MB(arch/arm/mm/mmu.c)</span><br />
<span style="color: red;">static void * __initdata vmalloc_min =</span><br />
<span style="color: red;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);</span><br />
<span style="color: red;"><br /></span>
<span style="color: red;">/*</span><br />
<span style="color: red;"> * vmalloc=size forces the vmalloc area to be exactly 'size'</span><br />
<span style="color: red;"> * bytes. This can be used to increase (or decrease) the vmalloc</span><br />
<span style="color: red;"> * area - the default is 240m.</span><br />
<span style="color: red;"> */</span><br />
<div>
<br /></div>
<div>
注2:</div>
<span lang="EN-US" style="color: blue;">建立映射的时候,除了给出地址的对应关系外,还要给出访问权限以及Cacheable,Bufferable,Shareable之类的信息。在访问权限方面,对于Kernel Space的映射,当用户进程在User mode下时,不能访问Kernel Space的空间;当用户进程在Kernel Mode下,对Kernel Space是可读可写的。</span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; mso-list: l0 level2 lfo2; tab-stops: list 72.0pt; text-indent: -18.0pt;">
<span lang="EN-US">2.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span lang="EN-US">I/O Memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US">ARM</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中,</span><span lang="EN-US">I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">和物理内存是统一编址的。</span><span lang="EN-US">I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射是通过</span><span lang="EN-US">Special Machine</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US">I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">初始化的时候调用</span><span lang="EN-US">iotable</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">将</span><span lang="EN-US">I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">编址进入</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的。其</span><span lang="EN-US">I/O</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">端口的物理地址,要映射的虚拟地址以及虚拟地址的长度都要求</span><span lang="EN-US">Special Machine</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">静态定义好。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 51.05pt; mso-char-indent-count: 0; mso-para-margin-left: 4.86gd; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; mso-list: l0 level2 lfo2; tab-stops: list 72.0pt; text-indent: -18.0pt;">
<span lang="EN-US">3.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span lang="EN-US">Vector Page</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">MMU enable</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,依靠</span><span lang="EN-US">system control register cp15.c1</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">寄存器的第</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位。</span><span lang="EN-US">system
control register cp15.c1</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">寄存器中的</span><span lang="EN-US">V</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位,也决定当出现异常的时候</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值是多少。如果</span><span lang="EN-US">V</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位置位,则当异常发生的时候其</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值为</span><span lang="EN-US">0Xffff0000, </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">如果</span><span lang="EN-US">V</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">不置位,则异常发生时,</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值为</span><span lang="EN-US">0x0. </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">通常情况,</span><span lang="EN-US">V</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位都是置位的。于是,当</span><span lang="EN-US">V</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">置位时,需要为</span><span lang="EN-US">0xffff0000</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的虚拟地址映射</span><span lang="EN-US">vector page. </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">当映射完成后,需要将</span><span lang="EN-US">vector</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的内容</span><span lang="EN-US">memcpy</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">0Xffff0000</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">映射的物理页</span><span lang="EN-US">(vector page)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中</span><span lang="EN-US">. </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">注意一点:</span><span lang="EN-US">vector page</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的物理页被映射了两次,一次是线性映射,一次是映射到</span><span lang="EN-US">0xffff0000. 0xffff0000</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对应的</span><span lang="EN-US">Page table</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">属性是</span><span lang="EN-US">read only. vector page</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">线性映射的</span><span lang="EN-US">page table</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中定义的</span><span lang="EN-US">memory</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">属性是</span><span lang="EN-US">privileged mode--r/w, user mod--no access. </span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在通过</span><span lang="EN-US">memcpy</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">填充</span><span lang="EN-US">vector page</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的时候,用的虚拟地址是线性映射的虚拟地址</span><span lang="EN-US">(</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">如果直接用</span><span lang="EN-US">0Xffff0000,</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">就出现读写错误啦</span><span lang="EN-US" style="font-family: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: Wingdings;">J</span><span lang="EN-US">)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">下图是</span><span lang="EN-US"> PHYS_OFFSET:8MB, Main Memory Length:600MB, I/O:0xF6000000,Length
48MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射图:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNtfw5q2XPcofSMqG2OIWixi-CNTofWe89eX-VXpC2xK-s0BMVMVihLunFpJ4wYiCqnWBj6pljZZ13yAcyMsRIzWTZtv0GmXFVOyEu9Fvt28tpp19W0hUOriQljLXJcXX7bQfVz4bFrSU/s1600/Picture3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNtfw5q2XPcofSMqG2OIWixi-CNTofWe89eX-VXpC2xK-s0BMVMVihLunFpJ4wYiCqnWBj6pljZZ13yAcyMsRIzWTZtv0GmXFVOyEu9Fvt28tpp19W0hUOriQljLXJcXX7bQfVz4bFrSU/s640/Picture3.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US"></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2; text-indent: -26.25pt;">
<span lang="EN-US">五.<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">怎样维护页表</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对于</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的页表建立后,基本上是一劳永逸了。不是<b>完全</b>一劳永逸,是因为对于非线性映射的页表在</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">运行中可以动态修改的。这个修改直接针对</span><span lang="EN-US">init_mm—0</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">号进程的页表,也尊称为主页表。由于</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的页表对于各个进程是共享的,所以,如果主页表修改后,会通过</span><span lang="EN-US">page fault</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的方式同步到其他进程的</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">页表中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">ARM Linux Kernel</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">采用了</span><span lang="EN-US">Section
1-level</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">和</span><span lang="EN-US"> 2-level</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">混合的映射方式。对于</span><span lang="EN-US">Section</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">映射,只要把映射物理内存基值</span><span lang="EN-US">1MB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对齐,存放在</span><span lang="EN-US">PGD</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中,就可以了。对于</span><span lang="EN-US">2-level</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射,</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">就有点小复杂了。复杂的原因是很多人学习</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">都是从</span><span lang="EN-US">X86</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开始的,所以遇到</span><span lang="EN-US">ARM</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">这种映射方式就觉得有点奇怪。首先对于</span><span lang="EN-US">2-level</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射,在第一级的页表映射项中,下一级映射的基值占了</span><span lang="EN-US">22</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位,也就是</span><span lang="EN-US">1KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对齐的(看下图)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7x1Q-14nNDMidGP0Fj4WL9clUdek1mwWiQUHRzHo8agSaREjLBv7Et4mSzkP5RAIw46O9_kEcOaaiMqMuxfhu4OJZfuVIEUpUgGKHm6m0gEZtxujZuJ7JPsB3FifQ5zpjrhwE7QqzdWA/s1600/Picture4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7x1Q-14nNDMidGP0Fj4WL9clUdek1mwWiQUHRzHo8agSaREjLBv7Et4mSzkP5RAIw46O9_kEcOaaiMqMuxfhu4OJZfuVIEUpUgGKHm6m0gEZtxujZuJ7JPsB3FifQ5zpjrhwE7QqzdWA/s640/Picture4.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US"></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">又由于在二级映射的时候,虚拟地址只用了</span><span lang="EN-US">8</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位</span><span lang="EN-US">(19~12)</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,所以应该可以寻址</span><span lang="EN-US">256</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">个</span><span lang="EN-US">index</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,每项占</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">个字节,所以,每个二级页表是</span><span lang="EN-US">1KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。但是,由于</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在做内存管理的时候,采取</span><span lang="EN-US">4KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">作为一个管理单元,于是每个页就可以放</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">个二级页表了。但是,由于在硬件支持的页表项中,属性为不足以提供足够的信息为</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">进行内存管理使用,于是,</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">就需要在其他地方提供额外的信息来让上层的内存管理使用</span><sup><span lang="EN-US">[4]</span></sup><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。于是,</span><span lang="EN-US">ARM Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">采用的方法是使用两个页表项。一个</span><span lang="EN-US">MMU</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用,另外一个提供额外的属性信息。所以,事实上一个</span><span lang="EN-US">4KB</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的页就提供了两个二级页表。每个二级页表由一个</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">版本和</span><span lang="EN-US">Hardware</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">版本共同组成。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTy382Ma0CCrSQlR6RdDNC5axAwyXaRdldfY_fyZnGKcIq1H2WbWru05Nx3YiAwJP285UBnCl-uO_KNr-uo6gFgjguw-_heHhCgwngOgKB21GFEF2l5Dh98Cs0FsMCrBTXniHHFy0MYiw/s1600/Picture5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTy382Ma0CCrSQlR6RdDNC5axAwyXaRdldfY_fyZnGKcIq1H2WbWru05Nx3YiAwJP285UBnCl-uO_KNr-uo6gFgjguw-_heHhCgwngOgKB21GFEF2l5Dh98Cs0FsMCrBTXniHHFy0MYiw/s640/Picture5.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">每一块物理内存,可以对应</span><span lang="EN-US">N</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">个虚拟地址。以上介绍的是</span><span lang="EN-US">Kernel Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">映射,对于</span><span lang="EN-US">User Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射要依赖</span><span lang="EN-US">Page fault</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">来进行。每一个</span><span lang="EN-US">User Space</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的映射都是</span><span lang="EN-US">2-level</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 26.25pt; mso-char-indent-count: 0; text-indent: 0cm;">
<br /></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">参考:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">[1]. <a href="http://www.linux-arm.org/LinuxBootLoader/SMPBoot">http://www.linux-arm.org/LinuxBootLoader/SMPBoot</a><o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">[2]. <a href="http://www.linux-arm.org/LinuxBootLoader/SMPBoot">http://www.linux-arm.org/LinuxBootLoader/SMPBoot</a><o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">[3]. /Documentation/arm/memory.txt<o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-char-indent-count: 0; text-indent: 0cm;">
<span lang="EN-US">[4]. <a href="http://elinux.org/Tims_Notes_on_ARM_memory_allocation">http://elinux.org/Tims_Notes_on_ARM_memory_allocation</a></span><br />
<br />
<span style="color: blue;">注:2012年8月29日,添加了访问权限的内容。</span></div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路399号31.209301 121.58093531.1821375 121.54145299999999 31.2364645 121.620417tag:blogger.com,1999:blog-2141466325280539355.post-58939983509742482922012-07-30T07:15:00.000-07:002012-08-09T23:45:08.066-07:00Linux/ARM物理内存探测(2)-uBoot atags<br />
<h3 style="background: white; margin-bottom: .0001pt; margin-bottom: 0cm; margin-left: 0cm; margin-right: 0cm; margin-top: 9.0pt;">
<span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">Linux/ARM</span><span style="font-size: 10.5pt; font-weight: normal;">物理内存的探测不同于</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">Linux/X86,</span><span style="font-size: 10.5pt; font-weight: normal;">在</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;"><a href="http://haifeng-hust.blogspot.com/2012/07/arm-linux-1-cmdline.html">Arm
Linux <span lang="EN-US" style="font-family: 宋体;"><span lang="EN-US">物理内存探测</span></span> (1) – CMDLINE</a></span><span style="font-size: 10.5pt; font-weight: normal;">一文中有提及过。在本文中,重点谈下</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">Kernel</span><span style="font-size: 10.5pt; font-weight: normal;">如何解析</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">uBoot</span><span style="font-size: 10.5pt; font-weight: normal;">传过来的内存参数。</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">tag</span><span style="font-size: 10.5pt; font-weight: normal;">数据结构是</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">uBoot</span><span style="font-size: 10.5pt; font-weight: normal;">构建的,其数据结构分布图如下:</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;"><o:p></o:p></span></h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://hi.csdn.net/attachment/201107/23/9425_13113916274kbK.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="http://hi.csdn.net/attachment/201107/23/9425_13113916274kbK.jpg" width="640" /></a></div>
<div>
<span style="font-size: 14px;">与内存有关的两个tag,一个是mem32,另外一个是cmd. 关于cmd这个tag,和build Kernel是的config_cmdline作用是一样的,但是具体选择哪一个还是两者都拷贝在一起,是根据.config的配置情况。对于cmdline的parse,在</span><a href="http://haifeng-hust.blogspot.com/2012/07/arm-linux-1-cmdline.html" style="background-color: white; font-family: Calibri, sans-serif; font-size: 10.5pt;">Arm Linux <span lang="EN-US" style="font-family: 宋体;"><span lang="EN-US">物理内存探测</span></span> (1) – CMDLINE</a> 有所描述,这里不再重复。</div>
<div style="background: white; line-height: 19.5pt;">
<span lang="EN-US" style="font-family: Arial, sans-serif; font-size: 10.5pt;"></span><span lang="EN-US" style="font-family: Arial, sans-serif; font-size: 10.5pt;"><o:p></o:p></span></div>
<h3 style="background: white; margin-bottom: .0001pt; margin-bottom: 0cm; margin-left: 0cm; margin-right: 0cm; margin-top: 9.0pt;">
<span style="font-size: 10.5pt; font-weight: normal;">在</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">Kernel</span><span style="font-size: 10.5pt; font-weight: normal;">中处理</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">uBoot</span><span style="font-size: 10.5pt; font-weight: normal;">传递的</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;">tag</span><span style="font-size: 10.5pt; font-weight: normal;">参数的过程如下</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;"><o:p></o:p></span></h3>
<h3 style="background: white; margin-bottom: .0001pt; margin-bottom: 0cm; margin-left: 0cm; margin-right: 0cm; margin-top: 9.0pt;">
<span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 10.5pt; font-weight: normal;"> </span></h3>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch->setup_machine_tags:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">843 static struct machine_desc * __init
setup_machine_tags(unsigned int nr)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 844
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 845
struct tag *tags = (struct tag *)&init_tags;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 846
struct machine_desc *mdesc = NULL, *p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 847
char *from = default_command_line;//Kernel 's data<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 848<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 849
init_tags.mem.start = PHYS_OFFSET;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 850<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 851
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 852
* locate machine in the list of supported machines.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 853
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 854
for_each_machine_desc(p)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 855 if (nr == p->nr) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 856 printk("Machine:
%s\n", p->name);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 857 mdesc = p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 858 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 859 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 860<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 861
if (!mdesc) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 862 early_print("\nError:
unrecognized/unsupported machine ID"<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 863 " (r1 =
0x%08x).\n\n", nr);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 864 dump_machine_table(); /* does
not return */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 865
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 866<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <b>867
if (__atags_pointer)<o:p></o:p></b></span></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 868 tags =
phys_to_virt(__atags_pointer);<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US"> 869
else if (mdesc->atag_offset)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 870 tags = (void *)(PAGE_OFFSET +
mdesc->atag_offset);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 871<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 872
#if defined(CONFIG_DEPRECATED_PARAM_STRUCT)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 873
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 874
* If we have the old style parameters, convert them to<o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 5.25pt;">
<span lang="EN-US">875 * a tag list.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 876
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 877
if (tags->hdr.tag != ATAG_CORE)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 878 convert_to_tag_list(tags);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 879
#endif<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 880<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 881
if (tags->hdr.tag !=
ATAG_CORE) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 882
#if defined(CONFIG_OF)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 883 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 884 * If CONFIG_OF is set, then
assume this is a reasonably<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 885 * modern system that should
pass boot parameters<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 886 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 887 early_print("Warning:
Neither atags nor dtb found\n");<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 888
#endif<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 889 tags = (struct tag
*)&init_tags;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 890
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 891<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 892
if (mdesc->fixup)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 893 mdesc->fixup(tags,
&from, &meminfo);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 894<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <b>895
if (tags->hdr.tag == ATAG_CORE) {<o:p></o:p></b></span></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 896 if (meminfo.nr_banks != 0)<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 897 squash_mem_tags(tags);<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 898 save_atags(tags);<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 899 parse_tags(tags);<o:p></o:p></span></b></div>
<div class="MsoNormal">
<b><span lang="EN-US"> 900
}<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US"> 901<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 902
/* parse_early_param needs a boot_command_line */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 903
strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 904<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 905
return mdesc;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 906
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">tag</span><span style="font-family: 宋体;">参数存放在</span><span lang="EN-US">r2</span><span style="font-family: 宋体;">中从</span><span lang="EN-US">uBoot</span><span style="font-family: 宋体;">传递到</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">中,并被放在</span><span lang="EN-US">__atags_pointer</span><span style="font-family: 宋体;">中。在</span><span lang="EN-US">895</span><span style="font-family: 宋体;">行~</span><span lang="EN-US">900</span><span style="font-family: 宋体;">行,如果是</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">数据结构,则会进行</span><span lang="EN-US">tags</span><span style="font-family: 宋体;">的</span><span lang="EN-US">parse.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch->setup_machine_tags->parse_tags:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">748 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 749 *
Parse all tags in the list, checking both the global and architecture<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 750 *
specific tag tables.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 751 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 752
static void __init parse_tags(const struct tag *t)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 753
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 754
for (; t->hdr.size; t = tag_next(t))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 755 if (!parse_tag(t))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 756 printk(KERN_WARNING<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 757 "Ignoring
unrecognised tag 0x%08x\n",<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 758
t->hdr.tag);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 759
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">从</span><span lang="EN-US">754</span><span style="font-family: 宋体;">行的</span><span lang="EN-US">for</span><span style="font-family: 宋体;">循环,可以看出其会对</span><span lang="EN-US">tags</span><span style="font-family: 宋体;">进行遍历,对每一个</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">都进行一次</span><span lang="EN-US">parse_tag</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch->setup_machine_tags->parse_tags->parse_tag:<o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 5.25pt;">
<span lang="EN-US">729 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 730 *
Scan the tag table for this tag, and call its parse function.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 731 *
The tag table is built by the linker from all the __tagtable<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 732 *
declarations.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 733 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 734
static int __init parse_tag(const struct tag *tag)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 735
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 736
extern struct tagtable __tagtable_begin, __tagtable_end;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 737
struct tagtable *t;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 738<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 739
for (t = &__tagtable_begin; t < &__tagtable_end; t++)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 740 if (tag->hdr.tag ==
t->tag) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 741 t->parse(tag);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 742 break;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 743 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 744<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 745
return t < &__tagtable_end;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 746
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">__tagtable_begin</span><span style="font-family: 宋体;">~</span><span lang="EN-US">__tagtable_end</span><span style="font-family: 宋体;">是什么呢?以</span><span lang="EN-US">mem</span><span style="font-family: 宋体;">参数为例,</span><span lang="EN-US">arch/arm/kernel/setup.c</span><span style="font-family: 宋体;">中定义了关于</span><span lang="EN-US">mem tag</span><span style="font-family: 宋体;">结构的定义。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">651 static int __init parse_tag_mem32(const
struct tag *tag)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 652
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 653
return arm_add_memory(tag->u.mem.start, tag->u.mem.size);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 654
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 655<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 656
__tagtable(ATAG_MEM, parse_tag_mem32);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">656</span><span style="font-family: 宋体;">行的宏为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">188 #define __tag __used
__attribute__((__section__(".taglist.init")))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">189 #define __tagtable(tag, fn) \<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">190 static const struct tagtable
__tagtable_##fn __tag = { tag, fn }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">188</span><span style="font-family: 宋体;">行表示采用</span><span lang="EN-US">__tag</span><span style="font-family: 宋体;">属性的变量将被连接器放在</span><span lang="EN-US">.taglist.init</span><span style="font-family: 宋体;">的</span><span lang="EN-US">section</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">arch/arm/kernel/vmlinux.lds.S<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">153
.init.tagtable : {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">154 __tagtable_begin = .;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">155 *(.taglist.init)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">156 __tagtable_end = .;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">157
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">153</span><span style="font-family: 宋体;">~</span><span lang="EN-US">157</span><span style="font-family: 宋体;">行表示该</span><span lang="EN-US">section</span><span style="font-family: 宋体;">的前后地址分别为</span><span lang="EN-US">__tagtable_begin</span><span style="font-family: 宋体;">和</span><span lang="EN-US">__tagtable_end.</span><span style="font-family: 宋体;">也就是说</span><span lang="EN-US">parse_tag</span><span style="font-family: 宋体;">将会遍历这个</span><span lang="EN-US">section.</span><span style="font-family: 宋体;">对于每一个从</span><span lang="EN-US">uBoot</span><span style="font-family: 宋体;">中传递</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">参数列表的每一个</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">,</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">都会遍历所有的。</span><span lang="EN-US">taglist.init</span><span style="font-family: 宋体;">段标识的</span><span lang="EN-US">struct
tagtable</span><span style="font-family: 宋体;">数据结构,判断是否其</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">表示是否相等,若相等则调用对应注册的</span><span lang="EN-US">parse</span><span style="font-family: 宋体;">函数。以“</span><span lang="EN-US">mem</span><span style="font-family: 宋体;">”为例,如果是</span><span lang="EN-US">memory</span><span style="font-family: 宋体;">的</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">,则会调用</span><span lang="EN-US">parse_tag_mem32</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">parse_tag_mem32</span><span style="font-family: 宋体;">的</span><span lang="EN-US">651~656</span><span style="font-family: 宋体;">行,是将</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">对应的属性传递给</span><span lang="EN-US">arm_add_memory</span><span style="font-family: 宋体;">,记录到</span><span lang="EN-US">meminfo</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span><br />
<span style="font-family: 宋体;"><br /></span>
<span style="font-family: 宋体;"><b><span style="color: red;">注意一点</span></b>:由于Kernel先处理atags中的ATAG_MEM类型参数,后处理cmdline中的mem参数,因此,若atags.ATAG_MEM和cmdline都存在的话,以cmdline为准。这是因为,在后处理的cmdline中,将之前解析的atags中的mem参数给销毁了:</span><br />
<span style="font-family: 宋体;"></span><br />
<span style="font-family: 宋体;"> 537 /*</span><br />
<span style="font-family: 宋体;"> 538 * Pick out the memory size. We look for mem=size@start,</span><br />
<span style="font-family: 宋体;"> 539 * where start and size are "size[KkMm]"</span><br />
<span style="font-family: 宋体;"> 540 */</span><br />
<span style="font-family: 宋体;"> 541 static int __init early_mem(char *p)</span><br />
<span style="font-family: 宋体;"> 542 {</span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 543 static int usermem __initdata = 0;</span></b></span><br />
<span style="font-family: 宋体;"> 544 unsigned long size;</span><br />
<span style="font-family: 宋体;"> 545 phys_addr_t start;</span><br />
<span style="font-family: 宋体;"> 546 char *endp;</span><br />
<span style="font-family: 宋体;"> 547</span><br />
<span style="font-family: 宋体;"> 548 /*</span><br />
<span style="font-family: 宋体;"> 549 * If the user specifies memory size, we</span><br />
<span style="font-family: 宋体;"> 550 * blow away any automatically generated</span><br />
<span style="font-family: 宋体;"> 551 * size.</span><br />
<span style="font-family: 宋体;"> 552 */</span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 553 if (usermem == 0) {</span></b></span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 554 usermem = 1;</span></b></span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 555 meminfo.nr_banks = 0;</span></b></span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 556 }</span></b></span><br />
<span style="font-family: 宋体;"><b><span style="color: red;"> 557</span></b></span><br />
<span style="font-family: 宋体;"> 558 start = PHYS_OFFSET;</span><br />
<span style="font-family: 宋体;"> 559 size = memparse(p, &endp);</span><br />
<span style="font-family: 宋体;"> 560 if (*endp == '@')</span><br />
<span style="font-family: 宋体;"> 561 start = memparse(endp + 1, NULL);</span><br />
<span style="font-family: 宋体;"> 562</span><br />
<span style="font-family: 宋体;"> 563 arm_add_memory(start, size);</span><br />
<span style="font-family: 宋体;"> 564</span><br />
<span style="font-family: 宋体;"> 565 return 0;</span><br />
<span style="font-family: 宋体;"> 566 }</span><br />
<span style="font-family: 宋体;"> 567 early_param("mem", early_mem);</span></div>
<div class="MsoNormal">
但是,atags同时也会传cmdline参数,这个和build Kernel是的cmdline参数是不矛盾的。具体取其一,还是两者都有效,取决于如何配置Linux Kernel.<br />
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">图片来自:</span><span lang="EN-US"><a href="http://blog.csdn.net/linyt/article/details/6627664">http://blog.csdn.net/linyt/article/details/6627664</a><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">参考:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1.</span><span lang="EN-US"> http://blog.csdn.net/linyt/article/details/6627664<o:p></o:p></span></div>hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-12280305168303056432012-07-30T02:53:00.002-07:002012-07-30T07:17:10.170-07:00Linux/ARM物理内存探测(1) - CMDLINE<br />
<div class="MsoNormal">
<span style="font-family: 宋体;">ARM Linux中物理内存的探测并不像X86那样复杂。在X86中,物理内存的探测完全依赖于BIOS中的E820数据结构。对于ARM,物理内存的探测,其实谈不上“探测”,完全靠手工指定。指定的方法有两种:</span><span style="font-family: 宋体;">第一种是通过</span><span lang="EN-US">uBoot</span><span style="font-family: 宋体;">向</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">中传递参数,第二种是通过</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">CONFIG_CMDLINE</span><span style="font-family: 宋体;">配置项。本文对</span><span lang="EN-US">CMDLINE</span><span style="font-family: 宋体;">中传递的的</span><span lang="EN-US">mem</span><span style="font-family: 宋体;">参数进行总结。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Linux Kernel </span><span style="font-family: 宋体;">设置了各个可能参数的名字和处理函数。比如物理内存的参数名字是</span><span lang="EN-US">”mem”</span><span style="font-family: 宋体;">和</span><span lang="EN-US">”early_mem”</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 5.25pt;">
<span lang="EN-US">arch/arm/kernel/setup.c</span><span style="font-family: 宋体;">:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">567 early_param("mem",
early_mem);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">567</span><span style="font-family: 宋体;">行的宏展开为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">251 #define early_param(“mem”, early_mem) \<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">252
__setup_param(“mem”, early_mem, early_mem, 1)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">238 #define __setup_param(str, unique_id,
fn, early) \<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">239
static const char __setup_str_early_mem[] __initconst __aligned(1) = “mem”;
\<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">241
static struct obs_kernel_param __setup_early_mem __used __section(.init.setup) __attribute__((aligned((sizeof(long))))) \<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">244 = { __setup_str_ early_mem, early_mem,
1 }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">定义了一个</span><span lang="EN-US">obs_kernel_param</span><span style="font-family: 宋体;">结构体,其结构体的定义为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">226 struct obs_kernel_param {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">227
const char *str;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">228
int (*setup_func)(char *);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">229
int early;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">230 };<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">以上,</span><span lang="EN-US">238</span><span style="font-family: 宋体;">~</span><span lang="EN-US">244</span><span style="font-family: 宋体;">行,定义了物理内存的</span><span lang="EN-US">”</span><span style="font-family: 宋体;">名字</span><span lang="EN-US">”</span><span style="font-family: 宋体;">和</span><span lang="EN-US">”</span><span style="font-family: 宋体;">处理函数</span><span lang="EN-US">”</span><span style="font-family: 宋体;">。即:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">static struct obs_kernel_param __setup_early_mem __used __section(.init.setup) __attribute__((aligned((sizeof(long))))) \<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">= { __setup_str_ early_mem, early_mem, 1 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">名字是</span><span lang="EN-US">”mem”,</span><span style="font-family: 宋体;">处理函数是</span><span lang="EN-US">”early”.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">下面,介绍一下</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">是怎样利用</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">中物理内存的参数来设置使用的物理内存的。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">中,定义物理内存的方式为:</span><span lang="EN-US">mem=size@start</span><span style="font-family: 宋体;">。这个</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">是在</span><span lang="EN-US">.config</span><span style="font-family: 宋体;">文件中指定的</span><span lang="EN-US">CONFIG_CMDLINE<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">arch/arm/kernel/setup.c:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch()<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">944
parse_early_param();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">946
sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]),
meminfo_cmp, NULL);//</span><span style="font-family: 宋体;">将所有的</span><span lang="EN-US">bank</span><span style="font-family: 宋体;">按照</span><span lang="EN-US">start</span><span style="font-family: 宋体;">的值进行排序。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch-> parse_early_param<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">409 /* Arch code calls this early on, or if
not, just before other parsing. */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">410 void __init parse_early_param(void)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">411 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">412
static __initdata int done = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">413
static __initdata char tmp_cmdline[COMMAND_LINE_SIZE];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">414<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">415
if (done)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">416 return;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">417<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">418
/* All fall through to do_early_param. */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">419
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">420
parse_early_options(tmp_cmdline);//Done nothing<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">421
done = 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">422 } <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch-> parse_early_param->
parse_early_options</span><span style="font-family: 宋体;">:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">404 void __init parse_early_options(char
*cmdline)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">405 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">406
parse_args("early options", cmdline, NULL, 0, do_early_param);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">407 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">406</span><span style="font-family: 宋体;">行的</span><span lang="EN-US">parse_args</span><span style="font-family: 宋体;">循环调用</span><span lang="EN-US">do_early_param</span><span style="font-family: 宋体;">止到</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">中的各个参数遍历完。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">start_kernel->setup_arch-> parse_early_param->
parse_early_options->do_early_param:<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">385 /* Check for early params. */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">386 static int __init do_early_param(char
*param, char *val)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">387 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">388
const struct obs_kernel_param *p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">389<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">390
for (p = __setup_start; p < __setup_end; p++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">391 if ((p->early &&
parameq(param, p->str)) ||<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">392 (strcmp(param,
"console") == 0 &&<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">393 strcmp(p->str,
"earlycon") == 0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">394 ) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">395 if
(p->setup_func(val) != 0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">396
printk(KERN_WARNING<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">397
"Malformed early option '%s'\n", param);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">398 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">399
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">400
/* We accept everything at this stage. */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">401
return 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">402 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">对于</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">mem</span><span style="font-family: 宋体;">参数,调用</span><span lang="EN-US">early_mem:<o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 5.25pt;">
<span lang="EN-US">arch/arm/kernel/setup.c</span><span style="font-family: 宋体;">:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 5.25pt;">
<span lang="EN-US">537 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 538 *
Pick out the memory size. We look for
mem=size@start,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 539 *
where start and size are "size[KkMm]"<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 540 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 541
static int __init early_mem(char *p)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 542
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 543
static int usermem __initdata = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 544
unsigned long size;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 545
phys_addr_t start;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 546
char *endp;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 547<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 548
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 549
* If the user specifies memory size, we<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 550
* blow away any automatically generated<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 551
* size.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 552
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 553
if (usermem == 0) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 554 usermem = 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 555 meminfo.nr_banks = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 556
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 557<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 558
start = PHYS_OFFSET;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 559
size = memparse(p, &endp);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 560
if (*endp == '@')<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 561 start = memparse(endp + 1,
NULL);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 562<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 563
arm_add_memory(start, size);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 564<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 565
return 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 566
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">558</span><span style="font-family: 宋体;">行~</span><span lang="EN-US">561</span><span style="font-family: 宋体;">行,如果</span><span lang="EN-US">mem=256M</span><span style="font-family: 宋体;">,那么默认的</span><span lang="EN-US">@</span><span style="font-family: 宋体;">是</span><span lang="EN-US">PHYS_OFFSET</span><span style="font-family: 宋体;">。</span><span lang="EN-US">size</span><span style="font-family: 宋体;">的值为</span><span lang="EN-US">256>>20.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">563</span><span style="font-family: 宋体;">行,将</span><span lang="EN-US">cmdline</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">mem</span><span style="font-family: 宋体;">参数的值传给</span><span lang="EN-US">kernel</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">508 int __init arm_add_memory(phys_addr_t
start, unsigned long size)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 509
{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 510
struct membank *bank = &meminfo.bank[meminfo.nr_banks];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 511<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 512
if (meminfo.nr_banks >= NR_BANKS) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 513 printk(KERN_CRIT
"NR_BANKS too low, "<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 514 "ignoring memory
at 0x%08llx\n", (long long)start);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 515 return -EINVAL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 516
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 517<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 518
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 519
* Ensure that start/size are aligned to a page boundary.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 520
* Size is appropriately rounded down, start is rounded up.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 521
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 522
size -= start & ~PAGE_MASK;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 523
bank->start = PAGE_ALIGN(start);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 524
bank->size = size &
PAGE_MASK;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 525<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 526
/*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 527
* Check whether this memory region has non-zero size or<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 528
* invalid node number.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 529
*/<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 530
if (bank->size == 0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 531 return -EINVAL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 532<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 533
meminfo.nr_banks++;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 534
return 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 535
}<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">从</span><span lang="EN-US">522~524</span><span style="font-family: 宋体;">行来看,</span><span lang="EN-US">start</span><span style="font-family: 宋体;">和</span><span lang="EN-US">size</span><span style="font-family: 宋体;">都需要页对齐,然后记录到</span><span lang="EN-US">meminfo</span><span style="font-family: 宋体;">中。</span><span lang="EN-US"><o:p></o:p></span></div>hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-9544467177217085252012-06-15T19:06:00.000-07:002012-09-05T08:44:20.580-07:00认识ASID<style>
<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","sans-serif";} a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed {mso-style-priority:99; color:purple; text-decoration:underline;} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate {mso-style-priority:99; mso-style-link:"Balloon Text Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:8.0pt; font-family:"Calibri","sans-serif";} span.BalloonTextChar {mso-style-name:"Balloon Text Char"; mso-style-priority:99; mso-style-link:"Balloon Text"; font-family:"Calibri","sans-serif";} span.EmailStyle19 {mso-style-type:personal-compose; font-family:"Calibri","sans-serif"; color:windowtext;} .MsoChpDefault {mso-style-type:export-only; font-size:10.0pt;} /* Page Definitions */ @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} -->
</style> <br />
<div class="Section1">
<div class="MsoNormal">
<span style="font-family: 宋体;">注:以下讨论的前提是针对于</span><span lang="EN-US">ARM V7</span><span style="font-family: 宋体;">中</span><span lang="EN-US">Cache</span><span style="font-family: 宋体;">属性为</span><span lang="EN-US">PIPT</span><span style="font-family: 宋体;">的情况。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">ASID</span><span style="font-family: 宋体;">是</span><span lang="EN-US">ARM</span><span style="font-family: 宋体;">提供的</span><span lang="EN-US">Context ID register</span><span style="font-family: 宋体;">寄存器的低</span><span lang="EN-US">8</span><span style="font-family: 宋体;">位。它的全称是</span><span lang="EN-US">Address Space Identifier </span><span style="font-family: 宋体;">也叫</span><span lang="EN-US"> Application Space Identifier. </span><span style="font-family: 宋体;">这两个名称在</span><span lang="EN-US">ARM Reference</span><span style="font-family: 宋体;">中都提到了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">为什么要引入</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">呢?</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd;">
<span lang="EN-US">To reduce the software overhead of TLB maintenance, the VMSA distinguishes between Global pages and Process specific pages. The Address Space Identifier (ASID) identifies pages associated with a specific process and provides a mechanism for changing process specific tables without having to perform maintenance on the TLB structures.<sup>[1]</sup><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在</span><span lang="EN-US">Kernel</span><span style="font-family: 宋体;">中,对</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">的注释写的言简意赅:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">The ASID is used to tag entries in the CPU caches and TLBs.<sup>[2]</sup> <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">所以:由于每一个进程对应一个</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">,并且</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">的每一个</span><span lang="EN-US">Entry</span><span style="font-family: 宋体;">使用</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">来进行</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">,那么就不必在每一次在做进程切换的时候,都需要刷新</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">不过,这只是一个粗浅的理解。对于</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">的理解,需要和</span><span lang="EN-US">Pagetable</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">nG</span><span style="font-family: 宋体;">位放在一起讨论。下图是</span><span lang="EN-US">ARM V7</span><span style="font-family: 宋体;">的</span><span lang="EN-US">mapping entry format</span><span style="font-family: 宋体;">的</span><span lang="EN-US">first-level descriptor formats<sup>[3]</sup></span><span style="font-family: 宋体;">和</span><span lang="EN-US">second-level descriptor formats<sup>[4]</sup></span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxobFkPm911BL-A8yuOxrKSI2-iq0_fBXZ6rpiNbyh_UAzLwwsEAPmu1SY3aVM8ujwM26QjER74ws0GkiZDNNuR7T3-rjsVaX1aw4v4gboBWVw9q5YV1qMe46jxuQTOAuNdffV0cYu5Vk/s1600/image001-763254.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5754451572703447938" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxobFkPm911BL-A8yuOxrKSI2-iq0_fBXZ6rpiNbyh_UAzLwwsEAPmu1SY3aVM8ujwM26QjER74ws0GkiZDNNuR7T3-rjsVaX1aw4v4gboBWVw9q5YV1qMe46jxuQTOAuNdffV0cYu5Vk/s320/image001-763254.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLuFSOjRg54e0gaOiPkPB8kyWhff5YZlQ5pZI0y8wOkb0l_juBFQWmW1C9LNJrGS7iwII5gTWp9_MgsKP_dfCRKqzD8skGSw6yr5wlBAigHyd_6GIGlhNGY9USc7XYcnpXFsHpB8fLGLg/s1600/image002-764255.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5754451578244746610" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLuFSOjRg54e0gaOiPkPB8kyWhff5YZlQ5pZI0y8wOkb0l_juBFQWmW1C9LNJrGS7iwII5gTWp9_MgsKP_dfCRKqzD8skGSw6yr5wlBAigHyd_6GIGlhNGY9USc7XYcnpXFsHpB8fLGLg/s320/image002-764255.png" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">红色标注的地方是</span><span lang="EN-US">nG</span><span style="font-family: 宋体;">位。</span><span lang="EN-US">nG</span><span style="font-family: 宋体;">位的作用:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">nG == 0 The translation is global.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">nG == 1 The translation is process specific, meaning it relates to the current ASID, as defined by the CONTEXTIDR.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Each non-global region has an associated Address Space Identifier (ASID). These identifiers enable different translation table mappings to co-exist in a caching structure such as a TLB. This means that a new mapping of a non-global memory region can be created without removing previous mappings.<sup>[5]</sup><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">从</span><span lang="EN-US">mapping entry</span><span style="font-family: 宋体;">的</span><span lang="EN-US">format</span><span style="font-family: 宋体;">中,可以看出,</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">是否</span><span lang="EN-US">tag TLB</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">entry</span><span style="font-family: 宋体;">,是需要看</span><span lang="EN-US">mapping entry</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">nG</span><span style="font-family: 宋体;">是否置位。如果不置位,则是全局的,没有</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">去</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">;否则,</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">的</span><span lang="EN-US">entry</span><span style="font-family: 宋体;">由</span><span lang="EN-US">ASID tag</span><span style="font-family: 宋体;">,这样,</span><span lang="EN-US">CPU</span><span style="font-family: 宋体;">发出的</span><span lang="EN-US">Virtual Address</span><span style="font-family: 宋体;">在</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">中去寻址</span><span lang="EN-US">entry</span><span style="font-family: 宋体;">的时候,还需要比对</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">是否和</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">一致。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">在</span><span lang="EN-US">Linux Kernel</span><span style="font-family: 宋体;">中,通常的虚拟地址的配置是</span><span lang="EN-US">3:1</span><span style="font-family: 宋体;">的方案,即</span><span lang="EN-US">User space</span><span style="font-family: 宋体;">占</span><span lang="EN-US">0</span><span style="font-family: 宋体;">~</span><span lang="EN-US">3GB</span><span style="font-family: 宋体;">,</span><span lang="EN-US">Kernel space</span><span style="font-family: 宋体;">占</span><span lang="EN-US">3GB~4GB</span><span style="font-family: 宋体;">。每一个</span><span lang="EN-US">User space</span><span style="font-family: 宋体;">的</span><span lang="EN-US">0~3GB</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Space</span><span style="font-family: 宋体;">是独立的,而</span><span lang="EN-US">3GB~4GB</span><span style="font-family: 宋体;">的地址空间则是共享的。当用户进程在内核态的时候,其地址空间是</span><span lang="EN-US">3GB</span><span style="font-family: 宋体;">~</span><span lang="EN-US">4GB</span><span style="font-family: 宋体;">,所有的进程地址空间都是相同的(严格意义上,</span><span lang="EN-US">VMALLOC_START~VMALLOC_END</span><span style="font-family: 宋体;">的部分可能是不同的,但实际寻址上,会采用</span><span lang="EN-US">page fault</span><span style="font-family: 宋体;">的机制使其相同)。因此,对于</span><span lang="EN-US">3GB~4GB</span><span style="font-family: 宋体;">之间的空间是</span><span lang="EN-US">Global</span><span style="font-family: 宋体;">的</span><span lang="EN-US">(IOW,</span><span style="font-family: 宋体;">在</span><span lang="EN-US">TLB</span><span style="font-family: 宋体;">中,不应该由</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">去</span><span lang="EN-US">tag)</span><span style="font-family: 宋体;">。在</span><span lang="EN-US"><a href="http://hfli0.blogspot.com/2012/06/mmu-addressing.html">http://hfli0.blogspot.com/2012/06/mmu-addressing.html</a></span><span style="font-family: 宋体;">中,对</span><span lang="EN-US">mapping</span><span style="font-family: 宋体;">的初始化进行过总结。在对</span><span lang="EN-US">3GB~4GB</span><span style="font-family: 宋体;">的内存进行映射初始化的时候,其</span><span lang="EN-US">mapping entry</span><span style="font-family: 宋体;">的属性为:</span></div>
<div class="MsoNormal">
<span lang="EN-US">PMD_TYPE_SECT|PMD_SECT_AP_WRITE| PMD_SECT_WBWA | ecc_mask|0<<5</span><span style="font-family: 宋体;">,其中:</span><span lang="EN-US" style="color: #222222; font-family: Arial, sans-serif; font-size: 12pt;"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">PMD_TYPE_SECT:2<<0</span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="text-align: right;">PMD_SECT_AP_WRITE:1<<10</span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">PMD_SECT_WBWA:1<<3 | 1<<2 | 1<<12<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">0</span><span style="font-family: 宋体;">~</span><span lang="EN-US">19</span><span style="font-family: 宋体;">对应的二进制:</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">0 0 0 1 0 001 01 0 0000 0 1 1 10<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<br /></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span style="font-family: 宋体;">即:</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">nG <b><span style="color: red;">S</span></b> AP[2] Tex[2:0] AP[1:0] Domain C B<o:p></o:p></span></div>
<div align="left" class="MsoNormal" style="text-align: left;">
<span lang="EN-US">0 <b><span style="color: red;">1</span></b> 0 01 01 0 1 1<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">由于对于</span><span lang="EN-US">3GB~4GB</span><span style="font-family: 宋体;">的</span><span lang="EN-US">TLB entry</span><span style="font-family: 宋体;">是没有</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">做</span><span lang="EN-US">tag</span><span style="font-family: 宋体;">的,因此,对于内核线程是没有</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">的。这体现内核</span><span lang="EN-US">Kernel code</span><span style="font-family: 宋体;">的两个地方,在</span><span lang="EN-US">fork</span><span style="font-family: 宋体;">的时候,如果是用户进程,初始化</span><span lang="EN-US">context id</span><span style="font-family: 宋体;">为</span><span lang="EN-US">0</span><span style="font-family: 宋体;">(代码片段</span><span lang="EN-US">1</span><span style="font-family: 宋体;">);在</span><span lang="EN-US">context_switch</span><span style="font-family: 宋体;">的时候,需要对</span><span lang="EN-US">context id</span><span style="font-family: 宋体;">赋上真正意义上的</span><span lang="EN-US">asid</span><span style="font-family: 宋体;">的</span><span lang="EN-US">value</span><span style="font-family: 宋体;">(代码片段</span><span lang="EN-US">2</span><span style="font-family: 宋体;">)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">Asid</span><span style="font-family: 宋体;">是在</span><span lang="EN-US">init_new_context</span><span style="font-family: 宋体;">中分配:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">dup_mm->init_new_context:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">69 #define init_new_context(tsk,mm) (__init_new_context(tsk,mm),0)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<br /></div>
<div class="MsoNormal" style="text-indent: 5.25pt;">
<span lang="EN-US">40 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 41 * We fork()ed a process, and we need a new context for the child<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 42 * to run in. We reserve version 0 for initial tasks so we will<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 43 * always allocate an ASID. The ASID 0 is reserved for the TTBR<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 44 * register changing sequence.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 45 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 46 void __init_new_context(struct task_struct *tsk, struct mm_struct *mm)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 47 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 48 mm->context.id = 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 49 raw_spin_lock_init(&mm->context.id_lock);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 50 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 51<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">dup_mm</span><span style="font-family: 宋体;">被</span><span lang="EN-US">copy_mm</span><span style="font-family: 宋体;">调用:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">827 static int copy_mm(unsigned long clone_flags, struct task_struct *tsk)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 828 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 837<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 838 tsk->mm = NULL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 839 tsk->active_mm = NULL;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 840<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 841 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 842 * Are we cloning a kernel thread?<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 843 *<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 844 * We need to steal a active VM for that..<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 845 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 846 oldmm = current->mm;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 847 if (!oldmm)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 848 return 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 849<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 850 if (clone_flags & CLONE_VM) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 851 atomic_inc(&oldmm->mm_users);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 852 mm = oldmm;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 853 goto good_mm;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 854 }<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 855<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 856 retval = -ENOMEM;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 857 mm = dup_mm(tsk);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 858 if (!mm)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 859 goto fail_nomem;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">如果新</span><span lang="EN-US">fork</span><span style="font-family: 宋体;">的进程是</span><span lang="EN-US">fork</span><span style="font-family: 宋体;">一个</span><span lang="EN-US">kernel thread</span><span style="font-family: 宋体;">,那么该进程是没有</span><span lang="EN-US">context id</span><span style="font-family: 宋体;">的。即,不会运行到</span><span lang="EN-US">857</span><span style="font-family: 宋体;">行。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">另外,在</span><span lang="EN-US">__new_context</span><span style="font-family: 宋体;">中,有对</span><span lang="EN-US">asid</span><span style="font-family: 宋体;">进行赋值(</span><span lang="EN-US">152</span><span style="font-family: 宋体;">行和</span><span lang="EN-US">170</span><span style="font-family: 宋体;">行)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">context_switch ->switch_mm->check_context ->__new_context<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">131 void __new_context(struct mm_struct *mm)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">132 {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">133 unsigned int asid;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">134<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">135 raw_spin_lock(&cpu_asid_lock);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">136 #ifdef CONFIG_SMP<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">137 /*<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">138 * Check the ASID again, in case the change was broadcast from<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">139 * another CPU before we acquired the lock.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">140 */<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">141 if (unlikely(((mm->context.id ^ cpu_last_asid) >> ASID_BITS) == 0)) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">142 cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">143 raw_spin_unlock(&cpu_asid_lock);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">144 return;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">145 }<o:p></o:p></span></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<span lang="EN-US">146 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">147
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US">148
* At this point, it is guaranteed that the current mm (with</span></div>
<div class="MsoNormal">
<span lang="EN-US">149
* an old ASID) isn't active on any other CPU since the ASIDs</span></div>
<div class="MsoNormal">
<span lang="EN-US">150
* are changed simultaneously via IPI.</span></div>
<div class="MsoNormal">
<span lang="EN-US">151
*/</span></div>
<div class="MsoNormal">
<span lang="EN-US">152
asid = ++cpu_last_asid;</span></div>
<div class="MsoNormal">
<span lang="EN-US">153
if (asid == 0)</span></div>
<div class="MsoNormal">
<span lang="EN-US">154
asid = cpu_last_asid = ASID_FIRST_VERSION;</span></div>
<div class="MsoNormal">
<span lang="EN-US">155</span></div>
<div class="MsoNormal">
<span lang="EN-US">156
/*</span></div>
<div class="MsoNormal">
<span lang="EN-US">157
* If we've used up all our ASIDs, we need</span></div>
<div class="MsoNormal">
<span lang="EN-US">158
* to start a new version and flush the TLB.</span></div>
<div class="MsoNormal">
<span lang="EN-US">159
*/</span></div>
<div class="MsoNormal">
<span lang="EN-US">160 if
(unlikely((asid & ~ASID_MASK) == 0)) {</span></div>
<div class="MsoNormal">
<span lang="EN-US">161
asid = cpu_last_asid + smp_processor_id() + 1;</span></div>
<div class="MsoNormal">
<span lang="EN-US">162
flush_context();</span></div>
<div class="MsoNormal">
<span lang="EN-US">163 #ifdef CONFIG_SMP</span></div>
<div class="MsoNormal">
<span lang="EN-US">164
smp_wmb();</span></div>
<div class="MsoNormal">
<span lang="EN-US">165
smp_call_function(reset_context, NULL, 1);</span></div>
<div class="MsoNormal">
<span lang="EN-US">166 #endif</span></div>
<div class="MsoNormal">
<span lang="EN-US">167
cpu_last_asid += NR_CPUS;</span></div>
<div class="MsoNormal">
<span lang="EN-US">168
}</span></div>
<div class="MsoNormal">
<span lang="EN-US">169</span></div>
<div class="MsoNormal">
<span lang="EN-US">170
set_mm_context(mm, asid);</span></div>
<div class="MsoNormal">
<span lang="EN-US">171
raw_spin_unlock(&cpu_asid_lock);</span></div>
<div class="MsoNormal">
<span lang="EN-US">172 }</span></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">但是,对于</span><span lang="EN-US">context_switch</span><span style="font-family: 宋体;">,如果将要调度到</span><span lang="EN-US">CPU</span><span style="font-family: 宋体;">上运行的是内核线程,则不会运行</span><span lang="EN-US">switch_mm</span><span style="font-family: 宋体;">的。</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体;">以上的两个代码片段是</span><span lang="EN-US">Kernel code</span><span style="font-family: 宋体;">中两个对</span><span lang="EN-US">asid</span><span style="font-family: 宋体;">赋值的地方。从以上分析来看,对于内核线程,确实是没有</span><span lang="EN-US">asid</span><span style="font-family: 宋体;">的。另外,从</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">的名字</span><span lang="EN-US">Application
Space Identifier</span><span style="font-family: 宋体;">来看,</span><span lang="EN-US">ASID</span><span style="font-family: 宋体;">是与用户进程有关系,和内核线程是没有关系的。</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">[1]. Page B3-3, ARM ® Architecture
Reference Manual-ARM ® v7-A and ARM ® v7-R edition(ARM DDI 0406B)</span></div>
<div class="MsoNormal">
<span lang="EN-US">[2]. Line 36, arch/arm/include/asm/mmu_context.h,
Linux Kernel v3.3</span></div>
<div class="MsoNormal">
<span lang="EN-US">[3]. Page B3-8, ARM ® Architecture
Reference Manual-ARM ® v7-A and ARM ® v7-R edition(ARM DDI 0406B)</span></div>
<div class="MsoNormal">
<span lang="EN-US">[4]. Page B3-10, ARM ® Architecture
Reference Manual-ARM ® v7-A and ARM ® v7-R edition(ARM DDI 0406B)</span></div>
<div class="MsoNormal">
<span lang="EN-US">[5].Page B3-54, ARM ® Architecture
Reference Manual-ARM ® v7-A and ARM ® v7-R edition(ARM DDI 0406B)</span></div>
<br />
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
</div>
hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0tag:blogger.com,1999:blog-2141466325280539355.post-52523407847832082492012-06-12T23:09:00.001-07:002012-08-09T23:46:58.544-07:00ARM Linux 如何模拟X86 PTE中的Present Young和Dirty标志位<div class="gmail_quote">
<div lang="ZH-CN" link="blue" vlink="purple">
<div class="MsoNormal">
<span style="color: red;"><br /></span>
<span style="color: red;">注:本文是参考Kernel的代码并加上个人揣测,欢迎指正</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
在<span lang="EN-US">X86 MMU Page table entry</span>中,有三个标志位在ARM 的MMU硬件所规定的Page table entry中不提供。这三个标志位的作用如下:</div>
<div class="MsoNormal">
<br /></div>
<ul>
<li>PTE_DIRTY的作用:CPU在写操作的时候,处理器会将改位置位。说明对应的页被写过,是脏的。</li>
<li><span lang="EN-US">PTE_YOUNG</span>的作用是:MMU 寻址是将该标志置位(在换出的时候,如果此标志位被置位,说明该地址刚刚被使用过,暂时不换出此<span lang="EN-US">pte</span>对应的页,同时清除该标志位)。</li>
<li><span lang="EN-US">PTE_PRESENT</span>的作用是:<span lang="EN-US">MMU</span>在访问<span lang="EN-US">PTE</span>的时候,若<span lang="EN-US">PTE_PRESENT</span>为<span lang="EN-US">0</span>,则将地址放在CR2寄存器中,同时触发Pagefault异常。</li>
</ul>
<div class="im">
<span lang="EN-US"> <br />下图抓自:《Linux内核情景分析》</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9QALIEa0NiNB7283C3i5oLn6TbjwDTpVYbzj7zDz0GoobNotS5YpjG1YDy56NCzEmjJHHwTNpQQhvyiaPdkrwA0iIjGaqu7kQVobxDER5jLxK7Rhy35pciDgiEpzOm6nxqfwwS_qJFGw/s1600/Picture1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9QALIEa0NiNB7283C3i5oLn6TbjwDTpVYbzj7zDz0GoobNotS5YpjG1YDy56NCzEmjJHHwTNpQQhvyiaPdkrwA0iIjGaqu7kQVobxDER5jLxK7Rhy35pciDgiEpzOm6nxqfwwS_qJFGw/s640/Picture1.png" width="640" /></a></div>
<span lang="EN-US"><br /> <br /> </span>由于<span lang="EN-US">Linux</span>最早是<span lang="EN-US">build</span>在<span lang="EN-US">X86</span>平台上的,因此移植到<span lang="EN-US">ARM</span>后,也需要遵从<span lang="EN-US">X86</span>的内存管理框架,模拟<span lang="EN-US">ARM MMU</span>没有提供的<span lang="EN-US">PTE_PRESENT</span>,<span lang="EN-US"> PTE_YOUNG </span>和<span lang="EN-US">PTE_WRITE</span>。<br />
<br />
下面的分析,参考了arch/arm/include/asm/pgtable-2level.h中的注释</div>
<span lang="EN-US"><br /> <br /> Q:</span>如何模拟<span lang="EN-US">PTE_</span>DIRTY<span lang="EN-US"> ?<br /> <br /> A:<br />ARM Linux</span>是通过<span lang="EN-US">dirty</span>去标识某个页是否是可以<span lang="EN-US">PTE_WRITE</span>的。<span lang="EN-US"><br /> </span>对于新分配的页,如果<span lang="EN-US">Linux</span>版本的<span lang="EN-US">PTE</span>没有<span lang="EN-US">dirty</span>标识,对其进行写操作,会触发<span lang="EN-US">MMU</span>异常。该异常会被<span lang="EN-US">handle_pte_fault</span>处理<span style="color: #1f497d;">。</span> <span lang="EN-US"><br /> <br /> <br /> Q:</span>如何模拟<span lang="EN-US">PTE_YOUNG?<br /> <br /> A:</span>这个<span lang="EN-US">PTE_YOUNG</span>在内存被分配的时候置上,当解除映射的时候,将清掉该位。如果<span lang="EN-US">Linux</span>版本的<span lang="EN-US">PTE</span>的<span lang="EN-US">young</span>位被清除了,<span lang="EN-US">MMU</span>使用的<span lang="EN-US">PTE</span>版本的value是要清除的,但<span lang="EN-US">TLB</span>并不刷新。<br />
<div class="im">
<span lang="EN-US"><br /> <br /> Q:</span>如何模拟<span lang="EN-US">present</span>:<span lang="EN-US"><br /> <br /> A:<br /> ARM</span>的<span lang="EN-US">MMU</span>在访问的时候,不像<span lang="EN-US">X86</span>的<span lang="EN-US">MMU</span>那样<span lang="EN-US">(</span>只要看到<span lang="EN-US">*pte</span>为<span lang="EN-US">0</span>,就判断该页压根没有被加载到内存中;若<span lang="EN-US">*pte</span>不为<span lang="EN-US">0</span>,<span lang="EN-US">PTE_PRESENT</span>位为<span lang="EN-US">0</span>,就能判断该被<span lang="EN-US">swap out</span>了<span lang="EN-US">),</span>那么<span lang="EN-US">ARM MMU</span>是如何判断某页是<span lang="EN-US">swap out</span>了,还是压根就没有被加载到<span lang="EN-US">memory</span>中呢?在<span lang="EN-US">ARM Linux</span>中,若换出某页,会置位<span lang="EN-US">Linux</span>版本中的<span lang="EN-US">PTE_YOUNG</span>,清掉<span lang="EN-US">Linux</span>版本中的<span lang="EN-US">PTE_PRESENT</span>(在<span lang="EN-US">ARM Linux</span>中,每一个页表项是有两份的)。如果被换出,那么<span lang="EN-US">Linux Version</span>中的值非<span lang="EN-US">0</span>,而<span lang="EN-US">Hardware </span>值被置为<span lang="EN-US">0</span>:<span lang="EN-US"><br /> arch/arm/mm/proc-v7-2level.S<br />103 tst r1, #L_PTE_YOUNG<br /> 104 tstne r1, #L_PTE_PRESENT<br /> 105 moveq r3, #0<u></u><u></u></span></div>
</div>
</div>
<br />hfli0http://www.blogger.com/profile/06480887796071833258noreply@blogger.com0中国上海市浦东新区科苑路31.1926241 121.590192131.1654581 121.55071009999999 31.2197901 121.6296741