Files
oldlinux-website/Book-Lite/code-list/html/P8-8.html
2024-02-19 01:11:57 -05:00

2691 lines
95 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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.0pt;
font-family:"Times New Roman","serif";}
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:51;
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:52;
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:53;
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="_Toc53320610"><span style='font-family:黑体'>程序</span><span
lang=EN-US>8-8 linux/kernel/fork.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>&nbsp; <u><span style='color:blue'>1</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>2</span></u> <b><i>&nbsp;*&nbsp;
linux/kernel/fork.c</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>3</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>4</span></u> <b><i>&nbsp;*&nbsp;
(C) 1991&nbsp; Linus Torvalds</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>5</span></u> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>6</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>7</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>8</span></u> <b><i>&nbsp;*&nbsp;
'fork.c' contains the help-routines for the 'fork' system call</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>9</span></u> <b><i>&nbsp;*
(see also system_call.s), and some misc functions ('verify_area').</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>10</span></u> <b><i>&nbsp;*
Fork is rather simple, once you get the hang of it, but the memory</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>11</span></u> <b><i>&nbsp;*
management can be a bitch. See 'mm/mm.c': 'copy_page_tables()'</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>12</span></u> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /*</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * 'fork.c'</span>中含有系统调用<span
lang=EN-US>'fork'</span>的辅助子程序(参见<span lang=EN-US>system_call.s</span>),以及一些</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>其他函数(<span
lang=EN-US>'verify_area'</span>)。一旦你了解了<span lang=EN-US>fork</span>,就会发现它是非常简单的,但</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>内存管理却有些难度。参见<span
lang=EN-US>'mm/memory.c'</span>中的<span lang=EN-US>'copy_page_tables()'</span>函数。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>13</span></u>
#include &lt;errno.h&gt;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;// </span>错误号头文件。包含系统中各种出错号。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>14</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>15</span></u>
#include &lt;linux/sched.h&gt;&nbsp; // </span>调度程序头文件,定义了任务结构<span lang=EN-US>task_struct</span>、任务<span
lang=EN-US>0</span>的数据。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>16</span></u>
#include &lt;linux/kernel.h&gt; // </span>内核头文件。含有一些内核常用函数的原形定义。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>17</span></u>
#include &lt;asm/segment.h&gt;&nbsp; // </span>段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>18</span></u>
#include &lt;asm/system.h&gt;&nbsp;&nbsp; // </span>系统头文件。定义了设置或修改描述符<span
lang=EN-US>/</span>中断门等的嵌入式汇编宏。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>19</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>写页面验证。若页面不可写,则复制页面。定义在<span
lang=EN-US>mm/memory.c </span><span lang=EN-US>261</span>行开始。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>20</span></u>
extern void <u><span style='color:blue'>write_verify</span></u>(unsigned long
address);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>21</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>22</span></u>
long <u><span style='color:blue'>last_pid</span></u>=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>最新进程号,其值会由<span lang=EN-US>get_empty_process()</span>生成。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>23</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// </span>进程空间区域写前验证函数。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对于<span lang=EN-US>80386
CPU</span>,在执行特权级<span lang=EN-US>0</span>代码时不会理会用户空间中的页面是否是页保护的,因此</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在执行内核代码时用户空间中数据页面保护标志起不了作用,写时复制机制也就失去了作用。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // verify_area()</span>函数就用于此目的。但对于<span
lang=EN-US>80486</span>或后来的<span lang=EN-US>CPU</span>,其控制寄存器<span lang=EN-US>CR0</span>中有一个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>写保护标志<span lang=EN-US>WP</span>(位<span
lang=EN-US>16</span>),内核可以通过设置该标志来禁止特权级<span lang=EN-US>0</span>的代码向用户空间只读</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>页面执行写数据,否则将导致发生写保护异常。从而<span
lang=EN-US>486</span>以上<span lang=EN-US>CPU</span>可以通过设置该标志来达</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>到使用本函数同样的目的。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该函数对当前进程逻辑地址从 <span
lang=EN-US>addr </span><span lang=EN-US>addr + size </span>这一段范围以页为单位执行写操作前</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的检测操作。由于检测判断是以页面为单位进行操作,因此程序首先需要找出<span
lang=EN-US>addr</span>所在页</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>面开始地址<span lang=EN-US>start</span>,然后
<span lang=EN-US>start</span>加上进程数据段基址,使这个<span lang=EN-US>start</span>变换成<span
lang=EN-US>CPU 4G</span>线性空</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>间中的地址。最后循环调用<span
lang=EN-US>write_verify() </span>对指定大小的内存空间进行写前验证。若页面</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>是只读的,则执行共享检验和复制页面操作(写时复制)。</p>
<p class=a><span lang=EN-US style='color:blue'>&nbsp;<u>24</u></span><span
lang=EN-US> void <u><span style='color:blue'>verify_area</span></u>(void *
addr,int size)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>25</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>26</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
unsigned long start;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>27</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先将起始地址<span
lang=EN-US>start</span>调整为其所在页的左边界开始位置,同时相应地调整验证区域大小。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下句中的 <span lang=EN-US>start
&amp; 0xfff </span>用来获得指定起始位置<span lang=EN-US>addr</span>(也即<span lang=EN-US>start</span>)在所在页面中的偏移</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>值,原验证范围 <span
lang=EN-US>size </span>加上这个偏移值即扩展成以 <span lang=EN-US>addr </span>所在页面起始位置开始的范围值。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>因此在<span lang=EN-US>
30</span>行上 也需要把验证开始位置 <span lang=EN-US>start </span>调整成页面边界值。参见前面的图“内存验</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>证范围的调整”。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>28</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
start = (unsigned long) addr;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>29</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
size += start &amp; 0xfff;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>30</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
start &amp;= 0xfffff000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>此时<span lang=EN-US>start</span>是当前进程空间中的逻辑地址。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面把 <span lang=EN-US>start
</span>加上进程数据段在线性地址空间中的起始基址,变成系统整个线性空间中的地</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>址位置。对于<span
lang=EN-US>Linux 0.1x</span>内核,其数据段和代码段在线性地址空间中的基址和限长均相同。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>然后循环进行写页面验证。若页面不可写,则复制页面。(<span
lang=EN-US>mm/memory.c</span><span lang=EN-US>274</span>行)</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>31</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
start += <u><span style='color:blue'>get_base</span></u>(<u><span
style='color:blue'>current</span></u>-&gt;ldt[2]);&nbsp;&nbsp;&nbsp;&nbsp; //
include/linux/sched.h</span><span lang=EN-US>277</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>32</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (size&gt;0) {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>33</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
size -= 4096;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>34</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>write_verify</span></u>(start);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>35</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
start += 4096;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>36</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>37</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>38</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp; &nbsp;&nbsp;// </span>复制内存页表。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>nr</span>是新任务号;<span
lang=EN-US>p</span>是新任务数据结构指针。该函数为新任务在线性地址空间中设置代码</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>段和数据段基址、限长,并复制页表。<span
lang=EN-US>&nbsp; </span>由于<span lang=EN-US>Linux</span>系统采用了写时复制(<span
lang=EN-US>copy on write</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>技术, 因此这里仅为新进程设置自己的页目录表项和页表项,而没有实际为新进程分配物理</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>内存页面。此时新进程与其父进程共享所有内存页面。操作成功返回<span
lang=EN-US>0</span>,否则返回出错号。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>39</span></u> int
<u><span style='color:blue'>copy_mem</span></u>(int nr,struct <u><span
style='color:blue'>task_struct</span></u> * p)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>40</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>41</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
unsigned long old_data_base,new_data_base,data_limit;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>42</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
unsigned long old_code_base,new_code_base,code_limit;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>43</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先取当前进程局部描述符表中代码段描述符和数据段描述符项中的段限长(字节数)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 0x0f</span>是代码段选择符;<span
lang=EN-US>0x17</span>是数据段选择符。然后取当前进程代码段和数据段在线性地址</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>空间中的基地址。由于<span
lang=EN-US>Linux 0.12</span>内核还不支持代码和数据段分立的情况,因此这里需要</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>检查代码段和数据段基址是否都相同,并且要求数据段的长度至少不小于代码段的长度</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>(参见图<span lang=EN-US>5-12</span>),否则内核显示出错信息,并停止运行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // get_limit()</span><span
lang=EN-US>get_base()</span>定义在<span lang=EN-US>include/linux/sched.h</span><span
lang=EN-US>277</span>行和<span lang=EN-US>279</span>行处。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>44</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_limit=<u><span style='color:blue'>get_limit</span></u>(0x0f);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>45</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data_limit=<u><span style='color:blue'>get_limit</span></u>(0x17);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>46</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code_base = <u><span style='color:blue'>get_base</span></u>(<u><span
style='color:blue'>current</span></u>-&gt;ldt[1]);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>47</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_data_base = <u><span style='color:blue'>get_base</span></u>(<u><span
style='color:blue'>current</span></u>-&gt;ldt[2]);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>48</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (old_data_base != old_code_base)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>49</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>panic</span></u>(<i>&quot;We don't support separate
I&amp;D&quot;</i>);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>50</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (data_limit &lt; code_limit)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>51</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>panic</span></u>(<i>&quot;Bad data_limit&quot;</i>);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>然后设置创建中的新进程在线性地址空间中的基地址等于(<span
lang=EN-US>64MB * </span>其任务号),并用该值</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>设置新进程局部描述符表中段描述符中的基地址。接着设置新进程的页目录表项和页表项,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>即复制当前进程(父进程)的页目录表项和页表项。
此时子进程共享父进程的内存页面。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>正常情况下<span lang=EN-US>copy_page_tables()</span>返回<span
lang=EN-US>0</span>,否则表示出错,则释放刚申请的页表项。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>52</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
new_data_base = new_code_base = nr * <u><span style='color:blue'>TASK_SIZE</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>53</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;start_code = new_code_base;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>54</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>set_base</span></u>(p-&gt;ldt[1],new_code_base);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>55</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>set_base</span></u>(p-&gt;ldt[2],new_data_base);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>56</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>copy_page_tables</span></u>(old_data_base,new_data_base,data_limit))
{</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>57</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>free_page_tables</span></u>(new_data_base,data_limit);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>58</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>ENOMEM</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>59</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>60</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return 0;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>61</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>62</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>63</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>64</span></u> <b><i>&nbsp;*&nbsp;
Ok, this is the main fork-routine. It copies the system process</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>65</span></u> <b><i>&nbsp;*
information (task[nr]) and sets up the necessary registers. It</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>66</span></u> <b><i>&nbsp;*
also copies the data segment in it's entirety.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>67</span></u> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /*</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * OK</span>,下面是主要的<span
lang=EN-US>fork</span>子程序。它复制系统进程信息<span lang=EN-US>(task[n])</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>并且设置必要的寄存器。它还整个地复制数据段(也是代码段)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>复制进程。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该函数的参数是进入系统调用中断处理过程(<span
lang=EN-US>sys_call.s</span>)开始,直到调用本系统调用处理</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>过程(<span lang=EN-US>sys_call.s</span><span
lang=EN-US>208</span>行)和调用本函数前(<span lang=EN-US>sys_call.s</span><span
lang=EN-US>217</span>行)逐步压入进程内核</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>态栈的各寄存器的值。这些在<span
lang=EN-US>sys_call.s</span>程序中逐步压入内核态栈的值(参数)包括<span lang=EN-US>:</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ① CPU</span>执行中断指令压入的用户栈地址<span
lang=EN-US>ss</span><span lang=EN-US>esp</span>、标志<span lang=EN-US>eflags</span>和返回地址<span
lang=EN-US>cs</span><span lang=EN-US>eip</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ② </span><span lang=EN-US>83--88</span>行在刚进入<span
lang=EN-US>system_call</span>时入栈的段寄存器<span lang=EN-US>ds</span><span
lang=EN-US>es</span><span lang=EN-US>fs</span><span lang=EN-US>edx</span><span
lang=EN-US>ecx</span><span lang=EN-US>edx</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ③ </span><span lang=EN-US>94</span>行调用<span
lang=EN-US>sys_call_table</span><span lang=EN-US>sys_fork</span>函数时入栈的返回地址(参数<span
lang=EN-US>none</span>表示);</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>④ 第<span lang=EN-US>212--216</span>行在调用<span
lang=EN-US>copy_process()</span>之前入栈的<span lang=EN-US>gs</span><span
lang=EN-US>esi</span><span lang=EN-US>edi</span><span lang=EN-US>ebp</span><span
lang=EN-US>eax</span><span lang=EN-US>nr</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>其中参数<span lang=EN-US>nr</span>是调用<span
lang=EN-US>find_empty_process()</span>分配的任务数组项号。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>68</span></u> int
<u><span style='color:blue'>copy_process</span></u>(int nr,long ebp,long
edi,long esi,long gs,long none,</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>69</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
long ebx,long ecx,long edx, long orig_eax, </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>70</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
long fs,long es,long ds,</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>71</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
long eip,long cs,long eflags,long esp,long ss)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>72</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>73</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
struct <u><span style='color:blue'>task_struct</span></u> *p;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>74</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>75</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
struct <u><span style='color:blue'>file</span></u> *f;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>76</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先为新任务数据结构分配内存。如果内存分配出错,则返回出错码并退出。然后将新任务</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>结构指针放入任务数组的<span
lang=EN-US>nr</span>项中。其中<span lang=EN-US>nr</span>为任务号,由前面<span lang=EN-US>find_empty_process()</span>返回。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>接着把当前进程任务结构内容复制到刚申请到的内存页面<span
lang=EN-US>p</span>开始处。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>77</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p = (struct <u><span style='color:blue'>task_struct</span></u> *) <u><span
style='color:blue'>get_free_page</span></u>();</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>78</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!p)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>79</span></u>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
-<u><span style='color:blue'>EAGAIN</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>80</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>task</span></u>[nr] = p;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>81</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*p = *<u><span style='color:blue'>current</span></u>;&nbsp; <b><i>/* NOTE! this
doesn't copy the supervisor stack */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>注意!这样做不会复制超级用户堆栈(只复制进程结构)<span lang=EN-US>*/</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>随后对复制来的进程结构内容进行一些修改,作为新进程的任务结构。先将新进程的状态</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>置为不可中断等待状态,以防止内核调度其执行。然后设置新进程的进程号<span
lang=EN-US>pid</span>,并初始</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>化进程运行时间片值等于其<span
lang=EN-US> priority</span>值( 一般为<span lang=EN-US>15</span>个嘀嗒)。接着复位新进程的信号</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>位图、报警定时值、会话(<span
lang=EN-US>session</span>)领导标志<span lang=EN-US> leader</span>、 进程及其子进程在内核和用户</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>态运行时间统计值,还设置进程开始运行的系统时间<span
lang=EN-US>start_time</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>82</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;<u><span style='color:blue'>state</span></u> = <u><span style='color:
blue'>TASK_UNINTERRUPTIBLE</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>83</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;pid = <u><span style='color:blue'>last_pid</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>新进程号。也由<span lang=EN-US>find_empty_process()</span>得到。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>84</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;counter = p-&gt;priority;&nbsp;&nbsp;&nbsp; // </span>运行时间片值(嘀嗒数)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>85</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;signal = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>信号位图。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>86</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;<u><span style='color:blue'>alarm</span></u> = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>报警定时值(嘀嗒数)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>87</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;leader = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><i>/*
process leadership doesn't inherit */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* </span>进程的领导权是不能继承的<span lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>88</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;<u><span style='color:blue'>utime</span></u> = p-&gt;<u><span
style='color:blue'>stime</span></u> = 0;&nbsp;&nbsp;&nbsp;&nbsp; // </span>用户态时间和核心态运行时间。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>89</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;cutime = p-&gt;cstime = 0;&nbsp;&nbsp; // </span>子进程用户态和核心态运行时间。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>90</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;start_time = <u><span style='color:blue'>jiffies</span></u>;&nbsp;&nbsp; &nbsp;&nbsp;//
</span>进程开始运行时间(当前时间滴答数)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>再修改任务状态段<span
lang=EN-US>TSS </span>数据(参见列表后说明)。由于系统给任务结构 <span lang=EN-US>p</span>分配了<span
lang=EN-US>1</span>页新</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>内存,所以<span lang=EN-US>
(PAGE_SIZE + (long) p) </span><span lang=EN-US>esp0</span>正好指向该页顶端。 <span
lang=EN-US>ss0:esp0 </span>用作程序</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在内核态执行时的栈。另外,在第<span
lang=EN-US>3</span>章中我们已经知道,每个任务在<span lang=EN-US> GDT</span>表中都有两个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>段描述符,一个是任务的<span
lang=EN-US>TSS</span>段描述符,另一个是任务的<span lang=EN-US>LDT</span>表段描述符。下面<span
lang=EN-US>111</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>语句就是把<span lang=EN-US>GDT</span>中本任务<span
lang=EN-US>LDT</span>段描述符的选择符保存在本任务的<span lang=EN-US>TSS</span>段中。当<span
lang=EN-US>CPU</span>执行</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>切换任务时,会自动从<span
lang=EN-US>TSS</span>中把<span lang=EN-US>LDT</span>段描述符的选择符加载到<span lang=EN-US>ldtr</span>寄存器中。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>91</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.back_link = 0;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>92</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.esp0 = <u><span style='color:blue'>PAGE_SIZE</span></u> + (long) p;&nbsp;
// </span>任务内核态栈指针。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>93</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.ss0 = 0x10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>内核态栈的段选择符(与内核数据段相同)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>94</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.eip = eip;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>指令代码指针。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>95</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.eflags = eflags;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>标志寄存器。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>96</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.eax = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>这是当<span lang=EN-US>fork()</span>返回时新进程会返回<span lang=EN-US>0</span>的原因所在。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>97</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.ecx = ecx;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>98</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.edx = edx;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>99</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.ebx = ebx;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.esp =
esp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>101</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.ebp =
ebp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.esi =
esi;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.edi =
edi;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>104</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.es = es
&amp; 0xffff;&nbsp;&nbsp;&nbsp;&nbsp; // </span>段寄存器仅<span lang=EN-US>16</span>位有效。</p>
<p class=a><u><span lang=EN-US style='color:blue'>105</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.cs = cs
&amp; 0xffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.ss = ss
&amp; 0xffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.ds = ds
&amp; 0xffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>108</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.fs = fs
&amp; 0xffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>109</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.gs = gs
&amp; 0xffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>110</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;tss.ldt = <u><span
style='color:blue'>_LDT</span></u>(nr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>任务局部表描述符的选择符(<span
lang=EN-US>LDT</span>描述符在<span lang=EN-US>GDT</span>中)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;tss.trace_bitmap = 0x80000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>(高<span
lang=EN-US>16</span>位有效)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前任务使用了协处理器,就保存其上下文。汇编指令<span
lang=EN-US>clts</span>用于清除控制寄存器<span lang=EN-US>CR0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中的任务已交换(<span
lang=EN-US>TS</span>)标志。每当发生任务切换,<span lang=EN-US>CPU</span>都会设置该标志。该标志用于管理</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>数学协处理器:如果该标志置位,那么每个<span
lang=EN-US>ESC</span>指令都会被捕获(异常<span lang=EN-US>7</span>)。如果协处理</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>器存在标志<span lang=EN-US>MP</span>也同时置位的话,那么<span
lang=EN-US>WAIT</span>指令也会捕获。因此,如果任务切换发生在一</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>ESC</span>指令开始执行之后,则协处理器中的内容就可能需要在执行新的<span
lang=EN-US>ESC</span>指令之前保存</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>起来。捕获处理句柄会保存协处理器的内容并复位<span
lang=EN-US>TS</span>标志。指令<span lang=EN-US>fnsave</span>用于把协处理器</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的所有状态保存到目的操作数指定的内存区域中(<span
lang=EN-US>tss.i387</span>)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>last_task_used_math</span></u> == <u><span style='color:
blue'>current</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
__asm__(<i>&quot;clts ; fnsave %0 ; frstor %0&quot;</i>::<i>&quot;m&quot;</i>
(p-&gt;tss.i387));</span></p>
<p class=a><span lang=EN-US>&nbsp;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>接下来复制进程页表。即在线性地址空间中设置新任务代码段和数据段描述符中的基址</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>和限长,并复制页表。如果出错(返回值不是<span
lang=EN-US>0</span>),则复位任务数组中相应项并释放为</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该新任务分配的用于任务结构的内存页。</p>
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>copy_mem</span></u>(nr,p)) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>返回不为<span lang=EN-US>0</span>表示出错。</p>
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>task</span></u>[nr] = <u><span style='color:blue'>NULL</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>free_page</span></u>((long) p);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>EAGAIN</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果父进程中有文件是打开的,则将对应文件的打开次数增<span
lang=EN-US>1</span>。因为这里创建的子进程</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>会与父进程共享这些打开的文件。将当前进程(父进程)的<span
lang=EN-US>pwd, root</span><span lang=EN-US>executable</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>引用次数均增<span
lang=EN-US>1</span>。与上面同样的道理,子进程也引用了这些<span lang=EN-US>i</span>节点。</p>
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0; i&lt;<u><span
style='color:blue'>NR_OPEN</span></u>;i++)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (f=p-&gt;filp[i])</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>121</span></u><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
f</span><span lang=EN-US>-&gt;f_count++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;pwd)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;pwd-&gt;i_count++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;root)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;root-&gt;i_count++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;executable)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>127</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;executable-&gt;i_count++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;library)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>129</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;library-&gt;i_count++;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>随后在<span lang=EN-US>GDT</span>表中设置新任务<span
lang=EN-US>TSS</span>段和<span lang=EN-US>LDT</span>段描述符项。这两个段的限长均被设置成<span
lang=EN-US>104</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字节。参见 <span
lang=EN-US>include/asm/system.h</span><span lang=EN-US>52—66 </span>行代码。 然后设置进程之间的关系链表</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>指针,即把新进程插入到当前进程的子进程链表中。把新进程的父进程设置为当前进程,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>把新进程的最新子进程指针<span
lang=EN-US>p_cptr </span>和年轻兄弟进程指针<span lang=EN-US>p_ysptr</span>置空。接着让新进程</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的老兄进程指针<span
lang=EN-US>p_osptr</span>设置等于父进程的最新子进程指针。若当前进程却是还有其他</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>子进程,则让比邻老兄进程的最年轻进程指针<span
lang=EN-US>p_yspter </span>指向新进程。最后把当前进程</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的最新子进程指针指向这个新进程。然后把新进程设置成就绪态。最后返回新进程号。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>另外,<span lang=EN-US>
set_tss_desc() </span><span lang=EN-US> set_ldt_desc() </span>定义在<span
lang=EN-US> include/asm/system.h </span>文件中。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>gdt+(nr&lt;&lt;1)+FIRST_TSS_ENTRY”</span>是任务<span
lang=EN-US>nr</span><span lang=EN-US>TSS</span>描述符项在全局表中的地址。因为</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>每个任务占用<span
lang=EN-US>GDT</span>表中<span lang=EN-US>2</span>项,因此上式中要包括<span lang=EN-US>'(nr&lt;&lt;1)'</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>请注意,在任务切换时,任务寄存器<span
lang=EN-US>tr</span>会由<span lang=EN-US>CPU</span>自动加载。</p>
<p class=a><u><span lang=EN-US style='color:blue'>130</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>set_tss_desc</span></u>(<u><span style='color:blue'>gdt</span></u>+(nr&lt;&lt;1)+<u><span
style='color:blue'>FIRST_TSS_ENTRY</span></u>,&amp;(p-&gt;tss));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>131</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>set_ldt_desc</span></u>(<u><span style='color:blue'>gdt</span></u>+(nr&lt;&lt;1)+<u><span
style='color:blue'>FIRST_LDT_ENTRY</span></u>,&amp;(p-&gt;ldt));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>132</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;p_pptr = <u><span
style='color:blue'>current</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>设置新进程的父进程指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>133</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;p_cptr = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>复位新进程的最新子进程指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>134</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;p_ysptr = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>复位新进程的比邻年轻兄弟进程指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>135</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;p_osptr = <u><span
style='color:blue'>current</span></u>-&gt;p_cptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>设置新进程的比邻老兄兄弟进程指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>136</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p-&gt;p_osptr)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>若新进程有老兄兄弟进程,则让其</p>
<p class=a><u><span lang=EN-US style='color:blue'>137</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;p_osptr-&gt;p_ysptr = p;&nbsp;&nbsp; // </span>年轻进程兄弟指针指向新进程。</p>
<p class=a><u><span lang=EN-US style='color:blue'>138</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;p_cptr = p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>让当前进程最新子进程指针指向新进程。</p>
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;<u><span
style='color:blue'>state</span></u> = <u><span style='color:blue'>TASK_RUNNING</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* do this last, just in case */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>140</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>last_pid</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>141</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>142</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>为新进程取得不重复的进程号<span
lang=EN-US>last_pid</span>。函数返回在任务数组中的任务号<span lang=EN-US>(</span>数组项<span
lang=EN-US>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>143</span></u><span
lang=EN-US> int <u><span style='color:blue'>find_empty_process</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>145</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先获取新的进程号。如果<span
lang=EN-US>last_pid</span><span lang=EN-US>1</span>后超出进程号的正数表示范围,则重新从<span
lang=EN-US>1</span>开始</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>使用<span lang=EN-US>pid</span>号。
然后在任务数组中搜索刚设置的<span lang=EN-US>pid</span>号是否已经被任何任务使用。如果是则</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>跳转到函数开始处重新获得一个<span
lang=EN-US>pid</span>号。 接着在任务数组中为新任务寻找一个空闲项,并</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>返回项号。 <span
lang=EN-US>last_pid</span>是一个全局变量,不用返回。如果此时任务数组中<span lang=EN-US>64</span>个项已经被全</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>部占用,则返回出错码。</p>
<p class=a><u><span lang=EN-US style='color:blue'>147</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repeat:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>148</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((++<u><span style='color:blue'>last_pid</span></u>)&lt;0) <u><span
style='color:blue'>last_pid</span></u>=1;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>149</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0
; i&lt;<u><span style='color:blue'>NR_TASKS</span></u> ; i++)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>150</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>task</span></u>[i] &amp;&amp; ((<u><span
style='color:blue'>task</span></u>[i]-&gt;pid == <u><span style='color:blue'>last_pid</span></u>)
||</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>151</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(<u><span style='color:blue'>task</span></u>[i]-&gt;pgrp == <u><span
style='color:blue'>last_pid</span></u>)))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>152</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
goto repeat;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>153</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1 ; i&lt;<u><span
style='color:blue'>NR_TASKS</span></u> ; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>任务<span lang=EN-US>0</span>项被排除在外。</p>
<p class=a><u><span lang=EN-US style='color:blue'>154</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!<u><span style='color:blue'>task</span></u>[i])</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>155</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return i;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>156</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -<u><span
style='color:blue'>EAGAIN</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>157</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>158</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>&nbsp;</span></p>
</div>
</body>
</html>