2982 lines
112 KiB
HTML
2982 lines
112 KiB
HTML
<html>
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
|
|
<meta name=Generator content="Microsoft Word 14 (filtered)">
|
|
|
|
<style>
|
|
<!--
|
|
/* Font Definitions */
|
|
@font-face
|
|
{font-family:Wingdings;
|
|
panose-1:5 0 0 0 0 0 0 0 0 0;}
|
|
@font-face
|
|
{font-family:宋体;
|
|
panose-1:2 1 6 0 3 1 1 1 1 1;}
|
|
@font-face
|
|
{font-family:黑体;
|
|
panose-1:2 1 6 9 6 1 1 1 1 1;}
|
|
@font-face
|
|
{font-family:黑体;
|
|
panose-1:2 1 6 9 6 1 1 1 1 1;}
|
|
@font-face
|
|
{font-family:方正小标宋简体;}
|
|
@font-face
|
|
{font-family:"\@黑体";
|
|
panose-1:2 1 6 9 6 1 1 1 1 1;}
|
|
@font-face
|
|
{font-family:"\@宋体";
|
|
panose-1:2 1 6 0 3 1 1 1 1 1;}
|
|
@font-face
|
|
{font-family:"\@方正小标宋简体";}
|
|
/* Style Definitions */
|
|
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
|
{margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.5pt;
|
|
font-family:宋体;}
|
|
h1
|
|
{mso-style-link:"标题 1 Char";
|
|
margin-top:17.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:16.5pt;
|
|
margin-left:7.2pt;
|
|
text-align:center;
|
|
text-indent:-7.2pt;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
h2
|
|
{mso-style-link:"标题 2 Char";
|
|
margin-top:13.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:13.0pt;
|
|
margin-left:0cm;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:0cm;
|
|
page-break-after:avoid;
|
|
font-size:16.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
h3
|
|
{mso-style-link:"标题 3 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:0cm;
|
|
page-break-after:avoid;
|
|
font-size:14.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
h4
|
|
{mso-style-link:"标题 4 Char";
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:28.8pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-28.8pt;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
h5
|
|
{mso-style-link:"标题 5 Char";
|
|
margin-top:14.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:14.5pt;
|
|
margin-left:36.0pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-36.0pt;
|
|
line-height:156%;
|
|
page-break-after:avoid;
|
|
font-size:14.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
h6
|
|
{mso-style-link:"标题 6 Char";
|
|
margin-top:12.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:3.2pt;
|
|
margin-left:43.2pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-43.2pt;
|
|
line-height:133%;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
|
|
{mso-style-link:"标题 7 Char";
|
|
margin-top:12.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:3.2pt;
|
|
margin-left:50.4pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-50.4pt;
|
|
line-height:133%;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
|
|
{mso-style-link:"标题 8 Char";
|
|
margin-top:12.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:3.2pt;
|
|
margin-left:57.6pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-72.0pt;
|
|
line-height:133%;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
|
|
{mso-style-link:"标题 9 Char";
|
|
margin-top:12.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:3.2pt;
|
|
margin-left:64.8pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-79.2pt;
|
|
line-height:133%;
|
|
page-break-after:avoid;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:10.5pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:31.5pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:42.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:52.5pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:63.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:73.5pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:84.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:94.5pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-10.5pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc1, li.MsoToc1, div.MsoToc1
|
|
{margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.MsoToc2, li.MsoToc2, div.MsoToc2
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc3, li.MsoToc3, div.MsoToc3
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:42.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc4, li.MsoToc4, div.MsoToc4
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:31.5pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc5, li.MsoToc5, div.MsoToc5
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:42.0pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc6, li.MsoToc6, div.MsoToc6
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:52.5pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc7, li.MsoToc7, div.MsoToc7
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:63.0pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc8, li.MsoToc8, div.MsoToc8
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:73.5pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoToc9, li.MsoToc9, div.MsoToc9
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:84.0pt;
|
|
margin-bottom:.0001pt;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
|
|
{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";
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
layout-grid-mode:char;
|
|
border:none;
|
|
padding:0cm;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoFooter, li.MsoFooter, div.MsoFooter
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoCaption, li.MsoCaption, div.MsoCaption
|
|
{margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.MsoTof, li.MsoTof, div.MsoTof
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:42.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.MsoFootnoteReference
|
|
{vertical-align:super;}
|
|
p.MsoList, li.MsoList, div.MsoList
|
|
{margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoList2, li.MsoList2, div.MsoList2
|
|
{margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoList4, li.MsoList4, div.MsoList4
|
|
{margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.MsoDate, li.MsoDate, div.MsoDate
|
|
{mso-style-link:"日期 Char";
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:5.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
a:link, span.MsoHyperlink
|
|
{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";
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
font-size:12.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
tt
|
|
{font-family:黑体;}
|
|
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.1, li.1, div.1
|
|
{mso-style-name:样式1;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.a, li.a, div.a
|
|
{mso-style-name:代码程序;
|
|
mso-style-link:"代码程序 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
font-size:10.0pt;
|
|
font-family:宋体;}
|
|
span.Char
|
|
{mso-style-name:"代码程序 Char";
|
|
mso-style-link:代码程序;
|
|
font-family:宋体;}
|
|
p.a0, li.a0, div.a0
|
|
{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:宋体;}
|
|
p.0, li.0, div.0
|
|
{mso-style-name:封面0;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:36.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.10, li.10, div.10
|
|
{mso-style-name:封面1;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:18.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.11, li.11, div.11
|
|
{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-weight:bold;}
|
|
p.a1, li.a1, div.a1
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
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:宋体;}
|
|
p.post, li.post, div.post
|
|
{mso-style-name:邮件post;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:right;
|
|
line-height:11.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.3, li.3, div.3
|
|
{mso-style-name:图中字体3;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.3CharChar1CharCharChar
|
|
{mso-style-name:"图中文字3 Char Char1 Char Char Char";
|
|
font-family:宋体;}
|
|
span.3CharChar1CharChar
|
|
{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";
|
|
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:宋体;}
|
|
p.5CharChar0, li.5CharChar0, div.5CharChar0
|
|
{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:宋体;}
|
|
p.5Char0, li.5Char0, div.5Char0
|
|
{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号;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
layout-grid-mode:char;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.2, li.2, div.2
|
|
{mso-style-name:代码程序2;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
font-size:10.0pt;
|
|
font-family:宋体;}
|
|
p.20, li.20, div.20
|
|
{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;
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
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:宋体;}
|
|
p.a2, li.a2, div.a2
|
|
{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";
|
|
margin-right:0cm;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
span.1Char
|
|
{mso-style-name:"标题 1 Char";
|
|
mso-style-link:"标题 1";
|
|
font-weight:bold;}
|
|
p.22, li.22, div.22
|
|
{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;
|
|
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号;
|
|
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;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.12, li.12, div.12
|
|
{mso-style-name:代码程序1;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
font-size:10.0pt;
|
|
font-family:宋体;}
|
|
p.13, li.13, div.13
|
|
{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;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:36.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.112, li.112, div.112
|
|
{mso-style-name:封面11;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:18.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.113, li.113, div.113
|
|
{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-weight:bold;}
|
|
p.14, li.14, div.14
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
font-size:8.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.post1, li.post1, div.post1
|
|
{mso-style-name:邮件post1;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:right;
|
|
line-height:11.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.31, li.31, div.31
|
|
{mso-style-name:图中字体31;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.5Char1, li.5Char1, div.5Char1
|
|
{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";
|
|
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";
|
|
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;
|
|
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;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.02, li.02, div.02
|
|
{mso-style-name:封面02;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:36.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.121, li.121, div.121
|
|
{mso-style-name:封面12;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:18.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.122, li.122, div.122
|
|
{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-weight:bold;}
|
|
p.3Char2, li.3Char2, div.3Char2
|
|
{mso-style-name:"图中文字3 Char2";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
font-size:8.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.post2, li.post2, div.post2
|
|
{mso-style-name:邮件post2;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:right;
|
|
line-height:11.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.32, li.32, div.32
|
|
{mso-style-name:图中字体32;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.5Char2, li.5Char2, div.5Char2
|
|
{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;
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
font-size:8.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.130, li.130, div.130
|
|
{mso-style-name:样式13;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.30, li.30, div.30
|
|
{mso-style-name:代码程序3;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
font-size:10.0pt;
|
|
font-family:宋体;}
|
|
p.03, li.03, div.03
|
|
{mso-style-name:封面03;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:36.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.131, li.131, div.131
|
|
{mso-style-name:封面13;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:18.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.132, li.132, div.132
|
|
{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-weight:bold;}
|
|
p.33, li.33, div.33
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
font-size:8.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.post3, li.post3, div.post3
|
|
{mso-style-name:邮件post3;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:right;
|
|
line-height:11.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.330, li.330, div.330
|
|
{mso-style-name:图中字体33;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.5Char20, li.5Char20, div.5Char20
|
|
{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";
|
|
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";
|
|
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;
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:9.0pt;
|
|
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:宋体;}
|
|
p.54, li.54, div.54
|
|
{mso-style-name:图中文字小5紧密;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
line-height:9.0pt;
|
|
text-autospace:ideograph-numeric;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.24, li.24, div.24
|
|
{mso-style-name:居中2号粗宋体;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.15, li.15, div.15
|
|
{mso-style-name:"样式 标题 1 + 居中";
|
|
margin-top:17.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:16.5pt;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.25, li.25, div.25
|
|
{mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
|
|
margin-top:13.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:13.0pt;
|
|
margin-left:28.9pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-28.9pt;
|
|
page-break-after:avoid;
|
|
font-size:16.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
span.2Char
|
|
{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;
|
|
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;
|
|
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;
|
|
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;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.0pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.41, li.41, div.41
|
|
{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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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";
|
|
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:宋体;}
|
|
p.134, li.134, div.134
|
|
{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;
|
|
margin-top:13.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:13.0pt;
|
|
margin-left:0cm;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
page-break-after:avoid;
|
|
font-size:16.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
p.36, li.36, div.36
|
|
{mso-style-name:附录3;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
page-break-after:avoid;
|
|
font-size:14.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
span.3Char0
|
|
{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;
|
|
margin-top:17.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:16.5pt;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.17, li.17, div.17
|
|
{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;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
span.4Char
|
|
{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:附录图说明;
|
|
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;
|
|
margin-top:13.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:13.0pt;
|
|
margin-left:28.8pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
text-indent:-28.8pt;
|
|
page-break-after:avoid;
|
|
font-size:16.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
p.a4, li.a4, div.a4
|
|
{mso-style-name:参考标题;
|
|
margin-top:7.8pt;
|
|
margin-right:0cm;
|
|
margin-bottom:7.8pt;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.18, li.18, div.18
|
|
{mso-style-name:索引标题1;
|
|
margin-top:7.8pt;
|
|
margin-right:0cm;
|
|
margin-bottom:7.8pt;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.19, li.19, div.19
|
|
{mso-style-name:列表1;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.25pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.25pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.1a, li.1a, div.1a
|
|
{mso-style-name:表1;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.25pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.25pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.37, li.37, div.37
|
|
{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号;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
layout-grid-mode:char;
|
|
font-size:7.5pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.a5, li.a5, div.a5
|
|
{mso-style-name:正文代码;
|
|
mso-style-link:"正文代码 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char1
|
|
{mso-style-name:"正文代码 Char";
|
|
mso-style-link:正文代码;
|
|
font-family:宋体;}
|
|
p.43, li.43, div.43
|
|
{mso-style-name:"样式 标题 4 +";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
page-break-after:avoid;
|
|
font-size:12.0pt;
|
|
font-family:"Arial","sans-serif";
|
|
font-weight:bold;}
|
|
p.140, li.140, div.140
|
|
{mso-style-name:表14;
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.25pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.25pt;
|
|
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";
|
|
margin-top:0cm;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:21.25pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
text-indent:-21.25pt;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.14Char
|
|
{mso-style-name:"图说明14 Char";
|
|
mso-style-link:图说明14;
|
|
font-family:宋体;}
|
|
p.a6, li.a6, div.a6
|
|
{mso-style-name:文件目录表;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.a7, li.a7, div.a7
|
|
{mso-style-name:"样式 正文 +";
|
|
mso-style-link:"样式 正文 + Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char2
|
|
{mso-style-name:"样式 正文 + Char";
|
|
mso-style-link:"样式 正文 +";
|
|
font-family:"Times New Roman","serif";}
|
|
p.a8, li.a8, div.a8
|
|
{mso-style-name:表格题注;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.5pt;
|
|
font-family:宋体;}
|
|
p.a9, li.a9, div.a9
|
|
{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:图题注;
|
|
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:程序题注;
|
|
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:框中文字;
|
|
margin-top:0cm;
|
|
margin-right:21.0pt;
|
|
margin-bottom:0cm;
|
|
margin-left:21.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
border:none;
|
|
padding:0cm;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.125, li.125, div.125
|
|
{mso-style-name:"样式 标题 1 + 居中2";
|
|
margin-top:17.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:16.5pt;
|
|
margin-left:0cm;
|
|
text-align:center;
|
|
page-break-after:avoid;
|
|
font-size:22.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.ad, li.ad, div.ad
|
|
{mso-style-name:"样式 题注 + 宋体 五号 居中";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.5pt;
|
|
font-family:黑体;}
|
|
p.1b, li.1b, div.1b
|
|
{mso-style-name:序标题1;
|
|
margin-top:17.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:16.5pt;
|
|
margin-left:0cm;
|
|
line-height:240%;
|
|
page-break-after:avoid;
|
|
font-size:16.0pt;
|
|
font-family:"Times New Roman","serif";
|
|
font-weight:bold;}
|
|
p.38, li.38, div.38
|
|
{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:方正小标宋简体;}
|
|
p.63, li.63, div.63
|
|
{mso-style-name:表中文字6号;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:7.5pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.64, li.64, div.64
|
|
{mso-style-name:图中文字6号左对齐;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
line-height:10.0pt;
|
|
layout-grid-mode:char;
|
|
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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
line-height:10.0pt;
|
|
layout-grid-mode:char;
|
|
font-size:7.5pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.6Char
|
|
{mso-style-name:"图中文字6号 Char";
|
|
mso-style-link:图中文字6号;
|
|
font-family:宋体;}
|
|
p.ae, li.ae, div.ae
|
|
{mso-style-name:图标;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.28, li.28, div.28
|
|
{mso-style-name:图标2;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.af, li.af, div.af
|
|
{mso-style-name:习题标题;
|
|
margin-top:6.0pt;
|
|
margin-right:0cm;
|
|
margin-bottom:0cm;
|
|
margin-left:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
page-break-after:avoid;
|
|
font-size:14.0pt;
|
|
font-family:黑体;}
|
|
p.1c, li.1c, div.1c
|
|
{mso-style-name:部分编号1;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:16.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.af0, li.af0, div.af0
|
|
{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:"样式 题注 + 居中";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.ListTitle, li.ListTitle, div.ListTitle
|
|
{mso-style-name:ListTitle;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.FigureTitle, li.FigureTitle, div.FigureTitle
|
|
{mso-style-name:FigureTitle;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.TableTitle, li.TableTitle, div.TableTitle
|
|
{mso-style-name:TableTitle;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.ProgramTitle, li.ProgramTitle, div.ProgramTitle
|
|
{mso-style-name:ProgramTitle;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:center;
|
|
font-size:10.0pt;
|
|
font-family:"Arial","sans-serif";}
|
|
p.RightText, li.RightText, div.RightText
|
|
{mso-style-name:RightText;
|
|
margin-top:0cm;
|
|
margin-right:21.0pt;
|
|
margin-bottom:0cm;
|
|
margin-left:42.0pt;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
border:none;
|
|
padding:0cm;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.af2, li.af2, div.af2
|
|
{mso-style-name:表中文字小五;
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:9.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
p.af3, li.af3, div.af3
|
|
{mso-style-name:关键词;
|
|
mso-style-link:"关键词 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char3
|
|
{mso-style-name:"关键词 Char";
|
|
mso-style-link:关键词;
|
|
font-family:宋体;}
|
|
p.af4, li.af4, div.af4
|
|
{mso-style-name:文件名;
|
|
mso-style-link:"文件名 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char4
|
|
{mso-style-name:"文件名 Char";
|
|
mso-style-link:文件名;
|
|
font-family:宋体;}
|
|
p.af5, li.af5, div.af5
|
|
{mso-style-name:选项;
|
|
mso-style-link:"选项 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char5
|
|
{mso-style-name:"选项 Char";
|
|
mso-style-link:选项;
|
|
font-family:宋体;}
|
|
p.af6, li.af6, div.af6
|
|
{mso-style-name:命令行;
|
|
mso-style-link:"命令行 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char6
|
|
{mso-style-name:"命令行 Char";
|
|
mso-style-link:命令行;
|
|
font-family:宋体;}
|
|
p.af7, li.af7, div.af7
|
|
{mso-style-name:函数名;
|
|
mso-style-link:"函数名 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char7
|
|
{mso-style-name:"函数名 Char";
|
|
mso-style-link:函数名;
|
|
font-family:宋体;}
|
|
p.af8, li.af8, div.af8
|
|
{mso-style-name:寄存器名;
|
|
mso-style-link:"寄存器名 Char";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char8
|
|
{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";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
text-align:justify;
|
|
text-justify:inter-ideograph;
|
|
font-size:10.0pt;
|
|
font-family:"Times New Roman","serif";}
|
|
span.Char9
|
|
{mso-style-name:"变量名 Char";
|
|
mso-style-link:变量名;
|
|
font-family:宋体;}
|
|
p.58, li.58, div.58
|
|
{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号靠左;
|
|
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 厘米";
|
|
margin:0cm;
|
|
margin-bottom:.0001pt;
|
|
layout-grid-mode:char;
|
|
font-size:10.0pt;
|
|
font-family:宋体;}
|
|
span.5Char4
|
|
{mso-style-name:"标题 5 Char";
|
|
mso-style-link:"标题 5";
|
|
font-weight:bold;}
|
|
span.6Char0
|
|
{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";
|
|
font-weight:bold;}
|
|
span.8Char
|
|
{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";
|
|
font-family:"Arial","sans-serif";}
|
|
span.Chara
|
|
{mso-style-name:"脚注文本 Char";
|
|
mso-style-link:脚注文本;
|
|
font-family:宋体;}
|
|
span.Charb
|
|
{mso-style-name:"批注文字 Char";
|
|
mso-style-link:批注文字;
|
|
font-family:宋体;}
|
|
span.Charc
|
|
{mso-style-name:"页眉 Char";
|
|
mso-style-link:页眉;
|
|
font-family:宋体;}
|
|
span.Chard
|
|
{mso-style-name:"页脚 Char";
|
|
mso-style-link:页脚;
|
|
font-family:宋体;}
|
|
span.Chare
|
|
{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:宋体;}
|
|
span.Charf
|
|
{mso-style-name:"批注主题 Char";
|
|
mso-style-link:批注主题;
|
|
font-family:宋体;
|
|
font-weight:bold;}
|
|
span.Charf0
|
|
{mso-style-name:"批注框文本 Char";
|
|
mso-style-link:批注框文本;
|
|
font-family:宋体;}
|
|
.MsoChpDefault
|
|
{font-size:10.0pt;}
|
|
/* Page Definitions */
|
|
@page WordSection1
|
|
{size:595.3pt 841.9pt;
|
|
margin:72.0pt 54.0pt 72.0pt 54.0pt;
|
|
layout-grid:15.6pt;}
|
|
div.WordSection1
|
|
{page:WordSection1;}
|
|
/* List Definitions */
|
|
ol
|
|
{margin-bottom:0cm;}
|
|
ul
|
|
{margin-bottom:0cm;}
|
|
-->
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body lang=ZH-CN link=blue vlink=purple style='text-justify-trim:punctuation'>
|
|
|
|
<div class=WordSection1 style='layout-grid:15.6pt'>
|
|
|
|
<p class=ab><a name="_Toc56863289"></a><a name="_Toc53320697"><span
|
|
style='font-family:黑体'>程序</span><span lang=EN-US>15-7 linux/lib/malloc.c</span></a></p>
|
|
|
|
<div class=a align=center style='text-align:center'><span lang=EN-US>
|
|
|
|
<hr size=4 width="100%" align=center>
|
|
|
|
</span></div>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>1</span></u> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>2</span></u> <b><i> *
|
|
malloc.c --- a general purpose kernel memory allocator for Linux.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>3</span></u> <b><i> *
|
|
</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>4</span></u> <b><i> *
|
|
Written by Theodore Ts'o (tytso@mit.edu), 11/29/91</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>5</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>6</span></u> <b><i> *
|
|
This routine is written to be as fast as possible, so that it</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>7</span></u> <b><i> *
|
|
can be called from the interrupt level.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>8</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>9</span></u> <b><i> *
|
|
Limitations: maximum size of memory we can allocate using this routine</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>10</span></u> <b><i> *
|
|
is 4k, the size of a page in Linux.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>11</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>12</span></u> <b><i> *
|
|
The general game plan is that each page (called a bucket) will only hold</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>13</span></u> <b><i> *
|
|
objects of a given size. When all of the object on a page are released,</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>14</span></u> <b><i> *
|
|
the page can be returned to the general free pool. When malloc() is</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>15</span></u> <b><i> *
|
|
called, it looks for the smallest bucket size which will fulfill its</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>16</span></u> <b><i> *
|
|
request, and allocate a piece of memory from that bucket pool.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>17</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>18</span></u> <b><i> *
|
|
Each bucket has as its control block a bucket descriptor which keeps </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>19</span></u> <b><i> *
|
|
track of how many objects are in use on that page, and the free list</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>20</span></u> <b><i> *
|
|
for that page. Like the buckets themselves, bucket descriptors are</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>21</span></u> <b><i> *
|
|
stored on pages requested from get_free_page(). However, unlike buckets,</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>22</span></u> <b><i> *
|
|
pages devoted to bucket descriptor pages are never released back to the</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>23</span></u> <b><i> *
|
|
system. Fortunately, a system should probably only need 1 or 2 bucket</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>24</span></u> <b><i> *
|
|
descriptor pages, since a page can hold 256 bucket descriptors (which</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>25</span></u> <b><i> *
|
|
corresponds to 1 megabyte worth of bucket pages.) If the kernel is using </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>26</span></u> <b><i> *
|
|
that much allocated memory, it's probably doing something wrong. :-)</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>27</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>28</span></u> <b><i> *
|
|
Note: malloc() and free() both call get_free_page() and free_page()</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>29</span></u> <b><i> *
|
|
in sections of code where interrupts are turned off, to allow</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>30</span></u> <b><i> *
|
|
malloc() and free() to be safely called from an interrupt routine.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>31</span></u> <b><i> *
|
|
(We will probably need this functionality when networking code,</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>32</span></u> <b><i> *
|
|
particularily things like NFS, is added to Linux.) However, this</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>33</span></u> <b><i> *
|
|
presumes that get_free_page() and free_page() are interrupt-level</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>34</span></u> <b><i> *
|
|
safe, which they may not be once paging is added. If this is the</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>35</span></u> <b><i> *
|
|
case, we will need to modify malloc() to keep a few unused pages</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>36</span></u> <b><i> *
|
|
"pre-allocated" so that it can safely draw upon those pages if</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>37</span></u> <b><i> *
|
|
it is called from an interrupt routine.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>38</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>39</span></u> <b><i> *
|
|
Another concern is that get_free_page() should not sleep; if it </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>40</span></u> <b><i> *
|
|
does, the code is carefully ordered so as to avoid any race </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>41</span></u> <b><i> *
|
|
conditions. The catch is that if malloc() is called re-entrantly, </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>42</span></u> <b><i> *
|
|
there is a chance that unecessary pages will be grabbed from the </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>43</span></u> <b><i> *
|
|
system. Except for the pages for the bucket descriptor page, the </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>44</span></u> <b><i> *
|
|
extra pages will eventually get released back to the system, though,</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>45</span></u> <b><i> *
|
|
so it isn't all that bad.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>46</span></u> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>47</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * malloc.c
|
|
- Linux</span>的通用内核内存分配函数。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>由<span
|
|
lang=EN-US>Theodore Ts'o</span>编制<span lang=EN-US> (tytso@mit.edu), 11/29/91</span></p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>该函数被编写成尽可能地快,从而可以从中断层调用此函数。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>限制:使用该函数一次所能分配的最大内存是<span
|
|
lang=EN-US>4k</span>,也即<span lang=EN-US>Linux</span>中内存页面的大小。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>编写该函数所遵循的一般规则是每页<span
|
|
lang=EN-US>(</span>被称为一个存储桶<span lang=EN-US>)</span>仅分配所要容纳对象的大小。</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>当一页上的所有对象都释放后,该页就可以返回通用空闲内存池。当<span
|
|
lang=EN-US>malloc()</span>被调用</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>时,它会寻找满足要求的最小的存储桶,并从该存储桶中分配一块内存。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>每个存储桶都有一个作为其控制用的存储桶描述符,其中记录了页面上有多少对象正被</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>使用以及该页上空闲内存的列表。就象存储桶自身一样,存储桶描述符也是存储在使用</p>
|
|
|
|
<p class=a><span lang=EN-US> * get_free_page()</span>申请到的页面上的,但是与存储桶不同的是,桶描述符所占用的页面</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>将不再会释放给系统。幸运的是一个系统大约只需要<span
|
|
lang=EN-US>1</span>到<span lang=EN-US>2</span>页的桶描述符页面,因为一</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>个页面可以存放<span
|
|
lang=EN-US>256</span>个桶描述符<span lang=EN-US>(</span>对应<span lang=EN-US>1MB</span>内存的存储桶页面<span
|
|
lang=EN-US>)</span>。如果系统为桶描述符分</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>配了许多内存,那么肯定系统什么地方出了问题<span
|
|
lang=EN-US style='font-family:Wingdings'>J</span>。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>注意!<span
|
|
lang=EN-US>malloc()</span>和<span lang=EN-US>free()</span>两者关闭了中断的代码部分都调用了<span
|
|
lang=EN-US>get_free_page()</span>和</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* free_page()</span>函数,以使<span lang=EN-US>malloc()</span>和<span
|
|
lang=EN-US>free()</span>可以安全地被从中断程序中调用</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* (</span>当网络代码,尤其是<span lang=EN-US>NFS</span>等被加入到<span
|
|
lang=EN-US>Linux</span>中时就可能需要这种功能<span lang=EN-US>)</span>。但前</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>提是假设<span lang=EN-US>get_free_page()</span>和<span
|
|
lang=EN-US>free_page()</span>是可以安全地在中断级程序中使用的,</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>这在一旦加入了分页处理之后就可能不是安全的。如果真是这种情况,那么我们</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>就需要修改<span lang=EN-US>malloc()</span>来“预先分配”几页不用的内存,如果<span
|
|
lang=EN-US>malloc()</span>和<span lang=EN-US>free()</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>被从中断程序中调用时就可以安全地使用这些页面。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>另外需要考虑到的是<span lang=EN-US>get_free_page()</span>不应该睡眠;如果会睡眠的话,则为了防止</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>任何竞争条件,代码需要仔细地安排顺序。 关键在于如果<span
|
|
lang=EN-US>malloc()</span>是可以重入地</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>被调用的话,那么就会存在不必要的页面被从系统中取走的机会。除了用于桶描述</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>符的页面,这些额外的页面最终会释放给系统,所以并不是象想象的那样不好。</p>
|
|
|
|
<p class=a><span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>48</span></u>
|
|
#include <linux/kernel.h> // </span>内核头文件。含有一些内核常用函数的原形定义。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>49</span></u>
|
|
#include <linux/mm.h> // </span>内存管理头文件。含有页面大小定义和一些页面释放函数原型。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>50</span></u>
|
|
#include <asm/system.h> // </span>系统头文件。定义了设置或修改描述符<span
|
|
lang=EN-US>/</span>中断门等的嵌入式汇编宏。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>51</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>存储桶描述符结构。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>52</span></u>
|
|
struct <u><span style='color:blue'>bucket_desc</span></u> { <b><i>/*
|
|
16 bytes */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>53</span></u>
|
|
void
|
|
*page; // </span>该桶描述符对应的内存页面指针。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>54</span></u>
|
|
struct <u><span style='color:blue'>bucket_desc</span></u>
|
|
*next; // </span>下一个描述符指针。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>55</span></u>
|
|
void
|
|
*freeptr; // </span>指向本桶中空闲内存位置的指针。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>56</span></u>
|
|
unsigned short refcnt;
|
|
// </span>引用计数。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>57</span></u>
|
|
unsigned short
|
|
bucket_size; // </span>本描述符对应存储桶的大小。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>58</span></u> };</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>59</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>存储桶描述符目录结构。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>60</span></u>
|
|
struct <u><span style='color:blue'>_bucket_dir</span></u> { <b><i>/*
|
|
8 bytes */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>61</span></u>
|
|
int
|
|
size; // </span>该存储桶的大小<span lang=EN-US>(</span>字节数<span
|
|
lang=EN-US>)</span>。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>62</span></u>
|
|
struct <u><span style='color:blue'>bucket_desc</span></u>
|
|
*chain; // </span>该存储桶目录项的桶描述符链表指针。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>63</span></u> };</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>64</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>65</span></u> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>66</span></u> <b><i> *
|
|
The following is the where we store a pointer to the first bucket</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>67</span></u> <b><i> *
|
|
descriptor for a given size. </i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>68</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>69</span></u> <b><i> *
|
|
If it turns out that the Linux kernel allocates a lot of objects of a</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>70</span></u> <b><i> *
|
|
specific size, then we may want to add that specific size to this list,</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>71</span></u> <b><i> *
|
|
since that will allow the memory to be allocated more efficiently.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>72</span></u> <b><i> *
|
|
However, since an entire page must be dedicated to each specific size</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>73</span></u> <b><i> *
|
|
on this list, some amount of temperance must be exercised here.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>74</span></u> <b><i> *</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>75</span></u> <b><i> *
|
|
Note that this list *must* be kept in order.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>76</span></u> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>下面是我们存放第一个给定大小存储桶描述符指针的地方。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>如果<span
|
|
lang=EN-US>Linux</span>内核分配了许多指定大小的对象,那么我们就希望将该指定的大小加到</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>该列表<span
|
|
lang=EN-US>(</span>链表<span lang=EN-US>)</span>中,因为这样可以使内存的分配更有效。但是,因为一页完整内存页面</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>必须用于列表中指定大小的所有对象,所以需要做总数方面的测试操作。</p>
|
|
|
|
<p class=a><span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>存储桶目录列表<span
|
|
lang=EN-US>(</span>数组<span lang=EN-US>)</span>。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>77</span></u>
|
|
struct <u><span style='color:blue'>_bucket_dir</span></u> <u><span
|
|
style='color:blue'>bucket_dir</span></u>[] = {</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>78</span></u>
|
|
{ 16, (struct <u><span style='color:blue'>bucket_desc</span></u> *)
|
|
0}, // 16</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>79</span></u>
|
|
{ 32, (struct <u><span style='color:blue'>bucket_desc</span></u> *)
|
|
0}, // 32</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>80</span></u>
|
|
{ 64, (struct <u><span style='color:blue'>bucket_desc</span></u> *)
|
|
0}, // 64</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>81</span></u>
|
|
{ 128, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 128</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>82</span></u>
|
|
{ 256, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 256</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>83</span></u>
|
|
{ 512, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 512</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>84</span></u>
|
|
{ 1024, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 1024</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>85</span></u>
|
|
{ 2048, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 2048</span>字节长度的内存块。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>86</span></u>
|
|
{ 4096, (struct <u><span style='color:blue'>bucket_desc</span></u> *) 0},
|
|
// 4096</span>字节<span lang=EN-US>(1</span>页<span lang=EN-US>)</span>内存。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>87</span></u>
|
|
{ 0, (struct <u><span style='color:blue'>bucket_desc</span></u>
|
|
*) 0}}; <b><i>/* End of list marker */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>88</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>89</span></u> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>90</span></u> <b><i> *
|
|
This contains a linked list of free bucket descriptor blocks</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>91</span></u> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>下面是含有空闲桶描述符内存块的链表。</p>
|
|
|
|
<p class=a><span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>92</span></u>
|
|
struct <u><span style='color:blue'>bucket_desc</span></u> *<u><span
|
|
style='color:blue'>free_bucket_desc</span></u> = (struct <u><span
|
|
style='color:blue'>bucket_desc</span></u> *) 0;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>93</span></u> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>94</span></u> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>95</span></u> <b><i> *
|
|
This routine initializes a bucket description page.</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>96</span></u> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>下面的子程序用于初始化一页桶描述符页面。</p>
|
|
|
|
<p class=a><span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> //// </span>初始化桶描述符。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>建立空闲桶描述符链表,并让<span
|
|
lang=EN-US>free_bucket_desc</span>指向第一个空闲桶描述符。</p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>97</span></u>
|
|
static inline void <u><span style='color:blue'>init_bucket_desc</span></u>()</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>98</span></u> {</span></p>
|
|
|
|
<p class=a><span lang=EN-US> <u><span style='color:blue'>99</span></u>
|
|
struct <u><span style='color:blue'>bucket_desc</span></u> *bdesc, *first;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
|
|
lang=EN-US>
|
|
int i;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>101</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>申请一页内存,用于存放桶描述符。如果失败,则显示初始化桶描述符时内存不够出错信息,死机。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
|
|
lang=EN-US> first = bdesc =
|
|
(struct <u><span style='color:blue'>bucket_desc</span></u> *) <u><span
|
|
style='color:blue'>get_free_page</span></u>();</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
|
|
lang=EN-US> if (!bdesc)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>104</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>panic</span></u>(<i>"Out of memory in
|
|
init_bucket_desc()"</i>);</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>首先计算一页内存中可存放的桶描述符数量,然后对其建立单向连接指针。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>105</span></u><span
|
|
lang=EN-US> for (i = <u><span
|
|
style='color:blue'>PAGE_SIZE</span></u>/sizeof(struct <u><span
|
|
style='color:blue'>bucket_desc</span></u>); i > 1; i--) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
|
|
lang=EN-US>
|
|
bdesc->next = bdesc+1;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
|
|
lang=EN-US>
|
|
bdesc++;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>108</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>109</span></u><span
|
|
lang=EN-US> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>110</span></u><span
|
|
lang=EN-US> <b><i> * This
|
|
is done last, to avoid race conditions in case </i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
|
|
lang=EN-US> <b><i> *
|
|
get_free_page() sleeps and this routine gets called again....</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/*</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>这是在最后处理的,目的是为了避免在<span lang=EN-US>get_free_page()</span>睡眠时该子程序又被</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>调用而引起的竞争条件。</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
*/</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>将空闲桶描述符指针<span
|
|
lang=EN-US>free_bucket_desc</span>加入链表中。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
|
|
lang=EN-US> bdesc->next = <u><span
|
|
style='color:blue'>free_bucket_desc</span></u>;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>free_bucket_desc</span></u> = first;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> //// </span>分配动态内存函数。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>参数:<span lang=EN-US>len
|
|
- </span>请求的内存块长度。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>返回:指向被分配内存的指针。如果失败则返回<span
|
|
lang=EN-US>NULL</span>。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
|
|
lang=EN-US> void *<u><span style='color:blue'>malloc</span></u>(unsigned int
|
|
len)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
|
|
lang=EN-US> {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
|
|
lang=EN-US> struct <u><span
|
|
style='color:blue'>_bucket_dir</span></u> *bdir;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
|
|
lang=EN-US> struct <u><span
|
|
style='color:blue'>bucket_desc</span></u> *bdesc;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>121</span></u><span
|
|
lang=EN-US>
|
|
void
|
|
*retval;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
|
|
lang=EN-US> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
|
|
lang=EN-US> <b><i> * First
|
|
we search the bucket_dir to find the right bucket change</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
|
|
lang=EN-US> <b><i> * for
|
|
this request.</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/*</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>首先我们搜索存储桶目录<span lang=EN-US>bucket_dir</span>来寻找适合请求的桶大小。</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
*/</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>搜索存储桶目录,寻找适合申请内存块大小的桶描述符链表。如果目录项的桶字节数大于请求的字节</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>数,就找到了对应的桶目录项。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>127</span></u><span
|
|
lang=EN-US> for (bdir = <u><span
|
|
style='color:blue'>bucket_dir</span></u>; bdir->size; bdir++)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
|
|
lang=EN-US>
|
|
if (bdir->size >= len)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>129</span></u><span
|
|
lang=EN-US>
|
|
break;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果搜索完整个目录都没有找到合适大小的目录项,则表明所请求的内存块大小太大,超出了该</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>程序的分配限制<span
|
|
lang=EN-US>(</span>最长为<span lang=EN-US>1</span>个页面<span lang=EN-US>)</span>。于是显示出错信息,死机。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>130</span></u><span
|
|
lang=EN-US> if (!bdir->size)
|
|
{</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>131</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>printk</span></u>(<i>"malloc called with impossibly
|
|
large argument (%d)\n"</i>,</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>132</span></u><span
|
|
lang=EN-US>
|
|
len);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>133</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>panic</span></u>(<i>"malloc: bad arg"</i>);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>134</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>135</span></u><span
|
|
lang=EN-US> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>136</span></u><span
|
|
lang=EN-US> <b><i> * Now
|
|
we search for a bucket descriptor which has free space</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>137</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/*</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>现在我们来搜索具有空闲空间的桶描述符。</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
*/</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>138</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>cli</span></u>(); <b><i>/* Avoid race conditions */</i></b>
|
|
/* </span>为了避免出现竞争条件,首先关中断<span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>搜索对应桶目录项中描述符链表,查找具有空闲空间的桶描述符。如果桶描述符的空闲内存指针</p>
|
|
|
|
<p class=a><span lang=EN-US> // freeptr</span>不为空,则表示找到了相应的桶描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
|
|
lang=EN-US> for (bdesc =
|
|
bdir->chain; bdesc; bdesc = bdesc->next) </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>140</span></u><span
|
|
lang=EN-US>
|
|
if (bdesc->freeptr)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>141</span></u><span
|
|
lang=EN-US>
|
|
break;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>142</span></u><span
|
|
lang=EN-US> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>143</span></u><span
|
|
lang=EN-US> <b><i> * If we
|
|
didn't find a bucket with free space, then we'll </i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
|
|
lang=EN-US> <b><i> *
|
|
allocate a new one.</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>145</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/*</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>如果没有找到具有空闲空间的桶描述符,那么我们就要新建立一个该目录项的描述符。</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
*/</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
|
|
lang=EN-US> if (!bdesc) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>147</span></u><span
|
|
lang=EN-US>
|
|
char *cp;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>148</span></u><span
|
|
lang=EN-US>
|
|
int i;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>149</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>若<span lang=EN-US>free_bucket_desc</span>还为空时,表示第一次调用该程序,或者链表中所有空桶描述符都已用完。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>此时就需要申请一个页面并在其上建立并初始化空闲描述符链表。<span
|
|
lang=EN-US>free_bucket_desc</span>会指向第一</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>个空闲桶描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>150</span></u><span
|
|
lang=EN-US>
|
|
if (!<u><span style='color:blue'>free_bucket_desc</span></u>) </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>151</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>init_bucket_desc</span></u>();</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>取<span lang=EN-US>free_bucket_desc</span>指向的空闲桶描述符,并让<span
|
|
lang=EN-US>free_bucket_desc</span>指向下一个空闲桶描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>152</span></u><span
|
|
lang=EN-US>
|
|
bdesc = <u><span style='color:blue'>free_bucket_desc</span></u>;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>153</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>free_bucket_desc</span></u> = bdesc->next;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>初始化该新的桶描述符。令其引用数量等于<span
|
|
lang=EN-US>0</span>;桶的大小等于对应桶目录的大小;申请一内存页面,</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>让描述符的页面指针<span
|
|
lang=EN-US>page</span>指向该页面;空闲内存指针也指向该页开头,因为此时全为空闲。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>154</span></u><span
|
|
lang=EN-US>
|
|
bdesc->refcnt = 0;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>155</span></u><span
|
|
lang=EN-US> bdesc->bucket_size
|
|
= bdir->size;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>156</span></u><span
|
|
lang=EN-US>
|
|
bdesc->page = bdesc->freeptr = (void *) cp = <u><span style='color:blue'>get_free_page</span></u>();</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果申请内存页面操作失败,则显示出错信息,死机。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>157</span></u><span
|
|
lang=EN-US>
|
|
if (!cp)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>158</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>panic</span></u>(<i>"Out of memory in kernel
|
|
malloc()"</i>);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>159</span></u><span
|
|
lang=EN-US>
|
|
<b><i>/* Set up the chain of free objects */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/* </span>在该页空闲内存中建立空闲对象链表<span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>以该桶目录项指定的桶大小为对象长度,对该页内存进行划分,并使每个对象的开始<span
|
|
lang=EN-US>4</span>字节设置</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>成指向下一对象的指针。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>160</span></u><span
|
|
lang=EN-US>
|
|
for (i=<u><span style='color:blue'>PAGE_SIZE</span></u>/bdir->size; i >
|
|
1; i--) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>161</span></u><span
|
|
lang=EN-US>
|
|
*((char **) cp) = cp + bdir->size;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>162</span></u><span
|
|
lang=EN-US>
|
|
cp += bdir->size;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>163</span></u><span
|
|
lang=EN-US>
|
|
}</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>最后一个对象开始处的指针设置为<span
|
|
lang=EN-US>0(NULL)</span>。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>然后让该桶描述符的下一描述符指针字段指向对应桶目录项指针<span
|
|
lang=EN-US>chain</span>所指的描述符,而桶目录的</p>
|
|
|
|
<p class=a><span lang=EN-US> // chain</span>指向该桶描述符,也即将该描述符插入到描述符链链头处。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>164</span></u><span
|
|
lang=EN-US>
|
|
*((char **) cp) = 0;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>165</span></u><span
|
|
lang=EN-US>
|
|
bdesc->next = bdir->chain; <b><i>/* OK, link it in! */</i></b>
|
|
/* OK</span>,将其链入!<span lang=EN-US>*/</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>166</span></u><span
|
|
lang=EN-US>
|
|
bdir->chain = bdesc;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>167</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>返回指针即等于该描述符对应页面的当前空闲指针。然后调整该空闲空间指针指向下一个空闲对象,</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>并使描述符中对应页面中对象引用计数增<span
|
|
lang=EN-US>1</span>。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>168</span></u><span
|
|
lang=EN-US> retval = (void *)
|
|
bdesc->freeptr;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>169</span></u><span
|
|
lang=EN-US> bdesc->freeptr =
|
|
*((void **) retval);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>170</span></u><span
|
|
lang=EN-US> bdesc->refcnt++;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>最后开放中断,并返回指向空闲内存对象的指针。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>171</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>sti</span></u>(); <b><i>/* OK, we're safe again */</i></b>
|
|
/* OK</span>,现在我们又安全了<span lang=EN-US>*/</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>172</span></u><span
|
|
lang=EN-US> return(retval);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>173</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>174</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>175</span></u><span
|
|
lang=EN-US> <b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>176</span></u><span
|
|
lang=EN-US> <b><i> * Here is the free routine. If you know the size
|
|
of the object that you</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>177</span></u><span
|
|
lang=EN-US> <b><i> * are freeing, then free_s() will use that information
|
|
to speed up the</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>178</span></u><span
|
|
lang=EN-US> <b><i> * search for the bucket descriptor.</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>179</span></u><span
|
|
lang=EN-US> <b><i> * </i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>180</span></u><span
|
|
lang=EN-US> <b><i> * We will #define a macro so that "free(x)"
|
|
is becomes "free_s(x, 0)"</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>181</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>下面是释放子程序。如果你知道释放对象的大小,则<span
|
|
lang=EN-US>free_s()</span>将使用该信息加速</p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>搜寻对应桶描述符的速度。</p>
|
|
|
|
<p class=a><span lang=EN-US> *</span></p>
|
|
|
|
<p class=a><span lang=EN-US> * </span>我们将定义一个宏,使得<span
|
|
lang=EN-US>"free(x)"</span>成为<span lang=EN-US>"free_s(x,
|
|
0)"</span>。</p>
|
|
|
|
<p class=a><span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> //// </span>释放存储桶对象。</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>参数:<span lang=EN-US>obj
|
|
- </span>对应对象指针;<span lang=EN-US>size - </span>大小。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>182</span></u><span
|
|
lang=EN-US> void <u><span style='color:blue'>free_s</span></u>(void *obj, int
|
|
size)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>183</span></u><span
|
|
lang=EN-US> {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>184</span></u><span
|
|
lang=EN-US>
|
|
void *page;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>185</span></u><span
|
|
lang=EN-US> struct <u><span
|
|
style='color:blue'>_bucket_dir</span></u> *bdir;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>186</span></u><span
|
|
lang=EN-US> struct <u><span
|
|
style='color:blue'>bucket_desc</span></u> *bdesc,
|
|
*prev;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>187</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>188</span></u><span
|
|
lang=EN-US> <b><i>/* Calculate
|
|
what page this object lives in */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US> /*
|
|
</span>计算该对象所在的页面<span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>189</span></u><span
|
|
lang=EN-US> page = (void
|
|
*) ((unsigned long) obj & 0xfffff000);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>190</span></u><span
|
|
lang=EN-US> <b><i>/* Now search
|
|
the buckets looking for that page */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/* </span>现在搜索存储桶目录项所链接的桶描述符,寻找该页面<span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>191</span></u><span
|
|
lang=EN-US> for (bdir = <u><span
|
|
style='color:blue'>bucket_dir</span></u>; bdir->size; bdir++) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>192</span></u><span
|
|
lang=EN-US>
|
|
prev = 0;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>193</span></u><span
|
|
lang=EN-US>
|
|
<b><i>/* If size is zero then this conditional is always false */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/* </span>如果参数<span lang=EN-US>size</span>是<span lang=EN-US>0</span>,则下面条件肯定是<span
|
|
lang=EN-US>false */ </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>194</span></u><span
|
|
lang=EN-US>
|
|
if (bdir->size < size)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>195</span></u><span
|
|
lang=EN-US>
|
|
continue;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>搜索对应目录项中链接的所有描述符,查找对应页面。如果某描述符页面指针等于<span
|
|
lang=EN-US>page</span>则表示找到</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>了相应的描述符,跳转到<span
|
|
lang=EN-US>found</span>。如果描述符不含有对应<span lang=EN-US>page</span>,则让描述符指针<span
|
|
lang=EN-US>prev</span>指向该描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>196</span></u><span
|
|
lang=EN-US>
|
|
for (bdesc = bdir->chain; bdesc; bdesc = bdesc->next) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>197</span></u><span
|
|
lang=EN-US>
|
|
if (bdesc->page == page) </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>198</span></u><span
|
|
lang=EN-US>
|
|
goto
|
|
found;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>199</span></u><span
|
|
lang=EN-US>
|
|
prev = bdesc;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>200</span></u><span
|
|
lang=EN-US>
|
|
}</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>201</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>若搜索了对应目录项的所有描述符都没有找到指定的页面,则显示出错信息,死机。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>202</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>panic</span></u>(<i>"Bad address passed to kernel
|
|
free_s()"</i>);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>203</span></u><span
|
|
lang=EN-US> found:</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>找到对应的桶描述符后,首先关中断。然后将该对象内存块链入空闲块对象链表中,并使该描述符</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>的对象引用计数减<span
|
|
lang=EN-US>1</span>。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>204</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>cli</span></u>(); <b><i>/* To avoid race conditions */</i></b>
|
|
/* </span>为了避免竞争条件<span lang=EN-US> */</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>205</span></u><span
|
|
lang=EN-US> *((void **)obj) =
|
|
bdesc->freeptr;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>206</span></u><span
|
|
lang=EN-US> bdesc->freeptr =
|
|
obj;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>207</span></u><span
|
|
lang=EN-US> bdesc->refcnt--;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果引用计数已等于<span
|
|
lang=EN-US>0</span>,则我们就可以释放对应的内存页面和该桶描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>208</span></u><span
|
|
lang=EN-US> if
|
|
(bdesc->refcnt == 0) {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>209</span></u><span
|
|
lang=EN-US>
|
|
<b><i>/*</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>210</span></u><span
|
|
lang=EN-US> <b><i> *
|
|
We need to make sure that prev is still accurate. It</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>211</span></u><span
|
|
lang=EN-US> <b><i> *
|
|
may not be, if someone rudely interrupted us....</i></b></span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>212</span></u><span
|
|
lang=EN-US> <b><i> */</i></b></span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
/*</span></p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>我们需要确信<span lang=EN-US>prev</span>仍然是正确的,若某程序粗鲁地中断了我们</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
* </span>就有可能不是了。</p>
|
|
|
|
<p class=a><span lang=EN-US>
|
|
*/</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果<span lang=EN-US>prev</span>已经不是搜索到的描述符的前一个描述符,则重新搜索当前描述符的前一个描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>213</span></u><span
|
|
lang=EN-US>
|
|
if ((prev && (prev->next != bdesc)) ||</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>214</span></u><span
|
|
lang=EN-US>
|
|
(!prev && (bdir->chain != bdesc)))</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>215</span></u><span
|
|
lang=EN-US>
|
|
for (prev = bdir->chain; prev; prev = prev->next)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>216</span></u><span
|
|
lang=EN-US>
|
|
if (prev->next == bdesc)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>217</span></u><span
|
|
lang=EN-US>
|
|
break;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果找到该前一个描述符,则从描述符链中删除当前描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>218</span></u><span
|
|
lang=EN-US>
|
|
if (prev)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>219</span></u><span
|
|
lang=EN-US>
|
|
prev->next = bdesc->next;</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>如果<span lang=EN-US>prev==NULL</span>,则说明当前一个描述符是该目录项首个描述符,也即目录项中<span
|
|
lang=EN-US>chain</span>应该直接</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>指向当前描述符<span
|
|
lang=EN-US>bdesc</span>,否则表示链表有问题,则显示出错信息,死机。因此,为了将当前描述符</p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>从链表中删除,应该让<span
|
|
lang=EN-US>chain</span>指向下一个描述符。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>220</span></u><span
|
|
lang=EN-US>
|
|
else {</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>221</span></u><span
|
|
lang=EN-US>
|
|
if (bdir->chain != bdesc)</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>222</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>panic</span></u>(<i>"malloc bucket chains
|
|
corrupted"</i>);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>223</span></u><span
|
|
lang=EN-US>
|
|
bdir->chain = bdesc->next;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>224</span></u><span
|
|
lang=EN-US>
|
|
}</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>释放当前描述符所操作的内存页面,并将该描述符插入空闲描述符链表开始处。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>225</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>free_page</span></u>((unsigned long)
|
|
bdesc->page);</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>226</span></u><span
|
|
lang=EN-US>
|
|
bdesc->next = <u><span style='color:blue'>free_bucket_desc</span></u>;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>227</span></u><span
|
|
lang=EN-US>
|
|
<u><span style='color:blue'>free_bucket_desc</span></u> = bdesc;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>228</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><span lang=EN-US> // </span>开中断,返回。</p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>229</span></u><span
|
|
lang=EN-US> <u><span
|
|
style='color:blue'>sti</span></u>();</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>230</span></u><span
|
|
lang=EN-US> return;</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>231</span></u><span
|
|
lang=EN-US> }</span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>232</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<p class=a><u><span lang=EN-US style='color:blue'>233</span></u><span
|
|
lang=EN-US> </span></p>
|
|
|
|
<div class=a align=center style='text-align:center'><span lang=EN-US>
|
|
|
|
<hr size=4 width="100%" align=center>
|
|
|
|
</span></div>
|
|
|
|
<p class=MsoNormal><span lang=EN-US> </span></p>
|
|
|
|
<p class=MsoNormal><span lang=EN-US> </span></p>
|
|
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|