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

4155 lines
171 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.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:;
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:;
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:;
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.5pt;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:;
font-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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
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:;}
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:;}
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:;}
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:;}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
{mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
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.5pt;
font-family:;}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:;}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
tt
{font-family:;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
{mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
font-family:;
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
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.5pt;
font-family:;}
p.21, li.21, div.21
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:;}
span.3CharCharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char";
font-family:;}
p.a2, li.a2, div.a2
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;
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.5pt;
font-family:;}
p.23, li.23, div.23
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.50, li.50, div.50
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.01, li.01, div.01
{mso-style-name:01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.5Char1, li.5Char1, div.5Char1
{mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
p.51, li.51, div.51
{mso-style-name:51;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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.5pt;
font-family:;}
p.02, li.02, div.02
{mso-style-name:02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:;
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:;
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
p.52, li.52, div.52
{mso-style-name:52;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.5Char20, li.5Char20, div.5Char20
{mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
p.53, li.53, div.53
{mso-style-name:53;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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:;}
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:;}
p.24, li.24, div.24
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
font-family:;
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:;
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.5pt;
font-family:;}
p.35, li.35, div.35
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.4, li.4, div.4
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
p.41, li.41, div.41
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.55, li.55, div.55
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.56, li.56, div.56
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.57, li.57, div.57
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.6, li.6, div.6
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.60, li.60, div.60
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.61, li.61, div.61
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.7, li.7, div.7
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.70, li.70, div.70
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.71, li.71, div.71
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.8, li.8, div.8
{mso-style-name:8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.9, li.9, div.9
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.90, li.90, div.90
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.100, li.100, div.100
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.101, li.101, div.101
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.114, li.114, div.114
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.115, li.115, div.115
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.116, li.116, div.116
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.123, li.123, div.123
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.124, li.124, div.124
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
font-weight:bold;}
p.17, li.17, div.17
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.37, li.37, div.37
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;
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:;
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:;}
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:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
p.af0, li.af0, div.af0
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
{mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
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.5pt;
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.5pt;
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.5pt;
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:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
span.3CharChar1
{mso-style-name:"图中文字3 Char Char1";
font-family:;}
span.5CharCharChar0
{mso-style-name:"图中文字5号 Char Char Char";
font-family:;}
span.3CharChar3
{mso-style-name:"图中文字3 Char Char3";
font-family:;}
span.3CharChar1Char
{mso-style-name:"图中文字3 Char Char1 Char";
font-family:;}
span.3CharChar13
{mso-style-name:"图中文字3 Char Char13";
font-family:;}
span.3CharChar12
{mso-style-name:"图中文字3 Char Char12";
font-family:;}
span.3CharChar11
{mso-style-name:"图中文字3 Char Char11";
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="_Toc53320607"><span style='font-family:黑体'>程序</span><span
lang=EN-US>8-5 linux/kernel/sched.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/sched.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;*
'sched.c' is the main kernel file. It contains scheduling primitives</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>9</span></u> <b><i>&nbsp;*
(sleep_on, wakeup, schedule etc) as well as a number of simple system</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>10</span></u> <b><i>&nbsp;*
call functions (type getpid(), which just extracts a field from</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>11</span></u> <b><i>&nbsp;*
current-task</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; * 'sched.c'</span>是主要的内核文件。其中包括有关调度的基本函数<span
lang=EN-US>(sleep_on</span><span lang=EN-US>wakeup</span><span lang=EN-US>schedule</span><span
lang=EN-US>)</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>以及一些简单的系统调用函数(比如<span
lang=EN-US>getpid()</span>,仅从当前任务中获取一个字段)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;</span></p>
<p class=a><span lang=EN-US>&nbsp; &nbsp;&nbsp;// </span>下面是调度程序头文件。定义了任务结构<span
lang=EN-US>task_struct</span>、第<span lang=EN-US>1</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'>13</span></u>
#include &lt;linux/sched.h&gt;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>14</span></u>
#include &lt;linux/kernel.h&gt; // </span>内核头文件。含有一些内核常用函数的原形定义。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>15</span></u>
#include &lt;linux/sys.h&gt;&nbsp;&nbsp;&nbsp; // </span>系统调用头文件。含有<span
lang=EN-US>82</span>个系统调用<span lang=EN-US>C</span>函数程序<span lang=EN-US>,</span><span
lang=EN-US>'sys_'</span>开头。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>16</span></u>
#include &lt;linux/fdreg.h&gt;&nbsp; // </span>软驱头文件。含有软盘控制器参数的一些定义。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>17</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'>18</span></u>
#include &lt;asm/io.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // io</span>头文件。定义硬件端口输入<span
lang=EN-US>/</span>输出宏汇编语句。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>19</span></u>
#include &lt;asm/segment.h&gt;&nbsp; // </span>段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>20</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>21</span></u>
#include &lt;signal.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>信号头文件。定义信号符号常量,<span
lang=EN-US>sigaction</span>结构,操作函数原型。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>22</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该宏取信号<span lang=EN-US>nr</span>在信号位图中对应位的二进制数值。信号编号<span
lang=EN-US>1-32</span>。比如信号<span lang=EN-US>5</span>的位图数值等于</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 1&lt;&lt;(5-1) = 16 =
00010000b</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>23</span></u>
#define <u><span style='color:blue'>_S</span></u>(nr) (1&lt;&lt;((nr)-1))</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>除了<span lang=EN-US>SIGKILL</span><span
lang=EN-US>SIGSTOP</span>信号以外其他信号都是可阻塞的<span lang=EN-US>(…1011,1111,1110,1111,1111b)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>24</span></u>
#define <u><span style='color:blue'>_BLOCKABLE</span></u> (~(<u><span
style='color:blue'>_S</span></u>(<u><span style='color:blue'>SIGKILL</span></u>)
| <u><span style='color:blue'>_S</span></u>(<u><span style='color:blue'>SIGSTOP</span></u>)))</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;&nbsp;&nbsp; // </span>内核调试函数。显示任务号<span
lang=EN-US>nr</span>的进程号、进程状态和内核堆栈空闲字节数(大约)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>26</span></u>
void <u><span style='color:blue'>show_task</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'>27</span></u> {</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;
int i,j = 4096-sizeof(struct <u><span style='color:blue'>task_struct</span></u>);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>29</span></u> </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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;%d: pid=%d, state=%d,
father=%d, child=%d, &quot;</i>,nr,p-&gt;pid,</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;<u><span style='color:blue'>state</span></u>, p-&gt;p_pptr-&gt;pid,
p-&gt;p_cptr ? p-&gt;p_cptr-&gt;pid : -1);</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;
i=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;
while (i&lt;j &amp;&amp; !((char *)(p+1))[i])&nbsp; // </span>检测指定任务数据结构以后等于<span
lang=EN-US>0</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;
i++;</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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;%d/%d chars free in
kstack\n\r&quot;</i>,i,j);</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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;&nbsp;&nbsp;
PC=%08X.&quot;</i>, *(1019 + (unsigned long *) p));</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>37</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (p-&gt;p_ysptr || p-&gt;p_osptr) </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>38</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>printk</span></u>(<i>&quot;&nbsp;&nbsp; Younger
sib=%d, older sib=%d\n\r&quot;</i>, </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>39</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;p_ysptr ? p-&gt;p_ysptr-&gt;pid : -1,</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>40</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;p_osptr ? p-&gt;p_osptr-&gt;pid : -1);</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;
else</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>printk</span></u>(<i>&quot;\n\r&quot;</i>);</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;<u><span style='color:blue'>44</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; // NR_TASKS</span>是系统能容纳的最大进程<span
lang=EN-US>(</span>任务<span lang=EN-US>)</span>数量<span lang=EN-US>(64</span><span
lang=EN-US>)</span>,定义在<span lang=EN-US>include/kernel/sched.h </span><span
lang=EN-US>6</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>45</span></u>
void <u><span style='color:blue'>show_state</span></u>(void)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>46</span></u> {</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;
int i;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>48</span></u> </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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;\rTask-info:\n\r&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;
for (i=0;i&lt;<u><span style='color:blue'>NR_TASKS</span></u>;i++)</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;
if (<u><span style='color:blue'>task</span></u>[i])</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>show_task</span></u>(i,<u><span style='color:blue'>task</span></u>[i]);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>53</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>54</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // PC</span><span lang=EN-US>8253</span>定时芯片的输入时钟频率约为<span
lang=EN-US>1.193180MHz</span><span lang=EN-US>Linux</span>内核希望定时器发出中断的频率是</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 100Hz</span>,也即每<span
lang=EN-US>10ms</span>发出一次时钟中断。因此这里<span lang=EN-US>LATCH</span>是设置<span
lang=EN-US>8253</span>芯片的初值,参见<span lang=EN-US>438</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>55</span></u>
#define <u><span style='color:blue'>LATCH</span></u> (1193180/<u><span
style='color:blue'>HZ</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>56</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>57</span></u>
extern void <u><span style='color:blue'>mem_use</span></u>(void); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
[??]</span>没有任何地方定义和引用该函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>58</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>59</span></u>
extern int <u><span style='color:blue'>timer_interrupt</span></u>(void);&nbsp;
// </span>时钟中断处理程序(<span lang=EN-US>kernel/system_call.s</span><span
lang=EN-US>176</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>60</span></u>
extern int <u><span style='color:blue'>system_call</span></u>(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>系统调用中断处理程序(<span lang=EN-US>kernel/system_call.s</span><span
lang=EN-US>80</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;&nbsp;&nbsp; // </span>每个任务(进程)在内核态运行时都有自己的内核态堆栈。这里定义了任务的内核态堆栈结构。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这里定义任务联合(任务结构成员和<span
lang=EN-US>stack</span>字符数组成员)。因为一个任务的数据结构与其内核</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>态堆栈放在同一内存页中,所以从堆栈段寄存器<span
lang=EN-US>ss</span>可以获得其数据段选择符。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>62</span></u>
union <u><span style='color:blue'>task_union</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>63</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
struct <u><span style='color:blue'>task_struct</span></u> <u><span
style='color:blue'>task</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>64</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
char stack[<u><span style='color:blue'>PAGE_SIZE</span></u>];</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>65</span></u> };</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>66</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>设置初始任务的数据。初始数据在<span
lang=EN-US>include/kernel/sched.h</span>中,第<span lang=EN-US>156</span>行开始。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>67</span></u>
static union <u><span style='color:blue'>task_union</span></u> <u><span
style='color:blue'>init_task</span></u> = {<u><span style='color:blue'>INIT_TASK</span></u>,};</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>68</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>从开机开始算起的滴答数时间值全局变量(<span
lang=EN-US>10ms/</span>滴答)。系统时钟中断每发生一次即一个滴答。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>前面的限定符 <span
lang=EN-US>volatile</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>ebx</span>,以提高访问效率。当<span lang=EN-US>CPU</span>把其值放到 <span
lang=EN-US>ebx</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>ebx</span>中的值并不会随之更新。为了解决这种情况就创建了<span lang=EN-US>volatile</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>限定符,让代码在引用该变量时一定要从指定内存位置中取得其值。这里即是要求
<span lang=EN-US>gcc</span>不要对</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // jiffies </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'>69</span></u>
unsigned long volatile <u><span style='color:blue'>jiffies</span></u>=0;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>70</span></u>
unsigned long <u><span style='color:blue'>startup_time</span></u>=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// </span>开机时间。从<span lang=EN-US>1970:0:0:0</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'>71</span></u> int
<u><span style='color:blue'>jiffies_offset</span></u> =
0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/* # clock ticks to
add to get &quot;true</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>72</span></u> <b><i>&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;time&quot;.&nbsp;
Should always be less than</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>73</span></u> <b><i>&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;1
second's worth.&nbsp; For time fanatics</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>74</span></u> <b><i>&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;who
like to syncronize their machines</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>75</span></u> <b><i>&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;to
WWV :-) */</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; * </span>的总和不应该超过<span
lang=EN-US>1</span>秒。这样做是为了那些对时间精确度要求苛刻的人,他们喜</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>欢自己的机器时间与<span
lang=EN-US>WWV</span>同步 <span lang=EN-US>:-)</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'>76</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>77</span></u>
struct <u><span style='color:blue'>task_struct</span></u> *<u><span
style='color:blue'>current</span></u> = &amp;(<u><span style='color:blue'>init_task</span></u>.<u><span
style='color:blue'>task</span></u>);&nbsp; // </span>当前任务指针(初始化指向任务<span
lang=EN-US>0</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>78</span></u>
struct <u><span style='color:blue'>task_struct</span></u> *<u><span
style='color:blue'>last_task_used_math</span></u> = <u><span style='color:blue'>NULL</span></u>;&nbsp;&nbsp;
// </span>使用过协处理器任务的指针。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>79</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>定义任务指针数组。第<span
lang=EN-US>1</span>项被初始化指向初始任务(任务<span lang=EN-US>0</span>)的任务数据结构。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>80</span></u>
struct <u><span style='color:blue'>task_struct</span></u> * <u><span
style='color:blue'>task</span></u>[<u><span style='color:blue'>NR_TASKS</span></u>]
= {&amp;(<u><span style='color:blue'>init_task</span></u>.<u><span
style='color:blue'>task</span></u>), };</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>81</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>定义用户堆栈,共<span
lang=EN-US>1K</span>项,容量<span lang=EN-US>4K</span>字节。在内核初始化操作过程中被用作内核栈,初始化完成</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>以后将被用作任务<span
lang=EN-US>0</span>的用户态堆栈。在运行任务<span lang=EN-US>0</span>之前它是内核栈,以后用作任务<span
lang=EN-US>0</span><span lang=EN-US>1</span>的用</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>户态栈。下面结构用于设置堆栈<span
lang=EN-US>ss:esp</span>(数据段选择符,指针),见<span lang=EN-US>head.s</span>,第<span
lang=EN-US>23</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ss</span>被设置为内核数据段选择符(<span
lang=EN-US>0x10</span>),指针<span lang=EN-US>esp</span>指在 <span lang=EN-US>user_stack</span>数组最后一项后面。这是</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>因为<span lang=EN-US>Intel
CPU</span>执行堆栈操作时是先递减堆栈指针<span lang=EN-US>sp</span>值,然后在<span lang=EN-US>sp</span>指针处保存入栈内容。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>82</span></u>
long <u><span style='color:blue'>user_stack</span></u> [ <u><span
style='color:blue'>PAGE_SIZE</span></u>&gt;&gt;2 ] ;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>83</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>84</span></u>
struct {</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;
long * a;</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;
short b;</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;
} stack_start = { &amp; <u><span style='color:blue'>user_stack</span></u> [<u><span
style='color:blue'>PAGE_SIZE</span></u>&gt;&gt;2] , 0x10 };</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>88</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>89</span></u> <b><i>&nbsp;*&nbsp;
'math_state_restore()' saves the current math information in the</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>90</span></u> <b><i>&nbsp;*
old math state array, and gets the new ones from the current task</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>91</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; * </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>来的当前任务的协处理器执行状态。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>92</span></u>
void <u><span style='color:blue'>math_state_restore</span></u>()</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>93</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果任务没变则返回<span
lang=EN-US>(</span>上一个任务就是当前任务<span lang=EN-US>)</span>。这里<span lang=EN-US>&quot;</span>上一个任务<span
lang=EN-US>&quot;</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;
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><span lang=EN-US>&nbsp;<u><span style='color:blue'>95</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;</span></p>
<p class=a><span lang=EN-US>&nbsp; &nbsp;&nbsp;// </span>在发送协处理器命令之前要先发<span
lang=EN-US>WAIT</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;
__asm__(<i>&quot;fwait&quot;</i>);</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;
if (<u><span style='color:blue'>last_task_used_math</span></u>) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
__asm__(<i>&quot;fnsave %0&quot;</i>::<i>&quot;m&quot;</i> (<u><span
style='color:blue'>last_task_used_math</span></u>-&gt;tss.i387));</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;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>现在,<span lang=EN-US>last_task_used_math</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><u><span lang=EN-US style='color:blue'>100</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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'>101</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;used_math) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
__asm__(<i>&quot;frstor %0&quot;</i>::<i>&quot;m&quot;</i> (<u><span
style='color:blue'>current</span></u>-&gt;tss.i387));</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;} else {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
__asm__(<i>&quot;fninit&quot;</i>::);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;// </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;used_math=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;// </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; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
lang=EN-US> }</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>&nbsp;*&nbsp; 'schedule()' is the scheduler function. This is
GOOD CODE! There</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
lang=EN-US> <b><i>&nbsp;* probably won't be any reason to change this, as it
should work well</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
lang=EN-US> <b><i>&nbsp;* in all circumstances (ie gives IO-bound processes
good response etc).</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
lang=EN-US> <b><i>&nbsp;* The one thing you might take a look at is the
signal-handler code here.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
lang=EN-US> <b><i>&nbsp;*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
lang=EN-US> <b><i>&nbsp;*&nbsp;&nbsp; NOTE!!&nbsp; Task 0 is the 'idle' task,
which gets called when no other</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
lang=EN-US> <b><i>&nbsp;* tasks can run. It can not be killed, and it cannot
sleep. The 'state'</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
lang=EN-US> <b><i>&nbsp;* information in task[0] is never used.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
lang=EN-US> <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; * 'schedule()'</span>是调度函数。这是个很好的代码!没有任何理由对它进行修改,因为</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>它可以在所有的环境下工作(比如能够对<span
lang=EN-US>IO-</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;&nbsp; *&nbsp;&nbsp; </span>注意!!任务<span
lang=EN-US>0</span>是个闲置<span lang=EN-US>('idle')</span>任务,只有当没有其他任务可以运行时才调用</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>它。它不能被杀死,也不能睡眠。任务<span
lang=EN-US>0</span>中的状态信息<span lang=EN-US>'state'</span>是从来不用的。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
lang=EN-US> void <u><span style='color:blue'>schedule</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
lang=EN-US> {</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; int i,next,c;</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; struct <u><span
style='color:blue'>task_struct</span></u> ** p;&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'>123</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
lang=EN-US> <b><i>/* check alarm, wake up any interruptible tasks that have got
a signal */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span>检测<span lang=EN-US>alarm</span>(进程的报警定时值),唤醒任何已得到信号的可中断任务<span
lang=EN-US> */</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>从任务数组中最后一个任务开始循环检测<span
lang=EN-US>alarm</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; for(p = &amp;<u><span
style='color:blue'>LAST_TASK</span></u> ; p &gt; &amp;<u><span
style='color:blue'>FIRST_TASK</span></u> ; --p)</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;
if (*p) {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果设置过任务超时定时<span
lang=EN-US>timeout</span>,并且已经超时,则复位超时定时值,并且如果任务处于可</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中断睡眠状态<span
lang=EN-US>TASK_INTERRUPTIBLE</span>下,将其置为就绪状态(<span lang=EN-US>TASK_RUNNING</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((*p)-&gt;timeout &amp;&amp; (*p)-&gt;timeout &lt; <u><span
style='color:blue'>jiffies</span></u>) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*p)-&gt;timeout = 0;</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;&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 ((*p)-&gt;<u><span style='color:blue'>state</span></u> == <u><span
style='color:blue'>TASK_INTERRUPTIBLE</span></u>)</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;&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;
(*p)-&gt;<u><span style='color:blue'>state</span></u> = <u><span
style='color:blue'>TASK_RUNNING</span></u>;</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;&nbsp;&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;&nbsp;&nbsp; // </span>如果设置过任务的定时值<span
lang=EN-US>alarm</span>,并且已经过期<span lang=EN-US>(alarm&lt;jiffies),</span>则在信号位图中置<span
lang=EN-US>SIGALRM</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>信号,即向任务发送<span
lang=EN-US>SIGALARM</span>信号。然后清<span lang=EN-US>alarm</span>。该信号的默认操作是终止进程。<span
lang=EN-US>jiffies</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>是系统从开机开始算起的滴答数(<span
lang=EN-US>10ms/</span>滴答)。定义在<span lang=EN-US>sched.h</span><span lang=EN-US>139</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((*p)-&gt;<u><span style='color:blue'>alarm</span></u> &amp;&amp; (*p)-&gt;<u><span
style='color:blue'>alarm</span></u> &lt; <u><span style='color:blue'>jiffies</span></u>)
{</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*p)-&gt;signal |= (1&lt;&lt;(<u><span style='color:blue'>SIGALRM</span></u>-1));</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*p)-&gt;<u><span style='color:blue'>alarm</span></u> = 0;</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;&nbsp;&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;&nbsp;&nbsp; // </span>如果信号位图中除被阻塞的信号外还有其他信号,并且任务处于可中断状态,则置任务为就绪</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>状态。其中<span lang=EN-US>'~(<u><span
style='color:blue'>_BLOCKABLE</span></u> &amp; (*p)-&gt;blocked)'</span>用于忽略被阻塞的信号,但<span
lang=EN-US>SIGKILL</span><span lang=EN-US>SIGSTOP</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'>137</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 (((*p)-&gt;signal &amp; ~(<u><span style='color:blue'>_BLOCKABLE</span></u>
&amp; (*p)-&gt;blocked)) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*p)-&gt;<u><span style='color:blue'>state</span></u>==<u><span
style='color:blue'>TASK_INTERRUPTIBLE</span></u>)</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; //</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</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> <b><i>/* this is the scheduler proper: */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </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> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (1) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c</span><span lang=EN-US> = -1;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
next = 0;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
i = <u><span style='color:blue'>NR_TASKS</span></u>;</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;
p = &amp;<u><span style='color:blue'>task</span></u>[<u><span style='color:
blue'>NR_TASKS</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>counter</span>(任务运行时间的递减滴答计数)值,哪一个值大,运行时间还不长,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // next</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;
while (--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 (!*--p)</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;
continue;</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;
if ((*p)-&gt;<u><span style='color:blue'>state</span></u> == <u><span
style='color:blue'>TASK_RUNNING</span></u> &amp;&amp; (*p)-&gt;counter &gt; c)</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c</span><span lang=EN-US> = (*p)-&gt;counter, next = i;</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;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果比较得出有<span
lang=EN-US>counter</span>值不等于<span lang=EN-US>0</span>的结果,或者系统中没有一个可运行的任务存在(此时<span
lang=EN-US>c</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>仍然为<span lang=EN-US>-1</span><span
lang=EN-US>next=0</span>),则退出<span lang=EN-US>144</span>行开始的循环,执行<span
lang=EN-US>161</span>行上的任务切换操作。否则就根据</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>每个任务的优先权值,更新每一个任务的<span
lang=EN-US>counter</span>值,然后回到<span lang=EN-US>125</span>行重新比较。<span
lang=EN-US>counter </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的计算方式为 <span
lang=EN-US>counter = counter /2 + priority</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;
if (c) break;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for(p = &amp;<u><span style='color:blue'>LAST_TASK</span></u> ; p &gt; &amp;<u><span
style='color:blue'>FIRST_TASK</span></u> ; --p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>157</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 (*p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>158</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;
(*p)-&gt;counter = ((*p)-&gt;counter &gt;&gt; 1) +</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>159</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*p)-&gt;priority;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>160</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>sched.h</span>中)把当前任务指针<span lang=EN-US>current</span>指向任务号为<span
lang=EN-US>next</span>的任务,并切换</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>到该任务中运行。在<span
lang=EN-US>146</span>行上<span lang=EN-US>next</span>被初始化为<span lang=EN-US>0</span>。因此若系统中没有任何其他任务可运行时,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>next
</span>始终为<span lang=EN-US>0</span>。因此调度函数会在系统空闲时去执行任务<span lang=EN-US>0</span>
此时任务<span lang=EN-US>0</span>仅执行<span lang=EN-US>pause()</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'>161</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>switch_to</span></u>(next);&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>next</span>的任务,并运行之。</p>
<p class=a><u><span lang=EN-US style='color:blue'>162</span></u><span
lang=EN-US> }</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>&nbsp;&nbsp;&nbsp; //// pause()</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>pause()</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>会返回。此时 <span
lang=EN-US>pause()</span>返回值应该是 <span lang=EN-US>-1</span>,并且 <span lang=EN-US>errno</span>被置为
<span lang=EN-US>EINTR</span>。这里还没有完全实现</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>(直到<span lang=EN-US>0.95</span>版)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>164</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_pause</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>165</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>166</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>state</span></u>
= <u><span style='color:blue'>TASK_INTERRUPTIBLE</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>167</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>schedule</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>168</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>169</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>170</span></u><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>p</span>是等待任务队列头指针。指针是含有一个变量地址的变量。这里参数<span
lang=EN-US>p</span>使用了指针的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>指针形式 <span lang=EN-US>'**p'</span>,这是因为<span
lang=EN-US>C</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;&nbsp;&nbsp; // </span>函数程序中原来就是指针变量的值,就需要传递指针<span
lang=EN-US>'*p'</span>的指针,即<span lang=EN-US>'**p'</span>。参见程序前示例图中</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // p</span>指针的使用情况。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>state</span>是任务睡眠使用的状态:<span
lang=EN-US>TASK_UNINTERRUPTIBLE</span><span lang=EN-US>TASK_INTERRUPTIBLE</span>。处于不可</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中断睡眠状态(<span
lang=EN-US>TASK_UNINTERRUPTIBLE</span>)的任务需要内核程序利用<span lang=EN-US>wake_up()</span>函数明确唤醒之。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>处于可中断睡眠状态(<span
lang=EN-US>TASK_INTERRUPTIBLE</span>)可以通过信号、任务超时等手段唤醒 (置为就绪</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>状态<span lang=EN-US>TASK_RUNNING</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'>171</span></u><span
lang=EN-US> static inline void <u><span style='color:blue'>__sleep_on</span></u>(struct
<u><span style='color:blue'>task_struct</span></u> **p, int <u><span
style='color:blue'>state</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>172</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>173</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>task_struct</span></u> *tmp;</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><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若指针无效,则退出。(指针所指的对象可以是<span
lang=EN-US>NULL</span>,但指针本身不会为<span lang=EN-US>0)</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前任务是任务<span
lang=EN-US>0</span>,则死机<span lang=EN-US>(impossible!)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>175</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>176</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>177</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u> == &amp;(<u><span style='color:blue'>init_task</span></u>.<u><span
style='color:blue'>task</span></u>))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>178</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'>panic</span></u>(<i>&quot;task[0] trying to
sleep&quot;</i>);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>tmp</span>指向已经在等待队列上的任务<span
lang=EN-US>(</span>如果有的话<span lang=EN-US>)</span>,例如<span lang=EN-US>inode-&gt;i_wait</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;&nbsp;&nbsp; // </span>为指定的等待状态,并执行重新调度。</p>
<p class=a><u><span lang=EN-US style='color:blue'>179</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = *p;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>180</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p = <u><span
style='color:blue'>current</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>181</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>state</span></u>
= <u><span style='color:blue'>state</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>182</span></u><span
lang=EN-US> repeat: <u><span style='color:blue'>schedule</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>*p </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>就绪状态,而自己则置为不可中断等待状态,即自己要等待这些后续进队列的任务被唤醒</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>而执行时来唤醒本任务。然后重新执行调度程序。</p>
<p class=a><u><span lang=EN-US style='color:blue'>183</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*p &amp;&amp;
*p != <u><span style='color:blue'>current</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>184</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(**p).<u><span style='color:blue'>state</span></u> = 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>185</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;<u><span style='color:blue'>state</span></u>
= <u><span style='color:blue'>TASK_UNINTERRUPTIBLE</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>186</span></u><span
lang=EN-US>&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'>187</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>执行到这里,说明本任务真正被唤醒执行。此时等待队列头指针应该指向本任务,若它为</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
= tmp</span>)。 若确实存在这样一个任务,即队列中还有任务(<span lang=EN-US>tmp</span>不为空),就</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>唤醒之。最先进入队列的任务在唤醒后运行时最终会把等待队列头指针置成<span
lang=EN-US>NULL</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>188</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!*p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>189</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'>printk</span></u>(<i>&quot;Warning: *P =
NULL\n\r&quot;</i>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>190</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*p = tmp)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>191</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tmp-&gt;<u><span style='color:blue'>state</span></u>=0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>192</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>193</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>将当前任务置为可中断的等待状态(<span
lang=EN-US>TASK_INTERRUPTIBLE</span>),并放入头指针<span lang=EN-US>*p</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'>194</span></u><span
lang=EN-US> void <u><span style='color:blue'>interruptible_sleep_on</span></u>(struct
<u><span style='color:blue'>task_struct</span></u> **p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>195</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>196</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>__sleep_on</span></u>(p,<u><span style='color:blue'>TASK_INTERRUPTIBLE</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>197</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>198</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>把当前任务置为不可中断的等待状态(<span
lang=EN-US>TASK_UNINTERRUPTIBLE</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'>199</span></u><span
lang=EN-US> void <u><span style='color:blue'>sleep_on</span></u>(struct <u><span
style='color:blue'>task_struct</span></u> **p)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>__sleep_on</span></u>(p,<u><span style='color:blue'>TASK_UNINTERRUPTIBLE</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>202</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>203</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>唤醒 <span lang=EN-US>*p</span>指向的任务。<span
lang=EN-US>*p</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><u><span lang=EN-US style='color:blue'>204</span></u><span
lang=EN-US> void <u><span style='color:blue'>wake_up</span></u>(struct <u><span
style='color:blue'>task_struct</span></u> **p)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>205</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>206</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p &amp;&amp;
*p) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>207</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((**p).<u><span style='color:blue'>state</span></u> == <u><span
style='color:blue'>TASK_STOPPED</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>处于停止状态。</p>
<p class=a><u><span lang=EN-US style='color:blue'>208</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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;wake_up:
TASK_STOPPED&quot;</i>); </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>209</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((**p).<u><span style='color:blue'>state</span></u> == <u><span
style='color:blue'>TASK_ZOMBIE</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>处于僵死状态。</p>
<p class=a><u><span lang=EN-US style='color:blue'>210</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;
<u><span style='color:blue'>printk</span></u>(<i>&quot;wake_up:
TASK_ZOMBIE&quot;</i>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>211</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(**p).<u><span style='color:blue'>state</span></u>=0;&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>TASK_RUNNING</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>212</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>213</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>214</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>215</span></u><span
lang=EN-US> <b><i>/*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>216</span></u><span
lang=EN-US> <b><i>&nbsp;* OK, here are some floppy things that shouldn't be in
the kernel</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>217</span></u><span
lang=EN-US> <b><i>&nbsp;* proper. They are here because the floppy needs a
timer, and this</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>218</span></u><span
lang=EN-US> <b><i>&nbsp;* was the easiest way of doing it.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>219</span></u><span
lang=EN-US> <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; * </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>下面<span lang=EN-US>220
-- 281</span>行代码用于处理软驱定时。在阅读这段代码之前请先看一下块设备一章中</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>有关软盘驱动程序(<span
lang=EN-US>floppy.c</span>)后面的说明, 或者到阅读软盘块设备驱动程序时在来看这</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>段代码。其中时间单位:<span
lang=EN-US>1</span>个滴答<span lang=EN-US> = 1/100</span>秒。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面数组<span lang=EN-US>wait_motor[]</span>用于存放等待软驱马达启动到正常转速的进程指针。数组索引<span
lang=EN-US>0-3</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>分别对应软驱<span
lang=EN-US>A--D</span>。数组<span lang=EN-US> mon_timer[]</span>存放各软驱马达启动所需要的滴答数。程序中默认</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>启动时间为<span lang=EN-US>50</span>个滴答(<span
lang=EN-US>0.5</span>秒)。数组<span lang=EN-US> moff_timer[] </span>存放各软驱在马达停转之前需维持</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的时间。程序中设定为<span
lang=EN-US>10000</span>个滴答(<span lang=EN-US>100</span>秒)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>220</span></u><span
lang=EN-US> static struct <u><span style='color:blue'>task_struct</span></u> * <u><span
style='color:blue'>wait_motor</span></u>[4] = {<u><span style='color:blue'>NULL</span></u>,<u><span
style='color:blue'>NULL</span></u>,<u><span style='color:blue'>NULL</span></u>,<u><span
style='color:blue'>NULL</span></u>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>221</span></u><span
lang=EN-US> static int&nbsp; <u><span style='color:blue'>mon_timer</span></u>[4]={0,0,0,0};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>222</span></u><span
lang=EN-US> static int <u><span style='color:blue'>moff_timer</span></u>[4]={0,0,0,0};</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>7-4</span>:分别控制驱动器<span
lang=EN-US>D-A</span>马达的启动。<span lang=EN-US>1 - </span>启动;<span lang=EN-US>0 - </span>关闭。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>3&nbsp;
</span><span lang=EN-US>1 - </span>允许<span lang=EN-US>DMA</span>和中断请求;<span
lang=EN-US>0 - </span>禁止<span lang=EN-US>DMA</span>和中断请求。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>2&nbsp;
</span><span lang=EN-US>1 - </span>启动软盘控制器;<span lang=EN-US>&nbsp;&nbsp;&nbsp;
0 - </span>复位软盘控制器。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>1-0</span><span
lang=EN-US>00 - 11</span>,用于选择控制的软驱<span lang=EN-US>A-D</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这里设置初值为:允许<span
lang=EN-US>DMA</span>和中断请求、启动<span lang=EN-US>FDC</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>223</span></u><span
lang=EN-US> unsigned char <u><span style='color:blue'>current_DOR</span></u> =
0x0C;</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>&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>(0--3)</span>,返回值为滴答数。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>局部变量<span lang=EN-US>selected</span>是选中软驱标志(<span
lang=EN-US>blk_drv/floppy.c</span><span lang=EN-US>123</span>行)。<span
lang=EN-US>mask</span>是所选软驱对应的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>数字输出寄存器中启动马达比特位。<span
lang=EN-US>mask</span><span lang=EN-US>4</span>位是各软驱启动马达标志。</p>
<p class=a><u><span lang=EN-US style='color:blue'>225</span></u><span
lang=EN-US> int <u><span style='color:blue'>ticks_to_floppy_on</span></u>(unsigned
int nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>226</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>227</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extern unsigned
char <u><span style='color:blue'>selected</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>228</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char mask
= 0x10 &lt;&lt; nr;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>229</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>系统最多有<span lang=EN-US>4</span>个软驱。首先预先设置好指定软驱<span
lang=EN-US>nr</span>停转之前需要经过的时间(<span lang=EN-US>100</span>秒)。然后</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取当前<span lang=EN-US>DOR</span>寄存器值到临时变量<span
lang=EN-US>mask</span>中,并把指定软驱的马达启动标志置位。</p>
<p class=a><u><span lang=EN-US style='color:blue'>230</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nr&gt;3)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>231</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'>panic</span></u>(<i>&quot;floppy_on: nr&gt;3&quot;</i>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>232</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>moff_timer</span></u>[nr]=10000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* 100 s = very big :-) */</i></b>&nbsp;&nbsp; // </span>停转维持时间。</p>
<p class=a><u><span lang=EN-US style='color:blue'>233</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>cli</span></u>();&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;
<b><i>/* use floppy_off to turn it off */</i></b> // </span>关中断。</p>
<p class=a><u><span lang=EN-US style='color:blue'>234</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mask |= <u><span
style='color:blue'>current_DOR</span></u>;</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'>235</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!<u><span
style='color:blue'>selected</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>236</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mask &amp;= 0xFC;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>237</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mask |= nr;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>238</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>FDC</span>数字输出端口输出新值<span lang=EN-US>(mask)</span>,并且</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果要求启动的马达还没有启动,则置相应软驱的马达启动定时器值(<span
lang=EN-US>HZ/2 = 0.5</span>秒或<span lang=EN-US> 50</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>滴答)。若已经启动,则再设置启动定时为<span
lang=EN-US>2</span>个滴答,能满足下面 <span lang=EN-US>do_floppy_timer()</span>中先递</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>减后判断的要求。执行本次定时代码的要求即可。此后更新当前数字输出寄存器<span
lang=EN-US>current_DOR</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>239</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mask != <u><span
style='color:blue'>current_DOR</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>240</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'>outb</span></u>(mask,<u><span style='color:blue'>FD_DOR</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>241</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((mask ^ <u><span style='color:blue'>current_DOR</span></u>) &amp; 0xf0)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>242</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;
<u><span style='color:blue'>mon_timer</span></u>[nr] = <u><span
style='color:blue'>HZ</span></u>/2;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>243</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
else if (<u><span style='color:blue'>mon_timer</span></u>[nr] &lt; 2)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>244</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;
<u><span style='color:blue'>mon_timer</span></u>[nr] = 2;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>245</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_DOR</span></u> = mask;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>246</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>247</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>sti</span></u>();&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>开中断。</p>
<p class=a><u><span lang=EN-US style='color:blue'>248</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>mon_timer</span></u>[nr];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>最后返回启动马达所需的时间值。</p>
<p class=a><u><span lang=EN-US style='color:blue'>249</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>250</span></u><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>设置指定软驱的马达启动到正常转速所需的延时,然后睡眠等待。在定时中断过程中会一直</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>递减判断这里设定的延时值。当延时到期,就会唤醒这里的等待进程。</p>
<p class=a><u><span lang=EN-US style='color:blue'>251</span></u><span
lang=EN-US> void <u><span style='color:blue'>floppy_on</span></u>(unsigned int
nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>252</span></u><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>运行的队列中。然后开中断。</p>
<p class=a><u><span lang=EN-US style='color:blue'>253</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>cli</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>254</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (<u><span
style='color:blue'>ticks_to_floppy_on</span></u>(nr))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>255</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'>sleep_on</span></u>(nr+<u><span style='color:blue'>wait_motor</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>256</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>257</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>258</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>置关闭相应软驱马达停转定时器(<span
lang=EN-US>3</span>秒)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若不使用该函数明确关闭指定的软驱马达,则在马达开启<span
lang=EN-US>100</span>秒之后也会被关闭。</p>
<p class=a><u><span lang=EN-US style='color:blue'>259</span></u><span
lang=EN-US> void <u><span style='color:blue'>floppy_off</span></u>(unsigned int
nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>260</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>261</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>moff_timer</span></u>[nr]=3*<u><span style='color:blue'>HZ</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>262</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>263</span></u><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>(10ms)</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'>264</span></u><span
lang=EN-US> void <u><span style='color:blue'>do_floppy_timer</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>265</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>266</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'>267</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char mask
= 0x10;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>268</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>269</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0 ; i&lt;4 ;
i++,mask &lt;&lt;= 1) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>270</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!(mask &amp; <u><span style='color:blue'>current_DOR</span></u>))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>如果不是<span lang=EN-US>DOR</span>指定的马达则跳过。</p>
<p class=a><u><span lang=EN-US style='color:blue'>271</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;
continue;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>272</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'>mon_timer</span></u>[i]) {&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'>273</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'>mon_timer</span></u>[i])</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>274</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;
<u><span style='color:blue'>wake_up</span></u>(i+<u><span style='color:blue'>wait_motor</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>275</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else if (!<u><span style='color:blue'>moff_timer</span></u>[i]) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>如果马达停转定时到则</p>
<p class=a><u><span lang=EN-US style='color:blue'>276</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;
<u><span style='color:blue'>current_DOR</span></u> &amp;= ~mask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>复位相应马达启动位,并且</p>
<p class=a><u><span lang=EN-US style='color:blue'>277</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;
<u><span style='color:blue'>outb</span></u>(<u><span style='color:blue'>current_DOR</span></u>,<u><span
style='color:blue'>FD_DOR</span></u>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>更新数字输出寄存器。</p>
<p class=a><u><span lang=EN-US style='color:blue'>278</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>279</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;
<u><span style='color:blue'>moff_timer</span></u>[i]--;&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'>280</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>281</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>282</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面是关于定时器的代码。最多可有<span
lang=EN-US>64</span>个定时器。</p>
<p class=a><u><span lang=EN-US style='color:blue'>283</span></u><span
lang=EN-US> #define <u><span style='color:blue'>TIME_REQUESTS</span></u> 64</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>284</span></u><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>Linux</span>系统中的动态定时器(<span lang=EN-US>Dynamic Timer</span>),仅供内核使用。</p>
<p class=a><u><span lang=EN-US style='color:blue'>285</span></u><span
lang=EN-US> static struct <u><span style='color:blue'>timer_list</span></u> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>286</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long <u><span
style='color:blue'>jiffies</span></u>;&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'>287</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void (*fn)();&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'>288</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>timer_list</span></u> * next;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>链接指向下一个定时器。</p>
<p class=a><u><span lang=EN-US style='color:blue'>289</span></u><span
lang=EN-US> } <u><span style='color:blue'>timer_list</span></u>[<u><span
style='color:blue'>TIME_REQUESTS</span></u>], * <u><span style='color:blue'>next_timer</span></u>
= <u><span style='color:blue'>NULL</span></u>;&nbsp; // next_timer</span>是定时器队列头指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>290</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>添加定时器。输入参数为指定的定时值<span
lang=EN-US>(</span>滴答数<span lang=EN-US>)</span>和相应的处理程序指针。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>软盘驱动程序(<span
lang=EN-US>floppy.c</span>)利用该函数执行启动或关闭马达的延时操作。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>jiffies
</span><span lang=EN-US>10</span>毫秒计的滴答数;<span lang=EN-US>*fn()- </span>定时时间到时执行的函数。</p>
<p class=a><u><span lang=EN-US style='color:blue'>291</span></u><span
lang=EN-US> void <u><span style='color:blue'>add_timer</span></u>(long <u><span
style='color:blue'>jiffies</span></u>, void (*fn)(void))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>292</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>293</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>timer_list</span></u> * p;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>294</span></u><span
lang=EN-US> </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'>295</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!fn)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>296</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>297</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>cli</span></u>();</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果定时值<span lang=EN-US>&lt;=0</span>,则立刻调用其处理程序。并且该定时器不加入链表中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>298</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>jiffies</span></u> &lt;= 0)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>299</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(fn)();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>300</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {</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'>301</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (p = <u><span style='color:blue'>timer_list</span></u> ; p &lt; <u><span
style='color:blue'>timer_list</span></u> + <u><span style='color:blue'>TIME_REQUESTS</span></u>
; p++)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>302</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 (!p-&gt;fn)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>303</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;
break;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果已经用完了定时器数组,则系统崩溃<span
lang=EN-US style='font-family:Wingdings'>J</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'>304</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
(p &gt;= <u><span style='color:blue'>timer_list</span></u> + <u><span
style='color:blue'>TIME_REQUESTS</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>305</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;
<u><span style='color:blue'>panic</span></u>(<i>&quot;No more time requests
free&quot;</i>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>306</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;fn = fn;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>307</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;<u><span style='color:blue'>jiffies</span></u> = <u><span
style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>308</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;next = <u><span style='color:blue'>next_timer</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>309</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'>next_timer</span></u> = p;</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>[[?? </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>1</span>个的定时值。即如果第<span lang=EN-US>1</span>个定时值<span lang=EN-US>&lt;=</span><span
lang=EN-US>2</span>个,则第<span lang=EN-US>2</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>定时值扣除第<span
lang=EN-US>1</span>个的值即可,否则进入下面循环中进行处理。<span lang=EN-US>]]</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>310</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (p-&gt;next &amp;&amp; p-&gt;next-&gt;<u><span style='color:blue'>jiffies</span></u>
&lt; p-&gt;<u><span style='color:blue'>jiffies</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>311</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;
p-&gt;<u><span style='color:blue'>jiffies</span></u> -= p-&gt;next-&gt;<u><span
style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>312</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;
fn = p-&gt;fn;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>313</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;
p-&gt;fn = p-&gt;next-&gt;fn;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>314</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;
p-&gt;next-&gt;fn = fn;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>315</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;
<u><span style='color:blue'>jiffies</span></u> = p-&gt;<u><span
style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>316</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;
p-&gt;<u><span style='color:blue'>jiffies</span></u> = p-&gt;next-&gt;<u><span
style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>317</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;
p-&gt;next-&gt;<u><span style='color:blue'>jiffies</span></u> = <u><span
style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>318</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;
p = p-&gt;next;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>319</span></u><span
lang=EN-US>&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'>320</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>321</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>322</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>323</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// </span>时钟中断<span
lang=EN-US>C</span>函数处理程序,在<span lang=EN-US>sys_call.s</span>中的<span
lang=EN-US>_timer_interrupt</span><span lang=EN-US>189</span>行)被调用。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>cpl</span>是当前特权级<span
lang=EN-US>0</span><span lang=EN-US>3</span>,是时钟中断发生时正被执行的代码选择符中的特权级。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // cpl=0</span>时表示中断发生时正在执行内核代码;<span
lang=EN-US>cpl=3</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'>324</span></u><span
lang=EN-US> void <u><span style='color:blue'>do_timer</span></u>(long cpl)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>325</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>326</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static int blanked
= 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>327</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先判断是否经过了一定时间而让屏幕黑屏(<span
lang=EN-US>blankout</span>)。如果<span lang=EN-US>blankcount</span>计数不为零,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>或者黑屏延时间隔时间<span
lang=EN-US>blankinterval</span><span lang=EN-US>0</span>的话,那么若已经处于黑屏状态(黑屏标志</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // blanked = 1</span>),则让屏幕恢复显示。若<span
lang=EN-US>blankcount</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'>328</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>blankcount</span></u> || !<u><span style='color:blue'>blankinterval</span></u>)
{</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>329</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (blanked)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>330</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;
<u><span style='color:blue'>unblank_screen</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>331</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'>blankcount</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>332</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;
<u><span style='color:blue'>blankcount</span></u>--;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>333</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
blanked = 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'>334</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} else if
(!blanked) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>335</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'>blank_screen</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>336</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
blanked = 1;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>337</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>0</span>,则进行硬盘访问超时处理。</p>
<p class=a><u><span lang=EN-US style='color:blue'>338</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>hd_timeout</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>339</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'>hd_timeout</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>340</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;
<u><span style='color:blue'>hd_times_out</span></u>();&nbsp; // </span>硬盘访问超时处理(<span
lang=EN-US>blk_drv/hdc</span><span lang=EN-US>318</span>行)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>341</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果发声计数次数到,则关闭发声。<span
lang=EN-US>(</span><span lang=EN-US>0x61</span>口发送命令,复位位<span lang=EN-US>0</span><span
lang=EN-US>1</span>。位<span lang=EN-US>0</span>控制<span lang=EN-US>8253</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>计数器<span lang=EN-US>2</span>的工作,位<span
lang=EN-US>1</span>控制扬声器<span lang=EN-US>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>342</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>beepcount</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//
</span>扬声器发声时间滴答数(<span lang=EN-US>chr_drv/console.c,950</span>行)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>343</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'>beepcount</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>344</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;
<u><span style='color:blue'>sysbeepstop</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>345</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前特权级<span
lang=EN-US>(cpl)</span><span lang=EN-US>0</span>(最高,表示是内核程序在工作),则将内核代码运行时间<span
lang=EN-US>stime</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>递增;<span lang=EN-US>[ Linus</span>把内核程序统称为超级用户<span
lang=EN-US>(supervisor)</span>的程序,见<span lang=EN-US>sys_call.s</span><span
lang=EN-US>207</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>上的英文注释。这种称呼来自于<span
lang=EN-US>Intel CPU </span>手册。<span lang=EN-US>] </span>如果<span lang=EN-US>cpl
&gt; 0</span>,则表示是一般用户程序</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在工作,增加<span
lang=EN-US>utime</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>346</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cpl)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>347</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;<u><span style='color:blue'>utime</span></u>++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>348</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>349</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;<u><span style='color:blue'>stime</span></u>++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>350</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果有定时器存在,则将链表第<span
lang=EN-US>1</span>个定时器的值减<span lang=EN-US>1</span>。如果已等于<span lang=EN-US>0</span>,则调用相应的处理程序,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>并将该处理程序指针置为空。然后去掉该项定时器。<span
lang=EN-US>next_timer</span>是定时器链表的头指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>351</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>next_timer</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>352</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'>next_timer</span></u>-&gt;<u><span
style='color:blue'>jiffies</span></u>--;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>353</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (<u><span style='color:blue'>next_timer</span></u> &amp;&amp; <u><span
style='color:blue'>next_timer</span></u>-&gt;<u><span style='color:blue'>jiffies</span></u>
&lt;= 0) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>354</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;
void (*fn)(void); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// </span>这里插入了一个函数指针定义!!<span
lang=EN-US style='font-family:Wingdings'>L</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>355</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;
</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>356</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;
fn = <u><span style='color:blue'>next_timer</span></u>-&gt;fn;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>357</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;
<u><span style='color:blue'>next_timer</span></u>-&gt;fn = <u><span
style='color:blue'>NULL</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>358</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;
<u><span style='color:blue'>next_timer</span></u> = <u><span style='color:blue'>next_timer</span></u>-&gt;next;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>359</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;
(fn)();&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'>360</span></u><span
lang=EN-US>&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'>361</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>FDC</span>的数字输出寄存器中马达启动位有置位的,则执行软盘定时程序。</p>
<p class=a><u><span lang=EN-US style='color:blue'>362</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current_DOR</span></u> &amp; 0xf0)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>363</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'>do_floppy_timer</span></u>();</span></p>
<p class=a><span lang=EN-US>&nbsp; // </span>如果进程运行时间还没完,则退出。否则置当前任务运行计数值为<span
lang=EN-US>0</span>。并且若发生时钟中断时</p>
<p class=a><span lang=EN-US>&nbsp; // </span>正在内核代码中运行则返回,否则调用执行调度函数。</p>
<p class=a><u><span lang=EN-US style='color:blue'>364</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((--<u><span
style='color:blue'>current</span></u>-&gt;counter)&gt;0) return;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>365</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;counter=0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>366</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!cpl) return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>对于内核态程序,不依赖<span lang=EN-US>counter</span>值进行调度。</p>
<p class=a><u><span lang=EN-US style='color:blue'>367</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>schedule</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>368</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>369</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>系统调用功能<span
lang=EN-US> - </span>设置报警定时时间值<span lang=EN-US>(</span><span lang=EN-US>)</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若参数<span lang=EN-US>seconds</span>大于<span
lang=EN-US>0</span>,则设置新定时值,并返回原定时时刻还剩余的间隔时间。否则返回<span lang=EN-US>0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>进程数据结构中报警定时值<span
lang=EN-US>alarm</span>的单位是系统滴答(<span lang=EN-US>1</span>滴答为<span lang=EN-US>10</span>毫秒),它是系统开机起到</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>设置定时操作时系统滴答值<span
lang=EN-US>jiffies</span>和转换成滴答单位的定时值之和,即<span lang=EN-US>'jiffies + HZ*</span>定时</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>秒值<span lang=EN-US>'</span>。而参数给出的是以秒为单位的定时值,因此本函数的主要操作是进行两种单位的转换。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>其中常数<span lang=EN-US>HZ
= 100</span>,是内核系统运行频率。定义在<span lang=EN-US>include/sched.h</span><span
lang=EN-US>4</span>行上。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>seconds</span>是新的定时时间值,单位是秒。</p>
<p class=a><u><span lang=EN-US style='color:blue'>370</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_alarm</span></u>(long seconds)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>371</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>372</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int old = <u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>alarm</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>373</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>374</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (old)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>375</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old = (old - <u><span style='color:blue'>jiffies</span></u>) / <u><span
style='color:blue'>HZ</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>376</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>alarm</span></u>
= (seconds&gt;0)?(<u><span style='color:blue'>jiffies</span></u>+<u><span
style='color:blue'>HZ</span></u>*seconds):0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>377</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (old);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>378</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>379</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取当前进程号<span
lang=EN-US>pid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>380</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_getpid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>381</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>382</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>current</span></u>-&gt;pid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>383</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>384</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取父进程号<span lang=EN-US>ppid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>385</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_getppid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>386</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>387</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>current</span></u>-&gt;p_pptr-&gt;pid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>388</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>389</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取用户号<span lang=EN-US>uid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>390</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_getuid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>391</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>392</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>current</span></u>-&gt;uid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>393</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>394</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取有效的用户号<span
lang=EN-US>euid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>395</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_geteuid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>396</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>397</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return <u><span
style='color:blue'>current</span></u>-&gt;euid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>398</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>399</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取组号<span lang=EN-US>gid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>400</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_getgid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>401</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>402</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>current</span></u>-&gt;gid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>403</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>404</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>取有效的组号<span
lang=EN-US>egid</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>405</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_getegid</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>406</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>407</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <u><span
style='color:blue'>current</span></u>-&gt;egid;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>408</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>409</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>系统调用功能<span
lang=EN-US> -- </span>降低对<span lang=EN-US>CPU</span>的使用优先权(有人会用吗?<span
lang=EN-US style='font-family:Wingdings'>J</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>应该限制<span lang=EN-US>increment</span>为大于<span
lang=EN-US>0</span>的值,否则可使优先权增大!!</p>
<p class=a><u><span lang=EN-US style='color:blue'>410</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_nice</span></u>(long increment)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>411</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>412</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;priority-increment&gt;0)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>413</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;priority -= increment;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>414</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>415</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>416</span></u><span
lang=EN-US> </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'>417</span></u><span
lang=EN-US> void <u><span style='color:blue'>sched_init</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>418</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>419</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'>420</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>desc_struct</span></u> * p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>描述符表结构指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>421</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // Linux</span>系统开发之初,内核不成熟。内核代码会被经常修改。<span
lang=EN-US>Linus</span>怕自己无意中修改了这些</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>关键性的数据结构,造成与<span
lang=EN-US>POSIX</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'>422</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sizeof(struct <u><span
style='color:blue'>sigaction</span></u>) != 16) &nbsp;&nbsp;&nbsp;// sigaction</span>是存放有关信号状态的结构。</p>
<p class=a><u><span lang=EN-US style='color:blue'>423</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'>panic</span></u>(<i>&quot;Struct sigaction MUST be
16 bytes&quot;</i>);</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; // FIRST_TSS_ENTRY</span><span
lang=EN-US>FIRST_LDT_ENTRY</span>的值分别是<span lang=EN-US>4</span><span
lang=EN-US>5</span>,定义在<span lang=EN-US>include/linux/sched.h</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中;<span lang=EN-US>gdt
</span>是一个描述符表数组(<span lang=EN-US>include/linux/head.h </span>),实际上对应程序 <span
lang=EN-US>head.s </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>234</span>行上的全局描述符表基址(<span
lang=EN-US>_gdt</span>)。因此<span lang=EN-US> gdt + FIRST_TSS_ENTRY </span>即为</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // gdt[FIRST_TSS_ENTRY]</span>(即是<span
lang=EN-US>gdt[4]</span>),也即 <span lang=EN-US>gdt </span>数组第<span lang=EN-US>4</span>项的地址。
参见</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // include/asm/system.h,</span><span
lang=EN-US>65</span>行开始。</p>
<p class=a><u><span lang=EN-US style='color:blue'>424</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>+<u><span
style='color:blue'>FIRST_TSS_ENTRY</span></u>,&amp;(<u><span style='color:blue'>init_task</span></u>.<u><span
style='color:blue'>task</span></u>.tss));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>425</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>+<u><span
style='color:blue'>FIRST_LDT_ENTRY</span></u>,&amp;(<u><span style='color:blue'>init_task</span></u>.<u><span
style='color:blue'>task</span></u>.ldt));</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>清任务数组和描述符表项(注意<span
lang=EN-US>i=1</span>开始,所以初始任务的描述符还在)。描述符项结构</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>定义在文件<span lang=EN-US>include/linux/head.h</span>中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>426</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = <u><span
style='color:blue'>gdt</span></u>+2+<u><span style='color:blue'>FIRST_TSS_ENTRY</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>427</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++) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>428</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>[i] = <u><span style='color:blue'>NULL</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>429</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;a=p-&gt;b=0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>430</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>431</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p-&gt;a=p-&gt;b=0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>432</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
p++;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>433</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>434</span></u><span
lang=EN-US> <b><i>/* Clear NT, so that we won't have troubles with that later
on */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span>清除标志寄存器中的位<span
lang=EN-US>NT</span>,这样以后就不会有麻烦<span lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // EFLAGS</span>中的<span
lang=EN-US>NT</span>标志位用于控制任务的嵌套调用。当<span lang=EN-US>NT</span>位置位时,那么当前中断任务执行</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // IRET</span>指令时就会引起任务切换。<span
lang=EN-US>NT</span>指出<span lang=EN-US>TSS</span>中的<span lang=EN-US>back_link</span>字段是否有效。<span
lang=EN-US>NT=0</span>时无效。</p>
<p class=a><u><span lang=EN-US style='color:blue'>435</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __asm__(<i>&quot;pushfl
; andl $0xffffbfff,(%esp) ; popfl&quot;</i>);&nbsp; &nbsp;&nbsp;// </span>复位<span
lang=EN-US>NT</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>将任务<span lang=EN-US>0 </span><span
lang=EN-US> TSS</span>段选择符加载到任务寄存器<span lang=EN-US>tr</span>。将局部描述符表段选择符加载到局部描述</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>符表寄存器<span lang=EN-US>ldtr</span>中。注意!!是将<span
lang=EN-US>GDT</span>中相应<span lang=EN-US>LDT</span>描述符的选择符加载到<span lang=EN-US>ldtr</span>。只明确加</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这一次,以后新任务<span
lang=EN-US>LDT</span>的加载,是<span lang=EN-US>CPU</span>根据<span lang=EN-US>TSS</span>中的<span
lang=EN-US>LDT</span>项自动加载。</p>
<p class=a><u><span lang=EN-US style='color:blue'>436</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>ltr</span></u>(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>定义在<span lang=EN-US>include/linux/sched.h </span><span lang=EN-US>157-158</span>行。</p>
<p class=a><u><span lang=EN-US style='color:blue'>437</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>lldt</span></u>(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>其中参数(<span lang=EN-US>0</span>)是任务号。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面代码用于初始化<span
lang=EN-US> 8253</span>定时器。通道<span lang=EN-US>0</span>,选择工作方式<span lang=EN-US>3</span>,二进制计数方式。通道<span
lang=EN-US>0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>输出引脚接在中断控制主芯片的<span
lang=EN-US>IRQ0</span>上,它每<span lang=EN-US>10</span>毫秒发出一个<span lang=EN-US>IRQ0</span>请求。<span
lang=EN-US>LATCH</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'>438</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>outb_p</span></u>(0x36,0x43);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><i>/* binary, mode 3, LSB/MSB, ch 0 */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>439</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>outb_p</span></u>(<u><span style='color:blue'>LATCH</span></u>
&amp; 0xff , 0x40);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<b><i>/* LSB */</i></b>&nbsp;
&nbsp;&nbsp;// </span>定时值低字节。</p>
<p class=a><u><span lang=EN-US style='color:blue'>440</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>outb</span></u>(<u><span style='color:blue'>LATCH</span></u>
&gt;&gt; 8 , 0x40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<b><i>/*
MSB */</i></b>&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>IDT</span>中描述符的宏定义在文件</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // include/asm/system.h</span>中第<span
lang=EN-US>33</span><span lang=EN-US>39</span>行处。两者的区别参见<span lang=EN-US>system.h</span>文件开始处的说明。</p>
<p class=a><u><span lang=EN-US style='color:blue'>441</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>set_intr_gate</span></u>(0x20,&amp;<u><span
style='color:blue'>timer_interrupt</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>442</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>outb</span></u>(<u><span style='color:blue'>inb_p</span></u>(0x21)&amp;~0x01,0x21);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>443</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>set_system_gate</span></u>(0x80,&amp;<u><span
style='color:blue'>system_call</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>444</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>445</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>