diff --git a/Book-Lite/code-list/html/P6-2.html b/Book-Lite/code-list/html/P6-2.html index e4b8442..35ab6b8 100644 --- a/Book-Lite/code-list/html/P6-2.html +++ b/Book-Lite/code-list/html/P6-2.html @@ -35,7 +35,7 @@ {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1;} @font-face - {font-family:����; + {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:PMingLiU; @@ -47,7 +47,7 @@ {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1;} @font-face - {font-family:����; + {font-family:黑体; panose-1:2 1 6 9 6 1 1 1 1 1;} @font-face {font-family:MingLiU; @@ -110,15 +110,15 @@ {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face - {font-family:����С���μ���;} + {font-family:方正小标宋简体;} @font-face - {font-family:"\@����"; + {font-family:"\@黑体"; panose-1:2 1 6 9 6 1 1 1 1 1;} @font-face - {font-family:"\@����"; + {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face - {font-family:"\@����С���μ���";} + {font-family:"\@方正小标宋简体";} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; @@ -126,9 +126,9 @@ text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} h1 - {mso-style-link:"���� 1 Char"; + {mso-style-link:"标题 1 Char"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -137,10 +137,10 @@ h1 text-indent:-7.2pt; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} h2 - {mso-style-link:"���� 2 Char"; + {mso-style-link:"标题 2 Char"; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -153,7 +153,7 @@ h2 font-family:"Arial","sans-serif"; font-weight:bold;} h3 - {mso-style-link:"���� 3 Char"; + {mso-style-link:"标题 3 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -164,7 +164,7 @@ h3 font-family:"Arial","sans-serif"; font-weight:bold;} h4 - {mso-style-link:"���� 4 Char"; + {mso-style-link:"标题 4 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -178,7 +178,7 @@ h4 font-family:"Arial","sans-serif"; font-weight:bold;} h5 - {mso-style-link:"���� 5 Char"; + {mso-style-link:"标题 5 Char"; margin-top:14.0pt; margin-right:0cm; margin-bottom:14.5pt; @@ -189,10 +189,10 @@ h5 line-height:156%; page-break-after:avoid; font-size:14.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} h6 - {mso-style-link:"���� 6 Char"; + {mso-style-link:"标题 6 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -206,7 +206,7 @@ h6 font-family:"Arial","sans-serif"; font-weight:bold;} p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 - {mso-style-link:"���� 7 Char"; + {mso-style-link:"标题 7 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -217,10 +217,10 @@ p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 line-height:133%; page-break-after:avoid; font-size:12.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 - {mso-style-link:"���� 8 Char"; + {mso-style-link:"标题 8 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -233,7 +233,7 @@ p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 font-size:12.0pt; font-family:"Arial","sans-serif";} p.MsoHeading9, li.MsoHeading9, div.MsoHeading9 - {mso-style-link:"���� 9 Char"; + {mso-style-link:"标题 9 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -255,7 +255,7 @@ p.MsoIndex1, li.MsoIndex1, div.MsoIndex1 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex2, li.MsoIndex2, div.MsoIndex2 {margin-top:0cm; margin-right:0cm; @@ -266,7 +266,7 @@ p.MsoIndex2, li.MsoIndex2, div.MsoIndex2 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex3, li.MsoIndex3, div.MsoIndex3 {margin-top:0cm; margin-right:0cm; @@ -277,7 +277,7 @@ p.MsoIndex3, li.MsoIndex3, div.MsoIndex3 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex4, li.MsoIndex4, div.MsoIndex4 {margin-top:0cm; margin-right:0cm; @@ -288,7 +288,7 @@ p.MsoIndex4, li.MsoIndex4, div.MsoIndex4 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex5, li.MsoIndex5, div.MsoIndex5 {margin-top:0cm; margin-right:0cm; @@ -299,7 +299,7 @@ p.MsoIndex5, li.MsoIndex5, div.MsoIndex5 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex6, li.MsoIndex6, div.MsoIndex6 {margin-top:0cm; margin-right:0cm; @@ -310,7 +310,7 @@ p.MsoIndex6, li.MsoIndex6, div.MsoIndex6 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex7, li.MsoIndex7, div.MsoIndex7 {margin-top:0cm; margin-right:0cm; @@ -321,7 +321,7 @@ p.MsoIndex7, li.MsoIndex7, div.MsoIndex7 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex8, li.MsoIndex8, div.MsoIndex8 {margin-top:0cm; margin-right:0cm; @@ -332,7 +332,7 @@ p.MsoIndex8, li.MsoIndex8, div.MsoIndex8 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoIndex9, li.MsoIndex9, div.MsoIndex9 {margin-top:0cm; margin-right:0cm; @@ -343,14 +343,14 @@ p.MsoIndex9, li.MsoIndex9, div.MsoIndex9 text-justify:inter-ideograph; text-indent:-10.5pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoToc1, li.MsoToc1, div.MsoToc1 {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.MsoToc2, li.MsoToc2, div.MsoToc2 {margin-top:0cm; @@ -361,7 +361,7 @@ p.MsoToc2, li.MsoToc2, div.MsoToc2 text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoToc3, li.MsoToc3, div.MsoToc3 {margin-top:0cm; margin-right:0cm; @@ -371,7 +371,7 @@ p.MsoToc3, li.MsoToc3, div.MsoToc3 text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoToc4, li.MsoToc4, div.MsoToc4 {margin-top:0cm; margin-right:0cm; @@ -379,7 +379,7 @@ p.MsoToc4, li.MsoToc4, div.MsoToc4 margin-left:31.5pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoToc5, li.MsoToc5, div.MsoToc5 {margin-top:0cm; margin-right:0cm; @@ -387,7 +387,7 @@ p.MsoToc5, li.MsoToc5, div.MsoToc5 margin-left:42.0pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoToc6, li.MsoToc6, div.MsoToc6 {margin-top:0cm; margin-right:0cm; @@ -395,7 +395,7 @@ p.MsoToc6, li.MsoToc6, div.MsoToc6 margin-left:52.5pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoToc7, li.MsoToc7, div.MsoToc7 {margin-top:0cm; margin-right:0cm; @@ -403,7 +403,7 @@ p.MsoToc7, li.MsoToc7, div.MsoToc7 margin-left:63.0pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoToc8, li.MsoToc8, div.MsoToc8 {margin-top:0cm; margin-right:0cm; @@ -411,7 +411,7 @@ p.MsoToc8, li.MsoToc8, div.MsoToc8 margin-left:73.5pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoToc9, li.MsoToc9, div.MsoToc9 {margin-top:0cm; margin-right:0cm; @@ -419,22 +419,22 @@ p.MsoToc9, li.MsoToc9, div.MsoToc9 margin-left:84.0pt; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText - {mso-style-link:"��ע�ı� Char"; + {mso-style-link:"脚注文本 Char"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoCommentText, li.MsoCommentText, div.MsoCommentText - {mso-style-link:"��ע���� Char"; + {mso-style-link:"批注文字 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoHeader, li.MsoHeader, div.MsoHeader - {mso-style-link:"ҳü Char"; + {mso-style-link:"页眉 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -442,22 +442,22 @@ p.MsoHeader, li.MsoHeader, div.MsoHeader border:none; padding:0cm; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoFooter, li.MsoFooter, div.MsoFooter - {mso-style-link:"ҳ�� Char"; + {mso-style-link:"页脚 Char"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading - {mso-style-name:"��������\,������Ŀ\,������Ŀ1\,������Ŀ2"; + {mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoCaption, li.MsoCaption, div.MsoCaption {margin:0cm; margin-bottom:.0001pt; @@ -475,7 +475,7 @@ p.MsoTof, li.MsoTof, div.MsoTof text-justify:inter-ideograph; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.MsoFootnoteReference {vertical-align:super;} p.MsoList, li.MsoList, div.MsoList @@ -487,22 +487,22 @@ p.MsoList, li.MsoList, div.MsoList text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoList2, li.MsoList2, div.MsoList2 {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoList4, li.MsoList4, div.MsoList4 {margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.MsoDate, li.MsoDate, div.MsoDate - {mso-style-link:"���� Char"; + {mso-style-link:"日期 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -511,46 +511,46 @@ p.MsoDate, li.MsoDate, div.MsoDate text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} a:link, span.MsoHyperlink - {mso-style-name:"������\,��������"; + {mso-style-name:"超链接\,超级链接"; color:blue; text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline;} p - {mso-style-name:"��ͨ\(��վ\)\,��ͨ \(Web\)\,��ͨ \(Web\)1\,��ͨ \(Web\)2\,��ͨ \(Web\)3"; + {mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3"; margin-right:0cm; margin-left:0cm; font-size:12.0pt; - font-family:����;} + font-family:宋体;} pre - {mso-style-name:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3"; - mso-style-link:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char"; + {mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3"; + mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char"; margin:0cm; margin-bottom:.0001pt; font-size:12.0pt; - font-family:����;} + font-family:宋体;} tt - {font-family:����;} + {font-family:黑体;} p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject - {mso-style-link:"��ע���� Char"; + {mso-style-link:"批注主题 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.5pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate - {mso-style-link:"��ע���ı� Char"; + {mso-style-link:"批注框文本 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.1, li.1, div.1 - {mso-style-name:��ʽ1; + {mso-style-name:样式1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -559,213 +559,213 @@ p.1, li.1, div.1 text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.a, li.a, div.a - {mso-style-name:�������; - mso-style-link:"������� Char"; + {mso-style-name:代码程序; + mso-style-link:"代码程序 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} span.Char - {mso-style-name:"������� Char"; - mso-style-link:�������; - font-family:����;} + {mso-style-name:"代码程序 Char"; + mso-style-link:代码程序; + font-family:宋体;} p.a0, li.a0, div.a0 - {mso-style-name:ͼ˵��; - mso-style-link:"ͼ˵�� Char"; + {mso-style-name:图说明; + mso-style-link:"图说明 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char0 - {mso-style-name:"ͼ˵�� Char"; - mso-style-link:ͼ˵��; - font-family:����;} + {mso-style-name:"图说明 Char"; + mso-style-link:图说明; + font-family:宋体;} p.0, li.0, div.0 - {mso-style-name:����0; + {mso-style-name:封面0; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:36.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.10, li.10, div.10 - {mso-style-name:����1; + {mso-style-name:封面1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:18.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.11, li.11, div.11 - {mso-style-name:�DZ���1; + {mso-style-name:非标题1; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.a1, li.a1, div.a1 - {mso-style-name:�ı�����; + {mso-style-name:文本居中; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.3CharChar, li.3CharChar, div.3CharChar - {mso-style-name:"ͼ������3 Char Char"; - mso-style-link:"ͼ������3 Char Char Char"; + {mso-style-name:"图中文字3 Char Char"; + mso-style-link:"图中文字3 Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} span.3CharCharChar - {mso-style-name:"ͼ������3 Char Char Char"; - mso-style-link:"ͼ������3 Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char Char"; + mso-style-link:"图中文字3 Char Char"; + font-family:宋体;} p.post, li.post, div.post - {mso-style-name:�ʼ�post; + {mso-style-name:邮件post; margin:0cm; margin-bottom:.0001pt; text-align:right; line-height:11.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.3, li.3, div.3 - {mso-style-name:ͼ������3; + {mso-style-name:图中字体3; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.3CharChar1CharCharChar - {mso-style-name:"ͼ������3 Char Char1 Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char1 Char Char Char"; + font-family:宋体;} span.3CharChar1CharChar - {mso-style-name:"ͼ������3 Char Char1 Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char1 Char Char"; + font-family:宋体;} p.5Char, li.5Char, div.5Char - {mso-style-name:"ͼ������5�� Char"; - mso-style-link:"ͼ������5�� Char Char"; + {mso-style-name:"图中文字5号 Char"; + mso-style-link:"图中文字5号 Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.5CharChar - {mso-style-name:"ͼ������5�� Char Char"; - mso-style-link:"ͼ������5�� Char"; - font-family:����;} + {mso-style-name:"图中文字5号 Char Char"; + mso-style-link:"图中文字5号 Char"; + font-family:宋体;} p.5CharChar0, li.5CharChar0, div.5CharChar0 - {mso-style-name:"ͼ������С5�� Char Char"; - mso-style-link:"ͼ������С5�� Char Char Char"; + {mso-style-name:"图中文字小5号 Char Char"; + mso-style-link:"图中文字小5号 Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} span.5CharCharChar - {mso-style-name:"ͼ������С5�� Char Char Char"; - mso-style-link:"ͼ������С5�� Char Char"; - font-family:����;} + {mso-style-name:"图中文字小5号 Char Char Char"; + mso-style-link:"图中文字小5号 Char Char"; + font-family:宋体;} p.5Char0, li.5Char0, div.5Char0 - {mso-style-name:"ͼ������С5�� Char"; + {mso-style-name:"图中文字小5号 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.5, li.5, div.5 - {mso-style-name:ͼ������С5��; + {mso-style-name:图中文字小5号; margin:0cm; margin-bottom:.0001pt; text-align:center; layout-grid-mode:char; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.2, li.2, div.2 - {mso-style-name:�������2; + {mso-style-name:代码程序2; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.20, li.20, div.20 - {mso-style-name:ͼ˵��2; + {mso-style-name:图说明2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.21, li.21, div.21 - {mso-style-name:�ı�����2; + {mso-style-name:文本居中2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char Char"; - mso-style-link:"ͼ������3 Char Char Char Char Char Char"; + {mso-style-name:"图中文字3 Char Char Char Char Char"; + mso-style-link:"图中文字3 Char Char Char Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} span.3CharCharCharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char Char Char"; - mso-style-link:"ͼ������3 Char Char Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char Char Char Char Char"; + mso-style-link:"图中文字3 Char Char Char Char Char"; + font-family:宋体;} p.a2, li.a2, div.a2 - {mso-style-name:ͼ����; + {mso-style-name:图居中; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.110, li.110, div.110 - {mso-style-name:"��ʽ ���� 1 + ����1"; + {mso-style-name:"样式 标题 1 + 居中1"; margin-right:0cm; margin-left:0cm; text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} span.1Char - {mso-style-name:"���� 1 Char"; - mso-style-link:"���� 1"; + {mso-style-name:"标题 1 Char"; + mso-style-link:"标题 1"; font-weight:bold;} p.22, li.22, div.22 - {mso-style-name:"��ʽ �б� 2 + ����"; + {mso-style-name:"样式 列表 2 + 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.23, li.23, div.23 - {mso-style-name:�б�2; + {mso-style-name:列表2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.50, li.50, div.50 - {mso-style-name:ͼ������5��; + {mso-style-name:图中文字5号; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.111, li.111, div.111 - {mso-style-name:��ʽ11; + {mso-style-name:样式11; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -774,107 +774,107 @@ p.111, li.111, div.111 text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.12, li.12, div.12 - {mso-style-name:�������1; + {mso-style-name:代码程序1; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.13, li.13, div.13 - {mso-style-name:ͼ˵��1; + {mso-style-name:图说明1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.01, li.01, div.01 - {mso-style-name:����01; + {mso-style-name:封面01; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:36.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.112, li.112, div.112 - {mso-style-name:����11; + {mso-style-name:封面11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:18.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.113, li.113, div.113 - {mso-style-name:�DZ���11; + {mso-style-name:非标题11; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.14, li.14, div.14 - {mso-style-name:�ı�����1; + {mso-style-name:文本居中1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.3Char1, li.3Char1, div.3Char1 - {mso-style-name:"ͼ������3 Char1"; + {mso-style-name:"图中文字3 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} p.post1, li.post1, div.post1 - {mso-style-name:�ʼ�post1; + {mso-style-name:邮件post1; margin:0cm; margin-bottom:.0001pt; text-align:right; line-height:11.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.31, li.31, div.31 - {mso-style-name:ͼ������31; + {mso-style-name:图中字体31; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.5Char1, li.5Char1, div.5Char1 - {mso-style-name:"ͼ������5�� Char1"; + {mso-style-name:"图中文字5号 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.5CharChar1, li.5CharChar1, div.5CharChar1 - {mso-style-name:"ͼ������С5�� Char Char1"; + {mso-style-name:"图中文字小5号 Char Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.5Char10, li.5Char10, div.5Char10 - {mso-style-name:"ͼ������С5�� Char1"; + {mso-style-name:"图中文字小5号 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.51, li.51, div.51 - {mso-style-name:ͼ������С5��1; + {mso-style-name:图中文字小5号1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.120, li.120, div.120 - {mso-style-name:��ʽ12; + {mso-style-name:样式12; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -883,81 +883,81 @@ p.120, li.120, div.120 text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.02, li.02, div.02 - {mso-style-name:����02; + {mso-style-name:封面02; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:36.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.121, li.121, div.121 - {mso-style-name:����12; + {mso-style-name:封面12; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:18.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.122, li.122, div.122 - {mso-style-name:�DZ���12; + {mso-style-name:非标题12; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.3Char2, li.3Char2, div.3Char2 - {mso-style-name:"ͼ������3 Char2"; + {mso-style-name:"图中文字3 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} p.post2, li.post2, div.post2 - {mso-style-name:�ʼ�post2; + {mso-style-name:邮件post2; margin:0cm; margin-bottom:.0001pt; text-align:right; line-height:11.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.32, li.32, div.32 - {mso-style-name:ͼ������32; + {mso-style-name:图中字体32; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.5Char2, li.5Char2, div.5Char2 - {mso-style-name:"ͼ������С5�� Char2"; + {mso-style-name:"图中文字小5号 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.52, li.52, div.52 - {mso-style-name:ͼ������С5��2; + {mso-style-name:图中文字小5号2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char"; + {mso-style-name:"图中文字3 Char Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} p.130, li.130, div.130 - {mso-style-name:��ʽ13; + {mso-style-name:样式13; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -966,129 +966,129 @@ p.130, li.130, div.130 text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.30, li.30, div.30 - {mso-style-name:�������3; + {mso-style-name:代码程序3; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.03, li.03, div.03 - {mso-style-name:����03; + {mso-style-name:封面03; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:36.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.131, li.131, div.131 - {mso-style-name:����13; + {mso-style-name:封面13; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:18.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.132, li.132, div.132 - {mso-style-name:�DZ���13; + {mso-style-name:非标题13; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.33, li.33, div.33 - {mso-style-name:�ı�����3; + {mso-style-name:文本居中3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.3Char3, li.3Char3, div.3Char3 - {mso-style-name:"ͼ������3 Char3"; + {mso-style-name:"图中文字3 Char3"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} p.post3, li.post3, div.post3 - {mso-style-name:�ʼ�post3; + {mso-style-name:邮件post3; margin:0cm; margin-bottom:.0001pt; text-align:right; line-height:11.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.330, li.330, div.330 - {mso-style-name:ͼ������33; + {mso-style-name:图中字体33; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.5Char20, li.5Char20, div.5Char20 - {mso-style-name:"ͼ������5�� Char2"; + {mso-style-name:"图中文字5号 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.5CharChar2, li.5CharChar2, div.5CharChar2 - {mso-style-name:"ͼ������С5�� Char Char2"; + {mso-style-name:"图中文字小5号 Char Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.5Char3, li.5Char3, div.5Char3 - {mso-style-name:"ͼ������С5�� Char3"; + {mso-style-name:"图中文字小5号 Char3"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.53, li.53, div.53 - {mso-style-name:ͼ������С5��3; + {mso-style-name:图中文字小5号3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.3Char, li.3Char, div.3Char - {mso-style-name:"ͼ������3 Char"; - mso-style-link:"ͼ������3 Char Char5"; + {mso-style-name:"图中文字3 Char"; + mso-style-link:"图中文字3 Char Char5"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:9.0pt; font-size:8.0pt; - font-family:����;} + font-family:宋体;} span.3CharChar5 - {mso-style-name:"ͼ������3 Char Char5"; - mso-style-link:"ͼ������3 Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char5"; + mso-style-link:"图中文字3 Char"; + font-family:宋体;} p.54, li.54, div.54 - {mso-style-name:ͼ������С5����; + {mso-style-name:图中文字小5紧密; margin:0cm; margin-bottom:.0001pt; line-height:9.0pt; text-autospace:ideograph-numeric; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.24, li.24, div.24 - {mso-style-name:����2�Ŵ�����; + {mso-style-name:居中2号粗宋体; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.15, li.15, div.15 - {mso-style-name:"��ʽ ���� 1 + ����"; + {mso-style-name:"样式 标题 1 + 居中"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1096,10 +1096,10 @@ p.15, li.15, div.15 text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.25, li.25, div.25 - {mso-style-name:"��ʽ ���� 2 + �о�\: �����о�"; + {mso-style-name:"样式 标题 2 + 行距\: 单倍行距"; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1112,33 +1112,33 @@ p.25, li.25, div.25 font-family:"Arial","sans-serif"; font-weight:bold;} span.2Char - {mso-style-name:"���� 2 Char"; - mso-style-link:"���� 2"; + {mso-style-name:"标题 2 Char"; + mso-style-link:"标题 2"; font-family:"Arial","sans-serif"; font-weight:bold;} p.34, li.34, div.34 - {mso-style-name:�б�3; + {mso-style-name:列表3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.35, li.35, div.35 - {mso-style-name:��3; + {mso-style-name:表3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.4, li.4, div.4 - {mso-style-name:ͼ˵��4; + {mso-style-name:图说明4; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.40, li.40, div.40 - {mso-style-name:�б�4; + {mso-style-name:列表4; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1147,168 +1147,168 @@ p.40, li.40, div.40 text-align:center; text-indent:-21.0pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.41, li.41, div.41 - {mso-style-name:��4; + {mso-style-name:表4; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.55, li.55, div.55 - {mso-style-name:ͼ˵��5; + {mso-style-name:图说明5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.56, li.56, div.56 - {mso-style-name:�б�5; + {mso-style-name:列表5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.57, li.57, div.57 - {mso-style-name:��5; + {mso-style-name:表5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.6, li.6, div.6 - {mso-style-name:�б�6; + {mso-style-name:列表6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.60, li.60, div.60 - {mso-style-name:��6; + {mso-style-name:表6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.61, li.61, div.61 - {mso-style-name:ͼ˵��6; + {mso-style-name:图说明6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.7, li.7, div.7 - {mso-style-name:�б�7; + {mso-style-name:列表7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.70, li.70, div.70 - {mso-style-name:ͼ˵��7; + {mso-style-name:图说明7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.71, li.71, div.71 - {mso-style-name:��7; + {mso-style-name:表7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.8, li.8, div.8 - {mso-style-name:�б�8; + {mso-style-name:列表8; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.9, li.9, div.9 - {mso-style-name:�б�9; + {mso-style-name:列表9; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.90, li.90, div.90 - {mso-style-name:ͼ˵��9; + {mso-style-name:图说明9; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.100, li.100, div.100 - {mso-style-name:�б�10; + {mso-style-name:列表10; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.101, li.101, div.101 - {mso-style-name:ͼ˵��10; + {mso-style-name:图说明10; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.114, li.114, div.114 - {mso-style-name:�б�11; + {mso-style-name:列表11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.115, li.115, div.115 - {mso-style-name:ͼ˵��11; + {mso-style-name:图说明11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.116, li.116, div.116 - {mso-style-name:��11; + {mso-style-name:表11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.123, li.123, div.123 - {mso-style-name:�б�12; + {mso-style-name:列表12; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.124, li.124, div.124 - {mso-style-name:ͼ˵��12; + {mso-style-name:图说明12; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.133, li.133, div.133 - {mso-style-name:ͼ˵��13; - mso-style-link:"ͼ˵��13 Char"; + {mso-style-name:图说明13; + mso-style-link:"图说明13 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.13Char - {mso-style-name:"ͼ˵��13 Char"; - mso-style-link:ͼ˵��13; - font-family:����;} + {mso-style-name:"图说明13 Char"; + mso-style-link:图说明13; + font-family:宋体;} p.134, li.134, div.134 - {mso-style-name:�б�13; + {mso-style-name:列表13; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.26, li.26, div.26 - {mso-style-name:��¼2; + {mso-style-name:附录2; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1320,7 +1320,7 @@ p.26, li.26, div.26 font-family:"Arial","sans-serif"; font-weight:bold;} p.36, li.36, div.36 - {mso-style-name:��¼3; + {mso-style-name:附录3; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1330,12 +1330,12 @@ p.36, li.36, div.36 font-family:"Arial","sans-serif"; font-weight:bold;} span.3Char0 - {mso-style-name:"���� 3 Char"; - mso-style-link:"���� 3"; + {mso-style-name:"标题 3 Char"; + mso-style-link:"标题 3"; font-family:"Arial","sans-serif"; font-weight:bold;} p.16, li.16, div.16 - {mso-style-name:��¼1; + {mso-style-name:附录1; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1343,17 +1343,17 @@ p.16, li.16, div.16 text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.17, li.17, div.17 - {mso-style-name:��¼��1; + {mso-style-name:附录表1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.42, li.42, div.42 - {mso-style-name:��¼4; + {mso-style-name:附录4; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1363,19 +1363,19 @@ p.42, li.42, div.42 font-family:"Arial","sans-serif"; font-weight:bold;} span.4Char - {mso-style-name:"���� 4 Char"; - mso-style-link:"���� 4"; + {mso-style-name:"标题 4 Char"; + mso-style-link:"标题 4"; font-family:"Arial","sans-serif"; font-weight:bold;} p.a3, li.a3, div.a3 - {mso-style-name:��¼ͼ˵��; + {mso-style-name:附录图说明; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.27, li.27, div.27 - {mso-style-name:�����2; + {mso-style-name:序标题2; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1388,7 +1388,7 @@ p.27, li.27, div.27 font-family:"Arial","sans-serif"; font-weight:bold;} p.a4, li.a4, div.a4 - {mso-style-name:�ο�����; + {mso-style-name:参考标题; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; @@ -1396,10 +1396,10 @@ p.a4, li.a4, div.a4 text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.18, li.18, div.18 - {mso-style-name:��������1; + {mso-style-name:索引标题1; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; @@ -1407,10 +1407,10 @@ p.18, li.18, div.18 text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.19, li.19, div.19 - {mso-style-name:�б�1; + {mso-style-name:列表1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1419,9 +1419,9 @@ p.19, li.19, div.19 text-align:center; text-indent:-21.25pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.1a, li.1a, div.1a - {mso-style-name:��1; + {mso-style-name:表1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1430,38 +1430,38 @@ p.1a, li.1a, div.1a text-align:center; text-indent:-21.25pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.37, li.37, div.37 - {mso-style-name:ͼ˵��3; + {mso-style-name:图说明3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.62, li.62, div.62 - {mso-style-name:��������6��; + {mso-style-name:表中字体6号; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; layout-grid-mode:char; font-size:7.5pt; - font-family:����;} + font-family:宋体;} p.a5, li.a5, div.a5 - {mso-style-name:���Ĵ���; - mso-style-link:"���Ĵ��� Char"; + {mso-style-name:正文代码; + mso-style-link:"正文代码 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char1 - {mso-style-name:"���Ĵ��� Char"; - mso-style-link:���Ĵ���; - font-family:����;} + {mso-style-name:"正文代码 Char"; + mso-style-link:正文代码; + font-family:宋体;} p.43, li.43, div.43 - {mso-style-name:"��ʽ ���� 4 +"; + {mso-style-name:"样式 标题 4 +"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1471,7 +1471,7 @@ p.43, li.43, div.43 font-family:"Arial","sans-serif"; font-weight:bold;} p.140, li.140, div.140 - {mso-style-name:��14; + {mso-style-name:表14; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1480,10 +1480,10 @@ p.140, li.140, div.140 text-align:center; text-indent:-21.25pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.141, li.141, div.141 - {mso-style-name:ͼ˵��14; - mso-style-link:"ͼ˵��14 Char"; + {mso-style-name:图说明14; + mso-style-link:"图说明14 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1492,62 +1492,62 @@ p.141, li.141, div.141 text-align:center; text-indent:-21.25pt; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.14Char - {mso-style-name:"ͼ˵��14 Char"; - mso-style-link:ͼ˵��14; - font-family:����;} + {mso-style-name:"图说明14 Char"; + mso-style-link:图说明14; + font-family:宋体;} p.a6, li.a6, div.a6 - {mso-style-name:�ļ�Ŀ¼��; + {mso-style-name:文件目录表; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.a7, li.a7, div.a7 - {mso-style-name:"��ʽ ���� +"; - mso-style-link:"��ʽ ���� + Char"; + {mso-style-name:"样式 正文 +"; + mso-style-link:"样式 正文 + Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char2 - {mso-style-name:"��ʽ ���� + Char"; - mso-style-link:"��ʽ ���� +"; + {mso-style-name:"样式 正文 + Char"; + mso-style-link:"样式 正文 +"; font-family:"Times New Roman","serif";} p.a8, li.a8, div.a8 - {mso-style-name:������ע; + {mso-style-name:表格题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.a9, li.a9, div.a9 - {mso-style-name:�б���ע; + {mso-style-name:列表题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.aa, li.aa, div.aa - {mso-style-name:ͼ��ע; + {mso-style-name:图题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.ab, li.ab, div.ab - {mso-style-name:������ע; + {mso-style-name:程序题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.ac, li.ac, div.ac - {mso-style-name:��������; + {mso-style-name:框中文字; margin-top:0cm; margin-right:21.0pt; margin-bottom:0cm; @@ -1558,9 +1558,9 @@ p.ac, li.ac, div.ac border:none; padding:0cm; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.125, li.125, div.125 - {mso-style-name:"��ʽ ���� 1 + ����2"; + {mso-style-name:"样式 标题 1 + 居中2"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1568,17 +1568,17 @@ p.125, li.125, div.125 text-align:center; page-break-after:avoid; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.ad, li.ad, div.ad - {mso-style-name:"��ʽ ��ע + ���� ��� ����"; + {mso-style-name:"样式 题注 + 宋体 五号 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:黑体;} p.1b, li.1b, div.1b - {mso-style-name:�����1; + {mso-style-name:序标题1; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1586,65 +1586,65 @@ p.1b, li.1b, div.1b line-height:240%; page-break-after:avoid; font-size:16.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.38, li.38, div.38 - {mso-style-name:�����3; + {mso-style-name:序标题3; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; page-break-after:avoid; font-size:12.0pt; - font-family:����С���μ���;} + font-family:方正小标宋简体;} p.63, li.63, div.63 - {mso-style-name:��������6��; + {mso-style-name:表中文字6号; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:7.5pt; - font-family:����;} + font-family:宋体;} p.64, li.64, div.64 - {mso-style-name:ͼ������6�������; + {mso-style-name:图中文字6号左对齐; margin:0cm; margin-bottom:.0001pt; line-height:10.0pt; layout-grid-mode:char; font-size:7.5pt; - font-family:����;} + font-family:宋体;} p.65, li.65, div.65 - {mso-style-name:ͼ������6��; - mso-style-link:"ͼ������6�� Char"; + {mso-style-name:图中文字6号; + mso-style-link:"图中文字6号 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; line-height:10.0pt; layout-grid-mode:char; font-size:7.5pt; - font-family:����;} + font-family:宋体;} span.6Char - {mso-style-name:"ͼ������6�� Char"; - mso-style-link:ͼ������6��; - font-family:����;} + {mso-style-name:"图中文字6号 Char"; + mso-style-link:图中文字6号; + font-family:宋体;} p.ae, li.ae, div.ae - {mso-style-name:ͼ��; + {mso-style-name:图标; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.28, li.28, div.28 - {mso-style-name:ͼ��2; + {mso-style-name:图标2; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.af, li.af, div.af - {mso-style-name:ϰ�����; + {mso-style-name:习题标题; margin-top:6.0pt; margin-right:0cm; margin-bottom:0cm; @@ -1654,29 +1654,29 @@ p.af, li.af, div.af text-justify:inter-ideograph; page-break-after:avoid; font-size:14.0pt; - font-family:����;} + font-family:黑体;} p.1c, li.1c, div.1c - {mso-style-name:���ֱ��1; + {mso-style-name:部分编号1; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:16.0pt; - font-family:����;} + font-family:宋体;} p.af0, li.af0, div.af0 - {mso-style-name:������; + {mso-style-name:表标题; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.af1, li.af1, div.af1 - {mso-style-name:"��ʽ ��ע + ����"; + {mso-style-name:"样式 题注 + 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.ListTitle, li.ListTitle, div.ListTitle {mso-style-name:ListTitle; margin:0cm; @@ -1718,186 +1718,186 @@ p.RightText, li.RightText, div.RightText border:none; padding:0cm; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.af2, li.af2, div.af2 - {mso-style-name:��������С��; + {mso-style-name:表中文字小五; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.af3, li.af3, div.af3 - {mso-style-name:�ؼ���; - mso-style-link:"�ؼ��� Char"; + {mso-style-name:关键词; + mso-style-link:"关键词 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char3 - {mso-style-name:"�ؼ��� Char"; - mso-style-link:�ؼ���; - font-family:����;} + {mso-style-name:"关键词 Char"; + mso-style-link:关键词; + font-family:宋体;} p.af4, li.af4, div.af4 - {mso-style-name:�ļ���; - mso-style-link:"�ļ��� Char"; + {mso-style-name:文件名; + mso-style-link:"文件名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char4 - {mso-style-name:"�ļ��� Char"; - mso-style-link:�ļ���; - font-family:����;} + {mso-style-name:"文件名 Char"; + mso-style-link:文件名; + font-family:宋体;} p.af5, li.af5, div.af5 - {mso-style-name:ѡ��; - mso-style-link:"ѡ�� Char"; + {mso-style-name:选项; + mso-style-link:"选项 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char5 - {mso-style-name:"ѡ�� Char"; - mso-style-link:ѡ��; - font-family:����;} + {mso-style-name:"选项 Char"; + mso-style-link:选项; + font-family:宋体;} p.af6, li.af6, div.af6 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:命令行; + mso-style-link:"命令行 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char6 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"命令行 Char"; + mso-style-link:命令行; + font-family:宋体;} p.af7, li.af7, div.af7 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:函数名; + mso-style-link:"函数名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char7 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"函数名 Char"; + mso-style-link:函数名; + font-family:宋体;} p.af8, li.af8, div.af8 - {mso-style-name:�Ĵ�����; - mso-style-link:"�Ĵ����� Char"; + {mso-style-name:寄存器名; + mso-style-link:"寄存器名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char8 - {mso-style-name:"�Ĵ����� Char"; - mso-style-link:�Ĵ�����; + {mso-style-name:"寄存器名 Char"; + mso-style-link:寄存器名; font-family:"Times New Roman","serif";} p.af9, li.af9, div.af9 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:变量名; + mso-style-link:"变量名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; - font-family:����;} + font-family:宋体;} span.Char9 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"变量名 Char"; + mso-style-link:变量名; + font-family:宋体;} p.58, li.58, div.58 - {mso-style-name:ͼ������С5����; + {mso-style-name:图中文字小5号左; margin:0cm; margin-bottom:.0001pt; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.59, li.59, div.59 - {mso-style-name:ͼ������С5�ſ���; + {mso-style-name:图中文字小5号靠左; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; - font-family:����;} + font-family:宋体;} p.926, li.926, div.926 - {mso-style-name:"��ʽ ������� + ���\: 9\.26 ����"; + {mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:10.0pt; - font-family:����;} + font-family:宋体;} span.5Char4 - {mso-style-name:"���� 5 Char"; - mso-style-link:"���� 5"; + {mso-style-name:"标题 5 Char"; + mso-style-link:"标题 5"; font-weight:bold;} span.6Char0 - {mso-style-name:"���� 6 Char"; - mso-style-link:"���� 6"; + {mso-style-name:"标题 6 Char"; + mso-style-link:"标题 6"; font-family:"Arial","sans-serif"; font-weight:bold;} span.7Char - {mso-style-name:"���� 7 Char"; - mso-style-link:"���� 7"; + {mso-style-name:"标题 7 Char"; + mso-style-link:"标题 7"; font-weight:bold;} span.8Char - {mso-style-name:"���� 8 Char"; - mso-style-link:"���� 8"; + {mso-style-name:"标题 8 Char"; + mso-style-link:"标题 8"; font-family:"Arial","sans-serif";} span.9Char - {mso-style-name:"���� 9 Char"; - mso-style-link:"���� 9"; + {mso-style-name:"标题 9 Char"; + mso-style-link:"标题 9"; font-family:"Arial","sans-serif";} span.Chara - {mso-style-name:"��ע�ı� Char"; - mso-style-link:��ע�ı�; - font-family:����;} + {mso-style-name:"脚注文本 Char"; + mso-style-link:脚注文本; + font-family:宋体;} span.Charb - {mso-style-name:"��ע���� Char"; - mso-style-link:��ע����; - font-family:����;} + {mso-style-name:"批注文字 Char"; + mso-style-link:批注文字; + font-family:宋体;} span.Charc - {mso-style-name:"ҳü Char"; - mso-style-link:ҳü; - font-family:����;} + {mso-style-name:"页眉 Char"; + mso-style-link:页眉; + font-family:宋体;} span.Chard - {mso-style-name:"ҳ�� Char"; - mso-style-link:ҳ��; - font-family:����;} + {mso-style-name:"页脚 Char"; + mso-style-link:页脚; + font-family:宋体;} span.Chare - {mso-style-name:"���� Char"; - mso-style-link:����; - font-family:����;} + {mso-style-name:"日期 Char"; + mso-style-link:日期; + font-family:宋体;} span.HTMLChar - {mso-style-name:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char"; - mso-style-link:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3"; - font-family:����;} + {mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char"; + mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3"; + font-family:宋体;} span.Charf - {mso-style-name:"��ע���� Char"; - mso-style-link:��ע����; - font-family:����; + {mso-style-name:"批注主题 Char"; + mso-style-link:批注主题; + font-family:宋体; font-weight:bold;} span.Charf0 - {mso-style-name:"��ע���ı� Char"; - mso-style-link:��ע���ı�; - font-family:����;} + {mso-style-name:"批注框文本 Char"; + mso-style-link:批注框文本; + font-family:宋体;} span.5CharCharChar0 - {mso-style-name:"ͼ������5�� Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字5号 Char Char Char"; + font-family:宋体;} span.5CharCharCharChar - {mso-style-name:"ͼ������С5�� Char Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字小5号 Char Char Char Char"; + font-family:宋体;} span.msoIns {mso-style-name:""; text-decoration:underline; @@ -1929,7 +1929,7 @@ ul
13 !
-! setup.s�����BIOS�л�ȡϵͳ���ݣ�������Щ���ݷŵ�ϵͳ�ڴ���ʵ�
+! setup.s负责从BIOS中获取系统数据,并将这些数据放到系统内存的适当
-! �ط�����ʱsetup.s��system�Ѿ���bootsect��������ص��ڴ��С�
+! 地方。此时setup.s和system已经由bootsect引导块加载到内存中。
!
-! ��δ���ѯ��bios�й��ڴ�/����/����������������Щ�����ŵ�һ��
+! 这段代码询问bios有关内存/磁盘/其他参数,并将这些参数放到一个
-! ����ȫ�ġ��ط���0x90000-0x901FF��Ҳ��ԭ��bootsect�����������
+! “安全的”地方:0x90000-0x901FF,也即原来bootsect代码块曾经在
-! �ĵط���Ȼ���ڱ�����鸲�ǵ�֮ǰ�ɱ���ģʽ��system��ȡ��
+! 的地方,然后在被缓冲块覆盖掉之前由保护模式的system读取。
@@ -2011,34 +2011,34 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L14">14 < href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L15">15 ! NOTE! These had better be the same as in bootsect.s! -! ������Щ������ú�bootsect.s�е���ͬ��
+! 以下这些参数最好和bootsect.s中的相同!
16 #include <linux/config.h>
-! config.h�����DEF_INITSEG = 0x9000��DEF_SYSSEG = 0x1000��DEF_SETUPSEG = 0x9020��
+! config.h中定义了DEF_INITSEG = 0x9000;DEF_SYSSEG = 0x1000;DEF_SETUPSEG = 0x9020。
18 -INITSEG = DEF_INITSEG ! we move boot here - out of the way ! ԭ��bootsect�����ĶΡ�
+INITSEG = DEF_INITSEG ! we move boot here - out of the way ! 原来bootsect所处的段。19 SYSSEG = DEF_SYSSEG ! system loaded at 0x10000 (65536). -! system��0x10000����
+! system在0x10000处。20 SETUPSEG = DEF_SETUPSEG ! this is the current segment ! -���������ڵĶε�ַ��
+本程序所在的段地址。 @@ -2091,17 +2091,17 @@ the read went well so we get current cursor position and save it for href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L35">35 ! posterity. -! ok�����������̹��̶����������ڽ����λ�ñ����Ա����ʹ�ã���ش�����59--62�У���
+! ok,整个读磁盘过程都正常,现在将光标位置保存以备今后使用(相关代码在59--62行)。
-! �¾佫ds�ó�INITSEG(0x9000)�����Ѿ���bootsect���������ù�������������setup����
+! 下句将ds置成INITSEG(0x9000)。这已经在bootsect程序中设置过,但是现在是setup程序,
-! Linus������Ҫ����������һ�¡�
+! Linus觉得需要再重新设置一下。
37 @@ -2118,17 +2118,17 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L39">39 < href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L40">40 ! Get memory size (extended mem, kB)
-! ȡ��չ�ڴ�Ĵ�Сֵ��KB����
+! 取扩展内存的大小值(KB)。
-! ����BIOS�ж�0x15 ���ܺ�ah = 0x88 ȡϵͳ������չ�ڴ��С���������ڴ�0x90002����
+! 利用BIOS中断0x15 功能号ah = 0x88 取系统所含扩展内存大小并保存在内存0x90002处。
-! ���أ�ax -= ��0x100000��1M������ʼ����չ�ڴ��С(KB)����������CF��λ��ax = �����롣
+! 返回:ax += 从0x100000(1M)处开始的扩展内存大小(KB)。若出错则CF置位,ax = 出错码。
@@ -2144,7 +2144,7 @@ int 0x1544 mov [2],ax -! ����չ�ڴ���ֵ����0x90002����1���֣���
+! 将扩展内存数值存在0x90002处(1个字)。 @@ -2153,25 +2153,25 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L45">45 < href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L46">46 ! check for EGA/VGA and some config parameters -! �����ʾ��ʽ��EGA/VGA����ȡ������
+! 检查显示方式(EGA/VGA)并取参数。
-! ����BIOS�ж�0x10�����ӹ���ѡ��ʽ��Ϣ�����ܺţ�ah = 0x12�� ! 调用BIOS中断0x10,附加功能选择方式信息。功能号:ah = 0x12,bl = 0x10
-! ���أ�bh -=��ʾ״̬��0x00 -��ɫģʽ��I/O�˿�=0x3dX��0x01 -��ɫģʽ��I/O�˿�=0x3bX��
+! 返回:bh +=显示状态。0x00 -彩色模式,I/O端口=0x3dX;0x01 -单色模式,I/O端口=0x3bX。
-! bl = ��װ����ʾ�ڴ档0x00 - 64k��0x01 - 128k��0x02 - 192k��0x03 = 256k��
+! bl = 安装的显示内存。0x00 - 64k;0x01 - 128k;0x02 - 192k;0x03 = 256k。
-! cx = ��ʾ�����Բ���(�μ�������BIOS��Ƶ�ж�0x10��˵��)��
+! cx = 显示卡特性参数(参见程序后对BIOS视频中断0x10的说明)。
@@ -2196,29 +2196,29 @@ mov [8],ax &nb52 mov [10],bx ! -0x9000A =��װ����ʾ�ڴ棻0x9000B=��ʾ״̬(��/��ɫ安装的显示内存;0x9000B=显示状态(彩/单色)
53 mov [12],cx ! -0x9000C =��ʾ�����Բ�����
+0x9000C =显示卡特性参数。 -! �����Ļ��ǰ����ֵ������ʾ����VGA��ʱ�������û�ѡ����ʾ����ֵ�������浽0x9000E����
+! 检测屏幕当前行列值。若显示卡是VGA卡时则请求用户选择显示行列值,并保存到0x9000E处。
54 -mov ax,#0x5019 ! ��ax��Ԥ����ĻĬ������ֵ��ah = 80�У�al=25�У���
+mov ax,#0x5019 ! 在ax中预置屏幕默认行列值(ah = 80列;al=25行)。55 cmp bl,#0x10 -! ���жϷ���blֵΪ0x10�����ʾ����VGA��ʾ������ת��
+! 若中断返回bl值为0x10,则表示不是VGA显示卡,跳转。56 @@ -2227,30 +2227,30 @@ je novga
57 call chsvga -! �����ʾ�����Һ����ͣ�����ʾ����ֵ����215�У���
+! 检测显示卡厂家和类型,修改显示行列值(第215行)。58 novga: mov [14],ax -! ������Ļ��ǰ����ֵ��0x9000E��0x9000F����
+! 保存屏幕当前行列值(0x9000E,0x9000F)。-
! ��δ���ʹ��BIOS�ж�ȡ��Ļ��ǰ���λ�ã��С��У������������ڴ�0x90000����2�ֽڣ���
+! 这段代码使用BIOS中断取屏幕当前光标位置(列、行),并保存在内存0x90000处(2字节)。
-! ����̨��ʼ������ᵽ�˴���ȡ��ֵ��
+! 控制台初始化程序会到此处读取该值。
-! BIOS�ж�0x10���ܺ� ah = 0x03�������λ�á�
+! BIOS中断0x10功能号 ah = 0x03,读光标位置。
-! ���룺bh -= ҳ��
+! 输入:bh += 页号
-! ���أ�ch -= ɨ�迪ʼ�ߣ�cl = ɨ������ߣ�dh = �к�(0x00����)��dl = �к�(0x00�����)��
+! 返回:ch += 扫描开始线;cl = 扫描结束线;dh = 行号(0x00顶端);dl = 列号(0x00最左边)。
59 @@ -2280,17 +2280,17 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L63">63 &nb href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L64">64 ! Get video-card data:
-! �����������ȡ��ʾ����ǰ��ʾģʽ��
+! 下面这段用于取显示卡当前显示模式。
-! ����BIOS�ж�0x10�����ܺ� ah = 0x0f
+! 调用BIOS中断0x10,功能号 ah = 0x0f
-! ���أ�ah -= �ַ�������al = ��ʾģʽ��bh = ��ǰ��ʾҳ��
+! 返回:ah += 字符列数;al = 显示模式;bh = 当前显示页。
-! 0x90004(1��)��ŵ�ǰҳ��0x90006�����ʾģʽ��0x90007����ַ�������
+! 0x90004(1字)存放当前页;0x90006存放显示模式;0x90007存放字符列数。
65 @@ -2323,34 +2323,34 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L70">70 < href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L71">71 ! Get hd0 data
-! ȡ��һ��Ӳ�̵���Ϣ������Ӳ�̲���������
+! 取第一个硬盘的信息(复制硬盘参数表)。
-! ��1��Ӳ�̲���������ַ��Ȼ���ж�����0x41������ֵ������2��Ӳ�̲����������ڵ�1��
+! 第1个硬盘参数表的首地址竟然是中断向量0x41的向量值!而第2个硬盘参数表紧接在第1个
-! ���ĺ��棬�ж�����0x46������ֵҲָ���2��Ӳ�̵IJ�������ַ�����ij�����16���ֽڡ�
+! 表的后面,中断向量0x46的向量值也指向第2个硬盘的参数表首址。表的长度是16个字节。
-! �������γ���ֱ���ROM BIOS���й�����Ӳ�̵IJ�������0x90080����ŵ�1��Ӳ�̵ı���
+! 下面两段程序分别复制ROM BIOS中有关两个硬盘的参数表,0x90080处存放第1个硬盘的表,
-! 0x90090����ŵ�2��Ӳ�̵ı���
+! 0x90090处存放第2个硬盘的表。
-! ��75�������ڴ�ָ��λ�ô���ȡһ����ָ��ֵ������ds��si�Ĵ����С�ds�зŶε�ַ��
+! 第75行语句从内存指定位置处读取一个长指针值并放入ds和si寄存器中。ds中放段地址,
-! si�Ƕ���ƫ�Ƶ�ַ�������ǰ��ڴ��ַ4 * 0x41��= 0x104���������4���ֽڶ�������4��
+! si是段内偏移地址。这里是把内存地址4 * 0x41(= 0x104)处保存的4个字节读出。这4字
-! �ڼ���Ӳ�̲���������λ�õĶκ�ƫ��ֵ��
+! 节即是硬盘参数表所处位置的段和偏移值。
73 @@ -2363,8 +2363,8 @@ mov ds,ax
75 lds si,[4*0x41] ! -ȡ�ж�����0x41��ֵ����hd0�������ĵ�ַ��ds:si
+取中断向量0x41的值,即hd0参数表的地址èds:si76 @@ -2377,13 +2377,13 @@ mov es,ax
78 mov di,#0x0080 ! -�����Ŀ�ĵ�ַ: 0x9000:0x0080 �� es:di
+传输的目的地址: 0x9000:0x0080 è es:di79 mov cx,#0x10 ! -������16�ֽڡ�
+共传输16字节。80 @@ -2414,8 +2414,8 @@ mov ds,ax
87 lds si,[4*0x46] ! -ȡ�ж�����0x46��ֵ����hd1�������ĵ�ַ��ds:si
+取中断向量0x46的值,即hd1参数表的地址èds:si88 @@ -2428,8 +2428,8 @@ mov es,ax
90 mov di,#0x0090 ! -�����Ŀ�ĵ�ַ: 0x9000:0x0090 �� es:di
+传输的目的地址: 0x9000:0x0090 è es:di91 @@ -2450,24 +2450,24 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L94">94 < href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L95">95 ! Check that there IS a hd1 :-)
-! ���ϵͳ�Ƿ��е�2��Ӳ�̡����û����ѵ�2�������㡣
+! 检查系统是否有第2个硬盘。如果没有则把第2个表清零。
-! ����BIOS�жϵ���0x13��ȡ�������ܣ����ܺ� ah = 0x15��
+! 利用BIOS中断调用0x13的取盘类型功能,功能号 ah = 0x15;
-! ���룺dl -= �������ţ�0x8X��Ӳ�̣�0x80ָ��1��Ӳ�̣�0x81��2��Ӳ�̣�
+! 输入:dl += 驱动器号(0x8X是硬盘:0x80指第1个硬盘,0x81第2个硬盘)
-! �����ah -= �����룻00 - û������̣�CF��λ��01 - ��������û��change-line֧�֣�
+! 输出:ah += 类型码;00 - 没有这个盘,CF置位;01 - 是软驱,没有change-line支持;
! -02 - ������(���������ƶ��豸)����change-line֧�֣� 03 - ��Ӳ�̡�
+02 - 是软驱(或其他可移动设备),有change-line支持; 03 - 是硬盘。 @@ -2491,8 +2491,8 @@ jc no_disk1101 cmp ah,#3 -! ��Ӳ����(���� = 3 ��)��
+! 是硬盘吗?(类型 = 3 ?)。102 @@ -2505,7 +2505,7 @@ no_disk1:
104 mov ax,#INITSEG -! ��2��Ӳ�̲����ڣ���Ե�2��Ӳ�̱����㡣
+! 第2个硬盘不存在,则对第2个硬盘表清零。105 @@ -2542,7 +2542,7 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L112">112 113 ! now we want to move to protected mode ...
-! ��������Ҫ���뱣��ģʽ���� ! 现在我们要进入保护模式中了...
114 115 cli -! no interrupts allowed ! ! �Ӵ˿�ʼ�������жϡ�
+! no interrupts allowed ! ! 从此开始不允许中断。 @@ -2560,25 +2560,25 @@ href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L116">116 117 ! first we move the system to it's rightful place -! �������ǽ�systemģ���Ƶ���ȷ��λ�á�
+! 首先我们将system模块移到正确的位置。
-! bootsect���������� system ģ����뵽�ڴ� 0x10000��64KB����ʼ��λ�á����ڵ�ʱ����
+! bootsect引导程序会把 system 模块读入到内存 0x10000(64KB)开始的位置。由于当时假设
-! systemģ����Ȳ��ᳬ��0x80000��512KB��������ĩ�˲��ᳬ���ڴ��ַ0x90000������
+! system模块最大长度不会超过0x80000(512KB),即其末端不会超过内存地址0x90000,所以
-! bootsect����Լ��ƶ���0x90000��ʼ�ĵط�������setup���ص����ĺ��档������γ����
+! bootsect会把自己移动到0x90000开始的地方,并把setup加载到它的后面。下面这段程序的
-! ��;���ٰ�����systemģ���ƶ��� 0x00000λ�ã����Ѵ� 0x10000��0x8ffff ���ڴ����ݿ�
+! 用途是再把整个system模块移动到 0x00000位置,即把从 0x10000到0x8ffff 的内存数据块
-! ��512KB����������ڴ�Ͷ��ƶ���0x10000��64KB����λ�á�
+! (512KB)整块地向内存低端移动了0x10000(64KB)的位置。
@@ -2600,7 +2600,7 @@ do_move: href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L122">122 mov es,ax ! destination -segment ! es:di��Ŀ�ĵ�ַ(��ʼΪ0x0:0x0) +segment ! es:di是目的地址(初始为0x0:0x0)123 @@ -2608,19 +2608,19 @@ add ax,#0x1000
124 -cmp ax,#0x9000 ! �Ѿ������һ�Σ���0x8000�ο�ʼ��64KB�������ƶ��ꣿ
+cmp ax,#0x9000 ! 已经把最后一段(从0x8000段开始的64KB)代码移动完?125 jz end_move -! �ǣ�����ת��
+! 是,则跳转。126 mov ds,ax ! source -segment ! ds:si��Դ��ַ(��ʼΪ0x1000:0x0)
+segment ! ds:si是源地址(初始为0x1000:0x0)127 @@ -2632,8 +2632,8 @@ sub si,si
129 -mov cx,#0x8000 ! �ƶ�0x8000�֣�64KB�ֽڣ���
+mov cx,#0x8000 ! 移动0x8000字(64KB字节)。134 ! then we load the segment descriptors
-! �˺����Ǽ��ض���������
+! 此后,我们加载段描述符。
-! �����↑ʼ������32λ����ģʽ�IJ����������ҪIntel 32λ����ģʽ��̷����֪ʶ�ˣ�
+! 从这里开始会遇到32位保护模式的操作,因此需要Intel 32位保护模式编程方面的知识了,
-! �й��ⷽ�����Ϣ������б���ļ��ܻ�¼�е���ϸ˵�������������Ҫ˵�����ڽ���
+! 有关这方面的信息请查阅列表后的简单介绍或附录中的详细说明。这里仅作概要说明。在进入
-! ����ģʽ������֮ǰ��������Ҫ�������ú���Ҫʹ�õĶ�����������������Ҫ����ȫ��������
+! 保护模式中运行之前,我们需要首先设置好需要使用的段描述符表。这里需要设置全局描述符
-! ���������������
+! 表和中断描述符表。
!
-! ����ָ��lidt���ڼ����ж�����������IDT���Ĵ��������IJ�������idt_48����6�ֽڡ�ǰ2
+! 下面指令lidt用于加载中断描述符表(IDT)寄存器。它的操作数(idt_48)有6字节。前2
-! �ֽڣ��ֽ�0-1���������������ֽڳ���ֵ����4�ֽڣ��ֽ�2-5��������������32λ���Ի�
+! 字节(字节0-1)是描述符表的字节长度值;后4字节(字节2-5)是描述符表的32位线性基
-! ��ַ������ʽ�μ�����218--220�к�222--224��˵�����ж����������е�ÿһ��8�ֽڱ���
+! 地址,其形式参见下面218--220行和222--224行说明。中断描述符表中的每一个8字节表项
-! ָ�������ж�ʱ��Ҫ���õĴ�����Ϣ�����ж�������Щ���ƣ���Ҫ�����������Ϣ��
+! 指出发生中断时需要调用的代码信息。与中断向量有些相似,但要包含更多的信息。
!
-! lgdtָ�����ڼ���ȫ������������GDT���Ĵ��������������ʽ��lidtָ�����ͬ��ȫ������
+! lgdt指令用于加载全局描述符表(GDT)寄存器,其操作数格式与lidt指令的相同。全局描述
-! �����е�ÿ���������8�ֽڣ������˱���ģʽ�����ݶκʹ���Σ��飩����Ϣ�� ���а���
+! 符表中的每个描述符项(8字节)描述了保护模式下数据段和代码段(块)的信息。 其中包括
-! �ε�������ƣ�16λ�����ε����Ե�ַ��ַ��32λ�����ε���Ȩ�������Ƿ����ڴ桢��д
+! 段的最大长度限制(16位)、段的线性地址基址(32位)、段的特权级、段是否在内存、读写
-! ����Ȩ�Լ�����һЩ����ģʽ���еı�־���μ�����205--216�С�
+! 许可权以及其他一些保护模式运行的标志。参见后面205--216行。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L138">138 mov ds,ax -! dsָ����(setup)�Ρ� +! ds指向本程序(setup)段。139 &n lidt idt_48 ! load idt with 0,0 ! -����IDT�Ĵ�����
+加载IDT寄存器。140 lgdt gdt_48 ! load gdt with -whatever appropriate ! ����GDT�Ĵ�����
+whatever appropriate ! 加载GDT寄存器。142 ! that was painless, now we enable A20
-! ���ϵIJ����ܼ��������ǿ���A20��ַ�ߡ�
+! 以上的操作很简单,现在我们开启A20地址线。
-! Ϊ���ܹ����ʺ�ʹ��1MB���ϵ������ڴ棬������Ҫ���ȿ���A20��ַ�ߡ��μ��������б���
+! 为了能够访问和使用1MB以上的物理内存,我们需要首先开启A20地址线。参见本程序列表后
-! �й�A20�ź��ߵ�˵�����������漰��һЩ�˿ں�����ɲο� ! 有关A20信号线的说明。关于所涉及的一些端口和命令,可参考kernel/chr_drv/keyboard.S
-! �����Լ��̽ӿڵ�˵�������ڻ����Ƿ�����������A20��ַ�ߣ����ǻ���Ҫ�ڽ��뱣��ģʽ
+! 程序后对键盘接口的说明。至于机器是否真正开启了A20地址线,我们还需要在进入保护模式
-! ֮���ܷ���1MB�����ڴ�֮���ڲ���һ�¡��������������head.S�����У�32--36�У���
+! 之后(能访问1MB以上内存之后)在测试一下。这个工作放在了head.S程序中(32--36行)。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L144">144 call empty_8042 -! ����8042״̬�Ĵ������ȴ����뻺�����ա� +! 测试8042状态寄存器,等待输入缓冲器空。-! ֻ�е����뻺����Ϊ��ʱ�ſ��Զ���ִ��д���
+! 只有当输入缓冲器为空时才可以对其执行写命令。145 mov al,#0xD1 -! command write ! 0xD1������-��ʾҪд���ݵ�
+! command write ! 0xD1命令码-表示要写数据到146 out #0x64,al -! 8042��P2�˿ڡ�P2�˿�λ1����A20�ߵ�ѡͨ��
+! 8042的P2端口。P2端口位1用于A20线的选通。147 call empty_8042 -! �ȴ����뻺�����գ��������Ƿ��ܡ�
+! 等待输入缓冲器空,看命令是否被接受。148 mov al,#0xDF -! A20 on ! ѡͨA20��ַ�ߵIJ�����
+! A20 on ! 选通A20地址线的参数。149 out #0x60,al -! ����Ҫд��0x60�ڡ�
+! 数据要写到0x60口。150 call empty_8042 -! ����ʱ���뻺����Ϊ�գ����ʾA20���Ѿ�ѡͨ��
+! 若此时输入缓冲器为空,则表示A20线已经选通。!
-! ϣ������һ���������������DZ������¶��жϽ��б�� :-( ���ǽ����Ƿ�������
+! 希望以上一切正常。现在我们必须重新对中断进行编程 :-( 我们将它们放在正好
-! ����Intel������Ӳ���жϺ��棬��int 0x20--0x2F�����������Dz��������ͻ��
+! 处于Intel保留的硬件中断后面,即int 0x20--0x2F。在那里它们不会引起冲突。
-! ���ҵ���IBM��ԭPC���и����ˣ��Ժ�Ҳû�о�������������PC��BIOS���ж�
+! 不幸的是IBM在原PC机中搞糟了,以后也没有纠正过来。所以PC机BIOS把中断
-! ������0x08--0x0f����Щ�ж�Ҳ�������ڲ�Ӳ���жϡ��������Ǿͱ������¶� ! 放在了0x08--0x0f,这些中断也被用于内部硬件中断。所以我们就必须重新对8259
-! �жϿ��������б�̣���һ�㶼û��˼��
+! 中断控制器进行编程,这一点都没意思。
!
-! PC��ʹ��2��8259AоƬ�����ڶԿɱ�̿�����8259AоƬ�ı�̷�����μ��������Ľ��ܡ�
+! PC机使用2个8259A芯片,关于对可编程控制器8259A芯片的编程方法请参见本程序后的介绍。
-! ��162���϶���������֣�0x00eb����ֱ��ʹ�û������ʾ�����������תָ�����ʱ���á�
+! 第162行上定义的两个字(0x00eb)是直接使用机器码表示的两条相对跳转指令,起延时作用。
-! 0xeb��ֱ�ӽ���תָ��IJ����룬��1���ֽڵ����λ��ֵ�������ת��Χ��-127��127��CPU
+! 0xeb是直接近跳转指令的操作码,带1个字节的相对位移值。因此跳转范围是-127到127。CPU
-! ͨ����������λ��ֵ�ӵ�EIP�Ĵ����о��γ�һ���µ���Ч��ַ����ʱEIPָ����һ����ִ��
+! 通过把这个相对位移值加到EIP寄存器中就形成一个新的有效地址。此时EIP指向下一条被执行
-! ��ָ�ִ��ʱ�����ѵ�CPUʱ����������7��10����0x00eb ��ʾ��תֵ��0��һ��ָ���
+! 的指令。执行时所花费的CPU时钟周期数是7至10个。0x00eb 表示跳转值是0的一条指令,因
-! �˻���ֱ��ִ����һ��ָ�������ָ����ṩ14--20��CPUʱ�����ڵ��ӳ�ʱ�䡣�� ! 此还是直接执行下一条指令。这两条指令共可提供14--20个CPU时钟周期的延迟时间。在as86
-! ��û�б�ʾ��Ӧָ������Ƿ������Linus��setup.s��һЩ�������о�ֱ��ʹ�û���������
+! 中没有表示相应指令的助记符,因此Linus在setup.s等一些汇编程序中就直接使用机器码来表
-! ʾ����ָ����⣬ÿ���ղ���ָ��NOP��ʱ����������3���������Ҫ�ﵽ��ͬ���ӳ�Ч����
+! 示这种指令。另外,每个空操作指令NOP的时钟周期数是3个,因此若要达到相同的延迟效果就
-! ��Ҫ6��7��NOPָ�
+! 需要6至7个NOP指令。
-! 8259оƬ��Ƭ�˿���0x20-0x21����Ƭ�˿���0xA0-0xA1�����ֵ0x11��ʾ��ʼ�����ʼ��
+! 8259芯片主片端口是0x20-0x21,从片端口是0xA0-0xA1。输出值0x11表示初始化命令开始,
-! ����ICW1�����֣���ʾ���ش�������Ƭ8259���������Ҫ����ICW4�����֡�
+! 它是ICW1命令字,表示边沿触发、多片8259级连、最后要发送ICW4命令字。
161 out #0x20,al -! send it to 8259A-1 ! ���͵�8259A��оƬ��
+! send it to 8259A-1 ! 发送到8259A主芯片。162 .word 0x00eb,0x00eb ! jmp -$+2, jmp $+2 ! '$'��ʾ��ǰָ��ĵ�ַ��
+$+2, jmp $+2 ! '$'表示当前指令的地址,163 out #0xA0,al -! and to 8259A-2 ! �ٷ��͵�8259A��оƬ��
+! and to 8259A-2 ! 再发送到8259A从芯片。164 .word 0x00eb,0x00eb
-! LinuxϵͳӲ���жϺű����óɴ�0x20��ʼ���μ���3-2��Ӳ���ж������ź����жϺŶ�Ӧ����
+! Linux系统硬件中断号被设置成从0x20开始。参见表3-2:硬件中断请求信号与中断号对应表。
166 out #0x21,al -! ����оƬICW2�����֣�������ʼ�жϺţ�Ҫ����˿ڡ�
+! 送主芯片ICW2命令字,设置起始中断号,要送奇端口。169 out #0xA1,al -! �ʹ�оƬICW2�����֣���оƬ����ʼ�жϺš�
+! 送从芯片ICW2命令字,从芯片的起始中断号。172 out #0x21,al -! ����оƬICW3�����֣���оƬ��IR2����оƬINT��
+! 送主芯片ICW3命令字,主芯片的IR2连从芯片INT。- ���μ������б����˵����
+ !参见代码列表后的说明。175 out #0xA1,al -! �ʹ�оƬICW3�����֣���ʾ��оƬ��INT������о
+! 送从芯片ICW3命令字,表示从芯片的INT连到主芯- ! Ƭ��IR2�����ϡ�
+ ! 片的IR2引脚上。178 out #0x21,al -! ����оƬICW4�����֡�8086ģʽ����ͨEOI���ǻ���
+! 送主芯片ICW4命令字。8086模式;普通EOI、非缓冲-! ��ʽ���跢��ָ������λ����ʼ��������оƬ������
+! 方式,需发送指令来复位。初始化结束,芯片就绪。179 &n href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L180">180 out #0xA1,al -���ʹ�оƬICW4�����֣�����ͬ�ϡ�
+!送从芯片ICW4命令字,内容同上。183 out #0x21,al -! ������оƬ�����ж�����
+! 屏蔽主芯片所有中断请求。184 &n href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L185">185 out #0xA1,al -�����δ�оƬ�����ж�����
+!屏蔽从芯片所有中断请求。195 ! absolute address 0x00000, in
! ! �ߣ�������α�̵�Ȼû��:-(����ϣ�������ܹ�������������Ҳ������Ҫ��ζ��BIOS ! 哼,上面这段编程当然没劲:-(,但希望这样能工作,而且我们也不再需要乏味的BIOS ! �ˣ����˳�ʼ����:-)��BIOS�ӳ���Ҫ��ܶ��Ҫ�����ݣ�������һ�㶼ûȤ������ ! 了(除了初始加载:-)。BIOS子程序要求很多不必要的数据,而且它一点都没趣。那是 ! ���������ij���Ա�������¡� ! “真正”的程序员所做的事。 ! ! ���ˣ�������������ʼ���뱣��ģʽ��ʱ���ˡ�Ϊ�˰��������þ��������Dz����� ! 好了,现在是真正开始进入保护模式的时候了。为了把事情做得尽量简单,我们并不对 ! �Ĵ������ݽ����κ����á�������gnu�����32λ����ȥ������Щ�¡��ڽ���32λ�� ! 寄存器内容进行任何设置。我们让gnu编译的32位程序去处理这些事。在进入32位保 ! ��ģʽʱ���ǽ��Ǽ���ת�����Ե�ַ0x00000���� ! 护模式时我们仅是简单地跳转到绝对地址0x00000处。 ! �������ò�����32λ����ģʽ���С����ȼ��ػ���״̬��(lmsw-Load Machine Status
-Word)�� ! 下面设置并进入32位保护模式运行。首先加载机器状态字(lmsw-Load Machine Status
+Word), ! Ҳ�ƿ��ƼĴ���CR0�������λ0��1������CPU�л�������ģʽ��������������Ȩ��0�У��� ! 也称控制寄存器CR0,其比特位0置1将导致CPU切换到保护模式,并且运行在特权级0中,即 ! ��ǰ��Ȩ��CPL=0����ʱ�μĴ�����Ȼָ����ʵ��ַģʽ����ͬ�����Ե�ַ������ʵ��ַģʽ�� ! 当前特权级CPL=0。此时段寄存器仍然指向与实地址模式中相同的线性地址处(在实地址模式下 ! ���Ե�ַ�������ڴ��ַ��ͬ���������øñ���λ�����һ��ָ�������һ���μ���תָ���� ! 线性地址与物理内存地址相同)。在设置该比特位后,随后一条指令必须是一条段间跳转指令以 ! ����ˢ��CPU��ǰָ����С���ΪCPU����ִ��һ��ָ��֮ǰ���Ѵ��ڴ��ȡ��ָ�������� ! 用于刷新CPU当前指令队列。因为CPU是在执行一条指令之前就已从内存读取该指令并对其进行 ! ���롣Ȼ���ڽ��뱣��ģʽ�Ժ���Щ����ʵģʽ��Ԥ��ȡ�õ�ָ����Ϣ�ͱ�ò�����Ч����һ�� ! 解码。然而在进入保护模式以后那些属于实模式的预先取得的指令信息就变得不再有效。而一条 ! �μ���תָ��ͻ�ˢ��CPU�ĵ�ǰָ����У���������Щ��Ч��Ϣ�����⣬��Intel��˾���ֲ� ! 段间跳转指令就会刷新CPU的当前指令队列,即丢弃这些无效信息。另外,在Intel公司的手册 ! �Ͻ���80386������CPUӦ��ʹ��ָ����mov cr0,ax���л�������ģʽ��lmswָ������ڼ����� ! 上建议80386或以上CPU应该使用指令“mov cr0,ax”切换到保护模式。lmsw指令仅用于兼容以 ! ǰ��286 CPU�� ! 前的286 CPU。
198 &n lmsw ax ! This is it! -! ���������ػ���״̬��!
+! 就这样加载机器状态字!199 jmpi 0,8 ! -jmp offset 0 of segment 8 (cs) ! ��ת��cs��ƫ��0����
+jmp offset 0 of segment 8 (cs) ! 跳转至cs段偏移0处。 -! �����Ѿ���systemģ���ƶ���0x00000��ʼ�ĵط��������Ͼ��е�ƫ�Ƶ�ַ��0������ֵ8�Ѿ�
+! 我们已经将system模块移动到0x00000开始的地方,所以上句中的偏移地址是0。而段值8已经
-! �DZ���ģʽ�µĶ�ѡ����ˣ�����ѡ�����������������������Լ���Ҫ�����Ȩ������ѡ�����
+! 是保护模式下的段选择符了,用于选择描述符表和描述符表项以及所要求的特权级。段选择符长
-! ��Ϊ16λ��2�ֽڣ���λ0-1��ʾ�������Ȩ��0--3����Linux����ϵͳֻ�õ�������0������
+! 度为16位(2字节);位0-1表示请求的特权级0--3,但Linux操作系统只用到两级:0级(内
-! �˼�����3�����û�������λ2����ѡ��ȫ������������0�����Ǿֲ���������(1)��λ3-15����
+! 核级)和3级(用户级);位2用于选择全局描述符表(0)还是局部描述符表(1);位3-15是描
-! ���������������ָ��ѡ��ڼ��������������Զ�ѡ���8��0b0000,0000,0000,1000����ʾ����
+! 述符表项的索引,指出选择第几项描述符。所以段选择符8(0b0000,0000,0000,1000)表示请求
-! ��Ȩ��0��ʹ��ȫ����������GDT�е�2���������������ָ������Ļ���ַ��0���μ�571�У���
+! 特权级0、使用全局描述符表GDT中第2个段描述符项,该项指出代码的基地址是0(参见571行),
-! ����������תָ��ͻ�ȥִ��system�еĴ��롣���⣬
+! 因此这里的跳转指令就会去执行system中的代码。另外,
203 ! the machine, and we probably couldn't proceed anyway.
-! ��������ӳ����������������Ƿ�Ϊ�ա����ﲻʹ�ó�ʱ���� ! 下面这个子程序检查键盘命令队列是否为空。这里不使用超时方法 -
-! ���������������˵��PC�������⣬���Ǿ�û�а취�ٴ�����ȥ�ˡ�
+! 如果这里死机,则说明PC机有问题,我们就没有办法再处理下去了。
!
-! ֻ�е����뻺����Ϊ��ʱ�����̿�����״̬�Ĵ���λ1 = 0���ſ��Զ���ִ��д���
+! 只有当输入缓冲器为空时(键盘控制器状态寄存器位1 = 0)才可以对其执行写命令。
206 in al,#0x64 ! 8042 status port -! ��AT���̿�����״̬�Ĵ�����
+! 读AT键盘控制器状态寄存器。207 test al,#2 ! is input -buffer full? ! ����λ1�����뻺��������
+buffer full? ! 测试位1,输入缓冲器满?213 ! If one is found the resolution chosen is given by al,ah (rows,cols).
-! ����������ʶ��SVGA��ʾ�������еĻ������ӳ�����ʶ���һ������û�
+! 下面是用于识别SVGA显示卡(若有的话)的子程序。若识别出一块就向用户
-! �ṩѡ��ֱ��ʵĻ��ᣬ���ѷֱ��ʷ���Ĵ���al��ah���С��У��з��ء�
+! 提供选择分辨率的机会,并把分辨率放入寄存器al、ah(行、列)中返回。
!
-! ע������215--566�д���ǣ�浽�ڶ���ʾ���˿���Ϣ����˱Ƚϸ��ӡ���������δ������ں�
+! 注意下面215--566行代码牵涉到众多显示卡端口信息,因此比较复杂。但由于这段代码与内核
-! ���й�ϵ������˿�������������
+! 运行关系不大,因此可以跳过不看。
-! ����������ʾ588���ϵ�msg1�ַ�����"��<�س���>�鿴���ڵ�SVGAģʽ�������������"����
+! 下面首先显示588行上的msg1字符串("按<回车键>查看存在的SVGA模式,或按任意键继续"),
-! Ȼ��ѭ����ȡ���̿�����������������ȴ��û�����������û����»س�����ȥ���ϵͳ����
+! 然后循环读取键盘控制器输出缓冲器,等待用户按键。如果用户按下回车键就去检查系统具有
-! ��SVGAģʽ������AL��AH�з����������ֵ����������Ĭ��ֵAL=25�С�AH=80�в����ء�
+! 的SVGA模式,并在AL和AH中返回最大行列值,否则设置默认值AL=25行、AH=80列并返回。
215 chsvga: cld
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L216">216 push ds -! ����dsֵ������231�У���490��492�У������� +! 保存ds值。将在231行(或490或492行)弹出。217 push cs -! ��Ĭ�����ݶ����óɺʹ����ͬһ���Ρ�
+! 把默认数据段设置成和代码段同一个段。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L220">220 mov es,ax -! es ָ��0xc000�Ρ��˴���VGA���ϵ�ROM BIOS���� +! es 指向0xc000段。此处是VGA卡上的ROM BIOS区。221 lea si,msg1 -! ds:siָ��msg1�ַ�����
+! ds:si指向msg1字符串。222 call prtstr -! ��ʾ��NULL��β��msg1�ַ�����
+! 显示以NULL结尾的msg1字符串。223 nokey: in al,#0x60 -! ��ȡ���̿�������������������Լ��̵�ɨ����������
+! 读取键盘控制器输出缓冲器(来自键盘的扫描码或命令)。224 cmp al,#0x82 -! ����յ���0x82С��ɨ�������ǽ�ͨɨ���룬��Ϊ0x82��
+! 如果收到比0x82小的扫描码则是接通扫描码,因为0x82是225 jb nokey -! ��С�Ͽ�ɨ����ֵ��С��0x82��ʾ��û�а����ɿ���
+! 最小断开扫描码值。小于0x82表示还没有按键松开。226 cmp al,#0xe0 -! ���ɨ�������0xe0����ʾ�յ�������չɨ����ǰ��
+! 如果扫描码大于0xe0,表示收到的是扩展扫描码前缀。228 -cmp al,#0x9c ! ����Ͽ�ɨ������0x9c����ʾ�û�����/�ɿ��˻س�����
+cmp al,#0x9c ! 如果断开扫描码是0x9c,表示用户按下/松开了回车键,229 je svga -! ���dz�����תȥ���ϵͳ�Ƿ����SVGAģʽ��
+! 于是程序跳转去检查系统是否具有SVGA模式。230 -mov ax,#0x5019 ! �����AX�з�������ֵĬ������ΪAL=25�С�AH=80�С�
+mov ax,#0x5019 ! 否则把AX中返回行列值默认设置为AL=25行、AH=80列。232 ret
-! �������VGA��ʾ���ϵ�ROM BIOSָ��λ�ô����������ݴ�����֧�ֵ��ر������жϻ�����
+! 下面根据VGA显示卡上的ROM BIOS指定位置处的特征数据串或者支持的特别功能来判断机器上
-! ��װ����ʲô���ӵ���ʾ����������֧��10����ʾ������չ���ܡ�ע�⣬��ʱ�����Ѿ��ڵ�
+! 安装的是什么牌子的显示卡。本程序共支持10种显示卡的扩展功能。注意,此时程序已经在第
-! 220�а�esָ��VGA����ROM BIOS���ڵĶ�0xc000���μ���2�£���
+! 220行把es指向VGA卡上ROM BIOS所在的段0xc000(参见第2章)。
-! �����ж��Dz���ATI��ʾ�������ǰ� ds:siָ��595����ATI��ʾ���������ݴ�������es:siָ
+! 首先判断是不是ATI显示卡。我们把 ds:si指向595行上ATI显示卡特征数据串,并把es:si指
-! ��VGA -BIOS��ָ��λ�ã�ƫ��0x31��������Ϊ������������9���ַ���"761295520"���������
+! 向VGA +BIOS中指定位置(偏移0x31)处。因为该特征串共有9个字符("761295520"),因此我
-! ��ѭ���Ƚ�����������������ͬ���ʾ�����е�VGA����ATI���ӵģ�������ds:siָ�����
+! 们循环比较这个特征串。如果相同则表示机器中的VGA卡是ATI牌子的,于是让ds:si指向该显
-! ʾ���������õ�����ģʽֵdscati����615�У�����diָ��ATI�������õ����и�����ģʽ��
+! 示卡可以设置的行列模式值dscati(第615行),让di指向ATI卡可设置的行列个数和模式,
-! ����ת�����selmod��438�У�����һ���������á�
+! 并跳转到标号selmod(438行)处进一步进行设置。
233 svga: lea si,idati ! Check ATI 'clues' -! ����ж� ATI��ʾ�������ݡ�
+! 检查判断 ATI显示卡的数据。234 mov di,#0x31 -! ��������0xc000:0x0031��ʼ��
+! 特征串从0xc000:0x0031开始。235 mov cx,#0x09 -! ��������9���ֽڡ�
+! 特征串有9个字节。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L238">238 jne noati - ! ����������ͬ���ʾ����ATI��ʾ������ת�������� + ! 若特征串不同则表示不是ATI显示卡。跳转继续检测卡。239 lea si,dscati -! ���9���ֽڶ���ͬ����ʾϵͳ����һ��ATI����ʾ����
+! 如果9个字节都相同,表示系统中有一块ATI牌显示卡。240 lea di,moati -! ����siָ��ATI�����еĿ�ѡ����ֵ��diָ���ѡ����
+! 于是si指向ATI卡具有的可选行列值,di指向可选个数241 lea cx,selmod -! ��ģʽ�б���Ȼ����ת��selmod��438�У�������������
+! 和模式列表,然后跳转到selmod(438行)处继续处理。-
! �������ж��Dz���Ahead���ӵ���ʾ����������EGA/VGA ͼ�������Ĵ���0x3ceд������ʵ�
+! 现在来判断是不是Ahead牌子的显示卡。首先向EGA/VGA 图形索引寄存器0x3ce写入想访问的
-! �������Ĵ���������0x0f��ͬʱ��0x3cf�˿ڣ���ʱ��Ӧ�������Ĵ�����д�뿪����չ�Ĵ���
+! 主允许寄存器索引号0x0f,同时向0x3cf端口(此时对应主允许寄存器)写入开启扩展寄存器
-! ��־ֵ0x20��Ȼ��ͨ��0x3cf�˿ڶ�ȡ�������Ĵ���ֵ���Լ���Ƿ�������ÿ�����չ�Ĵ���
+! 标志值0x20。然后通过0x3cf端口读取主允许寄存器值,以检查是否可以设置开启扩展寄存器
-! ��־�����������˵����Ahead���ӵ���ʾ����ע��word���ʱal���˿�n��ah���˿�n+1��
+! 标志。如果可以则说明是Ahead牌子的显示卡。注意word输出时alè端口n,ahè端口n+1。
244 mov dx,#0x3ce -! ���ݶ˿�ָ���������Ĵ�����0x0f��0x3ce�˿ڣ���
+! 数据端口指向主允许寄存器(0x0fè0x3ce端口),245 out dx,ax ! -�����ÿ�����չ�Ĵ�����־��0x20��0x3cf�˿ڣ���
+并设置开启扩展寄存器标志(0x20è0x3cf端口)。246 inc dx -! Ȼ���ٶ�ȡ�üĴ��������ñ�־�Ƿ������ϡ�
+! 然后再读取该寄存器,检查该标志是否被设置上。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L248">248 cmp al,#0x20 -! �����ȡֵ��0x20�����ʾ��Ahead A��ʾ���� +! 如果读取值是0x20,则表示是Ahead A显示卡。249 je isahed -! �����ȡֵ��0x21�����ʾ��Ahead B��ʾ����
+! 如果读取值是0x21,则表示是Ahead B显示卡。250 cmp al,#0x21 -! ����˵������Ahead��ʾ����������ת������������
+! 否则说明不是Ahead显示卡,于是跳转继续检测其余卡。252 isahed: lea -si,dscahead ! si ָ��Ahead��ʾ����ѡ����ֵ����diָ����չģʽ��
+si,dscahead ! si 指向Ahead显示卡可选行列值表,di指向扩展模式个253 -lea di,moahead ! ������չģʽ���б���Ȼ����ת��selmod��438�У�����
+lea di,moahead ! 数和扩展模式号列表。然后跳转到selmod(438行)处继254 lea cx,selmod -! ��������
+! 续处理。-
! ����������Dz���Chips & Tech��������ʾ����ͨ���˿�0x3c3��0x94��0x46e8������VGA����
+! 现在来检查是不是Chips & Tech生产的显示卡。通过端口0x3c3(0x94或0x46e8)设置VGA允许
-! �Ĵ����Ľ�������ģʽ��־��λ4����Ȼ��Ӷ˿�0x104��ȡ��ʾ��оƬ����ʶֵ������ñ�ʶֵ
+! 寄存器的进入设置模式标志(位4),然后从端口0x104读取显示卡芯片集标识值。如果该标识值
-! ��0xA5����˵����Chips & Tech��������ʾ����
+! 是0xA5,则说明是Chips & Tech生产的显示卡。
257 in al,dx -! ��0x3c3�˿ڶ�ȡVGA�����Ĵ���ֵ�������Ͻ�������ģʽ
+! 从0x3c3端口读取VGA允许寄存器值,添加上进入设置模式258 or al,#0x10 -! ��־��λ4������д�ء�
+! 标志(位4)后再写回。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L260">260 mov dx,#0x104 -! ������ģʽʱ��ȫ�ֱ�ʶ�˿�0x104��ȡ��ʾ��оƬ��ʶֵ�� +! 在设置模式时从全局标识端口0x104读取显示卡芯片标识值,261 in al,dx -! ����ʱ�����bl�Ĵ����С�
+! 并暂时存放在bl寄存器中。262 @@ -3678,7 +3678,7 @@ mov bl,al
263 -mov dx,#0x3c3 ! Ȼ���0x3c3�˿��еĽ�������ģʽ��־��λ��
+mov dx,#0x3c3 ! 然后把0x3c3端口中的进入设置模式标志复位。264 @@ -3694,29 +3694,29 @@ out dx,al
267 -cmp bl,[idcandt] ! �ٰ�bl�б�ʶֵ��λ��idcandt������596�У���再把bl中标识值与位于idcandt处(第596行)的Chips &
268 jne nocant -! Tech�ı�ʶֵ0xA5���Ƚϡ������ͬ����ת�Ƚ���һ���Կ���
+! Tech的标识值0xA5作比较。如果不同则跳转比较下一种显卡。269 -lea si,dsccandt ! ��siָ��������ʾ���Ŀ�ѡ����ֵ����diָ����չģʽ����
+lea si,dsccandt ! 让si指向这种显示卡的可选行列值表,di指向扩展模式个数270 -lea di,mocandt ! ����չģʽ���б���Ȼ����ת��selmod��438�У���������
+lea di,mocandt ! 和扩展模式号列表。然后跳转到selmod(438行)进行设置271 lea cx,selmod -! ��ʾģʽ�IJ�����
+! 显示模式的操作。272 @@ -3724,29 +3724,29 @@ jmp cx
-
! ���ڼ���Dz���Cirrus��ʾ����������ʹ��CRT������������0x1f�Ĵ��������������Խ�ֹ��չ
+! 现在检查是不是Cirrus显示卡。方法是使用CRT控制器索引号0x1f寄存器的内容来尝试禁止扩展
-! ���ܡ��üĴ�������Ϊӥ�꣨Eagle ID���Ĵ���������ֵ�ߵͰ��ֽڽ���һ�º�д��˿�0x3c4��
+! 功能。该寄存器被称为鹰标(Eagle ID)寄存器,将其值高低半字节交换一下后写入端口0x3c4索
-! ����6�ţ�����/��չ���Ĵ���Ӧ�û��ֹCirrus��ʾ������չ���ܡ����������˵������ ! 引的6号(定序/扩展)寄存器应该会禁止Cirrus显示卡的扩展功能。如果不会则说明不是Cirrus
-! ��ʾ������Ϊ�Ӷ˿�0x3d4������0x1fӥ��Ĵ����ж�ȡ��������ӥ��ֵ��0x0c�����Ŷ�Ӧ����
+! 显示卡。因为从端口0x3d4索引的0x1f鹰标寄存器中读取的内容是鹰标值与0x0c索引号对应的显
-! ����ʼ��ַ���ֽڼĴ�������������֮���ֵ������ڶ�0x1f������֮ǰ������Ҫ�Ȱ��Դ���ʼ
+! 存起始地址高字节寄存器内容异或操作之后的值,因此在读0x1f中内容之前我们需要先把显存起始
-! ���ֽڼĴ������ݱ�������㣬���ڼ���ָ�֮�����⣬��û�н�������Eagle IDֵд��0x3c4
+! 高字节寄存器内容保存后清零,并在检查后恢复之。另外,将没有交换过的Eagle ID值写到0x3c4
-! �˿�������6�Ŷ���/��չ�Ĵ��������¿�����չ���ܡ�
+! 端口索引的6号定序/扩展寄存器会重新开启扩展功能。
273 @@ -3755,22 +3755,22 @@ dx,#0x3d4 ! Check Cirrus 'clues'274 -mov al,#0x0c ! ������CRT���ƼĴ����������Ĵ����˿�0x3d4д��Ҫ����
+mov al,#0x0c ! 首先向CRT控制寄存器的索引寄存器端口0x3d4写入要访问275 out dx,al -! �ļĴ���������0x0c����Ӧ�Դ���ʼ��ַ���ֽڼĴ�������
+! 的寄存器索引号0x0c(对应显存起始地址高字节寄存器),276 inc dx -! Ȼ���0x3d5�˿ڶ����Դ���ʼ��ַ���ֽڲ��ݴ���bl�У�
+! 然后从0x3d5端口读入显存起始地址高字节并暂存在bl中,277 in al,dx -! �ٰ��Դ���ʼ��ַ���ֽڼĴ������㡣
+! 再把显存起始地址高字节寄存器清零。278 @@ -3787,12 +3787,12 @@ out dx,al
281 dec dx -! ������0x3d4�˿��������0x1f��ָ������Ҫ��0x3d5�˿�
+! 接着向0x3d4端口输出索引0x1f,指出我们要在0x3d5端口282 -mov al,#0x1f ! ���ʶ�ȡ��Eagle ID���Ĵ������ݡ�
+mov al,#0x1f ! 访问读取“Eagle ID”寄存器内容。283 @@ -3805,20 +3805,20 @@ inc dx
285 in al,dx -! ��0x3d5�˿ڶ�ȡ��Eagle ID���Ĵ���ֵ�����ݴ���bh�С�
+! 从0x3d5端口读取“Eagle ID”寄存器值,并暂存在bh中。286 mov bh,al -! Ȼ��Ѹ�ֵ�ߵ�4���ػ���λ�ô�ŵ�cl�С�������8λ
+! 然后把该值高低4比特互换位置存放到cl中。再左移8位287 xor ah,ah -! �����ch�У���cl�з�����ֵ6��
+! 后放入ch中,而cl中放入数值6。288 @@ -3847,24 +3847,24 @@ shl cx,#8
294 add cx,#6 -! ����cxֵ�����ax�С���ʱah���ǻ�λ��ġ�Eagle
+! 最后把cx值存放入ax中。此时ah中是换位后的“Eagle295 mov ax,cx ! -ID��ֵ��al����������6����Ӧ����/��չ�Ĵ�������ah
+ID”值,al中是索引号6,对应定序/扩展寄存器。把ah296 -mov dx,#0x3c4 ! д��0x3c4�˿������Ķ���/��չ�Ĵ���Ӧ�ûᵼ��Cirrus
+mov dx,#0x3c4 ! 写到0x3c4端口索引的定序/扩展寄存器应该会导致Cirrus297 out dx,ax ! -��ʾ����ֹ��չ���ܡ�
+显示卡禁止扩展功能。298 @@ -3873,12 +3873,12 @@ inc dx
299 in al,dx -! �����չ������ı���ֹ����ô��ʱ�����ֵӦ��Ϊ0��
+! 如果扩展功能真的被禁止,那么此时读入的值应该为0。300 and al,al -! �����Ϊ0���ʾ����Cirrus��ʾ������ת���������������
+! 如果不为0则表示不是Cirrus显示卡,跳转继续检查其他卡。301 @@ -3887,18 +3887,18 @@ jnz nocirr
302 mov al,bh -! ��Cirrus��ʾ���������õ�286�б�����bh�еġ�Eagle
+! 是Cirrus显示卡,则利用第286行保存在bh中的“Eagle303 out dx,al -! ID��ԭֵ�����¿���Cirrus����չ���ܡ���ʱ��ȡ�ķ���
+! ID”原值再重新开启Cirrus卡扩展功能。此时读取的返回304 in al,dx -! ֵӦ��Ϊ1�������ǣ�����Ȼ˵������Cirrus��ʾ����
+! 值应该为1。若不是,则仍然说明不是Cirrus显示卡。305 @@ -3911,17 +3911,17 @@ jne nocirr
307 call rst3d4 ! -�ָ�CRT����������ʾ��ʼ��ַ���ֽڼĴ������ݡ�
+恢复CRT控制器的显示起始地址高字节寄存器内容。308 -lea si,dsccirrus ! siָ��Cirrus��ʾ���Ŀ�ѡ����ֵ��diָ����չģʽ����
+lea si,dsccirrus ! si指向Cirrus显示卡的可选行列值,di指向扩展模式个数309 -lea di,mocirrus ! �Ͷ�Ӧģʽ�š�Ȼ����ת��selmod��ȥѡ����ʾģʽ��
+lea di,mocirrus ! 和对应模式号。然后跳转到selmod处去选择显示模式。310 @@ -3931,8 +3931,8 @@ lea cx,selmod
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L311">311 jmp cx -! ���ӳ������ñ�����bl�е�ֵ����278�У��ָ�CRT����������ʾ��ʼ��ַ���ֽڼĴ������ݡ�
+! 该子程序利用保存在bl中的值(第278行)恢复CRT控制器的显示起始地址高字节寄存器内容。
312 @@ -3957,10 +3957,10 @@ add ax,#0x0c
317 out dx,ax -! ע�⣬����word������� al ��0x3d4��ah ��0x3d5��
+! 注意,这是word输出!! al è0x3d4,ah è0x3d5。318 @@ -3968,37 +3968,37 @@ ret
-
! ���ڼ��ϵͳ���Dz���Everex��ʾ���������������ж�int 0x10����0x70��ax =0x7000��
+! 现在检查系统中是不是Everex显示卡。方法是利用中断int 0x10功能0x70(ax =0x7000,
-! bx=0x0000������Everex����չ��ƵBIOS���ܡ�����Everes������ʾ�������жϵ���Ӧ��
+! bx=0x0000)调用Everex的扩展视频BIOS功能。对于Everes类型显示卡,该中断调用应该
-! �᷵��ģ��״̬���������·�����Ϣ��
+! 会返回模拟状态,即有以下返回信息:
-! al = 0x70�����ǻ���Trident��Everex��ʾ����
+! al = 0x70,若是基于Trident的Everex显示卡;
-! cl = ��ʾ�����ͣ�00-��ɫ��01-CGA��02-EGA��03-���ֶ�Ƶ��04-PS/2��05-IBM -8514��06-SVGA��
+! cl = 显示器类型:00-单色;01-CGA;02-EGA;03-数字多频;04-PS/2;05-IBM +8514;06-SVGA。
-! ch = ���ԣ�λ7-6��00-256K��01-512K��10-1MB��11-2MB��λ4-����VGA������λ0-6845ģ�⡣
+! ch = 属性:位7-6:00-256K,01-512K,10-1MB,11-2MB;位4-开启VGA保护;位0-6845模拟。
-! dx = �忨�ͺţ�λ15-4�������ͱ�ʶ�ţ�λ3-0����������ʶ�š�
+! dx = 板卡型号:位15-4:板类型标识号;位3-0:板修正标识号。
! -0x2360-Ultragraphics II��0x6200-Vision VGA��0x6730-EVGA��0x6780-Viewpoint��
+0x2360-Ultragraphics II;0x6200-Vision VGA;0x6730-EVGA;0x6780-Viewpoint。 -! di = ��BCD���ʾ����ƵBIOS�汾�š�
+! di = 用BCD码表示的视频BIOS版本号。
319 @@ -4008,8 +4008,8 @@ Everex 'clues'
320 -mov ax,#0x7000 ! ����ax = 0x7000, bx=0x0000������int 0x10��
+mov ax,#0x7000 ! 设置ax = 0x7000, bx=0x0000,调用int 0x10。321 @@ -4022,8 +4022,8 @@ int 0x10
323 cmp al,#0x70 -! ����Everes��ʾ����al��Ӧ�÷���ֵ0x70��
+! 对于Everes显示卡,al中应该返回值0x70。324 @@ -4032,12 +4032,12 @@ jne noevrx
325 shr dx,#4 -! ���ɰ������ţ�λ3-0����
+! 忽律板修正号(位3-0)。326 cmp dx,#0x678 -! �����ͺ���0x678��ʾ��һ��Trident��ʾ��������ת��
+! 板类型号是0x678表示是一块Trident显示卡,则跳转。327 @@ -4046,7 +4046,7 @@ je istrid
328 cmp dx,#0x236 -! �����ͺ���0x236��ʾ��һ��Trident��ʾ��������ת��
+! 板类型号是0x236表示是一块Trident显示卡,则跳转。329 @@ -4054,19 +4054,19 @@ je istrid
330 -lea si,dsceverex ! ��siָ��Everex��ʾ���Ŀ�ѡ����ֵ������diָ����չ
+lea si,dsceverex ! 让si指向Everex显示卡的可选行列值表,让di指向扩展331 -lea di,moeverex ! ģʽ������ģʽ���б���Ȼ����ת��selmodȥִ��ѡ��
+lea di,moeverex ! 模式个数和模式号列表。然后跳转到selmod去执行选择332 lea cx,selmod ! -��ʾģʽ�IJ�����
+显示模式的操作。333 @@ -4075,8 +4075,8 @@ jmp cx
334 istrid: lea cx,ev2tri -! ��Trident���͵�Everex��ʾ��������ת��ev2tri������
+! 是Trident类型的Everex显示卡,则跳转到ev2tri处理。335 @@ -4084,13 +4084,13 @@ jmp cx
-
! ���ڼ���Dz���Genoa��ʾ������ʽ�Ǽ������ƵBIOS�е��������ִ���0x77��0x00��0x66��
+! 现在检查是不是Genoa显示卡。方式是检查其视频BIOS中的特征数字串(0x77、0x00、0x66、
-! 0x99����ע�⣬��ʱes�Ѿ��ڵ�220�б����ó�ָ��VGA����ROM BIOS���ڵĶ�0xc000��
+! 0x99)。注意,此时es已经在第220行被设置成指向VGA卡上ROM BIOS所在的段0xc000。
336 @@ -4100,7 +4100,7 @@ si,idgenoa ! Check Genoa 'clues'
337 xor ax,ax -! ��ds:siָ���597���ϵ��������ִ���
+! 让ds:si指向第597行上的特征数字串。338 @@ -4109,13 +4109,13 @@ seg es
339 mov al,[0x37] -! ȡVGA����BIOS��0x37����ָ�루��ָ������������
+! 取VGA卡上BIOS中0x37处的指针(它指向特征串)。340 mov di,ax -! ��˴�ʱes:diָ���������ִ���ʼ����
+! 因此此时es:di指向特征数字串开始处。341 @@ -4132,7 +4132,7 @@ dec di
344 l1: inc si -! Ȼ��ѭ���Ƚ���4���ֽڵ��������ִ���
+! 然后循环比较这4个字节的特征数字串。345 @@ -4161,28 +4161,28 @@ loope l1
351 cmp cx,#0x00 -! ����������ִ���ȫ��ͬ�����ʾ��Genoa��ʾ����
+! 如果特征数字串完全相同,则表示是Genoa显示卡,352 jne nogen - ! ������תȥ����������͵���ʾ����
+ ! 否则跳转去检查其他类型的显示卡。353 -lea si,dscgenoa ! ��siָ��Genoa��ʾ���Ŀ�ѡ����ֵ������diָ����չ
+lea si,dscgenoa ! 让si指向Genoa显示卡的可选行列值表,让di指向扩展354 lea di,mogenoa -! ģʽ������ģʽ���б���Ȼ����ת��selmodȥִ��ѡ��
+! 模式个数和模式号列表。然后跳转到selmod去执行选择355 lea cx,selmod -! ��ʾģʽ�IJ�����
+! 显示模式的操作。356 @@ -4190,9 +4190,9 @@ jmp cx
-
! ���ڼ���Dz���Paradise��ʾ����ͬ���Dz��ñȽ���ʾ����BIOS������������VGA=�����ķ�ʽ��
+! 现在检查是不是Paradise显示卡。同样是采用比较显示卡上BIOS中特征串(“VGA=”)的方式。
357 @@ -4202,12 +4202,12 @@ Check Paradise 'clues'
358 mov di,#0x7d -! es:diָ��VGA ROM BIOS��0xc000:0x007d�����ô�Ӧ����
+! es:di指向VGA ROM BIOS的0xc000:0x007d处,该处应该有359 mov cx,#0x04 -! 4���ַ���VGA=����
+! 4个字符“VGA=”。360 @@ -4220,23 +4220,23 @@ cmpsb
362 jne nopara -! ���в�ͬ���ַ�����ʾ����Paradise��ʾ����������ת��
+! 若有不同的字符,表示不是Paradise显示卡,于是跳转。363 lea si,dscparadise ! -������siָ��Paradise��ʾ���Ŀ�ѡ����ֵ������diָ
+否则让si指向Paradise显示卡的可选行列值表,让di指364 -lea di,moparadise ! ����չģʽ������ģʽ���б���Ȼ����ת��selmod��ȥѡ
+lea di,moparadise ! 向扩展模式个数和模式号列表。然后跳转到selmod处去选365 lea cx,selmod ! -����Ҫʹ�õ���ʾģʽ��
+择想要使用的显示模式。366 @@ -4244,17 +4244,17 @@ jmp cx
-
! ���ڼ���Dz���Trident��TVGA����ʾ����TVGA��ʾ�������ģʽ���ƼĴ���1��0x3c4�˿�����
+! 现在检查是不是Trident(TVGA)显示卡。TVGA显示卡扩充的模式控制寄存器1(0x3c4端口索引
-! ��0x0e����λ3--0��64K�ڴ�ҳ�����ֵ������ֶ�ֵ��һ�����ԣ���д��ʱ��������Ҫ���Ȱ�
+! 的0x0e)的位3--0是64K内存页面个数值。这个字段值有一个特性:当写入时,我们需要首先把
-! ֵ��0x02��������������д�룻����ȡ��ֵʱ����Ҫִ���������������ǰ��ֵӦ����д
+! 值与0x02进行异或操作后再写入;当读取该值时则不需要执行异或操作,即异或前的值应该与写
-! ����ٶ�ȡ��ֵ��ͬ���������������������������Dz���Trident��ʾ����
+! 入后再读取的值相同。下面代码就利用这个特性来检查是不是Trident显示卡。
367
@@ -4263,13 +4263,13 @@ nopara: mov dx,#0x3c4  
368
mov al,#0x0e
-! �����ڶ˿�0x3c4���������0x0e������ģʽ���ƼĴ���1��
369 out dx,al -! Ȼ���0x3c5���ݶ˿ڶ���üĴ���ԭֵ�����ݴ���ah�С�
+! 然后从0x3c5数据端口读入该寄存器原值,并暂存在ah中。370 @@ -4286,40 +4286,40 @@ xchg ah,al
373 mov al,#0x00 -! Ȼ��������üĴ���д��0x00���ٶ�ȡ��ֵ��al��
+! 然后我们向该寄存器写入0x00,再读取其值èal。374 out dx,al ! -д��0x00���൱�ڡ�ԭֵ��0x02���0x02���д��ֵ��
+写入0x00就相当于“原值”0x02异或0x02后的写入值,375 in al,dx -! �������Trident��ʾ������˺�����ֵӦ����0x02��
+! 因此若是Trident显示卡,则此后读入的值应该是0x02。376 xchg al,ah -! ������al=ԭģʽ���ƼĴ���1��ֵ��ah=����ȡ��ֵ��
+! 交换后,al=原模式控制寄存器1的值,ah=最后读取的值。 -! �����������Ӣ��ע���ǡ������...���в�û��Ҫ��������������������ҵ�Trident��ʾ��
+! 下面语句右则英文注释是“真奇怪...书中并没有要求这样操作,但是这对我的Trident显示卡
-! �����á����������������Ļ�ͻ��ģ��...�����⼸�и�����Ӣ��ע�͵����ִ�����²�����
+! 起作用。如果不这样做,屏幕就会变模糊...”。这几行附带有英文注释的语句执行如下操作:
-! ���bl��ԭģʽ���ƼĴ���1��λ1����λ״̬�Ļ��ͽ��临λ������ͽ�λ1��λ��
+! 如果bl中原模式控制寄存器1的位1在置位状态的话就将其复位,否则就将位1置位。
-! ʵ�����⼸�������Ƕ�ԭģʽ���ƼĴ���1��ִֵ����� 0x02�IJ�����Ȼ���ý��ֵȥ����
+! 实际上这几条语句就是对原模式控制寄存器1的值执行异或 0x02的操作,然后用结果值去设置
-! ���ָ���ԭ�Ĵ���ֵ��
+! (恢复)原寄存器值。
377 @@ -4359,12 +4359,12 @@ clrb2: out dx,al
384 -and ah,#0x0f ! ȡ375��������ֵ��ҳ������ֶΣ�λ3--0�������
+and ah,#0x0f ! 取375行最后读入值的页面个数字段(位3--0),如果385 cmp ah,#0x02 ! -���ֶ�ֵ����0x02�����ʾ��Trident��ʾ����
+该字段值等于0x02,则表示是Trident显示卡。386 @@ -4372,18 +4372,18 @@ jne notrid
387 -ev2tri: lea si,dsctrident ! ��Trident��ʾ����������siָ�����ʾ���Ŀ�ѡ����
+ev2tri: lea si,dsctrident ! 是Trident显示卡,于是让si指向该显示卡的可选行列388 -lea di,motrident ! ֵ�б�����diָ���Ӧ��չģʽ������ģʽ���б���Ȼ
+lea di,motrident ! 值列表,让di指向对应扩展模式个数和模式号列表,然389 lea cx,selmod -! ����ת��selmodȥִ��ģʽѡ�������
+! 后跳转到selmod去执行模式选择操作。390 @@ -4391,22 +4391,22 @@ jmp cx
-
! ���ڼ���Dz���Tseng��ʾ����ET4000AX��ET4000/W32�ࣩ�������Ƕ�0x3cd�˿ڶ�Ӧ�Ķ�
+! 现在检查是不是Tseng显示卡(ET4000AX或ET4000/W32类)。方法是对0x3cd端口对应的段
-! ѡ��Segment -Select���Ĵ���ִ�ж�д�������üĴ�����4λ��λ7--4����Ҫ���ж�������
+! 选择(Segment +Select)寄存器执行读写操作。该寄存器高4位(位7--4)是要进行读操作的
-! 64KB�κţ�Bank number������4λ��λ3--0����ָ��Ҫд�Ķκš����ָ����ѡ��Ĵ�����
+! 64KB段号(Bank number),低4位(位3--0)是指定要写的段号。如果指定段选择寄存器的
-! ��ֵ�� -0x55����ʾ����д��6��64KB�Σ�����ô����Tseng��ʾ����˵���Ѹ�ֵд��Ĵ���
+! 的值是 +0x55(表示读、写第6个64KB段),那么对于Tseng显示卡来说,把该值写入寄存器
-! ���ٶ���Ӧ�û���0x55��
+! 后再读出应该还是0x55。
391 @@ -4422,12 +4422,12 @@ things be this simple ! :-)
393 mov bl,al -! �ȴ�0x3cd�˿ڶ�ȡ��ѡ��Ĵ���ԭֵ����������bl�С�
+! 先从0x3cd端口读取段选择寄存器原值,并保存在bl中。394 mov al,#0x55 -! Ȼ��������üĴ�����д��0x55���ٶ��벢����ah�С�
+! 然后我们向该寄存器中写入0x55。再读入并放在ah中。395 @@ -4444,7 +4444,7 @@ mov ah,al
398 mov al,bl -! ���Żָ��üĴ�����ԭֵ��
+! 接着恢复该寄存器的原值。399 @@ -4453,7 +4453,7 @@ out dx,al
400 cmp ah,#0x55 -! �����ȡ�ľ�������д���ֵ���������Tseng��ʾ����
+! 如果读取的就是我们写入的值,则表明是Tseng显示卡。401 @@ -4461,19 +4461,19 @@ jne notsen
402 -lea si,dsctseng ! ������siָ��Tseng��ʾ���Ŀ�ѡ����ֵ���б�����于是让si指向Tseng显示卡的可选行列值的列表,让di
403 -lea di,motseng ! ָ���Ӧ��չģʽ������ģʽ���б���Ȼ����ת��指向对应扩展模式个数和模式号列表,然后跳转到selmod
404 lea cx,selmod ! -ȥִ��ģʽѡ�������
+去执行模式选择操作。-
! �������Dz���Video7��ʾ�����˿�0x3c2�ǻ������Ĵ���д�˿ڣ���0x3cc�ǻ������Ĵ�
+! 下面检查是不是Video7显示卡。端口0x3c2是混合输出寄存器写端口,而0x3cc是混合输出寄存
-! �����˿ڡ��üĴ�����λ0�ǵ�ɫ/��ɫ��־�����Ϊ0���ʾ�ǵ�ɫ�������Dz�ɫ���ж��Dz���
+! 器读端口。该寄存器的位0是单色/彩色标志。如果为0则表示是单色,否则是彩色。判断是不是
-! Video7��ʾ���ķ�ʽ������������ʾ����CRT������չ��ʶ�Ĵ�������������0x1f�����üĴ���
+! Video7显示卡的方式是利用这种显示卡的CRT控制扩展标识寄存器(索引号是0x1f)。该寄存器
-! ��ֵʵ���Ͼ����Դ���ʼ��ַ���ֽڼĴ�����������0x0c�������ݺ�0xea�������������ֵ��
+! 的值实际上就是显存起始地址高字节寄存器(索引号0x0c)的内容和0xea进行异或操作后的值。
-! �������ֻҪ���Դ���ʼ��ַ���ֽڼĴ�����д��һ���ض�ֵ��Ȼ��ӱ�ʶ�Ĵ����ж�ȡ��ʶֵ
+! 因此我们只要向显存起始地址高字节寄存器中写入一个特定值,然后从标识寄存器中读取标识值
-! �����жϼ��ɡ�
+! 进行判断即可。
-! ͨ����������ʾ��������Video7��ʾ���ļ����������ǿ�֪������ͨ����Ϊ�����������衣
+! 通过对以上显示卡和这里Video7显示卡的检查分析,我们可知检查过程通常分为三个基本步骤。
-! ���ȶ�ȡ�����������Ҫ�õ��ļĴ���ԭֵ��Ȼ��ʹ���ض�����ֵ����д��Ͷ�������������
+! 首先读取并保存测试需要用到的寄存器原值,然后使用特定测试值进行写入和读出操作,最后恢
-! ��ԭ�Ĵ���ֵ���Լ���������жϡ�
+! 复原寄存器值并对检查结果作出判断。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L408">408 mov dx,#0x3b4 ! -������dxΪ��ɫ��ʾCRT���������Ĵ����˿ں�0x3b4�� +先设置dx为单色显示CRT控制索引寄存器端口号0x3b4。409 and -al,#0x01 ! ����������Ĵ�����λ0����0����ɫ����ֱ����ת��
+al,#0x01 ! 如果混合输出寄存器的位0等于0(单色)则直接跳转,410 jz even7 -! ����dx����Ϊ��ɫ��ʾCRT���������Ĵ����˿ں�0x3d4��
+! 否则dx设置为彩色显示CRT控制索引寄存器端口号0x3d4。412 even7: -mov al,#0x0c ! ���üĴ���������Ϊ0x0c����Ӧ�Դ���ʼ��ַ���ֽڼĴ�����
+mov al,#0x0c ! 设置寄存器索引号为0x0c,对应显存起始地址高字节寄存器。415 in -al,dx ! ��ȡ��ʾ�ڴ���ʼ��ַ���ֽڼĴ������ݣ���������bl�С�
+al,dx ! 读取显示内存起始地址高字节寄存器内容,并保存在bl中。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L417">417 mov al,#0x55 -! Ȼ�����Դ���ʼ��ַ���ֽڼĴ�����д��ֵ0x55���ٶ�ȡ������ +! 然后在显存起始地址高字节寄存器中写入值0x55,再读取出来。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L420">420 dec dx -! Ȼ��ͨ��CRTC�����Ĵ����˿�0x3b4��0x3d4ѡ���������� +! 然后通过CRTC索引寄存器端口0x3b4或0x3d4选择索引号是421 -mov al,#0x1f ! 0x1f��Video7��ʾ����ʶ�Ĵ������üĴ�������ʵ���Ͼ���
+mov al,#0x1f ! 0x1f的Video7显示卡标识寄存器。该寄存器内容实际上就是422 out dx,al -! �Դ���ʼ��ַ���ֽں�0xea������������Ľ��ֵ��
+! 显存起始地址高字节和0xea进行异或操作后的结果值。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L424">424 in al,dx -! ��ȡVideo7��ʾ����ʶ�Ĵ���ֵ����������bh�С� +! 读取Video7显示卡标识寄存器值,并保存在bh中。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L426">426 dec dx -! Ȼ����ѡ���Դ���ʼ��ַ���ֽڼĴ������ָ���ԭֵ�� +! 然后再选择显存起始地址高字节寄存器,恢复其原值。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L432">432 mov al,#0x55 -! �����������֤��Video7��ʾ����ʶ�Ĵ���ֵ�����Դ���ʼ +! 随后我们来验证“Video7显示卡标识寄存器值就是显存起始433 xor al,#0xea -! ��ַ���ֽں�0xea������������Ľ��ֵ�������地址高字节和0xea进行异或操作后的结果值”。因此0x55
434 cmp al,bh -! ��0xea�����������Ľ����Ӧ�õ��ڱ�ʶ�Ĵ����IJ���ֵ��
+! 和0xea进行异或操作的结果就应该等于标识寄存器的测试值。435 jne novid7 -! ������Video7��ʾ����������Ĭ����ʾ����ֵ��492�У���
+! 若不是Video7显示卡,则设置默认显示行列值(492行)。436 -lea si,dscvideo7 ! ��Video7��ʾ����������siָ�����ʾ������ֵ������是Video7显示卡,于是让si指向该显示卡行列值表,让di
437 -lea di,movideo7 ! ָ����չģʽ������ģʽ���б���
+lea di,movideo7 ! 指向扩展模式个数和模式号列表。-
! ����������������жϳ�����ʾ�������Լ�ȡ�õ������չģʽ��Ϣ��siָ�������ֵ�б���di
+! 下面根据上述代码判断出的显示卡类型以及取得的相关扩展模式信息(si指向的行列值列表;di
-! ָ����չģʽ������ģʽ���б�������ʾ�û�ѡ����õ���ʾģʽ�������ó���Ӧ��ʾģʽ�����
+! 指向扩展模式个数和模式号列表),提示用户选择可用的显示模式,并设置成相应显示模式。最后
-! �ӳ���ϵͳ��ǰ���õ���Ļ����ֵ��ah = ������al=�����������磬���ϵͳ����ATI��ʾ����
+! 子程序返回系统当前设置的屏幕行列值(ah = 列数;al=行数)。例如,如果系统中是ATI显示卡,
-! ��ô��Ļ�ϻ���ʾ������Ϣ��
+! 那么屏幕上会显示以下信息:
! Mode: COLSxROWS:
@@ -4713,8 +4713,8 @@ corresponding number.!
-! ��γ�����������Ļ����ʾNULL��β���ַ�����Ϣ��Mode: COLSxROWS:����
+! 这段程序首先在屏幕上显示NULL结尾的字符串信息“Mode: COLSxROWS:”。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L442">442 mov cl,(di) -! ��ʱcl���Ǽ�������ʾ������չģʽ������ +! 此时cl中是检查出的显示卡的扩展模式个数。445 push cx
-! Ȼ����ÿһ������ʾ����ǰ��ʾ����ѡ�����չģʽ����ֵ�����û�ѡ�á�
+! 然后并在每一行上显示出当前显示卡可选择的扩展模式行列值,供用户选用。
446 tbl: pop bx -! bx = ��ʾ������չģʽ�ܸ�����
+! bx = 显示卡的扩展模式总个数。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L450">450 call dprnt -! ��ʮ���Ƹ�ʽ��ʾal�е�ֵ�� +! 以十进制格式显示al中的值。451 call spcing -! ��ʾһ�����ٿ�4���ո�
+! 显示一个点再空4个空格。452 lodsw -! ��ax�м���siָ�������ֵ�����siָ����һ��wordֵ��
+! 在ax中加载si指向的行列值,随后si指向下一个word值。453 xchg al,ah -! ����λ�ú�al = ������
+! 交换位置后al = 列数。454 call dprnt - ! ��ʾ������
+ ! 显示列数;455 xchg ah,al -! ��ʱal��������ֵ��
+! 此时al中是行数值。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L457">457 mov al,#0x78 -! ��ʾһ��С��x�������˺š� +! 显示一个小“x”,即乘号。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L459">459 pop ax - ! ��ʱal��������ֵ�� + ! 此时al中是行数值。460 call dprnt -! ��ʾ������
+! 显示行数。461 call docr -! �س����С�
+! 回车换行。462 loop tbl -! ����ʾ��һ������ֵ��cx����չģʽ����ֵ�ݼ�1��
+! 再显示下一个行列值。cx中扩展模式计数值递减1。 -! ����չģʽ����ֵ����ʾ֮����ʾ��Choose mode by pressing the corresponding number.����
+! 在扩展模式行列值都显示之后,显示“Choose mode by pressing the corresponding number.”,
-! Ȼ��Ӽ��̿ڶ�ȡ�û�������ɨ���룬���ݸ�ɨ����ȷ���û�ѡ�������ֵģʽ�ţ������� ! 然后从键盘口读取用户按键的扫描码,根据该扫描码确定用户选择的行列值模式号,并利用ROM
-! BIOS����ʾ�ж�int 0x10����0x00��������Ӧ����ʾģʽ��
+! BIOS的显示中断int 0x10功能0x00来设置相应的显示模式。
-! ��468�е���ģʽ����ֵ+0x80�����������ּ�-1���ɿ�ɨ���롣����0--9���ּ������ǵ��ɿ�
+! 第468行的“模式个数值+0x80”是所按数字键-1的松开扫描码。对于0--9数字键,它们的松开
-! ɨ����ֱ��ǣ�0 - 0x8B��1 - 0x82��2 -- 0x83��3 - 0x84��4 - 0x85��
+! 扫描码分别是:0 - 0x8B;1 - 0x82;2 +- 0x83;3 - 0x84;4 - 0x85;
! -5 - 0x86��6 - 0x87��7 - 0x88��8 - 0x89��9 - 0x8A��
+5 - 0x86;6 - 0x87;7 - 0x88;8 - 0x89;9 - 0x8A。 -! ��ˣ������ȡ�ļ����ɿ�ɨ����С��0x82�ͱ�ʾ�������ּ������ɨ�������0x8B���ʾ�û�
+! 因此,如果读取的键盘松开扫描码小于0x82就表示不是数字键;如果扫描码等于0x8B则表示用户
-! ��������0����
+! 按下数字0键。
463 pop cx -! cl������ʾ����չģʽ�ܸ���ֵ��
+! cl中是显示卡扩展模式总个数值。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L465">465 lea si,msg3 -! ��ʾ���밴��Ӧ���ּ���ѡ��ģʽ���� +! 显示“请按相应数字键来选择模式。” href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L467">467 pop si -! ����ԭ����ֵָ�루ָ����ʾ������ֵ����ʼ������ +! 弹出原行列值指针(指向显示卡行列值表开始处)。468 add cl,#0x80 -! cl + 0x80 = ��Ӧ�����ּ�-1�����ɿ�ɨ���롣
+! cl + 0x80 = 对应“数字键-1”的松开扫描码。470 cmp al,#0x82 -! �������ɿ�ɨ����С��0x82���ʾ�������ּ������ɸü���
+! 若键盘松开扫描码小于0x82则表示不是数字键,忽律该键。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L472">472 cmp al,#0x8b ! -�������ɿ�ɨ�������0x8b����ʾ���������ּ�0�� +若键盘松开扫描码等于0x8b,表示按下了数字键0。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L474">474 cmp al,cl - ! ��ɨ���������չģʽ����ֵ��Ӧ�����ɨ����ֵ����ʾ + ! 若扫描码大于扩展模式个数值对应的最大扫描码值,表示475 ja nonum -! �����ֵ������Χ�������ּ����ɿ�ɨ���롣�����ʾ
+! 键入的值超过范围或不是数字键的松开扫描码。否则表示476 jmp nozero -! �û����²��ɿ���һ����0���ְ�����
+! 用户按下并松开了一个非0数字按键。 -! ������ɿ�ɨ����ת���ɶ�Ӧ�����ְ���ֵ��Ȼ�����ø�ֵ��ģʽ������ģʽ���б���ѡ���Ӧ��
+! 下面把松开扫描码转换成对应的数字按键值,然后利用该值从模式个数和模式号列表中选择对应的
-! ��ģʽ�š����ŵ��û���ROM BIOS�ж�int 0x10����0����Ļ���ó�ģʽ��ָ����ģʽ�������
+! 的模式号。接着调用机器ROM BIOS中断int 0x10功能0把屏幕设置成模式号指定的模式。最后再
-! ����ģʽ�Ŵ���ʾ������ֵ����ѡ����ax�з��ض�Ӧ������ֵ��
+! 利用模式号从显示卡行列值表中选择并在ax中返回对应的行列值。
477 zero: -sub al,#0x0a ! al = 0x8b - 0x0a = 0x81��
+sub al,#0x0a ! al = 0x8b - 0x0a = 0x81。478 nozero: sub -al,#0x80 ! �ټ�ȥ0x80�Ϳ��Եõ��û�ѡ���˵ڼ���ģʽ��
+al,#0x80 ! 再减去0x80就可以得到用户选择了第几个模式。479 dec al -! ��0�������
+! 从0起计数。480 xor ah,ah -! int 0x10��ʾ���ܺ�=0��������ʾģʽ����
+! int 0x10显示功能号=0(设置显示模式)。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L482">482 inc di -! diָ���Ӧ��ģʽ�ţ�������1��ģʽ�����ֽ�ֵ���� +! di指向对应的模式号(跳过第1个模式个数字节值)。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L484">484 mov al,(di) -! ȡģʽ����al�У�������ϵͳBIOS��ʾ�жϹ���0�� +! 取模式号èal中,并调用系统BIOS显示中断功能0。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L487">487 shl ax,#1 -! ģʽ�ų�2��ת����Ϊ����ֵ���ж�Ӧֵ��ָ�롣 +! 模式号乘2,转换成为行列值表中对应值的指针。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L489">489 lodsw -! ȡ��Ӧ����ֵ��ax�У�ah = ������al = �������� +! 取对应行列值到ax中(ah = 列数,al = 行数)。490 pop ds -! �ָ���216�б����dsԭֵ����ax�з��ص�ǰ��ʾ����ֵ��
+! 恢复第216行保存的ds原值。在ax中返回当前显示行列值。-
! �����������������ʾ������ô����ֻ�ò���Ĭ�ϵ�80 x 25 �ı�����ֵ��
+! 若都不是上面检测的显示卡,那么我们只好采用默认的80 x 25 的标准行列值。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L496">496 ! Routine that 'tabs' to next col. -! ����ƶ�����һ�Ʊ�λ���ӳ���
+! 光标移动到下一制表位的子程序。
-! ��ʾһ�����ַ�'.'��4���ո�
+! 显示一个点字符'.'和4个空格。
498 spcing: mov -al,#0x2e ! ��ʾһ�����ַ�'.'��
+al,#0x2e ! 显示一个点字符'.'。510 ! Routine to print asciiz-string at DS:SI
-! ��ʾλ��DS:SI����NULL��0x00����β���ַ�����
+! 显示位于DS:SI处以NULL(0x00)结尾的字符串。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L515">515 call prnt1 -! ��ʾal�е�һ���ַ��� +! 显示al中的一个字符。 href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L520">520 ! printed is put in al (i.e 0-255). -! ��ʾʮ�������ֵ��ӳ�����ʾֵ���ڼĴ���al�У�0--255����
+! 显示十进制数字的子程序。显示值放在寄存器al中(0--255)。
540 ! Part of above routine, this one just prints ascii al
-! �����ӳ����һ���֡���ʾal�е�һ���ַ���
+! 上面子程序的一部分。显示al中的一个字符。
-! ���ӳ���ʹ���ж�0x10��0x0E���ܣ��Ե紫��ʽ����Ļ��дһ���ַ��������Զ��Ƶ���һ��
+! 该子程序使用中断0x10的0x0E功能,以电传方式在屏幕上写一个字符。光标会自动移到下一个
-! λ�ô������д��һ�й��ͻ��ƶ�����һ�п�ʼ��������Ѿ�д��һ�����һ�У���������Ļ
+! 位置处。如果写完一行光标就会移动到下一行开始处。如果已经写完一屏最后一行,则整个屏幕
-! �����Ϲ���һ�С��ַ�0x07��BEL����0x08��BS����0x0A(LF)��0x0D��CR������Ϊ�������ʾ��
+! 会向上滚动一行。字符0x07(BEL)、0x08(BS)、0x0A(LF)和0x0D(CR)被作为命令不会显示。
-! ���룺AL --- ��д�ַ���BH -- ��ʾҳ�ţ�BL -- ǰ����ʾɫ��ͼ�η�ʽʱ����
+! 输入:AL +-- 欲写字符;BH -- 显示页号;BL -- 前景显示色(图形方式时)。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L544">544 mov bh,#0x00 -! ��ʾҳ�档 +! 显示页面。552 ! Prints <CR> + <LF> -! ��ʾ�س�+���С�
+! 显示回车+换行。 -! ȫ������������ʼ�������������ɶ��8�ֽڳ�������������ɡ����������3���������
+! 全局描述符表开始处。描述符表由多个8字节长的描述符项组成。这里给出了3个描述符项。
-! ��1�����ã�568�У���������ڡ���2����ϵͳ�������������570-573�У�����3����ϵ
+! 第1项无用(568行),但须存在。第2项是系统代码段描述符(570-573行),第3项是系
-! ͳ���ݶ�������(575-578��)��
+! 统数据段描述符(575-578行)。
567 gdt:
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L568">568 .word 0,0,0,0 ! -dummy ! ��1�������������á� +dummy ! 第1个描述符,不用。 -! ��GDT���������ƫ������0x08�������ں˴����ѡ�����ֵ��
+! 在GDT表中这里的偏移量是0x08。它是内核代码段选择符的值。
570 .word 0x07FF -! 8Mb - limit=2047 (0--2047�������2048*4096=8Mb)
+! 8Mb - limit=2047 (0--2047,因此是2048*4096=8Mb)571 &n
572
-.word 0x9A00 ! code read/exec ! �����Ϊֻ������ִ�С�
573 -.word 0x00C0 ! granularity=4096, 386 ! ������Ϊ4096��32λģʽ��
+.word 0x00C0 ! granularity=4096, 386 ! 颗粒度为4096,32位模式。 -! ��GDT���������ƫ������0x10�������ں����ݶ�ѡ�����ֵ��
+! 在GDT表中这里的偏移量是0x10。它是内核数据段选择符的值。
576 &n href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L577">577 .word 0x9200 ! data read/write ! -���ݶ�Ϊ�ɶ���д��
+数据段为可读可写。578 -.word 0x00C0 ! granularity=4096, 386 ! ������Ϊ4096��32λģʽ��
+.word 0x00C0 ! granularity=4096, 386 ! 颗粒度为4096,32位模式。 -! �����Ǽ����ж����������Ĵ���idtr��ָ��lidtҪ���6�ֽڲ�������ǰ2�ֽ���IDT����
+! 下面是加载中断描述符表寄存器idtr的指令lidt要求的6字节操作数。前2字节是IDT表的
-! ������4�ֽ���idt�������Ե�ַ�ռ��е�32λ����ַ��CPUҪ���ڽ��뱣��ģʽ֮ǰ����
+! 限长,后4字节是idt表在线性地址空间中的32位基地址。CPU要求在进入保护模式之前需设
-! ��IDT�����������������һ������Ϊ0�Ŀձ���
+! 置IDT表,因此这里先设置一个长度为0的空表。
href="http://plinux.org/lxr/http/source/boot/setup.S?v=0.12#L583">583 -! ���Ǽ���ȫ�����������Ĵ���gdtr��ָ��lgdtҪ���6�ֽڲ�������ǰ2�ֽ���gdt������
+! 这是加载全局描述符表寄存器gdtr的指令lgdt要求的6字节操作数。前2字节是gdt表的限
-! ������4�ֽ��� -gdt�������Ի���ַ������ȫ�ֱ���������Ϊ 2KB��0x7ff���ɣ�����Ϊÿ8
+! 长,后4字节是 +gdt表的线性基地址。这里全局表长度设置为 2KB(0x7ff即可),因为每8
- ! �ֽ����һ��������������Ա��й����� 256�4�ֽڵ����Ի���ַΪ
+ ! 字节组成一个段描述符项,所以表中共可有 256项。4字节的线性基地址为
0x0009<<16 + ! 0x0200 + gdt����0x90200 + gdt��(����gdt��ȫ�ֱ��ڱ�������е�ƫ�Ƶ�ַ����205��) ! 0x0200 + gdt,即0x90200 + gdt。(符号gdt是全局表在本程序段中的偏移地址,见205行) ! ������4����ʾ�����������ݴ��� ! 下面是4个显示卡的特征数据串。 596 idcandt: .byte
0xa5
-! ���idcandt��˼��ID of Chip AND
+! 标号idcandt意思是ID of Chip AND
Tech.
! �����Ǹ�����ʾ����ʹ�õ���չģʽ�����Ͷ�Ӧ��ģʽ���б�������ÿһ�е�1���ֽ���ģʽ��
+! 下面是各种显示卡可使用的扩展模式个数和对应的模式号列表。其中每一行第1个字节是模式个
-! ��ֵ������һЩֵ���ж�0x10����0��AH=0����ʹ�õ�ģʽ�š������602�п�֪������ATI
+! 数值,随后的一些值是中断0x10功能0(AH=0)可使用的模式号。例如从602行可知,对于ATI
-! ���ӵ���ʾ�������˱�ģʽ�����ʹ��������չģʽ��0x23��0x33��
+! 牌子的显示卡,除了标准模式以外还可使用两种扩展模式:0x23和0x33。
600 ! Manufacturer: Numofmodes: Mode:
-! ���ң� - ģʽ������ ģʽ�б���
+! 厂家: + 模式数量: 模式列表:
-! �����Ǹ�������VGA��ʾ����ʹ�õ�ģʽ��Ӧ���С���ֵ�б��������615�б�ʾATI��ʾ����
+! 下面是各种牌子VGA显示卡可使用的模式对应的列、行值列表。例如第615行表示ATI显示卡两
-! ����չģʽ���С���ֵ�ֱ��� 132 x 25�� 132 x 44��
+! 种扩展模式的列、行值分别是 132 x 25、 132 x 44。
! -���ֽ�=���� ���ֽ�=������
+高字节=列数 低字节=行数:615 dscati: .word 0x8419, 0x842c ! -ATI���������С���ֵ��
+ATI卡可设置列、行值。616 dscahead: -.word 0x842c, 0x8419, 0x841c, 0xa032, 0x5042 ! Ahead��������ֵ��
+.word 0x842c, 0x8419, 0x841c, 0xa032, 0x5042 ! Ahead卡可设置值。1 /*
+style='font-family:宋体'> 1 /*2 +style='font-family:宋体'> 2 * linux/boot/head.s
3 *
+style='font-family:宋体'> 3 *4 +style='font-family:宋体'> 4 * (C) 1991 Linus Torvalds
5 */
+style='font-family:宋体'> 5 */6
+style='font-family:宋体'> 67 /*
+style='font-family:宋体'> 7 /*8 +style='font-family:宋体'> 8 * head.s contains the 32-bit startup code.
9 *
+style='font-family:宋体'> 9 *10 * +style='font-family:宋体'> 10 * NOTE!!! Startup happens at absolute address 0x00000000, which is also where
11 * +style='font-family:宋体'> 11 * the page directory will exist. The startup code will be overwritten by
12 * +style='font-family:宋体'> 12 * the page directory.
13 */
+style='font-family:宋体'> 13 *//*
+style='font-family:宋体'> /** head.s����32λ�������롣
+style='font-family:宋体'> * head.s含有32位启动代码。* ע��!!! 32λ���������ǴӾ��Ե�ַ0x00000000��ʼ�ģ�����Ҳͬ����ҳĿ¼�����ڵĵط���
+style='font-family:宋体'> * 注意!!! 32位启动代码是从绝对地址0x00000000开始的,这里也同样是页目录将存在的地方,* ���������������뽫��ҳĿ¼���ǵ���
+style='font-family:宋体'> * 因此这里的启动代码将被页目录覆盖掉。*/
+style='font-family:宋体'> */14 .text
+style='font-family:宋体'> 14 .text15 .globl +style='font-family:宋体'> 15 .globl _idt,_gdt,_pg_dir,_tmp_floppy_area
16 _pg_dir: +style='font-family:宋体'> 16 _pg_dir: # -ҳĿ¼�����������
+页目录将会存放在这里。+style='font-family:宋体'>
# �ٴ�ע��!!! �����Ѿ�����32λ����ģʽ����������$0x10�����ǰѵ�ַ0x10װ�����
+style='font-family:宋体'> # 再次注意!!! 这里已经处于32位运行模式,因此这里的$0x10并不是把地址0x10装入各个# �μĴ�������������ʵ��ȫ�ֶ����������е�ƫ��ֵ�����߸�ȷ��˵��һ������������
+style='font-family:宋体'> # 段寄存器,它现在其实是全局段描述符表中的偏移值,或者更准确地说是一个描述符表项# ��ѡ������й�ѡ�����˵����μ�setup.s��193���µ�˵��������$0x10�ĺ���������
+style='font-family:宋体'> # 的选择符。有关选择符的说明请参见setup.s中193行下的说明。这里$0x10的含义是请求# ��Ȩ��0(λ0-1=0)��ѡ��ȫ����������(λ2=0)��ѡ����е�2��(λ3-15=2)��������ָ
+style='font-family:宋体'> # 特权级0(位0-1=0)、选择全局描述符表(位2=0)、选择表中第2项(位3-15=2)。它正好指# ����е����ݶ�����������������ľ�����ֵ�μ�ǰ��setup.s��212��213�У�
+style='font-family:宋体'> # 向表中的数据段描述符项。(描述符的具体数值参见前面setup.s中212,213行)# �������ĺ����ǣ�����ds,es,fs,gsΪsetup.s �й�������ݶΣ�ȫ�ֶ�����������2�
+style='font-family:宋体'> # 下面代码的含义是:设置ds,es,fs,gs为setup.s 中构造的数据段(全局段描述符表第2项)# ��ѡ���=0x10��������ջ������stack_startָ���user_stack��������Ȼ��ʹ�ñ�����
+style='font-family:宋体'> # 的选择符=0x10,并将堆栈放置在stack_start指向的user_stack数组区,然后使用本程序# ���涨������ж�����������ȫ�ֶ�����������ȫ�ֶ��������г�ʼ������setup.s�еĻ���
+style='font-family:宋体'> # 后面定义的新中断描述符表和全局段描述表。新全局段描述表中初始内容与setup.s中的基本# һ������������8MB�ij���16MB��stack_start������kernel/sched.c��69�С�����ָ��
+style='font-family:宋体'> # 一样,仅段限长从8MB修改成了16MB。stack_start定义在kernel/sched.c,69行。它是指向# user_stack����ĩ�˵�һ����ָ�롣��23����������ʹ�õ�ջ�����ҳ�Ϊϵͳջ�������ƶ���
+style='font-family:宋体'> # user_stack数组末端的一个长指针。第23行设置这里使用的栈,姑且称为系统栈。但在移动到# ����0ִ�У�init/main.c��137�У��Ժ��ջ�ͱ���������0������1��ͬʹ�õ��û�ջ�ˡ�
+style='font-family:宋体'> # 任务0执行(init/main.c中137行)以后该栈就被用作任务0和任务1共同使用的用户栈了。+style='font-family:宋体'>
17 +style='font-family:宋体'> 17 startup_32: - # 18-22�����ø������ݶμĴ�����
+ # 18-22行设置各个数据段寄存器。18 +style='font-family:宋体'> 18 movl $0x10,%eax # ����GNU��࣬ÿ��ֱ�Ӳ�����Ҫ��'$'��ʼ�������ʾ��ַ��
+宋体'>对于GNU汇编,每个直接操作数要以'$'开始,否则表示地址。- # ÿ���Ĵ�������Ҫ��'%'��ͷ��eax��ʾ��32λ��ax�Ĵ�����
+style='font-family:宋体'> + # 每个寄存器名都要以'%'开头,eax表示是32位的ax寄存器。19 +style='font-family:宋体'> 19 mov %ax,%ds
20 +style='font-family:宋体'> 20 mov %ax,%es
21 +style='font-family:宋体'> 21 mov %ax,%fs
22 +style='font-family:宋体'> 22 mov %ax,%gs
23 +style='font-family:宋体'> 23 lss _stack_start,%esp # ��ʾ_stack_start��ss:esp������ϵͳ��ջ��
+style='font-family:宋体'>表示_stack_startèss:esp,设置系统堆栈。- # stack_start������kernel/sched.c��69�С�
+style='font-family:宋体'> + # stack_start定义在kernel/sched.c,69行。24 +style='font-family:宋体'> 24 call setup_idt # -���������ж����������ӳ���
+调用设置中断描述符表子程序。25 +style='font-family:宋体'> 25 call setup_gdt # -��������ȫ�����������ӳ���
+调用设置全局描述符表子程序。26 +style='font-family:宋体'> 26 movl $0x10,%eax # reload all the segment registers
27 +style='font-family:宋体'> 27 mov %ax,%ds # after changing gdt. CS was already
28 +style='font-family:宋体'> 28 mov %ax,%es # reloaded in 'setup_gdt'
29 +style='font-family:宋体'> 29 mov %ax,%fs - # ��Ϊ����gdt��������Ҫ����װ�����еĶμĴ�����
+ # 因为修改了gdt,所以需要重新装载所有的段寄存器。30 +style='font-family:宋体'> 30 mov %ax,%gs - # CS����μĴ����Ѿ���setup_gdt�����¼��ع��ˡ�
+ # CS代码段寄存器已经在setup_gdt中重新加载过了。+style='font-family:宋体'>
# ���ڶ��������еĶ�����setup.s�е�8MB�ij��˱��������õ�16MB����setup.s��208-216
+style='font-family:宋体'> # 由于段描述符中的段限长从setup.s中的8MB改成了本程序设置的16MB(见setup.s行208-216# �ͱ���������235-236�У�����������ٴζ����жμĴ���ִ�м��ز����DZ���ġ����⣬ͨ��
+style='font-family:宋体'> # 和本程序后面的235-236行),因此这里再次对所有段寄存器执行加载操作是必须的。另外,通过# ʹ��bochs���ٹ۲죬�������CS�ٴ�ִ�м��أ���ô��ִ�е�26��ʱCS����β��ɼ�������
+style='font-family:宋体'> # 使用bochs跟踪观察,如果不对CS再次执行加载,那么在执行到26行时CS代码段不可见部分中# ��������8MB����������Ӧ�����¼���CS����������setup.s�е��ں˴�����������뱾������
+style='font-family:宋体'> # 的限长还是8MB。这样看来应该重新加载CS。但是由于setup.s中的内核代码段描述符与本程序中# �������õĴ�������������˶����������ಿ����ȫһ����8MB�������ں˳�ʼ���β�����
+style='font-family:宋体'> # 重新设置的代码段描述符除了段限长以外其余部分完全一样,8MB的限长在内核初始化阶段不会有# ���⣬�������Ժ��ں�ִ�й����жμ���תʱ�����¼���CS���������û�м�������û���ó���
+style='font-family:宋体'> # 问题,而且在以后内核执行过程中段间跳转时会重新加载CS。因此这里没有加载它并没有让程序# ������
+style='font-family:宋体'> # 出错。# ��Ը����⣬Ŀǰ�ں��о��ڵ�25��֮��������һ������תָ�'ljmp -$(__KERNEL_CS),$1f'��
+style='font-family:宋体'> # 针对该问题,目前内核中就在第25行之后添加了一条长跳转指令:'ljmp +$(__KERNEL_CS),$1f',# ��ת����26����ȷ��CSȷʵ�ֱ����¼��ء�
+style='font-family:宋体'> # 跳转到第26行来确保CS确实又被重新加载。+style='font-family:宋体'>
31 +style='font-family:宋体'> 31 lss _stack_start,%esp
+style='font-family:宋体'>
# 32-36�����ڲ���A20��ַ���Ƿ��Ѿ����������õķ��������ڴ��ַ0x000000��д������
+style='font-family:宋体'> # 32-36行用于测试A20地址线是否已经开启。采用的方法是向内存地址0x000000处写入任意# һ����ֵ��Ȼ���ڴ��ַ0x100000(1M)���Ƿ�Ҳ�������ֵ�����һֱ��ͬ�Ļ�����һֱ
+style='font-family:宋体'> # 一个数值,然后看内存地址0x100000(1M)处是否也是这个数值。如果一直相同的话,就一直# �Ƚ���ȥ��Ҳ����ѭ������������ʾ��ַA20��û��ѡͨ������ں˾Ͳ���ʹ��1MB�����ڴ档
+style='font-family:宋体'> # 比较下去,也即死循环、死机。表示地址A20线没有选通,结果内核就不能使用1MB以上内存。#
+style='font-family:宋体'> ## 33���ϵ�'1:'��һ���ֲ����Ź��ɵı�š�����ɷ��ź��һ��ð����ɡ���ʱ�÷��ű�ʾ�
+style='font-family:宋体'> # 33行上的'1:'是一个局部符号构成的标号。标号由符号后跟一个冒号组成。此时该符号表示活动# λ�ü�����Active location counter���ĵ�ǰֵ����������Ϊָ��IJ��������ֲ��������ڰ���
+style='font-family:宋体'> # 位置计数(Active location counter)的当前值,并可以作为指令的操作数。局部符号用于帮助# �������ͱ����Ա��ʱʹ��һЩ���ơ�����10���ֲ������������������������ظ�ʹ�á���Щ����
+style='font-family:宋体'> # 编译器和编程人员临时使用一些名称。共有10个局部符号名,可在整个程序中重复使用。这些符号# ��ʹ������'0'��'1'��...��'9'�����á�Ϊ�˶���һ���ֲ����ţ���ѱ��д��'N:'��ʽ������N
+style='font-family:宋体'> # 名使用名称'0'、'1'、...、'9'来引用。为了定义一个局部符号,需把标号写成'N:'形式(其中N# ��ʾһ�����֣���Ϊ��������ǰ��������������ţ���Ҫд��'Nb'������N�Ƕ�����ʱʹ�õ�
+style='font-family:宋体'> # 表示一个数字)。为了引用先前最近定义的这个符号,需要写成'Nb',其中N是定义标号时使用的# ���֡�Ϊ������һ���ֲ���ŵ���һ�����壬��Ҫд��'Nf'������N��10��ǰ������֮һ������
+style='font-family:宋体'> # 数字。为了引用一个局部标号的下一个定义,需要写成'Nf',这里N是10个前向引用之一。上面# 'b'��ʾ�����backwards������'f'��ʾ����ǰ��forwards�������ڻ������ijһ�����������
+style='font-family:宋体'> # 'b'表示“向后(backwards)”,'f'表示“向前(forwards)”。在汇编程序的某一处,我们最大# �������/��ǰ����10����ţ���Զ��10������
+style='font-family:宋体'> # 可以向后/向前引用10个标号(最远第10个)。+style='font-family:宋体'>
32 +style='font-family:宋体'> 32 xorl %eax,%eax
33 +style='font-family:宋体'> 33 1: incl %eax # check that A20 really IS enabled
34 +style='font-family:宋体'> 34 movl %eax,0x000000 # loop forever if it isn't
35 +style='font-family:宋体'> 35 cmpl %eax,0x100000
36 +style='font-family:宋体'> 36 je 1b - # '1b'��ʾ���(backward)��ת�����1ȥ��33�У���
+ # '1b'表示向后(backward)跳转到标号1去(33行)。- # ����'5f'���ʾ��ǰ(forward)��ת�����5ȥ��
+style='font-family:宋体'> + # 若是'5f'则表示向前(forward)跳转到标号5去。37 /*
+style='font-family:宋体'> 37 /*38 * +style='font-family:宋体'> 38 * NOTE! 486 should set bit 16, to check for write-protect in supervisor
39 * +style='font-family:宋体'> 39 * mode. Then it would be unnecessary with the "verify_area()"-calls.
40 * +style='font-family:宋体'> 40 * 486 users probably want to set the NE (#5) bit also, so as to use
41 * +style='font-family:宋体'> 41 * int 16 for math errors.
42 */
+style='font-family:宋体'> 42 *//*
+style='font-family:宋体'> /** ע��! ��������γ����У�486Ӧ�ý�λ16��λ���Լ���ڳ����û�ģʽ�µ�д����,
+style='font-family:宋体'> * 注意! 在下面这段程序中,486应该将位16置位,以检查在超级用户模式下的写保护,* �˺� "verify_area()" ���þͲ���Ҫ�ˡ�486���û�ͨ��Ҳ���뽫NE(#5)��λ���Ա�
+style='font-family:宋体'> * 此后 "verify_area()" 调用就不需要了。486的用户通常也会想将NE(#5)置位,以便* ����ѧЭ�������ij���ʹ��int 16��
+style='font-family:宋体'> * 对数学协处理器的出错使用int 16。*/
+style='font-family:宋体'> */# ����ԭע�����ᵽ��486 CPU��CR0���ƼĴ�����λ16��д������־WP��Write-Protect����
+style='font-family:宋体'> # 上面原注释中提到的486 CPU中CR0控制寄存器的位16是写保护标志WP(Write-Protect),# ���ڽ�ֹ�����û����ij�����һ���û�ֻ��ҳ���н���д�������ñ�־��Ҫ���ڲ���ϵͳ�ڴ���
+style='font-family:宋体'> # 用于禁止超级用户级的程序向一般用户只读页面中进行写操作。该标志主要用于操作系统在创建# �½���ʱʵ��дʱ���ƣ�copy-on-write��������
+style='font-family:宋体'> # 新进程时实现写时复制(copy-on-write)方法。# ������γ���43-65�����ڼ����ѧЭ������оƬ�Ƿ���ڡ��������Ŀ��ƼĴ���CR0����
+style='font-family:宋体'> # 下面这段程序(43-65)用于检查数学协处理器芯片是否存在。方法是修改控制寄存器CR0,在# �������Э�������������ִ��һ��Э������ָ���������Ļ���˵��Э������оƬ�����ڣ�
+style='font-family:宋体'> # 假设存在协处理器的情况下执行一个协处理器指令,如果出错的话则说明协处理器芯片不存在,# ��Ҫ����CR0�е�Э����������λEM��λ2��������λЭ���������ڱ�־MP��λ1����
+style='font-family:宋体'> # 需要设置CR0中的协处理器仿真位EM(位2),并复位协处理器存在标志MP(位1)。+style='font-family:宋体'>
43 +style='font-family:宋体'> 43 movl %cr0,%eax # check math chip
44 +style='font-family:宋体'> 44 andl $0x80000011,%eax # Save PG,PE,ET
45 /* +style='font-family:宋体'> 45 /* "orl $0x10020,%eax" here for 486 might be good */
46 +style='font-family:宋体'> 46 orl $2,%eax # set MP
47 +style='font-family:宋体'> 47 movl %eax,%cr0
48 +style='font-family:宋体'> 48 call check_x87
49 +style='font-family:宋体'> 49 jmp after_page_tables # ��ת��135�С�
+style='font-family:宋体'>跳转到135行。50
+style='font-family:宋体'> 5051 /*
+style='font-family:宋体'> 51 /*52 * +style='font-family:宋体'> 52 * We depend on ET to be correct. This checks for 287/387.
53 */
+style='font-family:宋体'> 53 *//*
+style='font-family:宋体'> /** ����������ET��־����ȷ�������287/387�������
+style='font-family:宋体'> * 我们依赖于ET标志的正确性来检测287/387存在与否。*/
+style='font-family:宋体'> */# ����fninit��fstsw����ѧЭ��������80287/80387����ָ�
+style='font-family:宋体'> # 下面fninit和fstsw是数学协处理器(80287/80387)的指令。# finit ��Э������������ʼ����������Э����������һ��δ����ǰ����Ӱ�����֪״̬������
+style='font-family:宋体'> # finit 向协处理器发出初始化命令,它会把协处理器置于一个未受以前操作影响的已知状态,设置# �������ΪĬ��ֵ�����״̬�ֺ����и���ջʽ�Ĵ������ǵȴ���ʽ������ָ�fninit��������
+style='font-family:宋体'> # 其控制字为默认值、清除状态字和所有浮点栈式寄存器。非等待形式的这条指令(fninit)还会让# Э��������ִֹ�е�ǰ����ִ�е��κ���ǰ������������fstsw ָ��ȡЭ��������״̬�֡����ϵ
+style='font-family:宋体'> # 协处理器终止执行当前正在执行的任何先前的算术操作。fstsw 指令取协处理器的状态字。如果系# ͳ�д���Э�������Ļ�����ô��ִ����fninitָ�����״̬�ֵ��ֽڿ϶�Ϊ0��
+style='font-family:宋体'> # 统中存在协处理器的话,那么在执行了fninit指令后其状态字低字节肯定为0。+style='font-family:宋体'>
54 +style='font-family:宋体'> 54 check_x87:
55 +style='font-family:宋体'> 55 fninit -# ��Э������������ʼ�����
+# 向协处理器发出初始化命令。56 +style='font-family:宋体'> 56 fstsw %ax - # ȡЭ������״̬�ֵ�ax�Ĵ����С�
+ # 取协处理器状态字到ax寄存器中。57 +style='font-family:宋体'> 57 cmpb $0,%al -# ��ʼ����״̬��Ӧ��Ϊ0������˵��Э�����������ڡ�
+# 初始化后状态字应该为0,否则说明协处理器不存在。58 +style='font-family:宋体'> 58 je 1f /* no coprocessor: have to set bits */
59 +style='font-family:宋体'> 59 movl %cr0,%eax # -�����������ǰ��ת�����1���������дcr0��
+如果存在则向前跳转到标号1处,否则改写cr0。60 +style='font-family:宋体'> 60 xorl $6,%eax /* reset MP, set EM */
61 +style='font-family:宋体'> 61 movl %eax,%cr0
62 +style='font-family:宋体'> 62 ret
+style='font-family:宋体'>
# ������һ�������ָʾ�����京����ָ�洢�߽���������"2"��ʾ�����Ĵ�������ݵ�ƫ��λ��
+style='font-family:宋体'> # 下面是一汇编语言指示符。其含义是指存储边界对齐调整。"2"表示把随后的代码或数据的偏移位置# ��������ֵַ���2����λΪ���λ�ã�2^2��������4�ֽڷ�ʽ�����ڴ��ַ����������GNU as
+style='font-family:宋体'> # 调整到地址值最后2比特位为零的位置(2^2),即按4字节方式对齐内存地址。不过现在GNU as# ֱ��ʱд�������ֵ����2�Ĵη�ֵ�ˡ�ʹ�ø�ָʾ����Ŀ����Ϊ�����32λCPU�����ڴ��д���
+style='font-family:宋体'> # 直接时写出对齐的值而非2的次方值了。使用该指示符的目的是为了提高32位CPU访问内存中代码# �����ݵ��ٶȺ�Ч�ʡ��μ���������ϸ˵����
+style='font-family:宋体'> # 或数据的速度和效率。参见程序后的详细说明。# ����������ֽ�ֵ��80287Э������ָ��fsetpm�Ļ����롣�������ǰ�80287����Ϊ����ģʽ��
+style='font-family:宋体'> # 下面的两个字节值是80287协处理器指令fsetpm的机器码。其作用是把80287设置为保护模式。# 80387�����ָ����ҽ���Ѹ�ָ����ǿղ�����
+style='font-family:宋体'> # 80387无需该指令,并且将会把该指令看作是空操作。+style='font-family:宋体'>
63 .align 2
+style='font-family:宋体'> 63 .align 264 +style='font-family:宋体'> 64 1: .byte 0xDB,0xE4 /* fsetpm for 287, ignored by 387 */ # 287Э�������롣
+宋体'>协处理器码。65 +style='font-family:宋体'> 65 ret
66
+style='font-family:宋体'> 6667 /*
+style='font-family:宋体'> 67 /*68 +style='font-family:宋体'> 68 * setup_idt
69 *
+style='font-family:宋体'> 69 *70 +style='font-family:宋体'> 70 * sets up a idt with 256 entries pointing to
71 +style='font-family:宋体'> 71 * ignore_int, interrupt gates. It then loads
72 +style='font-family:宋体'> 72 * idt. Everything that wants to install itself
73 * +style='font-family:宋体'> 73 * in the idt-table may do so themselves. Interrupts
74 +style='font-family:宋体'> 74 * are enabled elsewhere, when we can be relatively
75 +style='font-family:宋体'> 75 * sure everything is ok. This routine will be over-
76 +style='font-family:宋体'> 76 * written by the page tables.
77 */
+style='font-family:宋体'> 77 *//*
+style='font-family:宋体'> /** ��������������ж����������ӳ��� setup_idt
+style='font-family:宋体'> * 下面这段是设置中断描述符表子程序 setup_idt*
+style='font-family:宋体'> ** ���ж���������idt���óɾ���256�������ָ��ignore_int�ж��š�Ȼ������ж�
+style='font-family:宋体'> * 将中断描述符表idt设置成具有256个项,并都指向ignore_int中断门。然后加载中断* ���������Ĵ���(��lidtָ��)������ʵ�õ��ж����Ժ��ٰ�װ���������������ط���Ϊһ��
+style='font-family:宋体'> * 描述符表寄存器(用lidt指令)。真正实用的中断门以后再安装。当我们在其他地方认为一切* ������ʱ�ٿ����жϡ����ӳ��ᱻҳ�����ǵ���
+style='font-family:宋体'> * 都正常时再开启中断。该子程序将会被页表覆盖掉。*/
+style='font-family:宋体'> */# �ж����������е�����ȻҲ��8�ֽ���ɣ������ʽ��ȫ�ֱ��еIJ�ͬ������Ϊ��������
+style='font-family:宋体'> # 中断描述符表中的项虽然也是8字节组成,但其格式与全局表中的不同,被称为门描述符# (Gate Descriptor)������0-1,6-7�ֽ���ƫ������2-3�ֽ���ѡ�����4-5�ֽ���һЩ��־��
+style='font-family:宋体'> # (Gate Descriptor)。它的0-1,6-7字节是偏移量,2-3字节是选择符,4-5字节是一些标志。# ��δ���������edx��eax��������ó�8�ֽ�Ĭ�ϵ��ж�������ֵ��Ȼ����idt��ÿһ����
+style='font-family:宋体'> # 这段代码首先在edx、eax中组合设置出8字节默认的中断描述符值,然后在idt表每一项中# �����ø�����������256�eax������������4�ֽڣ�edx���и�4�ֽڡ��ں������ij�ʼ
+style='font-family:宋体'> # 都放置该描述符,共256项。eax含有描述符低4字节,edx含有高4字节。内核在随后的初始# �������л��滻��װ��Щ����ʵ�õ��ж��������
+style='font-family:宋体'> # 化过程中会替换安装那些真正实用的中断描述符项。+style='font-family:宋体'>
78 +style='font-family:宋体'> 78 setup_idt:
79 +style='font-family:宋体'> 79 lea ignore_int,%edx # ��ignore_int����Ч��ַ��ƫ��ֵ��ֵ��edx�Ĵ���
+style='font-family:宋体'>将ignore_int的有效地址(偏移值)值èedx寄存器80 +style='font-family:宋体'> 80 movl $0x00080000,%eax # ��ѡ���0x0008����eax�ĸ�16λ�С�
+style='font-family:宋体'>将选择符0x0008置入eax的高16位中。81 +style='font-family:宋体'> 81 movw %dx,%ax /* selector = 0x0008 = cs */
- # ƫ��ֵ�ĵ�16λ����eax�ĵ�16λ�С���ʱeax����
+style='font-family:宋体'> + # 偏移值的低16位置入eax的低16位中。此时eax含有- # ����������4�ֽڵ�ֵ��
+style='font-family:宋体'> + # 门描述符低4字节的值。82 +style='font-family:宋体'> 82 movw $0x8E00,%dx /* interrupt gate - dpl=0, present */
83 # -��ʱedx��������������4�ֽڵ�ֵ��
+style='font-family:宋体'> 83 # +此时edx含有门描述符高4字节的值。84 +style='font-family:宋体'> 84 lea _idt,%edi - # _idt���ж����������ĵ�ַ��
+ # _idt是中断描述符表的地址。85 +style='font-family:宋体'> 85 mov $256,%ecx
86 rp_sidt:
+style='font-family:宋体'> 86 rp_sidt:87 +style='font-family:宋体'> 87 movl %eax,(%edi) # �����ж���������������С�
+style='font-family:宋体'>将哑中断门描述符存入表中。88 +style='font-family:宋体'> 88 movl %edx,4(%edi) -# eax���ݷŵ� edi+4 ��ָ�ڴ�λ�ô���
+# eax内容放到 edi+4 所指内存位置处。89 +style='font-family:宋体'> 89 addl $8,%edi - # ediָ�������һ�
+ # edi指向表中下一项。90 +style='font-family:宋体'> 90 dec %ecx
91 +style='font-family:宋体'> 91 jne rp_sidt
92 +style='font-family:宋体'> 92 lidt idt_descr # -�����ж����������Ĵ���ֵ��
+加载中断描述符表寄存器值。93 +style='font-family:宋体'> 93 ret
94
+style='font-family:宋体'> 9495 /*
+style='font-family:宋体'> 95 /*96 +style='font-family:宋体'> 96 * setup_gdt
97 *
+style='font-family:宋体'> 97 *98 +style='font-family:宋体'> 98 * This routines sets up a new gdt and loads it.
99 +style='font-family:宋体'> 99 * Only two entries are currently built, the same
100 * ones that were built in init.s. The +style='font-family:宋体;color:blue'>100 * ones that were built in init.s. The routine
101 * is VERY complicated at two whole lines, +style='font-family:宋体;color:blue'>101 * is VERY complicated at two whole lines, so this
102 * rather long comment is certainly needed +style='font-family:宋体;color:blue'>102 * rather long comment is certainly needed :-).
103 * This routine will beoverwritten by the +style='font-family:宋体;color:blue'>103 * This routine will beoverwritten by the page tables.
104 */
+style='font-family:宋体;color:blue'>104 *//*
+style='font-family:宋体'> /** ����ȫ������������ setup_gdt
+style='font-family:宋体'> * 设置全局描述符表项 setup_gdt* ����ӳ�������һ���µ�ȫ����������gdt�������ء���ʱ�����������������ǰ
+style='font-family:宋体'> * 这个子程序设置一个新的全局描述符表gdt,并加载。此时仅创建了两个表项,与前* ���һ�������ӳ���ֻ�����У����dz��ġ����ӣ����Ե�Ȼ��Ҫ��ô����ע����J��
+style='font-family:宋体'> * 面的一样。该子程序只有两行,“非常的”复杂,所以当然需要这么长的注释了J。* ���ӳ���ҳ�����ǵ���
+style='font-family:宋体'> * 该子程序将被页表覆盖掉。*/
+style='font-family:宋体'> */105 setup_gdt:
+style='font-family:宋体;color:blue'>105 setup_gdt:106 lgdt +style='font-family:宋体;color:blue'>106 lgdt gdt_descr # -����ȫ�����������Ĵ���(���������úã���234-238��)��
+加载全局描述符表寄存器(内容已设置好,见234-238行)。107 ret
+style='font-family:宋体;color:blue'>107 ret108
+style='font-family:宋体;color:blue'>108109 /*
+style='font-family:宋体;color:blue'>109 /*110 * I put the kernel page tables right after the +style='font-family:宋体;color:blue'>110 * I put the kernel page tables right after the page directory,
111 * using 4 of them to span 16 Mb of physical +style='font-family:宋体;color:blue'>111 * using 4 of them to span 16 Mb of physical memory. People with
112 * more than 16MB will have to expand this.
+style='font-family:宋体;color:blue'>112 * more than 16MB will have to expand this.113 */
+style='font-family:宋体;color:blue'>113 *//* Linus���ں˵��ڴ�ҳ��ֱ�ӷ���ҳĿ¼֮��ʹ����4������Ѱַ16 MB�������ڴ档
+style='font-family:宋体'> /* Linus将内核的内存页表直接放在页目录之后,使用了4个表来寻址16 MB的物理内存。* ������ж���16 Mb���ڴ棬����Ҫ��������������ġ�
+style='font-family:宋体'> * 如果你有多于16 Mb的内存,就需要在这里进行扩充修改。*/
+style='font-family:宋体'> */# ÿ��ҳ����Ϊ4 Kb�ֽڣ�1ҳ�ڴ�ҳ�棩����ÿ��ҳ������Ҫ4���ֽڣ����һ��ҳ�������Դ��
+style='font-family:宋体'> # 每个页表长为4 Kb字节(1页内存页面),而每个页表项需要4个字节,因此一个页表共可以存放# 1024��������һ��ҳ����Ѱַ4 KB�ĵ�ַ�ռ䣬��һ��ҳ���Ϳ���Ѱַ4 MB�������ڴ档
+style='font-family:宋体'> # 1024个表项。如果一个页表项寻址4 KB的地址空间,则一个页表就可以寻址4 MB的物理内存。# ҳ����ĸ�ʽΪ�����ǰ0-11λ���һЩ��־�������Ƿ����ڴ���(Pλ0)����д����(R/Wλ1)��
+style='font-family:宋体'> # 页表项的格式为:项的前0-11位存放一些标志,例如是否在内存中(P位0)、读写许可(R/W位1)、# ��ͨ�û����dz����û�ʹ��(U/Sλ2)���Ƿ��Ĺ�(�Ƿ�����)(Dλ6)�ȣ������λ12-31��
+style='font-family:宋体'> # 普通用户还是超级用户使用(U/S位2)、是否修改过(是否脏了)(D位6)等;表项的位12-31是# ҳ���ַ������ָ��һҳ�ڴ��������ʼ��ַ��
+style='font-family:宋体'> # 页框地址,用于指出一页内存的物理起始地址。+style='font-family:宋体'>
114 .org 0x1000 # ��ƫ��0x1000����ʼ�ǵ�1��ҳ����ƫ��0��ʼ�������ҳ��Ŀ¼����
+style='font-family:宋体;color:blue'>114 .org 0x1000 # 从偏移0x1000处开始是第1个页表(偏移0开始处将存放页表目录)。115 pg0:
+style='font-family:宋体;color:blue'>115 pg0:116
+style='font-family:宋体;color:blue'>116117 .org 0x2000
+style='font-family:宋体;color:blue'>117 .org 0x2000118 pg1:
+style='font-family:宋体;color:blue'>118 pg1:119
+style='font-family:宋体;color:blue'>119120 .org 0x3000
+style='font-family:宋体;color:blue'>120 .org 0x3000121 pg2:
+style='font-family:宋体;color:blue'>121 pg2:122
+style='font-family:宋体;color:blue'>122123 .org 0x4000
+style='font-family:宋体;color:blue'>123 .org 0x4000124 pg3:
+style='font-family:宋体;color:blue'>124 pg3:125
+style='font-family:宋体;color:blue'>125126 .org 0x5000 # -����������ڴ����ݿ��ƫ��0x5000����ʼ��
+style='font-family:宋体;color:blue'>126 .org 0x5000 # +定义下面的内存数据块从偏移0x5000处开始。127 /*
+style='font-family:宋体;color:blue'>127 /*128 * tmp_floppy_area is used by the floppy-driver +style='font-family:宋体;color:blue'>128 * tmp_floppy_area is used by the floppy-driver when DMA cannot
129 * reach to a buffer-block. It needs to be +style='font-family:宋体;color:blue'>129 * reach to a buffer-block. It needs to be aligned, so that it isn't
130 * on a 64kB border.
+style='font-family:宋体;color:blue'>130 * on a 64kB border.131 */
+style='font-family:宋体;color:blue'>131 *//* ��DMA��ֱ�Ӵ洢�����ʣ����ܷ��ʻ����ʱ�������tmp_floppy_area�ڴ��
+style='font-family:宋体'> /* 当DMA(直接存储器访问)不能访问缓冲块时,下面的tmp_floppy_area内存块* �Ϳɹ�������������ʹ�á����ַ��Ҫ��������������Ͳ����Խ64KB�߽硣
+style='font-family:宋体'> * 就可供软盘驱动程序使用。其地址需要对齐调整,这样就不会跨越64KB边界。*/
+style='font-family:宋体'> */132 _tmp_floppy_area:
+style='font-family:宋体;color:blue'>132 _tmp_floppy_area:133 .fill +style='font-family:宋体;color:blue'>133 .fill 1024,1,0 # -������1024�ÿ��1�ֽڣ������ֵ0��
+共保留1024项,每项1字节,填充数值0。134
+style='font-family:宋体;color:blue'>134# �����⼸����ջ��������Ϊ��ת��init/main.c�е�main()����������������139����
+style='font-family:宋体'> # 下面这几个入栈操作用于为跳转到init/main.c中的main()函数作准备工作。第139行上# ��ָ����ջ��ѹ���˷��ص�ַ������140����ѹ����main()��������ĵ�ַ���� # 的指令在栈中压入了返回地址,而第140行则压入了main()函数代码的地址。当head.s
# ����ڵ�218��ִ��retָ��ʱ�ͻᵯ��main()�ĵ�ַ�����ѿ���Ȩת�Ƶ�init/main.c
+style='font-family:宋体'> # 最后在第218行执行ret指令时就会弹出main()的地址,并把控制权转移到init/main.c# �����С��μ���3�����й�C�������û��Ƶ�˵����
+style='font-family:宋体'> # 程序中。参见第3章中有关C函数调用机制的说明。# ǰ��3����ջ0ֵӦ�÷ֱ��ʾenvp��argvָ���argc��ֵ����main()û���õ���
+style='font-family:宋体'> # 前面3个入栈0值应该分别表示envp、argv指针和argc的值,但main()没有用到。# 139�е���ջ������ģ�����main.c����ʱ���Ƚ����ص�ַ��ջ�IJ������������
+style='font-family:宋体'> # 139行的入栈操作是模拟调用main.c程序时首先将返回地址入栈的操作,所以如果# main.c��������˳�ʱ���ͻ᷵�ص�����ı��L6������ִ����ȥ��Ҳ����ѭ����
+style='font-family:宋体'> # main.c程序真的退出时,就会返回到这里的标号L6处继续执行下去,也即死循环。# 140�н�main.c�ĵ�ַѹ���ջ�������������÷�ҳ������setup_paging��������
+style='font-family:宋体'> # 140行将main.c的地址压入堆栈,这样,在设置分页处理(setup_paging)结束后# ִ��'ret'����ָ��ʱ�ͻὫmain.c����ĵ�ַ������ջ����ȥִ��main.c�����ˡ�
+style='font-family:宋体'> # 执行'ret'返回指令时就会将main.c程序的地址弹出堆栈,并去执行main.c程序了。# �й�C�������û�����μ�������˵����
+style='font-family:宋体'> # 有关C函数调用机制请参见程序后的说明。135 after_page_tables:
+style='font-family:宋体;color:blue'>135 after_page_tables:136 pushl +style='font-family:宋体;color:blue'>136 pushl $0 # These are the parameters to main :-)
137 pushl +style='font-family:宋体;color:blue'>137 pushl $0 - # ��Щ�ǵ���main����IJ�����ָinit/main.c����
+ # 这些是调用main程序的参数(指init/main.c)。138 pushl +style='font-family:宋体;color:blue'>138 pushl $0 -# ���е�'$'���ű�ʾ����һ��������������
+# 其中的'$'符号表示这是一个立即操作数。139 pushl +style='font-family:宋体;color:blue'>139 pushl $L6 # return address for main, if it decides to.
140 pushl +style='font-family:宋体;color:blue'>140 pushl $_main -# '_main'�DZ�������main���ڲ���ʾ������
+# '_main'是编译程序对main的内部表示方法。141 jmp +style='font-family:宋体;color:blue'>141 jmp setup_paging # ��ת����198�С�
+style='font-family:宋体'>跳转至第198行。142 L6:
+ lang=EN-US style='font-family:宋体;color:blue'>142 L6:143 jmp +style='font-family:宋体;color:blue'>143 jmp L6 # main should never return here, but
144 +style='font-family:宋体;color:blue'>144 # just in case, we know what happens.
-# main������Բ�Ӧ�÷��ص��������Ϊ���Է���һ��
+style='font-family:宋体'> +# main程序绝对不应该返回到这里。不过为了以防万一,-# ���������˸���䡣�������Ǿ�֪������ʲô�����ˡ�
+style='font-family:宋体'> +# 所以添加了该语句。这样我们就知道发生什么问题了。145
+style='font-family:宋体;color:blue'>145146 /* This is the default interrupt "handler" +style='font-family:宋体;color:blue'>146 /* This is the default interrupt "handler" :-) */
/* ������Ĭ�ϵ��жϡ����������J */
+style='font-family:宋体'> /* 下面是默认的中断“向量句柄”J */147 int_msg:
+style='font-family:宋体;color:blue'>147 int_msg:148 .asciz +style='font-family:宋体;color:blue'>148 .asciz "Unknown interrupt\n\r" # �����ַ�����δ֪�ж�(�س�����)����
+style='font-family:宋体'>定义字符串“未知中断(回车换行)”。149 .align 2 - # ��4�ֽڷ�ʽ�����ڴ��ַ��
+style='font-family:宋体;color:blue'>149 .align 2 + # 按4字节方式对齐内存地址。150 ignore_int:
+style='font-family:宋体;color:blue'>150 ignore_int:151 pushl +style='font-family:宋体;color:blue'>151 pushl %eax
152 pushl +style='font-family:宋体;color:blue'>152 pushl %ecx
153 pushl +style='font-family:宋体;color:blue'>153 pushl %edx
154 push +style='font-family:宋体;color:blue'>154 push %ds # ������ע�⣡��ds,es,fs,gs����Ȼ��16λ�ļĴ���������ջ��
+style='font-family:宋体'>这里请注意!!ds,es,fs,gs等虽然是16位的寄存器,但入栈后155 push +style='font-family:宋体;color:blue'>155 push %es # ��Ȼ����32λ����ʽ��ջ��Ҳ����Ҫռ��4���ֽڵĶ�ջ�ռ䡣
+style='font-family:宋体'>仍然会以32位的形式入栈,也即需要占用4个字节的堆栈空间。156 push +style='font-family:宋体;color:blue'>156 push %fs
157 movl -$0x10,%eax # �ö�ѡ�����ʹds,es,fsָ��gdt���е����ݶΣ���
+style='font-family:宋体;color:blue'>157 movl +$0x10,%eax # 置段选择符(使ds,es,fs指向gdt表中的数据段)。158 mov +style='font-family:宋体;color:blue'>158 mov %ax,%ds
159 mov +style='font-family:宋体;color:blue'>159 mov %ax,%es
160 mov +style='font-family:宋体;color:blue'>160 mov %ax,%fs
161 pushl $int_msg -# �ѵ���printk�����IJ���ָ�루��ַ����ջ��ע�⣡��161 pushl $int_msg +# 把调用printk函数的参数指针(地址)入栈。注意!若int_msg
162 call +style='font-family:宋体;color:blue'>162 call _printk # ǰ����'$'�����ʾ��int_msg���Ŵ��ij��֣�'Unkn'����ջJ��
+宋体'>前不加'$',则表示把int_msg符号处的长字('Unkn')入栈J。163 popl +style='font-family:宋体;color:blue'>163 popl %eax # �ú�����/kernel/printk.c�С�'_printk'��printk�����ģ����
+style='font-family:宋体'>该函数在/kernel/printk.c中。'_printk'是printk编译后模块中164 pop +style='font-family:宋体;color:blue'>164 pop %fs # ���ڲ���ʾ����
+style='font-family:宋体'>的内部表示法。165 pop %es
+style='font-family:宋体;color:blue'>165 pop %es166 pop %ds
+style='font-family:宋体;color:blue'>166 pop %ds167 popl +style='font-family:宋体;color:blue'>167 popl %edx
168 popl +style='font-family:宋体;color:blue'>168 popl %ecx
169 popl +style='font-family:宋体;color:blue'>169 popl %eax
170 iret - # �жϷ��أ����жϵ���ʱѹ��ջ��CPU��־�Ĵ�����32λ��ֵҲ��������
+style='font-family:宋体;color:blue'>170 iret + # 中断返回(把中断调用时压入栈的CPU标志寄存器(32位)值也弹出)。171
+style='font-family:宋体;color:blue'>171172
+style='font-family:宋体;color:blue'>172173 /*
+style='font-family:宋体;color:blue'>173 /*174 * Setup_paging
+style='font-family:宋体;color:blue'>174 * Setup_paging175 *
+style='font-family:宋体;color:blue'>175 *176 * This routine sets up paging by setting the page +style='font-family:宋体;color:blue'>176 * This routine sets up paging by setting the page bit
177 * in cr0. The page tables are set up, +style='font-family:宋体;color:blue'>177 * in cr0. The page tables are set up, identity-mapping
178 * the first 16MB. The pager assumes that no +style='font-family:宋体;color:blue'>178 * the first 16MB. The pager assumes that no illegal
179 * addresses are produced (ie >4Mb on a 4Mb +style='font-family:宋体;color:blue'>179 * addresses are produced (ie >4Mb on a 4Mb machine).
180 *
+style='font-family:宋体;color:blue'>180 *181 * NOTE! Although all physical memory should be +style='font-family:宋体;color:blue'>181 * NOTE! Although all physical memory should be identity
182 * mapped by this routine, only the kernel page +style='font-family:宋体;color:blue'>182 * mapped by this routine, only the kernel page functions
183 * use the >1Mb addresses directly. All +style='font-family:宋体;color:blue'>183 * use the >1Mb addresses directly. All "normal" functions
184 * use just the lower 1Mb, or the local data +style='font-family:宋体;color:blue'>184 * use just the lower 1Mb, or the local data space, which
185 * will be mapped to some other place - mm keeps +style='font-family:宋体;color:blue'>185 * will be mapped to some other place - mm keeps track of
186 * that.
+style='font-family:宋体;color:blue'>186 * that.187 *
+style='font-family:宋体;color:blue'>187 *188 * For those with more memory than 16 Mb - tough +style='font-family:宋体;color:blue'>188 * For those with more memory than 16 Mb - tough luck. I've
189 * not got it, why should you :-) The source is +style='font-family:宋体;color:blue'>189 * not got it, why should you :-) The source is here. Change
190 * it. (Seriously - it shouldn't be too difficult. +style='font-family:宋体;color:blue'>190 * it. (Seriously - it shouldn't be too difficult. Mostly
191 * change some constants etc. I left it at 16Mb, +style='font-family:宋体;color:blue'>191 * change some constants etc. I left it at 16Mb, as my machine
192 * even cannot be extended past that (ok, but it +style='font-family:宋体;color:blue'>192 * even cannot be extended past that (ok, but it was cheap :-)
193 * I've tried to show which constants to change by +style='font-family:宋体;color:blue'>193 * I've tried to show which constants to change by having
194 * some kind of marker at them (search for +style='font-family:宋体;color:blue'>194 * some kind of marker at them (search for "16Mb"), but I
195 * won't guarantee that's all :-( )
+style='font-family:宋体;color:blue'>195 * won't guarantee that's all :-( )196 */
+style='font-family:宋体;color:blue'>196 *//*
+style='font-family:宋体'> /** ����ӳ���ͨ�����ÿ��ƼĴ���cr0�ı�־��PG λ31�����������ڴ�ķ�ҳ�������ܣ�
+style='font-family:宋体'> * 这个子程序通过设置控制寄存器cr0的标志(PG 位31)来启动对内存的分页处理功能,* �����ø���ҳ��������ݣ��Ժ��ӳ��ǰ16 MB�������ڴ档��ҳ���ٶ���������Ƿ���
+style='font-family:宋体'> * 并设置各个页表项的内容,以恒等映射前16 MB的物理内存。分页器假定不会产生非法的* ��ַӳ�䣨Ҳ����ֻ��4Mb�Ļ��������ó�����4Mb���ڴ��ַ����
+style='font-family:宋体'> * 地址映射(也即在只有4Mb的机器上设置出大于4Mb的内存地址)。*
+style='font-family:宋体'> ** ע�⣡�������е�������ַ��Ӧ��������ӳ�����к��ӳ�䣬��ֻ���ں�ҳ�����������
+style='font-family:宋体'> * 注意!尽管所有的物理地址都应该由这个子程序进行恒等映射,但只有内核页面管理函数能* ֱ��ʹ��>1Mb�ĵ�ַ�����С���ͨ��������ʹ�õ���1Mb�ĵ�ַ�ռ䣬������ʹ�þֲ�����
+style='font-family:宋体'> * 直接使用>1Mb的地址。所有“普通”函数仅使用低于1Mb的地址空间,或者是使用局部数据* �ռ䣬�õ�ַ�ռ佫��ӳ�䵽����һЩ�ط�ȥ -- mm���ڴ�������������Щ�µġ�
+style='font-family:宋体'> * 空间,该地址空间将被映射到其他一些地方去 -- mm(内存管理程序)会管理这些事的。*
+style='font-family:宋体'> ** ������Щ�ж���16Mb�ڴ�ļһ� �C ����̫�����ˣ��һ�û�У�Ϊʲô�����J���������
+style='font-family:宋体'> * 对于那些有多于16Mb内存的家伙 – 真是太幸运了,我还没有,为什么你会有J。代码就在* ������������İɡ���ʵ���ϣ��Ⲣ��̫���ѵġ�ͨ��ֻ����һЩ�����ȡ��Ұ�������
+style='font-family:宋体'> * 这里,对它进行修改吧。(实际上,这并不太困难的。通常只需修改一些常数等。我把它设置* Ϊ16Mb����Ϊ�ҵĻ�������ô�����������ܳ���������ޣ���Ȼ���ҵĻ����Ǻܱ��˵�J����
+style='font-family:宋体'> * 为16Mb,因为我的机器再怎么扩充甚至不能超过这个界限(当然,我的机器是很便宜的J)。* ���Ѿ�ͨ������ij���־��������Ҫ�Ķ��ĵط���������16Mb���������Ҳ��ܱ�֤����Щ
+style='font-family:宋体'> * 我已经通过设置某类标志来给出需要改动的地方(搜索“16Mb”),但我不能保证作这些* �Ķ�������L����
+style='font-family:宋体'> * 改动就行了L)。*/
+style='font-family:宋体'> */# ����Ӣ��ע�͵�2�εĺ�����ָ�ڻ��������ڴ��д���1MB���ڴ�ռ���Ҫ���������ڴ�����
+style='font-family:宋体'> # 上面英文注释第2段的含义是指在机器物理内存中大于1MB的内存空间主要被用于主内存区。# ���ڴ����ռ���mmģ����������漰��ҳ��ӳ��������ں�����������������������ָ��һ��
+style='font-family:宋体'> # 主内存区空间由mm模块管理。它涉及到页面映射操作。内核中所有其他函数就是这里指的一般#����ͨ����������Ҫʹ�����ڴ�����ҳ�棬����Ҫʹ��get_free_page()�Ⱥ�����ȡ����Ϊ����
+style='font-family:宋体'> #(普通)函数。若要使用主内存区的页面,就需要使用get_free_page()等函数获取。因为主内# �������ڴ�ҳ���ǹ�����Դ�������г������ͳһ�����Ա�����Դ���ú;�����
+style='font-family:宋体'> # 存区中内存页面是共享资源,必须有程序进行统一管理以避免资源争用和竞争。#
+style='font-family:宋体'> ## ���ڴ�������ַ0x0����ʼ���1ҳҳĿ¼����4ҳҳ����ҳĿ¼����ϵͳ���н��̹��õģ���
+style='font-family:宋体'> # 在内存物理地址0x0处开始存放1页页目录表和4页页表。页目录表是系统所有进程公用的,而# �����4ҳҳ���������ں�ר�ã�����һһӳ�����Ե�ַ��ʼ16MB�ռ䷶Χ�������ڴ��ϡ�����
+style='font-family:宋体'> # 这里的4页页表则属于内核专用,它们一一映射线性地址起始16MB空间范围到物理内存上。对于# �µĽ��̣�ϵͳ�������ڴ���Ϊ������ҳ����ҳ�������⣬1ҳ�ڴ泤����4096�ֽڡ�
+style='font-family:宋体'> # 新的进程,系统会在主内存区为其申请页面存放页表。另外,1页内存长度是4096字节。+style='font-family:宋体'>
197 .align 2 # -��4�ֽڷ�ʽ�����ڴ��ַ�߽硣
+style='font-family:宋体;color:blue'>197 .align 2 # +按4字节方式对齐内存地址边界。198 setup_paging: # -���ȶ�5ҳ�ڴ棨1ҳĿ¼ + 4ҳҳ�������㡣
+style='font-family:宋体;color:blue'>198 setup_paging: # +首先对5页内存(1页目录 + 4页页表)清零。199 movl +style='font-family:宋体;color:blue'>199 movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */
200 xorl +style='font-family:宋体;color:blue'>200 xorl %eax,%eax
201 xorl +style='font-family:宋体;color:blue'>201 xorl %edi,%edi /* pg_dir is at 0x000 */
-# ҳĿ¼��0x000��ַ��ʼ��
+style='font-family:宋体'> +# 页目录从0x000地址开始。202 +style='font-family:宋体;color:blue'>202 cld;rep;stosl # -eax���ݴ浽es:edi��ָ�ڴ�λ�ô�����edi��4��
+eax内容存到es:edi所指内存位置处,且edi增4。+style='font-family:宋体'>
# ����4������ҳĿ¼���е����Ϊ���ǣ��ںˣ�����4��ҳ������ֻ������4�
+style='font-family:宋体'> # 下面4句设置页目录表中的项,因为我们(内核)共有4个页表所以只需设置4项。# ҳĿ¼��Ľṹ��ҳ������Ľṹһ����4���ֽ�Ϊ1��μ�����113���µ�˵����
+style='font-family:宋体'> # 页目录项的结构与页表中项的结构一样,4个字节为1项。参见上面113行下的说明。# ����"$pg0+7"��ʾ��0x00001007����ҳĿ¼���еĵ�1�
+style='font-family:宋体'> # 例如"$pg0+7"表示:0x00001007,是页目录表中的第1项。# ���1��ҳ�����ڵĵ�ַ = 0x00001007 & -0xfffff000 = 0x1000��
+style='font-family:宋体'> # 则第1个页表所在的地址 = 0x00001007 & +0xfffff000 = 0x1000;# ��1��ҳ�������Ա�־ = 0x00001007 & 0x00000fff -= 0x07����ʾ��ҳ���ڡ��û��ɶ�д��
+style='font-family:宋体'> # 第1个页表的属性标志 = 0x00001007 & 0x00000fff += 0x07,表示该页存在、用户可读写。203 movl +style='font-family:宋体;color:blue'>203 movl $pg0+7,_pg_dir /* set present bit/user r/w */
204 movl +style='font-family:宋体;color:blue'>204 movl $pg1+7,_pg_dir+4 /* --------- " " --------- */
205 movl +style='font-family:宋体;color:blue'>205 movl $pg2+7,_pg_dir+8 /* --------- " " --------- */
206 movl +style='font-family:宋体;color:blue'>206 movl $pg3+7,_pg_dir+12 /* --------- " " --------- */
+style='font-family:宋体'>
# ����6����д4��ҳ��������������ݣ����У�4(ҳ��)*1024(��/ҳ��)=4096��(0 - 0xfff)��
+style='font-family:宋体'> # 下面6行填写4个页表中所有项的内容,共有:4(页表)*1024(项/页表)=4096项(0 - 0xfff),# Ҳ����ӳ�������ڴ� 4096*4Kb = 16Mb��
+style='font-family:宋体'> # 也即能映射物理内存 4096*4Kb = 16Mb。# ÿ��������ǣ���ǰ����ӳ��������ڴ��ַ + ��ҳ�ı�־�������Ϊ7����
+style='font-family:宋体'> # 每项的内容是:当前项所映射的物理内存地址 + 该页的标志(这里均为7)。# ʹ�õķ����Ǵ����һ��ҳ�������һ�ʼ������˳����д��һ��ҳ�������һ����ҳ���е�
+style='font-family:宋体'> # 使用的方法是从最后一个页表的最后一项开始按倒退顺序填写。一个页表的最后一项在页表中的# λ����1023*4 = 4092��������һҳ�����һ���λ�þ���$pg3+4092�� +style='font-family:宋体'> # 位置是1023*4 = 4092。因此最后一页的最后一项的位置就是$pg3+4092。
+style='font-family:宋体'>
207 movl +style='font-family:宋体;color:blue'>207 movl $pg3+4092,%edi # edi�����һҳ�����һ�
+lang=EN-US style='font-family:Wingdings'>è最后一页的最后一项。208 movl +style='font-family:宋体;color:blue'>208 movl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */
-# ���1���Ӧ�����ڴ�ҳ��ĵ�ַ��0xfff000��
+style='font-family:宋体'> +# 最后1项对应物理内存页面的地址是0xfff000,-# �������Ա�־7����Ϊ0xfff007��
+style='font-family:宋体'> +# 加上属性标志7,即为0xfff007。209 +style='font-family:宋体;color:blue'>209 std -# ����λ��λ��ediֵ�ݼ�(4�ֽ�)��
+# 方向位置位,edi值递减(4字节)。210 1: +style='font-family:宋体;color:blue'>210 1: stosl /* fill pages backwards - more efficient :-) */
211 subl +style='font-family:宋体;color:blue'>211 subl $0x1000,%eax # ÿ��д��һ�������ֵַ��0x1000��
+style='font-family:宋体'>每填写好一项,物理地址值减0x1000。212 jge 1b +style='font-family:宋体;color:blue'>212 jge 1b # ���С��0��˵��ȫ��д���ˡ�
+宋体'>如果小于0则说明全添写好了。# ����ҳĿ¼����ַ�Ĵ���cr3��ֵ��ָ��ҳĿ¼����cr3�б������ҳĿ¼����������ַ��
+style='font-family:宋体'> # 设置页目录表基址寄存器cr3的值,指向页目录表。cr3中保存的是页目录表的物理地址。213 xorl +style='font-family:宋体;color:blue'>213 xorl %eax,%eax -/* pg_dir is at 0x0000 */ # ҳĿ¼����0x0000����
+/* pg_dir is at 0x0000 */ # 页目录表在0x0000处。214 movl +style='font-family:宋体;color:blue'>214 movl %eax,%cr3 /* cr3 - page directory start */
# ��������ʹ�÷�ҳ������cr0��PG��־��λ31��
+style='font-family:宋体'> # 设置启动使用分页处理(cr0的PG标志,位31)215 movl +style='font-family:宋体;color:blue'>215 movl %cr0,%eax
216 orl +style='font-family:宋体;color:blue'>216 orl $0x80000000,%eax # ����PG��־��
+style='font-family:宋体'>添上PG标志。217 movl +style='font-family:宋体;color:blue'>217 movl %eax,%cr0 /* set paging (PG) bit */
218 +style='font-family:宋体;color:blue'>218 ret /* this also flushes prefetch-queue */
+style='font-family:宋体'>
# �ڸı��ҳ������־��Ҫ��ʹ��ת��ָ��ˢ��Ԥȡָ����У������õ��Ƿ���ָ��ret��
+style='font-family:宋体'> # 在改变分页处理标志后要求使用转移指令刷新预取指令队列,这里用的是返回指令ret。# �÷���ָ�����һ�������ǽ�140��ѹ���ջ�е�main����ĵ�ַ����������ת�� # 该返回指令的另一个作用是将140行压入堆栈中的main程序的地址弹出,并跳转到/init/main.c
# ����ȥ���С������˾����������ˡ�
+style='font-family:宋体'> # 程序去运行。本程序到此就真正结束了。+style='font-family:宋体'>
219
+style='font-family:宋体;color:blue'>219220 .align 2 - # ��4�ֽڷ�ʽ�����ڴ��ַ�߽硣
+style='font-family:宋体;color:blue'>220 .align 2 + # 按4字节方式对齐内存地址边界。221 .word +style='font-family:宋体;color:blue'>221 .word 0 -# �����ȿճ�2�ֽڣ�����224���ϵij�����4�ֽڶ���ġ�
+# 这里先空出2字节,这样224行上的长字是4字节对齐的。+style='font-family:宋体'>
! �����Ǽ����ж����������Ĵ���idtr��ָ��lidtҪ���6�ֽڲ�������ǰ2�ֽ���idt��������
+style='font-family:宋体'> ! 下面是加载中断描述符表寄存器idtr的指令lidt要求的6字节操作数。前2字节是idt表的限长,! ��4�ֽ���idt�������Ե�ַ�ռ��е�32λ����ַ��
+style='font-family:宋体'> ! 后4字节是idt表在线性地址空间中的32位基地址。222 idt_descr:
+style='font-family:宋体;color:blue'>222 idt_descr:223 .word +style='font-family:宋体;color:blue'>223 .word 256*8-1 -# idt contains 256 entries # ��256���=���� - 1��
+# idt contains 256 entries # 共256项,限长=长度 - 1。224 .long +style='font-family:宋体;color:blue'>224 .long _idt
225 .align 2
+style='font-family:宋体;color:blue'>225 .align 2226 .word 0
+style='font-family:宋体;color:blue'>226 .word 0+style='font-family:宋体'>
! �������ȫ�����������Ĵ���gdtr��ָ��lgdtҪ���6�ֽڲ�������ǰ2�ֽ���gdt��������
+style='font-family:宋体'> ! 下面加载全局描述符表寄存器gdtr的指令lgdt要求的6字节操作数。前2字节是gdt表的限长,! ��4�ֽ���gdt�������Ի���ַ������ȫ�ֱ���������Ϊ2KB�ֽڣ�0x7ff���ɣ�����Ϊÿ8�ֽ�
+style='font-family:宋体'> ! 后4字节是gdt表的线性基地址。这里全局表长度设置为2KB字节(0x7ff即可),因为每8字节! ���һ������������Ա��й�����256�����_gdt��ȫ�ֱ��ڱ������е�ƫ��λ�ã���234�С�
+style='font-family:宋体'> ! 组成一个描述符项,所以表中共可有256项。符号_gdt是全局表在本程序中的偏移位置,见234行。227 gdt_descr:
+style='font-family:宋体;color:blue'>227 gdt_descr:228 .word +style='font-family:宋体;color:blue'>228 .word 256*8-1 # so does gdt (not that that's any # ע��not �� note
+宋体'>注:not à note229 .long +style='font-family:宋体;color:blue'>229 .long _gdt # magic number, but it works for me :^)
230
+style='font-family:宋体;color:blue'>230231 .align +style='font-family:宋体;color:blue'>231 .align 3 - # ��8��2^3���ֽڷ�ʽ�����ڴ��ַ�߽硣
+ # 按8(2^3)字节方式对齐内存地址边界。232 _idt: .fill +style='font-family:宋体;color:blue'>232 _idt: .fill 256,8,0 -# idt is uninitialized # 256�ÿ��8�ֽڣ���0��
+# idt is uninitialized # 256项,每项8字节,填0。233
+style='font-family:宋体;color:blue'>233# ȫ�ֱ���ǰ4��ֱ��ǿ�����ã�������������������ݶ���������ϵͳ���ö�������������
+style='font-family:宋体'> # 全局表。前4项分别是空项(不用)、代码段描述符、数据段描述符、系统调用段描述符,其中# ϵͳ���ö���������û�����ô���Linus��ʱ���������ϵͳ���ô���ר�ŷ�����������Ķ��С�
+style='font-family:宋体'> # 系统调用段描述符并没有派用处,Linus当时可能曾想把系统调用代码专门放在这个独立的段中。# ���滹Ԥ����252��Ŀռ䣬���ڷ�������������ľֲ�������(LDT)�Ͷ�Ӧ������״̬�� # 后面还预留了252项的空间,用于放置所创建任务的局部描述符(LDT)和对应的任务状态段TSS
# ����������
+style='font-family:宋体'> # 的描述符。# (0-nul, 1-cs, 2-ds, 3-syscall, +style='font-family:宋体'> # (0-nul, 1-cs, 2-ds, 3-syscall, 4-TSS0, 5-LDT0, 6-TSS1, 7-LDT1, 8-TSS2 etc...)
+style='font-family:宋体'>
234 _gdt: .quad +style='font-family:宋体;color:blue'>234 _gdt: .quad 0x0000000000000000 /* NULL descriptor */
235 .quad -0x00c09a0000000fff /* 16Mb */ # 0x08���ں˴�������16MB��
+style='font-family:宋体;color:blue'>235 .quad +0x00c09a0000000fff /* 16Mb */ # 0x08,内核代码段最大长度16MB。236 .quad -0x00c0920000000fff /* 16Mb */ # 0x10���ں����ݶ����16MB��
+style='font-family:宋体;color:blue'>236 .quad +0x00c0920000000fff /* 16Mb */ # 0x10,内核数据段最大长度16MB。237 .quad +style='font-family:宋体;color:blue'>237 .quad 0x0000000000000000 /* TEMPORARY - don't use */
238 .fill +style='font-family:宋体;color:blue'>238 .fill 252,8,0 /* space for LDT's and TSS's etc */ # Ԥ���ռ䡣
+宋体'>预留空间。6
// ����ꡰ__LIBRARY__����Ϊ�˰���������unistd.h�е���Ƕ���������Ϣ��
+lang=EN-US>// 定义宏“__LIBRARY__”是为了包括定义在unistd.h中的内嵌汇编代码等信息。7 #define __LIBRARY__
-// *.hͷ�ļ����ڵ�Ĭ��Ŀ¼��include/�����ڴ����оͲ�����ȷָ����λ�á��������UNIX��
+// *.h头文件所在的默认目录是include/,则在代码中就不用明确指明其位置。如果不是UNIX的
-// ��ͷ�ļ�������Ҫָ�����ڵ�Ŀ¼������˫������ס��unistd.h�DZ����ų����������ļ���
+// 标准头文件,则需要指明所在的目录,并用双引号括住。unistd.h是标准符号常数与类型文件。
-// ���ж����˸��ַ��ų��������ͣ��������˸��ֺ���������������˷���__LIBRARY__����
+// 其中定义了各种符号常数和类型,并声明了各种函数。如果还定义了符号__LIBRARY__,则还会
-// ����ϵͳ���úź���Ƕ������syscall0()�ȡ�
+// 包含系统调用号和内嵌汇编代码syscall0()等。
8 #include <unistd.h>
9 -#include <time.h> // ʱ������ͷ�ļ�����������Ҫ������tm�ṹ��һЩ�й�ʱ��ĺ���ԭ�Ρ�
+#include <time.h> // 时间类型头文件。其中最主要定义了tm结构和一些有关时间的函数原形。10
@@ -1926,87 +1926,87 @@ some others too./*
-* ������Ҫ������Щ��Ƕ��� - ���ں˿ռ䴴�����̽�����û��дʱ����(COPY ON WRITE)!!!
+* 我们需要下面这些内嵌语句 - 从内核空间创建进程将导致没有写时复制(COPY ON WRITE)!!!
-* ֱ��ִ��һ��execve���á���Զ�ջ���ܴ������⡣������������fork()���ú��� * 直到执行一个execve调用。这对堆栈可能带来问题。处理方法是在fork()调用后不让main()
-* ʹ���κζ�ջ����˾Ͳ����к������� - ����ζ��forkҲҪʹ����Ƕ�Ĵ��룬���������ڴ�
+* 使用任何堆栈。因此就不能有函数调用 - 这意味着fork也要使用内嵌的代码,否则我们在从
-* fork()�˳�ʱ��Ҫʹ�ö�ջ�ˡ�
+* fork()退出时就要使用堆栈了。
*
-* ʵ����ֻ��pause��fork��Ҫʹ����Ƕ��ʽ���Ա�֤��main()�в���Ū�Ҷ�ջ����������ͬ
+* 实际上只有pause和fork需要使用内嵌方式,以保证从main()中不会弄乱堆栈,但是我们同
-* ʱ������������һЩ������
+* 时还定义了其他一些函数。
*/
-// Linux���ں˿ռ䴴������ʱ��ʹ��дʱ���Ƽ�����Copy on write����main()���ƶ����û�
+// Linux在内核空间创建进程时不使用写时复制技术(Copy on write)。main()在移动到用户
-// ģʽ��������0����ִ����Ƕ��ʽ��fork()��pause()����˿ɱ�֤��ʹ������0���û�ջ��
+// 模式(到任务0)后执行内嵌方式的fork()和pause(),因此可保证不使用任务0的用户栈。
-// ��ִ��moveto_user_mode()֮������main()��������0�������������ˡ�������0����
+// 在执行moveto_user_mode()之后,本程序main()就以任务0的身份在运行了。而任务0是所
-// �н������ӽ��̵ĸ����̡���������һ���ӽ���ʱ��init���̣�����������1���������ں�
+// 有将创建子进程的父进程。当它创建一个子进程时(init进程),由于任务1代码属于内核
-// �ռ䣬���û��ʹ��дʱ���ƹ��ܡ���ʱ����0���û�ջ��������1���û�ջ�������ǹ�ͬ
+// 空间,因此没有使用写时复制功能。此时任务0的用户栈就是任务1的用户栈,即它们共同
-// ʹ��һ��ջ�ռ䡣���ϣ����main.c����������0�Ļ�����ʱ��Ҫ�жԶ�ջ���κβ�������
+// 使用一个栈空间。因此希望在main.c运行在任务0的环境下时不要有对堆栈的任何操作,以
-// ��Ū�Ҷ�ջ�������ٴ�ִ��fork()��ִ�й�execve()���������س����Ѳ������ں˿ռ䣬
+// 免弄乱堆栈。而在再次执行fork()并执行过execve()函数后,被加载程序已不属于内核空间,
-// ��˿���ʹ��дʱ���Ƽ����ˡ���μ�5.3�ڡ�Linux�ں�ʹ���ڴ�ķ��������ݡ�
+// 因此可以使用写时复制技术了。请参见5.3节“Linux内核使用内存的方法”内容。
-
// ����_syscall0()��unistd.h�е���Ƕ����롣��Ƕ�������ʽ����Linux��ϵͳ�����ж�
+// 下面_syscall0()是unistd.h中的内嵌宏代码。以嵌入汇编的形式调用Linux的系统调用中断
-// 0x80�����ж�������ϵͳ���õ���ڡ��������ʵ������int fork()��������ϵͳ���á���չ
+// 0x80。该中断是所有系统调用的入口。该条语句实际上是int fork()创建进程系统调用。可展
-// ����֮�ͻ��������ס�syscall0����������0��ʾ������1��ʾ1��������
+// 开看之就会立刻明白。syscall0名称中最后的0表示无参数,1表示1个参数。
-// �μ�include/unistd.h��133�С�
+// 参见include/unistd.h,133行。
23 static inline _syscall0(int,fork)
-// int pause()ϵͳ���ã���ͣ���̵�ִ�У�ֱ���յ�һ���źš�
+// int pause()系统调用:暂停进程的执行,直到收到一个信号。
24 static inline _syscall0(int,pause)
-// int setup(void * BIOS)ϵͳ���ã�������linux��ʼ����������������б����ã���
+// int setup(void * BIOS)系统调用,仅用于linux初始化(仅在这个程序中被调用)。
25 static inline _syscall1(int,setup,void *,BIOS)
-// int sync()ϵͳ���ã������ļ�ϵͳ��
+// int sync()系统调用:更新文件系统。
26 static inline _syscall0(int,sync)
27
28 -#include <linux/tty.h> // ttyͷ�ļ����������й�tty_io������ͨ�ŷ���IJ�����������
+#include <linux/tty.h> // tty头文件,定义了有关tty_io,串行通信方面的参数、常数。29 -#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct����1����ʼ����
+#include <linux/sched.h> // 调度程序头文件,定义了任务结构task_struct、第1个初始任务-// �����ݡ�����һЩ�Ժ����ʽ������й��������������úͻ�ȡ��
+// 的数据。还有一些以宏的形式定义的有关描述符参数设置和获取的-// Ƕ��ʽ��ຯ������
+// 嵌入式汇编函数程序。30 -#include <linux/head.h> // headͷ�ļ��������˶��������ļṹ���ͼ���ѡ���������
+#include <linux/head.h> // head头文件,定义了段描述符的简单结构,和几个选择符常量。31 -#include <asm/system.h> // ϵͳͷ�ļ����Ժ���ʽ�����������й����û���������/�ж���
+#include <asm/system.h> // 系统头文件。以宏形式定义了许多有关设置或修改描述符/中断门-// �ȵ�Ƕ��ʽ����ӳ���
+// 等的嵌入式汇编子程序。32 -#include <asm/io.h> // ioͷ�ļ����Ժ��Ƕ���������ʽ�����io�˿ڲ����ĺ�����
+#include <asm/io.h> // io头文件。以宏的嵌入汇编程序形式定义对io端口操作的函数。33
34 -#include <stddef.h> // ������ͷ�ļ���������NULL, offsetof(TYPE, MEMBER)��
+#include <stddef.h> // 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)。35 -#include <stdarg.h> // ������ͷ�ļ����Ժ����ʽ������������б�����Ҫ˵����-��
+#include <stdarg.h> // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个-// ����(va_list)��������(va_start, -va_arg��va_end)��vsprintf��
+// 类型(va_list)和三个宏(va_start, +va_arg和va_end),vsprintf、-// vprintf��vfprintf��
+// vprintf、vfprintf。36 #include <unistd.h>
37 -#include <fcntl.h> // �ļ�����ͷ�ļ��������ļ������������IJ������Ƴ������ŵĶ��塣
+#include <fcntl.h> // 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。38 -#include <sys/types.h> // ����ͷ�ļ��������˻�����ϵͳ�������͡�
+#include <sys/types.h> // 类型头文件。定义了基本的系统数据类型。39
40 -#include <linux/fs.h> // �ļ�ϵͳͷ�ļ��������ļ����ṹ��file,buffer_head,m_inode�ȣ���
+#include <linux/fs.h> // 文件系统头文件。定义文件表结构(file,buffer_head,m_inode等)。41 // -�����ж��壺extern int ROOT_DEV��
+其中有定义:extern int ROOT_DEV。42 -#include <string.h> // �ַ���ͷ�ļ�����Ҫ������һЩ�й��ڴ���ַ���������Ƕ�뺯����
+#include <string.h> // 字符串头文件。主要定义了一些有关内存或字符串操作的嵌入函数。43
44 static char printbuf[1024]; - // ��̬�ַ������飬�����ں���ʾ��Ϣ�Ļ��档
+ // 静态字符串数组,用作内核显示信息的缓存。45
@@ -2093,56 +2093,56 @@ extern char *strcpy();47 extern int vsprintf(); - // ��ʽ�������һ�ַ����У�vsprintf.c��92�У���
+ // 送格式化输出到一字符串中(vsprintf.c,92行)。48 extern void init(void); - // ����ԭ�Σ���ʼ����������168�У���
+ // 函数原形,初始化(本程序168行)。49 extern void blk_dev_init(void); // -���豸��ʼ���ӳ���blk_drv/ll_rw_blk.c,157�У�
+块设备初始化子程序(blk_drv/ll_rw_blk.c,157行)50 extern void chr_dev_init(void); // -�ַ��豸��ʼ����chr_drv/tty_io.c, 347�У�
+字符设备初始化(chr_drv/tty_io.c, 347行)51 extern void hd_init(void); - // Ӳ�̳�ʼ������blk_drv/hd.c, -343�У�
+ // 硬盘初始化程序(blk_drv/hd.c, +343行)52 extern void floppy_init(void); - // ������ʼ������blk_drv/floppy.c, -457�У�
+ // 软驱初始化程序(blk_drv/floppy.c, +457行)53 extern void mem_init(long start, long end); // �ڴ������ʼ����mm/memory.c, 399�У�
+style='color:blue'>end); // 内存管理初始化(mm/memory.c, 399行)54 extern long rd_init(long mem_start, int -length); // �����̳�ʼ��(blk_drv/ramdisk.c,52)
+length); // 虚拟盘初始化(blk_drv/ramdisk.c,52)55 extern long kernel_mktime(struct tm * tm); - // ����ϵͳ��������ʱ�䣨�룩��
+ // 计算系统开机启动时间(秒)。56
-// �ں�ר��sprintf()�������ú������ڲ�����ʽ����Ϣ�������ָ��������str�С�����'*fmt'
+// 内核专用sprintf()函数。该函数用于产生格式化信息并输出到指定缓冲区str中。参数'*fmt'
-// ָ����������õĸ�ʽ���μ���C�����鼮�����ӳ���������vsprintf���ʹ�õ�һ����
+// 指定输出将采用的格式,参见标准C语言书籍。该子程序正好是vsprintf如何使用的一个简单
-// ���ӡ�����ʹ��vsprintf()����ʽ���ַ�������str���������μ���179���ϵ�printf()������
+// 例子。函数使用vsprintf()将格式化字符串放入str缓冲区,参见第179行上的printf()函数。
57 static int sprintf(char *
/*
-* ������Щ���������ں������ڼ���setup.s�������õġ�
+* 以下这些数据是在内核引导期间由setup.s程序设置的。
*/
-// �������зֱ�ָ�������Ե�ַǿ��ת��Ϊ�����������͵�ָ�룬����ȡָ����ָ���ݡ�����
+// 下面三行分别将指定的线性地址强行转换为给定数据类型的指针,并获取指针所指内容。由于
-// �ں˴���α�ӳ�䵽��������ַ�㿪ʼ�ĵط��������Щ���Ե�ַ����Ҳ�Ƕ�Ӧ��������ַ��
+// 内核代码段被映射到从物理地址零开始的地方,因此这些线性地址正好也是对应的物理地址。
-// ��Щָ����ַ���ڴ�ֵ�ĺ�����μ���6�µı�6-2��setup�����ȡ������IJ�������
+// 这些指定地址处内存值的含义请参见第6章的表6-2(setup程序读取并保存的参数)。
-// drive_info�ṹ��μ������125�С�
+// drive_info结构请参见下面第125行。
71 #define EXT_MEM_K (*(unsigned short -*)0x90002) // 1MB�Ժ����չ�ڴ��С��KB����
+*)0x90002) // 1MB以后的扩展内存大小(KB)。72 #define CON_ROWS ((*(unsigned short -*)0x9000e) & 0xff) // ѡ���Ŀ���̨��Ļ�С�������
+*)0x9000e) & 0xff) // 选定的控制台屏幕行、列数。73 #define CON_COLS (((*(unsigned short @@ -2214,16 +2214,16 @@ lang=EN-US>KB����
74 #define DRIVE_INFO (*(struct drive_info *)0x90080) // Ӳ�̲�����32�ֽ����ݡ�
+style='color:blue'>drive_info *)0x90080) // 硬盘参数表32字节内容。75 #define ORIG_ROOT_DEV (*(unsigned short -*)0x901FC) // ���ļ�ϵͳ�����豸�š�
+*)0x901FC) // 根文件系统所在设备号。76 #define ORIG_SWAP_DEV (*(unsigned short -*)0x901FA) // �����ļ������豸�š�
+*)0x901FA) // 交换文件所在设备号。77
@@ -2245,45 +2245,45 @@ bios-listing reading. Urghh./*
-* �ǰ����ǰ���������γ���ܲ�����Ҳ�֪�������ȷ��ʵ�֣����Һ���
+* 是啊,是啊,下面这段程序很差劲,但我不知道如何正确地实现,而且好象
-* ���������С�����й���ʵʱʱ�Ӹ�������ϣ����Һܸ���Ȥ����Щ������
+* 它还能运行。如果有关于实时时钟更多的资料,那我很感兴趣。这些都是试
-* ̽�����ģ��������һЩbios���ǣ�
+* 探出来的,另外还看了一些bios程序,呵!
*/
84
-// ��κ��ȡCMOSʵʱʱ����Ϣ��outb_p��inb_p��include/asm/io.h�ж���Ķ˿���������ꡣ
+// 这段宏读取CMOS实时时钟信息。outb_p和inb_p是include/asm/io.h中定义的端口输入输出宏。
85 #define CMOS_READ(addr) ({ \
86 outb_p(0x80|addr,0x70); \ -// 0x70��д��ַ�˿ںţ�0x80|addr��Ҫ��ȡ��CMOS�ڴ��ַ��
+// 0x70是写地址端口号,0x80|addr是要读取的CMOS内存地址。87 inb_p(0x71); \ -// 0x71�Ƕ����ݶ˿ںš�
+// 0x71是读数据端口号。88 })
89
-// ����ꡣ��BCD��ת���ɶ�������ֵ��BCD�����ð���ֽڣ�4���أ���ʾһ��10�����������
+// 定义宏。将BCD码转换成二进制数值。BCD码利用半个字节(4比特)表示一个10进制数,因此
-// һ���ֽڱ�ʾ2��10��������(val)&15ȡBCD��ʾ��10���Ƹ�λ������ (val)>>4ȡBCD��ʾ
+// 一个字节表示2个10进制数。(val)&15取BCD表示的10进制个位数,而 (val)>>4取BCD表示
-// ��10����ʮλ�����ٳ���10��������������Ӿ���һ���ֽ�BCD���ʵ�ʶ�������ֵ��
+// 的10进制十位数,再乘以10。因此最后两者相加就是一个字节BCD码的实际二进制数值。
90 #define BCD_TO_BIN(val) @@ -2291,16 +2291,16 @@ lang=EN-US>10��������������Ӿ���һ�
91
-// �ú���ȡCMOSʵʱ����Ϣ��Ϊ����ʱ�䣬�����浽ȫ�ֱ���startup_time(��)�С��μ�����
+// 该函数取CMOS实时钟信息作为开机时间,并保存到全局变量startup_time(秒)中。参见后面
-// CMOS�ڴ��б�˵�������е��õĺ���kernel_mktime()���ڼ����1970��1��1��0ʱ��
+// CMOS内存列表说明。其中调用的函数kernel_mktime()用于计算从1970年1月1日0时起到
-// �������վ�������������Ϊ����ʱ�䣨kernel/mktime.c 41�У���
+// 开机当日经过的秒数,作为开机时间(kernel/mktime.c 41行)。
92 static void time_init(void)
@@ -2310,47 +2310,47 @@ static void time_init(void)94 struct tm time; // -ʱ��ṹtm������include/time.h�С�
+时间结构tm定义在include/time.h中。95
-// CMOS�ķ����ٶȺ�����Ϊ�˼�Сʱ�����ڶ�ȡ������ѭ����������ֵ������ʱCMOS��
+// CMOS的访问速度很慢。为了减小时间误差,在读取了下面循环中所有数值后,若此时CMOS中
-// ��ֵ�����˱仯����ô�����¶�ȡ����ֵ�������ں˾��ܰ���CMOSʱ����������1��֮�ڡ�
+// 秒值发生了变化,那么就重新读取所有值。这样内核就能把与CMOS时间误差控制在1秒之内。
96 do {
97 time.tm_sec = CMOS_READ(0); // ��ǰʱ����ֵ������BCD��ֵ����
+blue'>CMOS_READ(0); // 当前时间秒值(均是BCD码值)。98 time.tm_min = CMOS_READ(2); // ��ǰ����ֵ��
+blue'>CMOS_READ(2); // 当前分钟值。99 time.tm_hour = CMOS_READ(4); // ��ǰСʱֵ��
+style='color:blue'>CMOS_READ(4); // 当前小时值。100 time.tm_mday = CMOS_READ(7); // һ���еĵ������ڡ�
+style='color:blue'>CMOS_READ(7); // 一月中的当天日期。101 time.tm_mon = CMOS_READ(8); // ��ǰ�·ݣ�1��12����
+blue'>CMOS_READ(8); // 当前月份(1—12)。102 time.tm_year = CMOS_READ(9); // ��ǰ��ݡ�
+style='color:blue'>CMOS_READ(9); // 当前年份。103 } while (time.tm_sec != CMOS_RE
104 BCD_TO_BIN(time.tm_sec);
-// ת���ɶ�������ֵ��
105 BCD_TO_BIN(time
110 time.tm_mon--; //
-tm_mon���·ݷ�Χ��0��11��
111 startup_time = kernel_mktime(&time); // ���㿪��ʱ�䡣kernel/mktime.c 41�С�
+style='color:blue'>time); // 计算开机时间。kernel/mktime.c 41行。112 }
@@ -2398,59 +2398,59 @@ lang=EN-US> }113
-// ���涨��һЩ�ֲ�������
+// 下面定义一些局部变量。
114 static long memory_end = 0; // -�������е������ڴ��������ֽ�������
+机器具有的物理内存容量(字节数)。115 static long buffer_memory_end = 0; // -���ٻ�����ĩ�˵�ַ��
+高速缓冲区末端地址。116 static long main_memory_start = 0; // -���ڴ棨�����ڷ�ҳ����ʼ��λ�á�
+主内存(将用于分页)开始的位置。117 static char term[32]; -// �ն������ַ�����������������
+// 终端设置字符串(环境参数)。118
-// ��ȡ��ִ��/etc/rc�ļ�ʱ��ʹ�õ������в����ͻ���������
+// 读取并执行/etc/rc文件时所使用的命令行参数和环境参数。
119 static char * argv_rc[] = { "/bin/sh", NULL }; // -����ִ�г���ʱ�������ַ������顣
+调用执行程序时参数的字符串数组。120 static char * envp_rc[] = { "HOME=/", NULL ,NULL -}; // ����ִ�г���ʱ�Ļ����ַ������顣
+}; // 调用执行程序时的环境字符串数组。121
-// ���е�¼shellʱ��ʹ�õ������в����ͻ���������
+// 运行登录shell时所使用的命令行参数和环境参数。
-// ��122����argv[0]�е��ַ���-���Ǵ��ݸ�shell����sh��һ����־��ͨ��ʶ��ñ�־��
+// 第122行中argv[0]中的字符“-”是传递给shell程序sh的一个标志。通过识别该标志,
-// sh�������Ϊ��¼shellִ�С���ִ�й�������shell��ʾ����ִ��sh��һ����
+// sh程序会作为登录shell执行。其执行过程与在shell提示符下执行sh不一样。
122 static char * argv[] = { "-/bin/sh",NULL }; // -ͬ�ϡ�
+同上。123 static char * envp[] = { "HOME=/usr/root", @@ -2463,19 +2463,19 @@ lang=EN-US>
125 struct drive_info { char dummy[32]; } drive_info; -// ���ڴ��Ӳ�̲�������Ϣ��
+// 用于存放硬盘参数表信息。126
-// �ں˳�ʼ��������ʼ��������������0��idle�����������������С�
+// 内核初始化主程序。初始化结束后将以任务0(idle任务即空闲任务)的身份运行。
-// Ӣ��ע�ͺ����ǡ�����ȷʵ��void��û������startup����(head.s)�о�����������ġ����μ�
+// 英文注释含义是“这里确实是void,没错。在startup程序(head.s)中就是这样假设的”。参见
-// head.s�����136�п�ʼ�ļ��д��롣
+// head.s程序第136行开始的几行代码。
127 void main(void) @@ -2501,39 +2501,39 @@ lang=EN-US> */
/*
-* ��ʱ�ж��Ա���ֹ�ţ������Ҫ�����ú�ͽ��俪����
+* 此时中断仍被禁止着,做完必要的设置后就将其开启。
*/
-// ���ȱ�����ļ�ϵͳ�豸�źͽ����ļ��豸�ţ�������setup.s�����л�ȡ����Ϣ���ÿ���̨
+// 首先保存根文件系统设备号和交换文件设备号,并根据setup.s程序中获取的信息设置控制台
-// �ն���Ļ�С�������������TERM�����������ó�ʼinit������ִ��etc/rc�ļ���shell����
+// 终端屏幕行、列数环境变量TERM,并用其设置初始init进程中执行etc/rc文件和shell程序
-// ʹ�õĻ����������Լ������ڴ�0x90080����Ӳ�̲�������
+// 使用的环境变量,以及复制内存0x90080处的硬盘参数表。
-// ����ROOT_DEV -����ǰ���������include/linux/fs.h�ļ���206���ϱ�����Ϊextern int��
+// 其中ROOT_DEV +已在前面包含进的include/linux/fs.h文件第206行上被声明为extern int,
-// ��SWAP_DEV��include/linux/mm.h�ļ���Ҳ������ͬ����������mm.h�ļ���û����ʽ������
+// 而SWAP_DEV在include/linux/mm.h文件内也作了相同声明。这里mm.h文件并没有显式地列在
-// ������ǰ������Ϊǰ���������include/linux/sched.h�ļ����Ѿ���������
+// 本程序前部,因为前面包含进的include/linux/sched.h文件中已经含有它。
133 ROOT_DEV = ORIG_ROOT_DEV; -// ROOT_DEV������fs/super.c��29��
+// ROOT_DEV定义在fs/super.c,29行。134 SWAP_DEV = ORIG_SWAP_DEV; -// SWAP_DEV������mm/swap.c��36�С�
+// SWAP_DEV定义在mm/swap.c,36行。135 envp_rc[1] = term138 drive_info = DRIVE_INFO; -// �����ڴ�0x90080����Ӳ�̲�������
+// 复制内存0x90080处的硬盘参数表。-
// ���Ÿ��ݻ��������ڴ��������ø��ٻ����������ڴ�����λ�úͷ�Χ��
+// 接着根据机器物理内存容量设置高速缓冲区和主内存区的位置和范围。
-// ���ٻ���ĩ�˵�ַ��buffer_memory_end�������ڴ�������memory_end��
+// 高速缓存末端地址èbuffer_memory_end;机器内存容量èmemory_end;
-// ���ڴ濪ʼ��ַ ��main_memory_start��
+// 主内存开始地址 èmain_memory_start;
139 memory_end = (1<<20) + (EXT_MEM_K<<10); // �ڴ��С=1Mb + ��չ�ڴ�(k)*1024�ֽڡ�
+style='color:blue'>EXT_MEM_K<<10); // 内存大小=1Mb + 扩展内存(k)*1024字节。140 memory_end &= 0xfffff000; -// ���Բ���4Kb��1ҳ�����ڴ�����
+// 忽略不到4Kb(1页)的内存数。141 if (memory_end > 16*1024*1024) -// ����ڴ�������16Mb����16Mb�ơ�
+// 如果内存量超过16Mb,则按16Mb计。142
@@ -2590,7 +2590,7 @@ lang=EN-US> &nb
143 if (memory_end > 12*1024*1024)
-// ����ڴ�>12Mb�������û�����ĩ��=4Mb
144
@@ -2599,7 +2599,7 @@ lang=EN-US> &nb
145 else if (memory_end > 6*1024*1024)
-// �������ڴ�>6Mb�������û�����ĩ��=2Mb
146 @@ -2610,20 +2610,20 @@ lang=EN-US> else
148 -buffer_memory_end = 1*1024*1024; // ���������û�����ĩ��buffer_memory_end = 1*1024*1024; // 否则则设置缓冲区末端=1Mb
149 main_memory_start = buffer_memory_end; -// ���ڴ���ʼλ�� = ������ĩ�ˡ�
+// 主内存起始位置 = 缓冲区末端。-
// �����Makefile�ļ��ж������ڴ������̷���RAMDISK�����ʼ�������̡���ʱ���ڴ潫���١�
+// 如果在Makefile文件中定义了内存虚拟盘符号RAMDISK,则初始化虚拟盘。此时主内存将减少。
-//�μ�kernel/blk_drv/ramdisk.c��
+//参见kernel/blk_drv/ramdisk.c。
150 #ifdef RAMDISK
@@ -2636,82 +2636,82 @@ style='color:blue'>main_memory_start, RAMDISK*1024);152 #endif
-// �������ں˽������з���ij�ʼ���������Ķ�ʱ��ø��ŵ��õij��������ȥ������ʵ�ڿ�
+// 以下是内核进行所有方面的初始化工作。阅读时最好跟着调用的程序深入进去看,若实在看
-// ����ȥ�ˣ����ȷ�һ�ţ���������һ����ʼ������ -- ���Ǿ���̸֮J��
+// 不下去了,就先放一放,继续看下一个初始化调用 -- 这是经验之谈J。
153 mem_init(main_memory_start,memory_end); // ���ڴ�����ʼ������mm/memory.c��399��
+style='color:blue'>memory_end); // 主内存区初始化。(mm/memory.c,399)154 trap_init(); // -�����ţ�Ӳ���ж���������ʼ������kernel/traps.c��181��
+陷阱门(硬件中断向量)初始化。(kernel/traps.c,181)155 blk_dev_init(); // -���豸��ʼ���� ��blk_drv/ll_rw_blk.c��157��
+块设备初始化。 (blk_drv/ll_rw_blk.c,157)156 chr_dev_init(); // -�ַ��豸��ʼ���� ��chr_drv/tty_io.c��347��
+字符设备初始化。 (chr_drv/tty_io.c,347)157 tty_init(); // -tty��ʼ���� ��chr_drv/tty_io.c��406��
+tty初始化。 (chr_drv/tty_io.c,406)158 time_init(); // -���ÿ�������ʱ�䡣������92�У�
+设置开机启动时间。(见第92行)159 sched_init(); // -���ȳ����ʼ������������0��tr,ldtr����kernel/sched.c��385��
+调度程序初始化(加载任务0的tr,ldtr)(kernel/sched.c,385)160 buffer_init(buffer_memory_end); -// ���������ʼ�������ڴ������ȡ���fs/buffer.c��348��
+// 缓冲管理初始化,建内存链表等。(fs/buffer.c,348)161 hd_init(); // -Ӳ�̳�ʼ���� ��blk_drv/hd.c��343��
+硬盘初始化。 (blk_drv/hd.c,343)162 floppy_init(); // -������ʼ���� ��blk_drv/floppy.c��457��
+软驱初始化。 (blk_drv/floppy.c,457)163 sti(); - // ���г�ʼ�������������ˣ����ǿ����жϡ�
+ // 所有初始化工作都做完了,于是开启中断。-
// �������ͨ���ڶ�ջ�����õIJ����������жϷ���ָ����������0ִ�С�
+// 下面过程通过在堆栈中设置的参数,利用中断返回指令启动任务0执行。
164 move_to_user_mode(); // �Ƶ��û�ģʽ��ִ�С���include/asm/system.h����1�У�
+style='color:blue'>move_to_user_mode(); // 移到用户模式下执行。(include/asm/system.h,第1行)165 if (!
166 init(); -// ���½����ӽ��̣�����1��init���̣���ִ�С�
+// 在新建的子进程(任务1即init进程)中执行。167 }
-
// ������뿪ʼ������0���������С�
+// 下面代码开始以任务0的身份运行。
168 /*
@@ -2757,30 +2757,30 @@ lang=EN-US> * task can run, and if not we return here.174 */ -/* ע��!! �����κ�����������'pause()'����ζ�����DZ���ȴ��յ�һ���ź�
+/* 注意!! 对于任何其他的任务,'pause()'将意味着我们必须等待收到一个信号
-* �Ż᷵�ؾ���̬��������0��task0����Ψһ����������μ�'schedule()'����
+* 才会返回就绪态,但任务0(task0)是唯一例外情况(参见'schedule()'),
-* ��Ϊ����0���κο���ʱ���ﶼ�ᱻ�����û����������������ʱ�������
+* 因为任务0在任何空闲时间里都会被激活(当没有其他任务在运行时),因此
-* ��������0'pause()'����ζ�����Ƿ������鿴�Ƿ�����������������У����
+* 对于任务0'pause()'仅意味着我们返回来查看是否有其他任务可以运行,如果
-* û�еĻ����Ǿͻص����һֱѭ��ִ��'pause()'��
+* 没有的话我们就回到这里,一直循环执行'pause()'。
*/
-// pause()ϵͳ���ã�kernel/sched.c,144���������0ת���ɿ��жϵȴ�״̬����ִ�е��Ⱥ�����
+// pause()系统调用(kernel/sched.c,144)会把任务0转换成可中断等待状态,再执行调度函数。
-// ���ǵ��Ⱥ���ֻҪ����ϵͳ��û�����������������ʱ�ͻ��л�������0����������������0��
+// 但是调度函数只要发现系统中没有其他任务可以运行时就会切换到任务0,而不依赖于任务0的
-// ״̬��
+// 状态。
175 for(;;)
@@ -2788,8 +2788,8 @@ lang=EN-US> for(;;)176 __asm__("int $0x80"::"a" (__NR_pause):"ax"); // ��ִ��ϵͳ����pause()��
+style='color:blue'>__NR_pause):"ax"); // 即执行系统调用pause()。177 }
@@ -2797,19 +2797,19 @@ lang=EN-US> }178
-// ���溯��������ʽ����Ϣ�������������豸stdout(1)��������ָ��Ļ����ʾ������'*fmt'
+// 下面函数产生格式化信息并输出到标准输出设备stdout(1),这里是指屏幕上显示。参数'*fmt'
-// ָ����������õĸ�ʽ���μ���C�����鼮�����ӳ���������vsprintf���ʹ�õ�һ����
+// 指定输出将采用的格式,参见标准C语言书籍。该子程序正好是vsprintf如何使用的一个简单
-// ���ӡ��ó���ʹ��vsprintf()����ʽ�����ַ�������printbuf��������Ȼ����write()������
+// 例子。该程序使用vsprintf()将格式化的字符串放入printbuf缓冲区,然后用write()将缓冲
-// ����������������豸��1--stdout����vsprintf()������ʵ�ּ�kernel/vsprintf.c��
+// 区的内容输出到标准设备(1--stdout)。vsprintf()函数的实现见kernel/vsprintf.c。
179 static int printf(const char @@ -2853,15 +2853,15 @@ lang=EN-US>
-
// ��main()���Ѿ�������ϵͳ��ʼ���������ڴ����������Ӳ���豸����������init()����
+// 在main()中已经进行了系统初始化,包括内存管理、各种硬件设备和驱动程序。init()函数
-// ����������0��1�δ������ӽ��̣�����1���С������ȶԵ�һ����Ҫִ�еij���shell��
+// 运行在任务0第1次创建的子进程(任务1)中。它首先对第一个将要执行的程序(shell)
-// �Ļ������г�ʼ����Ȼ���Ե�¼shell��ʽ���ظó���ִ��֮��
+// 的环境进行初始化,然后以登录shell方式加载该程序并执行之。
190 void init(void)
@@ -2875,13 +2875,13 @@ lang=EN-US> int pid,i;193 -// setup() ��һ��ϵͳ���á����ڶ�ȡӲ�̲���������������Ϣ�����������̣������ڵĻ�����
+// setup() 是一个系统调用。用于读取硬盘参数包括分区表信息并加载虚拟盘(若存在的话)和
-// ��װ���ļ�ϵͳ�豸���ú�����25���ϵĺ궨�壬��Ӧ������sys_setup()���ڿ��豸��Ŀ¼
+// 安装根文件系统设备。该函数用25行上的宏定义,对应函数是sys_setup(),在块设备子目录
-// kernel/blk_drv/hd.c��74��
+// kernel/blk_drv/hd.c,74行。
194 setup((void *)
@@ -2889,20 +2889,20 @@ lang=EN-US> setup((void *)
// �����Զ�д���ʷ�ʽ���豸�� // 下面以读写访问方式打开设备“/dev/tty0��������Ӧ�ն˿���̨���������ǵ�һ�δ��ļ�
// ��������˲������ļ�����ţ��ļ����������϶���0���þ����UNIX�����ϵͳĬ�ϵĿ�
+// 操作,因此产生的文件句柄号(文件描述符)肯定是0。该句柄是UNIX类操作系统默认的控
-// ��̨��������stdin�������ٰ����Զ���д�ķ�ʽ�ֱ����Ϊ�˸��Ʋ����������д��
+// 制台标准输入句柄stdin。这里再把它以读和写的方式分别打开是为了复制产生标准输出(写)
-// ���stdout�ͱ�����������stderr������ǰ��ġ�(void)��ǰ���ڱ�ʾǿ�ƺ�������
+// 句柄stdout和标准出错输出句柄stderr。函数前面的“(void)”前缀用于表示强制函数无需
-// ����ֵ��
+// 返回值。
195 (void) O_RDWR,0);
196 (void) dup(0); -// ���ƾ�����������1��--stdout������豸��
+// 复制句柄,产生句柄1号--stdout标准输出设备。197 (void) dup(0); -// ���ƾ�����������2��--stderr����������豸��
+// 复制句柄,产生句柄2号--stderr标准出错输出设备。-
// �����ӡ���������������ֽ�����ÿ��1024�ֽڣ��Լ����ڴ��������ڴ��ֽ�����
+// 下面打印缓冲区块数和总字节数,每块1024字节,以及主内存区空闲内存字节数。
198 memory_end-main_memory
// ����fork()���ڴ���һ���ӽ��̣�����2�������ڱ��������ӽ��̣�fork()������0ֵ������ // 下面fork()用于创建一个子进程(任务2)。对于被创建的子进程,fork()将返回0值,对于 // ԭ���̣������̣����ӽ��̵Ľ��̺�pid�����Ե�202--206�����ӽ���ִ�е����ݡ����� // 原进程(父进程)则返回子进程的进程号pid。所以第202--206行是子进程执行的内容。该子 // ���̹ر��˾��0��stdin������ֻ����ʽ��/etc/rc�ļ�����ʹ��execve()�������������� // 进程关闭了句柄0(stdin)、以只读方式打开/etc/rc文件,并使用execve()函数将进程自身 // �滻�� /bin/sh����shell����Ȼ��ִ�� /bin/sh������Я���IJ����ͻ��������� // 替换成 /bin/sh程序(即shell程序),然后执行 /bin/sh程序。所携带的参数和环境变量分 // ����argv_rc��envp_rc����������رվ��0�����̴� /etc/rc�ļ��������ǰѱ����� // 别由argv_rc和envp_rc数组给出。关闭句柄0并立刻打开 /etc/rc文件的作用是把标准输入 // stdin�ض��� /etc/rc�ļ�������shell����/bin/sh�Ϳ�������rc�ļ������õ������ // stdin重定向到 /etc/rc文件。这样shell程序/bin/sh就可以运行rc文件中设置的命令。由 // ������sh�����з�ʽ�Ƿǽ���ʽ�ģ������ִ����rc�ļ��е������ͻ������˳�������2 // 于这里sh的运行方式是非交互式的,因此在执行完rc文件中的命令后就会立刻退出,进程2 // Ҳ��֮����������execve()����˵����μ�fs/exec.c����207�С� // 也随之结束。关于execve()函数说明请参见fs/exec.c程序,207行。 // ����_exit()�˳�ʱ�ij�����1 �C ����δ���ɣ�2 -- �ļ���Ŀ¼�����ڡ� // 函数_exit()退出时的出错码1 – 操作未许可;2 -- 文件或目录不存在。 201 if (!(pid=O_RDONLY,0)) 204
_exit(1); //
-�����ļ�ʧ�ܣ����˳�(lib/_exit.c,10)��
205 execve("/bin/sh",argv_rc,envp_rc); - // �滻��/bin/sh����ִ�С�
+ // 替换成/bin/sh程序并执行。206 _exit(2); - // ��execve()ִ��ʧ�����˳���
+ // 若execve()执行失败则退出。207 }
-
// ���滹�Ǹ����̣�1��ִ�е���䡣wait()�ȴ��ӽ���ֹͣ����ֹ������ֵӦ���ӽ��̵Ľ��̺�
+// 下面还是父进程(1)执行的语句。wait()等待子进程停止或终止,返回值应是子进程的进程号
-// (pid)��������������Ǹ����̵ȴ��ӽ��̵Ľ�����&i�Ǵ�ŷ���״̬��Ϣ��λ�á����wait()
+// (pid)。这三句的作用是父进程等待子进程的结束。&i是存放返回状态信息的位置。如果wait()
-// ����ֵ�������ӽ��̺ţ�������ȴ���
+// 返回值不等于子进程号,则继续等待。
208 if (pid>0)
@@ -3024,30 +3024,30 @@ while (pid != wait(&i))210 -/* nothing */; /* ��ѭ��/* nothing */; /* 空循环 */
-
// ���ִ�е����˵���մ������ӽ��̵�ִ����ֹͣ����ֹ�ˡ�����ѭ���������ٴ���һ����
+// 如果执行到这里,说明刚创建的子进程的执行已停止或终止了。下面循环中首先再创建一个子
-// ���̣��������������ʾ����ʼ�������ӽ���ʧ�ܡ���Ϣ������ִ�С��������������ӽ�
+// 进程,如果出错,则显示“初始化程序创建子进程失败”信息并继续执行。对于所创建的子进
-// �̽��ر�������ǰ�������ľ��(stdin, stdout, stderr)���´���һ���Ự�����ý�����ţ�
+// 程将关闭所有以前还遗留的句柄(stdin, stdout, stderr),新创建一个会话并设置进程组号,
-// Ȼ�����´� /dev/tty0 ��Ϊ stdin�������Ƴ� stdout�� stderr���ٴ�ִ��ϵͳ���ͳ���
+// 然后重新打开 /dev/tty0 作为 stdin,并复制成 stdout和 stderr。再次执行系统解释程序
-// /bin/sh�������ִ����ѡ�õIJ����ͻ���������ѡ��һ�ף�������122--123�У���Ȼ��
+// /bin/sh。但这次执行所选用的参数和环境数组另选了一套(见上面122--123行)。然后父进
-// ���ٴ����� wait()�ȴ�������ӽ�����ֹͣ��ִ�У����ڱ��������ʾ������Ϣ���ӽ���
+// 程再次运行 wait()等待。如果子进程又停止了执行,则在标准输出上显示出错信息“子进程
-// pidֹͣ�����У���������i����Ȼ�����������ȥ�����γɡ�����ѭ����
+// pid停止了运行,返回码是i”,然后继续重试下去…,形成“大”死循环。
211 while (1) {
@@ -3072,7 +3072,7 @@ lang=EN-US> &nb216 if (!pid) { -// �µ��ӽ��̡�
+// 新的子进程。217 @@ -3082,7 +3082,7 @@ style='color:blue'>close(2);
218 setsid(); -// ����һ�µĻỰ�ڣ�������˵����
+// 创建一新的会话期,见后面说明。219 @@ -3126,7 +3126,7 @@ code %04x\n\r",pid,i);
228 sync(); - // ͬ��������ˢ�»�������
+ // 同步操作,刷新缓冲区。229 }
@@ -3134,17 +3134,17 @@ lang=EN-US> }230 _exit(0); /* -NOTE! _exit, not exit() */ /*ע�⣡��_exit()���� /*注意!是_exit(),非exit()*/
-// _exit()��exit()������������ֹһ����������_exit()ֱ����һ��sys_exitϵͳ���ã���
+// _exit()和exit()都用于正常终止一个函数。但_exit()直接是一个sys_exit系统调用,而
-// exit()��ͨ������ͨ�������е�һ��������������ִ��һЩ����������������ִ�и���ֹ
+// exit()则通常是普通函数库中的一个函数。它会先执行一些清除操作,例如调用执行各终止
-// �������ر����б�IO�ȣ�Ȼ�����sys_exit��
+// 处理程序、关闭所有标准IO等,然后调用sys_exit。
231 }
diff --git a/Book-Lite/code-list/html/P8-1.html b/Book-Lite/code-list/html/P8-1.html index b000d79..6e77d8a 100644 --- a/Book-Lite/code-list/html/P8-1.html +++ b/Book-Lite/code-list/html/P8-1.html @@ -11,24 +11,24 @@ {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face - {font-family:����; + {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face - {font-family:����; + {font-family:黑体; panose-1:2 1 6 9 6 1 1 1 1 1;} @font-face - {font-family:����; + {font-family:黑体; panose-1:2 1 6 9 6 1 1 1 1 1;} @font-face - {font-family:����С���μ���;} + {font-family:方正小标宋简体;} @font-face - {font-family:"\@����"; + {font-family:"\@黑体"; panose-1:2 1 6 9 6 1 1 1 1 1;} @font-face - {font-family:"\@����"; + {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face - {font-family:"\@����С���μ���";} + {font-family:"\@方正小标宋简体";} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; @@ -38,7 +38,7 @@ font-size:10.0pt; font-family:"Times New Roman","serif";} h1 - {mso-style-link:"���� 1 Char"; + {mso-style-link:"标题 1 Char"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -50,7 +50,7 @@ h1 font-family:"Times New Roman","serif"; font-weight:bold;} h2 - {mso-style-link:"���� 2 Char"; + {mso-style-link:"标题 2 Char"; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -63,7 +63,7 @@ h2 font-family:"Arial","sans-serif"; font-weight:bold;} h3 - {mso-style-link:"���� 3 Char"; + {mso-style-link:"标题 3 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -74,7 +74,7 @@ h3 font-family:"Arial","sans-serif"; font-weight:bold;} h4 - {mso-style-link:"���� 4 Char"; + {mso-style-link:"标题 4 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -88,7 +88,7 @@ h4 font-family:"Arial","sans-serif"; font-weight:bold;} h5 - {mso-style-link:"���� 5 Char"; + {mso-style-link:"标题 5 Char"; margin-top:14.0pt; margin-right:0cm; margin-bottom:14.5pt; @@ -102,7 +102,7 @@ h5 font-family:"Times New Roman","serif"; font-weight:bold;} h6 - {mso-style-link:"���� 6 Char"; + {mso-style-link:"标题 6 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -116,7 +116,7 @@ h6 font-family:"Arial","sans-serif"; font-weight:bold;} p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 - {mso-style-link:"���� 7 Char"; + {mso-style-link:"标题 7 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -130,7 +130,7 @@ p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 font-family:"Times New Roman","serif"; font-weight:bold;} p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 - {mso-style-link:"���� 8 Char"; + {mso-style-link:"标题 8 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -143,7 +143,7 @@ p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 font-size:12.0pt; font-family:"Arial","sans-serif";} p.MsoHeading9, li.MsoHeading9, div.MsoHeading9 - {mso-style-link:"���� 9 Char"; + {mso-style-link:"标题 9 Char"; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; @@ -331,20 +331,20 @@ p.MsoToc9, li.MsoToc9, div.MsoToc9 font-size:9.0pt; font-family:"Times New Roman","serif";} p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText - {mso-style-link:"��ע�ı� Char"; + {mso-style-link:"脚注文本 Char"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; font-family:"Times New Roman","serif";} p.MsoCommentText, li.MsoCommentText, div.MsoCommentText - {mso-style-link:"��ע���� Char"; + {mso-style-link:"批注文字 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; font-family:"Times New Roman","serif";} p.MsoHeader, li.MsoHeader, div.MsoHeader - {mso-style-link:"ҳü Char"; + {mso-style-link:"页眉 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -354,14 +354,14 @@ p.MsoHeader, li.MsoHeader, div.MsoHeader font-size:9.0pt; font-family:"Times New Roman","serif";} p.MsoFooter, li.MsoFooter, div.MsoFooter - {mso-style-link:"ҳ�� Char"; + {mso-style-link:"页脚 Char"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; font-family:"Times New Roman","serif";} p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading - {mso-style-name:"��������\,������Ŀ\,������Ŀ1\,������Ŀ2"; + {mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -412,7 +412,7 @@ p.MsoList4, li.MsoList4, div.MsoList4 font-size:10.0pt; font-family:"Times New Roman","serif";} p.MsoDate, li.MsoDate, div.MsoDate - {mso-style-link:"���� Char"; + {mso-style-link:"日期 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -423,36 +423,36 @@ p.MsoDate, li.MsoDate, div.MsoDate font-size:10.0pt; font-family:"Times New Roman","serif";} a:link, span.MsoHyperlink - {mso-style-name:"������\,��������"; + {mso-style-name:"超链接\,超级链接"; color:blue; text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline;} p - {mso-style-name:"��ͨ\(��վ\)\,��ͨ \(Web\)\,��ͨ \(Web\)1\,��ͨ \(Web\)2\,��ͨ \(Web\)3"; + {mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3"; margin-right:0cm; margin-left:0cm; font-size:12.0pt; font-family:"Times New Roman","serif";} pre - {mso-style-name:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3"; - mso-style-link:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char"; + {mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3"; + mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char"; margin:0cm; margin-bottom:.0001pt; font-size:12.0pt; font-family:"Times New Roman","serif";} tt - {font-family:����;} + {font-family:黑体;} p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject - {mso-style-link:"��ע���� Char"; + {mso-style-link:"批注主题 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; font-family:"Times New Roman","serif"; font-weight:bold;} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate - {mso-style-link:"��ע���ı� Char"; + {mso-style-link:"批注框文本 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -460,7 +460,7 @@ p.MsoAcetate, li.MsoAcetate, div.MsoAcetate font-size:9.0pt; font-family:"Times New Roman","serif";} p.1, li.1, div.1 - {mso-style-name:��ʽ1; + {mso-style-name:样式1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -471,30 +471,30 @@ p.1, li.1, div.1 font-size:10.0pt; font-family:"Times New Roman","serif";} p.a, li.a, div.a - {mso-style-name:�������; - mso-style-link:"������� Char"; + {mso-style-name:代码程序; + mso-style-link:"代码程序 Char"; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} span.Char - {mso-style-name:"������� Char"; - mso-style-link:�������; - font-family:����;} + {mso-style-name:"代码程序 Char"; + mso-style-link:代码程序; + font-family:宋体;} p.a0, li.a0, div.a0 - {mso-style-name:ͼ˵��; - mso-style-link:"ͼ˵�� Char"; + {mso-style-name:图说明; + mso-style-link:"图说明 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char0 - {mso-style-name:"ͼ˵�� Char"; - mso-style-link:ͼ˵��; - font-family:����;} + {mso-style-name:"图说明 Char"; + mso-style-link:图说明; + font-family:宋体;} p.0, li.0, div.0 - {mso-style-name:����0; + {mso-style-name:封面0; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -502,7 +502,7 @@ p.0, li.0, div.0 font-family:"Times New Roman","serif"; font-weight:bold;} p.10, li.10, div.10 - {mso-style-name:����1; + {mso-style-name:封面1; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -510,25 +510,25 @@ p.10, li.10, div.10 font-family:"Times New Roman","serif"; font-weight:bold;} p.11, li.11, div.11 - {mso-style-name:�DZ���1; + {mso-style-name:非标题1; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.a1, li.a1, div.a1 - {mso-style-name:�ı�����; + {mso-style-name:文本居中; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.3CharChar, li.3CharChar, div.3CharChar - {mso-style-name:"ͼ������3 Char Char"; - mso-style-link:"ͼ������3 Char Char Char"; + {mso-style-name:"图中文字3 Char Char"; + mso-style-link:"图中文字3 Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -536,11 +536,11 @@ p.3CharChar, li.3CharChar, div.3CharChar font-size:8.0pt; font-family:"Times New Roman","serif";} span.3CharCharChar - {mso-style-name:"ͼ������3 Char Char Char"; - mso-style-link:"ͼ������3 Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char Char"; + mso-style-link:"图中文字3 Char Char"; + font-family:宋体;} p.post, li.post, div.post - {mso-style-name:�ʼ�post; + {mso-style-name:邮件post; margin:0cm; margin-bottom:.0001pt; text-align:right; @@ -548,7 +548,7 @@ p.post, li.post, div.post font-size:10.0pt; font-family:"Times New Roman","serif";} p.3, li.3, div.3 - {mso-style-name:ͼ������3; + {mso-style-name:图中字体3; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -556,44 +556,44 @@ p.3, li.3, div.3 font-size:10.0pt; font-family:"Times New Roman","serif";} span.3CharChar1CharCharChar - {mso-style-name:"ͼ������3 Char Char1 Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char1 Char Char Char"; + font-family:宋体;} span.3CharChar1CharChar - {mso-style-name:"ͼ������3 Char Char1 Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char1 Char Char"; + font-family:宋体;} p.5Char, li.5Char, div.5Char - {mso-style-name:"ͼ������5�� Char"; - mso-style-link:"ͼ������5�� Char Char"; + {mso-style-name:"图中文字5号 Char"; + mso-style-link:"图中文字5号 Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} span.5CharChar - {mso-style-name:"ͼ������5�� Char Char"; - mso-style-link:"ͼ������5�� Char"; - font-family:����;} + {mso-style-name:"图中文字5号 Char Char"; + mso-style-link:"图中文字5号 Char"; + font-family:宋体;} p.5CharChar0, li.5CharChar0, div.5CharChar0 - {mso-style-name:"ͼ������С5�� Char Char"; - mso-style-link:"ͼ������С5�� Char Char Char"; + {mso-style-name:"图中文字小5号 Char Char"; + mso-style-link:"图中文字小5号 Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} span.5CharCharChar - {mso-style-name:"ͼ������С5�� Char Char Char"; - mso-style-link:"ͼ������С5�� Char Char"; - font-family:����;} + {mso-style-name:"图中文字小5号 Char Char Char"; + mso-style-link:"图中文字小5号 Char Char"; + font-family:宋体;} p.5Char0, li.5Char0, div.5Char0 - {mso-style-name:"ͼ������С5�� Char"; + {mso-style-name:"图中文字小5号 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.5, li.5, div.5 - {mso-style-name:ͼ������С5��; + {mso-style-name:图中文字小5号; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -601,28 +601,28 @@ p.5, li.5, div.5 font-size:9.0pt; font-family:"Times New Roman","serif";} p.2, li.2, div.2 - {mso-style-name:�������2; + {mso-style-name:代码程序2; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.20, li.20, div.20 - {mso-style-name:ͼ˵��2; + {mso-style-name:图说明2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.21, li.21, div.21 - {mso-style-name:�ı�����2; + {mso-style-name:文本居中2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char Char"; - mso-style-link:"ͼ������3 Char Char Char Char Char Char"; + {mso-style-name:"图中文字3 Char Char Char Char Char"; + mso-style-link:"图中文字3 Char Char Char Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -630,18 +630,18 @@ p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar font-size:8.0pt; font-family:"Times New Roman","serif";} span.3CharCharCharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char Char Char"; - mso-style-link:"ͼ������3 Char Char Char Char Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char Char Char Char Char"; + mso-style-link:"图中文字3 Char Char Char Char Char"; + font-family:宋体;} p.a2, li.a2, div.a2 - {mso-style-name:ͼ����; + {mso-style-name:图居中; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.110, li.110, div.110 - {mso-style-name:"��ʽ ���� 1 + ����1"; + {mso-style-name:"样式 标题 1 + 居中1"; margin-right:0cm; margin-left:0cm; text-align:center; @@ -650,32 +650,32 @@ p.110, li.110, div.110 font-family:"Times New Roman","serif"; font-weight:bold;} span.1Char - {mso-style-name:"���� 1 Char"; - mso-style-link:"���� 1"; + {mso-style-name:"标题 1 Char"; + mso-style-link:"标题 1"; font-weight:bold;} p.22, li.22, div.22 - {mso-style-name:"��ʽ �б� 2 + ����"; + {mso-style-name:"样式 列表 2 + 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.23, li.23, div.23 - {mso-style-name:�б�2; + {mso-style-name:列表2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.50, li.50, div.50 - {mso-style-name:ͼ������5��; + {mso-style-name:图中文字5号; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.111, li.111, div.111 - {mso-style-name:��ʽ11; + {mso-style-name:样式11; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -686,20 +686,20 @@ p.111, li.111, div.111 font-size:10.0pt; font-family:"Times New Roman","serif";} p.12, li.12, div.12 - {mso-style-name:�������1; + {mso-style-name:代码程序1; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.13, li.13, div.13 - {mso-style-name:ͼ˵��1; + {mso-style-name:图说明1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.01, li.01, div.01 - {mso-style-name:����01; + {mso-style-name:封面01; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -707,7 +707,7 @@ p.01, li.01, div.01 font-family:"Times New Roman","serif"; font-weight:bold;} p.112, li.112, div.112 - {mso-style-name:����11; + {mso-style-name:封面11; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -715,24 +715,24 @@ p.112, li.112, div.112 font-family:"Times New Roman","serif"; font-weight:bold;} p.113, li.113, div.113 - {mso-style-name:�DZ���11; + {mso-style-name:非标题11; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.14, li.14, div.14 - {mso-style-name:�ı�����1; + {mso-style-name:文本居中1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.3Char1, li.3Char1, div.3Char1 - {mso-style-name:"ͼ������3 Char1"; + {mso-style-name:"图中文字3 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -740,7 +740,7 @@ p.3Char1, li.3Char1, div.3Char1 font-size:8.0pt; font-family:"Times New Roman","serif";} p.post1, li.post1, div.post1 - {mso-style-name:�ʼ�post1; + {mso-style-name:邮件post1; margin:0cm; margin-bottom:.0001pt; text-align:right; @@ -748,7 +748,7 @@ p.post1, li.post1, div.post1 font-size:10.0pt; font-family:"Times New Roman","serif";} p.31, li.31, div.31 - {mso-style-name:ͼ������31; + {mso-style-name:图中字体31; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -756,35 +756,35 @@ p.31, li.31, div.31 font-size:10.0pt; font-family:"Times New Roman","serif";} p.5Char1, li.5Char1, div.5Char1 - {mso-style-name:"ͼ������5�� Char1"; + {mso-style-name:"图中文字5号 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.5CharChar1, li.5CharChar1, div.5CharChar1 - {mso-style-name:"ͼ������С5�� Char Char1"; + {mso-style-name:"图中文字小5号 Char Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.5Char10, li.5Char10, div.5Char10 - {mso-style-name:"ͼ������С5�� Char1"; + {mso-style-name:"图中文字小5号 Char1"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.51, li.51, div.51 - {mso-style-name:ͼ������С5��1; + {mso-style-name:图中文字小5号1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.120, li.120, div.120 - {mso-style-name:��ʽ12; + {mso-style-name:样式12; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -795,7 +795,7 @@ p.120, li.120, div.120 font-size:10.0pt; font-family:"Times New Roman","serif";} p.02, li.02, div.02 - {mso-style-name:����02; + {mso-style-name:封面02; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -803,7 +803,7 @@ p.02, li.02, div.02 font-family:"Times New Roman","serif"; font-weight:bold;} p.121, li.121, div.121 - {mso-style-name:����12; + {mso-style-name:封面12; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -811,17 +811,17 @@ p.121, li.121, div.121 font-family:"Times New Roman","serif"; font-weight:bold;} p.122, li.122, div.122 - {mso-style-name:�DZ���12; + {mso-style-name:非标题12; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.3Char2, li.3Char2, div.3Char2 - {mso-style-name:"ͼ������3 Char2"; + {mso-style-name:"图中文字3 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -829,7 +829,7 @@ p.3Char2, li.3Char2, div.3Char2 font-size:8.0pt; font-family:"Times New Roman","serif";} p.post2, li.post2, div.post2 - {mso-style-name:�ʼ�post2; + {mso-style-name:邮件post2; margin:0cm; margin-bottom:.0001pt; text-align:right; @@ -837,7 +837,7 @@ p.post2, li.post2, div.post2 font-size:10.0pt; font-family:"Times New Roman","serif";} p.32, li.32, div.32 - {mso-style-name:ͼ������32; + {mso-style-name:图中字体32; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -845,21 +845,21 @@ p.32, li.32, div.32 font-size:10.0pt; font-family:"Times New Roman","serif";} p.5Char2, li.5Char2, div.5Char2 - {mso-style-name:"ͼ������С5�� Char2"; + {mso-style-name:"图中文字小5号 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.52, li.52, div.52 - {mso-style-name:ͼ������С5��2; + {mso-style-name:图中文字小5号2; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar - {mso-style-name:"ͼ������3 Char Char Char Char"; + {mso-style-name:"图中文字3 Char Char Char Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -867,7 +867,7 @@ p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar font-size:8.0pt; font-family:"Times New Roman","serif";} p.130, li.130, div.130 - {mso-style-name:��ʽ13; + {mso-style-name:样式13; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -878,13 +878,13 @@ p.130, li.130, div.130 font-size:10.0pt; font-family:"Times New Roman","serif";} p.30, li.30, div.30 - {mso-style-name:�������3; + {mso-style-name:代码程序3; margin:0cm; margin-bottom:.0001pt; font-size:10.0pt; - font-family:����;} + font-family:宋体;} p.03, li.03, div.03 - {mso-style-name:����03; + {mso-style-name:封面03; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -892,7 +892,7 @@ p.03, li.03, div.03 font-family:"Times New Roman","serif"; font-weight:bold;} p.131, li.131, div.131 - {mso-style-name:����13; + {mso-style-name:封面13; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -900,24 +900,24 @@ p.131, li.131, div.131 font-family:"Times New Roman","serif"; font-weight:bold;} p.132, li.132, div.132 - {mso-style-name:�DZ���13; + {mso-style-name:非标题13; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; margin-left:0cm; text-align:center; font-size:22.0pt; - font-family:����; + font-family:宋体; font-weight:bold;} p.33, li.33, div.33 - {mso-style-name:�ı�����3; + {mso-style-name:文本居中3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.3Char3, li.3Char3, div.3Char3 - {mso-style-name:"ͼ������3 Char3"; + {mso-style-name:"图中文字3 Char3"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -925,7 +925,7 @@ p.3Char3, li.3Char3, div.3Char3 font-size:8.0pt; font-family:"Times New Roman","serif";} p.post3, li.post3, div.post3 - {mso-style-name:�ʼ�post3; + {mso-style-name:邮件post3; margin:0cm; margin-bottom:.0001pt; text-align:right; @@ -933,7 +933,7 @@ p.post3, li.post3, div.post3 font-size:10.0pt; font-family:"Times New Roman","serif";} p.330, li.330, div.330 - {mso-style-name:ͼ������33; + {mso-style-name:图中字体33; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -941,36 +941,36 @@ p.330, li.330, div.330 font-size:10.0pt; font-family:"Times New Roman","serif";} p.5Char20, li.5Char20, div.5Char20 - {mso-style-name:"ͼ������5�� Char2"; + {mso-style-name:"图中文字5号 Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.5CharChar2, li.5CharChar2, div.5CharChar2 - {mso-style-name:"ͼ������С5�� Char Char2"; + {mso-style-name:"图中文字小5号 Char Char2"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.5Char3, li.5Char3, div.5Char3 - {mso-style-name:"ͼ������С5�� Char3"; + {mso-style-name:"图中文字小5号 Char3"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.53, li.53, div.53 - {mso-style-name:ͼ������С5��3; + {mso-style-name:图中文字小5号3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:9.0pt; font-family:"Times New Roman","serif";} p.3Char, li.3Char, div.3Char - {mso-style-name:"ͼ������3 Char"; - mso-style-link:"ͼ������3 Char Char5"; + {mso-style-name:"图中文字3 Char"; + mso-style-link:"图中文字3 Char Char5"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -978,11 +978,11 @@ p.3Char, li.3Char, div.3Char font-size:8.0pt; font-family:"Times New Roman","serif";} span.3CharChar5 - {mso-style-name:"ͼ������3 Char Char5"; - mso-style-link:"ͼ������3 Char"; - font-family:����;} + {mso-style-name:"图中文字3 Char Char5"; + mso-style-link:"图中文字3 Char"; + font-family:宋体;} p.54, li.54, div.54 - {mso-style-name:ͼ������С5����; + {mso-style-name:图中文字小5紧密; margin:0cm; margin-bottom:.0001pt; line-height:9.0pt; @@ -990,7 +990,7 @@ p.54, li.54, div.54 font-size:9.0pt; font-family:"Times New Roman","serif";} p.24, li.24, div.24 - {mso-style-name:����2�Ŵ�����; + {mso-style-name:居中2号粗宋体; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -998,7 +998,7 @@ p.24, li.24, div.24 font-family:"Times New Roman","serif"; font-weight:bold;} p.15, li.15, div.15 - {mso-style-name:"��ʽ ���� 1 + ����"; + {mso-style-name:"样式 标题 1 + 居中"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1009,7 +1009,7 @@ p.15, li.15, div.15 font-family:"Times New Roman","serif"; font-weight:bold;} p.25, li.25, div.25 - {mso-style-name:"��ʽ ���� 2 + �о�\: �����о�"; + {mso-style-name:"样式 标题 2 + 行距\: 单倍行距"; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1022,33 +1022,33 @@ p.25, li.25, div.25 font-family:"Arial","sans-serif"; font-weight:bold;} span.2Char - {mso-style-name:"���� 2 Char"; - mso-style-link:"���� 2"; + {mso-style-name:"标题 2 Char"; + mso-style-link:"标题 2"; font-family:"Arial","sans-serif"; font-weight:bold;} p.34, li.34, div.34 - {mso-style-name:�б�3; + {mso-style-name:列表3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.35, li.35, div.35 - {mso-style-name:��3; + {mso-style-name:表3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.4, li.4, div.4 - {mso-style-name:ͼ˵��4; + {mso-style-name:图说明4; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.40, li.40, div.40 - {mso-style-name:�б�4; + {mso-style-name:列表4; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1059,166 +1059,166 @@ p.40, li.40, div.40 font-size:10.0pt; font-family:"Times New Roman","serif";} p.41, li.41, div.41 - {mso-style-name:��4; + {mso-style-name:表4; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.55, li.55, div.55 - {mso-style-name:ͼ˵��5; + {mso-style-name:图说明5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.56, li.56, div.56 - {mso-style-name:�б�5; + {mso-style-name:列表5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.57, li.57, div.57 - {mso-style-name:��5; + {mso-style-name:表5; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.6, li.6, div.6 - {mso-style-name:�б�6; + {mso-style-name:列表6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.60, li.60, div.60 - {mso-style-name:��6; + {mso-style-name:表6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.61, li.61, div.61 - {mso-style-name:ͼ˵��6; + {mso-style-name:图说明6; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.7, li.7, div.7 - {mso-style-name:�б�7; + {mso-style-name:列表7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.70, li.70, div.70 - {mso-style-name:ͼ˵��7; + {mso-style-name:图说明7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.71, li.71, div.71 - {mso-style-name:��7; + {mso-style-name:表7; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.8, li.8, div.8 - {mso-style-name:�б�8; + {mso-style-name:列表8; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.9, li.9, div.9 - {mso-style-name:�б�9; + {mso-style-name:列表9; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.90, li.90, div.90 - {mso-style-name:ͼ˵��9; + {mso-style-name:图说明9; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.100, li.100, div.100 - {mso-style-name:�б�10; + {mso-style-name:列表10; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.101, li.101, div.101 - {mso-style-name:ͼ˵��10; + {mso-style-name:图说明10; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.114, li.114, div.114 - {mso-style-name:�б�11; + {mso-style-name:列表11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.115, li.115, div.115 - {mso-style-name:ͼ˵��11; + {mso-style-name:图说明11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.116, li.116, div.116 - {mso-style-name:��11; + {mso-style-name:表11; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.123, li.123, div.123 - {mso-style-name:�б�12; + {mso-style-name:列表12; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.124, li.124, div.124 - {mso-style-name:ͼ˵��12; + {mso-style-name:图说明12; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.133, li.133, div.133 - {mso-style-name:ͼ˵��13; - mso-style-link:"ͼ˵��13 Char"; + {mso-style-name:图说明13; + mso-style-link:"图说明13 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} span.13Char - {mso-style-name:"ͼ˵��13 Char"; - mso-style-link:ͼ˵��13; - font-family:����;} + {mso-style-name:"图说明13 Char"; + mso-style-link:图说明13; + font-family:宋体;} p.134, li.134, div.134 - {mso-style-name:�б�13; + {mso-style-name:列表13; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.26, li.26, div.26 - {mso-style-name:��¼2; + {mso-style-name:附录2; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1230,7 +1230,7 @@ p.26, li.26, div.26 font-family:"Arial","sans-serif"; font-weight:bold;} p.36, li.36, div.36 - {mso-style-name:��¼3; + {mso-style-name:附录3; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1240,12 +1240,12 @@ p.36, li.36, div.36 font-family:"Arial","sans-serif"; font-weight:bold;} span.3Char0 - {mso-style-name:"���� 3 Char"; - mso-style-link:"���� 3"; + {mso-style-name:"标题 3 Char"; + mso-style-link:"标题 3"; font-family:"Arial","sans-serif"; font-weight:bold;} p.16, li.16, div.16 - {mso-style-name:��¼1; + {mso-style-name:附录1; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1256,14 +1256,14 @@ p.16, li.16, div.16 font-family:"Times New Roman","serif"; font-weight:bold;} p.17, li.17, div.17 - {mso-style-name:��¼��1; + {mso-style-name:附录表1; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.42, li.42, div.42 - {mso-style-name:��¼4; + {mso-style-name:附录4; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1273,19 +1273,19 @@ p.42, li.42, div.42 font-family:"Arial","sans-serif"; font-weight:bold;} span.4Char - {mso-style-name:"���� 4 Char"; - mso-style-link:"���� 4"; + {mso-style-name:"标题 4 Char"; + mso-style-link:"标题 4"; font-family:"Arial","sans-serif"; font-weight:bold;} p.a3, li.a3, div.a3 - {mso-style-name:��¼ͼ˵��; + {mso-style-name:附录图说明; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.27, li.27, div.27 - {mso-style-name:�����2; + {mso-style-name:序标题2; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; @@ -1298,7 +1298,7 @@ p.27, li.27, div.27 font-family:"Arial","sans-serif"; font-weight:bold;} p.a4, li.a4, div.a4 - {mso-style-name:�ο�����; + {mso-style-name:参考标题; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; @@ -1309,7 +1309,7 @@ p.a4, li.a4, div.a4 font-family:"Times New Roman","serif"; font-weight:bold;} p.18, li.18, div.18 - {mso-style-name:��������1; + {mso-style-name:索引标题1; margin-top:7.8pt; margin-right:0cm; margin-bottom:7.8pt; @@ -1320,7 +1320,7 @@ p.18, li.18, div.18 font-family:"Times New Roman","serif"; font-weight:bold;} p.19, li.19, div.19 - {mso-style-name:�б�1; + {mso-style-name:列表1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1331,7 +1331,7 @@ p.19, li.19, div.19 font-size:10.0pt; font-family:"Times New Roman","serif";} p.1a, li.1a, div.1a - {mso-style-name:��1; + {mso-style-name:表1; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1342,14 +1342,14 @@ p.1a, li.1a, div.1a font-size:10.0pt; font-family:"Times New Roman","serif";} p.37, li.37, div.37 - {mso-style-name:ͼ˵��3; + {mso-style-name:图说明3; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Times New Roman","serif";} p.62, li.62, div.62 - {mso-style-name:��������6��; + {mso-style-name:表中字体6号; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1358,8 +1358,8 @@ p.62, li.62, div.62 font-size:7.5pt; font-family:"Times New Roman","serif";} p.a5, li.a5, div.a5 - {mso-style-name:���Ĵ���; - mso-style-link:"���Ĵ��� Char"; + {mso-style-name:正文代码; + mso-style-link:"正文代码 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1367,11 +1367,11 @@ p.a5, li.a5, div.a5 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char1 - {mso-style-name:"���Ĵ��� Char"; - mso-style-link:���Ĵ���; - font-family:����;} + {mso-style-name:"正文代码 Char"; + mso-style-link:正文代码; + font-family:宋体;} p.43, li.43, div.43 - {mso-style-name:"��ʽ ���� 4 +"; + {mso-style-name:"样式 标题 4 +"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1381,7 +1381,7 @@ p.43, li.43, div.43 font-family:"Arial","sans-serif"; font-weight:bold;} p.140, li.140, div.140 - {mso-style-name:��14; + {mso-style-name:表14; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1392,8 +1392,8 @@ p.140, li.140, div.140 font-size:10.0pt; font-family:"Times New Roman","serif";} p.141, li.141, div.141 - {mso-style-name:ͼ˵��14; - mso-style-link:"ͼ˵��14 Char"; + {mso-style-name:图说明14; + mso-style-link:"图说明14 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; @@ -1404,11 +1404,11 @@ p.141, li.141, div.141 font-size:10.0pt; font-family:"Times New Roman","serif";} span.14Char - {mso-style-name:"ͼ˵��14 Char"; - mso-style-link:ͼ˵��14; - font-family:����;} + {mso-style-name:"图说明14 Char"; + mso-style-link:图说明14; + font-family:宋体;} p.a6, li.a6, div.a6 - {mso-style-name:�ļ�Ŀ¼��; + {mso-style-name:文件目录表; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1416,8 +1416,8 @@ p.a6, li.a6, div.a6 font-size:10.0pt; font-family:"Times New Roman","serif";} p.a7, li.a7, div.a7 - {mso-style-name:"��ʽ ���� +"; - mso-style-link:"��ʽ ���� + Char"; + {mso-style-name:"样式 正文 +"; + mso-style-link:"样式 正文 + Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1425,39 +1425,39 @@ p.a7, li.a7, div.a7 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char2 - {mso-style-name:"��ʽ ���� + Char"; - mso-style-link:"��ʽ ���� +"; + {mso-style-name:"样式 正文 + Char"; + mso-style-link:"样式 正文 +"; font-family:"Times New Roman","serif";} p.a8, li.a8, div.a8 - {mso-style-name:������ע; + {mso-style-name:表格题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:宋体;} p.a9, li.a9, div.a9 - {mso-style-name:�б���ע; + {mso-style-name:列表题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.aa, li.aa, div.aa - {mso-style-name:ͼ��ע; + {mso-style-name:图题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.ab, li.ab, div.ab - {mso-style-name:������ע; + {mso-style-name:程序题注; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; font-family:"Arial","sans-serif";} p.ac, li.ac, div.ac - {mso-style-name:��������; + {mso-style-name:框中文字; margin-top:0cm; margin-right:21.0pt; margin-bottom:0cm; @@ -1470,7 +1470,7 @@ p.ac, li.ac, div.ac font-size:9.0pt; font-family:"Times New Roman","serif";} p.125, li.125, div.125 - {mso-style-name:"��ʽ ���� 1 + ����2"; + {mso-style-name:"样式 标题 1 + 居中2"; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1481,14 +1481,14 @@ p.125, li.125, div.125 font-family:"Times New Roman","serif"; font-weight:bold;} p.ad, li.ad, div.ad - {mso-style-name:"��ʽ ��ע + ���� ��� ����"; + {mso-style-name:"样式 题注 + 宋体 五号 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.5pt; - font-family:����;} + font-family:黑体;} p.1b, li.1b, div.1b - {mso-style-name:�����1; + {mso-style-name:序标题1; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; @@ -1499,16 +1499,16 @@ p.1b, li.1b, div.1b font-family:"Times New Roman","serif"; font-weight:bold;} p.38, li.38, div.38 - {mso-style-name:�����3; + {mso-style-name:序标题3; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; page-break-after:avoid; font-size:12.0pt; - font-family:����С���μ���;} + font-family:方正小标宋简体;} p.63, li.63, div.63 - {mso-style-name:��������6��; + {mso-style-name:表中文字6号; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1516,7 +1516,7 @@ p.63, li.63, div.63 font-size:7.5pt; font-family:"Times New Roman","serif";} p.64, li.64, div.64 - {mso-style-name:ͼ������6�������; + {mso-style-name:图中文字6号左对齐; margin:0cm; margin-bottom:.0001pt; line-height:10.0pt; @@ -1524,8 +1524,8 @@ p.64, li.64, div.64 font-size:7.5pt; font-family:"Times New Roman","serif";} p.65, li.65, div.65 - {mso-style-name:ͼ������6��; - mso-style-link:"ͼ������6�� Char"; + {mso-style-name:图中文字6号; + mso-style-link:"图中文字6号 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -1534,11 +1534,11 @@ p.65, li.65, div.65 font-size:7.5pt; font-family:"Times New Roman","serif";} span.6Char - {mso-style-name:"ͼ������6�� Char"; - mso-style-link:ͼ������6��; - font-family:����;} + {mso-style-name:"图中文字6号 Char"; + mso-style-link:图中文字6号; + font-family:宋体;} p.ae, li.ae, div.ae - {mso-style-name:ͼ��; + {mso-style-name:图标; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1546,7 +1546,7 @@ p.ae, li.ae, div.ae font-size:10.0pt; font-family:"Times New Roman","serif";} p.28, li.28, div.28 - {mso-style-name:ͼ��2; + {mso-style-name:图标2; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1554,7 +1554,7 @@ p.28, li.28, div.28 font-size:10.0pt; font-family:"Times New Roman","serif";} p.af, li.af, div.af - {mso-style-name:ϰ�����; + {mso-style-name:习题标题; margin-top:6.0pt; margin-right:0cm; margin-bottom:0cm; @@ -1564,9 +1564,9 @@ p.af, li.af, div.af text-justify:inter-ideograph; page-break-after:avoid; font-size:14.0pt; - font-family:����;} + font-family:黑体;} p.1c, li.1c, div.1c - {mso-style-name:���ֱ��1; + {mso-style-name:部分编号1; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1574,14 +1574,14 @@ p.1c, li.1c, div.1c font-size:16.0pt; font-family:"Times New Roman","serif";} p.af0, li.af0, div.af0 - {mso-style-name:������; + {mso-style-name:表标题; margin:0cm; margin-bottom:.0001pt; text-align:center; font-size:10.0pt; font-family:"Arial","sans-serif";} p.af1, li.af1, div.af1 - {mso-style-name:"��ʽ ��ע + ����"; + {mso-style-name:"样式 题注 + 居中"; margin:0cm; margin-bottom:.0001pt; text-align:center; @@ -1630,7 +1630,7 @@ p.RightText, li.RightText, div.RightText font-size:9.0pt; font-family:"Times New Roman","serif";} p.af2, li.af2, div.af2 - {mso-style-name:��������С��; + {mso-style-name:表中文字小五; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1638,8 +1638,8 @@ p.af2, li.af2, div.af2 font-size:9.0pt; font-family:"Times New Roman","serif";} p.af3, li.af3, div.af3 - {mso-style-name:�ؼ���; - mso-style-link:"�ؼ��� Char"; + {mso-style-name:关键词; + mso-style-link:"关键词 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1647,12 +1647,12 @@ p.af3, li.af3, div.af3 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char3 - {mso-style-name:"�ؼ��� Char"; - mso-style-link:�ؼ���; - font-family:����;} + {mso-style-name:"关键词 Char"; + mso-style-link:关键词; + font-family:宋体;} p.af4, li.af4, div.af4 - {mso-style-name:�ļ���; - mso-style-link:"�ļ��� Char"; + {mso-style-name:文件名; + mso-style-link:"文件名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1660,12 +1660,12 @@ p.af4, li.af4, div.af4 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char4 - {mso-style-name:"�ļ��� Char"; - mso-style-link:�ļ���; - font-family:����;} + {mso-style-name:"文件名 Char"; + mso-style-link:文件名; + font-family:宋体;} p.af5, li.af5, div.af5 - {mso-style-name:ѡ��; - mso-style-link:"ѡ�� Char"; + {mso-style-name:选项; + mso-style-link:"选项 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1673,12 +1673,12 @@ p.af5, li.af5, div.af5 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char5 - {mso-style-name:"ѡ�� Char"; - mso-style-link:ѡ��; - font-family:����;} + {mso-style-name:"选项 Char"; + mso-style-link:选项; + font-family:宋体;} p.af6, li.af6, div.af6 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:命令行; + mso-style-link:"命令行 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1686,12 +1686,12 @@ p.af6, li.af6, div.af6 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char6 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"命令行 Char"; + mso-style-link:命令行; + font-family:宋体;} p.af7, li.af7, div.af7 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:函数名; + mso-style-link:"函数名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1699,12 +1699,12 @@ p.af7, li.af7, div.af7 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char7 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"函数名 Char"; + mso-style-link:函数名; + font-family:宋体;} p.af8, li.af8, div.af8 - {mso-style-name:�Ĵ�����; - mso-style-link:"�Ĵ����� Char"; + {mso-style-name:寄存器名; + mso-style-link:"寄存器名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1712,12 +1712,12 @@ p.af8, li.af8, div.af8 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char8 - {mso-style-name:"�Ĵ����� Char"; - mso-style-link:�Ĵ�����; + {mso-style-name:"寄存器名 Char"; + mso-style-link:寄存器名; font-family:"Times New Roman","serif";} p.af9, li.af9, div.af9 - {mso-style-name:������; - mso-style-link:"������ Char"; + {mso-style-name:变量名; + mso-style-link:"变量名 Char"; margin:0cm; margin-bottom:.0001pt; text-align:justify; @@ -1725,83 +1725,83 @@ p.af9, li.af9, div.af9 font-size:10.0pt; font-family:"Times New Roman","serif";} span.Char9 - {mso-style-name:"������ Char"; - mso-style-link:������; - font-family:����;} + {mso-style-name:"变量名 Char"; + mso-style-link:变量名; + font-family:宋体;} p.58, li.58, div.58 - {mso-style-name:ͼ������С5����; + {mso-style-name:图中文字小5号左; margin:0cm; margin-bottom:.0001pt; font-size:9.0pt; font-family:"Times New Roman","serif";} p.59, li.59, div.59 - {mso-style-name:ͼ������С5�ſ���; + {mso-style-name:图中文字小5号靠左; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:9.0pt; font-family:"Times New Roman","serif";} p.926, li.926, div.926 - {mso-style-name:"��ʽ ������� + ���\: 9\.26 ����"; + {mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米"; margin:0cm; margin-bottom:.0001pt; layout-grid-mode:char; font-size:10.0pt; - font-family:����;} + font-family:宋体;} span.5Char4 - {mso-style-name:"���� 5 Char"; - mso-style-link:"���� 5"; + {mso-style-name:"标题 5 Char"; + mso-style-link:"标题 5"; font-weight:bold;} span.6Char0 - {mso-style-name:"���� 6 Char"; - mso-style-link:"���� 6"; + {mso-style-name:"标题 6 Char"; + mso-style-link:"标题 6"; font-family:"Arial","sans-serif"; font-weight:bold;} span.7Char - {mso-style-name:"���� 7 Char"; - mso-style-link:"���� 7"; + {mso-style-name:"标题 7 Char"; + mso-style-link:"标题 7"; font-weight:bold;} span.8Char - {mso-style-name:"���� 8 Char"; - mso-style-link:"���� 8"; + {mso-style-name:"标题 8 Char"; + mso-style-link:"标题 8"; font-family:"Arial","sans-serif";} span.9Char - {mso-style-name:"���� 9 Char"; - mso-style-link:"���� 9"; + {mso-style-name:"标题 9 Char"; + mso-style-link:"标题 9"; font-family:"Arial","sans-serif";} span.Chara - {mso-style-name:"��ע�ı� Char"; - mso-style-link:��ע�ı�; - font-family:����;} + {mso-style-name:"脚注文本 Char"; + mso-style-link:脚注文本; + font-family:宋体;} span.Charb - {mso-style-name:"��ע���� Char"; - mso-style-link:��ע����; - font-family:����;} + {mso-style-name:"批注文字 Char"; + mso-style-link:批注文字; + font-family:宋体;} span.Charc - {mso-style-name:"ҳü Char"; - mso-style-link:ҳü; - font-family:����;} + {mso-style-name:"页眉 Char"; + mso-style-link:页眉; + font-family:宋体;} span.Chard - {mso-style-name:"ҳ�� Char"; - mso-style-link:ҳ��; - font-family:����;} + {mso-style-name:"页脚 Char"; + mso-style-link:页脚; + font-family:宋体;} span.Chare - {mso-style-name:"���� Char"; - mso-style-link:����; - font-family:����;} + {mso-style-name:"日期 Char"; + mso-style-link:日期; + font-family:宋体;} span.HTMLChar - {mso-style-name:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char"; - mso-style-link:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3"; - font-family:����;} + {mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char"; + mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3"; + font-family:宋体;} span.Charf - {mso-style-name:"��ע���� Char"; - mso-style-link:��ע����; - font-family:����; + {mso-style-name:"批注主题 Char"; + mso-style-link:批注主题; + font-family:宋体; font-weight:bold;} span.Charf0 - {mso-style-name:"��ע���ı� Char"; - mso-style-link:��ע���ı�; - font-family:����;} + {mso-style-name:"批注框文本 Char"; + mso-style-link:批注框文本; + font-family:宋体;} .MsoChpDefault {font-size:10.0pt;} /* Page Definitions */ @@ -1825,7 +1825,7 @@ ul/*
-* asm.s�����а����ֵ�Ӳ�����ϣ�������������ĵײ�δ��롣ҳ�쳣���ڴ��������
+* asm.s程序中包括大部分的硬件故障(或出错)处理的底层次代码。页异常由内存管理程序
-* mm���������Բ�������˳�������ϣ��������������TS-λ����ɵ�fpu�쳣����Ϊ
+* mm处理,所以不在这里。此程序还处理(希望是这样)由于TS-位而造成的fpu异常,因为
-* fpu������ȷ�ؽ��б���/�ָ���������Щ��û�в��Թ���
+* fpu必须正确地进行保存/恢复处理,这些还没有测试过。
*/
13
-# �������ļ���Ҫ�漰��Intel�����ж�int0--int16�Ĵ�����int17-int31�������ʹ�ã���
+# 本代码文件主要涉及对Intel保留中断int0--int16的处理(int17-int31留作今后使用)。
-# ������һЩȫ�ֺ���������������ԭ����traps.c��˵����
+# 以下是一些全局函数名的声明,其原形在traps.c中说明。
14 .globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
@@ -1905,38 +1905,38 @@ lang=EN-US>traps.c��˵����19
-# ������γ����������ŵ������
+# 下面这段程序处理无出错号的情况。
-# int0 -- �������������������� ���ͣ��������ţ��ޡ�
+# int0 -- 处理被零除出错的情况。 类型:错误;出错号:无。
-# ��ִ��DIV��IDIVָ��ʱ����������0��CPU�ͻ��������쳣����EAX����AX��AL������
+# 在执行DIV或IDIV指令时,若除数是0,CPU就会产生这个异常。当EAX(或AX、AL)容纳
-# ����һ���Ϸ��������Ľ��ʱ��Ҳ���������쳣��21�б��'_do_divide_error'ʵ������
+# 不了一个合法除操作的结果时,也会产生这个异常。21行标号'_do_divide_error'实际上是
-# C���Ժ���do_divide_error()�����������ģ���ж�Ӧ�����ơ�����'do_divide_error'��
+# C语言函数do_divide_error()编译后所生成模块中对应的名称。函数'do_divide_error'在
-# traps.c��ʵ�֣���101�п�ʼ����
+# traps.c中实现(第101行开始)。
20 _divide_error:
21 -pushl $_do_divide_error # ���Ȱѽ�Ҫ���õĺ�����ַ��ջ��
+pushl $_do_divide_error # 首先把将要调用的函数地址入栈。22 no_error_code: -# �����������Ŵ�������ڴ����������56�еȡ�
+# 这里是无出错号处理的入口处,见下面第56行等。23 -xchgl %eax,(%esp) # _do_divide_error�ĵ�ַ -�� eax��eax��������ջ��
+xchgl %eax,(%esp) # _do_divide_error的地址 +è eax,eax被交换入栈。24 pushl %ebx
@@ -1958,7 +1958,7 @@ pushl %ebp30 push %ds -# ����16λ�ĶμĴ�����ջ��ҲҪռ��4���ֽڡ�
+# !!16位的段寄存器入栈后也要占用4个字节。31 push %es
@@ -1968,19 +1968,19 @@ push %fs33 pushl $0 -# "error code" # ����ֵ0��Ϊ��������ջ��
+# "error code" # 将数值0作为出错码入栈。34 -lea 44(%esp),%edx # ȡ��Ч��ַ����ջ��ԭ���÷��ص�ַ����ջָ��λ�ã�
+lea 44(%esp),%edx # 取有效地址,即栈中原调用返回地址处的栈指针位置,35 pushl %edx -# ��ѹ���ջ��
+# 并压入堆栈。36 movl $0x10,%edx # -��ʼ���μĴ���ds��es��fs�������ں����ݶ�ѡ�����
+初始化段寄存器ds、es和fs,加载内核数据段选择符。37 mov %dx,%ds
@@ -1991,16 +1991,16 @@ mov %dx,%es39 mov %dx,%fs
-# �����ϵ�'*'�ű�ʾ���ò�����ָ����ַ���ĺ�������Ϊ��ӵ��á����ĺ����ǵ������𱾴�
+# 下行上的'*'号表示调用操作数指定地址处的函数,称为间接调用。这句的含义是调用引起本次
-# �쳣��C��������������do_divide_error()�ȡ���41���ǽ���ջָ���8�൱��ִ������pop
+# 异常的C处理函数,例如do_divide_error()等。第41行是将堆栈指针加8相当于执行两次pop
-# ������������������������ջ������C����������33�к�35����ջ��ֵ�����ö�ջָ������
+# 操作,弹出(丢弃)最后入堆栈的两个C函数参数(33行和35行入栈的值),让堆栈指针重新
-# ָ��Ĵ���fs��ջ����
+# 指向寄存器fs入栈处。
40 call *%eax
@@ -2037,45 +2037,45 @@ popl %ebx51 popl %eax - # ����ԭ��eax�е����ݡ�
+ # 弹出原来eax中的内容。52 iret
53
-# int1 -- debug�����ж���ڵ㡣��������ͬ�ϡ����ͣ�����/���壨Fault/Trap��������š�
+# int1 -- debug调试中断入口点。处理过程同上。类型:错误/陷阱(Fault/Trap);无错误号。
-# ��eflags��TF��־��λʱ���������жϡ�������Ӳ���ϵ㣨���ݣ����壬���룺��������
+# 当eflags中TF标志置位时而引发的中断。当发现硬件断点(数据:陷阱,代码:错误);或者
-# ������ָ�����������������壬���ߵ��ԼĴ���������Ч������CPU�ͻ�������쳣��
+# 开启了指令跟踪陷阱或任务交换陷阱,或者调试寄存器访问无效(错误),CPU就会产生该异常。
54 _debug:
55 pushl $_do_int3 # _do_debug # -C����ָ����ջ������ͬ��
+C函数指针入栈。以下同。56 jmp no_error_code
57
-# int2 -- �������жϵ�����ڵ㡣 ���ͣ����壻����š�
+# int2 -- 非屏蔽中断调用入口点。 类型:陷阱;无错误号。
-# ���ǽ��еı�����̶��ж�������Ӳ���жϡ�ÿ�����յ�һ��NMI�źţ�CPU�ڲ��ͻ�����ж�
+# 这是仅有的被赋予固定中断向量的硬件中断。每当接收到一个NMI信号,CPU内部就会产生中断
-# ����2����ִ�б��ж�Ӧ�����ڣ���˺ܽ�ʡʱ�䡣NMIͨ������Ϊ��Ϊ��Ҫ��Ӳ���¼�ʹ�á�
+# 向量2,并执行标准中断应答周期,因此很节省时间。NMI通常保留为极为重要的硬件事件使用。
-# ��CPU�յ�һ�� NMI �źŲ��ҿ�ʼִ�����жϴ�������ʱ��������е�Ӳ���ж϶��������ԡ�
+# 当CPU收到一个 NMI 信号并且开始执行其中断处理过程时,随后所有的硬件中断都将被忽略。
58 _nmi:
@@ -2088,13 +2088,13 @@ jmp no_error_code61
-# int3 -- �ϵ�ָ�������жϵ���ڵ㡣 ���ͣ����壻����š�
+# int3 -- 断点指令引起中断的入口点。 类型:陷阱;无错误号。
-# ��int 3 -ָ���������жϣ���Ӳ���ж��ء���ָ��ͨ���ɵ�ʽ�����뱻��ʽ����Ĵ����С�
+# 由int 3 +指令引发的中断,与硬件中断无关。该指令通常由调式器插入被调式程序的代码中。
-# ��������ͬ_debug��
+# 处理过程同_debug。
62 _int3:
@@ -2107,11 +2107,11 @@ jmp no_error_code65
-# int4 -- ������������ж���ڵ㡣 ���ͣ����壻����š�
+# int4 -- 溢出出错处理中断入口点。 类型:陷阱;无错误号。
-# EFLAGS��OF��־��λʱCPUִ��INTOָ��ͻ��������жϡ�ͨ�����ڱ����������������������
+# EFLAGS中OF标志置位时CPU执行INTO指令就会引发该中断。通常用于编译器跟踪算术计算溢出。
66 _overflow:
@@ -2124,14 +2124,14 @@ jmp no_error_code69
-# int5 -- �߽�������ж���ڵ㡣 ���ͣ���������š�
+# int5 -- 边界检查出错中断入口点。 类型:错误;无错误号。
-# ������������Ч��Χ����ʱ�������жϡ���BOUNDָ�����ʧ�ܾͻ�������жϡ�BOUNDָ����
+# 当操作数在有效范围以外时引发的中断。当BOUND指令测试失败就会产生该中断。BOUND指令有
-# 3���������������1��������������֮�䣬�Ͳ����쳣5��
+# 3个操作数,如果第1个不在另外两个之间,就产生异常5。
70 _bounds:
@@ -2144,10 +2144,10 @@ jmp no_error_code73
-# int6 -- ��Ч����ָ������ж���ڵ㡣 ���ͣ���������š�
+# int6 -- 无效操作指令出错中断入口点。 类型:错误;无错误号。
-# CPU ִ�л�����һ����Ч�IJ������������жϡ�
+# CPU 执行机构检测到一个无效的操作码而引起的中断。
74 _invalid_op:
@@ -2160,12 +2160,12 @@ jmp no_error_code77
-# int9 -- Э�������γ��������ж���ڵ㡣 ���ͣ�����������š�
+# int9 -- 协处理器段超出出错中断入口点。 类型:放弃;无错误号。
-# ���쳣�����ϵ�ͬ��Э������������������Ϊ�ڸ���ָ�������̫��ʱ�����Ǿ������������
+# 该异常基本上等同于协处理器出错保护。因为在浮点指令操作数太大时,我们就有这个机会来
-# ���ػ泬�����ݶεĸ���ֵ��
+# 加载或保存超出数据段的浮点值。
78 _coprocessor_segment_overrun:
@@ -2178,8 +2178,8 @@ jmp no_error_code81
-# int15 �C ����Intel�����жϵ���ڵ㡣
+# int15 – 其他Intel保留中断的入口点。
82 _reserved:
@@ -2192,21 +2192,21 @@ jmp no_error_code85
-# int45 -- (0x20 + 13) Linux���õ���ѧЭ������Ӳ���жϡ�
+# int45 -- (0x20 + 13) Linux设置的数学协处理器硬件中断。
-# ��Э������ִ����һ������ʱ�ͻᷢ��IRQ13�ж��źţ���֪ͨCPU������ɡ�80387��ִ��
+# 当协处理器执行完一个操作时就会发出IRQ13中断信号,以通知CPU操作完成。80387在执行
-# ����ʱ��CPU��ȴ��������ɡ�����89����0xF0��Э�����˿ڣ�������æ��������ͨ��д
+# 计算时,CPU会等待其操作完成。下面89行上0xF0是协处理端口,用于清忙锁存器。通过写
-# �ö˿ڣ����жϽ�����CPU��BUSY�����źţ������¼���80387�Ĵ�������չ��������PEREQ��
+# 该端口,本中断将消除CPU的BUSY延续信号,并重新激活80387的处理器扩展请求引脚PEREQ。
-# �ò�����Ҫ��Ϊ��ȷ���ڼ���ִ��80387���κ�ָ��֮ǰ��CPU��Ӧ���жϡ�
+# 该操作主要是为了确保在继续执行80387的任何指令之前,CPU响应本中断。
86 _irq13:
@@ -2225,58 +2225,58 @@ movb $0x20,%al91 outb %al,$0x20 # -��8259���жϿ���оƬ����EOI���жϽ������źš�
+向8259主中断控制芯片发送EOI(中断结束)信号。92 -jmp 1f # ��������תָ������ʱ���á�
+jmp 1f # 这两个跳转指令起延时作用。93 1: jmp 1f
94 1: outb %al,$0xA0 -# ����8259���жϿ���оƬ����EOI���жϽ������źš�
+# 再向8259从中断控制芯片发送EOI(中断结束)信号。95 popl %eax
96 -jmp _coprocessor_error # �ú���ԭ�ڱ������У����ѷŵ�system_call.s�С�
+jmp _coprocessor_error # 该函数原在本程序中,现已放到system_call.s中。97
-# �����ж��ڵ���ʱCPU�����жϷ��ص�ַ֮������ѹ���ջ����˷���ʱҲ��Ҫ��������
+# 以下中断在调用时CPU会在中断返回地址之后将出错号压入堆栈,因此返回时也需要将出错号
-# �������μ�ͼ5.3(b)����
+# 弹出(参见图5.3(b))。
-
# int8 -- ˫�������ϡ� ���ͣ��������д����롣
+# int8 -- 双出错故障。 类型:放弃;有错误码。
-# ͨ����CPU�ڵ���ǰһ���쳣�Ĵ���������ּ�һ���µ��쳣ʱ���������쳣�ᱻ���еؽ���
+# 通常当CPU在调用前一个异常的处理程序而又检测到一个新的异常时,这两个异常会被串行地进行
-# ��������Ҳ���������ٵ������CPU���ܽ��������Ĵ��д�����������ʱ�ͻ��������жϡ�
+# 处理,但也会碰到很少的情况,CPU不能进行这样的串行处理操作,此时就会引发该中断。
98 _double_fault:
99 -pushl $_do_double_fault # C������ַ��ջ��
+pushl $_do_double_fault # C函数地址入栈。100 error_code:
101 xchgl %eax,4(%esp) -# error code <-> %eax��eaxԭ����ֵ�������ڶ�ջ�ϡ�
+# error code <-> %eax,eax原来的值被保存在堆栈上。102 xchgl %ebx,(%esp) -# &function <-> %ebx��ebxԭ����ֵ�������ڶ�ջ�ϡ�
+# &function <-> %ebx,ebx原来的值被保存在堆栈上。103 pushl %ecx
@@ -2304,18 +2304,18 @@ lang=EN-US> push %fs111 pushl %eax -# error code # ��������ջ��
+# error code # 出错号入栈。112 lea 44(%esp),%eax -# offset # ���ص�ַ����ջָ��λ��ֵ��ջ��
+# offset # 程序返回地址处堆栈指针位置值入栈。113 pushl %eax
114 movl $0x10,%eax - # ���ں����ݶ�ѡ�����
+ # 置内核数据段选择符。115 mov %ax,%ds
@@ -2328,12 +2328,12 @@ lang=EN-US> mov %ax,%fs118 call *%ebx - # ��ӵ��ã�������Ӧ��C���������������ջ��
+ # 间接调用,调用相应的C函数,其参数已入栈。119 addl $8,%esp - # ������ջ��2������C�����IJ�����
+ # 丢弃入栈的2个用作C函数的参数。120 pop %fs
@@ -2371,16 +2371,16 @@ lang=EN-US> iret131
-# int10 -- ��Ч������״̬��(TSS)�� ���ͣ������г����롣
+# int10 -- 无效的任务状态段(TSS)。 类型:错误;有出错码。
-# CPU��ͼ�л���һ�����̣����ý��̵�TSS��Ч������TSS����һ�����������쳣�������� # CPU企图切换到一个进程,而该进程的TSS无效。根据TSS中哪一部分引起了异常,当由于TSS
-# ���ȳ���104�ֽ�ʱ������쳣�ڵ�ǰ�����в���������л�����ֹ������������ᵼ�����л�
+# 长度超过104字节时,这个异常在当前任务中产生,因而切换被终止。其他问题则会导致在切换
-# ����������в������쳣��
+# 后的新任务中产生本异常。
132 _invalid_TSS:
@@ -2395,10 +2395,10 @@ lang=EN-US> jmp error_code135 -# int11 -- �β����ڡ� ���ͣ������г����롣
+# int11 -- 段不存在。 类型:错误;有出错码。
-# �����õĶβ����ڴ��С����������б�־ָ���β����ڴ��С�
+# 被引用的段不在内存中。段描述符中标志指明段不在内存中。
136 _segment_not_present:
@@ -2413,13 +2413,13 @@ lang=EN-US> jmp error_code139 -# int12 -- ��ջ�δ��� ���ͣ������г����롣
+# int12 -- 堆栈段错误。 类型:错误;有出错码。
-# ָ�������ͼ������ջ�η�Χ�����߶�ջ�β����ڴ��С������쳣11��13����������Щ����
+# 指令操作试图超出堆栈段范围,或者堆栈段不在内存中。这是异常11和13的特例。有些操作
-# ϵͳ������������쳣��ȷ��ʲôʱ��Ӧ��Ϊ�����������ջ�ռ䡣
+# 系统可以利用这个异常来确定什么时候应该为程序分配更多的栈空间。
140 _stack_segment:
@@ -2434,13 +2434,13 @@ lang=EN-US> jmp error_code143 -# int13 -- һ�㱣���Գ����� ���ͣ������г����롣
+# int13 -- 一般保护性出错。 类型:错误;有出错码。
-# �����Dz������κ�������Ĵ�����һ���쳣����ʱû�ж�Ӧ�Ĵ���������0--16����ͨ����
+# 表明是不属于任何其他类的错误。若一个异常产生时没有对应的处理向量(0--16),通常就
-# ��鵽���ࡣ
+# 会归到此类。
144 _general_protection:
@@ -2455,10 +2455,10 @@ lang=EN-US> jmp error_code147 -# int17 -- �߽�����������
+# int17 -- 边界对齐检查出错。
-# ���������ڴ�߽���ʱ������Ȩ��3���û��������ݷDZ߽����ʱ��������쳣��
+# 在启用了内存边界检查时,若特权级3(用户级)数据非边界对齐时会产生该异常。
148 _alignment_check:
@@ -2473,25 +2473,25 @@ lang=EN-US> jmp error_code151 -# int7 -- �豸�����ڣ�_device_not_available����kernel/sys_call.s��158�С�
+# int7 -- 设备不存在(_device_not_available)在kernel/sys_call.s,158行。
-# int14 -- ҳ����_page_fault����mm/page.s��14�С�
+# int14 -- 页错误(_page_fault)在mm/page.s,14行。
-# int16 -- ����������_coprocessor_error����kernel/sys_call.s��140��
+# int16 -- 协处理器错误(_coprocessor_error)在kernel/sys_call.s,140行。
-# ʱ���ж�int -0x20��_timer_interrupt����kernel/sys_call.s��189�С�
+# 时钟中断int +0x20(_timer_interrupt)在kernel/sys_call.s,189行。
-# ϵͳ����int -0x80��_system_call����kernel/sys_call.s��84�С�
+# 系统调用int +0x80(_system_call)在kernel/sys_call.s,84行。
����程序8-10 linux/kernel/vsprintf.c
10 */
-// Lars Wirzenius��Linus�ĺ��ѣ���Helsinki��ѧʱ��ͬ��һ��칫�ҡ���1991���ļ����� // Lars Wirzenius是Linus的好友,在Helsinki大学时曾同处一间办公室。在1991年夏季开发Linux
// ʱ��Linus��ʱ��C���Ի����Ǻ���Ϥ��������ʹ�ÿɱ�����б��������ܡ����时,Linus当时对C语言还不是很熟悉,还不会使用可变参数列表函数功能。因此Lars Wirzenius
// ��Ϊ����д����������ں���ʾ��Ϣ�Ĵ��롣������(1998��)��������δ�������һ��bug��ֱ��
+style='color:black'>就为他编写了这段用于内核显示信息的代码。他后来(1998年)承认在这段代码中有一个bug,直到// 1994������˷��֣������Ծ��������bug����ʹ��*��Ϊ��������ʱ�����ǵ���ָ�����������
+style='color:black'>年才有人发现,并予以纠正。这个bug是在使用*作为输出域宽度时,忘记递增指针跳过这个星// ���ˡ��ڱ����������bug����Ȼ���ڣ�130�У��� ���ĸ�����ҳ��http://liw.iki.fi/liw/
+style='color:black'>号了。在本代码中这个bug还仍然存在(130行)。 他的个人主页是http://liw.iki.fi/liw/11
12 -#include <stdarg.h> // ������ͷ�ļ����Ժ����ʽ������������б�����Ҫ˵����-��
+#include <stdarg.h> // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个-// ����(va_list)��������(va_start, -va_arg��va_end)������
+// 类型(va_list)和三个宏(va_start, +va_arg和va_end),用于-// vsprintf��vprintf��vfprintf������
+// vsprintf、vprintf、vfprintf函数。13 -#include <string.h> // �ַ���ͷ�ļ�����Ҫ������һЩ�й��ַ���������Ƕ�뺯����
+#include <string.h> // 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。14
15 /* we use this so that we can do without the ctype library */
-/* ����ʹ������Ķ��壬�������ǾͿ��Բ�ʹ��ctype���� */
+/* 我们使用下面的定义,这样我们就可以不使用ctype库了 */
16 #define is_digit(c) -((c) >= '0' && (c) <= '9') // �ж��ַ�c�Ƿ�Ϊ�����ַ���
+((c) >= '0' && (c) <= '9') // 判断字符c是否为数字字符。17
-// �ú������ַ����ִ�ת�������������������ִ�ָ���ָ�룬�����ǽ����ֵ������ָ�뽫ǰ�ơ�
+// 该函数将字符数字串转换成整数。输入是数字串指针的指针,返回是结果数值。另外指针将前移。
18 static int skip_atoi(const char **s)
@@ -1935,36 +1935,36 @@ return i;26
-// ���ﶨ��ת�����͵ĸ��ַ��ų�����
+// 这里定义转换类型的各种符号常数。
27 #define ZEROPAD 1 -/* pad with zero */ /* �����/* pad with zero */ /* 填充零 */
28 #define SIGN 2 -/* unsigned/signed long */ /* ����/���ų�����/* unsigned/signed long */ /* 无符号/符号长整数 */
29 #define PLUS 4 /* show plus */ -/* ��ʾ�� */
+/* 显示加 */30 #define SPACE 8 -/* space if plus */ /* ���Ǽӣ����ÿո�/* space if plus */ /* 如是加,则置空格 */
31 #define LEFT 16 -/* left justified */ /* �����/* left justified */ /* 左调整 */
32 @@ -1976,15 +1976,15 @@ lang=EN-US> */
33 #define SMALL 64 -/* use 'abcdef' instead of 'ABCDEF' */ /* ʹ��Сд��ĸ/* use 'abcdef' instead of 'ABCDEF' */ /* 使用小写字母 */
34
-// �����������룺nΪ��������baseΪ�����������nΪ�̣���������ֵΪ������
+// 除操作。输入:n为被除数,base为除数;结果:n为商,函数返回值为余数。
-// �μ�4.5.3���й�Ƕ�������Ϣ��
+// 参见4.5.3节有关嵌入汇编的信息。
35 #define do_div(n,base) ({ \
@@ -2002,13 +2002,13 @@ __res; })39
-// ������ת��Ϊָ�����Ƶ��ַ�����
+// 将整数转换为指定进制的字符串。
-// ���룺num-������base-���ƣ�size-�ַ������ȣ�precision-���ֳ���(����)��type-����ѡ�
+// 输入:num-整数;base-进制;size-字符串长度;precision-数字长度(精度);type-类型选项。
-// ���������ת�����ַ�����ָ����ַ���ĩ�˺����ָ�롣
+// 输出:数字转换成字符串后指向该字符串末端后面的指针。
40 static char * number(char *
46
-// �������typeָ����Сд��ĸ������Сд��ĸ����
+// 如果类型type指出用小写字母,则定义小写字母集。
-// �������ָ��Ҫ�����������߽磩�������������е������־��
+// 如果类型指出要左调整(靠左边界),则屏蔽类型中的填零标志。
-// ������ƻ���С��2�����36�����˳�������Ҳ��������ֻ�ܴ���������2-32֮�������
+// 如果进制基数小于2或大于36,则退出处理,也即本程序只能处理基数在2-32之间的数。
47 if (type&SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz";
@@ -2050,16 +2050,16 @@ if (base<2 || base>36)50 return 0;
-// �������ָ��Ҫ���㣬�����ַ�����c='0'������c���ڿո��ַ���
+// 如果类型指出要填零,则置字符变量c='0',否则c等于空格字符。
-// �������ָ���Ǵ�������������ֵnumС��0�����÷��ű���sign=���ţ���ʹnumȡ����ֵ��
+// 如果类型指出是带符号数并且数值num小于0,则置符号变量sign=负号,并使num取绝对值。
-// �����������ָ���ǼӺţ�����sign=�Ӻţ����������ʹ��ո��־��sign=�ո�����0��
+// 否则如果类型指出是加号,则置sign=加号,否则若类型带空格标志则sign=空格,否则置0。
51 @@ -2083,12 +2083,12 @@ num = -num;
? '+' : ((type&SPACE) ? ' ' : 0); -// �������ţ������ֵ��1��������ָ��������ת���������ʮ�����ƿ����ټ���2λ(����0x)��
+// 若带符号,则宽度值减1。若类型指出是特殊转换,则对于十六进制宽度再减少2位(用于0x),
-// ���ڰ˽��ƿ��ȼ�1�����ڰ˽���ת�����ǰ��һ���㣩��
+// 对于八进制宽度减1(用于八进制转换结果前放一个零)。
57 if (sign) size--;
@@ -2102,9 +2102,9 @@ if (base==16) size -= 2;60 else if (base==8) size--;
-// �����ֵnumΪ0������ʱ�ַ���='0'��������ݸ����Ļ�������ֵnumת�����ַ���ʽ��
+// 如果数值num为0,则临时字符串='0';否则根据给定的基数将数值num转换成字符形式。
61 i=0;
@@ -2121,9 +2121,9 @@ else while (num!=0)65 tmp[i++]=digits[do_div(num,base)];
-// ����ֵ�ַ��������ھ���ֵ����ֵ��չΪ���ָ���ֵ��
+// 若数值字符个数大于精度值,则精度值扩展为数字个数值。
-// ����ֵsize��ȥ���ڴ����ֵ�ַ��ĸ�����
+// 宽度值size减去用于存放数值字符的个数。
66 if (i>precision) precision=i;
@@ -2133,13 +2133,13 @@ size -= precision;-
// ������������ʼ�γ�����Ҫ��ת�����������ʱ�����ַ���str�С�
+// 从这里真正开始形成所需要的转换结果,并暂时放在字符串str中。
-// ��������û������(ZEROPAD)�����루���������־������str������
+// 若类型中没有填零(ZEROPAD)和左靠齐(左调整)标志,则在str中首先
-// ���ʣ�����ֵָ���Ŀո��������������λ���������š�
+// 填放剩余宽度值指出的空格数。若需带符号位,则存入符号。
68 if (!(type&(ZEROPAD+
72 *str++ = sign;
-// ������ָ��������ת��������ڰ˽���ת�����ͷһλ����һ��'0'��������ʮ����������'0x'��
+// 若类型指出是特殊转换,则对于八进制转换结果头一位放置一个'0';而对于十六进制则存放'0x'。
73 if (type&SPECIAL)
@@ -2176,14 +2176,14 @@ else if (base==16) { *str++ = '0';78 -*str++ = digits[33]; // 'X'��str++ = digits[33]; // 'X'或'x'
79 }
-// ��������û������������룩��־������ʣ������д��c�ַ���'0'��ո���51�С�
+// 若类型中没有左调整(左靠齐)标志,则在剩余宽度中存放c字符('0'或空格),见51行。
80 if (!(type&LEFT))
@@ -2194,9 +2194,9 @@ while(size-->0)82 *str++ = c;
-// ��ʱi������ֵnum�����ָ����������ָ���С�ھ���ֵ����str�з��루����ֵ-i����'0'��
+// 此时i存有数值num的数字个数。若数字个数小于精度值,则str中放入(精度值-i)个'0'。
83 while(i<precision--)
@@ -2204,8 +2204,8 @@ while(i<precision--)84 *str++ = '0';
-// ����ֵת���õ������ַ�����str�С���i����
+// 将数值转换好的数字字符填入str中。共i个。
85 while(i-->0)
@@ -2213,7 +2213,7 @@ while(i-->0)86 *str++ = tmp[i];
-// ������ֵ�Դ����㣬���ʾ���ͱ�־���������־������ʣ������з���ո�
+// 若宽度值仍大于零,则表示类型标志中有左靠齐标志。则在剩余宽度中放入空格。
87 while(size-->0)
@@ -2222,21 +2222,21 @@ while(size-->0) *str++ = ' ';89 -return str; // ����ת���õ�ָ���ַ���ĩ�˺��ָ�롣
+return str; // 返回转换好的指向字符串末端后的指针。90 }
91
-// ���溯������ʽ��������ַ����С�
+// 下面函数是送格式化输出到字符串中。
-// Ϊ�������ں���ʹ�ø�ʽ���������Linus���ں�ʵ���˸�C��������
+// 为了能在内核中使用格式化的输出,Linus在内核实现了该C标准函数。
-// ���в���fmt�Ǹ�ʽ�ַ�����args�Ǹ����仯��ֵ��buf������ַ�����������
+// 其中参数fmt是格式字符串;args是个数变化的值;buf是输出字符串缓冲区。
-// ��μ��������б�����йظ�ʽת���ַ��Ľ��ܡ�
+// 请参见本代码列表后的有关格式转换字符的介绍。
92 int vsprintf(char *
96 char * str; -// ���ڴ��ת�������е��ַ�����
+// 用于存放转换过程中的字符串。97 char *s;
@@ -2270,7 +2270,7 @@ flags; &n101 /* -number()����ʹ�õı�־ */
+number()函数使用的标志 */102 int @@ -2278,7 +2278,7 @@ field_width; /* width of output field */
- /* ����ֶο���*/
+ /* 输出字段宽度*/103 int @@ -2290,7 +2290,7 @@ lang=EN-US> &n of chars for from string */
-/* min. �������ָ�����max. �ַ������ַ����� */
+/* min. 整数数字个数;max. 字符串中字符个数 */105 int
@@ -2299,21 +2299,21 @@ qualifier; /* 'h',
106 /*
-'h', 'l',��'L'���������ֶ� */
// ���Ƚ��ַ�ָ��ָ��buf��Ȼ��ɨ���ʽ�ַ������Ը�����ʽת��ָʾ������Ӧ�Ĵ�����
+// 首先将字符指针指向buf,然后扫描格式字符串,对各个格式转换指示进行相应的处理。
107 for (str=buf ; *fmt ; ++fmt) {
-// ��ʽת��ָʾ�ַ�������'%'��ʼ�������fmt��ʽ�ַ�����ɨ��'%'��Ѱ�Ҹ�ʽת���ַ����Ŀ�ʼ��
+// 格式转换指示字符串均以'%'开始,这里从fmt格式字符串中扫描'%',寻找格式转换字符串的开始。
-// ���Ǹ�ʽָʾ��һ���ַ��������δ���str��
+// 不是格式指示的一般字符均被依次存入str。
108 @@ -2334,8 +2334,8 @@ lang=EN-US> &n lang=EN-US>
-// ����ȡ�ø�ʽָʾ�ַ����еı�־������־��������flags�����С�
+// 下面取得格式指示字符串中的标志域,并将标志常量放入flags变量中。
113 @@ -2361,27 +2361,27 @@ switch (*fmt) {
118 case '-': flags |= LEFT; goto -repeat; // ���������
+repeat; // 左靠齐调整。119 case '+': flags |= PLUS; goto -repeat; // �żӺš�
+repeat; // 放加号。120 case ' ': flags |= SPACE; goto -repeat; // �ſո�
+repeat; // 放空格。121 case '#': flags |= SPECIAL; goto -repeat; // ������ת����
+repeat; // 是特殊转换。122 case '': flags |= ZEROPAD; goto -repeat; // Ҫ����(��'0')��
+repeat; // 要填零(即'0')。123 @@ -2391,16 +2391,16 @@ lang=EN-US> &nb lang=EN-US>
-// ȡ��ǰ�����ֶο�����ֵ������field_width�����С����������������ֵ��ֱ��ȡ��Ϊ����ֵ��
+// 取当前参数字段宽度域值,放入field_width变量中。如果宽度域中是数值则直接取其为宽度值。
-// ��������������ַ�'*'����ʾ��һ������ָ�����ȡ���˵���va_argȡ����ֵ������ʱ����ֵ
+// 如果宽度域中是字符'*',表示下一个参数指定宽度。因此调用va_arg取宽度值。若此时宽度值
-// С��0����ø�����ʾ����б�־��'-'��־�����룩����˻����ڱ�־����������ñ�־����
+// 小于0,则该负数表示其带有标志域'-'标志(左靠齐),因此还需在标志变量中添入该标志,并
-// ���ֶο���ֵȡΪ�����ֵ��
+// 将字段宽度值取为其绝对值。
125 @@ -2424,8 +2424,8 @@ else if (*fmt == '*') {
130 -/* it's the next argument */ // �����и�bug��Ӧ����++fmt;
+/* it's the next argument */ // 这里有个bug,应插入++fmt;131
@@ -2454,16 +2454,16 @@ lang=EN-US> &nb
137 // ������δ��룬ȡ��ʽת�����ľ���������precision�����С�������ʼ�ı�־��'.'�� // 下面这段代码,取格式转换串的精度域,并放入precision变量中。精度域开始的标志是'.'。 // �䴦���������������������ơ����������������ֵ��ֱ��ȡ��Ϊ����ֵ��������������� // 其处理过程与上面宽度域的类似。如果精度域中是数值则直接取其为精度值。如果精度域中是 // �ַ�'*'����ʾ��һ������ָ�����ȡ���˵���va_argȡ����ֵ������ʱ����ֵС��0���� // 字符'*',表示下一个参数指定精度。因此调用va_arg取精度值。若此时宽度值小于0,则将 // �ֶξ���ֵȡΪ0�� // 字段精度值取为0。 138 /*
@@ -2495,7 +2495,7 @@ else if (*fmt == '*') { 145
-/* it's the next argument */ // ͬ������ҲӦ����/* it's the next argument */ // 同上这里也应插入++fmt; 146 &nb
151 // ������δ�������������η������������qualifer��������h,l,L�ĺ���μ��б����˵������ // 下面这段代码分析长度修饰符,并将其存入qualifer变量。(h,l,L的含义参见列表后的说明)。 152
@@ -2551,20 +2551,20 @@ lang=EN-US> &nb
158 // �������ת��ָʾ���� // 下面分析转换指示符。 159
switch (*fmt) { // ���ת��ָʾ����'c'�����ʾ��Ӧ����Ӧ���ַ�����ʱ�����־������������룬����ֶ�ǰ�� // 如果转换指示符是'c',则表示对应参数应是字符。此时如果标志域表明不是左靠齐,则该字段前面 // ����'������ֵ-1'���ո��ַ���Ȼ���ٷ�������ַ��������������0�����ʾΪ���룬���� // 放入'宽度域值-1'个空格字符,然后再放入参数字符。如果宽度域还大于0,则表示为左靠齐,则在 // �����ַ���������'����ֵ-1'���ո��ַ��� // 参数字符后面添加'宽度值-1'个空格字符。 160
@@ -2602,18 +2602,18 @@ break; 168 // ���ת��ָʾ����'s'�����ʾ��Ӧ�������ַ���������ȡ�����ַ����ij��ȣ����䳬���˾�����ֵ�� // 如果转换指示符是's',则表示对应参数是字符串。首先取参数字符串的长度,若其超过了精度域值, // ����չ������=�ַ������ȡ���ʱ�����־������������룬����ֶ�ǰ����'����ֵ-�ַ�������' // 则扩展精度域=字符串长度。此时如果标志域表明不是左靠齐,则该字段前放入'宽度值-字符串长度' // ���ո��ַ���Ȼ���ٷ�������ַ����������������0�����ʾΪ���룬���ڲ����ַ������� // 个空格字符。然后再放入参数字符串。如果宽度域还大于0,则表示为左靠齐,则在参数字符串后面 // ����'����ֵ-�ַ�������'���ո��ַ��� // 添加'宽度值-字符串长度'个空格字符。 169
@@ -2681,8 +2681,8 @@ break; 185 // �����ʽת������'o'����ʾ�轫��Ӧ�IJ���ת���ɰ˽��������ַ���������number()���������� // 如果格式转换符是'o',表示需将对应的参数转换成八进制数的字符串。调用number()函数处理。 186
@@ -2705,11 +2705,11 @@ break; 190 // �����ʽת������'p'����ʾ��Ӧ������һ��ָ�����͡���ʱ���ò���û�����ÿ�������Ĭ�Ͽ��� // 如果格式转换符是'p',表示对应参数是一个指针类型。此时若该参数没有设置宽度域,则默认宽度 // Ϊ8��������Ҫ���㡣Ȼ�����number()�������д����� // 为8,并且需要添零。然后调用number()函数进行处理。 191
@@ -2752,9 +2752,9 @@ break; 200 // ����ʽת��ָʾ��'x'��'X'�����ʾ��Ӧ������Ҫ��ӡ��ʮ�������������'x'��ʾ��Сд��ĸ��ʾ�� // 若格式转换指示是'x'或'X',则表示对应参数需要打印成十六进制数输出。'x'表示用小写字母表示。 201
@@ -2785,12 +2785,12 @@ break; 207 // �����ʽת���ַ���'d','i'��'u'�����ʾ��Ӧ������������'d', 'i'�������������������Ҫ���� // 如果格式转换字符是'd','i'或'u',则表示对应参数是整数,'d', 'i'代表符号整数,因此需要加上 // �����ű�־��'u'�������������� // 带符号标志。'u'代表无符号整数。 208
@@ -2825,10 +2825,10 @@ break; 215 // ����ʽת��ָʾ����'n'�����ʾҪ�ѵ�ĿǰΪֹת������ַ������浽��Ӧ����ָ��ָ����λ���С� // 若格式转换指示符是'n',则表示要把到目前为止转换输出字符数保存到对应参数指针指定的位置中。 // ��������va_arg()ȡ�øò���ָ�룬Ȼ���Ѿ�ת���õ��ַ��������ָ����ָ��λ�á� // 首先利用va_arg()取得该参数指针,然后将已经转换好的字符数存入该指针所指的位置。 216
@@ -2849,13 +2849,13 @@ break; 220 // ����ʽת��������'%'�����ʾ��ʽ�ַ����д���ֱ�ӽ�һ��'%'д��������С� // 若格式转换符不是'%',则表示格式字符串有错,直接将一个'%'写入输出串中。 // �����ʽת������λ�ô������ַ�����Ҳֱ�ӽ����ַ�д��������У������ص�107�м������� // 如果格式转换符的位置处还有字符,则也直接将该字符写入输出串中,并返回到107行继续处理 // ��ʽ�ַ����������ʾ�Ѿ���������ʽ�ַ����Ľ�β�������˳�ѭ���� // 格式字符串。否则表示已经处理到格式字符串的结尾处,则退出循环。 221
@@ -2899,12 +2899,12 @@ lang=EN-US> } 231 *str = '\0';
-// �����ת���õ��ַ�����β������null�� 232 return str-buf;
-// ����ת���õ��ַ�������ֵ�� 233 } ����程序8-11 linux/kernel/printk.c /* * �������ں�ģʽʱ�����Dz���ʹ��printf����Ϊ�Ĵ���fsָ������������Ȥ * 当处于内核模式时,我们不能使用printf,因为寄存器fs指向其他不感兴趣 * �ĵط����Լ�����һ��printf����ʹ��ǰ����fs��һ�оͽ���ˡ� * 的地方。自己编制一个printf并在使用前保存fs,一切就解决了。 */ // ������ͷ�ļ����Ժ����ʽ������������б�����Ҫ˵����-������(va_list)�������� // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个类型(va_list)和三个宏 // va_start��va_arg��va_end������vsprintf��vprintf��vfprintf������ // va_start、va_arg和va_end,用于vsprintf、vprintf、vfprintf函数。 12
#include <stdarg.h> 13
-#include <stddef.h> // ������ͷ�ļ���������NULL, offsetof(TYPE, MEMBER)�� 14 15
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 16 17
static char buf[1024];
-// ��ʾ����ʱ�������� 18 // ����vsprintf()������linux/kernel/vsprintf.c��92�п�ʼ���� // 函数vsprintf()定义在linux/kernel/vsprintf.c中92行开始处。 19
extern int vsprintf(char * va_list args); 20 // �ں�ʹ�õ���ʾ������ // 内核使用的显示函数。 21 int
printk(const char *fmt, ...) 23
va_list args;
-// va_listʵ������һ���ַ�ָ�����͡� 24
int i; 25 // ���в���������ʼ������Ȼ��ʹ�ø�ʽ��fmt�������б�args�����buf�С�����ֵ // 运行参数处理开始函数。然后使用格式串fmt将参数列表args输出到buf中。返回值i // ��������ַ����ij��ȡ������в����������������������ÿ���̨��ʾ������������ʾ // 等于输出字符串的长度。再运行参数处理结束函数。最后调用控制台显示函数并返回显示 // �ַ����� // 字符数。 26
va_start(args, fmt); 29
console_print(buf);
-// chr_drv/console.c����995�п�ʼ�� 30
return i; ����程序8-12 linux/kernel/panic.c /* * �ú����������ں���ʹ�ã������� ͷ�ļ�*.h, �ڴ��������mm���ļ�ϵͳfs�У��� * 该函数在整个内核中使用(包括在 头文件*.h, 内存管理程序mm和文件系统fs中), * ����ָ����Ҫ�ij������⡣ * 用以指出主要的出错问题。 */ 11
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 12
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct����ʼ����0�����ݣ�
-// ����һЩ�й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������䡣 13 14
void sys_sync(void); /*
-it's really int */ /* ʵ����������int
+it's really int */ /* 实际上是整型int
(fs/buffer.c,44) */ 15 // �ú���������ʾ�ں��г��ֵ��ش������Ϣ���������ļ�ϵͳͬ��������Ȼ�������ѭ��--������ // 该函数用来显示内核中出现的重大错误信息,并运行文件系统同步函数,然后进入死循环--死机。 // �����ǰ����������0�Ļ�����˵���ǽ���������������һ�û�������ļ�ϵͳͬ�������� // 如果当前进程是任务0的话,还说明是交换任务出错,并且还没有运行文件系统同步函数。 // ������ǰ�Ĺؼ���volatile���ڸ��߱�����gcc�ú������᷵�ء���������gcc��������һЩ�� // 函数名前的关键字volatile用于告诉编译器gcc该函数不会返回。这样可让gcc产生更好一些的 // ���룬����Ҫ����ʹ������ؼ��ֿ��Ա������ijЩ��δ��ʼ�������ģ��پ�����Ϣ�� // 代码,更重要的是使用这个关键字可以避免产生某些(未初始化变量的)假警告信息。 // ��ͬ������gcc�ĺ�������˵���� // 等同于现在gcc的函数属性说明:void panic(const char *s) __attribute__ ((noreturn)); 16
diff --git a/Book-Lite/code-list/html/P8-2.html b/Book-Lite/code-list/html/P8-2.html
index f8f45b9..58f6eef 100644
--- a/Book-Lite/code-list/html/P8-2.html
+++ b/Book-Lite/code-list/html/P8-2.html
@@ -11,24 +11,24 @@
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
- {font-family:����;
+ {font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����С���μ���;}
+ {font-family:方正小标宋简体;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:"\@����С���μ���";}
+ {font-family:"\@方正小标宋简体";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
@@ -36,9 +36,9 @@
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
h1
- {mso-style-link:"���� 1 Char";
+ {mso-style-link:"标题 1 Char";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -50,7 +50,7 @@ h1
font-family:"Times New Roman","serif";
font-weight:bold;}
h2
- {mso-style-link:"���� 2 Char";
+ {mso-style-link:"标题 2 Char";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -63,7 +63,7 @@ h2
font-family:"Arial","sans-serif";
font-weight:bold;}
h3
- {mso-style-link:"���� 3 Char";
+ {mso-style-link:"标题 3 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -74,7 +74,7 @@ h3
font-family:"Arial","sans-serif";
font-weight:bold;}
h4
- {mso-style-link:"���� 4 Char";
+ {mso-style-link:"标题 4 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -88,7 +88,7 @@ h4
font-family:"Arial","sans-serif";
font-weight:bold;}
h5
- {mso-style-link:"���� 5 Char";
+ {mso-style-link:"标题 5 Char";
margin-top:14.0pt;
margin-right:0cm;
margin-bottom:14.5pt;
@@ -102,7 +102,7 @@ h5
font-family:"Times New Roman","serif";
font-weight:bold;}
h6
- {mso-style-link:"���� 6 Char";
+ {mso-style-link:"标题 6 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -116,7 +116,7 @@ h6
font-family:"Arial","sans-serif";
font-weight:bold;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
- {mso-style-link:"���� 7 Char";
+ {mso-style-link:"标题 7 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -130,7 +130,7 @@ p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
- {mso-style-link:"���� 8 Char";
+ {mso-style-link:"标题 8 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -143,7 +143,7 @@ p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
font-size:12.0pt;
font-family:"Arial","sans-serif";}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
- {mso-style-link:"���� 9 Char";
+ {mso-style-link:"标题 9 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -331,20 +331,20 @@ p.MsoToc9, li.MsoToc9, div.MsoToc9
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
- {mso-style-link:"��ע�ı� Char";
+ {mso-style-link:"脚注文本 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoHeader, li.MsoHeader, div.MsoHeader
- {mso-style-link:"ҳü Char";
+ {mso-style-link:"页眉 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -354,14 +354,14 @@ p.MsoHeader, li.MsoHeader, div.MsoHeader
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFooter, li.MsoFooter, div.MsoFooter
- {mso-style-link:"ҳ�� Char";
+ {mso-style-link:"页脚 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
- {mso-style-name:"��������\,������Ŀ\,������Ŀ1\,������Ŀ2";
+ {mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -412,7 +412,7 @@ p.MsoList4, li.MsoList4, div.MsoList4
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoDate, li.MsoDate, div.MsoDate
- {mso-style-link:"���� Char";
+ {mso-style-link:"日期 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -423,36 +423,36 @@ p.MsoDate, li.MsoDate, div.MsoDate
font-size:10.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
- {mso-style-name:"������\,��������";
+ {mso-style-name:"超链接\,超级链接";
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
- {mso-style-name:"��ͨ\(��վ\)\,��ͨ \(Web\)\,��ͨ \(Web\)1\,��ͨ \(Web\)2\,��ͨ \(Web\)3";
+ {mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3";
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
pre
- {mso-style-name:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- mso-style-link:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
+ {mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
tt
- {font-family:����;}
+ {font-family:黑体;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
- {mso-style-link:"��ע���ı� Char";
+ {mso-style-link:"批注框文本 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -460,7 +460,7 @@ p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.1, li.1, div.1
- {mso-style-name:��ʽ1;
+ {mso-style-name:样式1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -471,30 +471,30 @@ p.1, li.1, div.1
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a, li.a, div.a
- {mso-style-name:�������;
- mso-style-link:"������� Char";
+ {mso-style-name:代码程序;
+ mso-style-link:"代码程序 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.Char
- {mso-style-name:"������� Char";
- mso-style-link:�������;
- font-family:����;}
+ {mso-style-name:"代码程序 Char";
+ mso-style-link:代码程序;
+ font-family:宋体;}
p.a0, li.a0, div.a0
- {mso-style-name:ͼ˵��;
- mso-style-link:"ͼ˵�� Char";
+ {mso-style-name:图说明;
+ mso-style-link:"图说明 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char0
- {mso-style-name:"ͼ˵�� Char";
- mso-style-link:ͼ˵��;
- font-family:����;}
+ {mso-style-name:"图说明 Char";
+ mso-style-link:图说明;
+ font-family:宋体;}
p.0, li.0, div.0
- {mso-style-name:����0;
+ {mso-style-name:封面0;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -502,7 +502,7 @@ p.0, li.0, div.0
font-family:"Times New Roman","serif";
font-weight:bold;}
p.10, li.10, div.10
- {mso-style-name:����1;
+ {mso-style-name:封面1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -510,25 +510,25 @@ p.10, li.10, div.10
font-family:"Times New Roman","serif";
font-weight:bold;}
p.11, li.11, div.11
- {mso-style-name:�DZ���1;
+ {mso-style-name:非标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.a1, li.a1, div.a1
- {mso-style-name:�ı�����;
+ {mso-style-name:文本居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharChar, li.3CharChar, div.3CharChar
- {mso-style-name:"ͼ������3 Char Char";
- mso-style-link:"ͼ������3 Char Char Char";
+ {mso-style-name:"图中文字3 Char Char";
+ mso-style-link:"图中文字3 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -536,11 +536,11 @@ p.3CharChar, li.3CharChar, div.3CharChar
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharChar
- {mso-style-name:"ͼ������3 Char Char Char";
- mso-style-link:"ͼ������3 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char";
+ mso-style-link:"图中文字3 Char Char";
+ font-family:宋体;}
p.post, li.post, div.post
- {mso-style-name:�ʼ�post;
+ {mso-style-name:邮件post;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
@@ -548,7 +548,7 @@ p.post, li.post, div.post
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3, li.3, div.3
- {mso-style-name:ͼ������3;
+ {mso-style-name:图中字体3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -556,44 +556,44 @@ p.3, li.3, div.3
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar1CharCharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char Char";
+ font-family:宋体;}
span.3CharChar1CharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char";
+ font-family:宋体;}
p.5Char, li.5Char, div.5Char
- {mso-style-name:"ͼ������5�� Char";
- mso-style-link:"ͼ������5�� Char Char";
+ {mso-style-name:"图中文字5号 Char";
+ mso-style-link:"图中文字5号 Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.5CharChar
- {mso-style-name:"ͼ������5�� Char Char";
- mso-style-link:"ͼ������5�� Char";
- font-family:����;}
+ {mso-style-name:"图中文字5号 Char Char";
+ mso-style-link:"图中文字5号 Char";
+ font-family:宋体;}
p.5CharChar0, li.5CharChar0, div.5CharChar0
- {mso-style-name:"ͼ������С5�� Char Char";
- mso-style-link:"ͼ������С5�� Char Char Char";
+ {mso-style-name:"图中文字小5号 Char Char";
+ mso-style-link:"图中文字小5号 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
span.5CharCharChar
- {mso-style-name:"ͼ������С5�� Char Char Char";
- mso-style-link:"ͼ������С5�� Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字小5号 Char Char Char";
+ mso-style-link:"图中文字小5号 Char Char";
+ font-family:宋体;}
p.5Char0, li.5Char0, div.5Char0
- {mso-style-name:"ͼ������С5�� Char";
+ {mso-style-name:"图中文字小5号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5, li.5, div.5
- {mso-style-name:ͼ������С5��;
+ {mso-style-name:图中文字小5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -601,28 +601,28 @@ p.5, li.5, div.5
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.2, li.2, div.2
- {mso-style-name:�������2;
+ {mso-style-name:代码程序2;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.20, li.20, div.20
- {mso-style-name:ͼ˵��2;
+ {mso-style-name:图说明2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.21, li.21, div.21
- {mso-style-name:�ı�����2;
+ {mso-style-name:文本居中2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -630,18 +630,18 @@ p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char";
+ font-family:宋体;}
p.a2, li.a2, div.a2
- {mso-style-name:ͼ����;
+ {mso-style-name:图居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.110, li.110, div.110
- {mso-style-name:"��ʽ ���� 1 + ����1";
+ {mso-style-name:"样式 标题 1 + 居中1";
margin-right:0cm;
margin-left:0cm;
text-align:center;
@@ -650,32 +650,32 @@ p.110, li.110, div.110
font-family:"Times New Roman","serif";
font-weight:bold;}
span.1Char
- {mso-style-name:"���� 1 Char";
- mso-style-link:"���� 1";
+ {mso-style-name:"标题 1 Char";
+ mso-style-link:"标题 1";
font-weight:bold;}
p.22, li.22, div.22
- {mso-style-name:"��ʽ �б� 2 + ����";
+ {mso-style-name:"样式 列表 2 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.23, li.23, div.23
- {mso-style-name:�б�2;
+ {mso-style-name:列表2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.50, li.50, div.50
- {mso-style-name:ͼ������5��;
+ {mso-style-name:图中文字5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.111, li.111, div.111
- {mso-style-name:��ʽ11;
+ {mso-style-name:样式11;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -686,20 +686,20 @@ p.111, li.111, div.111
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.12, li.12, div.12
- {mso-style-name:�������1;
+ {mso-style-name:代码程序1;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.13, li.13, div.13
- {mso-style-name:ͼ˵��1;
+ {mso-style-name:图说明1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.01, li.01, div.01
- {mso-style-name:����01;
+ {mso-style-name:封面01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -707,7 +707,7 @@ p.01, li.01, div.01
font-family:"Times New Roman","serif";
font-weight:bold;}
p.112, li.112, div.112
- {mso-style-name:����11;
+ {mso-style-name:封面11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -715,24 +715,24 @@ p.112, li.112, div.112
font-family:"Times New Roman","serif";
font-weight:bold;}
p.113, li.113, div.113
- {mso-style-name:�DZ���11;
+ {mso-style-name:非标题11;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.14, li.14, div.14
- {mso-style-name:�ı�����1;
+ {mso-style-name:文本居中1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char1, li.3Char1, div.3Char1
- {mso-style-name:"ͼ������3 Char1";
+ {mso-style-name:"图中文字3 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -740,7 +740,7 @@ p.3Char1, li.3Char1, div.3Char1
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post1, li.post1, div.post1
- {mso-style-name:�ʼ�post1;
+ {mso-style-name:邮件post1;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
@@ -748,7 +748,7 @@ p.post1, li.post1, div.post1
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.31, li.31, div.31
- {mso-style-name:ͼ������31;
+ {mso-style-name:图中字体31;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -756,35 +756,35 @@ p.31, li.31, div.31
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char1, li.5Char1, div.5Char1
- {mso-style-name:"ͼ������5�� Char1";
+ {mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar1, li.5CharChar1, div.5CharChar1
- {mso-style-name:"ͼ������С5�� Char Char1";
+ {mso-style-name:"图中文字小5号 Char Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char10, li.5Char10, div.5Char10
- {mso-style-name:"ͼ������С5�� Char1";
+ {mso-style-name:"图中文字小5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.51, li.51, div.51
- {mso-style-name:ͼ������С5��1;
+ {mso-style-name:图中文字小5号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.120, li.120, div.120
- {mso-style-name:��ʽ12;
+ {mso-style-name:样式12;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -795,7 +795,7 @@ p.120, li.120, div.120
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.02, li.02, div.02
- {mso-style-name:����02;
+ {mso-style-name:封面02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -803,7 +803,7 @@ p.02, li.02, div.02
font-family:"Times New Roman","serif";
font-weight:bold;}
p.121, li.121, div.121
- {mso-style-name:����12;
+ {mso-style-name:封面12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -811,17 +811,17 @@ p.121, li.121, div.121
font-family:"Times New Roman","serif";
font-weight:bold;}
p.122, li.122, div.122
- {mso-style-name:�DZ���12;
+ {mso-style-name:非标题12;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.3Char2, li.3Char2, div.3Char2
- {mso-style-name:"ͼ������3 Char2";
+ {mso-style-name:"图中文字3 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -829,7 +829,7 @@ p.3Char2, li.3Char2, div.3Char2
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post2, li.post2, div.post2
- {mso-style-name:�ʼ�post2;
+ {mso-style-name:邮件post2;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
@@ -837,7 +837,7 @@ p.post2, li.post2, div.post2
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.32, li.32, div.32
- {mso-style-name:ͼ������32;
+ {mso-style-name:图中字体32;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -845,21 +845,21 @@ p.32, li.32, div.32
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char2, li.5Char2, div.5Char2
- {mso-style-name:"ͼ������С5�� Char2";
+ {mso-style-name:"图中文字小5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.52, li.52, div.52
- {mso-style-name:ͼ������С5��2;
+ {mso-style-name:图中文字小5号2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -867,7 +867,7 @@ p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.130, li.130, div.130
- {mso-style-name:��ʽ13;
+ {mso-style-name:样式13;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -878,13 +878,13 @@ p.130, li.130, div.130
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.30, li.30, div.30
- {mso-style-name:�������3;
+ {mso-style-name:代码程序3;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.03, li.03, div.03
- {mso-style-name:����03;
+ {mso-style-name:封面03;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -892,7 +892,7 @@ p.03, li.03, div.03
font-family:"Times New Roman","serif";
font-weight:bold;}
p.131, li.131, div.131
- {mso-style-name:����13;
+ {mso-style-name:封面13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -900,24 +900,24 @@ p.131, li.131, div.131
font-family:"Times New Roman","serif";
font-weight:bold;}
p.132, li.132, div.132
- {mso-style-name:�DZ���13;
+ {mso-style-name:非标题13;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.33, li.33, div.33
- {mso-style-name:�ı�����3;
+ {mso-style-name:文本居中3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char3, li.3Char3, div.3Char3
- {mso-style-name:"ͼ������3 Char3";
+ {mso-style-name:"图中文字3 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -925,7 +925,7 @@ p.3Char3, li.3Char3, div.3Char3
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post3, li.post3, div.post3
- {mso-style-name:�ʼ�post3;
+ {mso-style-name:邮件post3;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
@@ -933,7 +933,7 @@ p.post3, li.post3, div.post3
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.330, li.330, div.330
- {mso-style-name:ͼ������33;
+ {mso-style-name:图中字体33;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -941,36 +941,36 @@ p.330, li.330, div.330
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char20, li.5Char20, div.5Char20
- {mso-style-name:"ͼ������5�� Char2";
+ {mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar2, li.5CharChar2, div.5CharChar2
- {mso-style-name:"ͼ������С5�� Char Char2";
+ {mso-style-name:"图中文字小5号 Char Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char3, li.5Char3, div.5Char3
- {mso-style-name:"ͼ������С5�� Char3";
+ {mso-style-name:"图中文字小5号 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.53, li.53, div.53
- {mso-style-name:ͼ������С5��3;
+ {mso-style-name:图中文字小5号3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3Char, li.3Char, div.3Char
- {mso-style-name:"ͼ������3 Char";
- mso-style-link:"ͼ������3 Char Char5";
+ {mso-style-name:"图中文字3 Char";
+ mso-style-link:"图中文字3 Char Char5";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -978,11 +978,11 @@ p.3Char, li.3Char, div.3Char
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar5
- {mso-style-name:"ͼ������3 Char Char5";
- mso-style-link:"ͼ������3 Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char5";
+ mso-style-link:"图中文字3 Char";
+ font-family:宋体;}
p.54, li.54, div.54
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5紧密;
margin:0cm;
margin-bottom:.0001pt;
line-height:9.0pt;
@@ -990,7 +990,7 @@ p.54, li.54, div.54
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.24, li.24, div.24
- {mso-style-name:����2�Ŵ�����;
+ {mso-style-name:居中2号粗宋体;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -998,7 +998,7 @@ p.24, li.24, div.24
font-family:"Times New Roman","serif";
font-weight:bold;}
p.15, li.15, div.15
- {mso-style-name:"��ʽ ���� 1 + ����";
+ {mso-style-name:"样式 标题 1 + 居中";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1009,7 +1009,7 @@ p.15, li.15, div.15
font-family:"Times New Roman","serif";
font-weight:bold;}
p.25, li.25, div.25
- {mso-style-name:"��ʽ ���� 2 + �о�\: �����о�";
+ {mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1022,33 +1022,33 @@ p.25, li.25, div.25
font-family:"Arial","sans-serif";
font-weight:bold;}
span.2Char
- {mso-style-name:"���� 2 Char";
- mso-style-link:"���� 2";
+ {mso-style-name:"标题 2 Char";
+ mso-style-link:"标题 2";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.34, li.34, div.34
- {mso-style-name:�б�3;
+ {mso-style-name:列表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.35, li.35, div.35
- {mso-style-name:��3;
+ {mso-style-name:表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.4, li.4, div.4
- {mso-style-name:ͼ˵��4;
+ {mso-style-name:图说明4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.40, li.40, div.40
- {mso-style-name:�б�4;
+ {mso-style-name:列表4;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1059,166 +1059,166 @@ p.40, li.40, div.40
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.41, li.41, div.41
- {mso-style-name:��4;
+ {mso-style-name:表4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.55, li.55, div.55
- {mso-style-name:ͼ˵��5;
+ {mso-style-name:图说明5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.56, li.56, div.56
- {mso-style-name:�б�5;
+ {mso-style-name:列表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.57, li.57, div.57
- {mso-style-name:��5;
+ {mso-style-name:表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.6, li.6, div.6
- {mso-style-name:�б�6;
+ {mso-style-name:列表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.60, li.60, div.60
- {mso-style-name:��6;
+ {mso-style-name:表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.61, li.61, div.61
- {mso-style-name:ͼ˵��6;
+ {mso-style-name:图说明6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.7, li.7, div.7
- {mso-style-name:�б�7;
+ {mso-style-name:列表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.70, li.70, div.70
- {mso-style-name:ͼ˵��7;
+ {mso-style-name:图说明7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.71, li.71, div.71
- {mso-style-name:��7;
+ {mso-style-name:表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.8, li.8, div.8
- {mso-style-name:�б�8;
+ {mso-style-name:列表8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.9, li.9, div.9
- {mso-style-name:�б�9;
+ {mso-style-name:列表9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.90, li.90, div.90
- {mso-style-name:ͼ˵��9;
+ {mso-style-name:图说明9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.100, li.100, div.100
- {mso-style-name:�б�10;
+ {mso-style-name:列表10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.101, li.101, div.101
- {mso-style-name:ͼ˵��10;
+ {mso-style-name:图说明10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.114, li.114, div.114
- {mso-style-name:�б�11;
+ {mso-style-name:列表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.115, li.115, div.115
- {mso-style-name:ͼ˵��11;
+ {mso-style-name:图说明11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.116, li.116, div.116
- {mso-style-name:��11;
+ {mso-style-name:表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.123, li.123, div.123
- {mso-style-name:�б�12;
+ {mso-style-name:列表12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.124, li.124, div.124
- {mso-style-name:ͼ˵��12;
+ {mso-style-name:图说明12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.133, li.133, div.133
- {mso-style-name:ͼ˵��13;
- mso-style-link:"ͼ˵��13 Char";
+ {mso-style-name:图说明13;
+ mso-style-link:"图说明13 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.13Char
- {mso-style-name:"ͼ˵��13 Char";
- mso-style-link:ͼ˵��13;
- font-family:����;}
+ {mso-style-name:"图说明13 Char";
+ mso-style-link:图说明13;
+ font-family:宋体;}
p.134, li.134, div.134
- {mso-style-name:�б�13;
+ {mso-style-name:列表13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.26, li.26, div.26
- {mso-style-name:��¼2;
+ {mso-style-name:附录2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1230,7 +1230,7 @@ p.26, li.26, div.26
font-family:"Arial","sans-serif";
font-weight:bold;}
p.36, li.36, div.36
- {mso-style-name:��¼3;
+ {mso-style-name:附录3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1240,12 +1240,12 @@ p.36, li.36, div.36
font-family:"Arial","sans-serif";
font-weight:bold;}
span.3Char0
- {mso-style-name:"���� 3 Char";
- mso-style-link:"���� 3";
+ {mso-style-name:"标题 3 Char";
+ mso-style-link:"标题 3";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.16, li.16, div.16
- {mso-style-name:��¼1;
+ {mso-style-name:附录1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1256,14 +1256,14 @@ p.16, li.16, div.16
font-family:"Times New Roman","serif";
font-weight:bold;}
p.17, li.17, div.17
- {mso-style-name:��¼��1;
+ {mso-style-name:附录表1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.42, li.42, div.42
- {mso-style-name:��¼4;
+ {mso-style-name:附录4;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1273,19 +1273,19 @@ p.42, li.42, div.42
font-family:"Arial","sans-serif";
font-weight:bold;}
span.4Char
- {mso-style-name:"���� 4 Char";
- mso-style-link:"���� 4";
+ {mso-style-name:"标题 4 Char";
+ mso-style-link:"标题 4";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a3, li.a3, div.a3
- {mso-style-name:��¼ͼ˵��;
+ {mso-style-name:附录图说明;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.27, li.27, div.27
- {mso-style-name:�����2;
+ {mso-style-name:序标题2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1298,7 +1298,7 @@ p.27, li.27, div.27
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a4, li.a4, div.a4
- {mso-style-name:�����;
+ {mso-style-name:参考标题;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1309,7 +1309,7 @@ p.a4, li.a4, div.a4
font-family:"Times New Roman","serif";
font-weight:bold;}
p.18, li.18, div.18
- {mso-style-name:��������1;
+ {mso-style-name:索引标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1320,7 +1320,7 @@ p.18, li.18, div.18
font-family:"Times New Roman","serif";
font-weight:bold;}
p.19, li.19, div.19
- {mso-style-name:�б�1;
+ {mso-style-name:列表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1331,7 +1331,7 @@ p.19, li.19, div.19
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.1a, li.1a, div.1a
- {mso-style-name:��1;
+ {mso-style-name:表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1342,14 +1342,14 @@ p.1a, li.1a, div.1a
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.37, li.37, div.37
- {mso-style-name:ͼ˵��3;
+ {mso-style-name:图说明3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.62, li.62, div.62
- {mso-style-name:��������6��;
+ {mso-style-name:表中字体6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1358,8 +1358,8 @@ p.62, li.62, div.62
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.a5, li.a5, div.a5
- {mso-style-name:���Ĵ���;
- mso-style-link:"���Ĵ��� Char";
+ {mso-style-name:正文代码;
+ mso-style-link:"正文代码 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1367,11 +1367,11 @@ p.a5, li.a5, div.a5
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char1
- {mso-style-name:"���Ĵ��� Char";
- mso-style-link:���Ĵ���;
- font-family:����;}
+ {mso-style-name:"正文代码 Char";
+ mso-style-link:正文代码;
+ font-family:宋体;}
p.43, li.43, div.43
- {mso-style-name:"��ʽ ���� 4 +";
+ {mso-style-name:"样式 标题 4 +";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1381,7 +1381,7 @@ p.43, li.43, div.43
font-family:"Arial","sans-serif";
font-weight:bold;}
p.140, li.140, div.140
- {mso-style-name:��14;
+ {mso-style-name:表14;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1392,8 +1392,8 @@ p.140, li.140, div.140
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.141, li.141, div.141
- {mso-style-name:ͼ˵��14;
- mso-style-link:"ͼ˵��14 Char";
+ {mso-style-name:图说明14;
+ mso-style-link:"图说明14 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1404,11 +1404,11 @@ p.141, li.141, div.141
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.14Char
- {mso-style-name:"ͼ˵��14 Char";
- mso-style-link:ͼ˵��14;
- font-family:����;}
+ {mso-style-name:"图说明14 Char";
+ mso-style-link:图说明14;
+ font-family:宋体;}
p.a6, li.a6, div.a6
- {mso-style-name:�ļ�Ŀ¼��;
+ {mso-style-name:文件目录表;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1416,8 +1416,8 @@ p.a6, li.a6, div.a6
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a7, li.a7, div.a7
- {mso-style-name:"��ʽ ���� +";
- mso-style-link:"��ʽ ���� + Char";
+ {mso-style-name:"样式 正文 +";
+ mso-style-link:"样式 正文 + Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1425,39 +1425,39 @@ p.a7, li.a7, div.a7
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char2
- {mso-style-name:"��ʽ ���� + Char";
- mso-style-link:"��ʽ ���� +";
+ {mso-style-name:"样式 正文 + Char";
+ mso-style-link:"样式 正文 +";
font-family:"Times New Roman","serif";}
p.a8, li.a8, div.a8
- {mso-style-name:������ע;
+ {mso-style-name:表格题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a9, li.a9, div.a9
- {mso-style-name:�б���ע;
+ {mso-style-name:列表题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.aa, li.aa, div.aa
- {mso-style-name:ͼ��ע;
+ {mso-style-name:图题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ab, li.ab, div.ab
- {mso-style-name:������ע;
+ {mso-style-name:程序题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ac, li.ac, div.ac
- {mso-style-name:��������;
+ {mso-style-name:框中文字;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
@@ -1470,7 +1470,7 @@ p.ac, li.ac, div.ac
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.125, li.125, div.125
- {mso-style-name:"��ʽ ���� 1 + ����2";
+ {mso-style-name:"样式 标题 1 + 居中2";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1481,14 +1481,14 @@ p.125, li.125, div.125
font-family:"Times New Roman","serif";
font-weight:bold;}
p.ad, li.ad, div.ad
- {mso-style-name:"��ʽ ��ע + ���� ��� ����";
+ {mso-style-name:"样式 题注 + 宋体 五号 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:黑体;}
p.1b, li.1b, div.1b
- {mso-style-name:�����1;
+ {mso-style-name:序标题1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1499,16 +1499,16 @@ p.1b, li.1b, div.1b
font-family:"Times New Roman","serif";
font-weight:bold;}
p.38, li.38, div.38
- {mso-style-name:�����3;
+ {mso-style-name:序标题3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
- font-family:����С���μ���;}
+ font-family:方正小标宋简体;}
p.63, li.63, div.63
- {mso-style-name:��������6��;
+ {mso-style-name:表中文字6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1516,7 +1516,7 @@ p.63, li.63, div.63
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.64, li.64, div.64
- {mso-style-name:ͼ������6�������;
+ {mso-style-name:图中文字6号左对齐;
margin:0cm;
margin-bottom:.0001pt;
line-height:10.0pt;
@@ -1524,8 +1524,8 @@ p.64, li.64, div.64
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.65, li.65, div.65
- {mso-style-name:ͼ������6��;
- mso-style-link:"ͼ������6�� Char";
+ {mso-style-name:图中文字6号;
+ mso-style-link:"图中文字6号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -1534,11 +1534,11 @@ p.65, li.65, div.65
font-size:7.5pt;
font-family:"Times New Roman","serif";}
span.6Char
- {mso-style-name:"ͼ������6�� Char";
- mso-style-link:ͼ������6��;
- font-family:����;}
+ {mso-style-name:"图中文字6号 Char";
+ mso-style-link:图中文字6号;
+ font-family:宋体;}
p.ae, li.ae, div.ae
- {mso-style-name:ͼ��;
+ {mso-style-name:图标;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1546,7 +1546,7 @@ p.ae, li.ae, div.ae
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.28, li.28, div.28
- {mso-style-name:ͼ��2;
+ {mso-style-name:图标2;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1554,7 +1554,7 @@ p.28, li.28, div.28
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.af, li.af, div.af
- {mso-style-name:ϰ�����;
+ {mso-style-name:习题标题;
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:0cm;
@@ -1564,9 +1564,9 @@ p.af, li.af, div.af
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
- font-family:����;}
+ font-family:黑体;}
p.1c, li.1c, div.1c
- {mso-style-name:���ֱ��1;
+ {mso-style-name:部分编号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1574,14 +1574,14 @@ p.1c, li.1c, div.1c
font-size:16.0pt;
font-family:"Times New Roman","serif";}
p.af0, li.af0, div.af0
- {mso-style-name:������;
+ {mso-style-name:表标题;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
- {mso-style-name:"��ʽ ��ע + ����";
+ {mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -1630,7 +1630,7 @@ p.RightText, li.RightText, div.RightText
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af2, li.af2, div.af2
- {mso-style-name:����������;
+ {mso-style-name:表中文字小五;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1638,8 +1638,8 @@ p.af2, li.af2, div.af2
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af3, li.af3, div.af3
- {mso-style-name:�ؼ���;
- mso-style-link:"�ؼ��� Char";
+ {mso-style-name:关键词;
+ mso-style-link:"关键词 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1647,12 +1647,12 @@ p.af3, li.af3, div.af3
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char3
- {mso-style-name:"�ؼ��� Char";
- mso-style-link:�ؼ���;
- font-family:����;}
+ {mso-style-name:"关键词 Char";
+ mso-style-link:关键词;
+ font-family:宋体;}
p.af4, li.af4, div.af4
- {mso-style-name:���;
- mso-style-link:"��� Char";
+ {mso-style-name:文件名;
+ mso-style-link:"文件名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1660,12 +1660,12 @@ p.af4, li.af4, div.af4
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char4
- {mso-style-name:"��� Char";
- mso-style-link:���;
- font-family:����;}
+ {mso-style-name:"文件名 Char";
+ mso-style-link:文件名;
+ font-family:宋体;}
p.af5, li.af5, div.af5
- {mso-style-name:ѡ��;
- mso-style-link:"ѡ�� Char";
+ {mso-style-name:选项;
+ mso-style-link:"选项 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1673,12 +1673,12 @@ p.af5, li.af5, div.af5
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char5
- {mso-style-name:"ѡ�� Char";
- mso-style-link:ѡ��;
- font-family:����;}
+ {mso-style-name:"选项 Char";
+ mso-style-link:选项;
+ font-family:宋体;}
p.af6, li.af6, div.af6
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:命令行;
+ mso-style-link:"命令行 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1686,12 +1686,12 @@ p.af6, li.af6, div.af6
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char6
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"命令行 Char";
+ mso-style-link:命令行;
+ font-family:宋体;}
p.af7, li.af7, div.af7
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:函数名;
+ mso-style-link:"函数名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1699,12 +1699,12 @@ p.af7, li.af7, div.af7
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char7
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"函数名 Char";
+ mso-style-link:函数名;
+ font-family:宋体;}
p.af8, li.af8, div.af8
- {mso-style-name:�Ĵ�����;
- mso-style-link:"�Ĵ����� Char";
+ {mso-style-name:寄存器名;
+ mso-style-link:"寄存器名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1712,12 +1712,12 @@ p.af8, li.af8, div.af8
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char8
- {mso-style-name:"�Ĵ����� Char";
- mso-style-link:�Ĵ�����;
+ {mso-style-name:"寄存器名 Char";
+ mso-style-link:寄存器名;
font-family:"Times New Roman","serif";}
p.af9, li.af9, div.af9
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:变量名;
+ mso-style-link:"变量名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1725,83 +1725,83 @@ p.af9, li.af9, div.af9
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char9
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"变量名 Char";
+ mso-style-link:变量名;
+ font-family:宋体;}
p.58, li.58, div.58
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5号左;
margin:0cm;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.59, li.59, div.59
- {mso-style-name:ͼ������С5�ſ���;
+ {mso-style-name:图中文字小5号靠左;
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.926, li.926, div.926
- {mso-style-name:"��ʽ ������� + ���\: 9\.26 ����";
+ {mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.5Char4
- {mso-style-name:"���� 5 Char";
- mso-style-link:"���� 5";
+ {mso-style-name:"标题 5 Char";
+ mso-style-link:"标题 5";
font-weight:bold;}
span.6Char0
- {mso-style-name:"���� 6 Char";
- mso-style-link:"���� 6";
+ {mso-style-name:"标题 6 Char";
+ mso-style-link:"标题 6";
font-family:"Arial","sans-serif";
font-weight:bold;}
span.7Char
- {mso-style-name:"���� 7 Char";
- mso-style-link:"���� 7";
+ {mso-style-name:"标题 7 Char";
+ mso-style-link:"标题 7";
font-weight:bold;}
span.8Char
- {mso-style-name:"���� 8 Char";
- mso-style-link:"���� 8";
+ {mso-style-name:"标题 8 Char";
+ mso-style-link:"标题 8";
font-family:"Arial","sans-serif";}
span.9Char
- {mso-style-name:"���� 9 Char";
- mso-style-link:"���� 9";
+ {mso-style-name:"标题 9 Char";
+ mso-style-link:"标题 9";
font-family:"Arial","sans-serif";}
span.Chara
- {mso-style-name:"��ע�ı� Char";
- mso-style-link:��ע�ı�;
- font-family:����;}
+ {mso-style-name:"脚注文本 Char";
+ mso-style-link:脚注文本;
+ font-family:宋体;}
span.Charb
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;}
+ {mso-style-name:"批注文字 Char";
+ mso-style-link:批注文字;
+ font-family:宋体;}
span.Charc
- {mso-style-name:"ҳü Char";
- mso-style-link:ҳü;
- font-family:����;}
+ {mso-style-name:"页眉 Char";
+ mso-style-link:页眉;
+ font-family:宋体;}
span.Chard
- {mso-style-name:"ҳ�� Char";
- mso-style-link:ҳ��;
- font-family:����;}
+ {mso-style-name:"页脚 Char";
+ mso-style-link:页脚;
+ font-family:宋体;}
span.Chare
- {mso-style-name:"���� Char";
- mso-style-link:����;
- font-family:����;}
+ {mso-style-name:"日期 Char";
+ mso-style-link:日期;
+ font-family:宋体;}
span.HTMLChar
- {mso-style-name:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
- mso-style-link:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- font-family:����;}
+ {mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
+ mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ font-family:宋体;}
span.Charf
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;
+ {mso-style-name:"批注主题 Char";
+ mso-style-link:批注主题;
+ font-family:宋体;
font-weight:bold;}
span.Charf0
- {mso-style-name:"��ע���ı� Char";
- mso-style-link:��ע���ı�;
- font-family:����;}
+ {mso-style-name:"批注框文本 Char";
+ mso-style-link:批注框文本;
+ font-family:宋体;}
.MsoChpDefault
{font-size:10.0pt;}
/* Page Definitions */
@@ -1825,7 +1825,7 @@ ul
����程序8-2 linux/kernel/traps.c /* * �ڳ���asm.s�б�����һЩ״̬��������������Ӳ��������ϡ�Ŀǰ��Ҫ���ڵ���Ŀ�ģ� * 在程序asm.s中保存了一些状态后,本程序用来处理硬件陷阱和故障。目前主要用于调试目的, * �Ժ���չ����ɱ�����Ľ��̣���Ҫ��ͨ������һ���źţ��������ҪҲ��ֱ��ɱ������ * 以后将扩展用来杀死遭损坏的进程(主要是通过发送一个信号,但如果必要也会直接杀死)。 */ 13
-#include <string.h> // �ַ���ͷ�ļ�����Ҫ������һЩ�й��ڴ���ַ���������Ƕ�뺯���� 14 15
-#include <linux/head.h> // headͷ�ļ��������˶��������ļṹ���ͼ���ѡ��������� 16
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct����ʼ����0�����ݣ�
-// ����һЩ�й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������䡣 17
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 18
-#include <asm/system.h> // ϵͳͷ�ļ������������û���������/�ж��ŵȵ�Ƕ��ʽ���ꡣ 19
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 20
-#include <asm/io.h> // ����/���ͷ�ļ�������Ӳ���˿�����/���������䡣 21 // ������䶨��������Ƕ��ʽ������亯�����й�Ƕ��ʽ���Ļ�������������б����˵���� // 以下语句定义了三个嵌入式汇编宏语句函数。有关嵌入式汇编的基本语法见本程序列表后的说明。 // ��Բ������ס�������䣨�������е���䣩������Ϊ����ʽʹ�ã���������__res�������ֵ�� // 用圆括号括住的组合语句(花括号中的语句)可以作为表达式使用,其中最后的__res是其输出值。 // ��23�ж�����һ���Ĵ�������__res���ñ�������������һ���Ĵ����У��Ա��ڿ��ٷ��ʺͲ����� // 第23行定义了一个寄存器变量__res。该变量将被保存在一个寄存器中,以便于快速访问和操作。 // �����ָ���Ĵ���������eax������ô���ǿ��Ѹþ�д�ɡ�register char __res asm("ax");���� // 如果想指定寄存器(例如eax),那么我们可以把该句写成“register char __res asm("ax");”。 // ȡ��seg�е�ַaddr����һ���ֽڡ� // 取段seg中地址addr处的一个字节。 // ������seg
-- ��ѡ�����addr - ����ָ����ַ�� // 参数:seg
+- 段选择符;addr - 段内指定地址。 // �����%0
-- eax (__res)�����룺%1 - eax (seg)��%2 - �ڴ��ַ (*(addr))�� // 输出:%0
+- eax (__res);输入:%1 - eax (seg);%2 - 内存地址 (*(addr))。 22
#define get_seg_byte(seg,addr) ({ \ 27 // ȡ��seg�е�ַaddr����һ�����֣�4�ֽڣ��� // 取段seg中地址addr处的一个长字(4字节)。 // ������seg
-- ��ѡ�����addr - ����ָ����ַ�� // 参数:seg
+- 段选择符;addr - 段内指定地址。 // �����%0
-- eax (__res)�����룺%1 - eax (seg)��%2 - �ڴ��ַ (*(addr))�� // 输出:%0
+- eax (__res);输入:%1 - eax (seg);%2 - 内存地址 (*(addr))。 28
#define get_seg_long(seg,addr) ({ \ 33 // ȡfs�μĴ�����ֵ��ѡ������� // 取fs段寄存器的值(选择符)。 // �����%0
-- eax (__res)�� // 输出:%0
+- eax (__res)。 34
#define _fs() ({ \ 38 // ���¶�����һЩ����ԭ�͡� // 以下定义了一些函数原型。 39
void page_exception(void);
- // ҳ�쳣��ʵ����page_fault��mm/page.s��14���� 40 41
void divide_error(void);
- // int0��kernel/asm.s��20���� 42
void debug(void);
- // int1��kernel/asm.s��54���� 43
void nmi(void);
- // int2��kernel/asm.s��58���� 44
void int3(void);
- // int3��kernel/asm.s��62���� 45
void overflow(void);
- // int4��kernel/asm.s��66���� 46
void bounds(void);
- // int5��kernel/asm.s��70���� 47
void invalid_op(void);
- // int6��kernel/asm.s��74���� 48
void device_not_available(void);
- // int7��kernel/sys_call.s��158���� 49
void double_fault(void);
- // int8��kernel/asm.s��98���� 50
void coprocessor_segment_overrun(void);
-// int9��kernel/asm.s��78���� 51
void invalid_TSS(void);
//
-int10��kernel/asm.s��132���� 52
void segment_not_present(void); //
-int11��kernel/asm.s��136���� 53
void stack_segment(void);
- // int12��kernel/asm.s��140���� 54
void general_protection(void);
- // int13��kernel/asm.s��144���� 55
void page_fault(void);
//
-int14��mm/page.s��14���� 56
void coprocessor_error(void);
- // int16��kernel/sys_call.s��140���� 57
void reserved(void);
//
-int15��kernel/asm.s��82���� 58
void parallel_interrupt(void);
- // int39��kernel/sys_call.s��295���� 59
void irq13(void);
- // int45 Э�������жϴ�����kernel/asm.s��86���� 60
void alignment_check(void);
-// int46��kernel/asm.s��148���� 61 // ���ӳ���������ӡ�����жϵ����ơ������š����ó����EIP��EFLAGS��ESP��fs�μĴ���ֵ�� // 该子程序用来打印出错中断的名称、出错号、调用程序的EIP、EFLAGS、ESP、fs段寄存器值、 // �εĻ�ַ���εij��ȡ����̺�pid������š�10�ֽ�ָ���롣�����ջ���û����ݶΣ��� // 段的基址、段的长度、进程号pid、任务号、10字节指令码。如果堆栈在用户数据段,则还 // ��ӡ16�ֽڵĶ�ջ���ݡ���Щ��Ϣ�����ڳ�����ԡ� // 打印16字节的堆栈内容。这些信息可用于程序调试。 62
static void die(char * // ���д�ӡ�����ʾ��ǰ���ý��̵�CS:EIP��EFLAGS��SS:ESP��ֵ����������!δ�ҵ�����Դ����֪������esp[0] // 下行打印语句显示当前调用进程的CS:EIP、EFLAGS和SS:ESP的值。参照错误!未找到引用源。可知,这里esp[0] // ��Ϊͼ�е�esp0λ�á�������ǰ�����ֿ�����Ϊ�� // 即为图中的esp0位置。因此我们把这句拆分开来看为: // (1) EIP:\t%04x:%p\n --
-esp[1]�Ƕ�ѡ�����cs����esp[0]��是段选择符(cs),esp[0]是eip // (2)
-EFLAGS:\t%p -- esp[2]��eflags // (3) ESP:\t%04x:%p\n --
-esp[4]��ԭss��esp[3]��ԭ是原ss,esp[3]是原esp 68
@@ -2159,11 +2159,11 @@ style='color:blue'>current->ldt[1]),ge
72
if (esp[4] == 0x17) { //
-��ԭssֵΪ0x17���û�ջ������ӡ�� 73
printk("Stack: ");
-// �û�ջ�е�4������ֵ��16�ֽڣ��� 74
for (i=0;i<4;i++) 78
str(i);
-// ȡ��ǰ�������������ţ�include/linux/sched.h��210�У��� 79
printk("Pid: %d, process nr:
%d\n\r",current->pid,0xffff
-& i); // ���̺ţ�����š� 80
for(i=0;i<10;i++) 85 // ������Щ��do_��ͷ�ĺ�����asm.s�ж�Ӧ�жϴ���������õ�C������ // 以下这些以do_开头的函数是asm.s中对应中断处理程序调用的C函数。 86
void do_double_fault(long esp, long
@@ -2267,8 +2267,8 @@ lang=EN-US> } 105 // �����ǽ����жϺ�˳��ѹ���ջ�ļĴ���ֵ���μ�asm.s�����24--35�С� // 参数是进入中断后被顺序压入堆栈的寄存器值。参见asm.s程序第24--35行。 106 void do_int3(long * esp,
@@ -2298,8 +2298,8 @@ lang=EN-US> 113 __asm__("str
%%ax":"=a" (tr):"" (0));
- // ȡ����Ĵ���ֵ��tr�� 114 } 184 // �������쳣�����壩�жϳ����ʼ���ӳ����������ǵ��жϵ����ţ��ж��������� // 下面是异常(陷阱)中断程序初始化子程序。设置它们的中断调用门(中断向量)。 // set_trap_gate()��set_system_gate()��ʹ�����ж���������IDT�е������ţ�Trap Gate���� // set_trap_gate()与set_system_gate()都使用了中断描述符表IDT中的陷阱门(Trap Gate), // ����֮�����Ҫ��������ǰ�����õ���Ȩ��Ϊ0��������3����˶ϵ������ж�int3������ж� // 它们之间的主要区别在于前者设置的特权级为0,后者是3。因此断点陷阱中断int3、溢出中断 // overflow �ͱ߽�����ж� bounds �������κγ�����á� ��������������Ƕ��ʽ������� // overflow 和边界出错中断 bounds 可以由任何程序调用。 这两个函数均是嵌入式汇编宏程序, // �μ�include/asm/system.h����36�С�39�С� // 参见include/asm/system.h,第36行、39行。 185 void trap_init(void) 189 set_trap_gate(0,÷_error);
-// ���ó������������ж�����ֵ��������ͬ�� 190 193 set_system_gate(4,&overflow); /* int3-5 ���Ա����г���ִ��overflow); /* int3-5 可以被所有程序执行 */ 194set_trap_gate(17,&
// �����int17-47���������Ⱦ�����Ϊreserved���Ժ��Ӳ����ʼ��ʱ�����������Լ��������š� // 下面把int17-47的陷阱门先均设置为reserved,以后各硬件初始化时会重新设置自己的陷阱门。 207 for
@@ -2669,8 +2669,8 @@ style='color:blue'>set_trap_gate // ����Э�������ж�0x2d��45����������������������������ж��������ò��п��ж��������� // 设置协处理器中断0x2d(45)陷阱门描述符,并允许其产生中断请求。设置并行口中断描述符。 209 set_trap_gate(45,&
210 outb_p(inb_p(0x21)&0xfb,0x21);
- // ����8259A��оƬ��IRQ2�ж����� 211 outb(inb_p(0xA1)&0xdf,0xA1);
- // ����8259A��оƬ��IRQ13�ж����� 212 set_trap_gate(39,¶llel_interrupt);
-// ���ò��п�1���ж�0x27�������������� 213 } ����程序8-3 linux/kernel/sys_call.s /* * system_call.s�ļ�����ϵͳ���ã�system-call���ײ㴦���ӳ���������Щ����Ƚ����ƣ� * system_call.s文件包含系统调用(system-call)底层处理子程序。由于有些代码比较类似, * ����ͬʱҲ����ʱ���жϴ�����timer-interrupt�������Ӳ�̺����̵��жϴ�������Ҳ����� * 所以同时也包括时钟中断处理(timer-interrupt)句柄。硬盘和软盘的中断处理程序也在这里。 * * ע�⣺��δ��봦���źţ�signal��ʶ����ÿ��ʱ���жϺ�ϵͳ����֮�����ʶ��һ�� * 注意:这段代码处理信号(signal)识别,在每次时钟中断和系统调用之后都会进行识别。一般 * �жϹ��̲��������ź�ʶ����Ϊ���ϵͳ��ɻ��ҡ� * 中断过程并不处理信号识别,因为会给系统造成混乱。 * * ��ϵͳ���÷��أ�'ret_from_system_call'��ʱ��ջ�����ݼ�����19-30�С� * 从系统调用返回('ret_from_system_call')时堆栈的内容见上面19-30行。 */ # ����Linusԭע����һ���жϹ�����ָ����ϵͳ�����жϣ�int 0x80����ʱ���жϣ�int 0x20�� # 上面Linus原注释中一般中断过程是指除了系统调用中断(int 0x80)和时钟中断(int 0x20) # ����������жϡ���Щ�жϻ����ں�̬���û�̬���������������Щ�жϹ�����Ҳ�����ź�ʶ�� # 以外的其他中断。这些中断会在内核态或用户态随机发生,若在这些中断过程中也处理信号识别 # �Ļ������п�����ϵͳ�����жϺ�ʱ���жϹ����ж��źŵ�ʶ�����������ͻ����Υ�����ں� # 的话,就有可能与系统调用中断和时钟中断过程中对信号的识别处理过程相冲突,,违反了内核 # �������ռԭ�����ϵͳ���ޱ�Ҫ����Щ���������ж��д����źţ�Ҳ�������������� # 代码非抢占原则。因此系统既无必要在这些“其他”中断中处理信号,也不允许这样做。 33 34
SIG_CHLD = 17
-# ����SIG_CHLD�źţ��ӽ���ֹͣ��������� 35 36
EAX =
-0x00 # ��ջ�и����Ĵ�����ƫ��λ�á� 37
EBX = 0x04 40
ORIG_EAX = 0x10
-# �������ϵͳ���ã��������жϣ�ʱ����ֵΪ-1�� 41
FS
@@ -2023,7 +2023,7 @@ DS
44
EIP =
0x20 #
-44 -- 48�� ��CPU�Զ���ջ�� 45
CS
@@ -2033,76 +2033,76 @@ CS
EFLAGS = 0x28 47
-OLDESP = 0x2C # ����Ȩ���仯ʱ��ԭ��ջָ��Ҳ����ջ�� 48
OLDSS = 0x30 49 # ������Щ������ṹ��task_struct���б�����ƫ��ֵ���μ�include/linux/sched.h��105�п�ʼ�� # 以下这些是任务结构(task_struct)中变量的偏移值,参见include/linux/sched.h,105行开始。 50
state =
0 #
-these are offsets into the task-struct. # ����״̬�롣 51
counter = 4
-# ��������ʱ�����(�ݼ�)���δ�����������ʱ��Ƭ�� 52
priority = 8 #
-����������������ʼ����ʱcounter=priority��Խ��������ʱ��Խ���� 53
signal = 12
-# ���ź�λͼ��ÿ������λ����һ���źţ��ź�ֵ=λƫ��ֵ+1�� 54
sigaction = 16 # MUST be
-16 (=len of sigaction) # sigaction�ṹ���ȱ�����16�ֽڡ� 55
-blocked = (33*16) # �������ź�λͼ��ƫ������ 56 # ���¶�����sigaction�ṹ�е�ƫ�������μ�include/signal.h����55�п�ʼ�� # 以下定义在sigaction结构中的偏移量,参见include/signal.h,第55行开始。 57 #
offsets within sigaction 58
sa_handler = 0 #
-�źŴ������̵ľ�������������� 59
sa_mask = 4
- # �ź������롣 60
sa_flags = 8 #
-�źż��� 61
sa_restorer = 12 #
-�ָ�����ָ�룬�μ�kernel/signal.c����˵���� 62 63
nr_system_calls = 82 #
-Linux 0.12���ں��е�ϵͳ���������� 64 65
ENOSYS = 38
-# ϵͳ���úų����롣 66 /* * ���ˣ���ʹ������ʱ���յ��˲��д�ӡ���жϣ�����֡��ǣ����ڲ������� * 好了,在使用软驱时我收到了并行打印机中断,很奇怪。呵,现在不管它。 */ 74 # ϵͳ���úŴ���ʱ�����س�����-ENOSYS�� # 系统调用号错误时将返回出错码-ENOSYS。 75
.align 2 #
-�ڴ�4�ֽڶ��롣 76
bad_sys_call: 77
pushl $-ENOSYS #
-eax����-ENOSYS�� 78
jmp ret_from_sys_call # ����ִ�е��ȳ�����ڡ����ȳ���schedule()�ڣ�kernel/sched.c��119�д���ʼ�� # 重新执行调度程序入口。调度程序schedule()在(kernel/sched.c,119行处开始。 # �����ȳ���schedule()����ʱ�ʹ�ret_from_sys_call����107�У�����ִ�С� # 当调度程序schedule()返回时就从ret_from_sys_call处(107行)继续执行。 79
.align 2 81
-pushl $ret_from_sys_call # ��ret_from_sys_call�ĵ�ַ��ջ��107�У��� 82
jmp _schedule #### int 0x80 --linuxϵͳ������ڵ㣨�����ж�int 0x80��eax���ǵ��úţ��� #### int 0x80 --linux系统调用入口点(调用中断int 0x80,eax中是调用号)。 83
.align 2 85
push %ds
- # ����ԭ�μĴ���ֵ�� 86
push %es 88
pushl
%eax
- # save the orig_eax # ����eaxԭֵ�� # һ��ϵͳ�������ɴ���3��������Ҳ���Բ���������������ջ��ebx��ecx��edx�з���ϵͳ # 一个系统调用最多可带有3个参数,也可以不带参数。下面入栈的ebx、ecx和edx中放着系统 # ������ӦC���Ժ���������99�У��ĵ��ò������⼸���Ĵ�����ջ��˳������GNU gcc�涨�ģ� # 调用相应C语言函数(见第99行)的调用参数。这几个寄存器入栈的顺序是由GNU gcc规定的, # ebx�пɴ�ŵ�1��������ecx�д�ŵ�2��������edx�д�ŵ�3�������� # ebx中可存放第1个参数,ecx中存放第2个参数,edx中存放第3个参数。 # ϵͳ�������ɲμ�ͷ�ļ�include/unistd.h�е�150��200�е�ϵͳ���úꡣ # 系统调用语句可参见头文件include/unistd.h中第150到200行的系统调用宏。 89
pushl
@@ -2232,14 +2232,14 @@ to the system call # �ڱ�����μĴ���֮����ds,esָ���ں����ݶΣ���fsָ��ǰ�ֲ����ݶΣ���ָ��ִ�б� # 在保存过段寄存器之后,让ds,es指向内核数据段,而fs指向当前局部数据段,即指向执行本 # ��ϵͳ���õ��û���������ݶΡ�ע�⣬��Linux 0.12���ں˸��������Ĵ���������ڴ�� # 次系统调用的用户程序的数据段。注意,在Linux 0.12中内核给任务分配的代码和数据内存段 # ���ص��ģ����ǵĶλ�ַ�Ͷ�����ͬ���μ�fork.c������copy_mem()������ # 是重叠的,它们的段基址和段限长相同。参见fork.c程序中copy_mem()函数。 92
movl $0x10,%edx #
@@ -2261,51 +2261,51 @@ mov %dx,%fs 97
-cmpl _NR_syscalls,%eax # ���ú����������Χ�Ļ�����ת�� 98
jae bad_sys_call # �������������ĺ����ǣ����õ�ַ=[_sys_call_table + %eax * 4]���μ�������˵���� # 下面这句操作数的含义是:调用地址=[_sys_call_table + %eax * 4]。参见程序后的说明。 # sys_call_table[]��һ��ָ�����飬������include/linux/sys.h�У����������������ں� # sys_call_table[]是一个指针数组,定义在include/linux/sys.h中,该数组中设置了内核 # ����82��ϵͳ����C���������ĵ�ַ�� # 所有82个系统调用C处理函数的地址。 99
-call _sys_call_table(,%eax,4) # ��ӵ���ָ������C������ 100 pushl %eax
- # ��ϵͳ���÷���ֵ��ջ�� # ����101-106�в鿴��ǰ���������״̬��������ھ���״̬��state������0����ȥִ�е��� # 下面101-106行查看当前任务的运行状态。如果不在就绪状态(state不等于0)就去执行调度 # ��������������ھ���״̬��������ʱ��Ƭ�Ѿ����꣨counter=0������Ҳȥִ�е��ȳ��� # 程序。如果该任务在就绪状态,但是其时间片已经用完(counter=0),则也去执行调度程序。 # ���統��̨�������еĽ���ִ�п����ն˶�д����ʱ����ôĬ�������¸ú�̨���������н��� # 例如当后台进程组中的进程执行控制终端读写操作时,那么默认条件下该后台进程组所有进程 # ���յ�SIGTTIN��SIGTTOU�źţ����½����������н��̴���ֹͣ״̬������ǰ����������� # 会收到SIGTTIN或SIGTTOU信号,导致进程组中所有进程处于停止状态。而当前进程则会立刻 # ���ء� # 返回。 101 2: 102 movl _current,%eax
- # ȡ��ǰ�����̣����ݽṹָ����eax�� 103 cmpl
@@ -2323,18 +2323,18 @@ lang=EN-US> je reschedule
# ������δ���ִ�д�ϵͳ����C�������غ��źŽ���ʶ�����������жϷ�������˳�ʱҲ # 以下这段代码执行从系统调用C函数返回后,对信号进行识别处理。其他中断服务程序退出时也 # ����ת��������д�������˳��жϹ��̣��������131���ϵĴ����������ж�int 16�� # 将跳转到这里进行处理后才退出中断过程,例如后面131行上的处理器出错中断int 16。 # �����б�ǰ�����Ƿ��dz�ʼ����task0��������ض�������ź�������Ĵ�����ֱ�ӷ��ء� # 首先判别当前任务是否是初始任务task0,如果是则不必对其进行信号量方面的处理,直接返回。 # 109���ϵ�_task��ӦC�����е�task[]���飬ֱ������task�൱������task[0]�� # 109行上的_task对应C程序中的task[]数组,直接引用task相当于引用task[0]。 107 ret_from_sys_call: 110 je 3f # ��ǰ(forward)��ת�����3���˳��жϴ����� # ͨ����ԭ���ó������ѡ����ļ�����жϵ��ó����Ƿ����û��������������ֱ���˳��жϡ� # 通过对原调用程序代码选择符的检查来判断调用程序是否是用户任务。如果不是则直接退出中断。 # ������Ϊ�������ں�ִ̬��ʱ������ռ���������������ź�����ʶ����������Ƚ�ѡ����� # 这是因为任务在内核态执行时不可抢占。否则对任务进行信号量的识别处理。这里比较选择符是 # ��Ϊ�û�����ε�ѡ��� 0x000f��RPL=3���ֲ���������Σ����ж��Ƿ�Ϊ�û������������ # 否为用户代码段的选择符 0x000f(RPL=3,局部表,代码段)来判断是否为用户任务。如果不是 # ��˵����ij���жϷ�����������ж�16����ת����107��ִ�е��ˣ�������ת�˳��жϳ��� # 则说明是某个中断服务程序(例如中断16)跳转到第107行执行到此,于是跳转退出中断程序。 # ���⣬���ԭ��ջ��ѡ�����Ϊ0x17����ԭ��ջ�����û����У���Ҳ˵������ϵͳ���õĵ����� # 另外,如果原堆栈段选择符不为0x17(即原堆栈不在用户段中),也说明本次系统调用的调用者 # �����û�������Ҳ�˳��� # 不是用户任务,则也退出。 111 cmpw $0x0f,CS(%esp) # was old code segment supervisor ? # ������δ��루115-128�����ڴ�����ǰ�����е��źš�����ȡ��ǰ����ṹ�е��ź�λͼ��32λ�� # 下面这段代码(115-128)用于处理当前任务中的信号。首先取当前任务结构中的信号位图(32位, # ÿλ����1���źţ���Ȼ��������ṹ�е��ź����������Σ��룬�������������ź�λ��ȡ����ֵ # 每位代表1种信号),然后用任务结构中的信号阻塞(屏蔽)码,阻塞不允许的信号位,取得数值 # ��С���ź�ֵ���ٰ�ԭ�ź�λͼ�и��źŶ�Ӧ��λ��λ����0��������ź�ֵ��Ϊ����֮һ�� # 最小的信号值,再把原信号位图中该信号对应的位复位(置0),最后将该信号值作为参数之一调 # ��do_signal()��do_signal()�ڣ�kernel/signal.c,128���У����������13����ջ����Ϣ�� # 用do_signal()。do_signal()在(kernel/signal.c,128)中,其参数包括13个入栈的信息。 # ��do_signal()���źŴ�����������֮��������ֵ��Ϊ0���ٿ����Ƿ���Ҫ�л����̻�������� # 在do_signal()或信号处理函数返回之后,若返回值不为0则再看看是否需要切换进程或继续处理 # �����źš� # 其它信号。 115 movl
-signal(%eax),%ebx # ȡ�ź�λͼ��ebx��ÿ1λ����1���źţ���32���źš� 116 movl
-blocked(%eax),%ecx # ȡ���������Σ��ź�λͼ��ecx�� 117 notl %ecx
-# ÿλȡ���� 118 andl %ebx,%ecx
-# ������ɵ��ź�λͼ�� 119 bsfl %ecx,%ecx
-# �ӵ�λ��λ0����ʼɨ��λͼ�����Ƿ���1��λ��
-# ���У���ecx������λ��ƫ��ֵ�����ڼ�λ0--31���� 120 je 3f # ���û���ź�����ǰ��ת�˳��� 121 btrl %ecx,%ebx
-# ��λ���źţ�ebx����ԭsignalλͼ���� 122 movl
-%ebx,signal(%eax) # ���±���signalλͼ��Ϣ��current->signal�� 123 incl %ecx
-# ���źŵ���Ϊ��1��ʼ������1--32���� 124 pushl %ecx
-# �ź�ֵ��ջ��Ϊ����do_signal�IJ���֮һ�� 125 call _do_signal
-# ����C�����źŴ�������kernel/signal.c��128���� 126 popl %ecx
-# ������ջ���ź�ֵ�� 127 testl %eax, %eax
-# ���Է���ֵ������Ϊ0����ת��ǰ����2��101�У����� 128 jne
@@ -2470,7 +2470,7 @@ see if we need to switch tasks, or do more signals 129 3: popl %eax
-# eax�к��е�100����ջ��ϵͳ���÷���ֵ�� 130 popl %ebx 133 addl $4,
%esp #
-skip orig_eax # ������������ԭeaxֵ�� 134 pop %fs 138 #### int16 -- �����������жϡ� ���ͣ����������롣 #### int16 -- 处理器错误中断。 类型:错误;无错误码。 # ����һ���ⲿ�Ļ���Ӳ�����쳣����Э���������Լ���������ʱ���ͻ�ͨ��ERROR���� # 这是一个外部的基于硬件的异常。当协处理器检测到自己发生错误时,就会通过ERROR引脚 # ֪ͨCPU������������ڴ���Э�����������ij����źš�����תȥִ��C����math_error() # 通知CPU。下面代码用于处理协处理器发出的出错信号。并跳转去执行C函数math_error() # ��kernel/math/error.c
-11�������غ���ת�����ret_from_sys_call������ִ�С� # (kernel/math/error.c
+11)。返回后将跳转到标号ret_from_sys_call处继续执行。 139 .align 2 144 pushl
$-1
- # fill in -1 for orig_eax # ��-1����������ϵͳ���á� 145 pushl %edx 150 mov %ax,%ds 152 movl $0x17,%eax
- # fs��Ϊָ��ֲ����ݶΣ�������������ݶΣ��� 153 mov %ax,%fs 154 pushl
-$ret_from_sys_call # ��������÷��صĵ�ַ��ջ�� 155 jmp _math_error
- # ִ��math_error()��kernel/math/error.c��11���� 156 #### int7 -- �豸�����ڻ�Э�����������ڡ� ���ͣ����������롣 #### int7 -- 设备不存在或协处理器不存在。 类型:错误;无错误码。 # ������ƼĴ��� CR0 ��EM��ģ�⣩��־��λ����CPU
-ִ��һ��Э������ָ��ʱ�ͻ������� # 如果控制寄存器 CR0 中EM(模拟)标志置位,则当CPU
+执行一个协处理器指令时就会引发该 # �жϣ�����CPU�Ϳ����л���������жϴ�������ģ��Э������ָ�181�У��� # 中断,这样CPU就可以有机会让这个中断处理程序模拟协处理器指令(181行)。 # CR0�Ľ�����־TS���� CPUִ������ת��ʱ���õġ�TS
-��������ȷ��ʲôʱ��Э�������е� # CR0的交换标志TS是在 CPU执行任务转换时设置的。TS
+可以用来确定什么时候协处理器中的 # ������CPU
-����ִ�е�����ƥ���ˡ���CPU ������һ��Э������ת��ָ��ʱ����TS��λʱ�� # 内容与CPU
+正在执行的任务不匹配了。当CPU 在运行一个协处理器转义指令时发现TS置位时, # �ͻ��������жϡ���ʱ�Ϳ��Ա���ǰһ�������Э���������ݣ����ָ��������Э������ִ�� # 就会引发该中断。此时就可以保存前一个任务的协处理器内容,并恢复新任务的协处理器执行 # ״̬��176�У����μ�kernel/sched.c��92�С����ж����ת�Ƶ���� # 状态(176行)。参见kernel/sched.c,92行。该中断最后将转移到标号ret_from_sys_call # ��ִ����ȥ����Ⲣ�����źţ��� # 处执行下去(检测并处理信号)。 157 .align 2 162 pushl
$-1
- # fill in -1 for orig_eax # ��-1����������ϵͳ���á� 163 pushl %edx 168 mov %ax,%ds 170 movl $0x17,%eax
- # fs��Ϊָ��ֲ����ݶΣ�������������ݶΣ��� 171 mov %ax,%fs # ��CR0�������ѽ�����־TS����ȡCR0ֵ��������Э�����������־EMû����λ��˵������ # 清CR0中任务已交换标志TS,并取CR0值。若其中协处理器仿真标志EM没有置位,说明不是 # EM������жϣ���ָ�����Э������״̬��ִ��C���� math_state_restore()�����ڷ���ʱ # EM引起的中断,则恢复任务协处理器状态,执行C函数 math_state_restore(),并在返回时 # ȥִ��ret_from_sys_call���Ĵ��롣 # 去执行ret_from_sys_call处的代码。 172 pushl
-$ret_from_sys_call # ��������ת����õķ��ص�ַ��ջ�� 173
@@ -2678,13 +2678,13 @@ EM (math emulation bit) 176 je
-_math_state_restore # ִ��math_state_restore()��kernel/sched.c��92�У��� # ��EM��־��λ����ȥִ����ѧ�������math_emulate()�� # 若EM标志置位,则去执行数学仿真程序math_emulate()。 177 pushl %ebp 181 call _math_emulate
- # ����C������math/math_emulate.c��476���� 182 addl $4,%esp
-# ������ʱ�洢�� 183 popl %edi 186 ret
- # �����ret����ת��ret_from_sys_call(107��)�� 187 #### int32 -- (int 0x20) ʱ���жϴ��������ж�Ƶ������Ϊ100Hz(include/linux/sched.h,4)�� #### int32 -- (int 0x20) 时钟中断处理程序。中断频率设置为100Hz(include/linux/sched.h,4), # ��ʱоƬ8253/8254����(kernel/sched.c,438)����ʼ���ġ��������jiffiesÿ10�����1�� # 定时芯片8253/8254是在(kernel/sched.c,438)处初始化的。因此这里jiffies每10毫秒加1。 # ��δ��뽫jiffies��1�����ͽ����ж�ָ���8259��������Ȼ���õ�ǰ��Ȩ����Ϊ�������� # 这段代码将jiffies增1,发送结束中断指令给8259控制器,然后用当前特权级作为参数调用 # C����do_timer(long
-CPL)�������÷���ʱתȥ��Ⲣ�����źš� # C函数do_timer(long
+CPL)。当调用返回时转去检测并处理信号。 188 .align 2 192 push %fs
-# ����ds��es������ָ���ں����ݶΡ�fs������system_call�� 193 pushl
$-1
- # fill in -1 for orig_eax # ��-1����������ϵͳ���á� # �������DZ���Ĵ���eax��ecx��edx��������Ϊgcc�������ڵ��ú���ʱ���ᱣ�����ǡ�����Ҳ # 下面我们保存寄存器eax、ecx和edx。这是因为gcc编译器在调用函数时不会保存它们。这里也 # ������ebx�Ĵ�������Ϊ�ں���ret_from_sys_call�л��õ����� # 保存了ebx寄存器,因为在后面ret_from_sys_call中会用到它。 194 pushl
@@ -2794,7 +2794,7 @@ lang=EN-US> pushl %eax 199 mov %ax,%ds 201 movl $0x17,%eax
- # fs��Ϊָ��ֲ����ݶΣ���������ݶΣ��� 202 mov %ax,%fs 203 incl _jiffies # ���ڳ�ʼ���жϿ���оƬʱû�в����Զ�EOI������������Ҫ��ָ�������Ӳ���жϡ� # 由于初始化中断控制芯片时没有采用自动EOI,所以这里需要发指令结束该硬件中断。 204 movb
@@ -2825,13 +2825,13 @@ lang=EN-US> outb %al,$0x20 # ����Ӷ�ջ��ȡ��ִ��ϵͳ���ô����ѡ�����CS�μĴ���ֵ���еĵ�ǰ��Ȩ����(0��3)��ѹ�� # 下面从堆栈中取出执行系统调用代码的选择符(CS段寄存器值)中的当前特权级别(0或3)并压入 # ��ջ����Ϊdo_timer�IJ�����do_timer()����ִ�������л�����ʱ�ȹ�������kernel/sched.c�� # 堆栈,作为do_timer的参数。do_timer()函数执行任务切换、计时等工作,在kernel/sched.c, # 324��ʵ�֡� # 324行实现。 206 movl CS(%esp),%eax
-#### ����sys_execve()ϵͳ���á�ȡ�жϵ��ó���Ĵ���ָ����Ϊ��������C����do_execve()�� # do_execve()��fs/exec.c��207�С� # do_execve()在fs/exec.c,207行。 213 .align 2 215 lea EIP(%esp),%eax
- # eaxָ���ջ�б����û�����eipָ�봦�� 216 pushl %eax 219 ret 220 #### sys_fork()���ã����ڴ����ӽ��̣���system_call����2��ԭ����include/linux/sys.h�С� #### sys_fork()调用,用于创建子进程,是system_call功能2。原形在include/linux/sys.h中。 # ���ȵ���C����find_empty_process()��ȡ��һ�����̺�last_pid�������ظ�����˵��Ŀǰ���� # 首先调用C函数find_empty_process(),取得一个进程号last_pid。若返回负数则说明目前任务 # ����������Ȼ�����copy_process()���ƽ��̡� # 数组已满。然后调用copy_process()复制进程。 221 .align 2 223 call
-_find_empty_process # Ϊ�½���ȡ�ý��̺�last_pid����kernel/fork.c��143���� 224 testl %eax,%eax
-# ��eax�з��ؽ��̺š������ظ������˳��� 225 js 1f 232 addl $20,%esp
-# ������������ѹջ���ݡ� 233 1: ret 234 #### int 46 -- (int 0x2E) Ӳ���жϴ���������ӦӲ���ж�����IRQ14�� #### int 46 -- (int 0x2E) 硬盘中断处理程序,响应硬件中断请求IRQ14。 # �������Ӳ�̲�����ɻ�����ͻᷢ�����ж��źš�(�μ�kernel/blk_drv/hd.c)�� # 当请求的硬盘操作完成或出错就会发出此中断信号。(参见kernel/blk_drv/hd.c)。 # ������8259A�жϿ��ƴ�оƬ���ͽ���Ӳ���ж�ָ��(EOI)��Ȼ��ȡ����do_hd�еĺ���ָ�����edx # 首先向8259A中断控制从芯片发送结束硬件中断指令(EOI),然后取变量do_hd中的函数指针放入edx # �Ĵ����У�����do_hdΪNULL�������ж�edx����ָ���Ƿ�Ϊ�ա����Ϊ�գ����edx��ֵָ�� # 寄存器中,并置do_hd为NULL,接着判断edx函数指针是否为空。如果为空,则给edx赋值指向 # unexpected_hd_interrupt()��������ʾ������Ϣ�������8259A��оƬ��EOIָ�������edx�� # unexpected_hd_interrupt(),用于显示出错信息。随后向8259A主芯片送EOI指令,并调用edx中 # ָ��ָ��ĺ���: read_intr()��write_intr()��unexpected_hd_interrupt()�� # 指针指向的函数: read_intr()、write_intr()或unexpected_hd_interrupt()。 235 _hd_interrupt: 242 movl $0x10,%eax
- # ds,es��Ϊ�ں����ݶΡ� 243 mov %ax,%ds 245 movl $0x17,%eax
- # fs��Ϊ���ó���ľֲ����ݶΡ� 246 mov %ax,%fs # ���ڳ�ʼ���жϿ���оƬʱû�в����Զ�EOI������������Ҫ��ָ�������Ӳ���жϡ� # 由于初始化中断控制芯片时没有采用自动EOI,所以这里需要发指令结束该硬件中断。 247 movb $0x20,%al 249 jmp 1f # give port chance to breathe
-# ����jmp����ʱ���á� 250 1: jmp 1f # do_hd����Ϊһ������ָ�룬������ֵread_intr()��write_intr()������ַ���ŵ�edx�Ĵ����� # do_hd定义为一个函数指针,将被赋值read_intr()或write_intr()函数地址。放到edx寄存器后 # �ͽ�do_hdָ�������ΪNULL��Ȼ����Եõ��ĺ���ָ�룬����ָ��Ϊ�գ������ָ��ָ��C # 就将do_hd指针变量置为NULL。然后测试得到的函数指针,若该指针为空,则赋予该指针指向C # ����unexpected_hd_interrupt()���Դ���δ֪Ӳ���жϡ� # 函数unexpected_hd_interrupt(),以处理未知硬盘中断。 251 1: xorl %edx,%edx 252 movl
-%edx,_hd_timeout # hd_timeout��Ϊ0����ʾ���������ڹ涨ʱ���ڲ������жϡ� 253 xchgl _do_hd,%edx 255 jne 1f # ���գ�����ָ��ָ��C����unexpected_hd_interrupt()�� 256 movl
@@ -3061,8 +3061,8 @@ $_unexpected_hd_interrupt,%edx 257 1: outb %al,$0x20
-# ��8259A��оƬEOIָ�����Ӳ���жϣ��� 258 call
@@ -3071,7 +3071,7 @@ lang=EN-US> call
259 pop %fs
-# �Ͼ����do_hdָ���C������ 260 pop %es 266 #### int38 -- (int 0x26) �����������жϴ���������ӦӲ���ж�����IRQ6�� #### int38 -- (int 0x26) 软盘驱动器中断处理程序,响应硬件中断请求IRQ6。 # �䴦�������������Ӳ�̵Ĵ�������һ������kernel/blk_drv/floppy.c���� # 其处理过程与上面对硬盘的处理基本一样。(kernel/blk_drv/floppy.c)。 # ������8259A�жϿ�������оƬ����EOIָ�Ȼ��ȡ����do_floppy�еĺ���ָ�����eax # 首先向8259A中断控制器主芯片发送EOI指令,然后取变量do_floppy中的函数指针放入eax # �Ĵ����У�����do_floppyΪNULL�������ж�eax����ָ���Ƿ�Ϊ�ա���Ϊ�գ����eax��ֵָ�� # 寄存器中,并置do_floppy为NULL,接着判断eax函数指针是否为空。如为空,则给eax赋值指向 # unexpected_floppy_interrupt ()��������ʾ������Ϣ��������eaxָ��ĺ���: rw_interrupt, # unexpected_floppy_interrupt (),用于显示出错信息。随后调用eax指向的函数: rw_interrupt, #
-seek_interrupt,recal_interrupt,reset_interrupt��unexpected_floppy_interrupt�� 267 _floppy_interrupt: 274 movl $0x10,%eax
- # ds,es��Ϊ�ں����ݶΡ� 275 mov %ax,%ds 277 movl $0x17,%eax
- # fs��Ϊ���ó���ľֲ����ݶΡ� 278 mov %ax,%fs 279 movb $0x20,%al
-# ����8259A�жϿ�����EOIָ�����Ӳ���жϣ��� 280 outb
%al,$0x20 #
EOI to interrupt controller #1 # do_floppyΪһ����ָ�룬������ֵʵ�ʴ���C����ָ�롣��ָ���ڱ������ŵ�eax�Ĵ�����ͽ� # do_floppy为一函数指针,将被赋值实际处理C函数指针。该指针在被交换放到eax寄存器后就将 # do_floppy�����ÿա�Ȼ�����eax��ԭָ���Ƿ�Ϊ�գ�������ʹָ��ָ��C���� # do_floppy变量置空。然后测试eax中原指针是否为空,若是则使指针指向C函数 # unexpected_floppy_interrupt()�� # unexpected_floppy_interrupt()。 281 xorl %eax,%eax 283 testl %eax,%eax
-# ���Ժ���ָ���Ƿ�=NULL? 284 jne 1f # ���գ���ʹָ��ָ��C����unexpected_floppy_interrupt()�� 285 movl
@@ -3190,11 +3190,11 @@ $_unexpected_floppy_interrupt,%eax 286 1: call
*%eax #
-"interesting" way of handling intr. # ��ӵ��á� 287 pop %fs
- # �Ͼ����do_floppyָ��ĺ����� 288 pop %es 294 #### int 39 -- (int 0x27) ���п��жϴ�������ӦӲ���ж������ź�IRQ7�� #### int 39 -- (int 0x27) 并行口中断处理程序,对应硬件中断请求信号IRQ7。 # ���汾�ں˻�δʵ�֡�����ֻ�Ƿ���EOIָ� # 本版本内核还未实现。这里只是发送EOI指令。 295 _parallel_interrupt: ����8-4 linux/kernel/mktime.c���� 7
#include <time.h>
-// ʱ��ͷ�ļ��������˱�ʱ�����ݽṹtm��һЩ����ʱ�亯��ԭ�͡� 8 * �ⲻ�ǿ⺯�����������ں�ʹ�á�������Dz�����С��1970�����ݵȣ����ٶ�һ�о��������� * 这不是库函数,它仅供内核使用。因此我们不关心小于1970年的年份等,但假定一切均很正常。 * ͬ����ʱ������TZ����Ҳ�Ⱥ��ԡ�����ֻ�Ǿ����ܼش������⡣������ҵ�һЩ�����Ŀ⺯�� * 同样,时间区域TZ问题也先忽略。我们只是尽可能简单地处理问题。最好能找到一些公开的库函数 * ����������Ϊminix��ʱ�亯���ǹ����ģ��� * (尽管我认为minix的时间函数是公开的)。 * ���⣬�Һ��Ǹ�����1970�꿪ʼ���� - �ѵ����ǾͲ���ѡ���һ�����꿪ʼ���Һ���������� * 另外,我恨那个设置1970年开始的人 - 难道他们就不能选择从一个闰年开始?我恨格里高利历、 * �����̻ʡ����̣���ʲô�����ں������Ǹ�Ƣ��������ˡ� * 罗马教皇、主教,我什么都不在乎。我是个脾气暴躁的人。 */ 20
#define MINUTE 60
-// 1���ӵ������� 21
#define HOUR (60*MINUTE)
-// 1Сʱ�������� 22
#define DAY (24*HOUR)
-// 1��������� 23
#define YEAR (365*DAY)
-// 1��������� 24 25 /*
interestingly, we assume leap-years */ /* ��Ȥ�������ǿ��ǽ������� /* 有趣的是我们考虑进了闰年 */ // ��������Ϊ���ޣ�������ÿ���¿�ʼʱ������ʱ�䡣 // 下面以年为界限,定义了每个月开始时的秒数时间。 26
static int month[12] = { 40 // �ú��������1970��1��1��0ʱ�������վ�������������Ϊ����ʱ�䡣 // 该函数计算从1970年1月1日0时起到开机当日经过的秒数,作为开机时间。 // ����tm�и��ֶ��Ѿ���init/main.c�б���ֵ����Ϣȡ��CMOS�� // 参数tm中各字段已经在init/main.c中被赋值,信息取自CMOS。 41
long kernel_mktime(struct 45 // ���ȼ���70�굽���ھ�������������Ϊ��2λ��ʾ��ʽ�����Ի���2000�����⡣���ǿ��� // 首先计算70年到现在经过的年数。因为是2位表示方式,所以会有2000年问题。我们可以 // ������ǰ������һ����������������⣺ // 简单地在最前面添加一条语句来解决这个问题:if (tm->tm_year<70) tm->tm_year += 100; // ����UNIX�����y�Ǵ�1970�����𡣵�1972�����һ�����꣬��˹�3�꣨71��72��73�� // 由于UNIX计年份y是从1970年算起。到1972年就是一个闰年,因此过3年(71,72,73) // ���ǵ�1�����꣬������1970�꿪ʼ�����������㷽����Ӧ����Ϊ1 + (y - 3)/4����Ϊ // 就是第1个闰年,这样从1970年开始的闰年数计算方法就应该是为1 + (y - 3)/4,即为 // (y +
-1)/4��res = ��Щ�꾭��������ʱ�� + ÿ������ʱ��1�������ʱ�� + ���굽����ʱ // �����������⣬month[]�������Ѿ���2�·ݵ������а�����������ʱ����������2�·����� // 的秒数。另外,month[]数组中已经在2月份的天数中包含进了闰年时的天数,即2月份天数 // ������ 1�졣��ˣ������겻�����겢�ҵ�ǰ�·ݴ��� 2�·ݵĻ������Ǿ�Ҫ��ȥ���졣�� // 多算了 1天。因此,若当年不是闰年并且当前月份大于 2月份的话,我们就要减去这天。因 // Ϊ��70�꿪ʼ�������Ե�����������жϷ�����
-(y + 2) �ܱ�4�����������ܳ��������� // 为从70年开始算起,所以当年是闰年的判断方法是
+(y + 2) 能被4除尽。若不能除尽(有余 // �����Ͳ������ꡣ // 数)就不是闰年。 46
year = tm->tm_year - 70; 47 /*
magic offsets (y+1) needed to get leapyears right.*/ /* Ϊ�˻����ȷ����������������Ҫ����һ��ħ��ֵ /* 为了获得正确的闰年数,这里需要这样一个魔幻值(y+1) */ 48
@@ -2042,9 +2042,9 @@ res += month[
50 /*
and (y+2) here. If it wasn't a leap-year, we have to adjust */ /* �Լ�(y+2)�����(y+2)�������꣬��ô���Ǿͱ�����е���(��ȥһ�������ʱ��)��*/ /* 以及(y+2)。如果(y+2)不是闰年,那么我们就必须进行调整(减去一天的秒数时间)。*/ 51
if (tm->tm_mon>1
@@ -2055,24 +2055,24 @@ res -= DAY; 53
res += DAY*(tm->tm_mday-1);
-// �ټ��ϱ��¹�ȥ������������ʱ�䡣 54
res += HOUR*tm->tm_hour;
-// �ټ��ϵ����ȥ��Сʱ��������ʱ�䡣 55
res += MINUTE*tm->tm_min;
-// �ټ���1Сʱ�ڹ�ȥ�ķ�����������ʱ�䡣 56
res += tm->tm_sec;
-// �ټ���1�������ѹ��������� 57
return res;
-// �����ڴ�1970����������������ʱ�䡣 58 } ����程序8-5 linux/kernel/sched.c /* * 'sched.c'����Ҫ���ں��ļ������а����йص��ȵĻ�������(sleep_on��wakeup��schedule�� * 'sched.c'是主要的内核文件。其中包括有关调度的基本函数(sleep_on、wakeup、schedule等) * �Լ�һЩ��ϵͳ���ú���������getpid()�����ӵ�ǰ�����л�ȡһ���ֶΣ��� * 以及一些简单的系统调用函数(比如getpid(),仅从当前任务中获取一个字段)。 */ // �����ǵ��ȳ���ͷ�ļ�������������ṹtask_struct����1����ʼ��������ݡ�����һЩ�Ժ� // 下面是调度程序头文件。定义了任务结构task_struct、第1个初始任务的数据。还有一些以宏 // ����ʽ������й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������ // 的形式定义的有关描述符参数设置和获取的嵌入式汇编函数程序。 13
#include <linux/sched.h> 14
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 15
-#include <linux/sys.h> // ϵͳ����ͷ�ļ�������82��ϵͳ����C��������,��'sys_'��ͷ�� 16
-#include <linux/fdreg.h> // ����ͷ�ļ����������̿�����������һЩ���塣 17
-#include <asm/system.h> // ϵͳͷ�ļ������������û���������/�ж��ŵȵ�Ƕ��ʽ���ꡣ 18
-#include <asm/io.h> // ioͷ�ļ�������Ӳ���˿�����/���������䡣 19
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 20 21
-#include <signal.h> // �ź�ͷ�ļ��������źŷ��ų�����sigaction�ṹ����������ԭ�͡� 22 // �ú�ȡ�ź�nr���ź�λͼ�ж�Ӧλ�Ķ�������ֵ���źű��1-32�������ź�5��λͼ��ֵ���� // 该宏取信号nr在信号位图中对应位的二进制数值。信号编号1-32。比如信号5的位图数值等于 // 1<<(5-1) = 16 =
-00010000b�� 23
#define _S(nr) (1<<((nr)-1)) // ����SIGKILL��SIGSTOP�ź����������źŶ��ǿ�������(��1011,1111,1110,1111,1111b)�� // 除了SIGKILL和SIGSTOP信号以外其他信号都是可阻塞的(…1011,1111,1110,1111,1111b)。 24
#define _BLOCKABLE (~(_S(SIGKILL)
25 // �ں˵��Ժ�������ʾ�����nr�Ľ��̺š�����״̬���ں˶�ջ�����ֽ�������Լ���� // 内核调试函数。显示任务号nr的进程号、进程状态和内核堆栈空闲字节数(大约)。 26
void show_task(int nr,struct 33
-while (i<j && !((char *)(p+1))[i]) // ���ָ���������ݽṹ�Ժ����0���ֽ����� 34
i++; 44 // ��ʾ�������������š����̺š�����״̬���ں˶�ջ�����ֽ�������Լ���� // 显示所有任务的任务号、进程号、进程状态和内核堆栈空闲字节数(大约)。 // NR_TASKS��ϵͳ�����ɵ�������(����)����(64��)��������include/kernel/sched.h ��6�С� // NR_TASKS是系统能容纳的最大进程(任务)数量(64个),定义在include/kernel/sched.h 第6行。 45
void show_state(void) 54 // PC��8253��ʱоƬ������ʱ��Ƶ��ԼΪ1.193180MHz��Linux�ں�ϣ����ʱ�������жϵ�Ƶ���� // PC机8253定时芯片的输入时钟频率约为1.193180MHz。Linux内核希望定时器发出中断的频率是 // 100Hz��Ҳ��ÿ10ms����һ��ʱ���жϡ��������LATCH������8253оƬ�ij�ֵ���μ�438�С� // 100Hz,也即每10ms发出一次时钟中断。因此这里LATCH是设置8253芯片的初值,参见438行。 55
#define LATCH (1193180/HZ) 57
extern void mem_use(void); //
-[??]û���κεط���������øú����� 58 59
extern int timer_interrupt(void);
-// ʱ���жϴ�������kernel/system_call.s��176���� 60
extern int system_call(void);
-// ϵͳ�����жϴ�������kernel/system_call.s��80���� 61 // ÿ�������̣����ں�̬����ʱ�����Լ����ں�̬��ջ�����ﶨ����������ں�̬��ջ�ṹ�� // 每个任务(进程)在内核态运行时都有自己的内核态堆栈。这里定义了任务的内核态堆栈结构。 // ���ﶨ���������ϣ�����ṹ��Ա��stack�ַ������Ա������Ϊһ����������ݽṹ�����ں� // 这里定义任务联合(任务结构成员和stack字符数组成员)。因为一个任务的数据结构与其内核 // ̬��ջ����ͬһ�ڴ�ҳ�У����ԴӶ�ջ�μĴ���ss���Ի�������ݶ�ѡ����� // 态堆栈放在同一内存页中,所以从堆栈段寄存器ss可以获得其数据段选择符。 62
union task_union { 66 // ���ó�ʼ��������ݡ���ʼ������include/kernel/sched.h�У���156�п�ʼ�� // 设置初始任务的数据。初始数据在include/kernel/sched.h中,第156行开始。 67
static union task_union init_task = {INIT_TASK
68 // �ӿ�����ʼ����ĵδ���ʱ��ֵȫ�ֱ�����10ms/�δ𣩡�ϵͳʱ���ж�ÿ����һ�μ�һ���δ� // 从开机开始算起的滴答数时间值全局变量(10ms/滴答)。系统时钟中断每发生一次即一个滴答。 // ǰ������� volatile��Ӣ�Ľ������ı�ġ����ȶ�����˼��������ʵĺ������������ // 前面的限定符 volatile,英文解释是易改变的、不稳定的意思。这个限定词的含义是向编译器 // ָ�����������ݿ��ܻ����ڱ����������Ķ��仯��ͨ���ڳ���������һ������ʱ��
-�������� // 指明变量的内容可能会由于被其他程序修改而变化。通常在程序中申明一个变量时,
+编译器会 // �������������ͨ�üĴ����У����� ebx������߷���Ч�ʡ���CPU����ֵ�ŵ� ebx�к�һ�� // 尽量把它存放在通用寄存器中,例如 ebx,以提高访问效率。当CPU把其值放到 ebx中后一般 // �Ͳ����ٹ��ĸñ�����Ӧ�ڴ�λ���е����ݡ�����ʱ�������������ں˳����һ���жϹ��̣� // 就不会再关心该变量对应内存位置中的内容。若此时其他程序(例如内核程序或一个中断过程) // �����ڴ��иñ�����ֵ��ebx�е�ֵ��������֮���¡�Ϊ�˽����������ʹ�����volatile // 修改了内存中该变量的值,ebx中的值并不会随之更新。为了解决这种情况就创建了volatile // �������ô��������øñ���ʱһ��Ҫ��ָ���ڴ�λ����ȡ����ֵ�����T��Ҫ��
-gcc��Ҫ�� // 限定符,让代码在引用该变量时一定要从指定内存位置中取得其值。这里即是要求
+gcc不要对 // jiffies �����Ż�������Ҳ��ҪŲ��λ�ã�������Ҫ���ڴ���ȡ��ֵ����Ϊʱ���жϴ������� // jiffies 进行优化处理,也不要挪动位置,并且需要从内存中取其值。因为时钟中断处理过程 // �ȳ����������ֵ�� // 等程序会修改它的值。 69
unsigned long volatile jiffies=0; 70
unsigned long startup_time=0;
- // ����ʱ�䡣��1970:0:0:0��ʼ��ʱ�������� // ������������ۼ���Ҫ������ʱ��������� // 这个变量用于累计需要调整地时间嘀嗒数。 71 int
jiffies_offset =
@@ -2164,13 +2164,13 @@ like to syncronize their machines 75 to
WWV :-) */ /* Ϊ����ʱ�Ӷ���Ҫ���ӵ�ʱ����������Ի�á���ȷʱ�䡱����Щ����������� /* 为调整时钟而需要增加的时钟嘀嗒数,以获得“精确时间”。这些调整用嘀嗒数 * ���ܺͲ�Ӧ�ó���1�롣��������Ϊ����Щ��ʱ�侫ȷ��Ҫ����̵��ˣ�����ϲ * 的总和不应该超过1秒。这样做是为了那些对时间精确度要求苛刻的人,他们喜 * ���Լ��Ļ���ʱ����WWVͬ�� :-) * 欢自己的机器时间与WWV同步 :-) */ 77
struct task_struct *current = &(init_task.task); // ��ǰ����ָ�루��ʼ��ָ������0���� 78
struct task_struct *last_task_used_math = NULL;
-// ʹ�ù�Э�����������ָ�롣 79 // ��������ָ�����顣��1���ʼ��ָ���ʼ��������0�����������ݽṹ�� // 定义任务指针数组。第1项被初始化指向初始任务(任务0)的任务数据结构。 80
struct task_struct * task), }; 81 // �����û���ջ����1K�����4K�ֽڡ����ں˳�ʼ�����������б������ں�ջ����ʼ����� // 定义用户堆栈,共1K项,容量4K字节。在内核初始化操作过程中被用作内核栈,初始化完成 // �Ժ���������0���û�̬��ջ������������0֮ǰ�����ں�ջ���Ժ���������0��1���� // 以后将被用作任务0的用户态堆栈。在运行任务0之前它是内核栈,以后用作任务0和1的用 // ��̬ջ������ṹ�������ö�ջss:esp�����ݶ�ѡ�����ָ�룩����head.s����23�С� // 户态栈。下面结构用于设置堆栈ss:esp(数据段选择符,指针),见head.s,第23行。 // ss������Ϊ�ں����ݶ�ѡ�����0x10����ָ��espָ�� user_stack�������һ����档���� // ss被设置为内核数据段选择符(0x10),指针esp指在 user_stack数组最后一项后面。这是 // ��ΪIntel
-CPUִ�ж�ջ����ʱ���ȵݼ���ջָ��spֵ��Ȼ����spָ�봦������ջ���ݡ� // 因为Intel
+CPU执行堆栈操作时是先递减堆栈指针sp值,然后在sp指针处保存入栈内容。 82
long user_stack [
/* * ����ǰЭ���������ݱ��浽��Э������״̬�����У�������ǰ�����Э������ * 将当前协处理器内容保存到老协处理器状态数组中,并将当前任务的协处理器 * ���ݼ��ؽ�Э�������� * 内容加载进协处理器。 */ // �������Ƚ������Ժú������Ա���ԭ�����Э������״̬�������ģ����ָ��µ��Ƚ� // 当任务被调度交换过以后,该函数用以保存原任务的协处理器状态(上下文)并恢复新调度进 // ���ĵ�ǰ�����Э������ִ��״̬�� // 来的当前任务的协处理器执行状态。 92
void math_state_restore() 93 { // �������û����(��һ��������ǵ�ǰ����)������"��һ������"��ָ�ձ�������ȥ������ // 如果任务没变则返回(上一个任务就是当前任务)。这里"上一个任务"是指刚被交换出去的任务。 94
if (last_task_used_math == current) 95
return; // �ڷ���Э����������֮ǰҪ�ȷ�WAITָ�����ϸ�����ʹ����Э������������״̬�� // 在发送协处理器命令之前要先发WAIT指令。如果上个任务使用了协处理器,则保存其状态。 96
__asm__("fwait"); 99
} // ���ڣ�last_task_used_mathָ��ǰ�����Ա���ǰ��������ȥʱʹ�á���ʱ�����ǰ // 现在,last_task_used_math指向当前任务,以备当前任务被交换出去时使用。此时如果当前 // �����ù�Э����������ָ���״̬������Ļ�˵���ǵ�һ��ʹ�ã����Ǿ���Э����������ʼ�� // 任务用过协处理器,则恢复其状态。否则的话说明是第一次使用,于是就向协处理器发初始化 // ���������ʹ����Э��������־�� // 命令,并设置使用了协处理器标志。 100 } else { 104
__asm__("fninit"::);
- // ��Э����������ʼ����� 105
current->used_math=1;
- // ����ʹ����Э��������־�� 106 } /* * 'schedule()'�ǵ��Ⱥ��������Ǹ��ܺõĴ��룡û���κ����ɶ��������ģ���Ϊ * 'schedule()'是调度函数。这是个很好的代码!没有任何理由对它进行修改,因为 * �����������еĻ����¹����������ܹ���IO-�߽紦���ܺõ���Ӧ�ȣ���ֻ��һ�� * 它可以在所有的环境下工作(比如能够对IO-边界处理很好的响应等)。只有一件 * ��ֵ�����⣬�Ǿ���������źŴ������롣 * 事值得留意,那就是这里的信号处理代码。 * * ע�⣡������0�Ǹ�����('idle')����ֻ�е�û�����������������ʱ�ŵ��� * 注意!!任务0是个闲置('idle')任务,只有当没有其他任务可以运行时才调用 * ���������ܱ�ɱ����Ҳ����˯�ߡ�����0�е�״̬��Ϣ'state'�Ǵ������õġ� * 它。它不能被杀死,也不能睡眠。任务0中的状态信息'state'是从来不用的。 */ 122 struct task_struct ** p;
- // ����ṹָ���ָ�롣 123 /* ���alarm�����̵ı�����ʱֵ���������κ��ѵõ��źŵĿ��ж����� /* 检测alarm(进程的报警定时值),唤醒任何已得到信号的可中断任务 */ 125 // ���������������һ������ʼѭ�����alarm����ѭ��ʱ������ָ��� // 从任务数组中最后一个任务开始循环检测alarm。在循环时跳过空指针项。 126 for(p = &FIRST_TASK ; --p) // ������ù�����ʱ��ʱtimeout�������Ѿ���ʱ����λ��ʱ��ʱֵ��������������ڿ� // 如果设置过任务超时定时timeout,并且已经超时,则复位超时定时值,并且如果任务处于可 // �ж�˯��״̬TASK_INTERRUPTIBLE�£�������Ϊ����״̬��TASK_RUNNING���� // 中断睡眠状态TASK_INTERRUPTIBLE下,将其置为就绪状态(TASK_RUNNING)。 128
@@ -2454,16 +2454,16 @@ style='color:blue'>TASK_RUNNING; // ������ù�����Ķ�ʱֵalarm�������Ѿ�����(alarm<jiffies),�����ź�λͼ���� // 如果设置过任务的定时值alarm,并且已经过期(alarm<jiffies),则在信号位图中置SIGALRM // �źţ�����������SIGALARM�źš�Ȼ����alarm�����źŵ�Ĭ�ϲ�������ֹ���̡� // 信号,即向任务发送SIGALARM信号。然后清alarm。该信号的默认操作是终止进程。jiffies // ��ϵͳ�ӿ�����ʼ����ĵδ�����10ms/�δ𣩡�������sched.h��139�С� // 是系统从开机开始算起的滴答数(10ms/滴答)。定义在sched.h第139行。 133
@@ -2483,13 +2483,13 @@ lang=EN-US> &nb
lang=EN-US>
} // ����ź�λͼ�г����������ź���������źţ����������ڿ��ж�״̬����������Ϊ���� // 如果信号位图中除被阻塞的信号外还有其他信号,并且任务处于可中断状态,则置任务为就绪 // ״̬������'~(_BLOCKABLE & (*p)->blocked)'���ں��Ա��������źţ���SIGKILL��SIGSTOP // 状态。其中'~(_BLOCKABLE & (*p)->blocked)'用于忽略被阻塞的信号,但SIGKILL和SIGSTOP // ���ܱ������� // 不能被阻塞。 137
@@ -2504,7 +2504,7 @@ style='color:blue'>TASK_INTERRUPTIBLE) 139
(*p)->state=TASK_RUNNING; //��Ϊ��������ִ�У�״̬�� 140
@@ -2516,7 +2516,7 @@ lang=EN-US> 142 /* this is the scheduler proper: */ /* �����ǵ��ȳ������Ҫ���� /* 这里是调度程序的主要部分 */ 143 &nb
p = &task[NR_TASKS]; // ��δ���Ҳ�Ǵ�������������һ������ʼѭ���������������������������ۡ��Ƚ�ÿ�� // 这段代码也是从任务数组的最后一个任务开始循环处理,并跳过不含任务的数组槽。比较每个 // ����״̬�����counter����������ʱ��ĵݼ��δ������ֵ����һ��ֵ������ʱ�仹������ // 就绪状态任务的counter(任务运行时间的递减滴答计数)值,哪一个值大,运行时间还不长, // next��ָ���ĸ�������š� // next就指向哪个的任务号。 149
@@ -2574,20 +2574,20 @@ style='color:blue'>TASK_RUNNING && (*p)->counter > c)
lang=EN-US>
} // ����Ƚϵó���counterֵ������0�Ľ��������ϵͳ��û��һ�������е�������ڣ���ʱ // 如果比较得出有counter值不等于0的结果,或者系统中没有一个可运行的任务存在(此时c // ��ȻΪ-1��next=0�������˳�144�п�ʼ��ѭ����ִ��161���ϵ������л�������������� // 仍然为-1,next=0),则退出144行开始的循环,执行161行上的任务切换操作。否则就根据 // ÿ�����������Ȩֵ������ÿһ�������counterֵ��Ȼ��ص�125�����±Ƚϡ�counter ֵ // 每个任务的优先权值,更新每一个任务的counter值,然后回到125行重新比较。counter 值 // �ļ��㷽ʽΪ counter = counter /2 + priority��ע�⣬���������̲����ǽ��̵�״̬�� // 的计算方式为 counter = counter /2 + priority。注意,这里计算过程不考虑进程的状态。 155
@@ -2613,23 +2613,23 @@ lang=EN-US> &nb
160 } // ������꣨������sched.h�У��ѵ�ǰ����ָ��currentָ�������Ϊnext�������л� // 用下面宏(定义在sched.h中)把当前任务指针current指向任务号为next的任务,并切换 // �������������С���146����next����ʼ��Ϊ0�������ϵͳ��û���κ��������������ʱ�� // 到该任务中运行。在146行上next被初始化为0。因此若系统中没有任何其他任务可运行时, // �� next
-ʼ��Ϊ0����˵��Ⱥ�������ϵͳ����ʱȥִ������0��
-��ʱ����0��ִ��pause() // 则 next
+始终为0。因此调度函数会在系统空闲时去执行任务0。
+此时任务0仅执行pause() // ϵͳ���ã����ֻ���ñ������� // 系统调用,并又会调用本函数。 161 switch_to(next); //
-�л��������Ϊnext����������֮�� 162 } 163 //// pause()ϵͳ���á�ת����ǰ�����״̬Ϊ���жϵĵȴ�״̬�������µ��ȡ� //// pause()系统调用。转换当前任务的状态为可中断的等待状态,并重新调度。 // ��ϵͳ���ý����½��̽���˯��״̬��ֱ���յ�һ���źš����ź�������ֹ���̻���ʹ���� // 该系统调用将导致进程进入睡眠状态,直到收到一个信号。该信号用于终止进程或者使进程 // ����һ���źŲ�������ֻ�е�������һ���źţ������źŲ������������أ�pause()�� // 调用一个信号捕获函数。只有当捕获了一个信号,并且信号捕获处理函数返回,pause()才 // �᷵�ء���ʱ pause()����ֵӦ���� -1������ errno����Ϊ
-EINTR�����ﻹû����ȫʵ�� // 会返回。此时 pause()返回值应该是 -1,并且 errno被置为
+EINTR。这里还没有完全实现 // ��ֱ��0.95�棩�� // (直到0.95版)。 164 int sys_pause(void) 170 // �ѵ�ǰ������Ϊָ����˯��״̬�����жϵĻ��жϵģ�������˯�߶���ͷָ��ָ��ǰ���� // 把当前任务置为指定的睡眠状态(可中断的或不可中断的),并让睡眠队列头指针指向当前任务。 // ��������p�ǵȴ��������ͷָ�롣ָ���Ǻ���һ��������ַ�ı������������pʹ����ָ��� // 函数参数p是等待任务队列头指针。指针是含有一个变量地址的变量。这里参数p使用了指针的 // ָ����ʽ '**p'��������ΪC��������ֻ�ܴ�ֵ��û��ֱ�ӵķ�ʽ�ñ����ú����ı���øú��� // 指针形式 '**p',这是因为C函数参数只能传值,没有直接的方式让被调用函数改变调用该函数 // �����б�����ֵ������ָ��'*p'ָ���Ŀ�꣨����������ṹ����ı䣬���Ϊ�����ĵ��ø� // 程序中变量的值。但是指针'*p'指向的目标(这里是任务结构)会改变,因此为了能修改调用该 // ����������ԭ������ָ�������ֵ������Ҫ����ָ��'*p'��ָ�룬��'**p'���μ�����ǰʾ��ͼ�� // 函数程序中原来就是指针变量的值,就需要传递指针'*p'的指针,即'**p'。参见程序前示例图中 // pָ���ʹ������� // p指针的使用情况。 // ����state������˯��ʹ�õ�״̬��TASK_UNINTERRUPTIBLE��TASK_INTERRUPTIBLE�����ڲ��� // 参数state是任务睡眠使用的状态:TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE。处于不可 // �ж�˯��״̬��TASK_UNINTERRUPTIBLE����������Ҫ�ں˳�������wake_up()������ȷ����֮�� // 中断睡眠状态(TASK_UNINTERRUPTIBLE)的任务需要内核程序利用wake_up()函数明确唤醒之。 // ���ڿ��ж�˯��״̬��TASK_INTERRUPTIBLE������ͨ���źš�����ʱ���ֶλ��� ����Ϊ���� // 处于可中断睡眠状态(TASK_INTERRUPTIBLE)可以通过信号、任务超时等手段唤醒 (置为就绪 // ״̬TASK_RUNNING���� // 状态TASK_RUNNING)。 // *** ע�⣬���ڱ��ں˴��벻�Ǻܳ��죬���������˯����صĴ������һЩ���⣬������� // *** 注意,由于本内核代码不是很成熟,因此下列与睡眠相关的代码存在一些问题,不宜深究。 171 static inline void __sleep_on(struct
@@ -2718,11 +2718,11 @@ style='color:blue'>task_struct *tmp; 174 // ��ָ����Ч�����˳�����ָ����ָ�Ķ��������NULL����ָ�뱾������Ϊ0)�� // 若指针无效,则退出。(指针所指的对象可以是NULL,但指针本身不会为0)。 // �����ǰ����������0��������(impossible!)�� // 如果当前任务是任务0,则死机(impossible!)。 175 if (!p) // ��tmpָ���Ѿ��ڵȴ������ϵ�����(����еĻ�)������inode->i_wait�����ҽ�˯�߶���ͷ // 让tmp指向已经在等待队列上的任务(如果有的话),例如inode->i_wait。并且将睡眠队列头 // �ĵȴ�ָ��ָ��ǰ���������Ͱѵ�ǰ������뵽�� *p�ĵȴ������С�Ȼ��ǰ������ // 的等待指针指向当前任务。这样就把当前任务插入到了 *p的等待队列中。然后将当前任务置 // Ϊָ���ĵȴ�״̬����ִ�����µ��ȡ� // 为指定的等待状态,并执行重新调度。 179 tmp = *p; // ֻ�е�����ȴ�������ʱ��������ֻ᷵�ص������ʾ�����ѱ���ȷ�ػ��Ѳ�ִ�С� // 只有当这个等待任务被唤醒时,程序才又会返回到这里,表示进程已被明确地唤醒并执行。 // ����ȴ������л��еȴ������Ҷ���ͷָ�� *p ��ָ��������ǵ�ǰ����ʱ��˵�� // 如果等待队列中还有等待任务,并且队列头指针 *p 所指向的任务不是当前任务时,说明 // �ڱ��������ȴ����к����������ȴ����С���������Ӧ��ҲҪ������������� // 在本任务插入等待队列后还有任务进入等待队列。于是我们应该也要唤醒这个任务,而我 // ���Լ�Ӧ��˳������Щ���������е������ѣ�������ォ�ȴ�����ͷ��ָ��������Ϊ // 们自己应按顺序让这些后面进入队列的任务唤醒,因此这里将等待队列头所指任务先置为 // ����״̬�����Լ�����Ϊ�����жϵȴ�״̬�����Լ�Ҫ�ȴ���Щ���������е������� // 就绪状态,而自己则置为不可中断等待状态,即自己要等待这些后续进队列的任务被唤醒 // ��ִ��ʱ�����ѱ�����Ȼ������ִ�е��ȳ��� // 而执行时来唤醒本任务。然后重新执行调度程序。 183 if (*p &&
@@ -2797,15 +2797,15 @@ goto repeat; 187 } // ִ�е����˵������������������ִ�С���ʱ�ȴ�����ͷָ��Ӧ��ָ����������Ϊ // 执行到这里,说明本任务真正被唤醒执行。此时等待队列头指针应该指向本任务,若它为 // �գ���������������⣬������ʾ������Ϣ�����������ͷָ��ָ��������ǰ�������� // 空,则表明调度有问题,于是显示警告信息。最后我们让头指针指向在我们前面进入队列 // ������*p
-= tmp���� ��ȷʵ��������һ�����������л�������tmp��Ϊ�գ����� // 的任务(*p
+= tmp)。 若确实存在这样一个任务,即队列中还有任务(tmp不为空),就 // ����֮�����Ƚ�����е������ڻ��Ѻ�����ʱ���ջ�ѵȴ�����ͷָ���ó�NULL�� // 唤醒之。最先进入队列的任务在唤醒后运行时最终会把等待队列头指针置成NULL。 188 if (!*p) 193 // ����ǰ������Ϊ���жϵĵȴ�״̬��TASK_INTERRUPTIBLE����������ͷָ��*pָ���ĵȴ� // 将当前任务置为可中断的等待状态(TASK_INTERRUPTIBLE),并放入头指针*p指定的等待 // �����С� // 队列中。 194 void interruptible_sleep_on(struct
@@ -2850,10 +2850,10 @@ lang=EN-US> } 198 // �ѵ�ǰ������Ϊ�����жϵĵȴ�״̬��TASK_UNINTERRUPTIBLE��������˯�߶���ͷָ��ָ�� // 把当前任务置为不可中断的等待状态(TASK_UNINTERRUPTIBLE),并让睡眠队列头指针指向 // ��ǰ����ֻ����ȷ�ػ���ʱ�Ż᷵�ء��ú����ṩ�˽������жϴ�������֮���ͬ�����ơ� // 当前任务。只有明确地唤醒时才会返回。该函数提供了进程与中断处理程序之间的同步机制。 199 void sleep_on(struct } 203 // ���� *pָ�������*p������ȴ�����ͷָ�롣�����µȴ������Dz����ڵȴ�����ͷָ�� // 唤醒 *p指向的任务。*p是任务等待队列头指针。由于新等待任务是插入在等待队列头指针 // ���ģ���˻��ѵ���������ȴ����е��������������Ѿ�����ֹͣ����״̬������ʾ // 处的,因此唤醒的是最后进入等待队列的任务。若该任务已经处于停止或僵死状态,则显示 // ������Ϣ�� // 警告信息。 204 void wake_up(struct if (p &&
lang=EN-US>
if ((**p).state == TASK_STOPPED)
-// ����ֹͣ״̬�� 208
@@ -2905,7 +2905,7 @@ TASK_STOPPED"); 210
@@ -2915,7 +2915,7 @@ TASK_ZOMBIE"); 211
(**p).state=0; //
-��Ϊ����״̬TASK_RUNNING�� 212 } /* * ���ˣ������↑ʼ��һЩ�й����̵��ӳ�����Ӧ�÷����ں˵���Ҫ���� * 好了,从这里开始是一些有关软盘的子程序,本不应该放在内核的主要部分 * �еġ������Ƿ�����������Ϊ������Ҫ��ʱ���������������������ġ� * 中的。将它们放在这里是因为软驱需要定时处理,而放在这里是最方便的。 */ // ����220
--- 281�д������ڴ���������ʱ�����Ķ���δ���֮ǰ���ȿ�һ�¿��豸һ���� // 下面220
+-- 281行代码用于处理软驱定时。在阅读这段代码之前请先看一下块设备一章中 // �й�������������floppy.c�������˵���� ���ߵ��Ķ����̿��豸��������ʱ�������� // 有关软盘驱动程序(floppy.c)后面的说明, 或者到阅读软盘块设备驱动程序时在来看这 // �δ��롣����ʱ�䵥λ��1���δ� = 1/100�롣 // 段代码。其中时间单位:1个滴答 = 1/100秒。 // ��������wait_motor[]���ڴ�ŵȴ�������������������ת�ٵĽ���ָ�롣�������� // 下面数组wait_motor[]用于存放等待软驱马达启动到正常转速的进程指针。数组索引0-3 // �ֱ��Ӧ����A--D������ mon_timer[]��Ÿ�����������������Ҫ�ĵδ�����������Ĭ�� // 分别对应软驱A--D。数组 mon_timer[]存放各软驱马达启动所需要的滴答数。程序中默认 // ����ʱ��Ϊ50���δ�0.5�룩������ moff_timer[] ��Ÿ�����������ͣת֮ǰ��ά�� // 启动时间为50个滴答(0.5秒)。数组 moff_timer[] 存放各软驱在马达停转之前需维持 // ��ʱ�䡣�������趨Ϊ10000���δ�100�룩�� // 的时间。程序中设定为10000个滴答(100秒)。 220 static struct task_struct * static int moff_timer[4]={0,0
// ���������Ӧ�����������е�ǰ��������Ĵ������üĴ���ÿλ�Ķ������£� // 下面变量对应软驱控制器中当前数字输出寄存器。该寄存器每位的定义如下: // λ7-4���ֱ����������D-A�����������1 - ������0 - �رա� // 位7-4:分别控制驱动器D-A马达的启动。1 - 启动;0 - 关闭。 // λ3
-��1 - ����DMA���ж�����0 - ��ֹDMA���ж����� // 位3
+:1 - 允许DMA和中断请求;0 - 禁止DMA和中断请求。 // λ2
-��1 - �������̿�������
-0 - ��λ���̿������� // 位2
+:1 - 启动软盘控制器;
+0 - 复位软盘控制器。 // λ1-0��00 - 11������ѡ����Ƶ�����A-D�� // 位1-0:00 - 11,用于选择控制的软驱A-D。 // �������ó�ֵΪ������DMA���ж���������FDC�� // 这里设置初值为:允许DMA和中断请求、启动FDC。 223 unsigned char current_DOR =
@@ -3012,17 +3012,17 @@ lang=EN-US> unsigned char current_DOR =
224 // ָ������������������ת״̬����ȴ�ʱ�䡣 // 指定软驱启动到正常运转状态所需等待时间。 // ����nr
--- ������(0--3)������ֵΪ�δ����� // 参数nr
+-- 软驱号(0--3),返回值为滴答数。 // �ֲ�����selected��ѡ��������־��blk_drv/floppy.c��123�У���mask����ѡ������Ӧ�� // 局部变量selected是选中软驱标志(blk_drv/floppy.c,123行)。mask是所选软驱对应的 // ��������Ĵ����������������λ��mask��4λ�Ǹ��������������־�� // 数字输出寄存器中启动马达比特位。mask高4位是各软驱启动马达标志。 225 int ticks_to_floppy_on(unsigned
@@ -3042,11 +3042,11 @@ lang=EN-US> unsigned char mask
229 // ϵͳ�����4������������Ԥ�����ú�ָ������nrͣת֮ǰ��Ҫ������ʱ�䣨100�룩��Ȼ�� // 系统最多有4个软驱。首先预先设置好指定软驱nr停转之前需要经过的时间(100秒)。然后 // ȡ��ǰDOR�Ĵ���ֵ����ʱ����mask�У�����ָ������������������־��λ�� // 取当前DOR寄存器值到临时变量mask中,并把指定软驱的马达启动标志置位。 230 if (nr>3) 232 moff_timer[nr]=10000;
-/* 100 s = very big :-) */ // ͣתά��ʱ�䡣 233 cli();
-/* use floppy_off to turn it off */ // ���жϡ� 234 mask |= current_DOR; // �����ǰû��ѡ�������������ȸ�λ����������ѡ��λ��Ȼ����ָ������ѡ��λ�� // 如果当前没有选择软驱,则首先复位其他软驱的选择位,然后置指定软驱选择位。 235 if (! 238 } // �����������Ĵ����ĵ�ǰֵ��Ҫ���ֵ��ͬ������FDC��������˿������ֵ(mask)������ // 如果数字输出寄存器的当前值与要求的值不同,则向FDC数字输出端口输出新值(mask),并且 // ���Ҫ�����������ﻹû��������������Ӧ����������������ʱ��ֵ��HZ/2 = 0.5��� 50�� // 如果要求启动的马达还没有启动,则置相应软驱的马达启动定时器值(HZ/2 = 0.5秒或 50个 // �δ𣩡����Ѿ���������������������ʱΪ2���δ����������� do_floppy_timer()���ȵ� // 滴答)。若已经启动,则再设置启动定时为2个滴答,能满足下面 do_floppy_timer()中先递 // �����жϵ�Ҫ��ִ�б��ζ�ʱ�����Ҫ�ɡ��˺���µ�ǰ��������Ĵ���current_DOR�� // 减后判断的要求。执行本次定时代码的要求即可。此后更新当前数字输出寄存器current_DOR。 239 if (mask != } 247 sti();
-// ���жϡ� 248 return mon_timer[nr];
-// ����������������ʱ��ֵ�� 249 } 250 // �ȴ�ָ�������������������һ��ʱ�䣬Ȼ�ء� // 等待指定软驱马达启动所需的一段时间,然后返回。 // ����ָ����������������������ת���������ʱ��Ȼ��˯�ߵȴ����ڶ�ʱ�жϹ����л�һֱ // 设置指定软驱的马达启动到正常转速所需的延时,然后睡眠等待。在定时中断过程中会一直 // �ݼ��ж������趨����ʱֵ������ʱ���ڣ��ͻỽ������ĵȴ����̡� // 递减判断这里设定的延时值。当延时到期,就会唤醒这里的等待进程。 251 void floppy_on(unsigned int
@@ -3159,9 +3159,9 @@ nr) 252 { // ���жϡ��������������ʱ��û������һֱ�ѵ�ǰ������Ϊ�����ж�˯��״̬������ȴ����� // 关中断。如果马达启动定时还没到,就一直把当前进程置为不可中断睡眠状态并放入等待马达 // ���еĶ����С�Ȼ���жϡ� // 运行的队列中。然后开中断。 253 } 258 // �ùر���Ӧ��������ͣת��ʱ����3�룩�� // 置关闭相应软驱马达停转定时器(3秒)。 // ����ʹ�øú�����ȷ�ر�ָ������������������↑��100��֮��Ҳ�ᱻ�رա� // 若不使用该函数明确关闭指定的软驱马达,则在马达开启100秒之后也会被关闭。 259 void floppy_off(unsigned int
@@ -3208,12 +3208,12 @@ lang=EN-US> } 263 // ���̶�ʱ�����ӳ���������������ʱֵ������ر�ͣת��ʱֵ�����ӳ������ʱ�Ӷ�ʱ // 软盘定时处理子程序。更新马达启动定时值和马达关闭停转计时值。该子程序会在时钟定时 // �жϹ����б����ã����ϵͳÿ����һ���δ�(10ms)�ͻᱻ����һ�Σ���ʱ�������↑���� // 中断过程中被调用,因此系统每经过一个滴答(10ms)就会被调用一次,随时更新马达开启或 // ͣת��ʱ����ֵ�����ijһ������ͣת��ʱ��������������Ĵ�����������λ��λ�� // 停转定时器的值。如果某一个马达停转定时到,则将数字输出寄存器马达启动位复位。 264 void do_floppy_timer(void) 270
if (!(mask & current_DOR))
-// �������DORָ���������������� 271
@@ -3247,7 +3247,7 @@ continue; 272
if (mon_timer[i]) {
-// �������������ʱ�����ѽ��̡� 273
@@ -3260,17 +3260,17 @@ lang=EN-US> &nb
275
} else if (!moff_timer[i]) {
-// �������ͣת��ʱ���� 276
current_DOR &= ~mask;
-// ��λ��Ӧ��������λ������ 277
outb(current_DOR,FD_DOR); // ������������Ĵ����� 278
@@ -3279,7 +3279,7 @@ lang=EN-US> &nb
279
moff_timer[i]--;
-// ��������ͣת��ʱ�ݼ��� 280 } 282 // �����ǹ��ڶ�ʱ���Ĵ��롣������64����ʱ���� // 下面是关于定时器的代码。最多可有64个定时器。 283 #define TIME_REQUESTS 64 // ��ʱ�������ṹ�Ͷ�ʱ�����顣�ö�ʱ������ר���ڹ������ر�������������ﶨʱ������ // 定时器链表结构和定时器数组。该定时器链表专用于供软驱关闭马达和启动马达定时操作。 // �������Ͷ�ʱ�������ִ�Linuxϵͳ�еĶ�̬��ʱ����Dynamic Timer���������ں�ʹ�á� // 这种类型定时器类似现代Linux系统中的动态定时器(Dynamic Timer),仅供内核使用。 285 static struct timer_list { 287 void (*fn)();
-// ��ʱ�������� 288 struct timer_list * next;
-// ����ָ����һ����ʱ���� 289 } timer_list[TIME_REQUESTS], * next_timer
-= NULL; // next_timer�Ƕ�ʱ������ͷָ�롣 290 // ���Ӷ�ʱ�����������Ϊָ���Ķ�ʱֵ(�δ���)����Ӧ�Ĵ�������ָ�롣 // 添加定时器。输入参数为指定的定时值(滴答数)和相应的处理程序指针。 // ������������floppy.c�����øú���ִ��������ر��������ʱ������ // 软盘驱动程序(floppy.c)利用该函数执行启动或关闭马达的延时操作。 // ����jiffies
-�C ��10����Ƶĵδ�����*fn()- ��ʱʱ�䵽ʱִ�еĺ����� // 参数jiffies
+– 以10毫秒计的滴答数;*fn()- 定时时间到时执行的函数。 291 void add_timer(long timer_list * p; 294 // �����ʱ��������ָ��Ϊ�գ����˳���������жϡ� // 如果定时处理程序指针为空,则退出。否则关中断。 295 if (!fn) // �����ʱֵ<=0�������̵����䴦�������Ҹö�ʱ�������������С� // 如果定时值<=0,则立刻调用其处理程序。并且该定时器不加入链表中。 298 if ( &nb
300 else { // ����Ӷ�ʱ�������У���һ������� // 否则从定时器数组中,找一个空闲项。 301
@@ -3394,10 +3394,10 @@ if (!p->fn) // ����Ѿ������˶�ʱ�����飬��ϵͳ����J��������ʱ�����ݽṹ������Ӧ��Ϣ�������� // 如果已经用完了定时器数组,则系统崩溃J。否则向定时器数据结构填入相应信息,并链入 // ����ͷ�� // 链表头。 304 if
@@ -3426,19 +3426,19 @@ p->next = next_timer; // �������ʱֵ��С��������������ʱ��ȥ����ǰ����Ҫ�ĵδ����������ڴ�����ʱ��ʱ // 链表项按定时值从小到大排序。在排序时减去排在前面需要的滴答数,这样在处理定时器时 // ֻҪ�鿴����ͷ�ĵ�һ��Ķ�ʱ�Ƿ��ڼ��ɡ�[[?? ��γ������û�п�����ȫ������� // 只要查看链表头的第一项的定时是否到期即可。[[?? 这段程序好象没有考虑周全。如果新 // ����Ķ�ʱ��ֵС��ԭ��ͷһ����ʱ��ֵʱ������������ѭ���У�����ʱ����Ӧ�ý����� // 插入的定时器值小于原来头一个定时器值时则根本不会进入循环中,但此时还是应该将紧随 // ������һ����ʱ��ֵ��ȥ�µĵ�1���Ķ�ʱֵ���������1����ʱֵ<=��2�������2�� // 其后面的一个定时器值减去新的第1个的定时值。即如果第1个定时值<=第2个,则第2个 // ��ʱֵ�۳���1����ֵ���ɣ������������ѭ���н��д�����]] // 定时值扣除第1个的值即可,否则进入下面循环中进行处理。]] 310
@@ -3498,17 +3498,17 @@ lang=EN-US> } 323 //// ʱ���ж�C��������������sys_call.s�е�_timer_interrupt��189�У������á� //// 时钟中断C函数处理程序,在sys_call.s中的_timer_interrupt(189行)被调用。 // ����cpl�ǵ�ǰ��Ȩ��0��3����ʱ���жϷ���ʱ����ִ�еĴ���ѡ����е���Ȩ���� // 参数cpl是当前特权级0或3,是时钟中断发生时正被执行的代码选择符中的特权级。 // cpl=0ʱ��ʾ�жϷ���ʱ����ִ���ں˴��룻cpl=3ʱ��ʾ�жϷ���ʱ����ִ���û����롣 // cpl=0时表示中断发生时正在执行内核代码;cpl=3时表示中断发生时正在执行用户代码。 // ����һ����������ִ��ʱ��Ƭ����ʱ������������л�����ִ��һ����ʱ���¹����� // 对于一个进程由于执行时间片用完时,则进行任务切换。并执行一个计时更新工作。 324 void do_timer(long cpl) 327 // �����ж��Ƿ���һ��ʱ�������Ļ������blankout�������blankcount������Ϊ�㣬 // 首先判断是否经过了一定时间而让屏幕黑屏(blankout)。如果blankcount计数不为零, // ���ߺ�����ʱ���ʱ��blankintervalΪ0�Ļ�����ô���Ѿ����ں���״̬��������־ // 或者黑屏延时间隔时间blankinterval为0的话,那么若已经处于黑屏状态(黑屏标志 // blanked = 1����������Ļ�ָ���ʾ����blankcount������Ϊ�㣬��ݼ�֮�����Ҹ�λ // blanked = 1),则让屏幕恢复显示。若blankcount计数不为零,则递减之,并且复位 // ������־�� // 黑屏标志。 328 if ( &nb
lang=EN-US>
blanked = 0; // ����Ļ���������־δ��λ��������Ļ�������������ú�����־�� // 否则的话若黑屏标志未置位,则让屏幕黑屏,并且设置黑屏标志。 334 } else if
@@ -3576,8 +3576,8 @@ blanked = 1; 337 } // ���Ŵ���Ӳ�̲�����ʱ���⡣���Ӳ�̳�ʱ�����ݼ�֮��Ϊ0�������Ӳ�̷��ʳ�ʱ������ // 接着处理硬盘操作超时问题。如果硬盘超时计数递减之后为0,则进行硬盘访问超时处理。 338 if (hd_timeout) 340
-hd_times_out(); // Ӳ�̷��ʳ�ʱ������blk_drv/hdc��318�У��� 341 // ���������������������رշ�����(��0x61�ڷ��������λλ0��1��λ0����8253 // 如果发声计数次数到,则关闭发声。(向0x61口发送命令,复位位0和1。位0控制8253 // ������2�Ĺ�����λ1����������)�� // 计数器2的工作,位1控制扬声器)。 342 if (beepcount) //
-����������ʱ��δ�����chr_drv/console.c,950�У��� 343
@@ -3618,20 +3618,20 @@ lang=EN-US> &nb
345 // �����ǰ��Ȩ��(cpl)Ϊ0����ߣ���ʾ���ں˳����ڹ����������ں˴�������ʱ�� // 如果当前特权级(cpl)为0(最高,表示是内核程序在工作),则将内核代码运行时间stime // ������[ Linus���ں˳���ͳ��Ϊ�����û�(supervisor)�ij���sys_call.s��207�� // 递增;[ Linus把内核程序统称为超级用户(supervisor)的程序,见sys_call.s,207行 // �ϵ�Ӣ��ע�͡����ֳƺ�������Intel CPU �ֲᡣ] ���cpl
-> 0�����ʾ��һ���û����� // 上的英文注释。这种称呼来自于Intel CPU 手册。] 如果cpl
+> 0,则表示是一般用户程序 // �ڹ���������utime�� // 在工作,增加utime。 346 if (cpl) 350 // ����ж�ʱ�����ڣ���������1����ʱ����ֵ��1������ѵ���0���������Ӧ�Ĵ������� // 如果有定时器存在,则将链表第1个定时器的值减1。如果已等于0,则调用相应的处理程序, // �����ô�������ָ����Ϊ�ա�Ȼ��ȥ�����ʱ����next_timer�Ƕ�ʱ��������ͷָ�롣 // 并将该处理程序指针置为空。然后去掉该项定时器。next_timer是定时器链表的头指针。 351 if (next_timer->jiffies
354
-void (*fn)(void); // ���������һ������ָ�붨�壡��这里插入了一个函数指针定义!!L 355 &nb
359
(fn)();
-// ���ö�ʱ���������� 360
@@ -3705,8 +3705,8 @@ lang=EN-US> &nb
361 } // �����ǰ���̿�����FDC����������Ĵ�������������λ����λ�ģ���ִ�����̶�ʱ���� // 如果当前软盘控制器FDC的数字输出寄存器中马达启动位有置位的,则执行软盘定时程序。 362 if (current_DOR & 0xf0) // �����������ʱ�仹û�꣬���˳��������õ�ǰ�������м���ֵΪ0������������ʱ���ж�ʱ // 如果进程运行时间还没完,则退出。否则置当前任务运行计数值为0。并且若发生时钟中断时 // �����ں˴����������أ��������ִ�е��Ⱥ����� // 正在内核代码中运行则返回,否则调用执行调度函数。 364 if ((--current->counter=0; 366 if (!cpl) return;
-// �����ں�̬��������counterֵ���е��ȡ� 367 } 369 // ϵͳ���ù��� - ���ñ�����ʱʱ��ֵ(��)�� // 系统调用功能 - 设置报警定时时间值(秒)。 // ������seconds����0���������¶�ʱֵ��������ԭ��ʱʱ�̻�ʣ��ļ��ʱ�䡣����0�� // 若参数seconds大于0,则设置新定时值,并返回原定时时刻还剩余的间隔时间。否则返回0。 // �������ݽṹ�б�����ʱֵalarm�ĵ�λ��ϵͳ�δ�1�δ�Ϊ10���룩������ϵͳ������ // 进程数据结构中报警定时值alarm的单位是系统滴答(1滴答为10毫秒),它是系统开机起到 // ���ö�ʱ����ʱϵͳ�δ�ֵjiffies��ת���ɵδ�λ�Ķ�ʱֵ֮�ͣ���'jiffies + HZ*��ʱ // 设置定时操作时系统滴答值jiffies和转换成滴答单位的定时值之和,即'jiffies + HZ*定时 // ��ֵ'��������������������Ϊ��λ�Ķ�ʱֵ����˱���������Ҫ�����ǽ������ֵ�λ��ת���� // 秒值'。而参数给出的是以秒为单位的定时值,因此本函数的主要操作是进行两种单位的转换。 // ���г���HZ
-= 100�����ں�ϵͳ����Ƶ�ʡ�������include/sched.h��4���ϡ� // 其中常数HZ
+= 100,是内核系统运行频率。定义在include/sched.h第4行上。 // ����seconds���µĶ�ʱʱ��ֵ����λ���롣 // 参数seconds是新的定时时间值,单位是秒。 370 int sys_alarm(long seconds) 379 // ȡ��ǰ���̺�pid�� // 取当前进程号pid。 380 int sys_getpid(void) 384 // ȡ�����̺�ppid�� // 取父进程号ppid。 385 int sys_getppid(void) 389 // ȡ�û���uid�� // 取用户号uid。 390 int sys_getuid(void) 394 // ȡ��Ч���û���euid�� // 取有效的用户号euid。 395 int sys_geteuid(void) 399 // ȡ���gid�� // 取组号gid。 400 int sys_getgid(void) 404 // ȡ��Ч�����egid�� // 取有效的组号egid。 405 int sys_getegid(void) 409 // ϵͳ���ù��� -- ���Ͷ�CPU��ʹ������Ȩ�����˻�����J���� // 系统调用功能 -- 降低对CPU的使用优先权(有人会用吗?J)。 // Ӧ������incrementΪ����0��ֵ�������ʹ����Ȩ���� // 应该限制increment为大于0的值,否则可使优先权增大!! 410 int sys_nice(long increment) 416 // �ں˵��ȳ���ij�ʼ���ӳ��� // 内核调度程序的初始化子程序。 417 void sched_init(void) 420 struct desc_struct * p;
-// ���������ṹָ�롣 421 // Linuxϵͳ����֮�����ں˲����졣�ں˴���ᱻ�����ġ�Linus���Լ�������������Щ // Linux系统开发之初,内核不成熟。内核代码会被经常修改。Linus怕自己无意中修改了这些 // �ؼ��Ե����ݽṹ�������POSIX���IJ����ݡ����������������ж���䲢�ޱ�Ҫ������ // 关键性的数据结构,造成与POSIX标准的不兼容。这里加入下面这个判断语句并无必要,纯粹 // ��Ϊ�������Լ��Լ��������ں˴�����ˡ� // 是为了提醒自己以及其他修改内核代码的人。 422 if (sizeof(struct sigaction) != 16) // sigaction�Ǵ���й��ź�״̬�Ľṹ�� 423
panic("Struct sigaction MUST be
16 bytes"); // ��ȫ���������������ó�ʼ��������0��������״̬���������;ֲ����ݱ��������� // 在全局描述符表中设置初始任务(任务0)的任务状态段描述符和局部数据表描述符。 // FIRST_TSS_ENTRY��FIRST_LDT_ENTRY��ֵ�ֱ���4��5��������include/linux/sched.h // FIRST_TSS_ENTRY和FIRST_LDT_ENTRY的值分别是4和5,定义在include/linux/sched.h // �У�gdt
-��һ�������������飨include/linux/head.h ����ʵ���϶�Ӧ���� head.s �� // 中;gdt
+是一个描述符表数组(include/linux/head.h ),实际上对应程序 head.s 中 // ��234���ϵ�ȫ������������ַ��_gdt������� gdt + FIRST_TSS_ENTRY ��Ϊ // 第234行上的全局描述符表基址(_gdt)。因此 gdt + FIRST_TSS_ENTRY 即为 // gdt[FIRST_TSS_ENTRY]������gdt[4]����Ҳ�� gdt �����4��ĵ�ַ��
-�μ� // gdt[FIRST_TSS_ENTRY](即是gdt[4]),也即 gdt 数组第4项的地址。
+参见 // include/asm/system.h,��65�п�ʼ�� // include/asm/system.h,第65行开始。 424 set_ldt_desc(gdtFIRST_LDT_ENTRY,&(init_task.task.ldt)); // ��������������������ע��i=1��ʼ�����Գ�ʼ��������������ڣ�����������ṹ // 清任务数组和描述符表项(注意i=1开始,所以初始任务的描述符还在)。描述符项结构 // �������ļ�include/linux/head.h�С� // 定义在文件include/linux/head.h中。 426 p = } /* �����־�Ĵ����е�λNT�������Ժ�Ͳ������鷳 */ /* 清除标志寄存器中的位NT,这样以后就不会有麻烦 */ // EFLAGS�е�NT��־λ���ڿ��������Ƕ���á���NTλ��λʱ����ô��ǰ�ж�����ִ�� // EFLAGS中的NT标志位用于控制任务的嵌套调用。当NT位置位时,那么当前中断任务执行 // IRETָ��ʱ�ͻ����������л���NTָ��TSS�е�back_link�ֶ��Ƿ���Ч��NT=0ʱ��Ч�� // IRET指令时就会引起任务切换。NT指出TSS中的back_link字段是否有效。NT=0时无效。 435 __asm__("pushfl
-; andl $0xffffbfff,(%esp) ; popfl"); // ��λNT��־�� // ������0 �� TSS��ѡ������ص�����Ĵ���tr�����ֲ�����������ѡ������ص��ֲ����� // 将任务0 的 TSS段选择符加载到任务寄存器tr。将局部描述符表段选择符加载到局部描述 // �����Ĵ���ldtr�С�ע�⣡���ǽ�GDT����ӦLDT��������ѡ������ص�ldtr��ֻ��ȷ�� // 符表寄存器ldtr中。注意!!是将GDT中相应LDT描述符的选择符加载到ldtr。只明确加 // ��һ�Σ��Ժ�������LDT�ļ��أ���CPU����TSS�е�LDT���Զ����ء� // 这一次,以后新任务LDT的加载,是CPU根据TSS中的LDT项自动加载。 436 ltr(0);
-// ������include/linux/sched.h ��157-158�� 437 lldt(0);
-// ���в�����0��������š� // ����������ڳ�ʼ�� 8253��ʱ����ͨ��0��ѡ������ʽ3�������Ƽ�����ʽ��ͨ��0�� // 下面代码用于初始化 8253定时器。通道0,选择工作方式3,二进制计数方式。通道0的 // ������Ž����жϿ�����оƬ��IRQ0�ϣ���ÿ10���뷢��һ��IRQ0����LATCH�dz�ʼ // 输出引脚接在中断控制主芯片的IRQ0上,它每10毫秒发出一个IRQ0请求。LATCH是初始 // ��ʱ����ֵ�� // 定时计数值。 438 outb_p(0x36,0x43); &n
lang=EN-US> outb_p(LATCH
& 0xff , 0x40); /* LSB */
- // ��ʱֵ���ֽڡ� 440 outb(LATCH
>> 8 , 0x40); /*
-MSB */ // ��ʱֵ���ֽڡ� // ����ʱ���жϴ���������������ʱ���ж��ţ������жϿ����������룬����ʱ���жϡ� // 设置时钟中断处理程序句柄(设置时钟中断门)。修改中断控制器屏蔽码,允许时钟中断。 // Ȼ������ϵͳ�����ж��š������������ж���������IDT���������ĺ궨�����ļ� // 然后设置系统调用中断门。这两个设置中断描述符表IDT中描述符的宏定义在文件 // include/asm/system.h�е�33��39�д������ߵ�����μ�system.h�ļ���ʼ����˵���� // include/asm/system.h中第33、39行处。两者的区别参见system.h文件开始处的说明。 441
- ����程序8-6 linux/kernel/signal.c 6 7
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�����������ṹtask_struct����ʼ����0�����ݣ�
-// ����һЩ�й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������䡣 8
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 9
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 10 11
-#include <signal.h> // �ź�ͷ�ļ��������źŷ��ų������źŽṹ���źŲ�������ԭ�͡� 12
-#include <errno.h> // ������ͷ�ļ�����������ŷ��ų����� 13
// ��ȡ��ǰ�����ź�����λͼ��������������룩��sgetmask�ɷֽ�Ϊsignal-get-mask���������ơ� // 获取当前任务信号屏蔽位图(屏蔽码或阻塞码)。sgetmask可分解为signal-get-mask。以下类似。 14 int
sys_sgetmask() 18 // �����µ��ź�����λͼ���ź�SIGKILL��SIGSTOP���ܱ����Ρ�����ֵ��ԭ�ź�����λͼ�� // 设置新的信号屏蔽位图。信号SIGKILL和SIGSTOP不能被屏蔽。返回值是原信号屏蔽位图。 19 int
sys_ssetmask(int newmask) 26 // ��Ⲣȡ�ý����յ��ĵ������Σ����������źš���δ�����źŵ�λͼ��������set�С� // 检测并取得进程收到的但被屏蔽(阻塞)的信号。还未处理信号的位图将被放入set中。 27 int
sys_sigpending(sigset_t *set) 29
/* fill in "set" with signals pending but blocked. */ /* �û�δ�������ұ������źŵ�λͼ����setָ����ָλ�ô� */ /* 用还未处理并且被阻塞信号的位图填入set指针所指位置处 */ // ������֤�����ṩ���û��洢�ռ�Ӧ��4���ֽڡ�Ȼ��ѻ�δ�������ұ������źŵ�λͼ���� // 首先验证进程提供的用户存储空间应有4个字节。然后把还未处理并且被阻塞信号的位图填入 // setָ����ָλ�ô��� // set指针所指位置处。 30
verify_area(set,4); 47 */ /* �Զ��ظ������µ��ź������룬���ȴ��źŵĵ����� /* 自动地更换成新的信号屏蔽码,并等待信号的到来。 * * ������Ҫ��ϵͳ���ã�syscall����һЩ���������ǻ��ϵͳ���ÿ�ӿ�ȡ��ijЩ��Ϣ�� * 我们需要对系统调用(syscall)做一些处理。我们会从系统调用库接口取得某些信息。 * ע�⣬������Ҫ�ѵ��ù�����libc���е��ӳ���ͳһ���ǡ� * 注意,我们需要把调用规则与libc库中的子程序统一考虑。 * * "set" ����POSIX��1003.1-1988��3.3.7�������������ź�������sigmask�� * "set" 正是POSIX标准1003.1-1988的3.3.7节中所描述的信号屏蔽码sigmask。
-* ������Ϊ����sigset_t�ܹ���Ϊһ��32λ�����ݡ� * * "restart"�б���������ָʾ��־�����Ϊ��0ֵ����ô���Ǿ�����ԭ���������룬 * "restart"中保持有重启指示标志。如果为非0值,那么我们就设置原来的屏蔽码,
-* �����������ء������Ϊ0����ô���ǾͰѵ�ǰ�������뱣����oldmask��
-* �����������̣�ֱ���յ��κ�һ���ź�Ϊֹ�� */ // ��ϵͳ������ʱ�ѽ����ź��������滻�ɲ����и�����set��Ȼ�������̣�ֱ���յ�һ�� // 该系统调用临时把进程信号屏蔽码替换成参数中给定的set,然后挂起进程,直到收到一个 // �ź�Ϊֹ�� // 信号为止。 // restart��һ�����жϵ�ϵͳ��������������־������1�ε��ø�ϵͳ����ʱ������0������ // restart是一个被中断的系统调用重新启动标志。当第1次调用该系统调用时,它是0。并且 // �ڸú����л�ѽ���ԭ���������� blocked����������old_mask���������� restartΪ��0 // 在该函数中会把进程原来的阻塞码 blocked保存起来(old_mask),并设置 restart为非0 // ֵ����˵����̵�2�ε��ø�ϵͳ����ʱ�����ͻ�ָ�����ԭ��������old_mask�е������롣 // 值。因此当进程第2次调用该系统调用时,它就会恢复进程原来保存在old_mask中的阻塞码。 48 int
sys_sigsuspend(int restart, unsigned
@@ -2037,26 +2037,26 @@ long old_mask, unsigned long set) 49 { // pause()ϵͳ���ý����µ������Ľ��̽���˯��״̬��ֱ���յ�һ���źš����źŻ�����ֹ // pause()系统调用将导致调用它的进程进入睡眠状态,直到收到一个信号。该信号或者会终止 // ���̵�ִ�У����ߵ��½���ȥִ����Ӧ���źŲ������� // 进程的执行,或者导致进程去执行相应的信号捕获函数。 50
extern int sys_pause(void); 51 // ���restart��־��Ϊ0����ʾ�������ó����������������ǻָ�ǰ�汣����old_mask�е� // 如果restart标志不为0,表示是重新让程序运行起来。于是恢复前面保存在old_mask中的 // ԭ���������롣��������-EINTR��ϵͳ���ñ��ź��жϣ��� // 原进程阻塞码。并返回码-EINTR(系统调用被信号中断)。 52
if (restart) { 53
-/* we're restarting */ /* ����������������ϵͳ����/* we're restarting */ /* 我们正在重新启动系统调用 */ 54
@@ -2068,26 +2068,26 @@ return -EINTR; 56
} // �����ʾrestart��־��ֵ��0����ʾ��1�ε��á�������������restart��־����Ϊ1���� // 否则表示restart标志的值是0。表示第1次调用。于是首先设置restart标志(置为1), // ������̵�ǰ������ blocked �� old_mask�У����ѽ��̵��������滻�� set��Ȼ����� // 保存进程当前阻塞码 blocked 到 old_mask中,并把进程的阻塞码替换成 set。然后调用 // pause()�ý���˯�ߣ��ȴ��źŵĵ������������յ�һ���ź�ʱ��pause() �ͻ᷵�أ����� // pause()让进程睡眠,等待信号的到来。当进程收到一个信号时,pause() 就会返回,并且 // ���̻�ȥִ���źŴ���������Ȼ���÷��� -ERESTARTNOINTR ���˳������������˵�� // 进程会去执行信号处理函数,然后本调用返回 -ERESTARTNOINTR 码退出。这个返回码说明 // �ڴ������źź�Ҫ�ص���ϵͳ�����м������У�����ϵͳ���ò��ᱻ�жϡ� // 在处理完信号后要求返回到本系统调用中继续运行,即本系统调用不会被中断。 57
/* we're not restarting. do the work */ /* ���Dz��������������У���ô�ɻ�� /* 我们不是重新重新运行,那么就干活吧 */ 58
@@ -2112,8 +2112,8 @@ return -ERESTARTNOINTR;
64 // ����sigaction���ݵ�fs���ݶ�to���������ں˿ռ临�Ƶ��û����������ݶ��С� // 复制sigaction数据到fs数据段to处。即从内核空间复制到用户(任务)数据段中。 65
static inline void save_old(char *
@@ -2126,11 +2126,11 @@ int i; 68 // ������֤to�����ڴ�ռ��Ƿ��㹻��Ȼ���һ��sigaction�ṹ��Ϣ���Ƶ�fs�Σ��û��� // 首先验证to处的内存空间是否足够大。然后把一个sigaction结构信息复制到fs段(用户) // �ռ��С��꺯��put_fs_byte()��include/asm/segment.h��ʵ�֡� // 空间中。宏函数put_fs_byte()在include/asm/segment.h中实现。 69
verify_area(to, sizeof(struct 76 // ��sigaction���ݴ�fs���ݶ�fromλ�ø��Ƶ�to���������û����ݿռ�ȡ���ں����ݶ��С� // 把sigaction数据从fs数据段from位置复制到to处。即从用户数据空间取到内核数据段中。 77
static inline void get_new(char *
@@ -2181,23 +2181,23 @@ for (i=0 ; i< sizeof(struct sigaction)
84 // signal()ϵͳ���á�������sigaction()��Ϊָ�����źŰ�װ�µ��źž��(�źŴ�������)�� // signal()系统调用。类似于sigaction()。为指定的信号安装新的信号句柄(信号处理程序)。 // �źž���������û�ָ���ĺ�����Ҳ������SIG_DFL��Ĭ�Ͼ������SIG_IGN�����ԣ��� // 信号句柄可以是用户指定的函数,也可以是SIG_DFL(默认句柄)或SIG_IGN(忽略)。 // ����signum
---ָ�����źţ�handler -- ָ���ľ����restorer
-�C�ָ�����ָ�룬�ú����� // 参数signum
+--指定的信号;handler -- 指定的句柄;restorer
+–恢复函数指针,该函数由 // Libc ���ṩ���������źŴ������������ָ�ϵͳ���÷���ʱ�����Ĵ�����ԭ��ֵ�Լ�ϵͳ // Libc 库提供。用于在信号处理程序结束后恢复系统调用返回时几个寄存器的原有值以及系统 // ���õķ���ֵ���ͺ���ϵͳ����û��ִ�й��źŴ��������ֱ�ӷ��ص��û�����һ����
-���� // 调用的返回值,就好象系统调用没有执行过信号处理程序而直接返回到用户程序一样。
+函数 // ����ԭ�źž���� // 返回原信号句柄。 85 int
sys_signal(int signum, long handler,
@@ -2210,11 +2210,11 @@ struct sigaction tmp; 88 // ������֤�ź�ֵ����Ч��Χ��1--32���ڣ����Ҳ������ź�SIGKILL����SIGSTOP������Ϊ�� // 首先验证信号值在有效范围(1--32)内,并且不得是信号SIGKILL(和SIGSTOP)。因为这 // �����źŲ��ܱ����̲��� // 两个信号不能被进程捕获。 89
if (signum<1 || signum>32 || signum==SIGKILL
@@ -2223,14 +2223,14 @@ if (signum<1 || signum>32 || signum==SIGKILL
90
return -EINVAL; // Ȼ������ṩ�IJ����齨sigaction�ṹ���ݡ�sa_handler��ָ�����źŴ���������������� // 然后根据提供的参数组建sigaction结构内容。sa_handler是指定的信号处理句柄(函数)。 // sa_mask��ִ���źŴ������ʱ���ź������롣sa_flags��ִ��ʱ��һЩ��־��ϡ������趨 // sa_mask是执行信号处理句柄时的信号屏蔽码。sa_flags是执行时的一些标志组合。这里设定 // ���źŴ������ֻʹ��1�κ�ͻָ���Ĭ��ֵ���������ź����Լ��Ĵ���������յ��� // 该信号处理句柄只使用1次后就恢复到默认值,并允许信号在自己的处理句柄中收到。 91
tmp.sa_handler = (void (*)(int)) handler; 94
-tmp.sa_restorer = (void (*)(void)) restorer; // ����ָ���������ָ�롣 // ����ȡ���ź�ԭ���Ĵ�������������ø��źŵ�sigaction�ṹ�����ԭ�źž���� // 接着取该信号原来的处理句柄,并设置该信号的sigaction结构。最后返回原信号句柄。 95
handler = (long) current-> 99 // sigaction()ϵͳ���á��ı�������յ�һ���ź�ʱ�IJ�����signum�dz���SIGKILL����� // sigaction()系统调用。改变进程在收到一个信号时的操作。signum是除了SIGKILL以外的 // �κ��źš�[����²�����action����Ϊ�� ]���²�������װ����� oldactionָ�벻Ϊ�գ� // 任何信号。[如果新操作(action)不为空 ]则新操作被安装。如果 oldaction指针不为空, // ��ԭ������������oldaction���ɹ���0������Ϊ-EINVAL�� // 则原操作被保留到oldaction。成功则返回0,否则为-EINVAL。 100 int sys_sigaction(int
@@ -2291,11 +2291,11 @@ style='color:blue'>sigaction tmp; 104 // ������֤�ź�ֵ����Ч��Χ��1--32���ڣ����Ҳ������ź�SIGKILL����SIGSTOP������Ϊ�� // 首先验证信号值在有效范围(1--32)内,并且不得是信号SIGKILL(和SIGSTOP)。因为这 // �����źŲ��ܱ����̲��� // 两个信号不能被进程捕获。 105 if (signum<1 ||
@@ -2306,11 +2306,11 @@ signum==SIGSTOP) // ���źŵ�sigaction�ṹ�������µIJ����������������oldactionָ�벻Ϊ�յĻ����� // 在信号的sigaction结构中设置新的操作(动作)。如果oldaction指针不为空的话,则将 // ԭ����ָ�뱣�浽oldaction��ָ��λ�á� // 原操作指针保存到oldaction所指的位置。 107 tmp = &nb
save_old((char *) &tmp,(char *)
oldaction); // ��������ź����Լ����źž�����յ�������������Ϊ0�������������α��źš� // 如果允许信号在自己的信号句柄中收到,则令屏蔽码为0,否则设置屏蔽本信号。 112 if ( */ /* * �ڵ�ǰĿ¼�в���core dumpӳ���ļ����ӳ���Ŀǰ��û��ʵ�֡� * 在当前目录中产生core dump映像文件的子程序。目前还没有实现。 */ 127 // ϵͳ���õ��жϴ����������������ź�Ԥ����������kernel/sys_call.s,119�У������ // 系统调用的中断处理程序中真正的信号预处理程序(在kernel/sys_call.s,119行)。这段 // �������Ҫ�����ǽ��źŴ���������뵽�û������ջ�У����ڱ�ϵͳ���ý������غ����� // 代码的主要作用是将信号处理句柄插入到用户程序堆栈中,并在本系统调用结束返回后立刻 // ִ���źž������Ȼ�����ִ���û��ij��� // 执行信号句柄程序,然后继续执行用户的程序。 // �����IJ����ǽ���ϵͳ���ô�������sys_call.s��ʼ��ֱ�����ñ�������sys_call.s // 函数的参数是进入系统调用处理程序sys_call.s开始,直到调用本函数(sys_call.s // ��125�У�ǰ��ѹ���ջ��ֵ����Щֵ��������sys_call.s�еĴ����У��� // 第125行)前逐步压入堆栈的值。这些值包括(在sys_call.s中的代码行): // �� CPUִ���ж�ָ��ѹ����û�ջ��ַss��esp����־�Ĵ���eflags�ͷ��ص�ַcs��eip�� // ① CPU执行中断指令压入的用户栈地址ss和esp、标志寄存器eflags和返回地址cs和eip; // �� ��85--91���ڸս���system_callʱѹ��ջ�ĶμĴ���ds��es��fs�Լ��Ĵ���eax // ② 第85--91行在刚进入system_call时压入栈的段寄存器ds、es、fs以及寄存器eax // ��orig_eax����edx��ecx��ebx��ֵ�� // (orig_eax)、edx、ecx和ebx的值; // �� ��100�е���sys_call_table��ѹ��ջ�е���Ӧϵͳ���ô��������ķ���ֵ��eax���� // ③ 第100行调用sys_call_table后压入栈中的相应系统调用处理函数的返回值(eax)。 // �� ��124��ѹ��ջ�еĵ�ǰ�������ź�ֵ��signr���� // ④ 第124行压入栈中的当前处理的信号值(signr)。 128 int do_signal(long
@@ -2463,7 +2463,7 @@ style='color:blue'>sigaction + signr - 1; 136 int longs;
//
-�� current->sigaction[signr-1]�� 137 139 // �����ǵ�����䡣��������notdefʱ���ӡ�����Ϣ�� // 以下是调试语句。当定义了notdef时会打印相关信息。 140 #ifdef notdef // �������ϵͳ���ö��������ж�ִ�й����е��õ�������ʱ�� roig_eax ֵΪ -1�� �μ� // 如果不是系统调用而是其它中断执行过程中调用到本函数时, roig_eax 值为 -1。 参见 // sys_call.s ��144�� ����䡣��˵� orig_eax������ -1 ʱ��˵������ij��ϵͳ���õ� // sys_call.s 第144行 等语句。因此当 orig_eax不等于 -1 时,说明是在某个系统调用的 // �������˱��������� kernel/exit.c �� waitpid() �����У�����յ���SIGCHLD �źţ� // 最后调用了本函数。在 kernel/exit.c 的 waitpid() 函数中,如果收到了SIGCHLD 信号, // �����ڶ��ܵ�����fs/pipe.c�йܵ���ǰ�����ݵ�û�ж����κ����ݵ�����£������յ� // 或者在读管道函数fs/pipe.c中管道当前读数据但没有读到任何数据等情况下,进程收到 // ���κ�һ�����������źţ����� -ERESTARTSYS ����ֵ���ء�����ʾ���̿��Ա��жϣ� // 了任何一个非阻塞的信号,则都会以 -ERESTARTSYS 返回值返回。它表示进程可以被中断, // �����ڼ���ִ�к����������ϵͳ���á�������-ERESTARTNOINTR˵���ڴ������źź�Ҫ�� // 但是在继续执行后会重新启动系统调用。返回码-ERESTARTNOINTR说明在处理完信号后要求 // ���ص�ԭϵͳ�����м������У���ϵͳ���ò��ᱻ�жϡ��μ�ǰ���62�С� // 返回到原系统调用中继续运行,即系统调用不会被中断。参见前面第62行。 // ����������˵���������ϵͳ�����е��õı�������������Ӧϵͳ���õķ�����
-eax���� // 因此下面语句说明如果是在系统调用中调用的本函数,并且相应系统调用的返回码
+eax等于 // -ERESTARTSYS�� -ERESTARTNOINTRʱ��������Ĵ�����ʵ���ϻ�û�������ص��û������У��� // -ERESTARTSYS或 -ERESTARTNOINTR时进行下面的处理(实际上还没有真正回到用户程序中)。 145 if ((orig_eax !=
@@ -2535,18 +2535,18 @@ lang=EN-US> &nb
((eax == -ERESTARTSYS) || (eax == -ERESTARTNOINTR))) { // ���ϵͳ���÷������� -ERESTARTSYS����������ϵͳ���ã������� sigaction �к��б�־ // 如果系统调用返回码是 -ERESTARTSYS(重新启动系统调用),并且 sigaction 中含有标志 // SA_INTERRUPT��ϵͳ���ñ��ź��жϺ���������ϵͳ���ã������ź�ֵС�� SIGCONT���� // SA_INTERRUPT(系统调用被信号中断后不重新启动系统调用)或者信号值小于 SIGCONT或者 // �ź�ֵ����SIGTTOU�����źŲ���SIGCONT��SIGSTOP��SIGTSTP��SIGTTIN ��SIGTTOU������ // 信号值大于SIGTTOU(即信号不是SIGCONT、SIGSTOP、SIGTSTP、SIGTTIN 或SIGTTOU),则 // ��ϵͳ���õķ���ֵΪeax = -EINTR�������ź��жϵ�ϵͳ���á� // 修改系统调用的返回值为eax = -EINTR,即被信号中断的系统调用。 147
@@ -2566,10 +2566,10 @@ lang=EN-US> &nb
lang=EN-US>
else { // ����ͻָ����̼Ĵ���eax�ڵ���ϵͳ����֮ǰ��ֵ�����Ұ�ԭ����ָ��ָ��ص�2�ֽڡ��� // 否则就恢复进程寄存器eax在调用系统调用之前的值,并且把原程序指令指针回调2字节。即 // �������û�����ʱ���ó�����������ִ�б��ź��жϵ�ϵͳ���á� // 当返回用户程序时,让程序重新启动执行被信号中断的系统调用。 151
@@ -2586,8 +2586,8 @@ lang=EN-US> &nb
154 } // ����źž��ΪSIG_IGN��1��Ĭ�Ϻ��Ծ�������źŽ��д�����ֱ�ӷ��ء� // 如果信号句柄为SIG_IGN(1,默认忽略句柄)则不对信号进行处理而直接返回。 155 sa_handler =
@@ -2600,8 +2600,8 @@ lang=EN-US> if (sa_handler==1)
lang=EN-US>
return(1); /* Ignore, see if there are more signals... */ // ������ΪSIG_DFL��0��Ĭ�ϴ�����������ݾ�����źŽ��зֱ����� // 如果句柄为SIG_DFL(0,默认处理),则根据具体的信号进行分别处理。 158 if (!sa_handler) { // ����ź�������������Ҳ����֮�������ء� // 如果信号是以下两个则也忽略之,并返回。 160
@@ -2627,14 +2627,14 @@ return(1); /* Ignore, ... */ 163 // ����ź�������4���ź�֮һ����ѵ�ǰ����״̬��Ϊֹͣ״̬TASK_STOPPED������ǰ���� // 如果信号是以下4种信号之一,则把当前进程状态置为停止状态TASK_STOPPED。若当前进程 // �����̶�SIGCHLD�źŵ�
-sigaction������־ SA_NOCLDSTOP �������ӽ���ִֹͣ�л��ּ� // 父进程对SIGCHLD信号的
+sigaction处理标志 SA_NOCLDSTOP (即当子进程停止执行或又继 // ��ִ��ʱ��Ҫ����SIGCHLD�źţ�û����λ����ô�������̷���SIGCHLD�źš� // 续执行时不要产生SIGCHLD信号)没有置位,那么就给父进程发送SIGCHLD信号。 164
@@ -2683,19 +2683,19 @@ return(1); /* Reschedule another event */ 174 // ����ź�������6���ź�֮һ����ô���źŲ�����core dump�������˳���Ϊ // 如果信号是以下6种信号之一,那么若信号产生了core dump,则以退出码为signr|0x80 // ����do_exit()�˳��������˳�������ź�ֵ��do_exit()�IJ����Ƿ�����ͳ����ṩ���˳� // 调用do_exit()退出。否则退出码就是信号值。do_exit()的参数是返回码和程序提供的退出 // ״̬��Ϣ������Ϊwait()��waitpid()������״̬��Ϣ���μ�sys/wait.h�ļ���13-18�С� // 状态信息。可作为wait()或waitpid()函数的状态信息。参见sys/wait.h文件第13-18行。 // wait()��waitpid()������Щ��Ϳ���ȡ���ӽ��̵��˳�״̬����ӽ�����ֹ��ԭ���źţ��� // wait()或waitpid()利用这些宏就可以取得子进程的退出状态码或子进程终止的原因(信号)。 175
@@ -2762,30 +2762,30 @@ lang=EN-US> */
/*
-* OK���������������źž�����õ�����
*/ // ������źž��ֻ�豻����һ�Σ��þ���ÿա�ע�⣬���źž����ǰ���Ѿ������� // 如果该信号句柄只需被调用一次,则将该句柄置空。注意,该信号句柄在前面已经保存在 // sa_handlerָ���С� // sa_handler指针中。 // ��ϵͳ���ý����ں�ʱ���û����ص�ַ��eip��cs�����������ں�̬ջ�С�������δ� // 在系统调用进入内核时,用户程序返回地址(eip、cs)被保存在内核态栈中。下面这段代 // �����ں�̬��ջ���û�����ϵͳ����ʱ�Ĵ���ָ��
-eip Ϊָ���źŴ��������ͬʱҲ�� // 码修改内核态堆栈上用户调用系统调用时的代码指针
+eip 为指向信号处理句柄,同时也将 // sa_restorer��signr������������(���SA_NOMASKû��λ)��eax��ecx��edx��Ϊ�����Լ� // sa_restorer、signr、进程屏蔽码(如果SA_NOMASK没置位)、eax、ecx、edx作为参数以及 // ԭ����ϵͳ���õij���ָ�뼰��־�Ĵ���ֵѹ���û���ջ��
-����ڱ���ϵͳ�����ж� // 原调用系统调用的程序返回指针及标志寄存器值压入用户堆栈。
+因此在本次系统调用中断 // �����û�����ʱ������ִ���û����źž������Ȼ���ټ���ִ���û����� // 返回用户程序时会首先执行用户的信号句柄程序,然后再继续执行用户程序。 191 if (sa->sa_flags
@@ -2795,34 +2795,34 @@ lang=EN-US> if (sa->sa_flags
lang=EN-US>
sa->sa_handler = NULL; // ���ں�̬ջ���û�����ϵͳ������һ������ָ��ָ��eipָ����źŴ������������C���� // 将内核态栈上用户调用系统调用下一条代码指令指针eip指向该信号处理句柄。由于C函数 // �Ǵ�ֵ��������˸�eip��ֵʱ��Ҫʹ�� "*(&eip)" ����ʽ�����⣬��������ź��Լ��� // 是传值函数,因此给eip赋值时需要使用 "*(&eip)" 的形式。另外,如果允许信号自己的 // ��������յ��ź��Լ�����Ҳ��Ҫ�����̵�������ѹ���ջ�� // 处理句柄收到信号自己,则也需要将进程的阻塞码压入堆栈。 // ������ע�⣬ʹ�����·�ʽ����193�У�����ͨC���������������Dz������õġ���Ϊ�� // 这里请注意,使用如下方式(第193行)对普通C函数参数进行修改是不起作用的。因为当 // ��������ʱ��ջ�ϵIJ������ᱻ�����߶���������֮���Կ���ʹ�����ַ�ʽ������Ϊ�ú��� // 函数返回时堆栈上的参数将会被调用者丢弃。这里之所以可以使用这种方式,是因为该函数 // �Ǵӻ������б����õģ������ں������غ������û�аѵ���do_signal()ʱ������ // 是从汇编程序中被调用的,并且在函数返回后汇编程序并没有把调用do_signal()时的所有 // ������������eip����Ȼ�ڶ�ջ�С� // 参数都丢弃。eip等仍然在堆栈中。 // sigaction�ṹ��sa_mask�ֶθ������ڵ�ǰ�źž�����ź�������������ִ���ڼ�Ӧ�ñ� // sigaction结构的sa_mask字段给出了在当前信号句柄(信号描述符)程序执行期间应该被 // ���ε��źż���ͬʱ�������źž��ִ�е��ź�Ҳ�ᱻ���Ρ�
-������sa_flags��ʹ���� // 屏蔽的信号集。同时,引起本信号句柄执行的信号也会被屏蔽。
+不过若sa_flags中使用了 // SA_NOMASK��־����ô�����źž��ִ�е��źŽ����ᱻ���ε�����������ź��Լ��Ĵ� // SA_NOMASK标志,那么引起本信号句柄执行的信号将不会被屏蔽掉。如果允许信号自己的处 // ����������յ��ź��Լ�����Ҳ��Ҫ�����̵��ź�������ѹ���ջ�� // 理句柄程序收到信号自己,则也需要将进程的信号阻塞码压入堆栈。 193 *(&eip) =
@@ -2832,10 +2832,10 @@ sa_handler; // ��ԭ���ó�����û���ջָ��������չ7����8�������֣�������ŵ����źž���IJ����ȣ��� // 将原调用程序的用户堆栈指针向下扩展7(或8)个长字(用来存放调用信号句柄的参数等), // ������ڴ�ʹ���������������ڴ泬���������ҳ�ȣ��� // 并检查内存使用情况(例如如果内存超界则分配新页等)。 195 *(&esp) -=
@@ -2845,12 +2845,12 @@ longs; // ���û���ջ�д��µ��ϴ��sa_restorer���ź�signr��������blocked�����SA_NOMASK // 在用户堆栈中从下到上存放sa_restorer、信号signr、屏蔽码blocked(如果SA_NOMASK // ��λ����eax��ecx��edx��eflags���û�����ԭ����ָ�롣 // 置位)、eax、ecx、edx、eflags和用户程序原代码指针。 197 tmp_esp=esp; 207 current->blocked |= sa->sa_mask; //
-����������(������)����sa_mask�е���λ�� 208
diff --git a/Book-Lite/code-list/html/P8-7.html b/Book-Lite/code-list/html/P8-7.html
index b05b264..654be36 100644
--- a/Book-Lite/code-list/html/P8-7.html
+++ b/Book-Lite/code-list/html/P8-7.html
@@ -11,24 +11,24 @@
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
- {font-family:����;
+ {font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����С���μ���;}
+ {font-family:方正小标宋简体;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:"\@����С���μ���";}
+ {font-family:"\@方正小标宋简体";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
@@ -36,9 +36,9 @@
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
h1
- {mso-style-link:"���� 1 Char";
+ {mso-style-link:"标题 1 Char";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -47,10 +47,10 @@ h1
text-indent:-7.2pt;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
h2
- {mso-style-link:"���� 2 Char";
+ {mso-style-link:"标题 2 Char";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -63,7 +63,7 @@ h2
font-family:"Arial","sans-serif";
font-weight:bold;}
h3
- {mso-style-link:"���� 3 Char";
+ {mso-style-link:"标题 3 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -74,7 +74,7 @@ h3
font-family:"Arial","sans-serif";
font-weight:bold;}
h4
- {mso-style-link:"���� 4 Char";
+ {mso-style-link:"标题 4 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -88,7 +88,7 @@ h4
font-family:"Arial","sans-serif";
font-weight:bold;}
h5
- {mso-style-link:"���� 5 Char";
+ {mso-style-link:"标题 5 Char";
margin-top:14.0pt;
margin-right:0cm;
margin-bottom:14.5pt;
@@ -99,10 +99,10 @@ h5
line-height:156%;
page-break-after:avoid;
font-size:14.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
h6
- {mso-style-link:"���� 6 Char";
+ {mso-style-link:"标题 6 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -116,7 +116,7 @@ h6
font-family:"Arial","sans-serif";
font-weight:bold;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
- {mso-style-link:"���� 7 Char";
+ {mso-style-link:"标题 7 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -127,10 +127,10 @@ p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
- {mso-style-link:"���� 8 Char";
+ {mso-style-link:"标题 8 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -143,7 +143,7 @@ p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
font-size:12.0pt;
font-family:"Arial","sans-serif";}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
- {mso-style-link:"���� 9 Char";
+ {mso-style-link:"标题 9 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -165,7 +165,7 @@ p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
{margin-top:0cm;
margin-right:0cm;
@@ -176,7 +176,7 @@ p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
{margin-top:0cm;
margin-right:0cm;
@@ -187,7 +187,7 @@ p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
{margin-top:0cm;
margin-right:0cm;
@@ -198,7 +198,7 @@ p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
{margin-top:0cm;
margin-right:0cm;
@@ -209,7 +209,7 @@ p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
{margin-top:0cm;
margin-right:0cm;
@@ -220,7 +220,7 @@ p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
{margin-top:0cm;
margin-right:0cm;
@@ -231,7 +231,7 @@ p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
{margin-top:0cm;
margin-right:0cm;
@@ -242,7 +242,7 @@ p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
{margin-top:0cm;
margin-right:0cm;
@@ -253,14 +253,14 @@ p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoToc2, li.MsoToc2, div.MsoToc2
{margin-top:0cm;
@@ -271,7 +271,7 @@ p.MsoToc2, li.MsoToc2, div.MsoToc2
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc3, li.MsoToc3, div.MsoToc3
{margin-top:0cm;
margin-right:0cm;
@@ -281,7 +281,7 @@ p.MsoToc3, li.MsoToc3, div.MsoToc3
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc4, li.MsoToc4, div.MsoToc4
{margin-top:0cm;
margin-right:0cm;
@@ -289,7 +289,7 @@ p.MsoToc4, li.MsoToc4, div.MsoToc4
margin-left:31.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc5, li.MsoToc5, div.MsoToc5
{margin-top:0cm;
margin-right:0cm;
@@ -297,7 +297,7 @@ p.MsoToc5, li.MsoToc5, div.MsoToc5
margin-left:42.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc6, li.MsoToc6, div.MsoToc6
{margin-top:0cm;
margin-right:0cm;
@@ -305,7 +305,7 @@ p.MsoToc6, li.MsoToc6, div.MsoToc6
margin-left:52.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc7, li.MsoToc7, div.MsoToc7
{margin-top:0cm;
margin-right:0cm;
@@ -313,7 +313,7 @@ p.MsoToc7, li.MsoToc7, div.MsoToc7
margin-left:63.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc8, li.MsoToc8, div.MsoToc8
{margin-top:0cm;
margin-right:0cm;
@@ -321,7 +321,7 @@ p.MsoToc8, li.MsoToc8, div.MsoToc8
margin-left:73.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc9, li.MsoToc9, div.MsoToc9
{margin-top:0cm;
margin-right:0cm;
@@ -329,22 +329,22 @@ p.MsoToc9, li.MsoToc9, div.MsoToc9
margin-left:84.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
- {mso-style-link:"��ע�ı� Char";
+ {mso-style-link:"脚注文本 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoHeader, li.MsoHeader, div.MsoHeader
- {mso-style-link:"ҳü Char";
+ {mso-style-link:"页眉 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -352,22 +352,22 @@ p.MsoHeader, li.MsoHeader, div.MsoHeader
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoFooter, li.MsoFooter, div.MsoFooter
- {mso-style-link:"ҳ�� Char";
+ {mso-style-link:"页脚 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
- {mso-style-name:"��������\,������Ŀ\,������Ŀ1\,������Ŀ2";
+ {mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
@@ -385,7 +385,7 @@ p.MsoTof, li.MsoTof, div.MsoTof
text-justify:inter-ideograph;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.MsoFootnoteReference
{vertical-align:super;}
p.MsoList, li.MsoList, div.MsoList
@@ -397,22 +397,22 @@ p.MsoList, li.MsoList, div.MsoList
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoDate, li.MsoDate, div.MsoDate
- {mso-style-link:"���� Char";
+ {mso-style-link:"日期 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -421,46 +421,46 @@ p.MsoDate, li.MsoDate, div.MsoDate
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
a:link, span.MsoHyperlink
- {mso-style-name:"������\,��������";
+ {mso-style-name:"超链接\,超级链接";
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
- {mso-style-name:"��ͨ\(��վ\)\,��ͨ \(Web\)\,��ͨ \(Web\)1\,��ͨ \(Web\)2\,��ͨ \(Web\)3";
+ {mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3";
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
- font-family:����;}
+ font-family:宋体;}
pre
- {mso-style-name:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- mso-style-link:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
+ {mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
- font-family:����;}
+ font-family:宋体;}
tt
- {font-family:����;}
+ {font-family:黑体;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
- {mso-style-link:"��ע���ı� Char";
+ {mso-style-link:"批注框文本 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.1, li.1, div.1
- {mso-style-name:��ʽ1;
+ {mso-style-name:样式1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -469,213 +469,213 @@ p.1, li.1, div.1
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a, li.a, div.a
- {mso-style-name:�������;
- mso-style-link:"������� Char";
+ {mso-style-name:代码程序;
+ mso-style-link:"代码程序 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.Char
- {mso-style-name:"������� Char";
- mso-style-link:�������;
- font-family:����;}
+ {mso-style-name:"代码程序 Char";
+ mso-style-link:代码程序;
+ font-family:宋体;}
p.a0, li.a0, div.a0
- {mso-style-name:ͼ˵��;
- mso-style-link:"ͼ˵�� Char";
+ {mso-style-name:图说明;
+ mso-style-link:"图说明 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char0
- {mso-style-name:"ͼ˵�� Char";
- mso-style-link:ͼ˵��;
- font-family:����;}
+ {mso-style-name:"图说明 Char";
+ mso-style-link:图说明;
+ font-family:宋体;}
p.0, li.0, div.0
- {mso-style-name:����0;
+ {mso-style-name:封面0;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.10, li.10, div.10
- {mso-style-name:����1;
+ {mso-style-name:封面1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.11, li.11, div.11
- {mso-style-name:�DZ���1;
+ {mso-style-name:非标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.a1, li.a1, div.a1
- {mso-style-name:�ı�����;
+ {mso-style-name:文本居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharChar, li.3CharChar, div.3CharChar
- {mso-style-name:"ͼ������3 Char Char";
- mso-style-link:"ͼ������3 Char Char Char";
+ {mso-style-name:"图中文字3 Char Char";
+ mso-style-link:"图中文字3 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharCharChar
- {mso-style-name:"ͼ������3 Char Char Char";
- mso-style-link:"ͼ������3 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char";
+ mso-style-link:"图中文字3 Char Char";
+ font-family:宋体;}
p.post, li.post, div.post
- {mso-style-name:�ʼ�post;
+ {mso-style-name:邮件post;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3, li.3, div.3
- {mso-style-name:ͼ������3;
+ {mso-style-name:图中字体3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharChar1CharCharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char Char";
+ font-family:宋体;}
span.3CharChar1CharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char";
+ font-family:宋体;}
p.5Char, li.5Char, div.5Char
- {mso-style-name:"ͼ������5�� Char";
- mso-style-link:"ͼ������5�� Char Char";
+ {mso-style-name:"图中文字5号 Char";
+ mso-style-link:"图中文字5号 Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.5CharChar
- {mso-style-name:"ͼ������5�� Char Char";
- mso-style-link:"ͼ������5�� Char";
- font-family:����;}
+ {mso-style-name:"图中文字5号 Char Char";
+ mso-style-link:"图中文字5号 Char";
+ font-family:宋体;}
p.5CharChar0, li.5CharChar0, div.5CharChar0
- {mso-style-name:"ͼ������С5�� Char Char";
- mso-style-link:"ͼ������С5�� Char Char Char";
+ {mso-style-name:"图中文字小5号 Char Char";
+ mso-style-link:"图中文字小5号 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
span.5CharCharChar
- {mso-style-name:"ͼ������С5�� Char Char Char";
- mso-style-link:"ͼ������С5�� Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字小5号 Char Char Char";
+ mso-style-link:"图中文字小5号 Char Char";
+ font-family:宋体;}
p.5Char0, li.5Char0, div.5Char0
- {mso-style-name:"ͼ������С5�� Char";
+ {mso-style-name:"图中文字小5号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5, li.5, div.5
- {mso-style-name:ͼ������С5��;
+ {mso-style-name:图中文字小5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.2, li.2, div.2
- {mso-style-name:�������2;
+ {mso-style-name:代码程序2;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.20, li.20, div.20
- {mso-style-name:ͼ˵��2;
+ {mso-style-name:图说明2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.21, li.21, div.21
- {mso-style-name:�ı�����2;
+ {mso-style-name:文本居中2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharCharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char";
+ font-family:宋体;}
p.a2, li.a2, div.a2
- {mso-style-name:ͼ����;
+ {mso-style-name:图居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.110, li.110, div.110
- {mso-style-name:"��ʽ ���� 1 + ����1";
+ {mso-style-name:"样式 标题 1 + 居中1";
margin-right:0cm;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
span.1Char
- {mso-style-name:"���� 1 Char";
- mso-style-link:"���� 1";
+ {mso-style-name:"标题 1 Char";
+ mso-style-link:"标题 1";
font-weight:bold;}
p.22, li.22, div.22
- {mso-style-name:"��ʽ �б� 2 + ����";
+ {mso-style-name:"样式 列表 2 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.23, li.23, div.23
- {mso-style-name:�б�2;
+ {mso-style-name:列表2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.50, li.50, div.50
- {mso-style-name:ͼ������5��;
+ {mso-style-name:图中文字5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.111, li.111, div.111
- {mso-style-name:��ʽ11;
+ {mso-style-name:样式11;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -684,107 +684,107 @@ p.111, li.111, div.111
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.12, li.12, div.12
- {mso-style-name:�������1;
+ {mso-style-name:代码程序1;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.13, li.13, div.13
- {mso-style-name:ͼ˵��1;
+ {mso-style-name:图说明1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.01, li.01, div.01
- {mso-style-name:����01;
+ {mso-style-name:封面01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.112, li.112, div.112
- {mso-style-name:����11;
+ {mso-style-name:封面11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.113, li.113, div.113
- {mso-style-name:�DZ���11;
+ {mso-style-name:非标题11;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.14, li.14, div.14
- {mso-style-name:�ı�����1;
+ {mso-style-name:文本居中1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char1, li.3Char1, div.3Char1
- {mso-style-name:"ͼ������3 Char1";
+ {mso-style-name:"图中文字3 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post1, li.post1, div.post1
- {mso-style-name:�ʼ�post1;
+ {mso-style-name:邮件post1;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.31, li.31, div.31
- {mso-style-name:ͼ������31;
+ {mso-style-name:图中字体31;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char1, li.5Char1, div.5Char1
- {mso-style-name:"ͼ������5�� Char1";
+ {mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5CharChar1, li.5CharChar1, div.5CharChar1
- {mso-style-name:"ͼ������С5�� Char Char1";
+ {mso-style-name:"图中文字小5号 Char Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char10, li.5Char10, div.5Char10
- {mso-style-name:"ͼ������С5�� Char1";
+ {mso-style-name:"图中文字小5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.51, li.51, div.51
- {mso-style-name:ͼ������С5��1;
+ {mso-style-name:图中文字小5号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.120, li.120, div.120
- {mso-style-name:��ʽ12;
+ {mso-style-name:样式12;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -793,81 +793,81 @@ p.120, li.120, div.120
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.02, li.02, div.02
- {mso-style-name:����02;
+ {mso-style-name:封面02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.121, li.121, div.121
- {mso-style-name:����12;
+ {mso-style-name:封面12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.122, li.122, div.122
- {mso-style-name:�DZ���12;
+ {mso-style-name:非标题12;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.3Char2, li.3Char2, div.3Char2
- {mso-style-name:"ͼ������3 Char2";
+ {mso-style-name:"图中文字3 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post2, li.post2, div.post2
- {mso-style-name:�ʼ�post2;
+ {mso-style-name:邮件post2;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.32, li.32, div.32
- {mso-style-name:ͼ������32;
+ {mso-style-name:图中字体32;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char2, li.5Char2, div.5Char2
- {mso-style-name:"ͼ������С5�� Char2";
+ {mso-style-name:"图中文字小5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.52, li.52, div.52
- {mso-style-name:ͼ������С5��2;
+ {mso-style-name:图中文字小5号2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.130, li.130, div.130
- {mso-style-name:��ʽ13;
+ {mso-style-name:样式13;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -876,129 +876,129 @@ p.130, li.130, div.130
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.30, li.30, div.30
- {mso-style-name:�������3;
+ {mso-style-name:代码程序3;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.03, li.03, div.03
- {mso-style-name:����03;
+ {mso-style-name:封面03;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.131, li.131, div.131
- {mso-style-name:����13;
+ {mso-style-name:封面13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.132, li.132, div.132
- {mso-style-name:�DZ���13;
+ {mso-style-name:非标题13;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.33, li.33, div.33
- {mso-style-name:�ı�����3;
+ {mso-style-name:文本居中3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char3, li.3Char3, div.3Char3
- {mso-style-name:"ͼ������3 Char3";
+ {mso-style-name:"图中文字3 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post3, li.post3, div.post3
- {mso-style-name:�ʼ�post3;
+ {mso-style-name:邮件post3;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.330, li.330, div.330
- {mso-style-name:ͼ������33;
+ {mso-style-name:图中字体33;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char20, li.5Char20, div.5Char20
- {mso-style-name:"ͼ������5�� Char2";
+ {mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5CharChar2, li.5CharChar2, div.5CharChar2
- {mso-style-name:"ͼ������С5�� Char Char2";
+ {mso-style-name:"图中文字小5号 Char Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char3, li.5Char3, div.5Char3
- {mso-style-name:"ͼ������С5�� Char3";
+ {mso-style-name:"图中文字小5号 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.53, li.53, div.53
- {mso-style-name:ͼ������С5��3;
+ {mso-style-name:图中文字小5号3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char, li.3Char, div.3Char
- {mso-style-name:"ͼ������3 Char";
- mso-style-link:"ͼ������3 Char Char5";
+ {mso-style-name:"图中文字3 Char";
+ mso-style-link:"图中文字3 Char Char5";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharChar5
- {mso-style-name:"ͼ������3 Char Char5";
- mso-style-link:"ͼ������3 Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char5";
+ mso-style-link:"图中文字3 Char";
+ font-family:宋体;}
p.54, li.54, div.54
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5紧密;
margin:0cm;
margin-bottom:.0001pt;
line-height:9.0pt;
text-autospace:ideograph-numeric;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.24, li.24, div.24
- {mso-style-name:����2�Ŵ�����;
+ {mso-style-name:居中2号粗宋体;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.15, li.15, div.15
- {mso-style-name:"��ʽ ���� 1 + ����";
+ {mso-style-name:"样式 标题 1 + 居中";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1006,10 +1006,10 @@ p.15, li.15, div.15
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.25, li.25, div.25
- {mso-style-name:"��ʽ ���� 2 + �о�\: �����о�";
+ {mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1022,33 +1022,33 @@ p.25, li.25, div.25
font-family:"Arial","sans-serif";
font-weight:bold;}
span.2Char
- {mso-style-name:"���� 2 Char";
- mso-style-link:"���� 2";
+ {mso-style-name:"标题 2 Char";
+ mso-style-link:"标题 2";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.34, li.34, div.34
- {mso-style-name:�б�3;
+ {mso-style-name:列表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.35, li.35, div.35
- {mso-style-name:��3;
+ {mso-style-name:表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.4, li.4, div.4
- {mso-style-name:ͼ˵��4;
+ {mso-style-name:图说明4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.40, li.40, div.40
- {mso-style-name:�б�4;
+ {mso-style-name:列表4;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1057,168 +1057,168 @@ p.40, li.40, div.40
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.41, li.41, div.41
- {mso-style-name:��4;
+ {mso-style-name:表4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.55, li.55, div.55
- {mso-style-name:ͼ˵��5;
+ {mso-style-name:图说明5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.56, li.56, div.56
- {mso-style-name:�б�5;
+ {mso-style-name:列表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.57, li.57, div.57
- {mso-style-name:��5;
+ {mso-style-name:表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.6, li.6, div.6
- {mso-style-name:�б�6;
+ {mso-style-name:列表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.60, li.60, div.60
- {mso-style-name:��6;
+ {mso-style-name:表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.61, li.61, div.61
- {mso-style-name:ͼ˵��6;
+ {mso-style-name:图说明6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.7, li.7, div.7
- {mso-style-name:�б�7;
+ {mso-style-name:列表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.70, li.70, div.70
- {mso-style-name:ͼ˵��7;
+ {mso-style-name:图说明7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.71, li.71, div.71
- {mso-style-name:��7;
+ {mso-style-name:表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.8, li.8, div.8
- {mso-style-name:�б�8;
+ {mso-style-name:列表8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.9, li.9, div.9
- {mso-style-name:�б�9;
+ {mso-style-name:列表9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.90, li.90, div.90
- {mso-style-name:ͼ˵��9;
+ {mso-style-name:图说明9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.100, li.100, div.100
- {mso-style-name:�б�10;
+ {mso-style-name:列表10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.101, li.101, div.101
- {mso-style-name:ͼ˵��10;
+ {mso-style-name:图说明10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.114, li.114, div.114
- {mso-style-name:�б�11;
+ {mso-style-name:列表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.115, li.115, div.115
- {mso-style-name:ͼ˵��11;
+ {mso-style-name:图说明11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.116, li.116, div.116
- {mso-style-name:��11;
+ {mso-style-name:表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.123, li.123, div.123
- {mso-style-name:�б�12;
+ {mso-style-name:列表12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.124, li.124, div.124
- {mso-style-name:ͼ˵��12;
+ {mso-style-name:图说明12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.133, li.133, div.133
- {mso-style-name:ͼ˵��13;
- mso-style-link:"ͼ˵��13 Char";
+ {mso-style-name:图说明13;
+ mso-style-link:"图说明13 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.13Char
- {mso-style-name:"ͼ˵��13 Char";
- mso-style-link:ͼ˵��13;
- font-family:����;}
+ {mso-style-name:"图说明13 Char";
+ mso-style-link:图说明13;
+ font-family:宋体;}
p.134, li.134, div.134
- {mso-style-name:�б�13;
+ {mso-style-name:列表13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.26, li.26, div.26
- {mso-style-name:��¼2;
+ {mso-style-name:附录2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1230,7 +1230,7 @@ p.26, li.26, div.26
font-family:"Arial","sans-serif";
font-weight:bold;}
p.36, li.36, div.36
- {mso-style-name:��¼3;
+ {mso-style-name:附录3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1240,12 +1240,12 @@ p.36, li.36, div.36
font-family:"Arial","sans-serif";
font-weight:bold;}
span.3Char0
- {mso-style-name:"���� 3 Char";
- mso-style-link:"���� 3";
+ {mso-style-name:"标题 3 Char";
+ mso-style-link:"标题 3";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.16, li.16, div.16
- {mso-style-name:��¼1;
+ {mso-style-name:附录1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1253,17 +1253,17 @@ p.16, li.16, div.16
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.17, li.17, div.17
- {mso-style-name:��¼��1;
+ {mso-style-name:附录表1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.42, li.42, div.42
- {mso-style-name:��¼4;
+ {mso-style-name:附录4;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1273,19 +1273,19 @@ p.42, li.42, div.42
font-family:"Arial","sans-serif";
font-weight:bold;}
span.4Char
- {mso-style-name:"���� 4 Char";
- mso-style-link:"���� 4";
+ {mso-style-name:"标题 4 Char";
+ mso-style-link:"标题 4";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a3, li.a3, div.a3
- {mso-style-name:��¼ͼ˵��;
+ {mso-style-name:附录图说明;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.27, li.27, div.27
- {mso-style-name:�����2;
+ {mso-style-name:序标题2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1298,7 +1298,7 @@ p.27, li.27, div.27
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a4, li.a4, div.a4
- {mso-style-name:�����;
+ {mso-style-name:参考标题;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1306,10 +1306,10 @@ p.a4, li.a4, div.a4
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.18, li.18, div.18
- {mso-style-name:��������1;
+ {mso-style-name:索引标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1317,10 +1317,10 @@ p.18, li.18, div.18
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.19, li.19, div.19
- {mso-style-name:�б�1;
+ {mso-style-name:列表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1329,9 +1329,9 @@ p.19, li.19, div.19
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.1a, li.1a, div.1a
- {mso-style-name:��1;
+ {mso-style-name:表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1340,38 +1340,38 @@ p.1a, li.1a, div.1a
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.37, li.37, div.37
- {mso-style-name:ͼ˵��3;
+ {mso-style-name:图说明3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.62, li.62, div.62
- {mso-style-name:��������6��;
+ {mso-style-name:表中字体6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a5, li.a5, div.a5
- {mso-style-name:���Ĵ���;
- mso-style-link:"���Ĵ��� Char";
+ {mso-style-name:正文代码;
+ mso-style-link:"正文代码 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char1
- {mso-style-name:"���Ĵ��� Char";
- mso-style-link:���Ĵ���;
- font-family:����;}
+ {mso-style-name:"正文代码 Char";
+ mso-style-link:正文代码;
+ font-family:宋体;}
p.43, li.43, div.43
- {mso-style-name:"��ʽ ���� 4 +";
+ {mso-style-name:"样式 标题 4 +";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1381,7 +1381,7 @@ p.43, li.43, div.43
font-family:"Arial","sans-serif";
font-weight:bold;}
p.140, li.140, div.140
- {mso-style-name:��14;
+ {mso-style-name:表14;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1390,10 +1390,10 @@ p.140, li.140, div.140
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.141, li.141, div.141
- {mso-style-name:ͼ˵��14;
- mso-style-link:"ͼ˵��14 Char";
+ {mso-style-name:图说明14;
+ mso-style-link:"图说明14 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1402,62 +1402,62 @@ p.141, li.141, div.141
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.14Char
- {mso-style-name:"ͼ˵��14 Char";
- mso-style-link:ͼ˵��14;
- font-family:����;}
+ {mso-style-name:"图说明14 Char";
+ mso-style-link:图说明14;
+ font-family:宋体;}
p.a6, li.a6, div.a6
- {mso-style-name:�ļ�Ŀ¼��;
+ {mso-style-name:文件目录表;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a7, li.a7, div.a7
- {mso-style-name:"��ʽ ���� +";
- mso-style-link:"��ʽ ���� + Char";
+ {mso-style-name:"样式 正文 +";
+ mso-style-link:"样式 正文 + Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char2
- {mso-style-name:"��ʽ ���� + Char";
- mso-style-link:"��ʽ ���� +";
+ {mso-style-name:"样式 正文 + Char";
+ mso-style-link:"样式 正文 +";
font-family:"Times New Roman","serif";}
p.a8, li.a8, div.a8
- {mso-style-name:������ע;
+ {mso-style-name:表格题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a9, li.a9, div.a9
- {mso-style-name:�б���ע;
+ {mso-style-name:列表题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.aa, li.aa, div.aa
- {mso-style-name:ͼ��ע;
+ {mso-style-name:图题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ab, li.ab, div.ab
- {mso-style-name:������ע;
+ {mso-style-name:程序题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ac, li.ac, div.ac
- {mso-style-name:��������;
+ {mso-style-name:框中文字;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
@@ -1468,9 +1468,9 @@ p.ac, li.ac, div.ac
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.125, li.125, div.125
- {mso-style-name:"��ʽ ���� 1 + ����2";
+ {mso-style-name:"样式 标题 1 + 居中2";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1478,17 +1478,17 @@ p.125, li.125, div.125
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.ad, li.ad, div.ad
- {mso-style-name:"��ʽ ��ע + ���� ��� ����";
+ {mso-style-name:"样式 题注 + 宋体 五号 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:黑体;}
p.1b, li.1b, div.1b
- {mso-style-name:�����1;
+ {mso-style-name:序标题1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1496,65 +1496,65 @@ p.1b, li.1b, div.1b
line-height:240%;
page-break-after:avoid;
font-size:16.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.38, li.38, div.38
- {mso-style-name:�����3;
+ {mso-style-name:序标题3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
- font-family:����С���μ���;}
+ font-family:方正小标宋简体;}
p.63, li.63, div.63
- {mso-style-name:��������6��;
+ {mso-style-name:表中文字6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.64, li.64, div.64
- {mso-style-name:ͼ������6�������;
+ {mso-style-name:图中文字6号左对齐;
margin:0cm;
margin-bottom:.0001pt;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.65, li.65, div.65
- {mso-style-name:ͼ������6��;
- mso-style-link:"ͼ������6�� Char";
+ {mso-style-name:图中文字6号;
+ mso-style-link:"图中文字6号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
span.6Char
- {mso-style-name:"ͼ������6�� Char";
- mso-style-link:ͼ������6��;
- font-family:����;}
+ {mso-style-name:"图中文字6号 Char";
+ mso-style-link:图中文字6号;
+ font-family:宋体;}
p.ae, li.ae, div.ae
- {mso-style-name:ͼ��;
+ {mso-style-name:图标;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.28, li.28, div.28
- {mso-style-name:ͼ��2;
+ {mso-style-name:图标2;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.af, li.af, div.af
- {mso-style-name:ϰ�����;
+ {mso-style-name:习题标题;
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:0cm;
@@ -1564,29 +1564,29 @@ p.af, li.af, div.af
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
- font-family:����;}
+ font-family:黑体;}
p.1c, li.1c, div.1c
- {mso-style-name:���ֱ��1;
+ {mso-style-name:部分编号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:16.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af0, li.af0, div.af0
- {mso-style-name:������;
+ {mso-style-name:表标题;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
- {mso-style-name:"��ʽ ��ע + ����";
+ {mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.ListTitle, li.ListTitle, div.ListTitle
{mso-style-name:ListTitle;
margin:0cm;
@@ -1628,201 +1628,201 @@ p.RightText, li.RightText, div.RightText
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af2, li.af2, div.af2
- {mso-style-name:����������;
+ {mso-style-name:表中文字小五;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af3, li.af3, div.af3
- {mso-style-name:�ؼ���;
- mso-style-link:"�ؼ��� Char";
+ {mso-style-name:关键词;
+ mso-style-link:"关键词 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char3
- {mso-style-name:"�ؼ��� Char";
- mso-style-link:�ؼ���;
- font-family:����;}
+ {mso-style-name:"关键词 Char";
+ mso-style-link:关键词;
+ font-family:宋体;}
p.af4, li.af4, div.af4
- {mso-style-name:���;
- mso-style-link:"��� Char";
+ {mso-style-name:文件名;
+ mso-style-link:"文件名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char4
- {mso-style-name:"��� Char";
- mso-style-link:���;
- font-family:����;}
+ {mso-style-name:"文件名 Char";
+ mso-style-link:文件名;
+ font-family:宋体;}
p.af5, li.af5, div.af5
- {mso-style-name:ѡ��;
- mso-style-link:"ѡ�� Char";
+ {mso-style-name:选项;
+ mso-style-link:"选项 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char5
- {mso-style-name:"ѡ�� Char";
- mso-style-link:ѡ��;
- font-family:����;}
+ {mso-style-name:"选项 Char";
+ mso-style-link:选项;
+ font-family:宋体;}
p.af6, li.af6, div.af6
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:命令行;
+ mso-style-link:"命令行 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char6
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"命令行 Char";
+ mso-style-link:命令行;
+ font-family:宋体;}
p.af7, li.af7, div.af7
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:函数名;
+ mso-style-link:"函数名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char7
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"函数名 Char";
+ mso-style-link:函数名;
+ font-family:宋体;}
p.af8, li.af8, div.af8
- {mso-style-name:�Ĵ�����;
- mso-style-link:"�Ĵ����� Char";
+ {mso-style-name:寄存器名;
+ mso-style-link:"寄存器名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char8
- {mso-style-name:"�Ĵ����� Char";
- mso-style-link:�Ĵ�����;
+ {mso-style-name:"寄存器名 Char";
+ mso-style-link:寄存器名;
font-family:"Times New Roman","serif";}
p.af9, li.af9, div.af9
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:变量名;
+ mso-style-link:"变量名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char9
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"变量名 Char";
+ mso-style-link:变量名;
+ font-family:宋体;}
p.58, li.58, div.58
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5号左;
margin:0cm;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.59, li.59, div.59
- {mso-style-name:ͼ������С5�ſ���;
+ {mso-style-name:图中文字小5号靠左;
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.926, li.926, div.926
- {mso-style-name:"��ʽ ������� + ���\: 9\.26 ����";
+ {mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.5Char4
- {mso-style-name:"���� 5 Char";
- mso-style-link:"���� 5";
+ {mso-style-name:"标题 5 Char";
+ mso-style-link:"标题 5";
font-weight:bold;}
span.6Char0
- {mso-style-name:"���� 6 Char";
- mso-style-link:"���� 6";
+ {mso-style-name:"标题 6 Char";
+ mso-style-link:"标题 6";
font-family:"Arial","sans-serif";
font-weight:bold;}
span.7Char
- {mso-style-name:"���� 7 Char";
- mso-style-link:"���� 7";
+ {mso-style-name:"标题 7 Char";
+ mso-style-link:"标题 7";
font-weight:bold;}
span.8Char
- {mso-style-name:"���� 8 Char";
- mso-style-link:"���� 8";
+ {mso-style-name:"标题 8 Char";
+ mso-style-link:"标题 8";
font-family:"Arial","sans-serif";}
span.9Char
- {mso-style-name:"���� 9 Char";
- mso-style-link:"���� 9";
+ {mso-style-name:"标题 9 Char";
+ mso-style-link:"标题 9";
font-family:"Arial","sans-serif";}
span.Chara
- {mso-style-name:"��ע�ı� Char";
- mso-style-link:��ע�ı�;
- font-family:����;}
+ {mso-style-name:"脚注文本 Char";
+ mso-style-link:脚注文本;
+ font-family:宋体;}
span.Charb
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;}
+ {mso-style-name:"批注文字 Char";
+ mso-style-link:批注文字;
+ font-family:宋体;}
span.Charc
- {mso-style-name:"ҳü Char";
- mso-style-link:ҳü;
- font-family:����;}
+ {mso-style-name:"页眉 Char";
+ mso-style-link:页眉;
+ font-family:宋体;}
span.Chard
- {mso-style-name:"ҳ�� Char";
- mso-style-link:ҳ��;
- font-family:����;}
+ {mso-style-name:"页脚 Char";
+ mso-style-link:页脚;
+ font-family:宋体;}
span.Chare
- {mso-style-name:"���� Char";
- mso-style-link:����;
- font-family:����;}
+ {mso-style-name:"日期 Char";
+ mso-style-link:日期;
+ font-family:宋体;}
span.HTMLChar
- {mso-style-name:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
- mso-style-link:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- font-family:����;}
+ {mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
+ mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ font-family:宋体;}
span.Charf
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;
+ {mso-style-name:"批注主题 Char";
+ mso-style-link:批注主题;
+ font-family:宋体;
font-weight:bold;}
span.Charf0
- {mso-style-name:"��ע���ı� Char";
- mso-style-link:��ע���ı�;
- font-family:����;}
+ {mso-style-name:"批注框文本 Char";
+ mso-style-link:批注框文本;
+ font-family:宋体;}
span.3CharChar1
- {mso-style-name:"ͼ������3 Char Char1";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1";
+ font-family:宋体;}
span.5CharCharChar0
- {mso-style-name:"ͼ������5�� Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字5号 Char Char Char";
+ font-family:宋体;}
span.3CharChar3
- {mso-style-name:"ͼ������3 Char Char3";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char3";
+ font-family:宋体;}
span.3CharChar1Char
- {mso-style-name:"ͼ������3 Char Char1 Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char";
+ font-family:宋体;}
span.3CharChar13
- {mso-style-name:"ͼ������3 Char Char13";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char13";
+ font-family:宋体;}
span.3CharChar12
- {mso-style-name:"ͼ������3 Char Char12";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char12";
+ font-family:宋体;}
span.3CharChar11
- {mso-style-name:"ͼ������3 Char Char11";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char11";
+ font-family:宋体;}
.MsoChpDefault
{font-size:10.0pt;}
/* Page Definitions */
@@ -1846,7 +1846,7 @@ ul
6 7
-#define DEBUG_PROC_TREE // ������š����Խ��������� 8 9
-#include <errno.h> // �����ͷ�ļ�������ϵͳ�и��ֳ����š�(Linus��minix��������) 10
-#include <signal.h> // �ź�ͷ�ļ��������źŷ��ų������źŽṹ�Լ��źŲ�������ԭ�͡� 11
-#include <sys/wait.h> // �ȴ�����ͷ�ļ�������ϵͳ����wait()��waitpid()����س������š� 12 13
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct������0���ݵȡ� 14
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 15
-#include <linux/tty.h> // ttyͷ�ļ����������й�tty_io������ͨ�ŷ���IJ����������� 16
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 17 18 int
sys_pause(void);
-// �ѽ�����Ϊ˯��״̬��ֱ���յ��źţ�kernel/sched.c��164�У��� 19 int
-sys_close(int fd); // �ر�ָ���ļ���ϵͳ���ã�fs/open.c��219�У��� 20 //// �ͷ�ָ������ռ�õ�����ۼ����������ݽṹռ�õ��ڴ�ҳ�档 //// 释放指定进程占用的任务槽及其任务数据结构占用的内存页面。 // ����p ���������ݽṹָ�롣�ú����ں����
-sys_kill() �� sys_waitpid() �����б����á� // 参数p 是任务数据结构指针。该函数在后面的
+sys_kill() 和 sys_waitpid() 函数中被调用。 // ɨ������ָ������� task[] ��Ѱ��ָ������������ҵ�����������ո�����ۣ�Ȼ���ͷ� // 扫描任务指针数组表 task[] 以寻找指定的任务。如果找到,则首先清空该任务槽,然后释放 // ���������ݽṹ��ռ�õ��ڴ�ҳ�棬���ִ�е��Ⱥ������ڷ���ʱ�����˳���������������� // 该任务数据结构所占用的内存页面,最后执行调度函数并在返回时立即退出。如果在任务数组 // ����û���ҵ�ָ�������Ӧ������ں�panicJ�� // 表中没有找到指定任务对应的项,则内核panicJ。 21 void
release(struct 24 // �������������ṹָ��ΪNULL���˳��������ָ��ָ��ǰ��������ʾ������Ϣ�˳��� // 如果给定的任务结构指针为NULL则退出。如果该指针指向当前进程则显示警告信息退出。 25
if (!p) 30
} // ɨ������ṹָ�����飬Ѱ��ָ��������p������ҵ������ÿ�����ָ�������ж�Ӧ����� // 扫描任务结构指针数组,寻找指定的任务p。如果找到,则置空任务指针数组中对应项,并且 // ��������ṹ֮��Ĺ���ָ�룬�ͷ�����p���ݽṹռ�õ��ڴ�ҳ�档�����ִ�е��ȳ��� // 更新任务结构之间的关联指针,释放任务p数据结构占用的内存页面。最后在执行调度程序 // ���غ��˳������û���ҵ�ָ��������p����˵���ں˴�������ˣ�����ʾ������Ϣ�������� // 返回后退出。如果没有找到指定的任务p,则说明内核代码出错了,则显示出错信息并死机。 // �������Ӳ��ֵĴ�����ָ������p��˫��������ɾ���� // 更新链接部分的代码会把指定任务p从双向链表中删除。 31
for (i=1 ; i<NR_TASKS ; i++) 34
-/* Update links */ /* ��������/* Update links */ /* 更新链接 */ // ���p����������ϣ����ӽ��̣����ñ����ϵı��ڽ���ָ������µı��ڽ��̡���� // 如果p不是最后(最老)的子进程,则让比其老的比邻进程指向比它新的比邻进程。如果p // �������µ��ӽ��̣����ñ����µı����ӽ���ָ����ڵ��Ͻ��̡�
-�������p �������µ� // 不是最新的子进程,则让比其新的比邻子进程指向比邻的老进程。
+如果任务p 就是最新的 // �ӽ��̣�����Ҫ�����丸���̵������ӽ���ָ��cptrΪָ��p�ı����ӽ��̡� // 子进程,则还需要更新其父进程的最新子进程指针cptr为指向p的比邻子进程。 // ָ��osptr��old sibling pointer��ָ���p�ȴ������ֵܽ��̡� // 指针osptr(old sibling pointer)指向比p先创建的兄弟进程。 // ָ��ysptr��younger sibling pointer��ָ���p�����ֵܽ��̡� // 指针ysptr(younger sibling pointer)指向比p后创建的兄弟进程。 // ָ��pptr��parent pointer��ָ��p�ĸ����̡� // 指针pptr(parent pointer)指向p的父进程。 // ָ��cptr��child pointer���Ǹ�����ָ�����£���������ӽ��̡� // 指针cptr(child pointer)是父进程指向最新(最后)创建的子进程。 35
if (p->p_osptr) 48
#ifdef DEBUG_PROC_TREE // ��������˷���DEBUG_PROC_TREE�������ʱ�������´��롣 // 如果定义了符号DEBUG_PROC_TREE,则编译时包括以下代码。 49 /* /* * ���task[]�������Ƿ����һ��ָ����task_struct�ṹָ��p�� * 检查task[]数组中是否存在一个指定的task_struct结构指针p。 * ���������0������1�� * 如果存在则返回0,否则返回1。 */ // �������ṹָ��p�� // 检测任务结构指针p。 53 int
bad_task_ptr(struct /* * ����ĺ�������ɨ�����������ȷ�����Ĺ���������Ȼ��ȷ�������ڵ�ʽ�� * 下面的函数用于扫描进程树,以确定更改过的链接仍然正确。仅用于调式, * ��Ϊ�ú����Ƚ��� * 因为该函数比较慢.... * * �ú�������ȥҪ��ʵ�ʵĿֲ�.... ��ʵ���ǽ�����֤��ָ��p_ysptr�� * 该函数看上去要比实际的恐怖.... 其实我们仅仅验证了指针p_ysptr和 * p_osptr���ɵ�˫���������������������ָ��p_cptr��p_pptr���ɵ� * p_osptr构成的双向链表,并检查了链表与指针p_cptr和p_pptr构成的 * ������֮��Ĺ�ϵ�� * 进程树之间的关系。 */ // ���������� // 检查进程树。 74
void audit_ptree() 77 // ɨ��ϵͳ�еij�����0��������������������4��ָ�루pptr��cptr��ysptr��osptr�� // 扫描系统中的除任务0以外的所有任务,检查它们中4个指针(pptr、cptr、ysptr和osptr) // ����ȷ�ԡ�����������ۣ��Ϊ���������� // 的正确性。若任务数组槽(项)为空则跳过。 78
for (i=1 ; i<NR_TASKS ; i++) { 80
continue; // �������ĸ�����ָ��p_pptrû��ָ���κν��̣��������������в����ڣ�������ʾ������Ϣ // 如果任务的父进程指针p_pptr没有指向任何进程(即在任务数组中不存在),则显示警告信息 // �����棬pid��N�ĸ��������������⡱����������cptr��ysptr��osptr�������Ʋ����� // “警告,pid号N的父进程链接有问题”。以下语句对cptr、ysptr和osptr进行类似操作。 81
if (bad_task_ptr(, 92
task[i]->pid); // �������ĸ�����ָ��p_pptrָ�����Լ�������ʾ������Ϣ�����棬pid��N�ĸ��������� // 如果任务的父进程指针p_pptr指向了自己,则显示警告信息“警告,pid号N的父进程链接 // ָ��ָ�����Լ�������������cptr��ysptr��osptr�������Ʋ����� // 指针指向了自己”。以下语句对cptr、ysptr和osptr进行类似操作。 93
if (task[i]->p_pptr == &nb
printk("Warning, pid %d os link
points to self\n"); // ��������б��Լ��ȴ����ı����ֵܽ��̣���ô�ͼ�������Ƿ��й�ͬ�ĸ����̣��������� // 如果任务有比自己先创建的比邻兄弟进程,那么就检查它们是否有共同的父进程,并检查这个 // ���ֽ��̵�ysptrָ���Ƿ���ȷ��ָ���̡�������ʾ������Ϣ�� // 老兄进程的ysptr指针是否正确地指向本进程。否则显示警告信息。 101
@@ -2322,9 +2322,9 @@ style='color:blue'>task[i]->p_osptr->pid); // ��������б��Լ����ı����ֵܽ��̣���ô�ͼ�������Ƿ��й�ͬ�ĸ����̣��������� // 如果任务有比自己后创建的比邻兄弟进程,那么就检查它们是否有共同的父进程,并检查这个 // С�ܽ��̵�osptrָ���Ƿ���ȷ��ָ���̡�������ʾ������Ϣ�� // 小弟进程的osptr指针是否正确地指向本进程。否则显示警告信息。 112
@@ -2374,11 +2374,11 @@ style='color:blue'>task[i]->p_ysptr->pid); // �������������ӽ���ָ��cptr���գ���ô�����ӽ��̵ĸ������Ƿ��DZ����̣������� // 如果任务的最新子进程指针cptr不空,那么检查该子进程的父进程是否是本进程,并检查该 // �ӽ��̵�С�ܽ���ָ��yspter�Ƿ�Ϊ�ա�����������ʾ������Ϣ�� // 子进程的小弟进程指针yspter是否为空。若不是则显示警告信息。 123
@@ -2435,16 +2435,16 @@ lang=EN-US> #endif /* DEBUG_PROC_TREE */ 136 //// ��ָ������p�����ź�sig��Ȩ��Ϊpriv�� //// 向指定任务p发送信号sig,权限为priv。 // ������sig
-- �ź�ֵ��p - ָ�������ָ�룻priv - ǿ�Ʒ����źŵı�־��������Ҫ���ǽ��� // 参数:sig
+- 信号值;p - 指定任务的指针;priv - 强制发送信号的标志。即不需要考虑进程 // �û����Ի���ܷ����źŵ�Ȩ�����ú��������жϲ�������ȷ�ԣ�Ȼ���ж������Ƿ����㡣 // 用户属性或级别而能发送信号的权利。该函数首先判断参数的正确性,然后判断条件是否满足。 // ����������ָ�����̷����ź�sig���˳�������δ���ɴ���š� // 如果满足就向指定进程发送信号sig并退出,否则返回未许可错误号。 137 static inline int send_sig(long
@@ -2453,11 +2453,11 @@ sig,struct task_struct * p,int priv)138 { // ���û��Ȩ�ޣ����ҵ�ǰ���̵���Ч�û�ID�����p�IJ�ͬ������Ҳ���dz����û�����˵�� // 如果没有权限,并且当前进程的有效用户ID与进程p的不同,并且也不是超级用户,则说明 // û����p�����źŵ�Ȩ����suser()����Ϊ(current->euid==0)�������ж��Ƿ��dz����û��� // 没有向p发送信号的权利。suser()定义为(current->euid==0),用于判断是否是超级用户。 139 if (!p) // ����Ҫ���͵��ź���SIGKILL�� SIGCONT����ô�����ʱ�����źŵĽ��� p������ֹͣ״̬ // 若需要发送的信号是SIGKILL或 SIGCONT,那么如果此时接收信号的进程 p正处于停止状态 // ������Ϊ���������У�״̬��Ȼ���Ľ���p���ź�λͼsignal��ȥ������λ���ᵼ�½��� // 就置其为就绪(运行)状态。然后修改进程p的信号位图signal,去掉(复位)会导致进程 // ֹͣ���ź�SIGSTOP��SIGTSTP��SIGTTIN��SIGTTOU�� // 停止的信号SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU。 143 if ((sig == /* If the
signal will be ignored, don't even post it */
-/* ���Ҫ���͵��ź�sig��������p���Ե�����ô�������÷���如果要发送的信号sig将被进程p忽略掉,那么就根本不用发送 */ 151 /* Depends on
order SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU */
-/* �����ж�������SIGSTOP��SIGTSTP��SIGTTIN��SIGTTOU�Ĵ���
+/* 以下判断依赖于SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU的次序
*/ // ����ź���SIGSTOP��SIGTSTP��SIGTTIN��SIGTTOU֮һ����ô˵��Ҫ�ý����źŵĽ��� // 如果信号是SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU之一,那么说明要让接收信号的进程p // ֹͣ���С���ˣ���p ���ź�λͼ���� SIGCONT ��λ������Ҫ��λλͼ�м������е��ź� // 停止运行。因此(若p 的信号位图中有 SIGCONT 置位)就需要复位位图中继续运行的信号 // SIGCONT����λ�� // SIGCONT比特位。 154 if ((sig >= /* Actually
deliver the signal */
-/* ������������p�����ź�p */ 157 p->signal |=
@@ -2580,14 +2580,14 @@ lang=EN-US> } 160 // ���ݽ������pgrpȡ�ý����������ĻỰ�š� // 根据进程组号pgrp取得进程组所属的会话号。 // ɨ���������飬Ѱ�ҽ������Ϊpgrp�Ľ��̣���������Ự�š����û���ҵ�ָ��������� // 扫描任务数组,寻找进程组号为pgrp的进程,并返回其会话号。如果没有找到指定进程组号 // Ϊpgrp���κν��̣���-1�� // 为pgrp的任何进程,则返回-1。 161 int session_of_pgrp(int
@@ -2625,19 +2625,19 @@ lang=EN-US> } 170 // ��ֹ�����飨������鷢���źţ��� // 终止进程组(向进程组发送信号)。 // ������pgrp
-- ָ���Ľ�����ţ�sig - ָ�����źţ�priv - Ȩ�ޡ� // 参数:pgrp
+- 指定的进程组号;sig - 指定的信号;priv - 权限。 // ����ָ��������pgrp�е�ÿ�����̷���ָ���ź�sig��ֻҪ��һ�����̷��ͳɹ����ͻ� // 即向指定进程组pgrp中的每个进程发送指定信号sig。只要向一个进程发送成功最后就会 // ����0���������û���ҵ�ָ���������pgrp���κ�һ�����̣��س�����-ESRCH���� // 返回0,否则如果没有找到指定进程组号pgrp的任何一个进程,则返回出错号-ESRCH,若 // �ҵ����������pgrp�Ľ��̣����Ƿ����ź�ʧ�ܣ��ط���ʧ�ܵĴ����롣 // 找到进程组号是pgrp的进程,但是发送信号失败,则返回发送失败的错误码。 171 int kill_pg(int pgrp, int
@@ -2653,7 +2653,7 @@ style='color:blue'>task_struct **p; 174 int err,retval = -ESRCH;
-// -ESRCH��ʾָ���Ľ��̲����ڡ� 175 int found = 0; // �����жϸ������źźͽ�������Ƿ���Ч��Ȼ��ɨ��ϵͳ������������ɨ�赽�������Ϊ // 首先判断给定的信号和进程组号是否有效。然后扫描系统中所有任务。若扫描到进程组号为 // pgrp�Ľ��̣������䷢���ź�sig��ֻҪ��һ���źŷ��ͳɹ����������ͻ᷵��0�� // pgrp的进程,就向其发送信号sig。只要有一次信号发送成功,函数最后就会返回0。 177 if (sig<1 ||
@@ -2712,19 +2712,19 @@ lang=EN-US> } 188 // ��ֹ���̣�����̷����źţ��� // 终止进程(向进程发送信号)。 // ������pid
-- ���̺ţ�sig - ָ���źţ�priv - Ȩ�ޡ� // 参数:pid
+- 进程号;sig - 指定信号;priv - 权限。 // ������̺�Ϊpid�Ľ��̷���ָ���ź�sig�����ҵ�ָ��pid�Ľ��̣���ô���źŷ��ͳɹ��� // 即向进程号为pid的进程发送指定信号sig。若找到指定pid的进程,那么若信号发送成功, // ��0�������źŷ��ͳ����š����û���ҵ�ָ�����̺�pid�Ľ��̣��س����� // 则返回0,否则返回信号发送出错号。如果没有找到指定进程号pid的进程,则返回出错号 // -ESRCH��ָ�����̲����ڣ��� // -ESRCH(指定进程不存在)。 189 int kill_proc(int pid, int
@@ -2787,41 +2787,41 @@ lang=EN-US> */ /* * POSIX��ָ��kill(-1,sig)δ���塣��������֪���Ŀ��ܴ��ˡ�Ӧ������ * POSIX标准指明kill(-1,sig)未定义。但是我所知道的可能错了。应该让它 * ��BSD��SYSVϵͳһ���� * 象BSD或SYSV系统一样。 */ //// ϵͳ����kill()���������κν��̻�����鷢���κ��źţ�������ֻ��ɱ������J�� //// 系统调用kill()可用于向任何进程或进程组发送任何信号,而并非只是杀死进程J。 // ����pid�ǽ��̺ţ�sig����Ҫ���͵��źš� // 参数pid是进程号;sig是需要发送的信号。 // ���pidֵ>0�����źű��������̺���pid�Ľ��̡� // 如果pid值>0,则信号被发送给进程号是pid的进程。 // ���pid=0����ô�źžͻᱻ������ǰ���̵Ľ����������еĽ��̡� // 如果pid=0,那么信号就会被发送给当前进程的进程组中所有的进程。 // ���pid=-1�����ź�sig�ͻᷢ������һ�����̣���ʼ���̣�������н��̡� // 如果pid=-1,则信号sig就会发送给除第一个进程(初始进程)外的所有进程。 // ���pid
-< -1�����ź�sig������������-pid�����н��̡� // 如果pid
+< -1,则信号sig将发送给进程组-pid的所有进程。 // ����ź�sigΪ0�������źţ����Ի���д����顣����ɹ���0�� // 如果信号sig为0,则不发送信号,但仍会进行错误检查。如果成功则返回0。 // �ú���ɨ�������������������pid�����������Ľ��̷���ָ���ź�sig����pid����0�� // 该函数扫描任务数组表,并根据pid对满足条件的进程发送指定信号sig。若pid等于0, // ������ǰ�����ǽ������鳤�������Ҫ���������ڵĽ���ǿ�Ʒ����ź�sig�� // 表明当前进程是进程组组长,因此需要向所有组内的进程强制发送信号sig。 205 int sys_kill(int pid,int
@@ -2833,7 +2833,7 @@ lang=EN-US> { 207 struct task_struct **p = NR_TASKS
-+ task; // pָ�������������һ� 208 int err, retval =
@@ -2922,68 +2922,68 @@ lang=EN-US> */ /* * ����POSIX��2.2.2.52���еĶ��壬ȷ��һ���������Ƿ��ǡ��¶������¶����� * 根据POSIX标准2.2.2.52节中的定义,确定一个进程组是否是“孤儿”。孤儿进程 * �鲻���ܵ��ն˲�����ֹͣ�źŵ�Ӱ�졣�½������Ŷ������齫���յ�һ�� * 组不会受到终端产生的停止信号的影响。新近产生的孤儿进程组将会收到一个SIGHUP * �źź�һ��SIGCONT�źš� * 信号和一个SIGCONT信号。 * * �������㣬���Ƿ�����֪����Ϊһ���¶���ζ��ʲô���� * “我问你,你是否真正知道作为一个孤儿意味着什么?” */ // �����ᵽ��POSIX
-P1003.1 2.2.2.52���ǹ��ڹ¶������������������������µ�һ������ // 以上提到的POSIX
+P1003.1 2.2.2.52节是关于孤儿进程组的描述。在两种情况下当一个进程 // ��ֹʱ���ܵ��½������ɡ��¶����� һ�������鵽������ĸ�����֮�����ϵ�����ڸø� // 终止时可能导致进程组变成“孤儿”。 一个进程组到其组外的父进程之间的联系依赖于该父 // ���̺����ӽ������ߡ���ˣ����������һ�����Ӹ����̵Ľ��̻����һ�������̵�ֱ�Ӻ��� // 进程和其子进程两者。因此,若组外最后一个连接父进程的进程或最后一个父进程的直接后裔 // ��ֹ�Ļ�����ô���������ͻ��Ϊһ���¶������顣���κ�һ������£�������̵���ֹ�� // 终止的话,那么这个进程组就会成为一个孤儿进程组。在任何一种情况下,如果进程的终止导 // �½������ɹ¶������飬��ô�������е����н��̾ͻ������ǵ���ҵ����shell�Ͽ���ϵ�� // 致进程组变成孤儿进程组,那么进程组中的所有进程就会与它们的作业控制shell断开联系。 // ��ҵ����shell�����پ��иý�������ڵ��κ���Ϣ�����ý������д���ֹͣ״̬�Ľ��̽��� // 作业控制shell将不再具有该进程组存在的任何信息。而该进程组中处于停止状态的进程将会 // ��Զ��ʧ��Ϊ�˽��������⣬����ֹͣ״̬���̵��½������Ŷ����������Ҫ���յ�һ�� // 永远消失。为了解决这个问题,含有停止状态进程的新近产生的孤儿进程组就需要接收到一个 // SIGHUP�źź�һ��SIGCONT�źţ�����ָʾ�����Ѿ������ǵĻỰ�� session���жϿ���ϵ�� // SIGHUP信号和一个SIGCONT信号,用于指示它们已经从它们的会话( session)中断开联系。 // SIGHUP�źŽ����½������г�Ա����ֹ���������Dz���������SIGHUP�źš��� SIGCONT�� // SIGHUP信号将导致进程组中成员被终止,除非它们捕获或忽略了SIGHUP信号。而 SIGCONT信 // �Ž�ʹ��Щû�б�SIGHUP�ź���ֹ�Ľ��̼������С� ���ڴ��������£����������һ���� // 号将使那些没有被SIGHUP信号终止的进程继续运行。 但在大多数情况下,如果组中有一个进 // �̴���ֹͣ״̬����ô�������еĽ��̿��ܶ�����ֹͣ״̬�� // 程处于停止状态,那么组中所有的进程可能都处于停止状态。 // // �ж�һ���������Ƿ��ǹ¶����̡����������0���������1�� // 判断一个进程组是否是孤儿进程。如果不是则返回0;如果是则返回1。 // ɨ���������顣���������գ����߽��̵������ָ���IJ�ͬ�����߽����Ѿ����ڽ���״̬�� // 扫描任务数组。如果任务项空,或者进程的组号与指定的不同,或者进程已经处于僵死状态, // ���߽��̵ĸ�������init���̣���˵��ɨ��Ľ��̲���ָ��������ij�Ա�����߲�����Ҫ�� // 或者进程的父进程是init进程,则说明扫描的进程不是指定进程组的成员,或者不满足要求, // ���������� ����˵���ý�����ָ����ij�Ա�����丸���̲���
-init���̡���ʱ����ý��� // 于是跳过。 否则说明该进程是指定组的成员并且其父进程不是
+init进程。此时如果该进程 // �����̵���Ų�����ָ�������pgrp���������̵ĻỰ�ŵ��ڽ��̵ĻỰ�ţ���˵������ͬ // 父进程的组号不等于指定的组号pgrp,但父进程的会话号等于进程的会话号,则说明它们同 // ����һ���Ự�����ָ����pgrp������϶����ǹ¶������顣����...�� // 属于一个会话。因此指定的pgrp进程组肯定不是孤儿进程组。否则...。 232 int is_orphaned_pgrp(int
@@ -3043,7 +3043,7 @@ lang=EN-US> } 246
return(1); /* (sighing) "Often!"
-*/ /* �������ǹ¶������飡*/ 247 } 248 // �жϽ��������Ƿ��д���ֹͣ״̬����ҵ�������飩������1������0�� // 判断进程组中是否含有处于停止状态的作业(进程组)。有则返回1;无则返回0。 // ���ҷ�����ɨ�������������顣�������ָ����pgrp���κν����Ƿ���ֹͣ״̬�� // 查找方法是扫描整个任务数组。检查属于指定组pgrp的任何进程是否处于停止状态。 249 static int has_stopped_jobs(int
@@ -3105,13 +3105,13 @@ lang=EN-US> } 261 // �����˳�����������������365�д���ϵͳ���ô�������sys_exit()���á� // 程序退出处理函数。在下面365行处被系统调用处理函数sys_exit()调用。 // �ú��������ݵ�ǰ�������������Զ�����д��������ѵ�ǰ����״̬���óɽ���״̬ // 该函数将根据当前进程自身的特性对其进行处理,并把当前进程状态设置成僵死状态 // TASK_ZOMBIE�������õ��Ⱥ���schedule()ȥִ���������̣����ٷ��ء� // TASK_ZOMBIE,最后调用调度函数schedule()去执行其它进程,不再返回。 262 volatile void do_exit(long
@@ -3130,28 +3130,28 @@ lang=EN-US> int i; 266 // �����ͷŵ�ǰ���̴���κ����ݶ���ռ���ڴ�ҳ��
-����free_page_tables() �ĵ�1������ // 首先释放当前进程代码段和数据段所占的内存页。
+函数free_page_tables() 的第1个参数 // ��get_base()����ֵ��ָ����CPU���Ե�ַ�ռ�����ʼ����ַ����2����get_limit()����ֵ�� // (get_base()返回值)指明在CPU线性地址空间中起始基地址,第2个(get_limit()返回值) // ˵�����ͷŵ��ֽڳ���ֵ��get_base()���е�current->ldt[1]�������̴������������λ�� // 说明欲释放的字节长度值。get_base()宏中的current->ldt[1]给出进程代码段描述符的位置 // ��current->ldt[2]�������̴������������λ�ã���get_limit()�е�0x0f�ǽ��̴���ε� // (current->ldt[2]给出进程代码段描述符的位置);get_limit()中的0x0f是进程代码段的 // ѡ�����0x17�ǽ������ݶε�ѡ�����������ȡ�λ���ַʱʹ�øöε�������������ַ��Ϊ // 选择符(0x17是进程数据段的选择符)。即在取段基地址时使用该段的描述符所处地址作为 // ������ȡ�γ���ʱʹ�øöε�ѡ�����Ϊ������ free_page_tables()����λ��mm/memory.c // 参数,取段长度时使用该段的选择符作为参数。 free_page_tables()函数位于mm/memory.c // �ļ��ĵ�69�п�ʼ����get_base()��get_limit()��λ��include/linux/sched.hͷ�ļ��ĵ� // 文件的第69行开始处;get_base()和get_limit()宏位于include/linux/sched.h头文件的第 // 264�п�ʼ���� // 264行开始处。 267 free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); // Ȼ��رյ�ǰ���̴��ŵ������ļ����ٶԵ�ǰ���̵Ĺ���Ŀ¼pwd����Ŀ¼root��ִ�г��� // 然后关闭当前进程打开着的所有文件。再对当前进程的工作目录pwd、根目录root、执行程序 // �ļ��� i�ڵ��Լ����ļ�����ͬ���������Żظ���
-i�ڵ㲢�ֱ��ÿգ��ͷţ��� ���Űѵ�ǰ // 文件的 i节点以及库文件进行同步操作,放回各个
+i节点并分别置空(释放)。 接着把当前 // ���̵�״̬����Ϊ����״̬��TASK_ZOMBIE���������ý����˳��롣 // 进程的状态设置为僵死状态(TASK_ZOMBIE),并设置进程退出码。 269 for (i=0 ; i< */
/*
-* ��鵱ǰ���̵��˳��Ƿ������κν������ɹ¶������顣���
-* �У������д���ֹͣ״̬��TASK_STOPPED������Ա���������Ƿ���
- * һ��SIGHUP�źź�һ��SIGCONT�źš���POSIX 3.2.2.2��Ҫ��
*
-* ���1�����ǵĸ�����������һ�������Dz�ͬ�Ľ������У���������
-* ������������Ψһ��ϵ���������ǵĽ����齫���һ���¶������顣
*/ // POSIX 3.2.2.2��1991�棩�ǹ���exit()������˵����������������ڵĽ������뵱ǰ���̵� // POSIX 3.2.2.2(1991版)是关于exit()函数的说明。如果父进程所在的进程组与当前进程的 // ��ͬ����������ͬһ���Ự��session���У����ҵ�ǰ�������ڽ����齫Ҫ��ɹ¶������˲��� // 不同,但都处于同一个会话(session)中,并且当前进程所在进程组将要变成孤儿进程了并且 // ��ǰ���̵Ľ������к��д���ֹͣ״̬����ҵ�����̣�����ô��Ҫ�������ǰ���̵Ľ����鷢 // 当前进程的进程组中含有处于停止状态的作业(进程),那么就要向这个当前进程的进程组发 // �������źţ�SIGHUP��SIGCONT�������������źŵ�ԭ���232��ǰ��˵���� // 送两个信号:SIGHUP和SIGCONT。发送这两个信号的原因见232行前的说明。 291 if (( } 298 /* Let father
-know we died */ /* ֪ͨ�����̵�ǰ���̽���ֹ /* 通知父进程当前进程将终止 */ 299 */
/* *
-�����ѭ�������������飺
*
-* A. ��init���̼̳е�ǰ���������ӽ��̡�
-* B. ��鵱ǰ���̵��˳��Ƿ������κν������ɹ¶������顣���
-* �У������д���ֹͣ״̬��TASK_STOPPED������Ա���������Ƿ���
-* һ��SIGHUP�źź�һ��SIGCONT�źš���POSIX 3.2.2.2��Ҫ��
*/ // �����ǰ�������ӽ��̣���p_cptrָ��ָ������������ӽ��̣������ý���1��init���̣� // 如果当前进程有子进程(其p_cptr指针指向最近创建的子进程),则让进程1(init进程) // ��Ϊ�������ӽ��̵ĸ����̡�����ӽ����Ѿ����ڽ���״̬������init���̣������̣����� // 成为其所有子进程的父进程。如果子进程已经处于僵死状态,则向init进程(父进程)发送 // �ӽ�������ֹ�ź�SIGCHLD�� // 子进程已终止信号SIGCHLD。 309 if (p =
-/* �¶��������⡣
-* ���2�����ǵ��ӽ����ڲ�ͬ�Ľ������У���������
-* ������Ψһ���������ӡ���������ӽ������ڽ���
-* �齫��ɹ¶��������ˡ�
*/ // ����ӽ����뵱ǰ���̲���ͬһ���������е�����ͬһ��session�У����ҵ�ǰ�������ڽ��� // 如果子进程与当前进程不在同一个进程组中但属于同一个session中,并且当前进程所在进程 // �齫Ҫ��ɹ¶������ˣ����ҵ�ǰ���̵Ľ������к��д���ֹͣ״̬����ҵ�����̣�����ô�� // 组将要变成孤儿进程了,并且当前进程的进程组中含有处于停止状态的作业(进程),那么就 // Ҫ�������ǰ���̵Ľ����鷢�������źţ�SIGHUP��SIGCONT��
-������ӽ������ֵܽ��̣� // 要向这个当前进程的进程组发送两个信号:SIGHUP和SIGCONT。
+如果该子进程有兄弟进程, // �����ѭ��������Щ�ֵܽ��̡� // 则继续循环处理这些兄弟进程。 320
@@ -3542,28 +3542,28 @@ lang=EN-US> &n
/*
-* ���������������ӽ������ӳ�Ϊinit���ӽ��̲��˳�ѭ����
*/ // ͨ�����洦������ǰ�����ӽ��̵������ֵ��ӽ��̶��Ѿ�����������ʱpָ�����ϵ��ֵ��� // 通过上面处理,当前进程子进程的所有兄弟子进程都已经处理过。此时p指向最老的兄弟子 // ���̡����ǰ���Щ�ֵ��ӽ���ȫ������init���̵��ӽ���˫������ͷ���С������init // 进程。于是把这些兄弟子进程全部加入init进程的子进程双向链表头部中。加入后,init // ���̵�p_cptr
-ָ��ǰ����ԭ�ӽ�����������ģ�the youngest���ӽ��̣���ԭ�ӽ����� // 进程的p_cptr
+指向当前进程原子进程中最年轻的(the youngest)子进程,而原子进程中 // ���ϵģ�the
-oldest���ֵ��ӽ��� p_osptr ָ��ԭ init���̵���������̣���ԭinit�� // 最老的(the
+oldest)兄弟子进程 p_osptr 指向原 init进程的最年轻进程,而原init进 // ������������̵� p_ysptrָ��ԭ�ӽ��������ϵ��ֵ��ӽ��̡����ѵ�ǰ���̵�p_cptr // 程中最年轻进程的 p_ysptr指向原子进程中最老的兄弟子进程。最后把当前进程的p_cptr // ָ���ÿգ����˳�ѭ���� // 指针置空,并退出循环。 335
@@ -3593,13 +3593,13 @@ lang=EN-US> &nb
341 } // �����ǰ�����ǻỰͷ��(leader)���̣���ô�����п����նˣ���������ʹ�øÿ����ն˵� // 如果当前进程是会话头领(leader)进程,那么若它有控制终端,则首先向使用该控制终端的 // �����鷢�Ҷ��ź�SIGHUP��Ȼ���ͷŸ��նˡ�����ɨ���������飬�����ڵ�ǰ���̻Ự�� // 进程组发送挂断信号SIGHUP,然后释放该终端。接着扫描任务数组,把属于当前进程会话中 // ���̵��ն��ÿգ�ȡ������ // 进程的终端置空(取消)。 342 if ( &nb
356 } // �����ǰ�����ϴ�ʹ�ù�Э����������Ѽ�¼����Ϣ��ָ���ÿա��������˵��Խ��������ţ� // 如果当前进程上次使用过协处理器,则把记录此信息的指针置空。若定义了调试进程树符号, // ����ý����������ʾ�����������õ��Ⱥ��������µ��Ƚ������У����ø������ܹ����� // 则调用进程树检测显示函数。最后调用调度函数,重新调度进程运行,以让父进程能够处理 // �������̵������ƺ����ˡ� // 僵死进程的其它善后事宜。 357 if ( } 364 // ϵͳ����exit()����ֹ���̡� // 系统调用exit()。终止进程。 // ����error_code���û������ṩ���˳�״̬��Ϣ��ֻ�е��ֽ���Ч����error_code����8 // 参数error_code是用户程序提供的退出状态信息,只有低字节有效。把error_code左移8 // ������
-wait() �� waitpid()������Ҫ���ֽ��н���������wait()��״̬��Ϣ�����磬 // 比特是
+wait() 或 waitpid()函数的要求。低字节中将用来保存wait()的状态信息。例如, // ������̴�����ͣ״̬��TASK_STOPPED������ô����ֽھ͵��� 0x7f���μ� // 如果进程处于暂停状态(TASK_STOPPED),那么其低字节就等于 0x7f。参见 sys/wait.h // �ļ���13--19�С�
-wait() ��waitpid() ������Щ��Ϳ���ȡ���ӽ��̵��˳�״̬����� // 文件第13--19行。
+wait() 或waitpid() 利用这些宏就可以取得子进程的退出状态码或子 // ������ֹ��ԭ���źţ��� // 进程终止的原因(信号)。 365 int sys_exit(int error_code) 369 // ϵͳ����waitpid()������ǰ���̣�ֱ��pid ָ�����ӽ����˳�����ֹ�������յ�Ҫ����ֹ // 系统调用waitpid()。挂起当前进程,直到pid 指定的子进程退出(终止)或者收到要求终止 // �ý��̵��źţ���������Ҫ����һ���źž�����źŴ����������pid��ָ���ӽ������� // 该进程的信号,或者是需要调用一个信号句柄(信号处理程序)。如果pid所指的子进程早已 // �˳����ѳ���ν�Ľ������̣������ý����̷��ء��ӽ���ʹ�õ�������Դ���ͷš� // 退出(已成所谓的僵死进程),则本调用将立刻返回。子进程使用的所有资源将释放。 // ���pid
-> 0����ʾ�ȴ����̺ŵ���pid���ӽ��̡� // 如果pid
+> 0,表示等待进程号等于pid的子进程。 // ���pid
-= 0����ʾ�ȴ�������ŵ��ڵ�ǰ������ŵ��κ��ӽ��̡� // 如果pid
+= 0,表示等待进程组号等于当前进程组号的任何子进程。 // ���pid
-< -1����ʾ�ȴ�������ŵ���pid����ֵ���κ��ӽ��̡� // 如果pid
+< -1,表示等待进程组号等于pid绝对值的任何子进程。 // ���pid
-= -1����ʾ�ȴ��κ��ӽ��̡� // 如果pid
+= -1,表示等待任何子进程。 // ��options
-= WUNTRACED����ʾ����ӽ�����ֹͣ�ģ�Ҳ���Ϸ��أ�������٣��� // 若options
+= WUNTRACED,表示如果子进程是停止的,也马上返回(无须跟踪)。 // ��options
-= WNOHANG����ʾ���û���ӽ����˳�����ֹ�����Ϸ��ء� // 若options
+= WNOHANG,表示如果没有子进程退出或终止就马上返回。 // �������״ָ̬��stat_addr��Ϊ�գ���ͽ�״̬��Ϣ���浽��� // 如果返回状态指针stat_addr不为空,则就将状态信息保存到那里。 // ����pid�ǽ��̺ţ�*stat_addr�DZ���״̬��Ϣλ�õ�ָ�룻options��waitpidѡ� // 参数pid是进程号;*stat_addr是保存状态信息位置的指针;options是waitpid选项。 370 int sys_waitpid( { 372 int flag;
-// �ñ�־���ں����ʾ��ѡ�����ӽ��̴��ھ�����˯��̬�� 373 struct 375 // ������֤��Ҫ���״̬��Ϣ��λ�ô��ڴ�ռ��㹻��Ȼ��λ��־flag�����Ŵӵ�ǰ���̵��� // 首先验证将要存放状态信息的位置处内存空间足够。然后复位标志flag。接着从当前进程的最 // �����ӽ��̿�ʼɨ���ӽ����ֵ������� // 年轻子进程开始扫描子进程兄弟链表。 376 flag=0; // ����ȴ����ӽ��̺�pid>0�����뱻ɨ���ӽ���p��pid����ȣ�˵�����ǵ�ǰ����������� // 如果等待的子进程号pid>0,但与被扫描子进程p的pid不相等,说明它是当前进程另外的子 // ���̣����������ý��̣�����ɨ����һ�����̡� // 进程,于是跳过该进程,接着扫描下一个进程。 380
@@ -3824,11 +3824,11 @@ if (p->pid != pid) // �������ָ���ȴ����̵�pid=0����ʾ���ڵȴ�������ŵ��ڵ�ǰ������ŵ��κ��ӽ��̡� // 否则,如果指定等待进程的pid=0,表示正在等待进程组号等于当前进程组号的任何子进程。 // �����ʱ��ɨ�����p�Ľ�������뵱ǰ���̵���Ų��ȣ��������� // 如果此时被扫描进程p的进程组号与当前进程的组号不等,则跳过。 383
@@ -3842,11 +3842,11 @@ if (p->pgrp != current->pgrp)
continue; // �������ָ����pid < -1����ʾ���ڵȴ�������ŵ���pid����ֵ���κ��ӽ��̡������ʱ // 否则,如果指定的pid < -1,表示正在等待进程组号等于pid绝对值的任何子进程。如果此时 // ��ɨ�����p�������pid�ľ���ֵ���ȣ��������� // 被扫描进程p的组号与pid的绝对值不等,则跳过。 386
@@ -3864,33 +3864,33 @@ continue; // ���ǰ3����pid���ж϶������ϣ����ʾ��ǰ�������ڵȴ����κ��ӽ��̣�Ҳ��pid = -1 // 如果前3个对pid的判断都不符合,则表示当前进程正在等待其任何子进程,也即pid = -1 // ���������ʱ��ѡ�Ľ��� p ����������̺ŵ���ָ�� pid�������ǵ�ǰ�������е��κ� // 的情况。此时所选择到的进程 p 或者是其进程号等于指定 pid,或者是当前进程组中的任何 // �ӽ��̣������ǽ��̺ŵ���ָ�� pid ����ֵ���ӽ��̣��������κ��ӽ��̣���ʱָ���� pid // 子进程,或者是进程号等于指定 pid 绝对值的子进程,或者是任何子进程(此时指定的 pid // ���� -1������������������ӽ���p������״̬�������� // 等于 -1)。接下来根据这个子进程p所处的状态来处理。 // ���ӽ���p
-����ֹͣ״̬ʱ�������ʱ����ѡ��options��WUNTRACED
-��־û����λ����ʾ // 当子进程p
+处于停止状态时,如果此时参数选项options中WUNTRACED
+标志没有置位,表示 // �����������̷��أ������ӽ��̴�ʱ���˳������ 0�����Ǽ���ɨ�账�������ӽ��̡� ��� // 程序无须立刻返回,或者子进程此时的退出码等于 0,于是继续扫描处理其他子进程。 如果 // WUNTRACED��λ���ӽ����˳��벻Ϊ0������˳���������ֽڣ�����״̬��Ϣ 0x7f ����� // WUNTRACED置位且子进程退出码不为0,则把退出码移入高字节,或上状态信息 0x7f 后放入 // *stat_addr���ڸ�λ�ӽ����˳��������̷����ӽ��̺�pid������0x7f ��ʾ�ķ���״̬ʹ // *stat_addr,在复位子进程退出码后就立刻返回子进程号pid。这里0x7f 表示的返回状态使 // WIFSTOPPED()��Ϊ�档�μ�include/sys/wait.h��14�С� // WIFSTOPPED()宏为真。参见include/sys/wait.h,14行。 390
@@ -3928,15 +3928,15 @@ lang=EN-US> &nb
lang=EN-US>
return p->pid; // ����ӽ���p���ڽ���״̬�������Ȱ������û�̬���ں�̬���е�ʱ��ֱ��ۼƵ���ǰ���� // 如果子进程p处于僵死状态,则首先把它在用户态和内核态运行的时间分别累计到当前进程 // �������̣��У�Ȼ��ȡ���ӽ��̵�pid���˳��룬���˳�����뷵��״̬λ��stat_addr�� // (父进程)中,然后取出子进程的pid和退出码,把退出码放入返回状态位置stat_addr处 // ���ͷŸ��ӽ��̡�����ӽ��̵��˳����pid�� �������˵��Խ��������ţ�����ý��� // 并释放该子进程。最后返回子进程的退出码和pid。 若定义了调试进程树符号,则调用进程 // �������ʾ������ // 树检测显示函数。 399
@@ -3979,10 +3979,10 @@ lang=EN-US> #endif // �������ӽ���p��״̬�Ȳ���ֹͣҲ���ǽ�������ô����flag = 1����ʾ�ҵ���һ������ // 如果这个子进程p的状态既不是停止也不是僵死,那么就置flag = 1。表示找到过一个符合 // Ҫ����ӽ��̣���������������̬��˯��̬�� // 要求的子进程,但是它处于运行态或睡眠态。 409
@@ -4003,23 +4003,23 @@ lang=EN-US> &nb
413 } // ���������������ɨ���������� flag����λ��˵���з��ϵȴ�Ҫ����ӽ��̲�û�д� // 在上面对任务数组扫描结束后,如果 flag被置位,说明有符合等待要求的子进程并没有处 // ���˳�����״̬����ʱ���������WNOHANGѡ���ʾ��û���ӽ��̴����˳�����ֹ̬�� // 于退出或僵死状态。此时如果已设置WNOHANG选项(表示若没有子进程处于退出或终止态就 // ���̷��أ��������̷���0���˳�������ѵ�ǰ������Ϊ���жϵȴ�״̬������������ // 立刻返回),就立刻返回0,退出。否则把当前进程置为可中断等待状态并,保留并修改 // ��ǰ�����ź�����λͼ����������յ�SIGCHLD�źš�Ȼ��ִ�е��ȳ���ϵͳ�ֿ�ʼ // 当前进程信号阻塞位图,允许其接收到SIGCHLD信号。然后执行调度程序。当系统又开始 // ִ�б�����ʱ������������յ���SIGCHLD���������δ�����źţ������˳��롰������ // 执行本进程时,如果本进程收到除SIGCHLD以外的其他未屏蔽信号,则以退出码“重新启 // ��ϵͳ���á����ء�������ת��������ʼ��repeat��Ŵ��ظ������� // 动系统调用”返回。否则跳转到函数开始处repeat标号处重复处理。 414 if (flag) { 426 } // ��flag
-= 0����ʾû���ҵ�����Ҫ����ӽ��̣��س����루�ӽ��̲����ڣ��� // 若flag
+= 0,表示没有找到符合要求的子进程,则返回出错码(子进程不存在)。 427 return -
-
* 'fork.c'�к���ϵͳ����'fork'�ĸ����ӳ��μ�system_call.s�����Լ�һЩ * 'fork.c'中含有系统调用'fork'的辅助子程序(参见system_call.s),以及一些 * ����������'verify_area'����һ�����˽���fork���ͻᷢ�����Ƿdz��ģ��� * 其他函数('verify_area')。一旦你了解了fork,就会发现它是非常简单的,但 * �ڴ����ȴ��Щ�Ѷȡ��μ�'mm/memory.c'�е�'copy_page_tables()'������ * 内存管理却有些难度。参见'mm/memory.c'中的'copy_page_tables()'函数。 */ 13
-#include <errno.h> // �����ͷ�ļ�������ϵͳ�и��ֳ����š� 14 15
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct������0�����ݡ� 16
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 17
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 18
-#include <asm/system.h> // ϵͳͷ�ļ������������û���������/�ж��ŵȵ�Ƕ��ʽ���ꡣ 19 // дҳ����֤����ҳ�治��д������ҳ�档������mm/memory.c ��261�п�ʼ�� // 写页面验证。若页面不可写,则复制页面。定义在mm/memory.c 第261行开始。 20
extern void write_verify(unsigned long
@@ -1909,42 +1909,42 @@ address); 22
long last_pid=0;
-// ���½��̺ţ���ֵ����get_empty_process()���ɡ� 23 //// ���̿ռ�����дǰ��֤������ //// 进程空间区域写前验证函数。 // ����80386
-CPU����ִ����Ȩ��0����ʱ���������û��ռ��е�ҳ���Ƿ���ҳ�����ģ���� // 对于80386
+CPU,在执行特权级0代码时不会理会用户空间中的页面是否是页保护的,因此 // ��ִ���ں˴���ʱ�û��ռ�������ҳ�汣����־�������ã�дʱ���ƻ���Ҳ��ʧȥ�����á� // 在执行内核代码时用户空间中数据页面保护标志起不了作用,写时复制机制也就失去了作用。 // verify_area()���������ڴ�Ŀ�ġ�������80486�������CPU������ƼĴ���CR0����һ�� // verify_area()函数就用于此目的。但对于80486或后来的CPU,其控制寄存器CR0中有一个 // д������־WP��λ16�����ں˿���ͨ�����øñ�־����ֹ��Ȩ��0�Ĵ������û��ռ�ֻ�� // 写保护标志WP(位16),内核可以通过设置该标志来禁止特权级0的代码向用户空间只读 // ҳ��ִ��д���ݣ������·���д�����쳣���Ӷ�486����CPU����ͨ�����øñ�־���� // 页面执行写数据,否则将导致发生写保护异常。从而486以上CPU可以通过设置该标志来达 // ��ʹ�ñ�����ͬ����Ŀ�ġ� // 到使用本函数同样的目的。 // �ú����Ե�ǰ��������ַ�� addr �� addr + size ��һ�η�Χ��ҳΪ��λִ��д����ǰ // 该函数对当前进程逻辑地址从 addr 到 addr + size 这一段范围以页为单位执行写操作前 // �ļ����������ڼ���ж�����ҳ��Ϊ��λ���в�������˳���������Ҫ�ҳ�addr����ҳ // 的检测操作。由于检测判断是以页面为单位进行操作,因此程序首先需要找出addr所在页 // �濪ʼ��ַstart��Ȼ��
-start���Ͻ������ݶλ�ַ��ʹ���start�任��CPU 4G���Կ� // 面开始地址start,然后
+start加上进程数据段基址,使这个start变换成CPU 4G线性空 // ���еĵ�ַ�����ѭ������write_verify() ��ָ����С���ڴ�ռ����дǰ��֤����ҳ�� // 间中的地址。最后循环调用write_verify() 对指定大小的内存空间进行写前验证。若页面 // ��ֻ���ģ���ִ�й����������ҳ�������дʱ���ƣ��� // 是只读的,则执行共享检验和复制页面操作(写时复制)。 24 void verify_area(void *
@@ -1957,19 +1957,19 @@ unsigned long start; 27 // ���Ƚ���ʼ��ַstart����Ϊ������ҳ����߽翪ʼλ�ã�ͬʱ��Ӧ�ص�����֤�����С�� // 首先将起始地址start调整为其所在页的左边界开始位置,同时相应地调整验证区域大小。 // �¾��е� start
-& 0xfff �������ָ����ʼλ��addr��Ҳ��start��������ҳ���е�ƫ�� // 下句中的 start
+& 0xfff 用来获得指定起始位置addr(也即start)在所在页面中的偏移 // ֵ��ԭ��֤��Χ size �������ƫ��ֵ����չ���� addr ����ҳ����ʼλ�ÿ�ʼ�ķ�Χֵ�� // 值,原验证范围 size 加上这个偏移值即扩展成以 addr 所在页面起始位置开始的范围值。 // �����
-30���� Ҳ��Ҫ����֤��ʼλ�� start ������ҳ��߽�ֵ���μ�ǰ���ͼ���ڴ��� // 因此在
+30行上 也需要把验证开始位置 start 调整成页面边界值。参见前面的图“内存验 // ֤��Χ�ĵ������� // 证范围的调整”。 28
start = (unsigned long) addr; 30
start &= 0xfffff000;
-// ��ʱstart�ǵ�ǰ���̿ռ��е�����ַ�� // ����� start
-���Ͻ������ݶ������Ե�ַ�ռ��е���ʼ��ַ�����ϵͳ�������Կռ��еĵ� // 下面把 start
+加上进程数据段在线性地址空间中的起始基址,变成系统整个线性空间中的地 // ַλ�á�����Linux 0.1x�ںˣ������ݶκʹ���������Ե�ַ�ռ��еĻ�ַ��������ͬ�� // 址位置。对于Linux 0.1x内核,其数据段和代码段在线性地址空间中的基址和限长均相同。 // Ȼ��ѭ������дҳ����֤����ҳ�治��д������ҳ�档��mm/memory.c��274�У� // 然后循环进行写页面验证。若页面不可写,则复制页面。(mm/memory.c,274行) 31
start += get_base(current->ldt[2]); //
-include/linux/sched.h��277�� 32
while (size>0) { 38 // �����ڴ�ҳ���� // 复制内存页表。 // ����nr��������ţ�p�����������ݽṹָ�롣�ú���Ϊ�����������Ե�ַ�ռ������ô��� // 参数nr是新任务号;p是新任务数据结构指针。该函数为新任务在线性地址空间中设置代码 // �κ����ݶλ�ַ������������ҳ���� ����Linuxϵͳ������дʱ���ƣ�copy on write�� // 段和数据段基址、限长,并复制页表。 由于Linux系统采用了写时复制(copy on write) // ������ ��������Ϊ�½��������Լ���ҳĿ¼�����ҳ�����û��ʵ��Ϊ�½��̷������� // 技术, 因此这里仅为新进程设置自己的页目录表项和页表项,而没有实际为新进程分配物理 // �ڴ�ҳ�档��ʱ�½������丸���̹��������ڴ�ҳ�档�����ɹ�����0�����س����š� // 内存页面。此时新进程与其父进程共享所有内存页面。操作成功返回0,否则返回出错号。 39 int
copy_mem(int nr,struct 43 // ����ȡ��ǰ���ֲ̾����������д���������������ݶ����������еĶ������ֽ������� // 首先取当前进程局部描述符表中代码段描述符和数据段描述符项中的段限长(字节数)。 // 0x0f�Ǵ����ѡ�����0x17�����ݶ�ѡ�����Ȼ��ȡ��ǰ���̴���κ����ݶ������Ե�ַ // 0x0f是代码段选择符;0x17是数据段选择符。然后取当前进程代码段和数据段在线性地址 // �ռ��еĻ���ַ������Linux 0.12�ں˻���֧�ִ�������ݶη�������������������Ҫ // 空间中的基地址。由于Linux 0.12内核还不支持代码和数据段分立的情况,因此这里需要 // ������κ����ݶλ�ַ�Ƿ���ͬ������Ҫ�����ݶεij������ٲ�С�ڴ���εij��� // 检查代码段和数据段基址是否都相同,并且要求数据段的长度至少不小于代码段的长度 // ���μ�ͼ5-12���������ں���ʾ������Ϣ����ֹͣ���С� // (参见图5-12),否则内核显示出错信息,并停止运行。 // get_limit()��get_base()������include/linux/sched.h��277�к�279�д��� // get_limit()和get_base()定义在include/linux/sched.h第277行和279行处。 44
code_limit=get_limit(0x0f); 51
panic("Bad data_limit"); // Ȼ�����ô����е��½��������Ե�ַ�ռ��еĻ���ַ���ڣ�64MB * ������ţ������ø�ֵ // 然后设置创建中的新进程在线性地址空间中的基地址等于(64MB * 其任务号),并用该值 // �����½��ֲ̾����������ж��������еĻ���ַ�����������½��̵�ҳĿ¼�����ҳ��� // 设置新进程局部描述符表中段描述符中的基地址。接着设置新进程的页目录表项和页表项, // �����Ƶ�ǰ���̣������̣���ҳĿ¼�����ҳ���
-��ʱ�ӽ��̹��������̵��ڴ�ҳ�档 // 即复制当前进程(父进程)的页目录表项和页表项。
+此时子进程共享父进程的内存页面。 // ���������copy_page_tables()����0�������ʾ���������ͷŸ������ҳ��� // 正常情况下copy_page_tables()返回0,否则表示出错,则释放刚申请的页表项。 52
new_data_base = new_code_base = nr * TASK_SIZE; /* * OK����������Ҫ��fork�ӳ���������ϵͳ������Ϣ(task[n]) * OK,下面是主要的fork子程序。它复制系统进程信息(task[n]) * �������ñ�Ҫ�ļĴ��������������ظ������ݶΣ�Ҳ�Ǵ���Σ��� * 并且设置必要的寄存器。它还整个地复制数据段(也是代码段)。 */ // ���ƽ��̡� // 复制进程。 // �ú����IJ����ǽ���ϵͳ�����жϴ������̣�sys_call.s����ʼ��ֱ�����ñ�ϵͳ���ô��� // 该函数的参数是进入系统调用中断处理过程(sys_call.s)开始,直到调用本系统调用处理 // ���̣�sys_call.s��208�У��͵��ñ�����ǰ��sys_call.s��217�У���ѹ������ں� // 过程(sys_call.s第208行)和调用本函数前(sys_call.s第217行)逐步压入进程内核 // ̬ջ�ĸ��Ĵ�����ֵ����Щ��sys_call.s��������ѹ���ں�̬ջ��ֵ������������: // 态栈的各寄存器的值。这些在sys_call.s程序中逐步压入内核态栈的值(参数)包括: // �� CPUִ���ж�ָ��ѹ����û�ջ��ַss��esp����־eflags�ͷ��ص�ַcs��eip�� // ① CPU执行中断指令压入的用户栈地址ss和esp、标志eflags和返回地址cs和eip; // �� ��83--88���ڸս���system_callʱ��ջ�ĶμĴ���ds��es��fs��edx��ecx��edx�� // ② 第83--88行在刚进入system_call时入栈的段寄存器ds、es、fs和edx、ecx、edx; // �� ��94�е���sys_call_table��sys_fork����ʱ��ջ�ķ��ص�ַ������none��ʾ���� // ③ 第94行调用sys_call_table中sys_fork函数时入栈的返回地址(参数none表示); // �� ��212--216���ڵ���copy_process()֮ǰ��ջ��gs��esi��edi��ebp��eax��nr���� // ④ 第212--216行在调用copy_process()之前入栈的gs、esi、edi、ebp和eax(nr)。 // ���в���nr�ǵ���find_empty_process()���������������š� // 其中参数nr是调用find_empty_process()分配的任务数组项号。 68 int
copy_process(int nr,long ebp,long
@@ -2209,13 +2209,13 @@ struct file *f; 76 // ����Ϊ���������ݽṹ�����ڴ档����ڴ����������س����벢�˳���Ȼ�������� // 首先为新任务数据结构分配内存。如果内存分配出错,则返回出错码并退出。然后将新任务 // �ṹָ��������������nr���С�����nrΪ����ţ���ǰ��find_empty_process()���ء� // 结构指针放入任务数组的nr项中。其中nr为任务号,由前面find_empty_process()返回。 // ���Űѵ�ǰ��������ṹ���ݸ��Ƶ������뵽���ڴ�ҳ��p��ʼ���� // 接着把当前进程任务结构内容复制到刚申请到的内存页面p开始处。 77
p = (struct task_struct *)
-/* ע�⣡���������Ḵ�Ƴ����û���ջ��ֻ���ƽ��̽ṹ��*/ // ���Ը������Ľ��̽ṹ���ݽ���һЩ�ģ���Ϊ�½��̵�����ṹ���Ƚ��½��̵�״̬ // 随后对复制来的进程结构内容进行一些修改,作为新进程的任务结构。先将新进程的状态 // ��Ϊ�����жϵȴ�״̬���Է�ֹ�ں˵�����ִ�С�Ȼ�������½��̵Ľ��̺�pid������ʼ // 置为不可中断等待状态,以防止内核调度其执行。然后设置新进程的进程号pid,并初始 // ����������ʱ��Ƭֵ������ priorityֵ�� һ��Ϊ15����ણ������Ÿ�λ�½��̵��ź� // 化进程运行时间片值等于其 priority值( 一般为15个嘀嗒)。接着复位新进程的信号 // λͼ��������ʱֵ���Ự��session���쵼��־ leader�� ���̼����ӽ������ں˺��û� // 位图、报警定时值、会话(session)领导标志 leader、 进程及其子进程在内核和用户 // ̬����ʱ��ͳ��ֵ�������ý��̿�ʼ���е�ϵͳʱ��start_time�� // 态运行时间统计值,还设置进程开始运行的系统时间start_time。 82
p->state = TASK_UNINTERRUPTIBLE; 83
p->pid = last_pid;
-// �½��̺š�Ҳ��find_empty_process()�õ��� 84
-p->counter = p->priority; // ����ʱ��Ƭֵ����������� 85
p->signal = 0;
-// �ź�λͼ�� 86
p->alarm = 0;
-// ������ʱֵ����������� 87
p->leader = 0; /*
process leadership doesn't inherit */
- /* ���̵��쵼Ȩ�Dz��ܼ̳е� */ 88
p->utime = p->stime = 0; // �û�̬ʱ��ͺ���̬����ʱ�䡣 89
-p->cutime = p->cstime = 0; // �ӽ����û�̬�ͺ���̬����ʱ�䡣 90
p->start_time = jiffies; //
-���̿�ʼ����ʱ�䣨��ǰʱ��δ������� // ��������״̬��TSS ���ݣ��μ��б���˵����������ϵͳ������ṹ p������1ҳ�� // 再修改任务状态段TSS 数据(参见列表后说明)。由于系统给任务结构 p分配了1页新 // �ڴ棬����
-(PAGE_SIZE + (long) p) ��esp0����ָ���ҳ���ˡ� ss0:esp0 �������� // 内存,所以
+(PAGE_SIZE + (long) p) 让esp0正好指向该页顶端。 ss0:esp0 用作程序 // ���ں�ִ̬��ʱ��ջ�����⣬�ڵ�3���������Ѿ�֪����ÿ�������� GDT���ж������� // 在内核态执行时的栈。另外,在第3章中我们已经知道,每个任务在 GDT表中都有两个 // ����������һ���������TSS������������һ���������LDT����������������111�� // 段描述符,一个是任务的TSS段描述符,另一个是任务的LDT表段描述符。下面111行 // �����ǰ�GDT�б�����LDT����������ѡ��������ڱ������TSS���С���CPUִ�� // 语句就是把GDT中本任务LDT段描述符的选择符保存在本任务的TSS段中。当CPU执行 // �л�����ʱ�����Զ���TSS�а�LDT����������ѡ������ص�ldtr�Ĵ����С� // 切换任务时,会自动从TSS中把LDT段描述符的选择符加载到ldtr寄存器中。 91
p->tss.back_link = 0; 92
p->tss.esp0 = PAGE_SIZE + (long) p;
-// �����ں�̬ջָ�롣 93
p->tss.ss0 = 0x10;
-// �ں�̬ջ�Ķ�ѡ��������ں����ݶ���ͬ���� 94
p->tss.eip = eip;
-// ָ�����ָ�롣 95
-p->tss.eflags = eflags; // ��־�Ĵ����� 96
p->tss.eax = 0;
-// ���ǵ�fork()����ʱ�½��̻᷵��0��ԭ�����ڡ� 97
p->tss.ecx = ecx; 104 p->tss.es = es
-& 0xffff; // �μĴ�����16λ��Ч�� 105 p->tss.cs = cs
@@ -2384,34 +2384,34 @@ lang=EN-US> p->tss.gs = gs
110 p->tss.ldt = _LDT(nr); // ����ֲ�����������ѡ�����LDT��������GDT�У��� 111
-p->tss.trace_bitmap = 0x80000000; //����16λ��Ч���� // �����ǰ����ʹ����Э���������ͱ����������ġ����ָ��clts����������ƼĴ���CR0 // 如果当前任务使用了协处理器,就保存其上下文。汇编指令clts用于清除控制寄存器CR0 // �е������ѽ�����TS����־��ÿ�����������л���CPU�������øñ�־���ñ�־���ڹ��� // 中的任务已交换(TS)标志。每当发生任务切换,CPU都会设置该标志。该标志用于管理 // ��ѧЭ������������ñ�־��λ����ôÿ��ESCָ��ᱻ�����쳣7�������Э���� // 数学协处理器:如果该标志置位,那么每个ESC指令都会被捕获(异常7)。如果协处理 // �����ڱ�־MPҲͬʱ��λ�Ļ�����ôWAITָ��Ҳ�Ჶ����ˣ���������л�������һ // 器存在标志MP也同时置位的话,那么WAIT指令也会捕获。因此,如果任务切换发生在一 // ��ESCָ�ʼִ��֮����Э�������е����ݾͿ�����Ҫ��ִ���µ�ESCָ��֮ǰ���� // 个ESC指令开始执行之后,则协处理器中的内容就可能需要在执行新的ESC指令之前保存 // ����������������ᱣ��Э�����������ݲ���λTS��־��ָ��fnsave���ڰ�Э������ // 起来。捕获处理句柄会保存协处理器的内容并复位TS标志。指令fnsave用于把协处理器 // ������״̬���浽Ŀ�IJ�����ָ�����ڴ������У�tss.i387���� // 的所有状态保存到目的操作数指定的内存区域中(tss.i387)。 112 if ("clts ; fnsave %0 ; frstor %0"::"m"
// ���������ƽ���ҳ�����������Ե�ַ�ռ����������������κ����ݶ��������еĻ�ַ // 接下来复制进程页表。即在线性地址空间中设置新任务代码段和数据段描述符中的基址 // ������������ҳ�����������������ֵ����0������λ������������Ӧ��ͷ�Ϊ // 和限长,并复制页表。如果出错(返回值不是0),则复位任务数组中相应项并释放为 // ��������������������ṹ���ڴ�ҳ�� // 该新任务分配的用于任务结构的内存页。 114 if (copy_mem(nr,p)) {
-// ���ز�Ϊ0��ʾ������ 115
@@ -2452,14 +2452,14 @@ return -EAGAIN; 118 } // ��������������ļ��Ǵģ���Ӧ�ļ��Ĵ�����1����Ϊ���ﴴ�����ӽ��� // 如果父进程中有文件是打开的,则将对应文件的打开次数增1。因为这里创建的子进程 // ���븸���̹�����Щ���ļ�������ǰ���̣������̣���pwd, root��executable // 会与父进程共享这些打开的文件。将当前进程(父进程)的pwd, root和executable // ���ô�������1��������ͬ���ĵ������ӽ���Ҳ��������Щi�ڵ㡣 // 引用次数均增1。与上面同样的道理,子进程也引用了这些i节点。 119 for (i=0; i<current->library) // �����GDT��������������TSS�κ�LDT����������������ε����������ó� // 随后在GDT表中设置新任务TSS段和LDT段描述符项。这两个段的限长均被设置成104 // �ֽڡ��μ� include/asm/system.h��52��66 �д��롣 Ȼ�����ý���֮��Ĺ�ϵ���� // 字节。参见 include/asm/system.h,52—66 行代码。 然后设置进程之间的关系链表 // ָ�룬�����½��̲��뵽��ǰ���̵��ӽ��������С����½��̵ĸ���������Ϊ��ǰ���̣� // 指针,即把新进程插入到当前进程的子进程链表中。把新进程的父进程设置为当前进程, // ���½��̵������ӽ���ָ��p_cptr �������ֵܽ���ָ��p_ysptr�ÿա��������½��� // 把新进程的最新子进程指针p_cptr 和年轻兄弟进程指针p_ysptr置空。接着让新进程 // �����ֽ���ָ��p_osptr���õ��ڸ����̵������ӽ���ָ�롣����ǰ����ȴ�ǻ������� // 的老兄进程指针p_osptr设置等于父进程的最新子进程指针。若当前进程却是还有其他 // �ӽ��̣����ñ������ֽ��̵����������ָ��p_yspter ָ���½��̡����ѵ�ǰ���� // 子进程,则让比邻老兄进程的最年轻进程指针p_yspter 指向新进程。最后把当前进程 // �������ӽ���ָ��ָ������½��̡�Ȼ����½������óɾ���̬������½��̺š� // 的最新子进程指针指向这个新进程。然后把新进程设置成就绪态。最后返回新进程号。 // ���⣬
-set_tss_desc() �� set_ldt_desc() ������ include/asm/system.h �ļ��С� // 另外,
+set_tss_desc() 和 set_ldt_desc() 定义在 include/asm/system.h 文件中。 // ��gdt+(nr<<1)+FIRST_TSS_ENTRY��������nr��TSS����������ȫ�ֱ��еĵ�ַ����Ϊ // “gdt+(nr<<1)+FIRST_TSS_ENTRY”是任务nr的TSS描述符项在全局表中的地址。因为 // ÿ������ռ��GDT����2������ʽ��Ҫ����'(nr<<1)'�� // 每个任务占用GDT表中2项,因此上式中要包括'(nr<<1)'。 // ��ע�⣬�������л�ʱ������Ĵ���tr����CPU�Զ����ء� // 请注意,在任务切换时,任务寄存器tr会由CPU自动加载。 130 FIRST_LDT_ENTRY,&(p->ldt)); 132 p->p_pptr = current;
-// �����½��̵ĸ�����ָ�롣 133 p->p_cptr = 0;
-// ��λ�½��̵������ӽ���ָ�롣 134 p->p_ysptr = 0;
-// ��λ�½��̵ı��������ֵܽ���ָ�롣 135 p->p_osptr = current->p_cptr;
-// �����½��̵ı��������ֵܽ���ָ�롣 136 if (p->p_osptr)
-// ���½����������ֵܽ��̣������� 137
-p->p_osptr->p_ysptr = p; // ��������ֵ�ָ��ָ���½��̡� 138 current->p_cptr = p;
-// �õ�ǰ���������ӽ���ָ��ָ���½��̡� 139 p-> } 142 // Ϊ�½���ȡ�ò��ظ��Ľ��̺�last_pid���������������������е������(������)�� // 为新进程取得不重复的进程号last_pid。函数返回在任务数组中的任务号(数组项)。 143 int find_empty_process(void) 146 // ���Ȼ�ȡ�µĽ��̺š����last_pid��1�����̺ŵ�������ʾ��Χ�������´�1��ʼ // 首先获取新的进程号。如果last_pid增1后超出进程号的正数表示范围,则重新从1开始 // ʹ��pid�š�
-Ȼ�����������������������õ�pid���Ƿ��Ѿ����κ�����ʹ�á�������� // 使用pid号。
+然后在任务数组中搜索刚设置的pid号是否已经被任何任务使用。如果是则 // ��ת��������ʼ�����»��һ��pid�š� ����������������Ϊ������Ѱ��һ��������� // 跳转到函数开始处重新获得一个pid号。 接着在任务数组中为新任务寻找一个空闲项,并 // ������š� last_pid��һ��ȫ�ֱ��������÷��ء������ʱ����������64�����Ѿ���ȫ // 返回项号。 last_pid是一个全局变量,不用返回。如果此时任务数组中64个项已经被全 // ��ռ�ã��س����롣 // 部占用,则返回出错码。 147 repeat: 153 for(i=1 ; i<NR_TASKS ; i++)
-// ����0��ų����⡣ 154
diff --git a/Book-Lite/code-list/html/P8-9.html b/Book-Lite/code-list/html/P8-9.html
index 2d3be0f..32b56db 100644
--- a/Book-Lite/code-list/html/P8-9.html
+++ b/Book-Lite/code-list/html/P8-9.html
@@ -11,24 +11,24 @@
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
- {font-family:����;
+ {font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����;
+ {font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:����С���μ���;}
+ {font-family:方正小标宋简体;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
- {font-family:"\@����";
+ {font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
- {font-family:"\@����С���μ���";}
+ {font-family:"\@方正小标宋简体";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
@@ -36,9 +36,9 @@
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
h1
- {mso-style-link:"���� 1 Char";
+ {mso-style-link:"标题 1 Char";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -47,10 +47,10 @@ h1
text-indent:-7.2pt;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
h2
- {mso-style-link:"���� 2 Char";
+ {mso-style-link:"标题 2 Char";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -63,7 +63,7 @@ h2
font-family:"Arial","sans-serif";
font-weight:bold;}
h3
- {mso-style-link:"���� 3 Char";
+ {mso-style-link:"标题 3 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -74,7 +74,7 @@ h3
font-family:"Arial","sans-serif";
font-weight:bold;}
h4
- {mso-style-link:"���� 4 Char";
+ {mso-style-link:"标题 4 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -88,7 +88,7 @@ h4
font-family:"Arial","sans-serif";
font-weight:bold;}
h5
- {mso-style-link:"���� 5 Char";
+ {mso-style-link:"标题 5 Char";
margin-top:14.0pt;
margin-right:0cm;
margin-bottom:14.5pt;
@@ -99,10 +99,10 @@ h5
line-height:156%;
page-break-after:avoid;
font-size:14.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
h6
- {mso-style-link:"���� 6 Char";
+ {mso-style-link:"标题 6 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -116,7 +116,7 @@ h6
font-family:"Arial","sans-serif";
font-weight:bold;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
- {mso-style-link:"���� 7 Char";
+ {mso-style-link:"标题 7 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -127,10 +127,10 @@ p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
- {mso-style-link:"���� 8 Char";
+ {mso-style-link:"标题 8 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -143,7 +143,7 @@ p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
font-size:12.0pt;
font-family:"Arial","sans-serif";}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
- {mso-style-link:"���� 9 Char";
+ {mso-style-link:"标题 9 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
@@ -165,7 +165,7 @@ p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
{margin-top:0cm;
margin-right:0cm;
@@ -176,7 +176,7 @@ p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
{margin-top:0cm;
margin-right:0cm;
@@ -187,7 +187,7 @@ p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
{margin-top:0cm;
margin-right:0cm;
@@ -198,7 +198,7 @@ p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
{margin-top:0cm;
margin-right:0cm;
@@ -209,7 +209,7 @@ p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
{margin-top:0cm;
margin-right:0cm;
@@ -220,7 +220,7 @@ p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
{margin-top:0cm;
margin-right:0cm;
@@ -231,7 +231,7 @@ p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
{margin-top:0cm;
margin-right:0cm;
@@ -242,7 +242,7 @@ p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
{margin-top:0cm;
margin-right:0cm;
@@ -253,14 +253,14 @@ p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoToc2, li.MsoToc2, div.MsoToc2
{margin-top:0cm;
@@ -271,7 +271,7 @@ p.MsoToc2, li.MsoToc2, div.MsoToc2
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc3, li.MsoToc3, div.MsoToc3
{margin-top:0cm;
margin-right:0cm;
@@ -281,7 +281,7 @@ p.MsoToc3, li.MsoToc3, div.MsoToc3
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc4, li.MsoToc4, div.MsoToc4
{margin-top:0cm;
margin-right:0cm;
@@ -289,7 +289,7 @@ p.MsoToc4, li.MsoToc4, div.MsoToc4
margin-left:31.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc5, li.MsoToc5, div.MsoToc5
{margin-top:0cm;
margin-right:0cm;
@@ -297,7 +297,7 @@ p.MsoToc5, li.MsoToc5, div.MsoToc5
margin-left:42.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc6, li.MsoToc6, div.MsoToc6
{margin-top:0cm;
margin-right:0cm;
@@ -305,7 +305,7 @@ p.MsoToc6, li.MsoToc6, div.MsoToc6
margin-left:52.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc7, li.MsoToc7, div.MsoToc7
{margin-top:0cm;
margin-right:0cm;
@@ -313,7 +313,7 @@ p.MsoToc7, li.MsoToc7, div.MsoToc7
margin-left:63.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc8, li.MsoToc8, div.MsoToc8
{margin-top:0cm;
margin-right:0cm;
@@ -321,7 +321,7 @@ p.MsoToc8, li.MsoToc8, div.MsoToc8
margin-left:73.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoToc9, li.MsoToc9, div.MsoToc9
{margin-top:0cm;
margin-right:0cm;
@@ -329,22 +329,22 @@ p.MsoToc9, li.MsoToc9, div.MsoToc9
margin-left:84.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
- {mso-style-link:"��ע�ı� Char";
+ {mso-style-link:"脚注文本 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoHeader, li.MsoHeader, div.MsoHeader
- {mso-style-link:"ҳü Char";
+ {mso-style-link:"页眉 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
@@ -352,22 +352,22 @@ p.MsoHeader, li.MsoHeader, div.MsoHeader
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoFooter, li.MsoFooter, div.MsoFooter
- {mso-style-link:"ҳ�� Char";
+ {mso-style-link:"页脚 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
- {mso-style-name:"��������\,������Ŀ\,������Ŀ1\,������Ŀ2";
+ {mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
@@ -385,7 +385,7 @@ p.MsoTof, li.MsoTof, div.MsoTof
text-justify:inter-ideograph;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.MsoFootnoteReference
{vertical-align:super;}
p.MsoList, li.MsoList, div.MsoList
@@ -397,22 +397,22 @@ p.MsoList, li.MsoList, div.MsoList
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.MsoDate, li.MsoDate, div.MsoDate
- {mso-style-link:"���� Char";
+ {mso-style-link:"日期 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -421,46 +421,46 @@ p.MsoDate, li.MsoDate, div.MsoDate
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
a:link, span.MsoHyperlink
- {mso-style-name:"������\,��������";
+ {mso-style-name:"超链接\,超级链接";
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
- {mso-style-name:"��ͨ\(��վ\)\,��ͨ \(Web\)\,��ͨ \(Web\)1\,��ͨ \(Web\)2\,��ͨ \(Web\)3";
+ {mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3";
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
- font-family:����;}
+ font-family:宋体;}
pre
- {mso-style-name:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- mso-style-link:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
+ {mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
- font-family:����;}
+ font-family:宋体;}
tt
- {font-family:����;}
+ {font-family:黑体;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
- {mso-style-link:"��ע���� Char";
+ {mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
- {mso-style-link:"��ע���ı� Char";
+ {mso-style-link:"批注框文本 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.1, li.1, div.1
- {mso-style-name:��ʽ1;
+ {mso-style-name:样式1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -469,213 +469,213 @@ p.1, li.1, div.1
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a, li.a, div.a
- {mso-style-name:�������;
- mso-style-link:"������� Char";
+ {mso-style-name:代码程序;
+ mso-style-link:"代码程序 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.Char
- {mso-style-name:"������� Char";
- mso-style-link:�������;
- font-family:����;}
+ {mso-style-name:"代码程序 Char";
+ mso-style-link:代码程序;
+ font-family:宋体;}
p.a0, li.a0, div.a0
- {mso-style-name:ͼ˵��;
- mso-style-link:"ͼ˵�� Char";
+ {mso-style-name:图说明;
+ mso-style-link:"图说明 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char0
- {mso-style-name:"ͼ˵�� Char";
- mso-style-link:ͼ˵��;
- font-family:����;}
+ {mso-style-name:"图说明 Char";
+ mso-style-link:图说明;
+ font-family:宋体;}
p.0, li.0, div.0
- {mso-style-name:����0;
+ {mso-style-name:封面0;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.10, li.10, div.10
- {mso-style-name:����1;
+ {mso-style-name:封面1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.11, li.11, div.11
- {mso-style-name:�DZ���1;
+ {mso-style-name:非标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.a1, li.a1, div.a1
- {mso-style-name:�ı�����;
+ {mso-style-name:文本居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharChar, li.3CharChar, div.3CharChar
- {mso-style-name:"ͼ������3 Char Char";
- mso-style-link:"ͼ������3 Char Char Char";
+ {mso-style-name:"图中文字3 Char Char";
+ mso-style-link:"图中文字3 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharCharChar
- {mso-style-name:"ͼ������3 Char Char Char";
- mso-style-link:"ͼ������3 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char";
+ mso-style-link:"图中文字3 Char Char";
+ font-family:宋体;}
p.post, li.post, div.post
- {mso-style-name:�ʼ�post;
+ {mso-style-name:邮件post;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3, li.3, div.3
- {mso-style-name:ͼ������3;
+ {mso-style-name:图中字体3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharChar1CharCharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char Char";
+ font-family:宋体;}
span.3CharChar1CharChar
- {mso-style-name:"ͼ������3 Char Char1 Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char Char";
+ font-family:宋体;}
p.5Char, li.5Char, div.5Char
- {mso-style-name:"ͼ������5�� Char";
- mso-style-link:"ͼ������5�� Char Char";
+ {mso-style-name:"图中文字5号 Char";
+ mso-style-link:"图中文字5号 Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.5CharChar
- {mso-style-name:"ͼ������5�� Char Char";
- mso-style-link:"ͼ������5�� Char";
- font-family:����;}
+ {mso-style-name:"图中文字5号 Char Char";
+ mso-style-link:"图中文字5号 Char";
+ font-family:宋体;}
p.5CharChar0, li.5CharChar0, div.5CharChar0
- {mso-style-name:"ͼ������С5�� Char Char";
- mso-style-link:"ͼ������С5�� Char Char Char";
+ {mso-style-name:"图中文字小5号 Char Char";
+ mso-style-link:"图中文字小5号 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
span.5CharCharChar
- {mso-style-name:"ͼ������С5�� Char Char Char";
- mso-style-link:"ͼ������С5�� Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字小5号 Char Char Char";
+ mso-style-link:"图中文字小5号 Char Char";
+ font-family:宋体;}
p.5Char0, li.5Char0, div.5Char0
- {mso-style-name:"ͼ������С5�� Char";
+ {mso-style-name:"图中文字小5号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5, li.5, div.5
- {mso-style-name:ͼ������С5��;
+ {mso-style-name:图中文字小5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.2, li.2, div.2
- {mso-style-name:�������2;
+ {mso-style-name:代码程序2;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.20, li.20, div.20
- {mso-style-name:ͼ˵��2;
+ {mso-style-name:图说明2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.21, li.21, div.21
- {mso-style-name:�ı�����2;
+ {mso-style-name:文本居中2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharCharCharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char Char Char";
- mso-style-link:"ͼ������3 Char Char Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char Char Char Char Char";
+ mso-style-link:"图中文字3 Char Char Char Char Char";
+ font-family:宋体;}
p.a2, li.a2, div.a2
- {mso-style-name:ͼ����;
+ {mso-style-name:图居中;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.110, li.110, div.110
- {mso-style-name:"��ʽ ���� 1 + ����1";
+ {mso-style-name:"样式 标题 1 + 居中1";
margin-right:0cm;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
span.1Char
- {mso-style-name:"���� 1 Char";
- mso-style-link:"���� 1";
+ {mso-style-name:"标题 1 Char";
+ mso-style-link:"标题 1";
font-weight:bold;}
p.22, li.22, div.22
- {mso-style-name:"��ʽ �б� 2 + ����";
+ {mso-style-name:"样式 列表 2 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.23, li.23, div.23
- {mso-style-name:�б�2;
+ {mso-style-name:列表2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.50, li.50, div.50
- {mso-style-name:ͼ������5��;
+ {mso-style-name:图中文字5号;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.111, li.111, div.111
- {mso-style-name:��ʽ11;
+ {mso-style-name:样式11;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -684,107 +684,107 @@ p.111, li.111, div.111
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.12, li.12, div.12
- {mso-style-name:�������1;
+ {mso-style-name:代码程序1;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.13, li.13, div.13
- {mso-style-name:ͼ˵��1;
+ {mso-style-name:图说明1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.01, li.01, div.01
- {mso-style-name:����01;
+ {mso-style-name:封面01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.112, li.112, div.112
- {mso-style-name:����11;
+ {mso-style-name:封面11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.113, li.113, div.113
- {mso-style-name:�DZ���11;
+ {mso-style-name:非标题11;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.14, li.14, div.14
- {mso-style-name:�ı�����1;
+ {mso-style-name:文本居中1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char1, li.3Char1, div.3Char1
- {mso-style-name:"ͼ������3 Char1";
+ {mso-style-name:"图中文字3 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post1, li.post1, div.post1
- {mso-style-name:�ʼ�post1;
+ {mso-style-name:邮件post1;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.31, li.31, div.31
- {mso-style-name:ͼ������31;
+ {mso-style-name:图中字体31;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char1, li.5Char1, div.5Char1
- {mso-style-name:"ͼ������5�� Char1";
+ {mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5CharChar1, li.5CharChar1, div.5CharChar1
- {mso-style-name:"ͼ������С5�� Char Char1";
+ {mso-style-name:"图中文字小5号 Char Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char10, li.5Char10, div.5Char10
- {mso-style-name:"ͼ������С5�� Char1";
+ {mso-style-name:"图中文字小5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.51, li.51, div.51
- {mso-style-name:ͼ������С5��1;
+ {mso-style-name:图中文字小5号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.120, li.120, div.120
- {mso-style-name:��ʽ12;
+ {mso-style-name:样式12;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -793,81 +793,81 @@ p.120, li.120, div.120
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.02, li.02, div.02
- {mso-style-name:����02;
+ {mso-style-name:封面02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.121, li.121, div.121
- {mso-style-name:����12;
+ {mso-style-name:封面12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.122, li.122, div.122
- {mso-style-name:�DZ���12;
+ {mso-style-name:非标题12;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.3Char2, li.3Char2, div.3Char2
- {mso-style-name:"ͼ������3 Char2";
+ {mso-style-name:"图中文字3 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post2, li.post2, div.post2
- {mso-style-name:�ʼ�post2;
+ {mso-style-name:邮件post2;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.32, li.32, div.32
- {mso-style-name:ͼ������32;
+ {mso-style-name:图中字体32;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char2, li.5Char2, div.5Char2
- {mso-style-name:"ͼ������С5�� Char2";
+ {mso-style-name:"图中文字小5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.52, li.52, div.52
- {mso-style-name:ͼ������С5��2;
+ {mso-style-name:图中文字小5号2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
- {mso-style-name:"ͼ������3 Char Char Char Char";
+ {mso-style-name:"图中文字3 Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.130, li.130, div.130
- {mso-style-name:��ʽ13;
+ {mso-style-name:样式13;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -876,129 +876,129 @@ p.130, li.130, div.130
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.30, li.30, div.30
- {mso-style-name:�������3;
+ {mso-style-name:代码程序3;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
p.03, li.03, div.03
- {mso-style-name:����03;
+ {mso-style-name:封面03;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.131, li.131, div.131
- {mso-style-name:����13;
+ {mso-style-name:封面13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.132, li.132, div.132
- {mso-style-name:�DZ���13;
+ {mso-style-name:非标题13;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.33, li.33, div.33
- {mso-style-name:�ı�����3;
+ {mso-style-name:文本居中3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char3, li.3Char3, div.3Char3
- {mso-style-name:"ͼ������3 Char3";
+ {mso-style-name:"图中文字3 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
p.post3, li.post3, div.post3
- {mso-style-name:�ʼ�post3;
+ {mso-style-name:邮件post3;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.330, li.330, div.330
- {mso-style-name:ͼ������33;
+ {mso-style-name:图中字体33;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char20, li.5Char20, div.5Char20
- {mso-style-name:"ͼ������5�� Char2";
+ {mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.5CharChar2, li.5CharChar2, div.5CharChar2
- {mso-style-name:"ͼ������С5�� Char Char2";
+ {mso-style-name:"图中文字小5号 Char Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.5Char3, li.5Char3, div.5Char3
- {mso-style-name:"ͼ������С5�� Char3";
+ {mso-style-name:"图中文字小5号 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.53, li.53, div.53
- {mso-style-name:ͼ������С5��3;
+ {mso-style-name:图中文字小5号3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.3Char, li.3Char, div.3Char
- {mso-style-name:"ͼ������3 Char";
- mso-style-link:"ͼ������3 Char Char5";
+ {mso-style-name:"图中文字3 Char";
+ mso-style-link:"图中文字3 Char Char5";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
- font-family:����;}
+ font-family:宋体;}
span.3CharChar5
- {mso-style-name:"ͼ������3 Char Char5";
- mso-style-link:"ͼ������3 Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char5";
+ mso-style-link:"图中文字3 Char";
+ font-family:宋体;}
p.54, li.54, div.54
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5紧密;
margin:0cm;
margin-bottom:.0001pt;
line-height:9.0pt;
text-autospace:ideograph-numeric;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.24, li.24, div.24
- {mso-style-name:����2�Ŵ�����;
+ {mso-style-name:居中2号粗宋体;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.15, li.15, div.15
- {mso-style-name:"��ʽ ���� 1 + ����";
+ {mso-style-name:"样式 标题 1 + 居中";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1006,10 +1006,10 @@ p.15, li.15, div.15
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.25, li.25, div.25
- {mso-style-name:"��ʽ ���� 2 + �о�\: �����о�";
+ {mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1022,33 +1022,33 @@ p.25, li.25, div.25
font-family:"Arial","sans-serif";
font-weight:bold;}
span.2Char
- {mso-style-name:"���� 2 Char";
- mso-style-link:"���� 2";
+ {mso-style-name:"标题 2 Char";
+ mso-style-link:"标题 2";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.34, li.34, div.34
- {mso-style-name:�б�3;
+ {mso-style-name:列表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.35, li.35, div.35
- {mso-style-name:��3;
+ {mso-style-name:表3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.4, li.4, div.4
- {mso-style-name:ͼ˵��4;
+ {mso-style-name:图说明4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.40, li.40, div.40
- {mso-style-name:�б�4;
+ {mso-style-name:列表4;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1057,168 +1057,168 @@ p.40, li.40, div.40
text-align:center;
text-indent:-21.0pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.41, li.41, div.41
- {mso-style-name:��4;
+ {mso-style-name:表4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.55, li.55, div.55
- {mso-style-name:ͼ˵��5;
+ {mso-style-name:图说明5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.56, li.56, div.56
- {mso-style-name:�б�5;
+ {mso-style-name:列表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.57, li.57, div.57
- {mso-style-name:��5;
+ {mso-style-name:表5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.6, li.6, div.6
- {mso-style-name:�б�6;
+ {mso-style-name:列表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.60, li.60, div.60
- {mso-style-name:��6;
+ {mso-style-name:表6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.61, li.61, div.61
- {mso-style-name:ͼ˵��6;
+ {mso-style-name:图说明6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.7, li.7, div.7
- {mso-style-name:�б�7;
+ {mso-style-name:列表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.70, li.70, div.70
- {mso-style-name:ͼ˵��7;
+ {mso-style-name:图说明7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.71, li.71, div.71
- {mso-style-name:��7;
+ {mso-style-name:表7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.8, li.8, div.8
- {mso-style-name:�б�8;
+ {mso-style-name:列表8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.9, li.9, div.9
- {mso-style-name:�б�9;
+ {mso-style-name:列表9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.90, li.90, div.90
- {mso-style-name:ͼ˵��9;
+ {mso-style-name:图说明9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.100, li.100, div.100
- {mso-style-name:�б�10;
+ {mso-style-name:列表10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.101, li.101, div.101
- {mso-style-name:ͼ˵��10;
+ {mso-style-name:图说明10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.114, li.114, div.114
- {mso-style-name:�б�11;
+ {mso-style-name:列表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.115, li.115, div.115
- {mso-style-name:ͼ˵��11;
+ {mso-style-name:图说明11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.116, li.116, div.116
- {mso-style-name:��11;
+ {mso-style-name:表11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.123, li.123, div.123
- {mso-style-name:�б�12;
+ {mso-style-name:列表12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.124, li.124, div.124
- {mso-style-name:ͼ˵��12;
+ {mso-style-name:图说明12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.133, li.133, div.133
- {mso-style-name:ͼ˵��13;
- mso-style-link:"ͼ˵��13 Char";
+ {mso-style-name:图说明13;
+ mso-style-link:"图说明13 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.13Char
- {mso-style-name:"ͼ˵��13 Char";
- mso-style-link:ͼ˵��13;
- font-family:����;}
+ {mso-style-name:"图说明13 Char";
+ mso-style-link:图说明13;
+ font-family:宋体;}
p.134, li.134, div.134
- {mso-style-name:�б�13;
+ {mso-style-name:列表13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.26, li.26, div.26
- {mso-style-name:��¼2;
+ {mso-style-name:附录2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1230,7 +1230,7 @@ p.26, li.26, div.26
font-family:"Arial","sans-serif";
font-weight:bold;}
p.36, li.36, div.36
- {mso-style-name:��¼3;
+ {mso-style-name:附录3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1240,12 +1240,12 @@ p.36, li.36, div.36
font-family:"Arial","sans-serif";
font-weight:bold;}
span.3Char0
- {mso-style-name:"���� 3 Char";
- mso-style-link:"���� 3";
+ {mso-style-name:"标题 3 Char";
+ mso-style-link:"标题 3";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.16, li.16, div.16
- {mso-style-name:��¼1;
+ {mso-style-name:附录1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1253,17 +1253,17 @@ p.16, li.16, div.16
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.17, li.17, div.17
- {mso-style-name:��¼��1;
+ {mso-style-name:附录表1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.42, li.42, div.42
- {mso-style-name:��¼4;
+ {mso-style-name:附录4;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1273,19 +1273,19 @@ p.42, li.42, div.42
font-family:"Arial","sans-serif";
font-weight:bold;}
span.4Char
- {mso-style-name:"���� 4 Char";
- mso-style-link:"���� 4";
+ {mso-style-name:"标题 4 Char";
+ mso-style-link:"标题 4";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a3, li.a3, div.a3
- {mso-style-name:��¼ͼ˵��;
+ {mso-style-name:附录图说明;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.27, li.27, div.27
- {mso-style-name:�����2;
+ {mso-style-name:序标题2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
@@ -1298,7 +1298,7 @@ p.27, li.27, div.27
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a4, li.a4, div.a4
- {mso-style-name:�����;
+ {mso-style-name:参考标题;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1306,10 +1306,10 @@ p.a4, li.a4, div.a4
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.18, li.18, div.18
- {mso-style-name:��������1;
+ {mso-style-name:索引标题1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
@@ -1317,10 +1317,10 @@ p.18, li.18, div.18
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.19, li.19, div.19
- {mso-style-name:�б�1;
+ {mso-style-name:列表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1329,9 +1329,9 @@ p.19, li.19, div.19
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.1a, li.1a, div.1a
- {mso-style-name:��1;
+ {mso-style-name:表1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1340,38 +1340,38 @@ p.1a, li.1a, div.1a
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.37, li.37, div.37
- {mso-style-name:ͼ˵��3;
+ {mso-style-name:图说明3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.62, li.62, div.62
- {mso-style-name:��������6��;
+ {mso-style-name:表中字体6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a5, li.a5, div.a5
- {mso-style-name:���Ĵ���;
- mso-style-link:"���Ĵ��� Char";
+ {mso-style-name:正文代码;
+ mso-style-link:"正文代码 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char1
- {mso-style-name:"���Ĵ��� Char";
- mso-style-link:���Ĵ���;
- font-family:����;}
+ {mso-style-name:"正文代码 Char";
+ mso-style-link:正文代码;
+ font-family:宋体;}
p.43, li.43, div.43
- {mso-style-name:"��ʽ ���� 4 +";
+ {mso-style-name:"样式 标题 4 +";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
@@ -1381,7 +1381,7 @@ p.43, li.43, div.43
font-family:"Arial","sans-serif";
font-weight:bold;}
p.140, li.140, div.140
- {mso-style-name:��14;
+ {mso-style-name:表14;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1390,10 +1390,10 @@ p.140, li.140, div.140
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.141, li.141, div.141
- {mso-style-name:ͼ˵��14;
- mso-style-link:"ͼ˵��14 Char";
+ {mso-style-name:图说明14;
+ mso-style-link:"图说明14 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
@@ -1402,62 +1402,62 @@ p.141, li.141, div.141
text-align:center;
text-indent:-21.25pt;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.14Char
- {mso-style-name:"ͼ˵��14 Char";
- mso-style-link:ͼ˵��14;
- font-family:����;}
+ {mso-style-name:"图说明14 Char";
+ mso-style-link:图说明14;
+ font-family:宋体;}
p.a6, li.a6, div.a6
- {mso-style-name:�ļ�Ŀ¼��;
+ {mso-style-name:文件目录表;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a7, li.a7, div.a7
- {mso-style-name:"��ʽ ���� +";
- mso-style-link:"��ʽ ���� + Char";
+ {mso-style-name:"样式 正文 +";
+ mso-style-link:"样式 正文 + Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char2
- {mso-style-name:"��ʽ ���� + Char";
- mso-style-link:"��ʽ ���� +";
+ {mso-style-name:"样式 正文 + Char";
+ mso-style-link:"样式 正文 +";
font-family:"Times New Roman","serif";}
p.a8, li.a8, div.a8
- {mso-style-name:������ע;
+ {mso-style-name:表格题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.a9, li.a9, div.a9
- {mso-style-name:�б���ע;
+ {mso-style-name:列表题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.aa, li.aa, div.aa
- {mso-style-name:ͼ��ע;
+ {mso-style-name:图题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ab, li.ab, div.ab
- {mso-style-name:������ע;
+ {mso-style-name:程序题注;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ac, li.ac, div.ac
- {mso-style-name:��������;
+ {mso-style-name:框中文字;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
@@ -1468,9 +1468,9 @@ p.ac, li.ac, div.ac
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.125, li.125, div.125
- {mso-style-name:"��ʽ ���� 1 + ����2";
+ {mso-style-name:"样式 标题 1 + 居中2";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1478,17 +1478,17 @@ p.125, li.125, div.125
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.ad, li.ad, div.ad
- {mso-style-name:"��ʽ ��ע + ���� ��� ����";
+ {mso-style-name:"样式 题注 + 宋体 五号 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:黑体;}
p.1b, li.1b, div.1b
- {mso-style-name:�����1;
+ {mso-style-name:序标题1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
@@ -1496,65 +1496,65 @@ p.1b, li.1b, div.1b
line-height:240%;
page-break-after:avoid;
font-size:16.0pt;
- font-family:����;
+ font-family:宋体;
font-weight:bold;}
p.38, li.38, div.38
- {mso-style-name:�����3;
+ {mso-style-name:序标题3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
- font-family:����С���μ���;}
+ font-family:方正小标宋简体;}
p.63, li.63, div.63
- {mso-style-name:��������6��;
+ {mso-style-name:表中文字6号;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.64, li.64, div.64
- {mso-style-name:ͼ������6�������;
+ {mso-style-name:图中文字6号左对齐;
margin:0cm;
margin-bottom:.0001pt;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
p.65, li.65, div.65
- {mso-style-name:ͼ������6��;
- mso-style-link:"ͼ������6�� Char";
+ {mso-style-name:图中文字6号;
+ mso-style-link:"图中文字6号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
- font-family:����;}
+ font-family:宋体;}
span.6Char
- {mso-style-name:"ͼ������6�� Char";
- mso-style-link:ͼ������6��;
- font-family:����;}
+ {mso-style-name:"图中文字6号 Char";
+ mso-style-link:图中文字6号;
+ font-family:宋体;}
p.ae, li.ae, div.ae
- {mso-style-name:ͼ��;
+ {mso-style-name:图标;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.28, li.28, div.28
- {mso-style-name:ͼ��2;
+ {mso-style-name:图标2;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.af, li.af, div.af
- {mso-style-name:ϰ�����;
+ {mso-style-name:习题标题;
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:0cm;
@@ -1564,29 +1564,29 @@ p.af, li.af, div.af
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
- font-family:����;}
+ font-family:黑体;}
p.1c, li.1c, div.1c
- {mso-style-name:���ֱ��1;
+ {mso-style-name:部分编号1;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:16.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af0, li.af0, div.af0
- {mso-style-name:������;
+ {mso-style-name:表标题;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
- {mso-style-name:"��ʽ ��ע + ����";
+ {mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
p.ListTitle, li.ListTitle, div.ListTitle
{mso-style-name:ListTitle;
margin:0cm;
@@ -1628,201 +1628,201 @@ p.RightText, li.RightText, div.RightText
border:none;
padding:0cm;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af2, li.af2, div.af2
- {mso-style-name:����������;
+ {mso-style-name:表中文字小五;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.af3, li.af3, div.af3
- {mso-style-name:�ؼ���;
- mso-style-link:"�ؼ��� Char";
+ {mso-style-name:关键词;
+ mso-style-link:"关键词 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char3
- {mso-style-name:"�ؼ��� Char";
- mso-style-link:�ؼ���;
- font-family:����;}
+ {mso-style-name:"关键词 Char";
+ mso-style-link:关键词;
+ font-family:宋体;}
p.af4, li.af4, div.af4
- {mso-style-name:���;
- mso-style-link:"��� Char";
+ {mso-style-name:文件名;
+ mso-style-link:"文件名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char4
- {mso-style-name:"��� Char";
- mso-style-link:���;
- font-family:����;}
+ {mso-style-name:"文件名 Char";
+ mso-style-link:文件名;
+ font-family:宋体;}
p.af5, li.af5, div.af5
- {mso-style-name:ѡ��;
- mso-style-link:"ѡ�� Char";
+ {mso-style-name:选项;
+ mso-style-link:"选项 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char5
- {mso-style-name:"ѡ�� Char";
- mso-style-link:ѡ��;
- font-family:����;}
+ {mso-style-name:"选项 Char";
+ mso-style-link:选项;
+ font-family:宋体;}
p.af6, li.af6, div.af6
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:命令行;
+ mso-style-link:"命令行 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char6
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"命令行 Char";
+ mso-style-link:命令行;
+ font-family:宋体;}
p.af7, li.af7, div.af7
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:函数名;
+ mso-style-link:"函数名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char7
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"函数名 Char";
+ mso-style-link:函数名;
+ font-family:宋体;}
p.af8, li.af8, div.af8
- {mso-style-name:�Ĵ�����;
- mso-style-link:"�Ĵ����� Char";
+ {mso-style-name:寄存器名;
+ mso-style-link:"寄存器名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char8
- {mso-style-name:"�Ĵ����� Char";
- mso-style-link:�Ĵ�����;
+ {mso-style-name:"寄存器名 Char";
+ mso-style-link:寄存器名;
font-family:"Times New Roman","serif";}
p.af9, li.af9, div.af9
- {mso-style-name:������;
- mso-style-link:"������ Char";
+ {mso-style-name:变量名;
+ mso-style-link:"变量名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
- font-family:����;}
+ font-family:宋体;}
span.Char9
- {mso-style-name:"������ Char";
- mso-style-link:������;
- font-family:����;}
+ {mso-style-name:"变量名 Char";
+ mso-style-link:变量名;
+ font-family:宋体;}
p.58, li.58, div.58
- {mso-style-name:ͼ������С5����;
+ {mso-style-name:图中文字小5号左;
margin:0cm;
margin-bottom:.0001pt;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.59, li.59, div.59
- {mso-style-name:ͼ������С5�ſ���;
+ {mso-style-name:图中文字小5号靠左;
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
- font-family:����;}
+ font-family:宋体;}
p.926, li.926, div.926
- {mso-style-name:"��ʽ ������� + ���\: 9\.26 ����";
+ {mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:10.0pt;
- font-family:����;}
+ font-family:宋体;}
span.5Char4
- {mso-style-name:"���� 5 Char";
- mso-style-link:"���� 5";
+ {mso-style-name:"标题 5 Char";
+ mso-style-link:"标题 5";
font-weight:bold;}
span.6Char0
- {mso-style-name:"���� 6 Char";
- mso-style-link:"���� 6";
+ {mso-style-name:"标题 6 Char";
+ mso-style-link:"标题 6";
font-family:"Arial","sans-serif";
font-weight:bold;}
span.7Char
- {mso-style-name:"���� 7 Char";
- mso-style-link:"���� 7";
+ {mso-style-name:"标题 7 Char";
+ mso-style-link:"标题 7";
font-weight:bold;}
span.8Char
- {mso-style-name:"���� 8 Char";
- mso-style-link:"���� 8";
+ {mso-style-name:"标题 8 Char";
+ mso-style-link:"标题 8";
font-family:"Arial","sans-serif";}
span.9Char
- {mso-style-name:"���� 9 Char";
- mso-style-link:"���� 9";
+ {mso-style-name:"标题 9 Char";
+ mso-style-link:"标题 9";
font-family:"Arial","sans-serif";}
span.Chara
- {mso-style-name:"��ע�ı� Char";
- mso-style-link:��ע�ı�;
- font-family:����;}
+ {mso-style-name:"脚注文本 Char";
+ mso-style-link:脚注文本;
+ font-family:宋体;}
span.Charb
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;}
+ {mso-style-name:"批注文字 Char";
+ mso-style-link:批注文字;
+ font-family:宋体;}
span.Charc
- {mso-style-name:"ҳü Char";
- mso-style-link:ҳü;
- font-family:����;}
+ {mso-style-name:"页眉 Char";
+ mso-style-link:页眉;
+ font-family:宋体;}
span.Chard
- {mso-style-name:"ҳ�� Char";
- mso-style-link:ҳ��;
- font-family:����;}
+ {mso-style-name:"页脚 Char";
+ mso-style-link:页脚;
+ font-family:宋体;}
span.Chare
- {mso-style-name:"���� Char";
- mso-style-link:����;
- font-family:����;}
+ {mso-style-name:"日期 Char";
+ mso-style-link:日期;
+ font-family:宋体;}
span.HTMLChar
- {mso-style-name:"HTML Ԥ���ʽ Char\,HTML Ԥ�ȸ�ʽ�� Char\,HTML Ԥ�ȸ�ʽ��1 Char\,HTML Ԥ�ȸ�ʽ��2 Char\,HTML Ԥ�ȸ�ʽ��3 Char";
- mso-style-link:"HTML Ԥ���ʽ\,HTML Ԥ�ȸ�ʽ��\,HTML Ԥ�ȸ�ʽ��1\,HTML Ԥ�ȸ�ʽ��2\,HTML Ԥ�ȸ�ʽ��3";
- font-family:����;}
+ {mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
+ mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
+ font-family:宋体;}
span.Charf
- {mso-style-name:"��ע���� Char";
- mso-style-link:��ע����;
- font-family:����;
+ {mso-style-name:"批注主题 Char";
+ mso-style-link:批注主题;
+ font-family:宋体;
font-weight:bold;}
span.Charf0
- {mso-style-name:"��ע���ı� Char";
- mso-style-link:��ע���ı�;
- font-family:����;}
+ {mso-style-name:"批注框文本 Char";
+ mso-style-link:批注框文本;
+ font-family:宋体;}
span.3CharChar1
- {mso-style-name:"ͼ������3 Char Char1";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1";
+ font-family:宋体;}
span.5CharCharChar0
- {mso-style-name:"ͼ������5�� Char Char Char";
- font-family:����;}
+ {mso-style-name:"图中文字5号 Char Char Char";
+ font-family:宋体;}
span.3CharChar3
- {mso-style-name:"ͼ������3 Char Char3";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char3";
+ font-family:宋体;}
span.3CharChar1Char
- {mso-style-name:"ͼ������3 Char Char1 Char";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char1 Char";
+ font-family:宋体;}
span.3CharChar13
- {mso-style-name:"ͼ������3 Char Char13";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char13";
+ font-family:宋体;}
span.3CharChar12
- {mso-style-name:"ͼ������3 Char Char12";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char12";
+ font-family:宋体;}
span.3CharChar11
- {mso-style-name:"ͼ������3 Char Char11";
- font-family:����;}
+ {mso-style-name:"图中文字3 Char Char11";
+ font-family:宋体;}
.MsoChpDefault
{font-size:10.0pt;}
/* Page Definitions */
@@ -1846,8 +1846,8 @@ ul
����8-9 linux/kernel/sys.c���� 6 7
-#include <errno.h> // �����ͷ�ļ�������ϵͳ�и��ֳ����š� 8 9
-#include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct������0�����ݣ�
-// ����һЩ�й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������䡣 10
-#include <linux/tty.h> // ttyͷ�ļ����������й�tty_io������ͨ�ŷ���IJ����������� 11
-#include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣 12
-#include <linux/config.h> // �ں˳��������ļ���������Ҫʹ�����е�ϵͳ���Ƴ���������Ϣ�� 13
-#include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ���� 14
-#include <sys/times.h> // �����˽���������ʱ��Ľṹtms�Լ�times()����ԭ�͡� 15
-#include <sys/utsname.h> // ϵͳ���ƽṹͷ�ļ��� 16
-#include <sys/param.h> // ϵͳ����ͷ�ļ�������ϵͳһЩȫ�ֳ������š�����HZ�ȡ� 17
-#include <sys/resource.h> // ϵͳ��Դͷ�ļ��������йؽ�����Դʹ������Ľṹ����Ϣ�� 18
-#include <string.h> // �ַ���ͷ�ļ����ַ������ڴ��ֽ����в��������� 19 /* * ��ϵͳ���ڵ�ʱ����timezone������ΪijЩ����ʹ��gettimeofdayϵͳ���û�ȡ * 本系统所在的时区(timezone)。作为某些程序使用gettimeofday系统调用获取 * ʱ����Ĭ��ֵ�� * 时区的默认值。 */ // ʱ���ṹtimezone��1���ֶΣ�tz_minuteswest����ʾ��������α�ʱ��GMT�����ķ��� // 时区结构timezone第1个字段(tz_minuteswest)表示距格林尼治标准时间GMT以西的分钟 // ������2���ֶΣ�tz_dsttime��������ʱDST��Daylight
-Savings Time���������͡� �ýṹ // 数;第2个字段(tz_dsttime)是夏令时DST(Daylight
+Savings Time)调整类型。 该结构 // ������include/sys/time.h�С� // 定义在include/sys/time.h中。 24
struct timezone sys_tz = { 0, 0}; 25 // ���ݽ������pgrpȡ�ý����������Ự��session���š��ú�����kernel/exit.c��ʵ�֡� // 根据进程组号pgrp取得进程组所属会话(session)号。该函数在kernel/exit.c中实现。 26
extern int session_of_pgrp(int pgrp); 27 // �������ں�ʱ�䣨ftime �C Fetch time���� // 返回日期和时间(ftime – Fetch time)。 // ���·���ֵ��-ENOSYS��ϵͳ���ú�������ʾ�ڱ��汾�ں��л�δʵ�֡� // 以下返回值是-ENOSYS的系统调用函数均表示在本版本内核中还未实现。 28 int
sys_ftime() 37 // ���ڵ�ǰ���̶��ӽ��̽��е���(debugging)�� // 用于当前进程对子进程进行调试(debugging)。 38 int
sys_ptrace() 42 // �ı䲢��ӡ�ն������á� // 改变并打印终端行设置。 43 int
sys_stty() 47 // ȡ�ն���������Ϣ�� // 取终端行设置信息。 48 int
sys_gtty() 52 // ���ļ����� // 修改文件名。 53 int
sys_rename() * ������BSD��ʽ��ʵ�֣�û�п��DZ����gid��saved
-gid��sgid�������˵��� * 以下是BSD形式的实现,没有考虑保存的gid(saved
+gid或sgid),除了当你 * ��������Ч��gid��effective gid��egid��ʱ�������gidҲ�ᱻ���á���ʹ * 设置了有效的gid(effective gid或egid)时,保存的gid也会被设置。这使 * ��һ��ʹ��setgid�ij��������ȫ��������Ȩ�������ڶ�һ��������а�ȫ�� * 得一个使用setgid的程序可以完全放弃其特权。当你在对一个程序进行安全审 * ��ʱ����ͨ����һ�ֺܺõĴ��������� * 计时,这通常是一种很好的处理方法。 * * ������Ŀ�����һ��ʹ��setregid()�ij�����BSDϵͳ100%�ļ��ݡ���һ * 最基本的考虑是一个使用setregid()的程序将会与BSD系统100%的兼容。而一 * ��ʹ��setgid()�ͱ����gid�ij�����POSIX 100%�ļ��ݡ� * 个使用setgid()和保存的gid的程序将会与POSIX 100%的兼容。 */ // ���õ�ǰ�����ʵ���Լ�/������Ч��ID��gid�����������û�г����û���Ȩ����ôֻ�ܻ� // 设置当前任务的实际以及/或者有效组ID(gid)。如果任务没有超级用户特权,那么只能互 // ����ʵ����ID
-����Ч�� ID�����������г����û���Ȩ����������������Ч�ĺ�ʵ�ʵ��� // 换其实际组ID
+和有效组 ID。如果任务具有超级用户特权,就能任意设置有效的和实际的组 // ID��������gid��saved gid�������ó�����Чgid��ʵ����ID��ָ���̵�ǰ��gid�� // ID。保留的gid(saved gid)被设置成与有效gid。实际组ID是指进程当前的gid。 74 int
sys_setregid(int rgid, int egid) /* * setgid()��ʵ�������SAVED_IDS��SYSV��ʵ�ַ������ơ� * setgid()的实现与具有SAVED_IDS的SYSV的实现方法相似。 */ // ���ý������(gid)���������û�г����û���Ȩ��������ʹ�� setgid() ������Ч // 设置进程组号(gid)。如果任务没有超级用户特权,它可以使用 setgid() 将其有效gid // ��effective
-gid������Ϊ���䱣��gid(saved gid)����ʵ��gid(real
-gid)��������� // (effective
+gid)设置为成其保留gid(saved gid)或其实际gid(real
+gid)。如果任务 // �г����û���Ȩ����ʵ��gid����Чgid�ͱ���gid�������óɲ���ָ����gid�� // 有超级用户特权,则实际gid、有效gid和保留gid都被设置成参数指定的gid。 98 int
sys_setgid(int gid) 108 // ��رս��̼��ʹ��ܡ� // 打开或关闭进程计帐功能。 109 int sys_acct() 113 // ӳ�����������ڴ浽���̵������ַ�ռ䡣 // 映射任意物理内存到进程的虚拟地址空间。 114 int sys_phys() 133 // ���ش� 1970��1��1��00:00:00 GMT ��ʼ��ʱ��ʱ��ֵ���룩�����tloc��Ϊnull�� // 返回从 1970年1月1日00:00:00 GMT 开始计时的时间值(秒)。如果tloc不为null, // ��ʱ��ֵҲ�洢����� // 则时间值也存储在那里。 // ���ڲ�����һ��ָ�룬������ָλ�����û��ռ䣬�����Ҫʹ�ú���
-put_fs_long() �� // 由于参数是一个指针,而其所指位置在用户空间,因此需要使用函数
+put_fs_long() 来 // ���ʸ�ֵ���ڽ����ں�������ʱ���μĴ���fs��Ĭ�ϵ�ָ��ǰ�û����ݿռ䡣��˸� // 访问该值。在进入内核中运行时,段寄存器fs被默认地指向当前用户数据空间。因此该 // �����Ϳ�����fs�������û��ռ��е�ֵ�� // 函数就可利用fs来访问用户空间中的值。 134 int sys_time(long * tloc) 140
verify_area(tloc,4);
-// ��֤�ڴ������Ƿ�������4�ֽڣ��� 141
put_fs_long(i,(unsigned long *)tloc);
-// �����û����ݶ�tloc���� 142 } /* * ����Ȩ���û����Լ�ʵ�ʵ�uid��real uid���ij���Ч��uid��effective uid���� * 无特权的用户可以见实际的uid(real uid)改成有效的uid(effective uid), * ��֮ҲȻ����BSD��ʽ��ʵ�֣� * 反之也然。(BSD形式的实现) * * ����������Ч��uid ʱ����ͬʱҲ�����˱���� uid����ʹ��һ��ʹ�� * 当你设置有效的uid 时,它同时也设置了保存的 uid。这使得一个使用 setuid * �ij��������ȫ��������Ȩ�������ڶ�һ��������а�ȫ���ʱ����ͨ����һ�� * 的程序可以完全放弃其特权。当你在对一个程序进行安全审计时,这通常是一种 * �ܺõĴ��������� * 很好的处理方法。 * ������Ŀ�����һ��ʹ�� setreuid()�ij����� BSDϵͳ100%�ļ��ݡ���һ * 最基本的考虑是一个使用 setreuid()的程序将会与 BSD系统100%的兼容。而一 * ��ʹ��setuid()�ͱ����gid�ij�����POSIX 100%�ļ��ݡ� * 个使用setuid()和保存的gid的程序将会与POSIX 100%的兼容。 */ // ���������ʵ���Լ�/������Ч���û�ID��uid�����������û�г����û���Ȩ����ôֻ�� // 设置任务的实际以及/或者有效的用户ID(uid)。如果任务没有超级用户特权,那么只能 // ������ʵ�ʵ�uid ����Ч��uid�����������г����û���Ȩ����������������Ч�ĺ�ʵ // 互换其实际的uid 和有效的uid。如果任务具有超级用户特权,就能任意设置有效的和实 // �ʵ��û�ID�������uid��saved uid�������ó�����Чuidֵͬ�� // 际的用户ID。保存的uid(saved uid)被设置成与有效uid同值。 159 int sys_setreuid(int ruid,
@@ -2612,46 +2612,46 @@ lang=EN-US> */ /* * setuid()��ʵ�������SAVED_IDS��SYSV��ʵ�ַ������ơ� * setuid()的实现与具有SAVED_IDS的SYSV的实现方法相似。 * * ��ע��ʹ��SAVED_ID��setuid()��ijЩ�����Dz����Ƶġ����磬һ��ʹ�� * 请注意使用SAVED_ID的setuid()在某些方面是不完善的。例如,一个使用 * setuid�ij����û�����sendmail������������uid���ó�һ����ͨ�û��� * setuid的超级用户程序sendmail就做不到把其uid设置成一个普通用户的 * uid��Ȼ���ٽ��������� ��Ϊ�������һ�������û���setuid() Ҳͬʱ�� * uid,然后再交换回来。 因为如果你是一个超级用户,setuid() 也同时会 * ���ñ����uid������㲻ϲ�������������Ļ��������POSIX��ί���Լ� * 设置保存的uid。如果你不喜欢这样的做法的话,就责怪POSIX组委会以及 * /����USG�еĴ����˰ɡ�������ע��BSD��ʽ��setreuid()ʵ���ܹ����� * /或者USG中的聪明人吧。不过请注意BSD形式的setreuid()实现能够允许 * һ�������û�������ʱ������Ȩ��������ͨ������ʵ�ʵĺ���Ч�� uid �� * 一个超级用户程序临时放弃特权,并且能通过交换实际的和有效的 uid 而 * �ٴλ����Ȩ�� * 再次获得特权。 */ // ���������û�ID��uid�����������û�г����û���Ȩ��������ʹ��setuid()������Ч�� // 设置任务用户ID(uid)。如果任务没有超级用户特权,它可以使用setuid()将其有效的 // uid��effective
-uid�����ó��䱣���uid��saved uid������ʵ�ʵ�uid��real uid���� // uid(effective
+uid)设置成其保存的uid(saved uid)或其实际的uid(real uid)。 // ��������г����û���Ȩ����ʵ�ʵ�uid����Ч��uid�ͱ����uid���ᱻ���óɲ���ָ // 如果任务有超级用户特权,则实际的uid、有效的uid和保存的uid都会被设置成参数指 // ����uid�� // 定的uid。 196 int sys_setuid(int uid) 206 // ����ϵͳ����ʱ�䡣����tptr�Ǵ�1970��1��1��00:00:00 GMT��ʼ��ʱ��ʱ��ֵ���룩�� // 设置系统开机时间。参数tptr是从1970年1月1日00:00:00 GMT开始计时的时间值(秒)。 // ���ý��̱�����г����û�Ȩ�ޡ�����HZ=100�����ں�ϵͳ����Ƶ�ʡ� // 调用进程必须具有超级用户权限。其中HZ=100,是内核系统运行频率。 // ���ڲ�����һ��ָ�룬������ָλ�����û��ռ䣬�����Ҫʹ�ú���get_fs_long()�����ʸ� // 由于参数是一个指针,而其所指位置在用户空间,因此需要使用函数get_fs_long()来访问该 // ֵ���ڽ����ں�������ʱ���μĴ��� fs ��Ĭ�ϵ�ָ��ǰ�û����ݿռ䡣��˸ú����Ϳ��� // 值。在进入内核中运行时,段寄存器 fs 被默认地指向当前用户数据空间。因此该函数就可利 // ��fs�������û��ռ��е�ֵ�� // 用fs来访问用户空间中的值。 // ���������ṩ�ĵ�ǰʱ��ֵ��ȥϵͳ�Ѿ����е�ʱ����ֵ��jiffies/HZ�����ǿ���ʱ����ֵ�� // 函数参数提供的当前时间值减去系统已经运行的时间秒值(jiffies/HZ)即是开机时间秒值。 207 int sys_stime(long * tptr) 209 if (!suser())
-// ������dz����û���������أ����ɣ��� 210
@@ -2747,14 +2747,14 @@ lang=EN-US> } 215 // ��ȡ��ǰ��������ʱ��ͳ��ֵ�� // 获取当前任务运行时间统计值。 // ��tbuf��ָ�û����ݿռ䴦����tms�ṹ����������ʱ��ͳ��ֵ��tms�ṹ�а��������û� // 在tbuf所指用户数据空间处返回tms结构的任务运行时间统计值。tms结构中包括进程用户 // ����ʱ�䡢�ںˣ�ϵͳ��ʱ�䡢�ӽ����û�����ʱ�䡢�ӽ���ϵͳ����ʱ�䡣��������ֵ�� // 运行时间、内核(系统)时间、子进程用户运行时间、子进程系统运行时间。函数返回值是 // ϵͳ���е���ǰ��������� // 系统运行到当前的嘀嗒数。 216 int sys_times(struct } 227 // ������end_data_seg��ֵ����������ϵͳȷʵ���㹻���ڴ棬���ҽ���û�г�Խ��������� // 当参数end_data_seg数值合理,并且系统确实有足够的内存,而且进程没有超越其最大数据 // �δ�Сʱ���ú����������ݶ�ĩβΪend_data_segָ����ֵ����ֵ������ڴ����β����Ҫ // 段大小时,该函数设置数据段末尾为end_data_seg指定的值。该值必须大于代码结尾并且要 // С�ڶ�ջ��β16KB������ֵ�����ݶε��½�βֵ���������ֵ��Ҫ��ֵ��ͬ��������д��� // 小于堆栈结尾16KB。返回值是数据段的新结尾值(如果返回值与要求值不同,则表明有错误 // ���������ú����������û�ֱ�ӵ��ã�����libc�⺯�����а�װ�����ҷ���ֵҲ��һ���� // 发生)。该函数并不被用户直接调用,而由libc库函数进行包装,并且返回值也不一样。 228 int sys_brk(unsigned long
@@ -2821,8 +2821,8 @@ end_data_seg) 229 { // �������ֵ���ڴ����β������С�ڣ���ջ - 16KB���������������ݶν�βֵ�� // 如果参数值大于代码结尾,并且小于(堆栈 - 16KB),则设置新数据段结尾值。 230 if (end_data_seg
@@ -2841,7 +2841,7 @@ lang=EN-US> &nb
233 return current->brk;
- // ���ؽ��̵�ǰ�����ݶν�βֵ�� 234 } /* * ���������ҪijЩ�ϸ�ļ���� * 下面代码需要某些严格的检查… * ��ֻ��û��θ��������Щ����Ҳ����ȫ����sessions/pgrp�ȵĺ��塣������ * 我只是没有胃口来做这些。我也不完全明白sessions/pgrp等的含义。还是让 * �˽����ǵ��������ɡ� * 了解它们的人来做吧。 * * OK���������Ѿ���ȷ��ʵ���˱�������...����֮������ʵֻ�Զ��û�ϵͳ�� * OK,我想我已经正确地实现了保护语义...。总之,这其实只对多用户系统是 * ��Ҫ�ģ���ȷ��һ���û������������û��Ľ��̷����źš� * 重要的,以确定一个用户不能向其他用户的进程发送信号。 -TYT 12/12/91 */ // ����ָ������pid�Ľ������Ϊpgid�� // 设置指定进程pid的进程组号为pgid。 // ����pid
-��ָ�����̵Ľ��̺š������Ϊ0������pid���ڵ�ǰ���̵Ľ��̺š����� // 参数pid
+是指定进程的进程号。如果它为0,则让pid等于当前进程的进程号。参数pgid // ��ָ���Ľ�����š������Ϊ0�����������ڽ���pid�Ľ�����š�����ú������ڽ����� // 是指定的进程组号。如果它为0,则让它等于进程pid的进程组号。如果该函数用于将进程 // ��һ���������Ƶ���һ�������飬���������������������ͬһ���Ự(session)�������� // 从一个进程组移到另一个进程组,则这两个进程组必须属于同一个会话(session)。在这种 // ����£�����pgid ָ����Ҫ��������н�����ID����ʱ����ĻỰID�����뽫Ҫ����� // 情况下,参数pgid 指定了要加入的现有进程组ID,此时该组的会话ID必须与将要加入进 // �̵���ͬ(263��)�� // 程的相同(263行)。 245 int sys_setpgid(int pid, int
@@ -2934,15 +2934,15 @@ lang=EN-US> int i; 248 // �������pidΪ0����pidȡֵΪ��ǰ���̵Ľ��̺�pid���������pgidΪ0����pgidҲ // 如果参数pid为0,则pid取值为当前进程的进程号pid。如果参数pgid为0,则pgid也 // ȡֵΪ��ǰ���̵�pid��[?? ������POSIX���������г��� ]���� pgidС��0���� // 取值为当前进程的pid。[?? 这里与POSIX标准的描述有出入 ]。若 pgid小于0,则返回 // ��Ч�����롣 // 无效错误码。 249 if (!pid) // ɨ���������飬����ָ�����̺� pid ����������ҵ��˽��̺���pid �Ľ��̣����Ҹý��� // 扫描任务数组,查找指定进程号 pid 的任务。如果找到了进程号是pid 的进程,并且该进程 // �ĸ����̾��ǵ�ǰ���̻��߸ý��̾��ǵ�ǰ���̣���ô���������Ѿ��ǻỰ���죬��������ء� // 的父进程就是当前进程或者该进程就是当前进程,那么若该任务已经是会话首领,则出错返回。 // ��������ĻỰ�ţ�session���뵱ǰ���̵IJ�ͬ������ָ���Ľ������pgid��pid��ͬ���� // 若该任务的会话号(session)与当前进程的不同,或者指定的进程组号pgid与pid不同并且 // pgid �����������Ự���뵱ǰ���������Ự�Ų�ͬ����Ҳ�������ء�
-����Ѳ��ҵ��Ľ��̵� // pgid 进程组所属会话号与当前进程所属会话号不同,则也出错返回。
+否则把查找到的进程的 // pgrp����Ϊpgid��������0����û���ҵ�ָ��pid�Ľ��̣��ؽ��̲����ڳ����롣 // pgrp设置为pgid,并返回0。若没有找到指定pid的进程,则返回进程不存在出错码。 255 for (i=0 ; i< } 270 // ���ص�ǰ���̵Ľ�����š���getpgid(0)��ͬ�� // 返回当前进程的进程组号。与getpgid(0)等同。 271 int sys_getpgrp(void) 275 // ����һ���Ự(session)����������leader=1��������������Ự��=�����=����̺š� // 创建一个会话(session)(即设置其leader=1),并且设置其会话号=其组号=其进程号。 // �����ǰ�������ǻỰ���첢�Ҳ��dz����û�����������ء��������õ�ǰ����Ϊ�»Ự // 如果当前进程已是会话首领并且不是超级用户,则出错返回。否则设置当前进程为新会话 // ���죨leader
-= 1�����������õ�ǰ���̻Ự�� session�����pgrp�����ڽ��̺�pid�� // 首领(leader
+= 1),并且设置当前进程会话号 session和组号pgrp都等于进程号pid, // �������õ�ǰ����û�п����նˡ����ϵͳ���÷��ػỰ�š� // 而且设置当前进程没有控制终端。最后系统调用返回会话号。 276 int sys_setsid(void) 282 current->tty = -1;
-// ��ʾ��ǰ����û�п����նˡ� 283 return */ /* * ���̵������û���š� * 进程的其他用户组号。 */ // ȡ��ǰ�������������û���š� // 取当前进程其他辅助用户组号。 // �������ݽṹ��groups[]���鱣���Ž���ͬʱ�����Ķ���û���š������鹲NGROUPS��� // 任务数据结构中groups[]数组保存着进程同时所属的多个用户组号。该数组共NGROUPS个项, // ��ij���ֵ��NOGROUP����Ϊ -1�������ʾ�Ӹ��ʼ�Ժ���������С������������б� // 若某项的值是NOGROUP(即为 -1),则表示从该项开始以后所有项都空闲。否则数组项中保 // ������û���š� // 存的是用户组号。 // ����gidsetsize�ǻ�ȡ���û���Ÿ�����grouplist�Ǵ洢��Щ�û���ŵ��û��ռ仺�档 // 参数gidsetsize是获取的用户组号个数;grouplist是存储这些用户组号的用户空间缓存。 289 int sys_getgroups(int
@@ -3159,19 +3159,19 @@ int i; 292 // ������֤grouplistָ����ָ���û�����ռ��Ƿ��㹻��Ȼ��ӵ�ǰ���̽ṹ�� // 首先验证grouplist指针所指的用户缓存空间是否足够,然后从当前进程结构的groups[] // ���������ȡ���û���Ų����Ƶ��û������С��ڸ��ƹ����У���� groups[] �е����� // 数组中逐个取得用户组号并复制到用户缓存中。在复制过程中,如果 groups[] 中的项数 // ���ڸ����IJ��� gidsetsize ��ָ���ĸ��������ʾ�û������Ļ���̫С���������µ�ǰ // 大于给定的参数 gidsetsize 所指定的个数,则表示用户给出的缓存太小,不能容下当前 // ����������ţ���˴˴�ȡ��Ų�����������ء������ƹ����������������᷵�ظ� // 进程所有组号,因此此次取组号操作会出错返回。若复制过程正常,则函数最后会返回复 // �Ƶ��û���Ÿ�������gidsetsize �C gid set size���û���ż���С���� // 制的用户组号个数。(gidsetsize – gid set size,用户组号集大小)。 293 if (gidsetsize) 304 return(i);
-// ����ʵ�ʺ��е��û���Ÿ����� 305 } 306 // ���õ�ǰ����ͬʱ���������������û���š� // 设置当前进程同时所属的其他辅助用户组号。 // ����gidsetsize�ǽ����õ��û���Ÿ�����grouplist�Ǻ����û���ŵ��û��ռ仺�档 // 参数gidsetsize是将设置的用户组号个数;grouplist是含有用户组号的用户空间缓存。 307 int sys_setgroups(int
@@ -3247,16 +3247,16 @@ int i; 310 // ���Ȳ�Ȩ�Ͳ�������Ч�ԡ�ֻ�г����û������Ļ����õ�ǰ���̵ĸ����û���ţ����� // 首先查权限和参数的有效性。只有超级用户可以修改或设置当前进程的辅助用户组号,而且 // ���õ��������ܳ������̵�groups[NGROUPS]�����������Ȼ����û���������������û� // 设置的项数不能超过进程的groups[NGROUPS]数组的容量。然后从用户缓冲中逐个复制用户 // ��ţ���gidsetsize����������Ƶĸ���û������groups[]���������һ��������ֵΪ-1 // 组号,共gidsetsize个。如果复制的个数没有填满groups[],则在随后一项上填上值为-1 // ���NOGROUP�������������0�� // 的项(NOGROUP)。最后函数返回0。 311 if (! } 322 // ��鵱ǰ�����Ƿ���ָ�����û���grp�С�����1������0�� // 检查当前进程是否在指定的用户组grp中。是则返回1,否则返回0。 323 int in_group_p( 326 // �����ǰ���̵���Ч��ž���grp�����ʾ��������grp�����顣��������1��������� // 如果当前进程的有效组号就是grp,则表示进程属于grp进程组。函数返回1。否则就在 // ���̵ĸ����û���������ɨ���Ƿ��� grp ������š���������Ҳ����1����ɨ�赽ֵ // 进程的辅助用户组数组中扫描是否有 grp 进程组号。若有则函数也返回1。若扫描到值 // Ϊ
-NOGROUP �����ʾ��ɨ����ȫ����Ч���û�з���ƥ�����ţ���˺�������0�� // 为
+NOGROUP 的项,表示已扫描完全部有效项而没有发现匹配的组号,因此函数返回0。 327 if (grp == } 338 // utsname�ṹ����һЩ�ַ����ֶΡ����ڱ���ϵͳ�����ơ����а���5���ֶΣ��ֱ��ǣ� // utsname结构含有一些字符串字段。用于保存系统的名称。其中包含5个字段,分别是: // ��ǰ����ϵͳ�����ơ�����ڵ����ƣ�������������ǰ����ϵͳ���м��𡢲���ϵͳ�汾 // 当前操作系统的名称、网络节点名称(主机名)、当前操作系统发行级别、操作系统版本 // ���Լ�ϵͳ���е�Ӳ���������ơ��ýṹ������ include/sys/utsname.h �ļ��С� ���� // 号以及系统运行的硬件类型名称。该结构定义在 include/sys/utsname.h 文件中。 这里 // �ں�ʹ��
-include/linux/config.h �ļ��еij����������������ǵ�Ĭ��ֵ�����Ƿֱ�Ϊ // 内核使用
+include/linux/config.h 文件中的常数符号设置了它们的默认值。它们分别为 // ��Linux������(none)������0������0.12������i386���� // “Linux”,“(none)”,“0”,“0.12”,“i386”。 339 static struct utsname }; 342 // ��ȡϵͳ���Ƶ���Ϣ�� // 获取系统名称等信息。 343 int sys_uname(struct */ /* * ͨ������uname()ֻ��ʵ��sethostname��gethostname�� * 通过调用uname()只能实现sethostname和gethostname。 */ // ����ϵͳ��������ϵͳ������ڵ������� // 设置系统主机名(系统的网络节点名)。 // ����nameָ��ָ���û��������к����������ַ����Ļ�������len���������ַ������ȡ� // 参数name指针指向用户数据区中含有主机名字符串的缓冲区;len是主机名字符串长度。 357 int sys_sethostname(char
@@ -3486,8 +3486,8 @@ int i; 360 // ϵͳ������ֻ���ɳ����û����û��ģ��������������Ȳ��ܳ������MAXHOSTNAMELEN�� // 系统主机名只能由超级用户设置或修改,并且主机名长度不能超过最大长度MAXHOSTNAMELEN。 361 if (! 368 } // �ڸ�����Ϻ�����û��ṩ���ַ�����û�а���NULL�ַ�����ô�����Ƶ����������Ȼ�û�� // 在复制完毕后,如果用户提供的字符串中没有包含NULL字符,那么若复制的主机名长度还没有 // ����
-MAXHOSTNAMELEN�������������ַ���������һ��NULL�����Ѿ����� MAXHOSTNAMELEN���� // 超过
+MAXHOSTNAMELEN,则在主机名字符串后添加一个NULL。若已经填满 MAXHOSTNAMELEN个字 // ����������һ���ַ��ij�NULL�ַ�����thisname.nodename[min(i,MAXHOSTNAMELEN)]
-= 0�� // 符,则把最后一个字符改成NULL字符。即thisname.nodename[min(i,MAXHOSTNAMELEN)]
+= 0。 369 if ( } 374 // ȡ��ǰ����ָ����Դ�Ľ���ֵ�� // 取当前进程指定资源的界限值。 // ���̵�����ṹ�ж�����һ������rlim[RLIM_NLIMITS]�����ڿ��ƽ���ʹ��ϵͳ��Դ�Ľ��ޡ� // 进程的任务结构中定义有一个数组rlim[RLIM_NLIMITS],用于控制进程使用系统资源的界限。 // ����ÿ������һ��rlimit �ṹ�����а��������ֶΡ� һ��˵�����̶�ָ����Դ�ĵ�ǰ���� // 数组每个项是一个rlimit 结构,其中包含两个字段。 一个说明进程对指定资源的当前限制 // ���ޣ�soft
-limit���������ƣ�����һ��˵��ϵͳ��ָ����Դ��������ƽ��ޣ�hard limit�� // 界限(soft
+limit,即软限制),另一个说明系统对指定资源的最大限制界限(hard limit, // ��Ӳ���ƣ��� rlim[] �����ÿһ���Ӧϵͳ�Ե�ǰ����һ����Դ�Ľ�����Ϣ��Linux 0.12 // 即硬限制)。 rlim[] 数组的每一项对应系统对当前进程一种资源的界限信息。Linux 0.12 // ϵͳ����6����Դ�涨�˽��ޣ���RLIM_NLIMITS=6����ο�ͷ�ļ�include/sys/resource.h // 系统共对6种资源规定了界限,即RLIM_NLIMITS=6。请参考头文件include/sys/resource.h // �е�41 ��
-46�е�˵���� // 中第41 —
+46行的说明。 // ����
-resource ָ��������ѯ����Դ���ƣ�ʵ������������ṹ��rlim[]�����������ֵ�� // 参数
+resource 指定我们咨询的资源名称,实际上它是任务结构中rlim[]数组的索引项值。 // ����rlim��ָ��rlimit�ṹ���û�������ָ�룬���ڴ��ȡ�õ���Դ������Ϣ�� // 参数rlim是指向rlimit结构的用户缓冲区指针,用于存放取得的资源界限信息。 375 int sys_getrlimit(int
@@ -3587,14 +3587,14 @@ resource, struct rlimit *rlim) 376 { // ����ѯ����Դresourceʵ�����ǽ�������ṹ��rlim[]�����������ֵ��������ֵ��Ȼ���� // 所咨询的资源resource实际上是进程任务结构中rlim[]数组的索引项值。该索引值当然不能 // ���������������� RLIM_NLIMITS������֤�� rlim ָ����ָ�û������㹻�Ժ�����Ͱ� // 大于数组的最大项数 RLIM_NLIMITS。在验证过 rlim 指针所指用户缓冲足够以后,这里就把 // ����ָ������Դresource�ṹ��Ϣ���Ƶ��û������У�������0�� // 参数指定的资源resource结构信息复制到用户缓冲中,并返回0。 377 if (resource >= verify_area(rlim,sizeof *rlim); 380 put_fs_long(current->rlim[resource].rlim_cur,
- // ��ǰ����������ֵ�� 381
@@ -3620,7 +3620,7 @@ lang=EN-US> &nb
382 put_fs_long(current->rlim[resource].rlim_max,
- // ϵͳ��Ӳ������ֵ�� 383
@@ -3636,13 +3636,13 @@ lang=EN-US> } 386 // ���õ�ǰ����ָ����Դ�Ľ���ֵ�� // 设置当前进程指定资源的界限值。 // ����
-resource ָ���������ý�����Դ���ƣ�ʵ������������ṹ��rlim[]��������� // 参数
+resource 指定我们设置界限的资源名称,实际上它是任务结构中rlim[]数组的索引 // ��ֵ������rlim��ָ��rlimit�ṹ���û�������ָ�룬�����ں˶�ȡ�µ���Դ������Ϣ�� // 项值。参数rlim是指向rlimit结构的用户缓冲区指针,用于内核读取新的资源界限信息。 387 int sys_setrlimit(int
@@ -3658,23 +3658,23 @@ style='color:blue'>rlimit new, *old; 390 // �����жϲ���resource������ṹrlim[]������ֵ����Ч�ԡ�Ȼ������rlimit�ṹָ�� // 首先判断参数resource(任务结构rlim[]项索引值)有效性。然后先让rlimit结构指针 // oldָ��ָ��������ṹ��ָ����Դ�ĵ�ǰrlimit�ṹ��Ϣ�����Ű��û��ṩ����Դ���� // old指向指进程任务结构中指定资源的当前rlimit结构信息。接着把用户提供的资源界限 // ��Ϣ���Ƶ���ʱrlimit�ṹnew�С���ʱ����жϳ�new�ṹ�е�������ֵ��Ӳ����ֵ // 信息复制到临时rlimit结构new中。此时如果判断出new结构中的软界限值或硬界限值 // ���ڽ��̸���ԴԭӲ����ֵ�����ҵ�ǰ���dz����û��Ļ����ͷ������ɴ��������ʾ // 大于进程该资源原硬界限值,并且当前不是超级用户的话,就返回许可错。否则表示new // ����Ϣ�������߽����dz����û����̣�����ԭ����ָ����Դ��Ϣ����new�ṹ�е���Ϣ�� // 中信息合理或者进程是超级用户进程,则修改原进程指定资源信息等于new结构中的信息, // ���ɹ�����0�� // 并成功返回0。 391 if (resource >= EINVAL; 393 old = current->rlim + resource;
-// ��old = current->rlim[resource]�� 394 new.rlim_cur = */ /* * ��rusuage�ṹ�Ž�����ṹtask struct����ǡ���ģ���������ʹ���� * 把rusuage结构放进任务结构task struct中是恰当的,除非它会使任务 * �ṹ���ȱ�÷dz����ڰ�����ṹ�����ں�malloc������ڴ���֮�� * 结构长度变得非常大。在把任务结构移入内核malloc分配的内存中之后, * ��������ʹ����ṹ�ܴ�Ҳû�����ˡ��⽫ʹ��������Ϣ���ƶ���÷dz� * 这样做即使任务结构很大也没问题了。这将使得其余信息的移动变得非常 * ���㣡�����ǻ�û������������Ϊ���ǻ�û�в��Թ����ǵĴ�С���� * 方便!(我们还没有这样做,因为我们还没有测试过它们的大小)。 */ // ��ȡָ�����̵���Դ������Ϣ�� // 获取指定进程的资源利用信息。 // ��ϵͳ�����ṩ��ǰ���̻�������ֹ�ĺ͵ȴ��ŵ��ӽ�����Դʹ��������������who���� // 本系统调用提供当前进程或其已终止的和等待着的子进程资源使用情况。如果参数who等于 // RUSAGE_SELF���ص�ǰ���̵���Դ������Ϣ�����ָ������who �� RUSAGE_CHILDREN�� // RUSAGE_SELF,则返回当前进程的资源利用信息。如果指定进程who 是 RUSAGE_CHILDREN, // �ص�ǰ���̵�����ֹ�͵ȴ��ŵ��ӽ�����Դ������Ϣ��
-���ų���RUSAGE_SELF �� // 则返回当前进程的已终止和等待着的子进程资源利用信息。
+符号常数RUSAGE_SELF 和 // RUSAGE_CHILDREN �Լ� rusage�ṹ�������� include/sys/resource.hͷ�ļ��С� // RUSAGE_CHILDREN 以及 rusage结构都定义在 include/sys/resource.h头文件中。 412 int sys_getrusage(int who,
@@ -3800,14 +3800,14 @@ long *lp, *lpend, *dest; 416 // �����жϲ���ָ�����̵���Ч�ԡ����who�Ȳ���RUSAGE_SELF��ָ����ǰ���̣���Ҳ���� // 首先判断参数指定进程的有效性。如果who既不是RUSAGE_SELF(指定当前进程),也不是 // RUSAGE_CHILDREN ��ָ���ӽ��̣���������Ч�����뷵�ء���������֤��ָ��ru ָ������ // RUSAGE_CHILDREN (指定子进程),则以无效参数码返回。否则在验证了指针ru 指定的用 // �������������ʱ rusage�ṹ����r���㡣 // 户缓冲区域后,把临时 rusage结构区域r清零。 417 if (who != verify_area(ru, sizeof *ru); 420 memset((char *) &r, 0, sizeof(r));
-// ��include/strings.h���� // ������who
-��RUSAGE_SELF�����Ƶ�ǰ������Դ������Ϣ��r�ṹ�С���ָ������ // 若参数who
+是RUSAGE_SELF,则复制当前进程资源利用信息到r结构中。若指定进程who // ��RUSAGE_CHILDREN��
-���Ƶ�ǰ���̵�����ֹ�͵ȴ��ŵ��ӽ�����Դ������Ϣ����ʱ // 是RUSAGE_CHILDREN,
+则复制当前进程的已终止和等待着的子进程资源利用信息到临时 // rusuage�ṹr�С���CT_TO_SECS ��CT_TO_USECS���ڰ�ϵͳ��ǰ�����ת��������ֵ // rusuage结构r中。宏CT_TO_SECS 和CT_TO_USECS用于把系统当前嘀嗒数转换成用秒值 // ����ֵ��ʾ�����Ƕ����� include/linux/sched.h �ļ��С� jiffies_offset��ϵͳ // 加微秒值表示。它们定义在 include/linux/sched.h 文件中。 jiffies_offset是系统 // ��������������� // 嘀嗒数误差调整数。 421 if (who == current->cstime); 431 } // Ȼ����lpָ��ָ��r�ṹ��lpendָ��r�ṹĩβ������destָ��ָ���û��ռ��е�ru // 然后让lp指针指向r结构,lpend指向r结构末尾处,而dest指针指向用户空间中的ru // �ṹ������r����Ϣ���Ƶ��û��ռ�ru�ṹ�У�������0�� // 结构。最后把r中信息复制到用户空间ru结构中,并返回0。 432 lp = (unsigned long
@@ -3928,20 +3928,20 @@ lang=EN-US> } 439 // ȡ��ϵͳ��ǰʱ�䣬����ָ����ʽ���ء� // 取得系统当前时间,并用指定格式返回。 // timeval�ṹ��timezone�ṹ��������include/sys/time.h�ļ��С�timeval�ṹ������ // timeval结构和timezone结构都定义在include/sys/time.h文件中。timeval结构含有秒 // ���루tv_sec��tv_usec�������ֶΡ�timezone�ṹ���б��ؾ�������α�ʱ������ // 和微秒(tv_sec和tv_usec)两个字段。timezone结构含有本地距格林尼治标准时间以西 // �ķ�������tz_minuteswest��������ʱ��������ͣ�tz_dsttime�������ֶΡ� // 的分钟数(tz_minuteswest)和夏令时间调整类型(tz_dsttime)两个字段。 // ��dst
--- Daylight Savings Time�� // (dst
+-- Daylight Savings Time) 440 int sys_gettimeofday(struct timeval *tv, struct ti
441 { // �������������timeval�ṹָ�벻�գ����ڸýṹ�з��ص�ǰʱ�䣨��ֵ����ֵ���� // 如果参数给定的timeval结构指针不空,则在该结构中返回当前时间(秒值和微秒值); // ��������������û����ݿռ��� timezone�ṹ��ָ�벻�գ���Ҳ���ظýṹ����Ϣ�� // 如果参数给定的用户数据空间中 timezone结构的指针不空,则也返回该结构的信息。 // ������startup_time��ϵͳ����ʱ�䣨��ֵ����
-��CT_TO_SECS��CT_TO_USECS���� // 程序中startup_time是系统开机时间(秒值)。
+宏CT_TO_SECS和CT_TO_USECS用于 // ��ϵͳ��ǰ�����ת��������ֵ����ֵ��ʾ�����Ƕ����� // 把系统当前嘀嗒数转换成用秒值加微秒值表示。它们定义在include/linux/sched.h // �ļ��С�jiffies_offset��ϵͳ��������������� // 文件中。jiffies_offset是系统嘀嗒数误差调整数。 442 if (tv) { /* * �ڵ�1������ʱ����timezone��ʱ�����ǻ�ı�ʱ��ֵ����ϵͳʹ�ø��� * 在第1次设置时区(timezone)时,我们会改变时钟值以让系统使用格林 * ���α�ʱ�䣨GMT�����У�����ʹ�ñ���ʱ�䡣 �Ʋ�����˵�����ij�� * 尼治标准时间(GMT)运行,而非使用本地时间。 推测起来说,如果某人 * ������ʱ��ʱ�䣬��ô���Ǿ������ڳ���֪��ʱ��ʱ��Ļ����С�����ʱ * 设置了时区时间,那么我们就运行在程序知晓时区时间的环境中。设置时 * ������Ӧ����ϵͳ�����Σ��������/etc/rc�ű������н��С�����ʱ * 区操作应该在系统启动阶段,尽快地在/etc/rc脚本程序中进行。这样时 * �ӾͿ���������ȷ�� ����Ļ����������Ժ������ʱ��������ʱ��ʱ�� * 钟就可以设置正确。 否则的话,若我们以后才设置时区而导致时钟时间 * �ı䣬���ܻ���һЩ��������г������⡣ * 改变,可能会让一些程序的运行出现问题。 */ // ����ϵͳ��ǰʱ�䡣 // 设置系统当前时间。 // ����tv��ָ���û���������timeval�ṹ��Ϣ��ָ�롣����tz���û��������� // 参数tv是指向用户数据区中timeval结构信息的指针。参数tz是用户数据区中timezone // �ṹ��ָ�롣�ò�����Ҫ�����û�Ȩ�ޡ�������߽�Ϊ�գ���ʲôҲ��������������0�� // 结构的指针。该操作需要超级用户权限。如果两者皆为空,则什么也不做,函数返回0。 466 int sys_settimeofday(struct adjust_clock(); 470 // ����ϵͳ��ǰʱ����Ҫ�����û�Ȩ�ޡ����tzָ�벻�գ�������ϵͳʱ����Ϣ���������û� // 设置系统当前时间需要超级用户权限。如果tz指针不空,则设置系统时区信息。即复制用户 // timezone�ṹ��Ϣ��ϵͳ�е� sys_tz�ṹ�У�����24�У�������ǵ�1�ε��ñ�ϵͳ���� // timezone结构信息到系统中的 sys_tz结构中(见第24行)。如果是第1次调用本系统调用 // ���Ҳ���tvָ�벻�գ������ϵͳʱ��ֵ�� // 并且参数tv指针不空,则调整系统时钟值。 471 if (! &nb
481 } // ���������timeval�ṹָ��tv���գ����øýṹ��Ϣ����ϵͳʱ�ӡ����ȴ�tv��ָ�� // 如果参数的timeval结构指针tv不空,则用该结构信息设置系统时钟。首先从tv所指处 // ��ȡ����ֵ��sec������ֵ��usec����ʾ��ϵͳʱ�䣬Ȼ������ֵ��ϵͳ����ʱ��ȫ�� // 获取以秒值(sec)加微秒值(usec)表示的系统时间,然后用秒值修改系统开机时间全局 // ����startup_timeֵ��������ֵ����ϵͳ������ֵjiffies_offset�� // 变量startup_time值,并用微秒值设置系统嘀嗒误差值jiffies_offset。 482 if (tv) { /* * �Ѵ�CMOS�ж�ȡ��ʱ��ֵ����ΪGMTʱ��ֵ���棬���DZ���ʱ��ֵ�� * 把从CMOS中读取的时间值调整为GMT时间值保存,而非本地时间值。 * * ��������������ţ���Ҫ�����������á��������Ǿ���Ҫдһ���������� * 这里的做法很蹩脚,但要比其他方法好。否则我们就需要写一个程序并让它 * ��/etc/rc��������������£�����ð�Ÿó�����ܻᱻ���ִ�ж������� * 在/etc/rc中运行来做这件事(并且冒着该程序可能会被多次执行而带来的 * ���⡣ ����������Ҳ�����ó����ʱ�Ӿ�ȷ�ص���nСʱ�� ���߰�ʱ���� * 问题。 而且这样做也很难让程序把时钟精确地调整n小时) 或者把时区信 * Ϣ������ں��С���Ȼ�������ͷdz����dz���� * 息编译进内核中。当然这样做就非常、非常差劲了... * * Ŀǰ���溯����XXX���ĵ���������û�п��ǵ�����ʱ���⡣����BIOS�ж� * 目前下面函数(XXX)的调整操作并没有考虑到夏令时问题。依据BIOS有多 * ô���ܣ�������Ҳ�������Ͳ��ÿ����ⷽ�档��Ȼ����õ���������ȫ�� * 么智能(愚蠢?)也许根本就不用考虑这方面。当然,最好的做法是完全不 * ������CMOSʱ�ӣ�������ϵͳͨ��NTP������ʱ��Э�飩����timed��ʱ�� * 依赖于CMOS时钟,而是让系统通过NTP(网络时钟协议)或者timed(时间 * �����������ʱ�䣬��������������Ļ�...��
-- TYT�� * 服务器)获得时间,如果机器联上网的话...。
+- TYT,1/1/92 */ // ��ϵͳ����ʱ�����Ϊ��GMTΪ����ʱ�䡣 // 把系统启动时间调整为以GMT为标准的时间。 // startup_time����ֵ�����������Ҫ��ʱ������ֵ����60�� // startup_time是秒值,因此这里需要把时区分钟值乘上60。 510 void adjust_clock() 514 // ���õ�ǰ���̴����ļ�����������Ϊmask & 0777��������ԭ�����롣 // 设置当前进程创建文件属性屏蔽码为mask & 0777。并返回原屏蔽码。 515 int sys_umask(int mask)