﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-YGB.Grushy-文章分类-Linux内核学习</title><link>http://www.cnitblog.com/ygb/category/2318.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 05:07:29 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 05:07:29 GMT</pubDate><ttl>60</ttl><item><title>存储管理－Linux内存管理的基本框架</title><link>http://www.cnitblog.com/ygb/articles/9144.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Thu, 13 Apr 2006 13:20:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/9144.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/9144.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/9144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/9144.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/9144.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to &lt;&lt;linux				内核源代码情景分析				&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;								Having any problems, send mails to viloner@163.com														Linux							...&nbsp;&nbsp;<a href='http://www.cnitblog.com/ygb/articles/9144.html'>阅读全文</a><img src ="http://www.cnitblog.com/ygb/aggbug/9144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-13 21:20 <a href="http://www.cnitblog.com/ygb/articles/9144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储管理－地址映射的全过程</title><link>http://www.cnitblog.com/ygb/articles/8953.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Mon, 10 Apr 2006 12:36:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8953.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8953.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8953.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8953.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to &lt;&lt;linux				内核源代码情景分析				&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;								Having any problems, send mails to viloner@163.com														地址映射的全过程				...&nbsp;&nbsp;<a href='http://www.cnitblog.com/ygb/articles/8953.html'>阅读全文</a><img src ="http://www.cnitblog.com/ygb/aggbug/8953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-10 20:36 <a href="http://www.cnitblog.com/ygb/articles/8953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>预备知识－i386页式内存管理机制</title><link>http://www.cnitblog.com/ygb/articles/8876.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sat, 08 Apr 2006 08:00:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8876.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8876.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8876.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8876.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Refer to &lt;&lt;linux</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核源代码情景分析</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Having any problems, send mails to viloner@163.com<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">i386</span>
				</b>
				<b>
						<span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页式内存管理机制</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存管理有两种，一种是段式管理，另一种是页式管理，而页式管理更为先进。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">80386</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的段式内存管理机制，是将指令中结合段寄存器使用的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">32</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位逻辑地址映射</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转换</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成同样是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">32</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位的物理地址。之所以称为“物理地址”，是因为这是真正放到地址总线上去，并用以寻访物理上存在着的具体内存单元的地址。但是，段式存储管理机制的灵活性和效率都比较差。一方面“段”是可变长度的，这就给盘区交换操作带来了不便</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">;</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一方面，如果为了增加灵活性而将一个进程的空间划分成很多小段时，就势必要求在程序中频繁地改变段寄存器的内容。同时，如果将段分小，虽然一个段描述表中可容纳</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">8192</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个描述项</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为有</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">13</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位下标</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也未必就能保证足够使用。所以，比较好的办法还是采用页式存储管理。本来，页式存储管理并不需要建立在段式存储管理的基础上，这是两种不同的机制。可是，在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">80386</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，保护模式的实现是与段存储密不可分的。例如，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CPU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的当前执行权限是在有关的代码段描述项中规定的。因此，在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">80386</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，既然决定利用部分已经存在的资源，而不是另起炉灶，那就无法绕过段式存储管理来实现页式存储管理。这也意味着，页式存储管理的作用是在由段式存储管理所映射而成的地址上再加上一层地址映射。由于此时由段式存储管理映射而成的地址不再是“物理地址”了，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Intel</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就称之为“线性地址”。于是，段式存储管理先将逻辑地址映射成线性地址，然后再由页式存储管理将线性地址映射成物理地址，或者，当不使用页式管理时，就将线性地址直接用作物理地址。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">80386</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把线性地址空间划分成</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节的页面，每个页面可以被映射至物理存储空间中任意一块</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节大小的区间</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">边界必须与</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节对齐</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在段式存储管理中，连续的逻辑地址经过映射后在线性地址空间还是连续的。但是在页式存储管理中，连续的线性地址经过映射后在物理空间却不一定连续</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其灵活性也正在于此</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这里值得指出的是，虽然页式存储管理是建立在段式存储管理的基础上，但一旦启用了页式存储管理，所有的线性地址都要经过页式映射，连</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">GDTR</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">LDTR</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中给出的段描述表起始地址也不例外。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于页式存储管理的引入，对</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">32</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位线性地址有了新的解释</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前就是物理地址</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">typedef<span style="mso-tab-count: 1">   </span>struct<span style="mso-tab-count: 1">      </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>dir:<span style="mso-tab-count: 1">  </span>10;<span style="mso-tab-count: 1">  </span>/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用作页面表目录中的下标，该目录项指向一个页面表</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>page:<span style="mso-tab-count: 1">      </span>10; /*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用作具体页面表中的下标，该表项指向一个物理页面</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>offset:<span style="mso-tab-count: 1">     </span>12; /*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节物理页面内的偏移量</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">}</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线性地址</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个结构可用下图形象地表示：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
				<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
						<v:stroke joinstyle="miter">
						</v:stroke>
						<v:formulas>
								<v:f eqn="if lineDrawn pixelLineWidth 0">
								</v:f>
								<v:f eqn="sum @0 1 0">
								</v:f>
								<v:f eqn="sum 0 0 @1">
								</v:f>
								<v:f eqn="prod @2 1 2">
								</v:f>
								<v:f eqn="prod @3 21600 pixelWidth">
								</v:f>
								<v:f eqn="prod @3 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @0 0 1">
								</v:f>
								<v:f eqn="prod @6 1 2">
								</v:f>
								<v:f eqn="prod @7 21600 pixelWidth">
								</v:f>
								<v:f eqn="sum @8 21600 0">
								</v:f>
								<v:f eqn="prod @7 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @10 21600 0">
								</v:f>
						</v:formulas>
						<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
						</v:path>
						<o:lock aspectratio="t" v:ext="edit">
						</o:lock>
				</v:shapetype>
				<v:shape id="_x0000_s1026" style="MARGIN-TOP: 0px; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 9pt; WIDTH: 396pt; POSITION: absolute; HEIGHT: 54.6pt; TEXT-ALIGN: left; mso-wrap-style: none; mso-wrap-distance-left: 0; mso-wrap-distance-right: 0; mso-position-horizontal: absolute; mso-position-vertical: absolute" fillcolor="#00e4a8" type="#_x0000_t75">
						<v:imagedata o:title="" src="file:///C:/DOCUME~1/swc/LOCALS~1/Temp/msoclip1/01/clip_image001.png">
						</v:imagedata>
						<v:shadow color="#1c1c1c">
						</v:shadow>
				</v:shape>
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<br style="mso-ignore: vglayout" clear="all" />
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 5">                                   </span>
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线性地址的格式</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以看出，在页面目录中共有</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">2<sup>10</sup>=1024</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个目录项，每个目录项指向一个页面表，而在每个页面表中又共有</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1024</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个页面描述项。类似于</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">GDTR</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">LDTR</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，又增加了一个新的寄存器</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CR3</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为指向当前页面目录的指针。这样，从线性地址到物理地址的映射过程为：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">1、</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CR3</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">取得页面目录的基地址。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">2、</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以线性地址中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">dir</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位段为下标，在目录中取得相应页面表的基地址。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">3、</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以线性地址中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位段为下标，在所得到的页面表中取得相应的页面描述项。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">4、</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将页面描述项中给出的页面基地址与线性地址中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">offset</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位段相加得到物理地址。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述映射过程可用下图直观地表示：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<v:shape id="_x0000_s1027" style="MARGIN-TOP: 0px; Z-INDEX: 2; LEFT: 0px; MARGIN-LEFT: 18pt; WIDTH: 387pt; POSITION: absolute; HEIGHT: 234pt; TEXT-ALIGN: left; mso-position-horizontal: absolute; mso-position-vertical: absolute" fillcolor="#00e4a8" type="#_x0000_t75">
						<v:fill o:detectmouseclick="t">
						</v:fill>
						<v:stroke o:forcedash="t">
						</v:stroke>
						<v:imagedata o:title="" src="file:///C:/DOCUME~1/swc/LOCALS~1/Temp/msoclip1/01/clip_image003.png">
						</v:imagedata>
						<v:shadow color="#1c1c1c">
						</v:shadow>
				</v:shape>
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<br style="mso-ignore: vglayout" clear="all" />
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">        </span>
						<span style="mso-spacerun: yes">                </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页式映射示意图</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那么为什么要使用两个层次，先找到目录项，再找到页面描述项，而不是像在使用段寄存器时那样一步到位呢？这是出于空间效率的考虑。如果将线性地址中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">dir</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个位段合并在一起是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">20</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位，因此页面表的大步就将是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1Kx1K=1M</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个表项。由于每个页面的大小为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，总的空间大小仍为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4Kx1M=4G</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，正好是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">32</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位地址空间的大小。但是，实际上是很难想象有一个进程会需要用到</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4G</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的全部空间，所以大部分青藏势必是空着的。可是，在一个数组中，即使是空着的表项也占空间，这样就造成了浪费。而若分成两层，则页表可以视需要而设置，如果目录中某项为空，就不必设立相应的页表，从而省下了存储空间。当然，在最坏的情况下，如果一个进程真的要用到全部</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4G</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的存储空间，那就不仅不能节省，反而要多消耗一个目录所占用的空间，但那概率基本上是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0.</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，一个页面的大小是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，而每一个页面表项或目录项的大小是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个字节。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1024</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个表项正好也是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，恰好可以放在一个页面中。而若多于</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1024</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">项就要使目录或页面表跨页面存放了。也正因如此，在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">64</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">AlphaCPU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中页面的大小是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">8K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，因为目录项和页面表项的大小都变成了</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">8</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个字节。如前所述，目录项中含有指向一个页面表的指针，而页面表项中则含有指向一个页面起始地址的指针。由于页面表和页面起始地址都总是在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节的边界上，这些指针的低</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">12</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位都永远是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0.</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样，在目录项和页面项中都只要有</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">20</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位用于指针就够了，而余下的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">12</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位则可以用于控制或其他的目的。于是，目录项的结构为：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">typedef<span style="mso-tab-count: 1">   </span>struct<span style="mso-tab-count: 1">      </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>ptba:<span style="mso-tab-count: 1">       </span>20;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页表基地址的高</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">20</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>avail:<span style="mso-tab-count: 1">       </span>3;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">供系统程序员使用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>g:<span style="mso-tab-count: 1">     </span>1/*global,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局性页面</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>ps:<span style="mso-tab-count: 1">   </span>1/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面大小，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>reserved:<span style="mso-tab-count: 1">       </span>1/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保留，永远是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>a:<span style="mso-tab-count: 1">     </span>1;/*accessed,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已被访问过</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>pcd:<span style="mso-tab-count: 1"></span>1;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关闭</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓冲存储器</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>pwt:<span style="mso-tab-count: 1"></span>1;/*write Through,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于缓冲存储器</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int <span style="mso-tab-count: 1">  </span>u_s:<span style="mso-tab-count: 1"></span>1;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示系统</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或超级</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限，为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示用户权限</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>r_w:<span style="mso-tab-count: 1">       </span>1;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只读或可写</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>unsigned<span style="mso-tab-count: 1"></span>int<span style="mso-tab-count: 1">    </span>p:<span style="mso-tab-count: 1">    </span>1;/*</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示相应的页面不在内存中</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">}</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录项</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页表项的结构基本上与此相同，但没有“页面大小”位</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ps</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以第</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">8</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位保留不用，但第</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">7</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在目录项中保留不用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">D(Dirty)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标志，表示该页面已经被写过，所以已经“脏”了。当页面表项或目录项中的最低位</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">p</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，表示相应的页面或页面表不在内存中，根据其他一些有关寄存器的设置，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CPU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以产生一个“页面错”</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(Page Fault)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">异常</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">(</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也称为缺页中断，但异常和中断其实是有区别的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这样，内核中的有关异常服务程序就可以从磁盘上的页面交换区将相应的页面读入内存，并且相应地设置表项中的基地址，并将</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">p</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位设置成</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1.</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相反，也可以将内存中暂不使用的页面写入磁盘的交换区，然后将相应的页面表项的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">p</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位设置为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0.</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样，就可以实现页式虚存了。当</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">p</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，表项的其余各位均无意义，所以可被用来临时存储其他信息，如被换出的页面在磁盘上的位置等等。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当目录项中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ps(page size)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，包含在由该目录项所指的页面表中所有的页面大小都是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4K</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，这也是目前在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Linux</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核中所采用的页面大小。但是，从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Pentium</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理器开始，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Intel</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引入了</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">PSE</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面大小扩充机制。当</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ps</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，页面的大小就成了</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4M</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节，而页面表就不再使用了。这时候，线性地址中的低</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">22</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位就全部用在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4M</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节页面中的位移。这样，总的寻址能力还是没有改变，即</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1024x1024=4G</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是映射的过程减少了一个层次。随着内存容量和磁盘容量的日益增加，磁盘访问速度的显著提高，以及对图像处理要求的日益增加，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">4M</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节的页面大小有可能成为主流。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">i386CPU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中还有个寄存器</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CR0,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其最高位</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">PG</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是页式映射机制的总开关。当</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">PG</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位被设置成</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CPU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就开启了页式存储管理的映射机制。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Pentium Pro</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Intel</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">又作了扩充。这一次扩充的是物理地址的宽度。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Intel</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在另一个控制寄存器</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">CR4</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中又增加了一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">PAE(Physical Address Extension)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">PAE</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位设置成</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">1</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，地址总线的宽度就变成了</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">36</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位。与此相应，页式存储管理的映射机制也自然地有所改变。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cnitblog.com/ygb/aggbug/8876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-08 16:00 <a href="http://www.cnitblog.com/ygb/articles/8876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>预备知识－Intel X86 CPU系列的寻址方式与段式内存管理机制</title><link>http://www.cnitblog.com/ygb/articles/8872.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sat, 08 Apr 2006 07:56:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8872.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8872.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8872.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to &lt;&lt;linux				内核源代码情景分析				&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;								Having any problems, send mails to viloner@163.com														Intel X86 CPU	...&nbsp;&nbsp;<a href='http://www.cnitblog.com/ygb/articles/8872.html'>阅读全文</a><img src ="http://www.cnitblog.com/ygb/aggbug/8872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-08 15:56 <a href="http://www.cnitblog.com/ygb/articles/8872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件系统－VFS的结构</title><link>http://www.cnitblog.com/ygb/articles/8836.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Thu, 06 Apr 2006 13:15:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8836.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8836.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8836.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8836.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to &lt;&lt;linux				内核源代码情景分析				&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;								Having any problems, send mails to viloner@163.com																												...&nbsp;&nbsp;<a href='http://www.cnitblog.com/ygb/articles/8836.html'>阅读全文</a><img src ="http://www.cnitblog.com/ygb/aggbug/8836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-06 21:15 <a href="http://www.cnitblog.com/ygb/articles/8836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件系统－目录项缓存与散列表</title><link>http://www.cnitblog.com/ygb/articles/8795.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Wed, 05 Apr 2006 10:12:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8795.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8795.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8795.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8795.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to &lt;&lt;linux				内核源代码情景分析				&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;								Having any problems, send mails to viloner@163.com																												...&nbsp;&nbsp;<a href='http://www.cnitblog.com/ygb/articles/8795.html'>阅读全文</a><img src ="http://www.cnitblog.com/ygb/aggbug/8795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-05 18:12 <a href="http://www.cnitblog.com/ygb/articles/8795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>预备知识－Linux内核源代码中的C语言代码</title><link>http://www.cnitblog.com/ygb/articles/8777.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Tue, 04 Apr 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/8777.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/8777.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/8777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/8777.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/8777.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Refer to &lt;&lt;linux</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核源代码情景分析</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&gt;&gt; and &lt;&lt;Linux kernel Version:2.4.0&gt;&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Having any problems, send mails to viloner@163.com<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">Linux</span>
				</b>
				<b>
						<span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核源代码中的</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">C</span>
				</b>
				<b>
						<span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言代码</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 84pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Linux</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核的主体是以</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">GNU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言编写的，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">GNU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为此提供了编译工具</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数大量的使用：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C++</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言中吸收了“</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”和“</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">const</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。其实，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">GNU</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C++</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是合为一体的，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">既是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译又是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C++</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译，所以从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C++</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中吸收一些东西到</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是很自然的。从功能上说，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数的使用与</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">#define</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">宏定义相似，但更有相对的独立性，也更安全。使用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数也有利于程序调试。如果编译时不加优化，则这些</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数就是普通的，独立的函数，更便于调试。调试好以后，再采用优化重新编译一次，这些</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数就像宏操作一样融入了引用处的代码中，有利于提高运行效率。由于</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数的大量使用，相当一部分代码从</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">.c</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件移入了</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">.h</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件中。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、奇怪的宏操作定义：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Linux</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核代码中使用了大量的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">inline</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数，但这并未消除对宏操作的使用，内核中仍有许多宏操作定义。并常对内核代码中一些宏操作定义方式感到迷惑不解，先看一个实例，取自</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">fs/proc/kcore.c:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">163<span style="mso-tab-count: 1"></span>#define DUMP_WRITE(add,nr)<span style="mso-tab-count: 1">       </span>do {memcpy(bufp,addr,nr);buf +=nr;} while(0)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个循环体只执行一次，为什么要这样通过一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">do-while</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环来定义呢？首先能不能定义成如下式样：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">163<span style="mso-tab-count: 1"></span>#define DUMP_WRITE(add,nr)<span style="mso-tab-count: 1">       </span>memcpy(bufp,addr,nr);buf +=nr;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不行。如果有一段程序在一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">if</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中引用这个宏操作就会出问题：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">if (add)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>DUMP_WRITE(addr,nr);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Else<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>Do_something_else();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">经过预处理以后，这段代码就会变成这样：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">if (add)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>memcpy(bufp,addr,nr);buf +=nr;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Else<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>Do_something_else();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译这段代码</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会失败，并报语法出错。因为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">认为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">if</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">memcpy()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以后就结束了，然后却又碰到了一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">else</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果把</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">DUMP_WRITE(addr,nr)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Do_something_else()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">换一下位置，编译倒是可以通过，但问题却更严重了，因为不管条件满足与否</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">bufp+=nr</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都会得到执行。马上会想到要在定义中加上花括号，成为这样：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">163<span style="mso-tab-count: 1"></span>#define DUMP_WRITE(add,nr)<span style="mso-tab-count: 1">       </span>{memcpy(bufp,addr,nr);buf +=nr;}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可是，上面那段程序是通不过编译，因为经过预处理后就变成这样：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">if (add)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>{memcpy(bufp,addr,nr);buf +=nr;};<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">Else<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>Do_something_else();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同样，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">gcc</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在碰到</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">else</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前面的“</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">;</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”时就认为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">if</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句已经结束了，因而后面的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">else</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">if</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中。相比之下，采用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">do-while</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义在任何情况下都没有问题。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三、队列的使用：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核中大量地使用着队列和队列操作。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果我们有一种数据结构</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">foo</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，并且需要维持一个这种数据结构的双链队列，最简单的、也是最常用的办法就是在这个数据结构的类型定义中加入两个指针，例如：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">typedef<span style="mso-tab-count: 1">   </span>struct foo<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>struct foo *prev;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>struct foo *next;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>……<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">}foo_t;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后为这种数据结构写一套用于各种队列操作的子程序。由于用来维持队列的这两个指针的类型是固定的（都是指向</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">foo</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据结构），这些子程序不能用于其它数据结构的队列操作。换言之，需要维持多少种数据结构的队列，就得有多少套的队列操作子程序。对于使用队列较少的应用程序或许不是个大问题，但对于使用大量队列的内核就成问题了。所以，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Linux</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核中采用了一套能用的、一般的、可以用到各种不同数据结构的队列操作。为此，代码的作者们把指针</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">prev</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">next</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从具体的“宿主”数据结构中抽象出来成为一种数据结构</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种数据结构既可以“寄宿”在具体的宿主结构内部，成为该数据结构的一个“连接件”</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">;</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也可以独立存在而成为一个队列的头。这个数据结构定义在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">include/linux/list.h</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">16<span style="FONT: 7pt 'Times New Roman'">      </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">struct list_head {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">17<span style="FONT: 7pt 'Times New Roman'">      </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">     </span>struct list_head *next, *prev;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">18<span style="FONT: 7pt 'Times New Roman'">      </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">};<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果需要某种数据结构的队列，就在这种结构内部放上一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据结构。以用于内存页面管理的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据结构为例，其定义为：（见</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">include/linux/mm.h</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">134<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">typedef struct page {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">135<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">     </span>struct list_head list;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">        </span>……<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 52.5pt; TEXT-INDENT: -52.5pt; mso-list: l5 level1 lfo3; tab-stops: list 52.5pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">138<span style="FONT: 7pt 'Times New Roman'">                       </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">struct page *next_hash;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">        </span>……<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 52.5pt; TEXT-INDENT: -52.5pt; mso-list: l0 level1 lfo4; tab-stops: list 52.5pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">141<span style="FONT: 7pt 'Times New Roman'">                       </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">struct list_head lru;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">        </span>……<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo5; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">148<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">}mem_map_t;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可见，在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据结构中寄宿了两个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构，或者说有两个队列操作的连接件，所以</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构可以同时存在于两个双链队列中。此外，结构中还有个单链指针</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">next_hash,</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来维持一个单链的杂凑队列。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于宿主数据结构内部了每个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据结构都要加以初始化，可以通过一个宏操作</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">INIT_LIST_HEAD</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行，要将一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构通过其“队列头”链入（有时候也说“挂入”）一个队列时，可以使用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_add()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。从队列中脱链用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_del()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但这里存在一个问题：队列操作都是通过</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行的，但那不过是个连接件，如果我们手上有个宿主结构，那当然就知道了它的某个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在那里，从而以此为参数调用</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_add()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_del();</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可是，反过来，当我们顺着一个队列取得其中一项</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构时，又怎样找到其宿主结构呢？在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构中并没有指向宿主结构的指针呀。毕竟，我们真正关心的是宿主结构，而不是连接件。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面通过一个实例来看这个问题是如何解决的。下面是取自</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">mm/page_alloc.c</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的一行代码：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">[rmqueue()]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo6; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">188<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page = memlist_entry(curr,struct page,list);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">memlist_entry()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">curr</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">换算成其宿主结构的起始地址，也就是取得指向其宿主结构的指针。那</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">memlist_entry()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是如何实现的呢？因为其调用参数</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是个类型，而不是具体的数据。如果看一下函数</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">rmqueue()</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的整个代码，就可以发现在那里</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">竟是无定义的。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事实上，在同一文件中将</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">memlist_entry</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义成</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_entry</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以实际引用的是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_entry():<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo7; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">48<span style="FONT: 7pt 'Times New Roman'">      </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">#define memlist_entry list_entry<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_entry</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义则在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">include/linux/list.h</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">135<span style="mso-tab-count: 1"></span>/**<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">136<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">* list_entry : get the struct for this entry<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">137<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">* @ptr:<span style="mso-tab-count: 1">       </span>the &amp;struct list_head pointer<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">138<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">* @type:<span style="mso-tab-count: 1">       </span>the type of the struct this is embedded in<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">139<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">* @member:<span style="mso-tab-count: 1">       </span>the name of the list_struct within the struct<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">140<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">141<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">#define list_entry(ptr, type, member) \<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">142<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-spacerun: yes">       </span>((type *)((char *)(ptr)-(unsigned long)(&amp;((type *)0)-&gt;member)))<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将前面的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">188</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行与此对照，就可以看出其中的奥秘：经过</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">C</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">预处理的文字替换，这一行的内容就成为：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">page=((struct page*) ((char )(curr)-(unsigned long)(&amp;((struct page*)0)-&gt;list)));<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">curr</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构内部的成分</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的地址，而我们所需要的却是那个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构本身的地址，所以要从地址</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">curr</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">减去一个位移量，即成分</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部的位移量，才能达到要求。那么，这个位移量到底是多少呢？＆</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">((struct page*)0)-&gt;list</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就表示当结构</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正好在地址</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">0</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上时其成分</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的地址，这就是位移。同样道理，如果是在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">page</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">lru</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">队列里，则传下来的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">member</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">lru</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，一样能算出宿主结构的地址。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可见，这一套操作既普遍适用，又保持了较高效率。但是，对于阅读代码的人却是有个缺点，那就是光从代码中不容易看出一个</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">list_head</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的宿主结构是什么，而以前只要看一下</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">next</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的类型就知道了。</span>
		</p>
<img src ="http://www.cnitblog.com/ygb/aggbug/8777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-04-04 21:06 <a href="http://www.cnitblog.com/ygb/articles/8777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>