Mail Archives: opendos/1997/06/11/05:24:31
This is a multi-part message in MIME format.
------=_NextPart_000_01BC769C.AFE18720
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Here is the Kernel Hackers Guide. It contains info on the structure of
Linux for those who are porting application etc to OpenDOS
Warp
It is in PostSCript format.
(It is only available in this or .dvi or .tex)
------=_NextPart_000_01BC769C.AFE18720
Content-Type: application/postscript;
name="khg-0.6.ps"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="khg-0.6.ps"
%!PS-Adobe-2.0=0A=
%%Creator: dvips 5.495 Copyright 1986, 1992 Radical Eye Software=0A=
%%Title: khg.dvi=0A=
%%CreationDate: Fri Mar 17 21:22:05 1995=0A=
%%Pages: 155=0A=
%%PageOrder: Ascend=0A=
%%BoundingBox: 0 0 612 792=0A=
%%EndComments=0A=
%DVIPSCommandLine: dvips -o khg.ps khg.dvi=0A=
%DVIPSSource: TeX output 1995.03.17:1943=0A=
%%BeginProcSet: tex.pro=0A=
%!=0A=
/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N =
/X{S N}=0A=
B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 =
0 0 0]=0A=
concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution =
hsize=0A=
-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR =
matrix=0A=
currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch =
put=0A=
setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict =
/manualfeed=0A=
true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn =
0 N=0A=
/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix=0A=
fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{=0A=
CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N =
load 0 nn=0A=
put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X =
/fntrx[sf 0=0A=
0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B =
/ch-width{ch-data=0A=
dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B =
/ch-xoff{128=0A=
ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get =
127=0A=
sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type=0A=
/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp =
0 N=0A=
/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 =
index get=0A=
S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff =
ch-height=0A=
sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height =
true[1 0 0=0A=
-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X =
dup=0A=
type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S =
sf 1=0A=
ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 =
add N}=0A=
B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N =
@rigin=0A=
0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul =
add=0A=
.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage =
userdict=0A=
/eop-hook known{eop-hook}if}N /@start{userdict /start-hook =
known{start-hook}=0A=
if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 =
1 255=0A=
{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X =
65781.76=0A=
div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex =
0 N=0A=
/ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product =
where{=0A=
pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4=0A=
getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 =
-.1=0A=
TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR =
-.1=0A=
-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse =
B /QV{=0A=
gsave transform round exch round exch itransform moveto rulex 0 rlineto 0=0A=
ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta =
0 N=0A=
/tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B =
/c{-4 M}=0A=
B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 =
M}B=0A=
/w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 =
w}B /r{=0A=
p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B =
/bos{/SS save=0A=
N}B /eos{SS restore}B end=0A=
%%EndProcSet=0A=
TeXDict begin 40258431 52099146 1000 300 300 =
(/home/johnsonm/khg-0.6/khg.dvi)=0A=
@start /Fa 8 118 =
df<01F007080C08181C3838300070007000E000E000E000E000E000E008E0=0A=
10602030C01F000E127B9113>99 =
D<01E007100C1018083810701070607F80E000E000E000E000=0A=
E000E0086010602030C01F000D127B9113>101 =
D<0FC00001C00001C000038000038000038000=0A=
0380000700000700000700000700000E78000E8C000F0E000E0E001C0E001C0E001C0E001=
C0E00=0A=
381C00381C00381C00383800703880703880707080707100E03200601C00111D7D9C15>10=
4=0A=
D<01E007180C0C180C380C300E700E700EE01CE01CE01CE018E038E030E06060C031801E0=
00F12=0A=
7B9115>111 =
D<3C3C26C2468747078E068E000E000E001C001C001C001C003800380038003800=0A=
7000300010127C9112>114 =
D<01F006080C080C1C18181C001F001FC00FF007F0007800386030=0A=
E030C030806060C01F000E127D9111>I<00C001C001C001C00380038003800380FFE00700=
0700=0A=
07000E000E000E000E001C001C001C001C00384038403840388019000E000B1A7D990E>I<=
1E03=0A=
00270700470700470700870E00870E000E0E000E0E001C1C001C1C001C1C001C1C0038388=
03838=0A=
801838801839001C5900078E0011127C9116>I E /Fb 19 121 =
df<183C3C1C08080810204080=0A=
060B78990C>39 =
D<000FC100302100C01301800F0700060E00060C000618000638000430000470=0A=
0000700000E00000E00000E00000E007FEE00070E00070E00070E000706000E06000E0300=
0E018=0A=
01E00C064003F840181A7A991E>71 =
D<03FF1FF800700380007003800070038000E0070000E007=0A=
0000E0070000E0070001C00E0001C00E0001C00E0001C00E0003FFFC0003801C0003801C0=
00380=0A=
1C00070038000700380007003800070038000E0070000E0070000E0070000E0070001C00E=
000FF=0A=
87FC001D1A7D991D>I<03FF03F0007001C0007001000070020000E0040000E0080000E010=
0000=0A=
E0400001C0800001C1000001C3000001C70000038B80000393800003C380000381C000070=
1C000=0A=
0701C0000700E0000700E0000E00E0000E0070000E0070000E0070001C007800FF81FE001=
C1A7D=0A=
991D>75 =
D<03FF0000700000700000700000E00000E00000E00000E00001C00001C00001C00001=0A=
C0000380000380000380000380000700000700100700100700200E00200E00600E00400E0=
0C01C=0A=
0380FFFF80141A7D9918>I<3FFFFC381C0C201C04401C0440380480380480380480380400=
7000=0A=
00700000700000700000E00000E00000E00000E00001C00001C00001C00001C0000380000=
38000=0A=
038000038000078000FFF800161A79991B>84 =
D<03CC0E2E181C381C301C701CE038E038E038E0=0A=
38C072C072C07260F261341E180F107C8F14>97 =
D<01E006180C181838301070006000E000E000=0A=
E000E000E008E010602030C01F000D107C8F12>99 =
D<001F800003800003800003800007000007=0A=
00000700000700000E00000E0003CE000E2E00181C00381C00301C00701C00E03800E0380=
0E038=0A=
00E03800C07200C07200C0720060F2006134001E1800111A7C9914>I<01E00E181C083808=
7008=0A=
7010FFE0E000E000E000E000E0086010602030C01F000D107C8F12>I<1F80000380000380=
0003=0A=
80000700000700000700000700000E00000E00000E7C000F86001E07001E07001C07001C0=
70038=0A=
0E00380E00380E00381C00701C80701C80703880703900E01900600E00111A7E9914>104=0A=
D<030706000000000000384C4E8E9C9C1C3838707272E2E4643808197C980C>I<1F800380=
0380=0A=
038007000700070007000E000E000E0E0E131C271C431C801F003C003F8039C038E070E27=
0E270=0A=
E270E4E0646038101A7E9912>107 =
D<1F0707070E0E0E0E1C1C1C1C3838383870707070E4E4E4=0A=
E4E830081A7D990A>I<307C005986009E07009E07009C07009C0700380E00380E00380E00=
381C=0A=
00701C80701C80703880703900E01900600E0011107C8F16>110 =
D<30F05D189E389C189C009C=0A=
0038003800380038007000700070007000E00060000D107C8F10>114 =
D<03E004300830187018=0A=
601C001F801FC00FE000E00060E060E06080C041803E000C107D8F10>I<38064C074E0E8E=
0E9C=0A=
0E9C0E1C1C381C381C381C7039703970393079389A0F0C10107C8F15>117=0A=
D<078F0008D18010F38020E18020E00020E00001C00001C00001C00001C00003820003820=
0C382=0A=
00E78400C5880078F00011107E8F12>120 D E /Fc 5 115 =
df<00000E00001F00001F00003F00=0A=
003E00007E00007C00007C0000FC0000F80001F80001F00003F00003E00007E00007C0000=
FC000=0A=
0F80000F80001F80001F00003F00003E00007E00007C0000FC0000F80001F80001F00001F=
00003=0A=
F00003E00007E00007C0000FC0000F80001F80001F00003F00003E00003E00007E00007C0=
000FC=0A=
0000F80000F80000700000182F7DA91F>47 =
D<007FE001FFF807FFFC0FFFFC1FC07C3F00383E00=0A=
007C0000780000780000F00000F00000F00000F00000F00000F000007800007800007C003=
C3E00=0A=
3C3F007C1FC0F80FFFF007FFF001FFC0007F00161A7C991F>99 =
D<00FC0003FF0007FF801FFFE0=0A=
1F87E03E01F07C00F8780078780078F0003CF0003CF0003CF0003CF0003CF0003CF0003CF=
8007C=0A=
7800787C00F87C00F83E01F01F87E01FFFE007FF8003FF0000FC00161A7C991F>111=0A=
D<7F87E000FF9FF800FFBFFE007FFFFF0007F83F0007E00F8007C0078007C003C0078003C=
00780=0A=
03E0078001E0078001E0078001E0078001E0078001E0078001E0078003E0078003C007C00=
7C007=0A=
C0078007E00F8007F03F0007FFFE0007BFFC00079FF8000787C0000780000007800000078=
00000=0A=
0780000007800000078000000780000007800000078000007FF80000FFFC0000FFFC00007=
FF800=0A=
001B277F991F>I<7FE07E00FFE1FF80FFE3FFC07FEFFFC001FF87C001FE038001FC000001=
F800=0A=
0001F8000001F0000001F0000001E0000001E0000001E0000001E0000001E0000001E0000=
001E0=0A=
000001E0000001E0000001E0000001E000007FFFE000FFFFF000FFFFF0007FFFE0001A1A7=
E991F=0A=
>114 D E /Fd 5 115 =
df<000000001C000000003E000000003E000000007E000000007C000000=0A=
007C00000000FC00000000F800000000F800000001F800000001F000000001F000000003F=
00000=0A=
0003E000000003E000000007E000000007C000000007C00000000FC00000000F800000000=
F8000=0A=
00001F800000001F000000001F000000003F000000003E000000003E000000007E0000000=
07C00=0A=
000000FC00000000F800000000F800000001F800000001F000000001F000000003F000000=
003E0=0A=
00000003E000000007E000000007C000000007C00000000FC00000000F800000000F80000=
0001F=0A=
800000001F000000001F000000003F000000003E000000003E000000007E000000007C000=
00000=0A=
FC00000000F800000000F800000001F800000001F000000001F000000003F000000003E00=
00000=0A=
03E000000007E000000007C000000007C00000000FC00000000F800000000F800000001F8=
00000=0A=
001F000000001F000000003F000000003E000000003E000000007E000000007C00000000F=
C0000=0A=
0000F800000000F800000001F800000001F000000001F000000003F000000003E00000000=
3E000=0A=
000007E000000007C000000007C00000000FC00000000F800000000F800000001F8000000=
01F00=0A=
0000001F000000003F000000003E000000003E000000007E000000007C000000007C00000=
000FC=0A=
00000000F800000000F800000000700000000027677ACC34>47 =
D<00003FE0000001FFFE000007=0A=
E01F80001F8003C0003E0000E0007C00007001F80000F803F80003F803F00003FC07F0000=
7FC0F=0A=
E00007FC1FE00007FC1FC00003F83FC00003F83FC00000E03FC00000007FC00000007F800=
00000=0A=
7F80000000FF80000000FF80000000FF80000000FF80000000FF80000000FF80000000FF8=
00000=0A=
00FF80000000FF80000000FF800000007F800000007F800000007FC00000003FC00000003=
FC000=0A=
000E1FC000000E1FE000000E0FE000001C0FF000001C07F000003803F800003801F800007=
000FC=0A=
0000E0007E0001C0001F800780000FE03E000001FFFC0000003FE000272F7DAD2E>99=0A=
D<00003FE000000001FFFC00000007E03F0000001F800FC000007E0003F00000FC0001F80=
001F8=0A=
0000FC0003F000007E0007F000007F0007E000003F000FE000003F801FC000001FC01FC00=
0001F=0A=
C03FC000001FE03FC000001FE03F8000000FE07F8000000FF07F8000000FF07F8000000FF=
0FF80=0A=
00000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF800=
0000F=0A=
F8FF8000000FF8FF8000000FF8FF8000000FF87F8000000FF07F8000000FF07F8000000FF=
03FC0=0A=
00001FE03FC000001FE03FC000001FE01FC000001FC00FE000003F800FE000003F8007F00=
0007F=0A=
0003F000007E0001F80000FC0000FC0001F800007E0003F000001F800FC000000FE03F800=
00003=0A=
FFFE000000003FE000002D2F7DAD34>111 =
D<01FE00FF000000FFFE07FFF00000FFFE1F01FC00=0A=
00FFFE38007E000003FE70003F800001FEC0001FC00000FF80000FE00000FF800007F0000=
0FF00=0A=
0003F80000FE000003FC0000FE000001FC0000FE000001FE0000FE000001FE0000FE00000=
0FF00=0A=
00FE000000FF0000FE000000FF8000FE000000FF8000FE0000007F8000FE0000007FC000F=
E0000=0A=
007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007=
FC000=0A=
FE0000007FC000FE0000007FC000FE0000007FC000FE0000007F8000FE000000FF8000FE0=
00000=0A=
FF8000FE000000FF0000FE000000FF0000FE000001FE0000FE000001FE0000FE000003FC0=
000FE=0A=
000003F80000FF000007F00000FF800007F00000FF80000FE00000FFC0001F800000FEE00=
03F00=0A=
0000FE7800FE000000FE1E03F8000000FE0FFFE0000000FE01FE00000000FE00000000000=
0FE00=0A=
0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000=
00000=0A=
00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000F=
E0000=0A=
00000000FE000000000000FE000000000003FF8000000000FFFFFE00000000FFFFFE00000=
000FF=0A=
FFFE0000000032417DAC39>I<01FC01F800FFFC07FE00FFFC1E1F00FFFC383F8003FC607F=
C001=0A=
FC607FC000FCC07FC000FCC07FC000FD803F8000FD801F0000FF000E0000FF00000000FF0=
00000=0A=
00FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000F=
E0000=0A=
0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000000=
0FE00=0A=
000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000=
000FE=0A=
00000000FE00000000FE00000000FE00000000FF00000003FF800000FFFFFF8000FFFFFF8=
000FF=0A=
FFFF8000222D7DAC28>114 D E /Fe 1 122 =
df<02000700070007000700070002000200020072=0A=
70FFF87270020002000700070007000700070007000700070007000700070007000700070=
00200=0A=
02000200020002000D217E9912>121 D E /Ff 1 14 =
df<0001FC0000000FFF8000003E03E000=0A=
00F000780001C0001C000380000E0007000007000E000003801C000001C018000000C0380=
00000=0A=
E03000000060700000007060000000306000000030E000000038C000000018C000000018C=
00000=0A=
0018C000000018C000000018C000000018C000000018E0000000386000000030600000003=
07000=0A=
000070300000006038000000E018000000C01C000001C00E0000038007000007000380000=
E0001=0A=
C0001C0000F0007800003E03E000000FFF80000001FC000025277E9D2A>13=0A=
D E /Fg 21 122 df<387878380808101020204080050C7D830C>44 =
D<0007F010001C0C300070=0A=
026000C001E0038000E0070000E00E0000600E0000601C0000403C0000403800004078000=
00078=0A=
00000078000000F0000000F0000000F0000000F0000000F0000000F0000080F0000100700=
00100=0A=
7000010038000200380004001C0004000C001800060020000380C000007F00001C1E7C9C1=
E>67=0A=
D<0FFFFC0000F8078000F001C000F000E000F0007000F0007000F0007801E0003801E0003=
801E0=0A=
003801E0003801E0003C01E0003803C0003803C0007803C0007803C0007803C0007003C00=
0F007=0A=
8000E0078000E0078001C0078003800780078007800E000F001C000F007000FFFFC0001E1=
C7E9B=0A=
20>I<0FFFFFE000F801E000F000E000F0004000F0004000F0004000F0004001E0004001E0=
4040=0A=
01E0400001E0400001E0C00001E1C00003FF800003C1800003C0800003C0800003C080000=
3C080=0A=
800780008007800080078001000780010007800300078006000F000E000F003E00FFFFFC0=
01B1C=0A=
7E9B1C>I<0FFF8000F80000F00000F00000F00000F00000F00001E00001E00001E00001E0=
0001=0A=
E00001E00003C00003C00003C00003C00003C00003C000078000078000078000078000078=
00007=0A=
80000F00000F8000FFF800111C7F9B0F>73 =
D<FFF00FF81F8003C00F0001800F0001000F000200=0A=
0780020007800400078004000780080007C0080003C0100003C0100003C0200003C020000=
3E040=0A=
0001E0400001E0800001E1800001E1000001F2000000F2000000F4000000F4000000F8000=
000F8=0A=
0000007000000070000000600000006000001D1D7B9B1F>86 =
D<07F0001C18001E0C001C0E0018=0A=
0E00000E00000E0001FE000F0E001C1C00301C00701C00E01C40E01C40E03C40E05C80709=
D803F=0A=
0E0012127D9115>97 =
D<3F00000F00000E00000E00000E00000E00000E00000E00001C00001C00=0A=
001C00001C78001D86001E03003C03803801803801803801C03801C03801C070038070038=
07003=0A=
80700300700700700E00F00C00CC300083C000121D7C9C17>I<01F8071C0C1E181C381830=
0070=0A=
0070007000E000E000E000600060047008301018200FC00F127D9112>I<0003F00000F000=
00E0=0A=
0000E00000E00000E00000E00000E00001C00001C00001C000F1C0030DC00C03C01C03803=
80380=0A=
300380700380700380700380E00700E00700E00700600700600700700F00301E00186F000=
78FC0=0A=
141D7D9C17>I<01F8070C0C061C073803300370037FFF7000E000E000E000600060023004=
3008=0A=
1C3007C010127E9112>I<00C001C001C0018000000000000000000000000000001F800780=
0380=0A=
0700070007000700070007000E000E000E000E000E000E001C001E00FF800A1D7F9C0C>10=
5=0A=
D<07E00001E00001C00001C00001C00001C00001C00001C0000380000380000380000387F=
80381=0A=
E003818007020007040007080007100007700007F8000F38000E3C000E1C000E1E000E0E0=
00E0F=0A=
001C07001C0F80FF9FE0151D7F9C16>107 =
D<07E001E001C001C001C001C001C001C003800380=0A=
03800380038003800700070007000700070007000E000E000E000E000E000E001C001E00F=
F800B=0A=
1D7F9C0C>I<1F8F8007B0C003C0E00780E00780E00700E00700E00700E00700E00E01C00E=
01C0=0A=
0E01C00E01C00E01C00E01C01C03801E03C0FF9FF014127F9117>110 =
D<00FC000307000E0180=0A=
1C01C03800C03000C07000E07000E07000E0E001C0E001C0E001C06001806003807007003=
80E00=0A=
1C180007E00013127E9115>I<03F20C0E18061004300438043E001FE00FF007F8003C401C=
400C=0A=
400C6018E010D0608FC00F127F9110>115 =
D<FC1F803C07801C03803807003807003807003807=0A=
00380700380700700E00700E00700E00700E00701E00701E00703C00305E001F9F8011127=
C9117=0A=
>117 =
D<FF0FE03C03801C03001C02001C06001C04001E08000E08000E10000E10000E20000720=0A=
0007400007C00007800007000003000002000013127C9116>I<FF3FCFE03C0F0380380603=
0038=0A=
0E02001C0F02001C1704001C1704001C2708001C2308001C4310000E4390000E83A0000E8=
3A000=0A=
0F03C0000F01C0000E01800006018000040100001B127C911E>I<0FF0FE03C03801C03001=
C020=0A=
01C06001C04001E08000E08000E10000E10000E200007200007400007C000078000070000=
03000=0A=
002000002000004000004000708000F10000F10000E60000780000171A809116>121=0A=
D E /Fh 4 117 =
df<1FF0303C701EF81FF81FF81F703E007C00F000C001800180030003000300=0A=
0300000000000000000007800FC00FC00FC00FC00780101A7E9915>63 =
D<FE1F00FE63C01E81C0=0A=
1F01E01F01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E0F=
FCFFC=0A=
FFCFFC16117F9019>110 =
D<03F8000E0E003C07803803807803C07803C0F803E0F803E0F803E0=0A=
F803E0F803E0F803E07803C07C07C03C07800E0E0003F80013117F9016>I<060006000600=
0600=0A=
0E000E001E003FF0FFF01E001E001E001E001E001E001E001E001E181E181E181E181E180=
F3003=0A=
E00D187F9711>116 D E /Fi 1 59 df<60F0F06004047C830C>58 D E=0A=
/Fj 71 124 =
df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E01C000=0A=
0E01C0000E01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E01C0000=
E01C0=0A=
000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C00=
00E01=0A=
C0007F87FC001A1D809C18>11 =
D<007E0001C1800301800703C00E03C00E01800E00000E00000E=0A=
00000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E0=
1C00E=0A=
01C00E01C00E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>I<6060F0F0F8F868=
6808=0A=
0808080808101010102020404080800D0C7F9C15>34 =
D<60F0F8680808081010204080050C7C9C=0A=
0C>39 =
D<004000800100020006000C000C0018001800300030007000600060006000E000E000E0=0A=
00E000E000E000E000E000E000E000E000E000600060006000700030003000180018000C0=
00C00=0A=
060002000100008000400A2A7D9E10>I<800040002000100018000C000C00060006000300=
0300=0A=
038001800180018001C001C001C001C001C001C001C001C001C001C001C001C0018001800=
18003=0A=
8003000300060006000C000C00180010002000400080000A2A7E9E10>I<60F0F070101010=
1020=0A=
204080040C7C830C>44 =
D<FFE0FFE00B0280890E>I<60F0F06004047C830C>I<00010003000600=0A=
060006000C000C000C0018001800180030003000300060006000C000C000C001800180018=
00300=0A=
03000300060006000C000C000C00180018001800300030003000600060006000C000C0001=
0297E=0A=
9E15>I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E007E007E0=
07E0=0A=
07E007E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<030007003F00C7=
0007=0A=
0007000700070007000700070007000700070007000700070007000700070007000700070=
00700=0A=
070007000F80FFF80D1C7C9B15>I<07C01830201C400C400EF00FF80FF807F8077007000F=
000E=0A=
000E001C001C00380070006000C00180030006010C01180110023FFE7FFEFFFE101C7E9B1=
5>I<=0A=
07E01830201C201C781E780E781E381E001C001C00180030006007E00030001C001C000E0=
00F00=0A=
0F700FF80FF80FF80FF00E401C201C183007E0101D7E9B15>I<000C00000C00001C00003C=
0000=0A=
3C00005C0000DC00009C00011C00031C00021C00041C000C1C00081C00101C00301C00201=
C0040=0A=
1C00C01C00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC0121C7F9B1=
5>I<=0A=
300C3FF83FF03FC020002000200020002000200023E024302818301C200E000E000F000F0=
00F60=0A=
0FF00FF00FF00F800E401E401C2038187007C0101D7E9B15>I<00F0030C06040C0E181E30=
1E30=0A=
0C700070006000E3E0E430E818F00CF00EE006E007E007E007E007E007600760077006300=
E300C=0A=
18180C3003E0101D7E9B15>I<4000007FFF807FFF007FFF00400200800400800400800800=
0010=0A=
0000100000200000600000400000C00000C00001C00001800001800003800003800003800=
00380=0A=
00078000078000078000078000078000078000030000111D7E9B15>I<03E00C301008200C=
2006=0A=
6006600660067006780C3E083FB01FE007F007F818FC307E601E600FC007C003C003C003C=
00360=0A=
026004300C1C1007E0101D7E9B15>I<03C00C301818300C700C600EE006E006E007E007E0=
07E0=0A=
07E0076007700F300F18170C2707C700060006000E300C780C78187010203030C00F80101=
D7E9B=0A=
15>I<60F0F0600000000000000000000060F0F06004127C910C>I<003F800000C06000030=
01800=0A=
040004000800020010000100201F00802070808040E0404040C0384041C03840818038208=
38038=0A=
20838038208380382083803820838038208180382041C0382040C0384040E078402070988=
0201F=0A=
0F00100000000800000004000000030001E000C01F80003FF0001B1D7E9C20>64=0A=
D<000600000006000000060000000F0000000F0000000F000000178000001780000017800=
00023=0A=
C0000023C0000023C0000041E0000041E0000041E0000080F0000080F0000180F80001007=
80001=0A=
FFF80003007C0002003C0002003C0006003E0004001E0004001E000C001F001E001F00FF8=
0FFF0=0A=
1C1D7F9C1F>I<FFFFC00F00F00F00380F003C0F001C0F001E0F001E0F001E0F001E0F001C=
0F00=0A=
3C0F00780F01F00FFFE00F00780F003C0F001E0F000E0F000F0F000F0F000F0F000F0F000=
F0F00=0A=
1E0F001E0F003C0F0078FFFFE0181C7E9B1D>I<001F808000E0618001801980070007800E=
0003=0A=
801C0003801C00018038000180780000807800008070000080F0000000F0000000F000000=
0F000=0A=
0000F0000000F0000000F0000000F0000000700000807800008078000080380000801C000=
1001C=0A=
0001000E000200070004000180080000E03000001FC000191E7E9C1E>I<FFFFC0000F00F0=
000F=0A=
003C000F000E000F0007000F0007000F0003800F0003C00F0001C00F0001C00F0001E00F0=
001E0=0A=
0F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001C00F0001C00F0003C00=
F0003=0A=
800F0007800F0007000F000E000F001C000F007000FFFFC0001B1C7E9B20>I<FFFFFC0F00=
3C0F=0A=
000C0F00040F00040F00060F00020F00020F02020F02000F02000F02000F06000FFE000F0=
6000F=0A=
02000F02000F02000F02010F00010F00020F00020F00020F00060F00060F000C0F003CFFF=
FFC18=0A=
1C7E9B1C>I<FFFFF80F00780F00180F00080F00080F000C0F00040F00040F02040F02000F=
0200=0A=
0F02000F06000FFE000F06000F02000F02000F02000F02000F00000F00000F00000F00000=
F0000=0A=
0F00000F00000F8000FFF800161C7E9B1B>I<001F808000E0618001801980070007800E00=
0380=0A=
1C0003801C00018038000180780000807800008070000080F0000000F0000000F0000000F=
00000=0A=
00F0000000F0000000F000FFF0F0000F80700007807800078078000780380007801C00078=
01C00=0A=
07800E00078007000B800180118000E06080001F80001C1E7E9C21>I<FFF00F000F000F00=
0F00=0A=
0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000=
F000F=0A=
000F000F00FFF00C1C7F9B0F>73 =
D<FFF03FE00F000F000F000C000F0008000F0010000F002000=0A=
0F0040000F0080000F0100000F0200000F0400000F0E00000F1F00000F2F00000F2780000=
F4780=0A=
000F83C0000F01E0000F01E0000F00F0000F00F8000F0078000F003C000F003C000F001E0=
00F00=0A=
1F000F001F80FFF07FF01C1C7E9B20>75 =
D<FFF8000F80000F00000F00000F00000F00000F0000=0A=
0F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00080=
F0008=0A=
0F00080F00180F00180F00100F00300F00700F01F0FFFFF0151C7E9B1A>I<FF8000FF800F=
8000=0A=
F8000F8000F8000BC00178000BC00178000BC001780009E002780009E002780008F004780=
008F0=0A=
04780008F0047800087808780008780878000878087800083C107800083C107800083C107=
80008=0A=
1E207800081E207800081E207800080F407800080F4078000807807800080780780008078=
07800=0A=
08030078001C03007800FF8307FF80211C7E9B26>I<FF007FC00F800E000F8004000BC004=
0009=0A=
E0040009E0040008F0040008F8040008780400083C0400083C0400081E0400080F0400080=
F0400=0A=
080784000807C4000803C4000801E4000801E4000800F40008007C0008007C0008003C000=
8003C=0A=
0008001C0008000C001C000C00FF8004001A1C7E9B1F>I<FFFF800F00E00F00780F003C0F=
001C=0A=
0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E00FFF800F00000F00000=
F0000=0A=
0F00000F00000F00000F00000F00000F00000F00000F00000F0000FFF000171C7E9B1C>80=0A=
D<FFFF00000F01E0000F0078000F003C000F001C000F001E000F001E000F001E000F001E0=
00F00=0A=
1C000F003C000F0078000F01E0000FFF00000F03C0000F00E0000F00F0000F0078000F007=
8000F=0A=
0078000F0078000F0078000F0078000F0078100F0078100F0038100F003C20FFF01C20000=
007C0=0A=
1C1D7E9B1F>82 =
D<07E0801C1980300580700380600180E00180E00080E00080E00080F00000F8=0A=
00007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C08001C0800=
1C080=0A=
01C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F=
00C0=0A=
400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F0000000F00000=
00F00=0A=
00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000=
0000F=0A=
0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>I<FFF07FC00F000E00=
0F00=0A=
04000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F000=
4000F=0A=
0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0=
00400=0A=
0700080007800800038010000180100000C020000070C000001F00001A1D7E9B1F>I<FFE0=
0FF0=0A=
1F0003C00F0001800F0001000F800300078002000780020003C0040003C0040003C004000=
1E008=0A=
0001E0080001F0080000F0100000F0100000F830000078200000782000003C4000003C400=
0003C=0A=
4000001E8000001E8000001F8000000F0000000F00000006000000060000000600001C1D7=
F9B1F=0A=
>I<FFF007FC0F8001E00780008007C0018003C0010003E0020001F0020000F0040000F804=
0000=0A=
780800007C1800003C1000001E2000001F2000000F4000000FC0000007800000078000000=
78000=0A=
0007800000078000000780000007800000078000000780000007800000078000007FF8001=
E1C80=0A=
9B1F>89 =
D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0=0A=
C0C0C0C0C0FEFE07297C9E0C>91 =
D<08081010202040404040808080808080B0B0F8F878783030=0A=
0D0C7A9C15>I<FEFE06060606060606060606060606060606060606060606060606060606=
0606=0A=
06060606060606FEFE0729809E0C>I<1FC000307000783800781C00301C00001C00001C00=
01FC=0A=
000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115>=
97=0A=
D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C0=
01D86=0A=
001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C00C01C01C=
01C01=0A=
801E030019060010F800131D7F9C17>I<07E00C301878307870306000E000E000E000E000=
E000=0A=
E00060007004300418080C3007C00E127E9112>I<003F0000070000070000070000070000=
0700=0A=
00070000070000070000070000070003E7000C1700180F00300700700700600700E00700E=
00700=0A=
E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17>I<=
03E0=0A=
0C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F127=
F9112=0A=
>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E000E=
000E=0A=
000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38C0=
1C38=0A=
80181800381C00381C00381C00381C001818001C38000C300013C00010000030000018000=
01FF8=0A=
001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C7=
F9215=0A=
>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C=
001C=0A=
87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0=
3801C=0A=
03801C03801C0380FF9FF0141D7F9C17>I<18003C003C0018000000000000000000000000=
0000=0A=
00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8=
0091D=0A=
7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000E0=
00E0=0A=
00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C06=
1803E=0A=
000B25839C0D>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00=
001C=0A=
00001C3FC01C0F001C0C001C08001C10001C20001C40001CE0001DE0001E70001C78001C3=
8001C=0A=
3C001C1C001C0E001C0F001C0F80FF9FE0131D7F9C16>I<FC001C001C001C001C001C001C=
001C=0A=
001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0=
01C00=0A=
1C00FF80091D7F9C0C>I<FC7E07E0001C838838001D019018001E01E01C001C01C01C001C=
01C0=0A=
1C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C0=
01C01=0A=
C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF8021127F9124>I<FC7C001C87001D=
0300=0A=
1E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801=
C0380=0A=
1C0380FF9FF014127F9117>I<03F0000E1C00180600300300700380600180E001C0E001C0=
E001=0A=
C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>I<FC7C=
001D=0A=
86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C0=
1C01C=0A=
01801E03001D06001CF8001C00001C00001C00001C00001C00001C00001C0000FF8000131=
A7F91=0A=
17>I<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700E0=
0700=0A=
600700700700300F00180F000C370007C7000007000007000007000007000007000007000=
00700=0A=
003FE0131A7E9116>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C001C=
001C=0A=
001C001C00FFC00D127F9110>I<1F9030704030C010C010E010F8007F803FE00FF000F880=
3880=0A=
18C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE01C=
001C=0A=
001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910>=
I<FC=0A=
1F801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0=
3801C=0A=
03801C07800C07800E1B8003E3F014127F9117>I<FF07E03C03801C01001C01000E02000E=
0200=0A=
07040007040007040003880003880003D80001D00001D00000E00000E00000E0000040001=
3127F=0A=
9116>I<FF3FCFE03C0F03801C0701801C0701001C0B01000E0B82000E0B82000E11820007=
11C4=0A=
000711C4000720C40003A0E80003A0E80003C0680001C0700001C07000018030000080200=
01B12=0A=
7F911E>I<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000F8=
0000=0A=
9C00010E00020E000607000403801E07C0FF0FF81512809116>I<FF07E03C03801C01001C=
0100=0A=
0E02000E020007040007040007040003880003880003D80001D00001D00000E00000E0000=
0E000=0A=
004000004000008000008000F08000F10000F300006600003C0000131A7F9116>I<7FFC70=
3860=0A=
38407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>=
I<FF=0A=
FFF01401808B15>I E /Fk 33 121 =
df<00C001C0030006000C001C0038003000700070006000=0A=
E000E000E000E000E000E000E000600070007000300038001C000C000600030001C000C00=
A1D7A=0A=
9914>40 =
D<8000C0006000300018001C000E000600070007000300038003800380038003800380=0A=
038003000700070006000E001C00180030006000C0008000091D7C9914>I<70F8FCFC7C0C=
1830=0A=
E0C0060A798414>44 =
D<FFFEFFFEFFFE0F037E8C14>I<70F8F8F8700505798414>I<0006000E00=0A=
0E001C001C003800380070007000E000E001C001C0038003800380070007000E000E001C0=
01C00=0A=
3800380070007000E000E000C0000F1D7E9914>I<0300030007000F003F00F70047000700=
0700=0A=
0700070007000700070007000700070007000700070007007FF07FF00C177C9614>49=0A=
D<0FC01FF03838701CE00EE00EE00E400E000E001C001C00380030007000E001C00300060=
00C00=0A=
180E300E7FFE7FFE0F177E9614>I<00780000F80001B80001B8000338000338000638000E=
3800=0A=
0C38001C3800383800303800703800E03800FFFF80FFFF800038000038000038000038000=
03800=0A=
01FF0001FF0011177F9614>52 =
D<3FFC7FFC700070007000700070007000700077C07FF0783820=0A=
1C000C000E000E400EE00EE01C601C78783FF00FC00F177E9614>I<FF00FF003800380038=
0038=0A=
00380038003800380038003800380038003800380038003807380738073807FFFFFFFF101=
77E96=0A=
14>76 =
D<7FFEFFFEE01CE01CE038E038007000E000E001C001C00380070007000E000E001C0038=0A=
0E380E700E700EFFFEFFFE0F177E9614>90 =
D<1FC0007FF000707800201800001C00001C0007FC=0A=
001FFC003C1C00701C00E01C00E01C00E01C00707C003FFF800F8F8011107E8F14>97=0A=
D<FC0000FC00001C00001C00001C00001C00001C00001CF8001DFE001F07001E03001C038=
01C01=0A=
C01C01C01C01C01C01C01C01C01C01C01C03801E03001F0E001DFC000CF8001217809614>=
I<03=0A=
F80FFC1C1C380870006000E000E000E000E00060007000380E1C1E0FFC03F00F107E8F14>=
I<00=0A=
7E00007E00000E00000E00000E00000E00000E0007CE000FFE001C3E00301E00700E00E00=
E00E0=0A=
0E00E00E00E00E00E00E00E00E00700E00301E00383E001FEFC007CFC012177F9614>I<07=
E00F=0A=
F01C38301C700CE00EE00EFFFEFFFEE00060007000380E1C1E0FFC03F00F107E8F14>I<07=
CF00=0A=
1FFF80383B80301800701C00701C00701C003018003838003FF00037C0007000007000003=
FF800=0A=
1FFC003FFE00700F00E00380E00380E00380E003807007003C1E001FFC0007F00011197F8=
F14>=0A=
103 =
D<FC0000FC00001C00001C00001C00001C00001C00001C78001DFE001F86001E07001C070=
0=0A=
1C07001C07001C07001C07001C07001C07001C07001C07001C0700FF8FE0FF8FE01317809=
614>=0A=
I<030007800780030000000000000000007F807F800380038003800380038003800380038=
00380=0A=
038003800380FFFCFFFC0E187D9714>I<FC0000FC00001C00001C00001C00001C00001C00=
001D=0A=
FF801DFF801C3C001C78001CF0001DE0001FC0001FC0001FE0001EF0001C70001C38001C3=
8001C=0A=
1C00FE3F80FE3F8011177F9614>107 =
D<FF80FF80038003800380038003800380038003800380=0A=
0380038003800380038003800380038003800380FFFEFFFE0F177E9614>I<FB8E00FFDF00=
3CF3=0A=
803CF38038E38038E38038E38038E38038E38038E38038E38038E38038E38038E380FEFBE=
0FE79=0A=
E01310808F14>I<FC7800FDFE001F86001E07001C07001C07001C07001C07001C07001C07=
001C=0A=
07001C07001C07001C0700FF8FE0FF8FE01310808F14>I<07C01FF03C78701C701CE00EE0=
0EE0=0A=
0EE00EE00EE00E701C783C3C781FF007C00F107E8F14>I<FCF800FDFE001F07001E03001C=
0380=0A=
1C01C01C01C01C01C01C01C01C01C01C01C01C03801E03001F0E001DFC001CF8001C00001=
C0000=0A=
1C00001C00001C00001C0000FF8000FF80001218808F14>I<03CE000FFE001C3E00301E00=
700E=0A=
00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E001C3E000FEE0007CE00000E0=
0000E=0A=
00000E00000E00000E00000E00007FC0007FC012187F8F14>I<FE1F00FE7F800EE3800F81=
000F=0A=
00000F00000E00000E00000E00000E00000E00000E00000E00000E0000FFF000FFF000111=
07F8F=0A=
14>I<0FD83FF86038C038C038F0007F803FF007F8001C6006E006F006F81CFFF8CFE00F10=
7E8F=0A=
14>I<030007000700070007007FFCFFFC07000700070007000700070007000700070E070E=
070E=0A=
070C03FC00F00F157F9414>I<FC3F00FC3F001C07001C07001C07001C07001C07001C0700=
1C07=0A=
001C07001C07001C07001C07001C1F000FFFE003E7E01310808F14>I<FE3F80FE3F801C1C=
001C=0A=
1C001C1C001C1C000E38000E38000E380006300007700007700007700003E00003E00003E=
00011=0A=
107F8F14>I<7E3F007E3F001E38000E780007700007E00003E00001C00003C00003E00007=
7000=0A=
0E78000E38001C1C00FE3F80FE3F8011107F8F14>120 D E /Fl 70 125=0A=
df<00FE7C0381C60603CE0E03841C03801C03801C03801C03801C03801C0380FFFFF01C03=
801C=0A=
03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0=
380FF=0A=
8FF0171A809916>11 =
D<00FE000381000601800E03801C01001C00001C00001C00001C00001C00=0A=
00FFFF801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C038=
01C03=0A=
801C03801C0380FF8FF0141A809915>I<60C0F1E0F9F068D0081008100810102010202040=
4080=0A=
0C0B7F9913>34 =
D<010001000FC0193021086108C104C10CC11CC108E100610079003F801FE007=0A=
F001780138011C410CE10CE10C810C81084118211011600F80010001000E1E7E9B13>36=0A=
D<60F0F86808080810102040050B7D990B>39 =
D<00800100020004000C00080018003000300030=0A=
006000600060006000E000E000E000E000E000E000E000E000E000E000600060006000600=
03000=0A=
30003000180008000C00040002000100008009267D9B0F>I<800040002000100018000800=
0C00=0A=
0600060006000300030003000300038003800380038003800380038003800380038003000=
30003=0A=
0003000600060006000C0008001800100020004000800009267E9B0F>I<60F0F070101010=
2020=0A=
4040040B7D830B>44 =
D<FFC0FFC00A0280880D>I<60F0F06004047D830B>I<0004000C00180018=0A=
001800300030003000600060006000C000C000C0018001800180030003000300060006000=
6000C=0A=
000C000C00180018001800300030003000600060006000C000C0000E257E9B13>I<07E01C=
3838=0A=
1C300C700E60066006E007E007E007E007E007E007E007E007E007E00760066006700E300=
C381C=0A=
1C3807E010187F9713>I<03000700FF000700070007000700070007000700070007000700=
0700=0A=
0700070007000700070007000700070007007FF80D187D9713>I<0F80106020304038803C=
C01C=0A=
E01C401C003C003800380070006000C001800100020004040804100430083FF87FF8FFF80=
E187E=0A=
9713>I<07E01838201C601E700E201E001E001C001C0038007007E00038001C000E000F00=
0FE0=0A=
0FE00FC00F400E601C183807E010187F9713>I<001800180038007800F800B80138023802=
3804=0A=
3808381838103820384038C038FFFF00380038003800380038003803FF10187F9713>I<30=
183F=0A=
F03FE03F80200020002000200020002FC03060203000380018001C001C401CE01CE01C801=
84038=0A=
403030E00F800E187E9713>I<01F807040C06180E300E300070006000E000E3E0E418E80C=
F00E=0A=
E006E007E007E007600760077006300E180C0C3807E010187F9713>I<40007FFF7FFE7FFE=
4004=0A=
800880108010002000400040008001800100030003000700060006000E000E000E000E000=
E0004=0A=
0010197E9813>I<07E01818300C2006600660067006780C3E181F3007C003E00CF8307C60=
1E60=0A=
0FC007C003C003C00360022004181807E010187F9713>I<07E01C303018700C600EE006E0=
06E0=0A=
07E007E0076007700F3017182707C700070006000E000C700C7018603030600F8010187F9=
713>=0A=
I<60F0F060000000000000000060F0F06004107D8F0B>I<FFFFFF80FFFFFF800000000000=
0000=0A=
0000000000000000000000000000000000FFFFFF80FFFFFF80190A7E8D1E>61=0A=
D<1FC020604030C038E038E0380038007000E001800100030002000200020002000200020=
00000=0A=
00000000000006000F000F0006000D1A7E9912>63 =
D<000C0000000C0000000C0000001E000000=0A=
1E0000002F000000270000002700000043800000438000004380000081C0000081C000018=
1E000=0A=
0100E0000100E00003FFF000020070000200700004003800040038000400380008001C000=
8001C=0A=
003C001E00FF00FFC01A1A7F991D>65 =
D<FFFF800E00E00E00700E00380E003C0E003C0E003C0E=0A=
003C0E003C0E00780E00700E01E00FFFC00E00F00E00780E003C0E001C0E001E0E001E0E0=
01E0E=0A=
001E0E001C0E003C0E00780E00F0FFFFC0171A7F991B>I<003F0201C0C603002E0E001E1C=
000E=0A=
1C0006380006780002700002700002F00000F00000F00000F00000F00000F000007000027=
00002=0A=
7800023800041C00041C00080E000803003001C0C0003F00171A7E991C>I<FFFF80000E00=
E000=0A=
0E0070000E0038000E001C000E000E000E000E000E0007000E0007000E0007800E0007800=
E0007=0A=
800E0007800E0007800E0007800E0007800E0007800E0007000E0007000E000F000E000E0=
00E00=0A=
1C000E001C000E0078000E00E000FFFF8000191A7F991D>I<FFFFF80E00380E00180E0008=
0E00=0A=
0C0E00040E00040E00040E01000E01000E01000E03000FFF000E03000E01000E01000E010=
00E00=0A=
020E00020E00020E00060E00040E00040E000C0E003CFFFFFC171A7F991A>I<FFFFF80E00=
380E=0A=
00180E00080E000C0E00040E00040E00040E01000E01000E01000E03000FFF000E03000E0=
1000E=0A=
01000E01000E00000E00000E00000E00000E00000E00000E00000E0000FFE000161A7F991=
9>I<=0A=
003F020001C0C60003002E000E001E001C000E001C0006003800060078000200700002007=
00002=0A=
00F0000000F0000000F0000000F0000000F0000000F001FFC070000E0070000E0078000E0=
03800=0A=
0E001C000E001C000E000E000E000300160001C06600003F82001A1A7E991E>I<FFE1FFC0=
0E00=0A=
1C000E001C000E001C000E001C000E001C000E001C000E001C000E001C000E001C000E001=
C000E=0A=
001C000FFFFC000E001C000E001C000E001C000E001C000E001C000E001C000E001C000E0=
01C00=0A=
0E001C000E001C000E001C000E001C00FFE1FFC01A1A7F991D>I<FF801C001C001C001C00=
1C00=0A=
1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001=
C00FF=0A=
80091A7E990E>I<FFE0000E00000E00000E00000E00000E00000E00000E00000E00000E00=
000E=0A=
00000E00000E00000E00000E00000E00000E00000E00080E00080E00080E00180E00100E0=
0300E=0A=
00700E00F0FFFFF0151A7F9918>76 =
D<FF0000FF0F0000F00F0000F00B8001700B80017009C002=0A=
7009C0027009C0027008E0047008E00470087008700870087008700870083810700838107=
00838=0A=
1070081C2070081C2070080E4070080E4070080E40700807807008078070080300701C030=
070FF=0A=
8307FF201A7F9923>I<007F000001C1C000070070000E0038001C001C003C001E0038000E=
0078=0A=
000F0070000700F0000780F0000780F0000780F0000780F0000780F0000780F0000780F00=
00780=0A=
78000F0078000F0038000E003C001E001C001C000E0038000700700001C1C000007F00001=
91A7E=0A=
991E>79 =
D<FFFF800E01E00E00700E00780E00380E003C0E003C0E003C0E003C0E00380E00780E=0A=
00700E01E00FFF800E00000E00000E00000E00000E00000E00000E00000E00000E00000E0=
0000E=0A=
0000FFE000161A7F991A>I<FFFF00000E01C0000E0070000E0078000E003C000E003C000E=
003C=0A=
000E003C000E003C000E0078000E0070000E01C0000FFF00000E0380000E00C0000E00E00=
00E00=0A=
70000E0070000E0070000E0078000E0078000E0078000E0078400E003C400E001C80FFE00=
F001A=0A=
1A7F991C>82 =
D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF803FC007E000E=0A=
00070003800380038003C002C006E004D81887E0101A7E9915>I<7FFFFF00701C0700401C=
0100=0A=
401C0100C01C0180801C0080801C0080801C0080001C0000001C0000001C0000001C00000=
01C00=0A=
00001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C000=
0001C=0A=
0000001C0000001C000003FFE000191A7F991C>I<FFE07FC00E000E000E0004000E000400=
0E00=0A=
04000E0004000E0004000E0004000E0004000E0004000E0004000E0004000E0004000E000=
4000E=0A=
0004000E0004000E0004000E0004000E0004000E000400060008000700080003001000018=
02000=0A=
00E0C000003F00001A1A7F991D>I<FFC0FF800F003C000F001000070020000380200003C0=
4000=0A=
01C0800000E1800000F10000007A0000003E0000001C0000001E0000001E0000001700000=
02780=0A=
00004380000041C0000081E0000100E0000300700002007800040038000C001C001E003E0=
0FF00=0A=
7FC01A1A7F991D>88 =
D<2040204040804080810081008100E1C0F1E0F1E060C00B0B7A9913>92=0A=
D<1FC000387000383800101C00001C00001C0003FC001E1C00381C00701C00E01C00E01C8=
0E01C=0A=
80E03C80705F801F8F0011107F8F13>97 =
D<FC00001C00001C00001C00001C00001C00001C0000=0A=
1C00001C00001C00001CFC001D07001E03801C01C01C00C01C00E01C00E01C00E01C00E01=
C00E0=0A=
1C00E01C01C01C01801E030019060010F800131A809915>I<07F81C1C381C70087000E000=
E000=0A=
E000E000E000E0007000700438081C1807E00E107F8F11>I<003F00000700000700000700=
0007=0A=
0000070000070000070000070000070003E7000C1700180F00300700700700E00700E0070=
0E007=0A=
00E00700E00700E00700600700700700380F001C370007C7E0131A7F9915>I<07C01C3030=
1870=0A=
18600CE00CFFFCE000E000E000E0006000700438081C1807E00E107F8F11>I<01F007180E=
381C=0A=
101C001C001C001C001C001C00FFC01C001C001C001C001C001C001C001C001C001C001C0=
01C00=0A=
1C001C00FF800D1A80990C>I<0FCF00187180303000703800703800703800703800303000=
1860=0A=
002FC0006000006000007000003FF0003FFC001FFE00600F00C00300C00300C00300C0030=
06006=0A=
00381C0007E00011187F8F13>I<FC00001C00001C00001C00001C00001C00001C00001C00=
001C=0A=
00001C00001C7C001D87001E03801E03801C03801C03801C03801C03801C03801C03801C0=
3801C=0A=
03801C03801C03801C0380FF9FF0141A809915>I<183C3C18000000000000FC1C1C1C1C1C=
1C1C=0A=
1C1C1C1C1C1C1CFF081A80990A>I<018003C003C001800000000000000000000000000FC0=
01C0=0A=
01C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C041C0E=
180E3=0A=
007E000A2182990C>I<FC00001C00001C00001C00001C00001C00001C00001C00001C0000=
1C00=0A=
001C1FC01C0F001C0C001C18001C20001C40001CE0001DE0001E70001C78001C38001C1C0=
01C1E=0A=
001C0F001C0F80FF9FE0131A809914>I<FC001C001C001C001C001C001C001C001C001C00=
1C00=0A=
1C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A>I<=
FC7C=0A=
1F001D8E63801E0781C01E0781C01C0701C01C0701C01C0701C01C0701C01C0701C01C070=
1C01C=0A=
0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F81D107F8F20>I<FC7C001D87001E=
0380=0A=
1E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380F=
F9FF0=0A=
1410808F15>I<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C38=
07E0=0A=
10107F8F13>I<FCFC001D07001E03801C01C01C01C01C00E01C00E01C00E01C00E01C00E0=
1C00=0A=
E01C01C01C01801E03001D06001CF8001C00001C00001C00001C00001C00001C0000FF800=
01317=0A=
808F15>I<03E1000C1300180B00300F00700700E00700E00700E00700E00700E00700E007=
0070=0A=
0700700700380F001C370007C700000700000700000700000700000700000700003FE0131=
77F8F=0A=
14>I<FC781D9C1E1C1E081C001C001C001C001C001C001C001C001C001C001C00FF800E10=
808F=0A=
0F>I<1F2060E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C10=
7F8F=0A=
0F>I<0800080008000800180018003800FFC0380038003800380038003800380038003820=
3820=0A=
3820382018201C4007800B177F960F>I<FC1F801C03801C03801C03801C03801C03801C03=
801C=0A=
03801C03801C03801C03801C03801C07800C07800E0B8003F3F01410808F15>I<FF0F803C=
0700=0A=
1C06001C04001C04000E08000E080007100007100007100003A00003A00001C00001C0000=
1C000=0A=
00800011107F8F14>I<FE7F1F80381C07003C1C06001C0C04001C0E04000E1608000E1708=
000E=0A=
170800072310000723900007A3900003C1A00003C1E0000180C0000180C0000180C000191=
07F8F=0A=
1C>I<FE3F803C1E001C08000E10000F300007600003C00001C00001E00003E00002700004=
3800=0A=
083800181C00381E00FC3FC012107F8F14>I<FF0F803C07001C06001C04001C04000E0800=
0E08=0A=
0007100007100007100003A00003A00001C00001C00001C00000800000800001000001000=
0E100=0A=
00E20000E4000078000011177F8F14>I<FFFFC01201808913>123 =
D<FFFFFFFFF82501808926>=0A=
I E /Fm 10 58 =
df<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E=0A=
600C600C701C30181C7007C00F157F9412>48 =
D<03000700FF0007000700070007000700070007=0A=
0007000700070007000700070007000700070007007FF00C157E9412>I<0F8030E0407080=
30C0=0A=
38E0384038003800700070006000C00180030006000C08080810183FF07FF0FFF00D157E9=
412>=0A=
I<0FE030306018701C701C001C00180038006007E000300018000C000E000EE00EE00EC00=
C4018=0A=
30300FE00F157F9412>I<00300030007000F001F001700270047008701870107020704070=
C070=0A=
FFFE0070007000700070007003FE0F157F9412>I<20303FE03FC024002000200020002000=
2F80=0A=
30E020700030003800384038E038E0388030406020C01F000D157E9412>I<01F00608080C=
181C=0A=
301C70006000E000E3E0EC30F018F00CE00EE00EE00E600E600E300C3018183007C00F157=
F9412=0A=
>I<40007FFE7FFC7FF8C008801080200040008000800100010003000200060006000E000E=
000E=0A=
000E000E0004000F167E9512>I<07E018302018600C600C700C78183E101F600FC00FF018=
F860=0A=
7C601EC00EC006C006C004600C38300FE00F157F9412>I<07C0183030186018E00CE00CE0=
0EE0=0A=
0EE00E601E301E186E0F8E000E000C001C70187018603020C01F800F157F9412>I=0A=
E /Fn 17 121 =
df<000100000003800000038000000380000007C0000007C0000007C0000009E0=0A=
000009E0000011F0000010F0000010F00000207800002078000020780000403C0000403C0=
000C0=0A=
3E0000801E0000801E0001FFFF0001000F0001000F000200078002000780060007C004000=
3C004=0A=
0003C00C0001E00C0001E03E0003F0FF801FFE1F207D9F25>65 =
D<000FE01000381C3000E00270=0A=
03C00170078000F00F0000701E0000701E0000303C0000303C0000107C00001078000010F=
80000=0A=
00F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800000=
07C00=0A=
00103C0000103C0000101E0000201E0000200F0000200780004003C0008000E0030000380=
C0000=0A=
0FF0001C217C9F24>67 =
D<FFFFF8000F801E0007800780078003C0078001E0078000F007800070=0A=
07800078078000780780003C0780003C0780003C0780003E0780003E0780003E0780003E0=
78000=0A=
3E0780003E0780003E0780003E0780003C0780003C0780007C0780007807800078078000F=
00780=0A=
01E0078003C0078007800F801E00FFFFF8001F1F7D9E26>I<FFFFFFC00F8007C0078001C0=
0780=0A=
00C0078000400780006007800020078000200780002007802020078020000780200007806=
00007=0A=
80E00007FFE0000780E000078060000780200007802000078020000780000807800008078=
00008=0A=
0780001007800010078000100780003007800070078000E00F8003E0FFFFFFE01D1F7D9E2=
2>I<=0A=
FFFFFF800F800780078001800780018007800080078000C00780004007800040078000400=
78000=0A=
40078040000780400007804000078040000780C00007FFC0000780C000078040000780400=
00780=0A=
4000078040000780000007800000078000000780000007800000078000000780000007800=
0000F=0A=
C00000FFFE00001A1F7D9E20>I<FFFC0FC007800780078007800780078007800780078007=
8007=0A=
8007800780078007800780078007800780078007800780078007800780078007800FC0FFF=
C0E1F=0A=
7E9E12>73 =
D<FF800007FE0F800007E007800007C005C0000BC005C0000BC004E00013C004E000=0A=
13C004E00013C004700023C004700023C004380043C004380043C004380043C0041C0083C=
0041C=0A=
0083C0040E0103C0040E0103C0040E0103C004070203C004070203C004070203C00403840=
3C004=0A=
038403C00401C803C00401C803C00401C803C00400F003C00400F003C00E006003C01F006=
007E0=0A=
FFE0607FFE271F7D9E2D>77 =
D<FF800FFE07C001F007C000E005E0004004F0004004F000400478=0A=
0040043C0040043C0040041E0040040F0040040F0040040780400403C0400403C0400401E=
04004=0A=
00F0400400F0400400784004003C4004003C4004001E4004000F4004000F40040007C0040=
003C0=0A=
040003C0040001C00E0000C01F0000C0FFE000401F1F7D9E25>I<001FE0000070380001C0=
0E00=0A=
03800700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000F878000078F=
80000=0A=
7CF800007CF800007CF800007CF800007CF800007CF800007CF800007CF800007C7800007=
87C00=0A=
00F87C0000F83C0000F03E0001F01E0001E00F0003C0070003800380070001E01E0000703=
80000=0A=
1FE0001E217C9F26>I<FFFFC0000F80780007801E0007800F0007800F8007800780078007=
C007=0A=
8007C0078007C0078007C00780078007800F8007800F0007801E000780780007FFC000078=
0E000=0A=
078030000780380007801C0007801E0007801E0007801E0007801F0007801F0007801F000=
7801F=0A=
0107801F8107800F810FC00782FFFC03C4000000F820207D9E24>82 =
D<03F0200C0C601803E030=0A=
00E06000E0600060E00060E00020E00020E00020F00000F800007C00007F80003FFC001FF=
F0007=0A=
FF8001FFC0000FE00003E00001F00000F0000070800070800070800070800070C00060C00=
0E0E0=0A=
00C0F80180C6030081FC0014217C9F1C>I<7FFFFFF8780780786007801840078008400780=
08C0=0A=
07800C8007800480078004800780048007800400078000000780000007800000078000000=
78000=0A=
0007800000078000000780000007800000078000000780000007800000078000000780000=
00780=0A=
0000078000000780000007800000078000000FC00003FFFF001E1F7D9E24>I<FFF03FFC07=
FC1F=0A=
8007E001F00F0003C000E00F0003C000400F0003E00040078003E00080078003E00080078=
007F0=0A=
008003C004F0010003C004F0010003C00CF8010001E00878020001E00878020001E0187C0=
20000=0A=
F0103C040000F0103C040000F0103E04000078201E08000078201E08000078201F0800003=
C400F=0A=
1000003C400F1000003C400F1000001E8007A000001E8007A000001E8007A000000F0003C=
00000=0A=
0F0003C000000F0003C0000006000180000006000180000006000180002E207E9E32>87=0A=
D<FFF000FF801F80003E000F8000180007C000100003C000300003E000200001F00040000=
0F000=0A=
400000F8008000007C010000003C010000003E020000001F060000000F040000000F88000=
00007=0A=
C800000003D000000003F000000001E000000001E000000001E000000001E000000001E00=
00000=0A=
01E000000001E000000001E000000001E000000001E000000001E000000003E00000003FF=
F0000=0A=
211F7E9E25>89 =
D<FC07F01C01C01E008017008017008013808011808011C08010E08010E08010=0A=
7080107080103880101C80101C80100E80100E80100780100380100380100180380180FE0=
08014=0A=
177D961C>110 =
D<FF87F01C01C01C00801C00801C00801C00801C00801C00801C00801C00801C=0A=
00801C00801C00801C00801C00801C00801C00801C00800C01000E010006020003840000F=
80014=0A=
177D961C>117 =
D<FF81FE1F00F00F00E00700C003808003C10001C20000E60000F40000780000=0A=
3800001C00003E00004E0000C7000087800103800301C00200E00400F00C00703C00F8FF0=
1FF18=0A=
177F961C>120 D E /Fo 4 121 =
df<FFF00F000F000F000F000F000F000F000F000F000F000F00=0A=
0F000F000F000F000F000F000F000F000F000F000F000F000F00FFF00C1A7F990F>105=0A=
D<FF00FF800F801C000F8008000BC0080009E0080009E0080008F0080008F808000878080=
0083C=0A=
0800083C0800081E0800080F0800080F0800080788000803C8000803C8000801E8000800F=
80008=0A=
00F800080078000800780008003800080018001C001800FF800800191A7E991F>110=0A=
D<FFF0FF800F001C000F0008000F0008000F0008000F0008000F0008000F0008000F00080=
00F00=0A=
08000F0008000F0008000F0008000F0008000F0008000F0008000F0008000F0008000F000=
8000F=0A=
00080007001000078010000380200001C0600000E08000003F0000191A7E991F>117=0A=
D<7FE07F800FC03E000F80180007C0100003C0200003E0600001F0400000F080000079000=
0007D=0A=
0000003E0000001E0000001F0000000F0000001780000037C0000023C0000041E0000081F=
00001=0A=
80F0000100780002007C0006003C000E003E001E003F00FF80FFE01B1A7F991F>120=0A=
D E /Fp 18 119 =
df<0038007800F001E003C007800F000E001C001C0038003800700070007000=0A=
E000E000E000E000E000E000E000E000E000E000700070007000380038001C001C000E000=
F0007=0A=
8003C001E000F8007800380D2878A21A>40 =
D<6000F00078003C001E000F000780038001C001C0=0A=
00E000E000700070007000380038003800380038003800380038003800380070007000700=
0E000=0A=
E001C001C0038007800F001E003C007800F00060000D287CA21A>I<007C3801FF3807FFF8=
0F83=0A=
F81E00F81C0078380078380038700038700038700000E00000E00000E00000E00000E0000=
0E000=0A=
00E00000E000007000007000387000383800383800381C00701E00F00F83E007FFC001FF8=
0007C=0A=
00151E7E9D1A>67 =
D<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C00701C00701C0070=0A=
1C00701C00701C00701FFFF01FFFF01FFFF01C00701C00701C00701C00701C00701C00701=
C0070=0A=
1C00701C00701C00701C0070FF83FEFF83FEFF83FE171E7F9D1A>72 =
D<03F1C00FFDC03FFFC07C=0A=
0FC07003C0E003C0E001C0E001C0E001C0E000007000007800003F00001FF00007FE0000F=
F0000=0A=
0F800003C00001C00000E00000E06000E0E000E0E000E0E001C0F001C0FC0780FFFF80EFF=
E00E3=0A=
F800131E7D9D1A>83 =
D<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF=0A=
803F8380780380700380E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157=
D941A=0A=
>97 =
D<FE0000FE0000FE00000E00000E00000E00000E00000E00000E00000E3E000EFF800FFFE=
0=0A=
0FC1F00F80700F00380E00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380=
F0078=0A=
0F80F00FC1E00FFFC00EFF80063E00161E7F9D1A>I<00FF8003FFC00FFFE01F01E03C00C0=
7800=0A=
00700000700000E00000E00000E00000E00000E000007000007000007800703C00701F01F=
00FFF=0A=
E003FFC000FE0014157D941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001=
C000=0A=
01C001F1C007FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E00=
1C0E0=0A=
01C0E001C07003C07003C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F87C07=
FFFE=0A=
0FFFFE1E078C1C03803801C03801C03801C03801C03801C01C03801E07801FFF001FFE003=
9F800=0A=
3800003800001C00001FFF801FFFE03FFFF878007C70001CE0000EE0000EE0000EE0000E7=
0001C=0A=
78003C3E00F81FFFF007FFC001FF0017217F941A>103 =
D<00C00001E00001E00000C000000000=0A=
0000000000000000000000000000007FE0007FE0007FE00000E00000E00000E00000E0000=
0E000=0A=
00E00000E00000E00000E00000E00000E00000E00000E00000E00000E0007FFF80FFFFC07=
FFF80=0A=
121F7C9E1A>105 =
D<FFE000FFE000FFE00000E00000E00000E00000E00000E00000E00000E000=0A=
00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000=
0E000=0A=
00E00000E00000E00000E000FFFFE0FFFFE0FFFFE0131E7D9D1A>108 =
D<7CE0E000FFFBF8007F=0A=
FFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1=
C1C00=0A=
1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F001=
91580=0A=
941A>I<FE3E00FEFF80FFFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E0=
0E00=0A=
E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE7FEFFE3FE17157F941A>I<01F0=
0007=0A=
FC001FFF003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000E0E000E0F00=
1E070=0A=
01C07803C03C07803E0F801FFF0007FC0001F00013157D941A>I<07FB801FFF807FFF8078=
0780=0A=
E00380E00380E003807800007FC0003FFC0007FE00003F800007806001C0E001C0E001C0F=
003C0=0A=
FC0780FFFF00EFFE00E3F80012157C941A>115 =
D<00C00001C00001C00001C00001C00001C000=0A=
01C0007FFFE0FFFFE0FFFFE001C00001C00001C00001C00001C00001C00001C00001C0000=
1C000=0A=
01C00001C07001C07001C07001C07000E0E000FFE0007FC0001F00141C7F9B1A>I<7F83FC=
FFC7=0A=
FE7F83FC0E00E00E00E00E00E00701C00701C00701C003838003838003838001C70001C70=
001C7=0A=
0000EE0000EE0000EE00007C00007C0000380017157F941A>118 D E /Fq=0A=
62 123 =
df<000FF83F00007FFDFFC001F81FE3E003E03F87E007C03F87E00F803F07E00F803F03=0A=
C00F801F00000F801F00000F801F00000F801F00000F801F00000F801F0000FFFFFFFC00F=
FFFFF=0A=
FC000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F000=
00F80=0A=
1F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F0=
0000F=0A=
801F00000F801F00000F801F00007FF0FFF0007FF0FFF00023237FA221>11=0A=
D<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F801E000F800C0=
00F80=0A=
00000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F000F801F000F801=
F000F=0A=
801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F8=
01F00=0A=
0F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F>I<FFFCFFFCFFFC=
FFFC=0A=
0E047F8C13>45 =
D<387CFEFEFE7C3807077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00=0A=
F87C007C7C007C7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007=
EFC00=0A=
7EFC007EFC007EFC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC=
000FE=0A=
0017207E9F1C>48 =
D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F800=0A=
01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000=
1F800=0A=
01F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC00=
0FFF=0A=
003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F=
00007=0A=
E00007C0000F80001F00003E0000380000700000E01801C0180380180700180E00380FFFF=
01FFF=0A=
F03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81=
F83F=0A=
81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007C00001F0000=
1F800=0A=
00FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001F=
E0017=0A=
207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000=
E7E0=0A=
01C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0=
007E0=0A=
0007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E0=
1FFF=0A=
C01FFF801FFF001FFE001FF8001BC00018000018000018000018000019FC001FFF001E0FC=
01807=0A=
E01803E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E=
03007=0A=
C01C1F800FFF0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01=
F83E=0A=
01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC0=
07EFC=0A=
007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF00172=
07E9F=0A=
1C>I<6000007800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C0=
0300=0A=
C00300000600000C00001C0000180000380000780000780000F00000F00000F00001F0000=
1F000=0A=
01F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE00=
03FF=0A=
C00703E00E00F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8=
007FF=0A=
C003FFE007FFF01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001=
C7800=0A=
383C00381F01F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00=
F87C=0A=
0078FC007CFC007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FF=
E7E07=0A=
FC7E00207E00007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F=
80017=0A=
207E9F1C>I<387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<07FC0=
01FFF=0A=
00380F807007C0F807E0FC07E0FC07E0FC07E07807E0000FC0001F80001F00003C0000780=
00070=0A=
0000E00000E00000C00000C00000C00000C00000C00000C00000000000000000000000000=
00000=0A=
0001C00003E00007F00007F00007F00003E00001C00013237DA21A>63 =
D<000070000000007000=0A=
000000F800000000F800000000F800000001FC00000001FC00000003FE00000003FE00000=
003FE=0A=
00000006FF000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181FC00=
00038=0A=
1FE00000300FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FFFFF=
80001=0A=
8001FC00018001FC00038001FE00030000FE00030000FE000600007F000600007F00FFE00=
FFFF8=0A=
FFE00FFFF825227EA12A>65 =
D<FFFFFF8000FFFFFFE00007F001F80007F000FC0007F0007E0007=0A=
F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007F00=
0FE00=0A=
07F000FC0007F003F80007FFFFF00007FFFFF00007F001FC0007F0007E0007F0003F0007F=
0003F=0A=
8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC00=
7F000=0A=
3F8007F0003F8007F0007F0007F001FE00FFFFFFF800FFFFFFC00022227EA128>I<0003FE=
0080=0A=
001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F800007803F0=
00003=0A=
803F000003807F000001807E000001807E00000180FE00000000FE00000000FE00000000F=
E0000=0A=
0000FE00000000FE00000000FE00000000FE000000007E000000007E000001807F0000018=
03F00=0A=
0001803F000003801F800003000F8000030007C000060003F0000C0001F800380000FF00F=
00000=0A=
1FFFC0000003FE000021227DA128>I<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007=
F000=0A=
3F0007F0001F8007F0000FC007F00007E007F00007E007F00007F007F00003F007F00003F=
007F0=0A=
0003F007F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F0000=
3F807=0A=
F00003F807F00003F807F00003F007F00003F007F00003F007F00007E007F00007E007F00=
00FC0=0A=
07F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227EA12B>I<=
FFFF=0A=
FFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607F01=
80607=0A=
F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F=
01800=0A=
07F0180007F0180307F0180307F0000307F0000607F0000607F0000607F0000E07F0000E0=
7F000=0A=
1E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF807F001F807=
F000=0A=
7807F0003807F0001807F0001C07F0001C07F0000C07F0000C07F0180C07F0180C07F0180=
007F0=0A=
180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F01=
80007=0A=
F0180007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000FFF=
FE000=0A=
FFFFE0001E227EA123>I<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000FC007=
C000=0A=
07C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E000000C=
0FE00=0A=
000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000FF=
FFC7E=0A=
000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007E00=
01FC0=0A=
03F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>I<FFFF83FFFE=
FFFF=0A=
83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001=
FC007=0A=
F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007FFFFFFC007FFF=
FFFC0=0A=
07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F=
0001F=0A=
C007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0F=
FFF83=0A=
FFFEFFFF83FFFE27227EA12C>I<FFFFE0FFFFE003F80003F80003F80003F80003F80003F8=
0003=0A=
F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F=
80003=0A=
F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0FFF=
FE013=0A=
227FA115>I<FFFF803FFCFFFF803FFC07F000038007F000070007F0000E0007F000180007=
F000=0A=
300007F000E00007F001C00007F003800007F007000007F00E000007F018000007F038000=
007F0=0A=
FC000007F1FE000007F3FE000007F77F000007FE7F800007F83F800007F01FC00007F01FE=
00007=0A=
F00FE00007F007F00007F007F80007F003F80007F001FC0007F001FE0007F000FF0007F00=
07F00=0A=
07F0007F8007F0003FC0FFFF83FFFCFFFF83FFFC26227EA12C>75 =
D<FFFFE000FFFFE00007F000=0A=
0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000=
007F0=0A=
000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00=
01807=0A=
F0001807F0001807F0001807F0003807F0003807F0007007F0007007F000F007F001F007F=
007F0=0A=
FFFFFFF0FFFFFFF01D227EA122>I<FFF000000FFFFFF800001FFF07F800001FE006FC0000=
37E0=0A=
06FC000037E006FC000037E0067E000067E0067E000067E0063F0000C7E0063F0000C7E00=
61F80=0A=
0187E0061F800187E0060FC00307E0060FC00307E0060FC00307E00607E00607E00607E00=
607E0=0A=
0603F00C07E00603F00C07E00601F81807E00601F81807E00601F81807E00600FC3007E00=
600FC=0A=
3007E006007E6007E006007E6007E006003FC007E006003FC007E006001F8007E006001F8=
007E0=0A=
06001F8007E006000F0007E0FFF00F00FFFFFFF00600FFFF30227EA135>I<FFF8001FFEFF=
FC00=0A=
1FFE07FC0000C007FE0000C006FF0000C0067F8000C0063FC000C0061FE000C0060FE000C=
0060F=0A=
F000C00607F800C00603FC00C00601FE00C00600FE00C00600FF00C006007F80C006003FC=
0C006=0A=
001FE0C006000FF0C0060007F0C0060007F8C0060003FCC0060001FEC0060000FFC006000=
07FC0=0A=
0600007FC00600003FC00600001FC00600000FC006000007C006000003C006000003C0FFF=
00001=0A=
C0FFF00000C027227EA12C>I<FFFFFF00FFFFFFE007F007F007F001FC07F000FC07F0007E=
07F0=0A=
007E07F0007F07F0007F07F0007F07F0007F07F0007F07F0007E07F0007E07F000FC07F00=
1FC07=0A=
F007F007FFFFE007FFFF0007F0000007F0000007F0000007F0000007F0000007F0000007F=
00000=0A=
07F0000007F0000007F0000007F0000007F0000007F00000FFFF8000FFFF800020227EA12=
6>80=0A=
D<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001=
F8000=0A=
3F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE=
0FE00=0A=
000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000=
FC07F=0A=
00001FC07F00001FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC0003F60=
7F800=0A=
00FF07E000003FFF80000007FF80200000038020000001C020000001E0E0000001FFE0000=
001FF=0A=
C0000000FFC0000000FFC00000007F800000007F000000001E00232C7DA12A>I<FFFFFE00=
00FF=0A=
FFFFC00007F007F00007F001F80007F000FC0007F0007E0007F0007F0007F0007F0007F00=
07F00=0A=
07F0007F0007F0007F0007F0007F0007F0007E0007F000FC0007F001F80007F007F00007F=
FFFC0=0A=
0007FFFF800007F00FE00007F007F00007F003F80007F001FC0007F001FC0007F001FC000=
7F001=0A=
FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0607F000FE0607F000FF0=
CFFFF=0A=
803FF8FFFF800FF027227EA12A>I<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8=
000C=0A=
F8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0=
003FF=0A=
00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE08=
0FF80=0A=
18227DA11F>I<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180=
E003=0A=
F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F80=
00000=0A=
03F800000003F800000003F800000003F800000003F800000003F800000003F800000003F=
80000=0A=
0003F800000003F800000003F800000003F800000003F800000003F800000003F80000000=
3F800=0A=
000003F800000003F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFCFFFF803F=
FC07=0A=
F000018007F000018007F000018007F000018007F000018007F000018007F000018007F00=
00180=0A=
07F000018007F000018007F000018007F000018007F000018007F000018007F000018007F=
00001=0A=
8007F000018007F000018007F000018007F000018007F000018007F000018007F00001800=
7F000=0A=
018003F000030003F800030001F800060000FC000E00007E001C00003F80F800000FFFE00=
00001=0A=
FF000026227EA12B>I<FFFF800FFEFFFF800FFE07F00000C007F80000C003F800018003F8=
0001=0A=
8001FC00030001FC00030001FE00070000FE00060000FF000600007F000C00007F800C000=
03F80=0A=
1800003F801800003FC03800001FC03000001FE03000000FE06000000FF060000007F0C00=
00007=0A=
F0C0000007F9C0000003F980000003FD80000001FF00000001FF00000000FE00000000FE0=
00000=0A=
00FE000000007C000000007C00000000380000000038000027227FA12A>I<FFFF0FFFF01F=
FEFF=0A=
FF0FFFF01FFE0FF000FF0000E007F0007F0000C007F0007F0000C003F8007F80018003F80=
03F80=0A=
018003FC003F80038001FC003FC0030001FC003FC0030000FE007FE0060000FE006FE0060=
000FF=0A=
006FE00600007F00C7F00C00007F00C7F00C00007F80C7F81C00003F8183F81800003F818=
3F818=0A=
00001FC383FC3000001FC301FC3000001FE301FC3000000FE600FE6000000FE600FE60000=
00FF6=0A=
00FFE0000007FC007FC0000007FC007FC0000003FC007F80000003F8003F80000003F8003=
F8000=0A=
0001F0001F00000001F0001F00000000F0001E00000000E0000E00000000E0000E0000372=
27FA1=0A=
3A>I<FFFF800FFEFFFF800FFE07F80000C007F80001C003FC00018001FE00030001FE0007=
0000=0A=
FF00060000FF000C00007F801C00003FC01800003FC03000001FE07000000FF06000000FF=
0E000=0A=
0007F8C0000003FD80000003FF80000001FF00000001FE00000000FE00000000FE0000000=
0FE00=0A=
000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000=
000FE=0A=
00000000FE0000001FFFF000001FFFF00027227FA12A>89 =
D<07FC001FFF803F07C03F03E03F01=0A=
E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F=
0FC01=0A=
F07E02F07E0CF81FF87F07E03F18167E951B>97 =
D<FF000000FF0000001F0000001F0000001F00=0A=
00001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0FE=
0001F=0A=
3FF8001FF07C001F801E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F0=
00FC0=0A=
1F000FC01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C001=
C3FF8=0A=
00180FC0001A237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC=
0000=0A=
FC0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF800=
0FE00=0A=
14167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E000000=
3E00=0A=
00003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E003=
E003E=0A=
007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E0=
0FC00=0A=
3E007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F>I<=
00FE=0A=
0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC000=
0FC00=0A=
007C00007C00007E00003E00181F00300FC07003FFC000FF0015167E951A>I<003F8000FF=
C001=0A=
E3E003C7E007C7E00F87E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FFF=
C000F=0A=
80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8=
0000F=0A=
80000F80000F80000F80000F80007FF8007FF80013237FA211>I<03FC1E0FFF7F1F0F8F3E=
07CF=0A=
3C03C07C03E07C03E07C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC003000003=
00000=0A=
3800003FFF801FFFF00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C7=
C007C=0A=
3F01F80FFFE001FF0018217E951C>I<FF000000FF0000001F0000001F0000001F0000001F=
0000=0A=
001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F07E0001F1FF80=
01F30=0A=
7C001F403C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F003=
E001F=0A=
003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE=
1FFC0=0A=
1A237EA21F>I<1C003E007F007F007F003E001C000000000000000000000000000000FF00=
FF00=0A=
1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00F=
FE0FF=0A=
E00B247EA310>I<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F=
0000=0A=
001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F00600=
01F01=0A=
C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07C=
0001F=0A=
03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E>=
107=0A=
D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F0=
01F00=0A=
1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA21=
0>I<=0A=
FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F001=
F001F=0A=
001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F0=
01F00=0A=
1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001=
F001F=0A=
001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F403C=
001F=0A=
803E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F0=
03E00=0A=
1F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E951=
F>I<=0A=
00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EF=
C007E=0A=
FC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0FE0=
00FF=0A=
3FF8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F0=
00FC0=0A=
1F000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC001=
F3FF8=0A=
001F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000=
0FFE0=0A=
0000FFE000001A207E951F>I<FE1F00FE3FC01E67E01EC7E01E87E01E87E01F83C01F0000=
1F00=0A=
001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FFF00=
0FFF0=0A=
0013167E9517>114 =
D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8=0A=
003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00=
01116=0A=
7E9516>I<0180000180000180000180000380000380000780000780000F80003F8000FFFF=
00FF=0A=
FF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8=
1800F=0A=
81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>I<FF01FE00FF01FE=
001F=0A=
003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F0=
03E00=0A=
1F003E001F003E001F003E001F003E001F003E001F007E001F00FE000F81BE0007FF3FC00=
1FC3F=0A=
C01A167E951F>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007C00C0007E01C0003=
E018=0A=
0003E0180001F0300001F0300000F8600000F86000007CC000007CC000007FC000003F800=
0003F=0A=
8000001F0000001F0000000E0000000E00001B167F951E>I<FFE7FF07F8FFE7FF07F81F00=
7800=0A=
C00F807801800F807C01800F807C018007C07E030007C0DE030007E0DE070003E0DF06000=
3E18F=0A=
060001F18F0C0001F38F8C0001FB079C0000FB07D80000FE03D800007E03F000007E03F00=
0007C=0A=
01F000003C01E000003800E000001800C00025167F9528>I<FFE07FC0FFE07FC00F801C00=
07C0=0A=
380003E0700003F0600001F8C00000F98000007F8000003F0000001F0000001F8000003FC=
00000=0A=
37C0000063E00000C1F00001C0F8000380FC0007007E000E003E00FF80FFE0FF80FFE01B1=
67F95=0A=
1E>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007C00C0007E01C0003E0180003E0=
1800=0A=
01F0300001F0300000F8600000F86000007CC000007CC000007FC000003F8000003F80000=
01F00=0A=
00001F0000000E0000000E0000000C0000000C00000018000078180000FC380000FC30000=
0FC60=0A=
000069C000007F8000001F0000001B207F951E>I<7FFFF07FFFF07C03E07007C0600FC0E0=
1F80=0A=
C01F00C03E00C07E0000FC0000F80001F00003F03007E03007C0300F80701F80703F00603=
E00E0=0A=
7C03E0FFFFE0FFFFE014167E9519>I E /Fr 1 52 =
df<00008000000180000003C00000066000=0A=
000C30000018180000300C000060060000C0030001800180030000C0060000600C0000301=
80000=0A=
183000000C60000006C0000003600000063000000C180000180C00003006000060030000C=
00180=0A=
018000C003000060060000300C0000181800000C3000000660000003C0000001800000008=
00020=0A=
217E9F25>51 D E /Fs 93 127 =
df<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060F0F0=0A=
600419779816>33 =
D<E038F078F078F078F078F078F078F078E038E03860300D0B7C9816>I<03=0A=
87000387000387000387000387000387007FFFC0FFFFE0FFFFE0070E00070E00070E000E1=
C000E=0A=
1C000E1C000E1C00FFFFE0FFFFE07FFFC01C38001C38001C38001C38001C38001C3800131=
97F98=0A=
16>I<00C00001C00001C00001C00007F0001FFC003FFF007DCF00F1C780E1C780E1C780E1=
C780=0A=
F1C30079C0007FC0001FF00007FC0001FE0001CF0001C780F1C380F1C380F1C380E1C780F=
1C780=0A=
79DF003FFE001FFC0007E00001C00001C00000C00011207E9C16>I<3801807C0380FE0380=
FE07=0A=
00EE0700EE0E00EE0E00EE0E00FE1C00FE1C007C380038380000700000700000700000E00=
000E0=0A=
0001C00001C00001C0000380000383800707C0070FE00E0EE00E0EE00E0EE01C0EE01C0EE=
0380F=0A=
E03807C018038013207F9C16>I<03800007E0000FE0001E70001C70001C70001C70001C77=
E01C=0A=
E7E01DE7E00FC7000F8E000F0E001E0E003F1C007F1C00739C00E3F800E1F800E0F1C0E0F=
1C071=0A=
F9C07FFFC03F9F801E070013197F9816>I<183C3E1E0E0E0E1E1C3C78F060070D799816>I=
<00E0=0A=
01E007C007000F001E003C0038007800700070007000F000E000E000E000E000E000E000E=
000F0=0A=
00700070007000780038003C001E000F00070007C001E000E00B217A9C16>I<E000F0007C=
001C=0A=
001E000F000780038003C001C001C001C001E000E000E000E000E000E000E000E001E001C=
001C0=0A=
01C003C0038007800F001E001C007C00F000E0000B217C9C16>I<01C00001C00001C00001=
C000=0A=
71C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C0000=
1C000=0A=
01C00011127E9516>I<01C00001C00001C00001C00001C00001C00001C00001C000FFFF80=
FFFF=0A=
80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00011137E9516>I<387C=
7E7E=0A=
3E0E1E3C7CF860070B798416>I<FFFF80FFFF80FFFF8011037E8D16>I<70F8F8F87005057=
88416=0A=
>I<000180000380000380000700000700000E00000E00001C00001C000038000038000070=
0000=0A=
700000E00000E00001C00001C0000380000380000700000700000E00000E00001C00001C0=
00038=0A=
0000380000700000700000E00000E00000C0000011207E9C16>I<03E0000FF8001FFC001E=
3C00=0A=
380E00780F00700700700700E00380E00380E00380E00380E00380E00380E00380E00380F=
00780=0A=
700700700700780F003C1E001E3C001FFC000FF80003E00011197E9816>I<018003800380=
0780=0A=
0F807F80FF807380038003800380038003800380038003800380038003800380038003807=
FF87F=0A=
FC7FF80E197C9816>I<07E0001FF8007FFE00783F00F00F00F00780F00380F00380000380=
0003=0A=
80000780000700000F00001E00003C0000780000F00003E0000780000F00001E03803C038=
07FFF=0A=
80FFFF807FFF8011197E9816>I<07E0001FFC007FFE00781F00780F00780700000700000F=
0000=0A=
0F00003E0007FC0007F80007FC00001E00000700000780000380000380F00380F00780F00=
700F8=0A=
1F007FFE003FFC0007E00011197E9816>I<007C0000FC0000DC0001DC00039C00039C0007=
1C00=0A=
0F1C000E1C001E1C003C1C00381C00781C00F01C00FFFFE0FFFFE0FFFFE0001C00001C000=
01C00=0A=
001C00001C0001FFC001FFC001FFC013197F9816>I<3FFE003FFE003FFE00380000380000=
3800=0A=
003800003800003800003800003BF0003FFC003FFE003C0F0030070000078000038060038=
0F003=0A=
80F00780F00F00F81F007FFE001FF80007E00011197E9816>I<00F80003FE000FFF001F0F=
003E=0A=
0F003C0F00780600700000F00000F3F800EFFE00FFFE00F80F00F00780F00780E00380F00=
380F0=0A=
0380700380780780780F003C1F001FFE000FF80003E00011197E9816>I<E00000FFFF80FF=
FF80=0A=
FFFF80E00F00E01E00001C0000380000780000700000E00000E00001C00001C00001C0000=
38000=0A=
038000038000038000070000070000070000070000070000070000070000111A7E9916>I<=
07F0=0A=
001FFC003FFE007C1F00F00780E00380E00380E003807007007C1F001FFC0007F0001FFC0=
03C1E=0A=
00700700F00780E00380E00380E00380F007807007007C1F003FFE001FFC0007F00011197=
E9816=0A=
>I<03E0000FF8003FFC007C1E00780F00F00700E00700E00780E00780E00380F00780F007=
8078=0A=
0F803FFF803FFB800FE380000780000700300F00780E00781E00787C007FF8003FE0000F8=
00011=0A=
197E9816>I<70F8F8F870000000000000000070F8F8F8700512789116>I<387C7C7C38000=
00000=0A=
00000000387C7C7C3C1C3C38F8F0600618799116>I<000180000780001F80003E0000F800=
01F0=0A=
0007C0000F80003E0000FC0000F00000FC00003E00000F800007C00001F00000F800003E0=
0001F=0A=
8000078000018011157E9616>I<7FFF00FFFF80FFFF800000000000000000000000000000=
00FF=0A=
FF80FFFF807FFF00110B7E9116>I<C00000F00000FC00003E00000F800007C00001F00000=
F800=0A=
003E00001F80000780001F80003E0000F80001F00007C0000F80003E0000FC0000F00000C=
00000=0A=
11157E9616>I<0FE03FF87FFCF01EF00EF00E601E007C00F801F003E003C0038003800380=
0380=0A=
0300000000000000000003000780078003000F197D9816>I<00F80003FE000FFF001F0F80=
3E3F=0A=
803C7F8078FFC071E7C0F1C3C0E3C3C0E381C0E381C0E381C0E381C0E381C0E3C3C0F1C38=
071E7=0A=
8078FF003C7E003E3C001F03C00FFFC003FF0000FC0012197E9816>I<00E00001F00001F0=
0001=0A=
B00001B00003B80003B80003B800031800071C00071C00071C00071C00071C000E0E000E0=
E000F=0A=
FE000FFE001FFF001C07001C07001C07007F1FC0FF1FE07F1FC013197F9816>I<7FF800FF=
FE00=0A=
7FFF001C0F001C07801C03801C03801C03801C07801C07001FFF001FFE001FFE001C1F001=
C0380=0A=
1C03C01C01C01C01C01C01C01C01C01C03C01C07807FFF80FFFF007FFC0012197F9816>I<=
01F1=0A=
8007FF800FFF801F0F803C0780780780780380700380F00000E00000E00000E00000E0000=
0E000=0A=
00E00000E00000F000007003807803807803803C07801F0F000FFE0007FC0001F00011197=
E9816=0A=
>I<7FF800FFFE007FFF001C0F001C07801C03C01C01C01C01C01C01E01C00E01C00E01C00=
E01C=0A=
00E01C00E01C00E01C00E01C00E01C01C01C01C01C03C01C07801C0F807FFF00FFFE007FF=
80013=0A=
19809816>I<7FFFC0FFFFC07FFFC01C01C01C01C01C01C01C01C01C00001C00001C1C001C=
1C00=0A=
1FFC001FFC001FFC001C1C001C1C001C00001C00E01C00E01C00E01C00E01C00E07FFFE0F=
FFFE0=0A=
7FFFE013197F9816>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C0000=
1C1C=0A=
001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C00001C00001C00001C000=
0FF80=0A=
00FFC000FF800013197F9816>I<03E30007FF001FFF003E1F003C0F00780F007807007007=
00F0=0A=
0000E00000E00000E00000E00000E03F80E07FC0E03F80F00700700700780F00780F003C0=
F003E=0A=
1F001FFF0007FF0003E70012197E9816>I<7F1FC0FFBFE07F1FC01C07001C07001C07001C=
0700=0A=
1C07001C07001C07001FFF001FFF001FFF001C07001C07001C07001C07001C07001C07001=
C0700=0A=
1C07001C07007F1FC0FFBFE07F1FC013197F9816>I<FFFEFFFEFFFE038003800380038003=
8003=0A=
800380038003800380038003800380038003800380038003800380FFFEFFFEFFFE0F197D9=
816>=0A=
I<07FE07FF07FE00380038003800380038003800380038003800380038003800380038003=
80038=0A=
6038F038F0707FF07FE01F8010197D9816>I<7F0FE0FF8FF07F0FE01C07801C0F001C0E00=
1C1C=0A=
001C3C001C78001CF0001CE0001DF0001FF0001FF8001F38001E1C001C1C001C0E001C0E0=
01C07=0A=
001C07001C03807F07E0FF8FF07F07E01419809816>I<FFC000FFC000FFC0001C00001C00=
001C=0A=
00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0=
0401C=0A=
00E01C00E01C00E01C00E0FFFFE0FFFFE0FFFFE013197F9816>I<FC07E0FE0FE0FE0FE03A=
0B80=0A=
3B1B803B1B803B1B803B1B803B1B803BBB8039B38039B38039B38039B38039F38038E3803=
8E380=0A=
380380380380380380380380380380FE0FE0FE0FE0FE0FE013197F9816>I<7E1FC0FF3FE0=
7F1F=0A=
C01D07001D87001D87001D87001DC7001DC7001CC7001CC7001CE7001CE7001CE7001C670=
01C67=0A=
001C77001C77001C37001C37001C37001C17007F1F00FF9F007F0F0013197F9816>I<1FFC=
003F=0A=
FE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380E00380E00380E00=
380E0=0A=
0380E00380E00380E00380E00380F00780F00780780F007FFF003FFE001FFC0011197E981=
6>I<=0A=
7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F801=
FFF00=0A=
1FFE001FF8001C00001C00001C00001C00001C00001C00001C00007F0000FF80007F00001=
2197F=0A=
9816>I<1FFC003FFE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380=
E003=0A=
80E00380E00380E00380E00380E00380E00380E0E380E1E380F0F780787F007FFF003FFE0=
01FFC=0A=
00001C00001E00000E00000F00000700000700111F7E9816>I<7FE000FFF8007FFC001C1E=
001C=0A=
0F001C07001C07001C07001C07001C0F001C1E001FFC001FF8001FFC001C1C001C0E001C0=
E001C=0A=
0E001C0E001C0E201C0E701C0E707F07E0FF87E07F03C014197F9816>I<07E3001FFF007F=
FF00=0A=
781F00F00F00E00700E00700E00000F000007800007F80001FF00007FC0000FE00000F000=
00780=0A=
000380000380E00380E00380F00780F80F00FFFE00FFFC00C7F00011197E9816>I<7FFFE0=
FFFF=0A=
E0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000E00000E00000E00000E00000E00000E00=
000E0=0A=
0000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007FC0013197F9816>=
I<7F=0A=
07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C0=
1C01C=0A=
01C01C01C01C01C01C01C01C01C01C01C00E03800E038007070007FF0003FE0000F800151=
98098=0A=
16>I<FE0FE0FF1FE0FE0FE03803801C07001C07001C07001C07000E0E000E0E000E0E000E=
0E00=0A=
060C00071C00071C00071C00071C0003180003B80003B80003B80001B00001F00001F0000=
0E000=0A=
13197F9816>I<FC07E0FE0FE0FC07E07001C07001C07001C0300180380380380380380380=
38E3=0A=
8039F38039F38039B38019B30019B30019B30019B30019B30019B3001913001B1B000F1E0=
00F1E=0A=
000E0E0013197F9816>I<7F1F807F3F807F1F800E1E000E1C00073C0007380003B80003F0=
0001=0A=
F00001E00000E00001E00001F00003F00003B80007B800071C00071C000E0E000E0E001C0=
7007F=0A=
1FC0FF1FE07F1FC013197F9816>I<FE0FE0FF1FE0FE0FE01C07001C07000E0E000E0E0007=
1C00=0A=
071C00071C0003B80003B80001F00001F00000E00000E00000E00000E00000E00000E0000=
0E000=0A=
00E00003F80007FC0003F80013197F9816>I<7FFF80FFFF80FFFF80E00700E00F00E01E00=
E01C=0A=
00003C0000780000700000F00001E00001C00003C0000780000700000F00001E03801C038=
03C03=0A=
80780380700380FFFF80FFFF80FFFF8011197E9816>I<FFF0FFF0FFF0E000E000E000E000=
E000=0A=
E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E=
000E0=0A=
00E000FFF0FFF0FFF00C20789C16>I<C00000E00000E00000700000700000380000380000=
1C00=0A=
001C00000E00000E000007000007000003800003800001C00001C00000E00000E00000700=
00070=0A=
00003800003800001C00001C00000E00000E0000070000070000038000038000018011207=
E9C16=0A=
>I<FFF0FFF0FFF00070007000700070007000700070007000700070007000700070007000=
7000=0A=
700070007000700070007000700070007000700070FFF0FFF0FFF00C207F9C16>I<FFFF80=
FFFF=0A=
80FFFF8011037E7E16>95 =
D<0C1E3C7870F0E0E0E0F0F87830070D789B16>I<1FE0007FF8007F=0A=
FC00783C00301E00000E00000E0003FE001FFE007E0E00F00E00E00E00E00E00F01E00F83=
E007F=0A=
FFE03FE7E00F83E013127E9116>I<7E0000FE00007E00000E00000E00000E00000E00000E=
3E00=0A=
0EFF800FFFC00F83E00F01E00E00F00E00F00E00700E00700E00700E00700E00F00F00E00=
F01E0=0A=
0F83C00FFFC00EFF00063C001419809816>I<03F80FFE1FFE3C1E780C7000F000E000E000=
E000=0A=
E000F000700778073E0F1FFE0FFC03F010127D9116>I<003F00007F00003F000007000007=
0000=0A=
070000070003C7000FF7003FFF003C1F00780F00F00700F00700E00700E00700E00700E00=
700F0=0A=
0700F00F00781F007C3F003FFFE01FF7F007C7E014197F9816>I<03E00FF81FFC3C1E780E=
7007=0A=
E007FFFFFFFFFFFFE000E000700778073C0F1FFE0FFC03F010127D9116>I<001F00007F80=
00FF=0A=
8001E78001C30001C00001C0007FFF00FFFF00FFFF0001C00001C00001C00001C00001C00=
001C0=0A=
0001C00001C00001C00001C00001C00001C0003FFE007FFF003FFE0011197F9816>I<03E3=
C00F=0A=
FFE01FFFE01E3CC03C1E00380E00380E00380E003C1E001E3C001FFC001FF8003BE000380=
00038=0A=
00001FFC001FFF003FFFC07803C0F001E0E000E0E000E0E000E0F001E07C07C03FFF800FF=
E0003=0A=
F800131C7F9116>I<7E0000FE00007E00000E00000E00000E00000E00000E3C000EFF000F=
FF80=0A=
0F87800F03800F03800E03800E03800E03800E03800E03800E03800E03800E03800E03807=
FC7F0=0A=
FFE7F87FC7F01519809816>I<018003C003C0018000000000000000007FC07FC07FC001C0=
01C0=0A=
01C001C001C001C001C001C001C001C001C001C07FFFFFFF7FFF101A7D9916>I<00300078=
0078=0A=
003000000000000000001FF81FF81FF800380038003800380038003800380038003800380=
03800=0A=
3800380038003800380038003800386070F0F0FFE07FC03F800D237E9916>I<7E0000FE00=
007E=0A=
00000E00000E00000E00000E00000E7FE00E7FE00E7FE00E0F000E1E000E3C000E78000EF=
0000F=0A=
F0000FF8000FBC000F1E000E0E000E07000E07807F87F0FFCFF07F87F01419809816>I<FF=
C000=0A=
FFC000FFC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0000=
1C000=0A=
01C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF8011197E9=
816>=0A=
I<F9C380FFEFC0FFFFE03E7CE03C78E03870E03870E03870E03870E03870E03870E03870E=
03870=0A=
E03870E03870E0FE7CF8FE7CF8FE3C781512809116>I<7E3C00FEFF007FFF800F87800F03=
800F=0A=
03800E03800E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87FC=
7F015=0A=
12809116>I<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E00380E0=
0380=0A=
F00780700700780F003C1E001FFC000FF80003E00011127E9116>I<7E3E00FEFF807FFFC0=
0F83=0A=
E00F01E00E00F00E00F00E00700E00700E00700E00700E00F00F00E00F01E00F83C00FFFC=
00EFF=0A=
000E3C000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000141B809116>=
I<07=0A=
C7001FF7003FFF007C3F00781F00F00F00F00700E00700E00700E00700E00700F00700F00=
F0078=0A=
1F007C3F003FFF001FF70007C700000700000700000700000700000700000700003FE0007=
FF000=0A=
3FE0141B7E9116>I<FF0FC0FF3FE0FF7FE007F04007E00007C00007800007800007000007=
0000=0A=
070000070000070000070000070000FFFC00FFFC00FFFC0013127F9116>I<0FEC3FFC7FFC=
F03C=0A=
E01CE01CF0007F801FF007FC003EE00EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<0300=
0007=0A=
00000700000700000700007FFF00FFFF00FFFF00070000070000070000070000070000070=
00007=0A=
000007010007038007038007078007878003FF0003FE0000F80011177F9616>I<7E1F80FE=
3F80=0A=
7E1F800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E07800=
F0F80=0A=
0FFFF007FFF803E3F01512809116>I<7F1FC0FF1FE07F1FC01C07001E0F000E0E000E0E00=
0E0E=0A=
00071C00071C00071C00071C0003B80003B80003B80001F00001F00000E00013127F9116>=
I<FF=0A=
1FE0FFBFE0FF1FE038038038038038038038038038E38019F30019F30019B3001DB7001DB=
7001D=0A=
B7001DB7000F1E000F1E000F1E0013127F9116>I<7F1FC07F3FC07F1FC00F1C00073C0003=
B800=0A=
03F00001F00000E00001E00001F00003B800073C00071C000E0E007F1FC0FF3FE07F1FC01=
3127F=0A=
9116>I<7F1FC0FF9FE07F1FC01C07000E07000E0E000E0E00070E00071C00071C00039C00=
039C=0A=
0003980001B80001B80000F00000F00000F00000E00000E00000E00001C00079C0007BC00=
07F80=0A=
003F00003C0000131B7F9116>I<3FFFC07FFFC07FFFC0700780700F00701E00003C000078=
0001=0A=
F00003E0000780000F00001E01C03C01C07801C0FFFFC0FFFFC0FFFFC012127F9116>I<00=
1F80=0A=
007F8001FF8001E00001C00001C00001C00001C00001C00001C00001C00001C00001C0000=
3C000=0A=
7F8000FF0000FF00007F800003C00001C00001C00001C00001C00001C00001C00001C0000=
1C000=0A=
01C00001E00001FF80007F80001F8011207E9C16>I<E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0=
E0E0=0A=
E0E0E0E0E0E0E0E0E0E0E0E0E0E0E00320779C16>I<FC0000FF0000FFC00003C00001C000=
01C0=0A=
0001C00001C00001C00001C00001C00001C00001C00001E00000FF00007F80007F8000FF0=
001E0=0A=
0001C00001C00001C00001C00001C00001C00001C00001C00001C00003C000FFC000FF000=
0FC00=0A=
0011207E9C16>I<1C303F78FFF8F7E061C00D057C9816>I E /Ft 62 123=0A=
df<0001FF0000001FFFC000007F80F00000FC00F80001F801F80003F803FC0007F003FC00=
07F0=0A=
03FC0007F003FC0007F001F80007F000F00007F000000007F000000007F000000007F0000=
000FF=0A=
FFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC0007F00=
1FC00=0A=
07F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F=
001FC=0A=
0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC000=
7F001=0A=
FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>12 =
D<1C007F007F00FF80FFC0FFC07FC0=0A=
7FC01CC000C000C00180018001800300030006000C001800300020000A157BA913>39=0A=
D<1C007F007F00FF80FFC0FFC07FC07FC01CC000C000C00180018001800300030006000C0=
01800=0A=
300020000A157B8813>44 =
D<FFFF80FFFF80FFFF80FFFF80FFFF80FFFF8011067F9017>I<1C00=0A=
3E007F00FF80FF80FF807F003E001C0009097B8813>I<0000030000000780000007800000=
0F80=0A=
00000F0000000F0000001F0000001E0000003E0000003C0000003C0000007C00000078000=
00078=0A=
000000F8000000F0000001F0000001E0000001E0000003E0000003C0000003C0000007C00=
00007=0A=
8000000F8000000F0000000F0000001F0000001E0000003E0000003C0000003C0000007C0=
00000=0A=
7800000078000000F8000000F0000001F0000001E0000001E0000003E0000003C0000003C=
00000=0A=
07C00000078000000F8000000F0000000F0000001F0000001E0000001E0000003E0000003=
C0000=0A=
007C0000007800000078000000F8000000F0000000F000000060000000193C7CAC22>I<00=
3F80=0A=
0001FFF00007E0FC000FC07E001F803F001F803F003F001F803F001F807F001FC07F001FC=
07F00=0A=
1FC07F001FC0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001=
FE0FF=0A=
001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F0=
01FC0=0A=
7F001FC03F001F803F001F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001=
B277D=0A=
A622>I<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE00=
00FE=0A=
0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0=
000FE=0A=
0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFF=
E7FFF=0A=
FE7FFFFE17277BA622>I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE00=
3FC0=0A=
FF003FC0FF003FE0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC00=
0007F=0A=
8000007F000000FE000000FC000001F8000003F0000003E00000078000000F0000001E000=
0003C=0A=
00E0007000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFF=
FC0FF=0A=
FFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF=
003F=0A=
80FF003F807F803F807F803F807F801F807F800F007F800000FF000000FF000000FE00000=
1FC00=0A=
0001F8000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC00=
0003F=0A=
C000003FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F8=
07C00=0A=
7F003F01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E00=
0000=0A=
7E000000FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387=
E0000=0A=
707E0000E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E00380=
07E00=0A=
70007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000=
000FE=0A=
000000FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F=
803F=0A=
000FFFFE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E00000=
00E00=0A=
00000E0000000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001=
F8000=0A=
001FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE0=
01FC0=0A=
FC001FC078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA62=
2>I<=0A=
0007F000003FFC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803=
F801F=0A=
003F8000007F0000007F0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E0=
0FFC0=0A=
3F00FF801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001=
FE07F=0A=
001FE03F001FE03F001FC01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003=
FC000=0A=
1B277DA622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFF=
FF80=0A=
7FFFFF0070000E0070000E0070001C00E0003800E0007000E000E0000000E0000001C0000=
00380=0A=
000007800000078000000F0000000F0000001F0000001F0000003F0000003E0000003E000=
0007E=0A=
0000007E0000007E0000007E000000FE000000FE000000FE000000FE000000FE000000FE0=
00000=0A=
FE000000FE0000007C0000003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E=
000F=0A=
003F001E001F001E000F803E000F803E000F803F000F803F000F803FC00F003FF01F001FF=
C1E00=0A=
1FFE3C000FFFF80007FFE00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03=
C01FF=0A=
C07C007FE078001FE0F80007E0F80007E0F80003E0F80003E0F80003E0F80003C07C0003C=
07C00=0A=
07803F000F001FC03E000FFFFC0003FFF800007FC0001B277DA622>I<007F800001FFF000=
07FF=0A=
F8000FE0FC001F807E003F803F007F003F007F001F80FF001F80FF001FC0FF001FC0FF001=
FC0FF=0A=
001FE0FF001FE0FF001FE0FF001FE07F001FE07F003FE03F003FE01F807FE00F807FE007C=
1DFE0=0A=
03FF9FE0007E1FE000001FE000001FC000001FC000001FC000003F801F003F803F803F003=
F803F=0A=
003F807E003F807C001F01F8001E03F0000FFFE00007FF800001FE00001B277DA622>I<1C=
003E=0A=
007F00FF80FF80FF807F003E001C000000000000000000000000000000000000001C003E0=
07F00=0A=
FF80FF80FF807F003E001C00091B7B9A13>I<01FF000FFFE01E03F03801F87801FCFC01FE=
FE01=0A=
FEFE01FEFE01FE7C01FE3801FC0003F80007F00007C0000F80001F00001E00003C0000380=
00038=0A=
0000780000700000700000700000700000700000700000000000000000000000000000000=
00000=0A=
0000700000F80001FC0003FE0003FE0003FE0001FC0000F800007000172A7CA920>63=0A=
D<000003800000000007C00000000007C0000000000FE0000000000FE0000000000FE0000=
00000=0A=
1FF0000000001FF0000000003FF8000000003FF8000000003FF80000000073FC000000007=
3FC00=0A=
000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001C0FF00000003C0FF800=
00003=0A=
807F80000007807FC0000007003FC0000007003FC000000E003FE000000E001FE000001E0=
01FF0=0A=
00001C000FF000001FFFFFF000003FFFFFF800003FFFFFF80000780007FC0000700003FC0=
00070=0A=
0003FC0000E00001FE0000E00001FE0001E00001FF0001C00000FF0001C00000FF00FFFE0=
01FFF=0A=
FEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 =
D<FFFFFFF80000FFFFFFFF8000FFFFFFFFC000=0A=
03F8001FF00003F8000FF80003F80007FC0003F80003FC0003F80003FC0003F80003FE000=
3F800=0A=
01FE0003F80001FE0003F80001FE0003F80003FE0003F80003FC0003F80003FC0003F8000=
7F800=0A=
03F8000FF00003F8001FE00003F800FFC00003FFFFFE000003FFFFFFE00003F80007F0000=
3F800=0A=
03FC0003F80001FE0003F80001FE0003F80000FF0003F80000FF0003F80000FF8003F8000=
0FF80=0A=
03F80000FF8003F80000FF8003F80000FF8003F80000FF8003F80000FF0003F80001FF000=
3F800=0A=
03FE0003F80007FC0003F8001FF800FFFFFFFFF000FFFFFFFFC000FFFFFFFE000029297DA=
831>=0A=
I<00003FF001800003FFFE0380000FFFFF8780003FF007DF8000FF8001FF8001FE00007F8=
003FC=0A=
00003F8007F000001F800FF000000F801FE0000007801FE0000007803FC0000007803FC00=
00003=0A=
807FC0000003807F80000003807F8000000000FF8000000000FF8000000000FF800000000=
0FF80=0A=
00000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000007F800=
00000=0A=
007F80000000007FC0000003803FC0000003803FC0000003801FE0000003801FE00000070=
00FF0=0A=
0000070007F000000E0003FC00001E0001FE00003C0000FF8000F800003FF007E000000FF=
FFFC0=0A=
000003FFFF000000003FF8000029297CA832>I<FFFFFFF80000FFFFFFFF8000FFFFFFFFE0=
0003=0A=
FC001FF80003FC0007FC0003FC0001FE0003FC0000FF0003FC00007F8003FC00003FC003F=
C0000=0A=
1FC003FC00001FE003FC00001FE003FC00000FF003FC00000FF003FC00000FF003FC00000=
FF003=0A=
FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803F=
C0000=0A=
0FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF003FC00000FF003FC00000=
FF003=0A=
FC00001FE003FC00001FE003FC00001FC003FC00003FC003FC00007F8003FC00007F0003F=
C0001=0A=
FE0003FC0003FC0003FC001FF800FFFFFFFFE000FFFFFFFF8000FFFFFFFC00002D297DA83=
5>I<=0A=
FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F003F=
C0000=0A=
F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C0380=
3FC03=0A=
C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00=
003FC=0A=
03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC000=
01C03=0A=
FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFF=
FFFF0=0A=
FFFFFFFFF0FFFFFFFFF027297DA82D>I<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003FC0=
03FC=0A=
000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003FC000=
0F003=0A=
FC03807003FC03807003FC03807003FC03800003FC07800003FC07800003FC1F800003FFF=
F8000=0A=
03FFFF800003FFFF800003FC1F800003FC07800003FC07800003FC03800003FC03800003F=
C0380=0A=
0003FC03800003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000000=
3FC00=0A=
000003FC00000003FC000000FFFFFC0000FFFFFC0000FFFFFC000024297DA82B>I<FFFFF0=
1FFF=0A=
FEFFFFF01FFFFEFFFFF01FFFFE03FC00007F8003FC00007F8003FC00007F8003FC00007F8=
003FC=0A=
00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC0=
0007F=0A=
8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FFFFFFFF8003FFFFFFFF8=
003FF=0A=
FFFFFF8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC0=
0007F=0A=
8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8=
003FC=0A=
00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80FFFFF01FFFFEFFFFF=
01FFF=0A=
FEFFFFF01FFFFE2F297DA836>72 =
D<FFFFFCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE00=0A=
01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE000=
1FE00=0A=
01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE000=
1FE00=0A=
01FE0001FE0001FE0001FE00FFFFFCFFFFFCFFFFFC16297EA81A>I<FFFFFC0000FFFFFC00=
00FF=0A=
FFFC000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0=
00000=0A=
03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003F=
C0000=0A=
0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0001C00=
3FC00=0A=
01C003FC0001C003FC0001C003FC0003C003FC00038003FC00038003FC00078003FC00078=
003FC=0A=
000F8003FC000F8003FC001F8003FC007F8003FC01FF00FFFFFFFF00FFFFFFFF00FFFFFFF=
F0022=0A=
297DA829>76 =
D<FFFE0000001FFFC0FFFE0000001FFFC0FFFF0000003FFFC003FF0000003FF000=0A=
03FF0000003FF00003BF80000077F00003BF80000077F000039FC00000E7F000039FC0000=
0E7F0=0A=
00038FE00001C7F000038FE00001C7F0000387F0000387F0000387F0000387F0000387F00=
00387=0A=
F0000383F8000707F0000383F8000707F0000381FC000E07F0000381FC000E07F0000380F=
E001C=0A=
07F0000380FE001C07F0000380FF003807F00003807F003807F00003807F003807F000038=
03F80=0A=
7007F00003803F807007F00003801FC0E007F00003801FC0E007F00003800FE1C007F0000=
3800F=0A=
E1C007F00003800FE1C007F000038007F38007F000038007F38007F000038003FF0007F00=
00380=0A=
03FF0007F000038001FE0007F000038001FE0007F000038000FC0007F000038000FC0007F=
000FF=0A=
FE00FC01FFFFC0FFFE007801FFFFC0FFFE007801FFFFC03A297DA841>I<FFFC0000FFFEFF=
FE00=0A=
00FFFEFFFF0000FFFE03FF8000038003FF8000038003BFC0000380039FE0000380039FF00=
00380=0A=
038FF80003800387F80003800383FC0003800381FE0003800381FF0003800380FF8003800=
3807F=0A=
C0038003803FC0038003801FE0038003800FF0038003800FF80380038007FC0380038003F=
C0380=0A=
038001FE0380038000FF0380038000FF83800380007FC3800380003FE3800380001FE3800=
38000=0A=
0FF38003800007FB8003800007FF8003800003FF8003800001FF8003800000FF800380000=
07F80=0A=
038000007F80038000003F80038000001F80038000000F80FFFE00000780FFFE00000380F=
FFE00=0A=
0003802F297DA836>I<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC00=
07F0=0A=
0003F80003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F8=
03FC0=0A=
00007F807FC000007FC07F8000003FC07F8000003FC07F8000003FC0FF8000003FE0FF800=
0003F=0A=
E0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE=
0FF80=0A=
00003FE0FF8000003FE07F8000003FC07FC000007FC07FC000007FC03FC000007F803FC00=
0007F=0A=
801FE00000FF001FE00000FF000FF00001FE0007F00001FC0003F80003F80001FC0007F00=
000FF=0A=
001FE000003FC07F8000000FFFFE00000000FFE000002B297CA834>I<FFFFFFF800FFFFFF=
FF00=0A=
FFFFFFFFC003FC003FE003FC000FF003FC0007F803FC0007FC03FC0003FC03FC0003FE03F=
C0003=0A=
FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FC03FC0007FC0=
3FC00=0A=
07F803FC000FF003FC003FE003FFFFFF8003FFFFFE0003FC00000003FC00000003FC00000=
003FC=0A=
00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000=
00003=0A=
FC00000003FC00000003FC00000003FC00000003FC000000FFFFF00000FFFFF00000FFFFF=
00000=0A=
27297DA82F>I<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC0007F000=
03F8=0A=
0003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F803FC00=
0007F=0A=
807FC000007FC07FC000007FC07F8000003FC07F8000003FC0FF8000003FE0FF8000003FE=
0FF80=0A=
00003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF800=
0003F=0A=
E0FF8000003FE07F8000003FC07F8000003FC07FC000007FC03FC000007F803FC000007F8=
01FE0=0A=
0000FF001FE01F00FF000FF03F81FE0007F060C1FC0003F8C063F80001FCC077F00000FFC=
07FE0=0A=
00003FE07F8000000FFFFE00000000FFFE00600000003E00600000003F00600000001F81E=
00000=0A=
001FFFE00000001FFFC00000000FFFC00000000FFFC000000007FF8000000007FF8000000=
003FF=0A=
0000000001FE000000000078002B357CA834>I<007F806003FFF0E007FFF9E00F807FE01F=
001F=0A=
E03E0007E07C0003E07C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF00000=
0FFC0=0A=
00007FFE00007FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007F=
FF000=0A=
007FF000000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00=
001F0=0A=
F80003F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>83=0A=
D<7FFFFFFFFFC07FFFFFFFFFC07FFFFFFFFFC07F803FC03FC07E003FC007C078003FC003C=
07800=0A=
3FC003C070003FC001C0F0003FC001E0F0003FC001E0E0003FC000E0E0003FC000E0E0003=
FC000=0A=
E0E0003FC000E0E0003FC000E000003FC0000000003FC0000000003FC0000000003FC0000=
00000=0A=
3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003=
FC000=0A=
0000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000=
00000=0A=
3FC0000000003FC0000000003FC0000000003FC0000000003FC00000007FFFFFE000007FF=
FFFE0=0A=
00007FFFFFE0002B287EA730>I<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FC000007=
0003=0A=
FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003F=
C0000=0A=
070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000=
70003=0A=
FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003F=
C0000=0A=
070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000=
70003=0A=
FC0000070001FC00000E0001FE00000E0000FE00001C00007E00001C00007F00003800003=
FC000=0A=
F000000FF007E0000007FFFFC0000001FFFF000000001FF800002E297DA835>I<FFFFE07F=
FFF0=0A=
07FFF0FFFFE07FFFF007FFF0FFFFE07FFFF007FFF003FC0001FE00001C0003FC0001FE000=
01C00=0A=
01FE0001FF0000380001FE0000FF0000380001FF0000FF0000780000FF0000FF800070000=
0FF00=0A=
00FF8000700000FF8000FF8000F000007F8001FFC000E000007F8001FFC000E000003FC00=
3FFE0=0A=
01C000003FC0039FE001C000003FE0039FE003C000001FE0070FF0038000001FE0070FF00=
38000=0A=
001FF00F0FF0078000000FF00E07F8070000000FF00E07F80700000007F81E07FC0E00000=
007F8=0A=
1C03FC0E00000007FC1C03FC1E00000003FC3801FE1C00000003FC3801FE1C00000001FE7=
801FF=0A=
3800000001FE7000FF3800000001FE7000FF3800000000FFF000FFF000000000FFE0007FF=
00000=0A=
0000FFE0007FF0000000007FC0003FE0000000007FC0003FE0000000003FC0003FC000000=
0003F=0A=
80001FC0000000003F80001FC0000000001F80001F80000000001F00000F80000000001F0=
0000F=0A=
80000000000E00000700000044297FA847>87 =
D<FFFFF0003FFF80FFFFF0003FFF80FFFFF0003F=0A=
FF8003FF000001E00001FF000003C00000FF8000038000007FC000078000007FE0000F000=
0003F=0A=
E0000E0000001FF0001E0000001FF8003C0000000FF8003800000007FC007800000007FE0=
0F000=0A=
000003FE00E000000001FF01E000000001FF83C000000000FF8380000000007FC78000000=
0007F=0A=
EF00000000003FEE00000000001FFE00000000000FFC00000000000FF8000000000007F80=
00000=0A=
000007F8000000000007F8000000000007F8000000000007F8000000000007F8000000000=
007F8=0A=
000000000007F8000000000007F8000000000007F8000000000007F8000000000007F8000=
00000=0A=
0007F8000000000007F80000000001FFFFE000000001FFFFE000000001FFFFE0000031297=
FA834=0A=
>89 =
D<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F8=
0=0A=
00003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80F=
E003F=0A=
80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9=
A21>=0A=
97 =
D<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE00000000FE00000000=
F=0A=
E00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00=
00000=0A=
0FE1FE00000FE7FF80000FFE07E0000FF801F0000FF000F8000FE000FC000FE000FE000FE=
0007F=0A=
000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800=
FE000=0A=
7F800FE0007F800FE0007F000FE0007F000FE0007F000FE000FE000FE000FC000FF001F80=
00FF8=0A=
03F0000F9E07E0000F07FF80000E01FC0000212A7EA926>I<001FF80000FFFE0003F01F00=
07E0=0A=
3F800FC03F801F803F803F801F007F800E007F0000007F000000FF000000FF000000FF000=
000FF=0A=
000000FF000000FF000000FF0000007F0000007F0000007F8000003F8001C01F8001C00FC=
00380=0A=
07E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF80000003FF80000003FF8=
0000=0A=
0003F800000003F800000003F800000003F800000003F800000003F800000003F80000000=
3F800=0A=
000003F800000003F800000003F800000003F800001FE3F80000FFFBF80003F03FF80007E=
00FF8=0A=
000FC007F8001F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF0003F800F=
F0003=0A=
F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F80=
07F00=0A=
03F8003F8003F8001F8003F8000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3F=
F8021=0A=
2A7EA926>I<003FE00001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000F=
C07F=0A=
0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F0=
00000=0A=
7F0000007F0000003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001=
B1B7E=0A=
9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F000=
07F0=0A=
0007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00=
007F0=0A=
0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00=
007F0=0A=
0007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7F80FC1FE7C1F80FC7C1F=
007C=0A=
383F007E107F007F007F007F007F007F007F007F007F007F007F007F003F007E001F007C0=
01F80=0A=
FC000FC1F8001FFFE00018FF800038000000380000003C0000003E0000003FFFF8001FFFF=
F001F=0A=
FFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80=
000F8=0A=
7C0001F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E9A22>I<FFE0000000FF=
E000=0A=
0000FFE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000=
00FE0=0A=
0000000FE00000000FE00000000FE00000000FE00000000FE00000000FE07F00000FE1FFC=
0000F=0A=
E787E0000FEE03F0000FF803F0000FF803F8000FF003F8000FF003F8000FE003F8000FE00=
3F800=0A=
0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE=
003F8=0A=
000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800FFFE3FFF80F=
FFE3F=0A=
FF80FFFE3FFF80212A7DA926>I<07000F801FC03FE03FE03FE01FC00F8007000000000000=
0000=0A=
00000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE=
00FE0=0A=
0FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I<FFE00000FFE00000=
FFE0=0A=
00000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00=
0000F=0A=
E000000FE000000FE000000FE01FFC0FE01FFC0FE01FFC0FE007800FE00F000FE01E000FE=
03C00=0A=
0FE078000FE0E0000FE3C0000FE7C0000FEFE0000FFFE0000FFFF0000FF3F8000FE3F8000=
FC1FC=0A=
000FC0FE000FC07F000FC07F000FC03F800FC01FC00FC00FC00FC00FE0FFFC3FFEFFFC3FF=
EFFFC=0A=
3FFE1F2A7EA924>107 =
D<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0=0A=
0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00=
FE00F=0A=
E00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7DA914>I<FFC07F800FF000FFC1FFE03FFC=
00FF=0A=
C383F0707E000FC603F8C07F000FCC01F9803F000FD801FF003F800FF001FE003F800FF00=
1FE00=0A=
3F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F8=
00FE0=0A=
01FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001F=
C003F=0A=
800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80F=
FFE1F=0A=
FFC3FFF8FFFE1FFFC3FFF8FFFE1FFFC3FFF8351B7D9A3A>I<FFC07F0000FFC1FFC000FFC7=
87E0=0A=
000FCE03F0000FD803F0000FD803F8000FF003F8000FF003F8000FE003F8000FE003F8000=
FE003=0A=
F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F80=
00FE0=0A=
03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800FFFE3FFF80FFFE3FF=
F80FF=0A=
FE3FFF80211B7D9A26>I<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F00=
07E0=0A=
7F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8F=
F0007=0A=
F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC0=
0003F=0A=
E0001D1B7E9A22>I<FFE1FE0000FFE7FF8000FFFE07E0000FF803F0000FF001F8000FE000=
FC00=0A=
0FE000FE000FE000FF000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800FE=
0007F=0A=
800FE0007F800FE0007F800FE0007F800FE0007F000FE000FF000FE000FF000FE000FE000=
FE001=0A=
FC000FF001F8000FF803F0000FFE0FE0000FE7FF80000FE1FC00000FE00000000FE000000=
00FE0=0A=
0000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000000FFFE000=
000FF=0A=
FE000000FFFE00000021277E9A26>I<001FC0380000FFF0780003F838F80007E00DF8000F=
C007=0A=
F8001FC007F8003F8003F8007F8003F8007F8003F8007F0003F800FF0003F800FF0003F80=
0FF00=0A=
03F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F8003F=
8003F=0A=
8003F8001F8007F8000FC007F80007E01FF80003F07BF80000FFF3F800003FC3F80000000=
3F800=0A=
000003F800000003F800000003F800000003F800000003F800000003F800000003F800000=
003F8=0A=
0000003FFF8000003FFF8000003FFF8021277E9A24>I<FFC1F0FFC7FCFFCE3E0FD87F0FD8=
7F0F=0A=
F07F0FF03E0FF01C0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE=
0000F=0A=
E0000FE0000FE0000FE0000FE0000FE000FFFF00FFFF00FFFF00181B7E9A1C>I<03FE300F=
FFF0=0A=
1E03F03800F0700070F00070F00070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF00=
7FFF8=0A=
00FFF80003FC0000FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF001=
61B7E=0A=
9A1B>I<00700000700000700000700000F00000F00000F00001F00003F00003F00007F000=
1FFF=0A=
F0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00=
007F0=0A=
0007F00007F00007F03807F03807F03807F03807F03807F03803F03803F87001F86000FFC=
0001F=0A=
8015267FA51B>I<FFE03FF800FFE03FF800FFE03FF8000FE003F8000FE003F8000FE003F8=
000F=0A=
E003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE00=
3F800=0A=
0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE=
007F8=0A=
0007E007F80007E00FF80003F03BFF8001FFF3FF80003FC3FF80211B7D9A26>I<FFFE03FF=
80FF=0A=
FE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E00003FC01E00001FC0=
1C000=0A=
01FC01C00000FE03800000FE038000007F070000007F070000007F8F0000003F8E0000003=
FDE00=0A=
00001FDC0000001FDC0000000FF80000000FF80000000FF800000007F000000007F000000=
003E0=0A=
00000003E000000001C00000211B7F9A24>I<FFFE7FFC0FFEFFFE7FFC0FFEFFFE7FFC0FFE=
0FE0=0A=
07E000E007F003F001C007F003F001C007F807F803C003F807F8038003F807F8038001FC0=
EFC07=0A=
0001FC0EFC070001FE1EFC0F0000FE1C7E0E0000FE1C7E0E0000FF383F1E00007F383F1C0=
0007F=0A=
783F3C00003FF01FB800003FF01FB800003FF01FF800001FE00FF000001FE00FF000000FC=
007E0=0A=
00000FC007E000000FC007E00000078003C00000078003C0002F1B7F9A32>I<FFFC0FFF00=
FFFC=0A=
0FFF00FFFC0FFF0007F003C00003F807800001FC07800000FE0F000000FF1E0000007F3C0=
00000=0A=
3FF80000001FF00000000FF00000000FF000000007F000000007F80000000FFC0000001FF=
E0000=0A=
001EFE0000003C7F000000783F800000F01FC00001E01FE00001C00FE00003C007F000FFF=
01FFF=0A=
80FFF01FFF80FFF01FFF80211B7F9A24>I<FFFE03FF80FFFE03FF80FFFE03FF8007F00070=
0007=0A=
F000700007F800F00003F800E00003FC01E00001FC01C00001FC01C00000FE03800000FE0=
38000=0A=
007F070000007F070000007F8F0000003F8E0000003FDE0000001FDC0000001FDC0000000=
FF800=0A=
00000FF80000000FF800000007F000000007F000000003E000000003E000000001C000000=
001C0=0A=
00000003800000000380000038078000007C07000000FE0F000000FE0E000000FE1E00000=
0FE3C=0A=
0000007C780000003FE00000000FC000000021277F9A24>I<3FFFFF803FFFFF803F007F00=
3C00=0A=
FE003801FE007803FC007803F8007007F800700FF000700FE000001FC000003FC000007F8=
00000=0A=
7F000000FF000001FE038001FC038003F8038007F803800FF007800FE007801FE007003FC=
00F00=0A=
3F801F007F007F00FFFFFF00FFFFFF00191B7E9A1F>I E /Fu 1 59 =
df<1C003E007F00FF80FF=0A=
80FF807F003E001C000909798818>58 D E /Fv 19 121 =
df<0001FF8000000FFFF000003FFFFC=0A=
0000FF81FF0001FE007F8003FC003FC007F8001FE00FF8001FF00FF0000FF01FF0000FF81=
FF000=0A=
0FF83FF0000FFC3FE00007FC3FE00007FC7FE00007FE7FE00007FE7FE00007FE7FE00007F=
E7FE0=0A=
0007FEFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE0000=
7FFFF=0A=
E00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00=
007FF=0A=
FFE00007FFFFE00007FFFFE00007FFFFE00007FF7FE00007FE7FE00007FE7FE00007FE7FE=
00007=0A=
FE7FE00007FE3FE00007FC3FF0000FFC3FF0000FFC1FF0000FF81FF0000FF80FF0000FF00=
FF800=0A=
1FF007F8001FE003FC003FC001FE007F8000FF81FF00003FFFFC00000FFFF0000001FF800=
02839=0A=
7CB731>48 =
D<00001E000000003E00000000FE00000003FE0000003FFE0000FFFFFE0000FFFFFE=0A=
0000FFFFFE0000FFCFFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000=
0000F=0A=
FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0=
00000=0A=
0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF=
E0000=0A=
000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000=
FFE00=0A=
00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000=
00FFE=0A=
0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00007FFFFFFFC=
07FFF=0A=
FFFFC07FFFFFFFC07FFFFFFFC0223879B731>I<0007FE0000007FFFE00001FFFFF80003FF=
FFFE=0A=
0007F01FFF000F8007FF801F0001FFC03E0000FFE07F8000FFF07FC0007FF0FFE0007FF8F=
FF000=0A=
3FF8FFF0003FFCFFF0003FFCFFF0003FFCFFF0003FFC7FE0003FFC3FC0003FFC1F80003FF=
C0000=0A=
003FFC0000003FF80000007FF80000007FF00000007FF0000000FFE0000000FFC0000001F=
F8000=0A=
0001FF00000003FE00000007FC00000007F80000000FF00000001FC00000003F800000007=
F0000=0A=
0000FC00000001F800000001F0003C0003E0003C0007C0003C000F000078001E000078003=
C0000=0A=
7800780000F800F00000F801FFFFFFF803FFFFFFF007FFFFFFF00FFFFFFFF01FFFFFFFF03=
FFFFF=0A=
FFF07FFFFFFFF0FFFFFFFFF0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE026387BB731>I<0003FF=
8000=0A=
001FFFF000007FFFFE0000FE03FF0001F000FF8003C000FFC00780007FE00FF0007FF00FF=
8007F=0A=
F01FFC007FF81FFE007FF81FFE007FF81FFE007FF81FFE007FF81FFE007FF80FFC007FF00=
7F800=0A=
7FF003F0007FF0000000FFE0000000FFC0000001FF80000001FF00000003FE00000007FC0=
00000=0A=
1FF000000FFFC000000FFF8000000FFFF800000003FE00000000FF800000007FE00000003=
FF000=0A=
00003FF80000003FFC0000001FFC0000001FFE0000001FFE0200001FFF1FC0001FFF3FE00=
01FFF=0A=
7FF0001FFF7FF0001FFFFFF8001FFFFFF8001FFFFFF8001FFEFFF8001FFEFFF0001FFE7FF=
0003F=0A=
FC7FE0003FFC3FC0003FF81F80007FF01FE000FFE007FC03FFC003FFFFFF0001FFFFFE000=
03FFF=0A=
F0000007FF800028397CB731>I<00000007C0000000000FC0000000000FC0000000001FC0=
0000=0A=
00003FC0000000007FC000000000FFC000000000FFC000000001FFC000000003FFC000000=
007FF=0A=
C00000000FFFC00000000FFFC00000001EFFC00000003CFFC00000007CFFC0000000F8FFC=
00000=0A=
00F0FFC0000001E0FFC0000003C0FFC0000007C0FFC000000F80FFC000000F00FFC000001=
E00FF=0A=
C000003C00FFC000007C00FFC00000F800FFC00000F000FFC00001E000FFC00003C000FFC=
00007=0A=
C000FFC0000F8000FFC0000F0000FFC0001E0000FFC0003C0000FFC0007C0000FFC000F80=
000FF=0A=
C000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0000001FFC000000001FFC=
00000=0A=
0001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000=
001FF=0A=
C000000001FFC0000007FFFFFFC00007FFFFFFC00007FFFFFFC00007FFFFFFC02A377DB63=
1>I<=0A=
04000000C00F800007C00FF8007FC00FFFFFFF800FFFFFFF000FFFFFFE000FFFFFFC000FF=
FFFF8=0A=
000FFFFFF0000FFFFFE0000FFFFF80000FFFFE00000FFFF800000F800000000F800000000=
F8000=0A=
00000F800000000F800000000F800000000F800000000F800000000F81FF00000F8FFFE00=
00FBF=0A=
FFF8000FFE03FE000FF000FF000FC000FF800F80007FC00F00007FE00700007FF00000003=
FF000=0A=
00003FF80000003FF80000003FF80000003FFC0000003FFC0600003FFC1F80003FFC3FC00=
03FFC=0A=
7FE0003FFCFFE0003FFCFFF0003FFCFFF0003FFCFFF0003FF8FFE0003FF8FFE0003FF87FC=
0007F=0A=
F07F00007FF03C00007FE03E0000FFC01F0000FF800FC003FF0007F00FFE0003FFFFFC000=
1FFFF=0A=
F000007FFFC000000FFC000026397BB731>I<00000001F80000000000000001F800000000=
0000=0A=
0003FC0000000000000003FC0000000000000007FE0000000000000007FE0000000000000=
007FE=0A=
000000000000000FFF000000000000000FFF000000000000001FFF800000000000001FFF8=
00000=0A=
000000001FFF800000000000003FFFC00000000000003FFFC00000000000007FFFE000000=
00000=0A=
007DFFE00000000000007DFFE0000000000000FDFFF0000000000000F8FFF000000000000=
1F8FF=0A=
F8000000000001F07FF8000000000001F07FF8000000000003F07FFC000000000003E03FF=
C0000=0A=
00000007E03FFE000000000007C01FFE00000000000FC01FFF00000000000F801FFF00000=
00000=0A=
0F800FFF00000000001F800FFF80000000001F0007FF80000000003F0007FFC0000000003=
E0003=0A=
FFC0000000003E0003FFC0000000007E0003FFE0000000007C0001FFE000000000FC0001F=
FF000=0A=
000000F80000FFF000000000F80000FFF000000001FFFFFFFFF800000001FFFFFFFFF8000=
00003=0A=
FFFFFFFFFC00000003FFFFFFFFFC00000003E000003FFC00000007E000003FFE00000007C=
00000=0A=
1FFE0000000FC000001FFF0000000F8000000FFF0000001F8000000FFF8000001F0000000=
FFF80=0A=
00001F00000007FF8000003F00000007FFC000003E00000003FFC000007E00000003FFE00=
000FF=0A=
00000001FFE000FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFF=
C0001=0A=
FFFFFFF0443B7DBA4B>65 =
D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000FFFFFF=0A=
FFFFFFC000007FF00001FFF000007FF000007FF800007FF000003FFC00007FF000001FFE0=
0007F=0A=
F000001FFE00007FF000000FFF00007FF000000FFF00007FF0000007FF80007FF0000007F=
F8000=0A=
7FF0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF80007FF000000=
7FF80=0A=
007FF0000007FF00007FF000000FFF00007FF000000FFF00007FF000001FFE00007FF0000=
01FFC=0A=
00007FF000003FF800007FF000007FF000007FF00001FFE000007FF0000FFF8000007FFFF=
FFFFE=0A=
0000007FFFFFFFFE0000007FFFFFFFFFC000007FF000007FF000007FF000001FFC00007FF=
00000=0A=
0FFE00007FF0000007FF00007FF0000007FF80007FF0000003FFC0007FF0000003FFC0007=
FF000=0A=
0001FFE0007FF0000001FFE0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF00=
07FF0=0A=
000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF=
0007F=0A=
F0000001FFE0007FF0000003FFE0007FF0000003FFC0007FF0000007FFC0007FF000000FF=
F8000=0A=
7FF000001FFF00007FF000003FFE00007FF00001FFFC00FFFFFFFFFFFFF800FFFFFFFFFFF=
FE000=0A=
FFFFFFFFFFFF8000FFFFFFFFFFF800003C3B7CBA46>I<0000001FFF000030000001FFFFE0=
00F0=0A=
00000FFFFFFC01F000007FFFFFFE03F00001FFFE007F87F00003FFE0000FCFF0000FFF000=
003FF=0A=
F0001FFC000001FFF0003FF80000007FF0007FF00000003FF000FFC00000003FF001FFC00=
00000=0A=
1FF003FF800000000FF007FF000000000FF00FFF0000000007F00FFE0000000007F01FFE0=
00000=0A=
0003F01FFE0000000003F03FFC0000000003F03FFC0000000001F03FFC0000000001F07FF=
C0000=0A=
000001F07FF80000000001F07FF80000000000007FF8000000000000FFF8000000000000F=
FF800=0A=
0000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000000=
0FFF8=0A=
000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000=
0007F=0A=
F80000000000007FF80000000000007FF80000000000007FFC0000000000F03FFC0000000=
000F0=0A=
3FFC0000000000F03FFC0000000000F01FFE0000000000F01FFE0000000001E00FFE00000=
00001=0A=
E00FFF0000000001E007FF0000000003C003FF8000000003C001FFC0000000078000FFE00=
00000=0A=
0F00007FF00000001F00003FF80000003E00001FFC0000007C00000FFF000001F8000003F=
FE000=0A=
07F0000001FFFE003FC00000007FFFFFFF000000000FFFFFFC0000000001FFFFF00000000=
0001F=0A=
FF0000003C3D7BBB47>I<001FFF00000001FFFFF0000003FFFFFC000007F007FE00000FF8=
01FF=0A=
00001FFC00FF80001FFC007FC0001FFC007FE0001FFC003FE0000FF8003FF0000FF8003FF=
00007=0A=
F0003FF00001C0003FF0000000003FF0000000003FF0000000003FF0000000FFFFF000000=
FFFFF=0A=
F000007FF83FF00001FF803FF00007FE003FF0000FF8003FF0001FF0003FF0003FE0003FF=
0007F=0A=
E0003FF0007FE0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC=
0007F=0A=
F0007FE0007FF0007FE000DFF0003FF0039FF8001FFC0F0FFFF007FFFE0FFFF001FFFC07F=
FF000=0A=
3FE000FFF02C267DA530>97 =
D<000000003FC00000003FFFC00000003FFFC00000003FFFC00000=0A=
003FFFC000000001FFC000000000FFC000000000FFC000000000FFC000000000FFC000000=
000FF=0A=
C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC=
00000=0A=
0000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000FFC0FFC0000FF=
FF8FF=0A=
C0003FFFFEFFC000FFE03FFFC001FF000FFFC003FE0003FFC007FC0001FFC00FF80000FFC=
01FF0=0A=
0000FFC01FF00000FFC03FF00000FFC03FE00000FFC07FE00000FFC07FE00000FFC07FE00=
000FF=0A=
C0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC=
0FFE0=0A=
0000FFC0FFE00000FFC0FFE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC03FF00=
000FF=0A=
C03FF00000FFC01FF00000FFC00FF80001FFC007F80003FFC003FC0007FFC001FE000FFFE=
000FF=0A=
C07EFFFF003FFFFCFFFF000FFFF0FFFF0001FF80FFFF303C7DBB37>100=0A=
D<0001FFC000000FFFF800003FFFFE0000FF80FF0001FE003F8007FC001FC00FF8000FE00=
FF800=0A=
0FF01FF00007F03FF00007F83FF00007F87FE00007F87FE00003FC7FE00003FC7FE00003F=
CFFE0=0A=
0003FCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFE0000000FFE0000000FFE0000000FFE0000=
0007F=0A=
E00000007FE00000007FE00000003FE00000003FF000003C1FF000003C1FF000003C0FF80=
00078=0A=
07FC0000F803FE0001F001FF0007E000FFC03FC0003FFFFF000007FFFC000000FFE000262=
67DA5=0A=
2D>I<00FF00000000FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF0000=
0000=0A=
03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF000000000=
3FF00=0A=
00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF000=
00000=0A=
03FF0000000003FF0000000003FF0000000003FF007FC00003FF01FFF80003FF07FFFC000=
3FF0F=0A=
03FE0003FF1C01FF0003FF3001FF8003FF6000FF8003FFE000FFC003FFC000FFC003FF800=
0FFC0=0A=
03FF8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC00=
3FF00=0A=
00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF000=
0FFC0=0A=
03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC00=
3FF00=0A=
00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3=
FFFFF=0A=
FFFFFC3FFFFFFFFFFC3FFFFF303C7CBB37>104 =
D<01F00007FC000FFE000FFE001FFF001FFF00=0A=
1FFF001FFF001FFF000FFE000FFE0007FC0001F0000000000000000000000000000000000=
00000=0A=
00000000000000000000000000FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF000=
3FF00=0A=
03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF000=
3FF00=0A=
03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00F=
FFFF8=0A=
FFFFF8FFFFF8FFFFF8153D7DBC1B>I<00FE007FC000FFFE01FFF800FFFE07FFFC00FFFE0F=
03FE=0A=
00FFFE1C01FF0007FE3001FF8003FE6000FF8003FEE000FFC003FEC000FFC003FF8000FFC=
003FF=0A=
8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0=
000FF=0A=
C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC=
003FF=0A=
0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0=
000FF=0A=
C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFF=
FFFFF=0A=
FC3FFFFFFFFFFC3FFFFF30267CA537>110 =
D<00FF01FF8000FFFF0FFFF000FFFF3FFFFC00FFFF=0A=
FE03FF00FFFFF000FF8003FFC0007FC003FF80003FE003FF00003FF003FF00001FF803FF0=
0001F=0A=
FC03FF00000FFC03FF00000FFE03FF00000FFE03FF000007FE03FF000007FF03FF000007F=
F03FF=0A=
000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF0=
00007=0A=
FF03FF000007FE03FF000007FE03FF00000FFE03FF00000FFC03FF00000FFC03FF00001FF=
803FF=0A=
00001FF803FF00003FF003FF80003FE003FFC0007FC003FFF001FF8003FFFC07FF0003FF3=
FFFFC=0A=
0003FF0FFFF00003FF01FF000003FF0000000003FF0000000003FF0000000003FF0000000=
003FF=0A=
0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0=
00000=0A=
0003FF0000000003FF00000000FFFFFC000000FFFFFC000000FFFFFC000000FFFFFC00000=
03037=0A=
7DA537>112 =
D<00FE03F000FFFE0FFE00FFFE1FFF00FFFE3C3F80FFFE707FC007FE60FFE003FE=0A=
E0FFE003FEC0FFE003FFC0FFE003FF807FC003FF807FC003FF803F8003FF800E0003FF000=
00003=0A=
FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0=
00000=0A=
03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003F=
F0000=0A=
0003FF00000003FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE0000F=
FFFFE=0A=
000023267DA529>114 =
D<0007800000078000000780000007800000078000000F8000000F8000=0A=
000F8000000F8000001F8000001F8000003F8000003F8000007F800000FF800001FF80000=
7FF80=0A=
001FFFFFF0FFFFFFF0FFFFFFF0FFFFFFF001FF800001FF800001FF800001FF800001FF800=
001FF=0A=
800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF8=
00001=0A=
FF800001FF800001FF800001FF800001FF803C01FF803C01FF803C01FF803C01FF803C01F=
F803C=0A=
01FF803C01FF803C00FF807800FFC078007FC070003FE0E0001FFFC00007FF800001FF001=
E377E=0A=
B626>116 =
D<FFFFF007FFFCFFFFF007FFFCFFFFF007FFFCFFFFF007FFFC01FF8000FC0000FFC0=0A=
00F80000FFE001F000007FF003E000003FF007C000001FF80FC000000FFC1F8000000FFE1=
F0000=0A=
0007FF3E00000003FFFC00000001FFF800000000FFF0000000007FE0000000007FF000000=
0003F=0A=
F8000000001FF8000000001FFC000000003FFE000000007FFF00000000FBFF80000001F9F=
F8000=0A=
0003F0FFC0000003E07FE0000007C07FF000000F803FF800001F001FFC00003E000FFC000=
07C00=0A=
07FE0000FC0003FF0001FC0003FF80FFFF801FFFFEFFFF801FFFFEFFFF801FFFFEFFFF801=
FFFFE=0A=
2F267EA534>120 D E /Fw 35 122 =
df<387C7C7E3A040404080810204080070E789F0D>39=0A=
D<3078F8787005057C840D>46 =
D<0001F808000E061800380138007000F801E0007803C0007007=0A=
800030078000300F0000301F0000301E0000303E0000203C0000007C0000007C0000007C0=
00000=0A=
7C000000F8000000F8000000F8000000F8000000F80000007800004078000080780000803=
C0000=0A=
803C0001001C0002000E00020006000C000300100001C0E000003F00001D217B9F21>67=0A=
D<07FFFF00007C01E0003C00F0003C00780078003C0078003C0078001E0078001E0078001=
E0078=0A=
001F00F0001F00F0001F00F0001F00F0001F00F0001F00F0001F01E0001E01E0003E01E00=
03E01=0A=
E0003E01E0003C01E0007C03C0007803C000F003C000F003C001E003C003C003C00780078=
00F00=0A=
07803C00FFFFE000201F7E9E23>I<07FFFFF8007C0078003C0038003C0018007800180078=
0008=0A=
0078000800780008007800080078080800F0100000F0100000F0100000F0300000FFF0000=
0F070=0A=
0001E0200001E0200001E0200001E0200001E0000801E0001003C0001003C0001003C0002=
003C0=0A=
002003C0006003C000C0078001C0078007C0FFFFFF801D1F7E9E1F>I<07FFE0007C00003C=
0000=0A=
3C0000780000780000780000780000780000780000F00000F00000F00000F00000F00000F=
00001=0A=
E00001E00001E00001E00001E00001E00003C00003C00003C00003C00003C00003C000078=
00007=0A=
C000FFFC00131F7F9E10>73 =
D<07FC01FFC0003E003E00003E001800003E001800004F00100000=0A=
4F001000004780100000478010000043C010000043C010000083C020000081E020000081E=
02000=0A=
0080F020000080F020000080782000010078400001007C400001003C400001003C4000010=
01E40=0A=
0001001E400002000F800002000F800002000F80000200078000020007800006000380000=
60003=0A=
00000F00010000FFE0010000221F7E9E22>78 =
D<0003F800001E0E000038070000E0038001C001=0A=
C003C001E0078000E00F0000F00F0000F01E0000F01E0000F83E0000F83C0000F87C0000F=
87C00=0A=
00F87C0000F87C0000F8F80001F0F80001F0F80001F0F80001F0F80003E0780003E078000=
3C078=0A=
0007C07C0007803C000F003C001E001E001C000E0038000700F00003C3C00000FE00001D2=
17B9F=0A=
23>I<0003F800001E0E000038070000F0038001E001C003C001E0078001E00F0000F00F00=
00F0=0A=
1F0000F01E0000F83E0000F83C0000F87C0000F87C0000F87C0000F87C0000F8F80001F0F=
80001=0A=
F0F80001F0F80001F0F80003E0780003E0780003C0780007C0781E07803C210F003C409E0=
01E40=0A=
9C000E80B8000740F00003C1C04000FEC0400000C0400000C0800000E1800000FF800000F=
F0000=0A=
00FF0000007E0000003C001D297B9F23>81 =
D<003F040060CC01803C03801C03001C0700180600=0A=
080E00080E00080E00080E00000F00000F80000FE00007FE0003FF8001FFC0007FE00007E=
00001=0A=
E00000E00000F00000F04000E04000E04000E04000E06000C0600180E00380F80300C60C0=
081F8=0A=
0016217D9F19>83 =
D<3FFFFFF03C0780F03007803060078030400F0010400F0010C00F0010800F=0A=
0010800F0010800F0010001E0000001E0000001E0000001E0000001E0000001E0000003C0=
00000=0A=
3C0000003C0000003C0000003C0000003C000000780000007800000078000000780000007=
80000=0A=
0078000000F0000000F800007FFFE0001C1F7A9E21>I<FFF003FE1F8000F80F0000600F00=
0040=0A=
0F0000400F8000800780018007800100078002000780020007C0040003C0040003C008000=
3C008=0A=
0003C0100003E0100001E0200001E0200001E0400001E0400001F0800000F1800000F1000=
000F2=0A=
000000F2000000FC0000007C000000780000007800000070000000700000002000001F207=
A9E22=0A=
>86 =
D<03FFC0FFC0007F007E00003E003800001E003000001E002000001F004000000F0080000=
0=0A=
0F81000000078200000007C600000003C400000003E800000001F000000001F000000000F=
00000=0A=
0000F800000000F8000000017C000000023C000000043C0000000C1E000000081E0000001=
01F00=0A=
0000200F000000400F800000C0078000008007C000010003C000070003E0001F8007E000F=
FE01F=0A=
FE00221F7F9E22>88 =
D<07F8000C0C001E06001E07001C0700000700000700000700007F0007C7=0A=
001E07003C0E00780E00F00E10F00E10F00E10F01E10F02E20784F401F878014147D9317>=
97=0A=
D<0700003F00000F00000700000700000E00000E00000E00000E00000E00000E00001C000=
01C7C=0A=
001D87001E03801C01C01C01C03801C03801E03801E03801E03801E03801E07003C07003C=
07003=0A=
80700780700700700E00E81C00C4380083E00013207B9F19>I<01FC07060E0F1C0F380E78=
0070=0A=
00F000F000F000F000E000E000E000E000F0027004300818300FC010147C9314>I<000070=
0003=0A=
F00000F00000700000700000E00000E00000E00000E00000E00000E00001C000F9C00305C=
00E03=0A=
C01C03C03801C0780380700380F00380F00380F00380F00380E00700E00700E00700E0070=
0E007=0A=
00700F00301E00186F000F8FE014207C9F19>I<00F800070E000E07001C07003803807803=
8070=0A=
0380F00380F00380FFFF80F00000E00000E00000E00000E00000F001007002003004001C1=
80007=0A=
E00011147D9314>I<0007800018C00031E00061E000E1C000C00001C00001C00001C00001=
C000=0A=
01C0000380007FF8000380000380000380000380000700000700000700000700000700000=
70000=0A=
0E00000E00000E00000E00000E00000E00001C00001E0000FFC00013207E9F0E>I<00000E=
003E=0A=
1100E1A301C1C20381E00780E00701E00F01E00F01E00F01E00703C007038007870004FC0=
00800=0A=
000800001800001C00000FFF000FFFC007FFE01800F0300030600030C00030C00030C0003=
06000=0A=
603000C01C070007FC00181F809417>I<00E00007E00001E00000E00000E00001C00001C0=
0001=0A=
C00001C00001C00001C000038000038F800390E003A0E003C0600380600780E00700E0070=
0E007=0A=
00E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FFCFF8152=
07E9F=0A=
19>I<01C003E003E003C0018000000000000000000000000003801F800780038003800700=
0700=0A=
07000700070007000E000E000E000E000E000E001C001E00FF800B1F7F9E0C>I<00E007E0=
01E0=0A=
00E000E001C001C001C001C001C001C003800380038003800380038007000700070007000=
70007=0A=
000E000E000E000E000E000E001C001E00FFC00B207F9F0C>108 =
D<0387C07C001F9861860007=0A=
A072070003C03403000380380300078078070007007007000700700700070070070007007=
00700=0A=
07007007000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E001C0=
1C01C=0A=
001E01E01E00FFCFFCFFC022147E9326>I<038F801F90E007A0E003C0600380600780E007=
00E0=0A=
0700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0F=
FCFF8=0A=
15147E9319>I<00FC000387000E01801C00C03800E03800E07000F0F000F0F000F0F000F0=
F000=0A=
F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007E00014147D9317>I<00E3=
E007=0A=
EC3800F01C00E01E00E00E01C00E01C00F01C00F01C00F01C00F01C00F03801E03801E038=
01C03=0A=
803C0380380380700740E00721C0071F000700000700000700000E00000E00000E00000E0=
0001E=0A=
0000FFC000181D809319>I<038E001FB38007C78003C78003830007800007000007000007=
0000=0A=
0700000700000E00000E00000E00000E00000E00000E00001C00001E0000FFC00011147E9=
312>=0A=
114 =
D<01F2060E080618061802380438001E001FE00FF003F8003C401C400C400C600C6018E01=
0=0A=
D0608FC00F147E9312>I<0080010001000100030007000F001E00FFF80E000E000E000E00=
1C00=0A=
1C001C001C001C001C00380038203820382038203840384018800F000D1C7C9B12>I<1C03=
80FC=0A=
1F803C07801C03801C0380380700380700380700380700380700380700700E00700E00700=
E0070=0A=
0E00701E00701E00703C00305E001F9FC012147B9319>I<FF83F81E00E01C00C01C00800E=
0080=0A=
0E01000E02000E02000F040007040007080007080007100003900003A00003E00003C0000=
38000=0A=
01800001000015147C9318>I<FF9FE1FC3C0780701C0300601C0300401C0380401C038080=
0E07=0A=
80800E0581000E0981000E09C2000E11C2000731C4000721C4000760C8000740C8000780F=
00007=0A=
80F0000300E00003006000020040001E147C9321>I<1FF0FF03C07801C07001C04000E080=
00E1=0A=
80007300007600003C00003C00001C00002E00004E000087000107000203800603800C01C=
03C03=0A=
E0FF07FC18147F9318>I<0FF83F8001E00E0001C00C0001C0080000E0080000E0100000E0=
2000=0A=
00E0200000F040000070400000708000007080000071000000390000003A0000003E00000=
03C00=0A=
000038000000180000001000000010000000200000002000000040000070C00000F080000=
0F100=0A=
0000E20000007C000000191D809318>I E /Fx 38 122 =
df<00000007FF800000000001FFFFF0=0A=
000000000FFFFFFC000000003FFFFFFE00000000FFFC00FF00000001FFC0003F80000007F=
F0000=0A=
7FC000000FFE0001FFC000001FFC0001FFE000001FF80003FFE000003FF00003FFE000003=
FF000=0A=
03FFE000007FE00003FFE000007FE00003FFE000007FE00003FFE000007FE00003FFE0000=
07FE0=0A=
0001FFC000007FE00000FF8000007FE000003E0000007FE00000000000007FE0000000000=
0007F=0A=
E00000000000007FE00000000000007FE00000000000007FE00000000000007FE0003FFFF=
000FF=0A=
FFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFF=
FF000=0A=
007FF00000FFF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000=
07FF0=0A=
00007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00=
0007F=0A=
F000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF=
00000=0A=
7FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007=
FF000=0A=
007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000=
07FF0=0A=
00007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00=
0007F=0A=
F000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF=
00000=0A=
7FF000007FF000007FF000007FF0003FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FF=
FFFE0=0A=
3FFFFFE03FFFFFE03FFFFFE03FFFFFE03B487EC742>12 =
D<FFFFFFFFFFFFE00000FFFFFFFFFFFF=0A=
FE0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFF800001FFF800001F=
FFE00=0A=
001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FFF8000000FFFC00=
01FFF=0A=
80000007FFE0001FFF80000007FFF0001FFF80000007FFF0001FFF80000003FFF0001FFF8=
00000=0A=
03FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF8000000=
3FFF8=0A=
001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF00=
01FFF=0A=
80000007FFF0001FFF80000007FFE0001FFF8000000FFFE0001FFF8000000FFFC0001FFF8=
00000=0A=
1FFF80001FFF8000003FFF00001FFF8000007FFE00001FFF800001FFFC00001FFF800007F=
FF000=0A=
001FFFFFFFFFFFC000001FFFFFFFFFFE0000001FFFFFFFFFFF8000001FFFFFFFFFFFF0000=
01FFF=0A=
800000FFFC00001FFF8000003FFF00001FFF8000000FFFC0001FFF80000007FFE0001FFF8=
00000=0A=
03FFF0001FFF80000003FFF8001FFF80000001FFF8001FFF80000001FFFC001FFF8000000=
0FFFC=0A=
001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFF0=
01FFF=0A=
800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF8=
00000=0A=
00FFFF001FFF80000000FFFF001FFF80000000FFFF001FFF80000000FFFE001FFF8000000=
0FFFE=0A=
001FFF80000001FFFE001FFF80000001FFFC001FFF80000003FFFC001FFF80000007FFF80=
01FFF=0A=
80000007FFF0001FFF8000001FFFE0001FFF8000003FFFE0001FFF800001FFFF80FFFFFFF=
FFFFF=0A=
FFFF00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFC000FFFFFFFFFFFFF=
80000=0A=
48477CC654>66 =
D<000000003FFE00000E0000000FFFFFC0001E0000007FFFFFF8003E000003FF=0A=
FFFFFE00FE00000FFFFFFFFF81FE00003FFFF800FFC3FE0000FFFF80000FF7FE0001FFFC0=
00003=0A=
FFFE0007FFF0000001FFFE000FFFC00000007FFE001FFF800000003FFE003FFF000000001=
FFE00=0A=
7FFE000000000FFE00FFFC0000000007FE01FFF80000000007FE03FFF00000000003FE03F=
FF000=0A=
00000001FE07FFE00000000001FE07FFE00000000000FE0FFFC00000000000FE0FFFC0000=
00000=0A=
007E1FFFC000000000007E1FFF8000000000007E3FFF8000000000007E3FFF80000000000=
03E3F=0A=
FF8000000000003E7FFF8000000000003E7FFF0000000000003E7FFF000000000000007FF=
F0000=0A=
0000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000=
00000=0A=
0000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000=
000FF=0A=
FF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFF=
F0000=0A=
00000000007FFF000000000000007FFF000000000000007FFF000000000000007FFF80000=
00000=0A=
003E3FFF8000000000003E3FFF8000000000003E3FFF8000000000003E1FFF80000000000=
03E1F=0A=
FFC000000000003E0FFFC000000000007C0FFFC000000000007C07FFE000000000007C07F=
FE000=0A=
00000000F803FFF00000000000F803FFF00000000001F801FFF80000000001F000FFFC000=
00000=0A=
03E0007FFE0000000007E0003FFF000000000FC0001FFF800000001F80000FFFC00000003=
F0000=0A=
07FFF0000000FE000001FFFC000001FC000000FFFF80000FF80000003FFFF8007FF000000=
00FFF=0A=
FFFFFFC000000003FFFFFFFF00000000007FFFFFFC00000000000FFFFFE00000000000003=
FFE00=0A=
0000474979C756>I<FFFFFFFFFFFFC0000000FFFFFFFFFFFFFE000000FFFFFFFFFFFFFFC0=
0000=0A=
FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFC0000001FFF800007FFFF0000001FFF8000007=
FFF80=0A=
00001FFF8000000FFFE000001FFF80000007FFF000001FFF80000001FFF800001FFF80000=
000FF=0A=
FC00001FFF800000007FFE00001FFF800000003FFF00001FFF800000001FFF00001FFF800=
00000=0A=
0FFF80001FFF800000000FFFC0001FFF8000000007FFC0001FFF8000000007FFE0001FFF8=
00000=0A=
0003FFE0001FFF8000000003FFF0001FFF8000000003FFF0001FFF8000000003FFF8001FF=
F8000=0A=
000001FFF8001FFF8000000001FFF8001FFF8000000001FFFC001FFF8000000001FFFC001=
FFF80=0A=
00000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001FFFE0=
01FFF=0A=
8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFF=
E001F=0A=
FF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000F=
FFE00=0A=
1FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF800000000=
0FFFE=0A=
001FFF8000000001FFFE001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000=
001FF=0A=
FC001FFF8000000001FFFC001FFF8000000001FFF8001FFF8000000001FFF8001FFF80000=
00001=0A=
FFF8001FFF8000000003FFF0001FFF8000000003FFF0001FFF8000000003FFF0001FFF800=
00000=0A=
07FFE0001FFF8000000007FFE0001FFF800000000FFFC0001FFF800000000FFF80001FFF8=
00000=0A=
001FFF80001FFF800000003FFF00001FFF800000003FFE00001FFF800000007FFC00001FF=
F8000=0A=
0001FFF800001FFF80000003FFF000001FFF8000000FFFE000001FFF8000007FFFC000001=
FFF80=0A=
0003FFFF0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFF80000FFFFFFFFFFFFFFC00000F=
FFFFF=0A=
FFFFFFFE000000FFFFFFFFFFFFC00000004F477CC65B>I<000000003FFE00000E00000000=
0FFF=0A=
FFC0001E000000007FFFFFF8003E00000003FFFFFFFE00FE0000000FFFFFFFFF81FE00000=
03FFF=0A=
F800FFC3FE000000FFFF80000FF7FE000001FFFC000003FFFE000007FFF0000001FFFE000=
00FFF=0A=
C00000007FFE00001FFF800000003FFE00003FFF000000001FFE00007FFE000000000FFE0=
000FF=0A=
FC0000000007FE0001FFF80000000007FE0003FFF00000000003FE0003FFF00000000001F=
E0007=0A=
FFE00000000001FE0007FFE00000000000FE000FFFC00000000000FE000FFFC0000000000=
07E00=0A=
1FFFC000000000007E001FFF8000000000007E003FFF8000000000007E003FFF800000000=
0003E=0A=
003FFF8000000000003E007FFF8000000000003E007FFF0000000000003E007FFF0000000=
00000=0A=
00007FFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF00000=
00000=0A=
000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF000=
00000=0A=
00000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0=
00000=0A=
0000000000FFFF0000000000000000FFFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FF=
F0000=0A=
007FFFFFFFFE7FFF8000007FFFFFFFFE7FFF8000007FFFFFFFFE3FFF8000000000FFFE003=
FFF80=0A=
00000000FFFE003FFF8000000000FFFE001FFF8000000000FFFE001FFFC000000000FFFE0=
00FFF=0A=
C000000000FFFE000FFFC000000000FFFE0007FFE000000000FFFE0007FFE000000000FFF=
E0003=0A=
FFF000000000FFFE0003FFF800000000FFFE0001FFF800000000FFFE0000FFFC00000000F=
FFE00=0A=
007FFE00000000FFFE00003FFF00000000FFFE00001FFF80000000FFFE00000FFFE000000=
1FFFE=0A=
000007FFF0000003FFFE000001FFFC000007FFFE000000FFFF80001FFFFE0000003FFFFC0=
0FFC7=0A=
FE0000000FFFFFFFFF83FE00000003FFFFFFFE00FE000000007FFFFFF8003E000000000FF=
FFFE0=0A=
000E00000000003FFE000000004F4979C75D>71 =
D<FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FF=0A=
FFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF=
0001F=0A=
FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000=
0003F=0A=
FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF80000=
01FFF=0A=
C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000000=
03FFF=0A=
8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001=
FFFC0=0A=
0000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003=
FFF80=0A=
00001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FF=
FC000=0A=
00003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FF=
F8000=0A=
001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFFFFFFFFFFFFF8000001FFFF=
FFFFF=0A=
FFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8=
00000=0A=
1FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00=
00000=0A=
3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF800=
0001F=0A=
FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000=
0003F=0A=
FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF80000=
01FFF=0A=
C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000000=
03FFF=0A=
8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001=
FFFC0=0A=
0000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003=
FFF80=0A=
00001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FF=
FC000=0A=
00003FFF8000FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFF=
FFFF0=0A=
FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF054477CC65D>I<FFFFFFFFFF000000=
FFFF=0A=
FFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000001FFFC000000=
00000=0A=
1FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC0000=
00000=0A=
001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC00=
00000=0A=
00001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC=
00000=0A=
0000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FF=
FC000=0A=
000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001=
FFFC0=0A=
00000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC0000000000=
01FFF=0A=
C000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC00000000=
0001F=0A=
FFC000000000001FFFC000000000001FFFC000000000001FFFC0000000F8001FFFC000000=
0F800=0A=
1FFFC0000000F8001FFFC0000000F8001FFFC0000001F0001FFFC0000001F0001FFFC0000=
001F0=0A=
001FFFC0000001F0001FFFC0000001F0001FFFC0000003F0001FFFC0000003F0001FFFC00=
00003=0A=
F0001FFFC0000007F0001FFFC0000007F0001FFFC000000FE0001FFFC000001FE0001FFFC=
00000=0A=
1FE0001FFFC000003FE0001FFFC000007FE0001FFFC00000FFE0001FFFC00003FFE0001FF=
FC000=0A=
0FFFE0001FFFC0007FFFE0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFF=
FFFFF=0A=
FFFFFFC0FFFFFFFFFFFFFFC03D477CC647>76 =
D<FFFFFFE0000000000003FFFFFFFFFFFFF00000=0A=
00000007FFFFFFFFFFFFF0000000000007FFFFFFFFFFFFF800000000000FFFFFFFFFFFFFF=
80000=0A=
0000000FFFFFFF001FFFF800000000000FFFF800001FFFFC00000000001EFFF800001FFFF=
C0000=0A=
0000001EFFF800001FBFFE00000000003CFFF800001FBFFE00000000003CFFF800001F9FF=
F0000=0A=
00000078FFF800001F9FFF000000000078FFF800001F8FFF8000000000F0FFF800001F8FF=
F8000=0A=
000000F0FFF800001F87FFC000000001E0FFF800001F87FFC000000001E0FFF800001F87F=
FC000=0A=
000001E0FFF800001F83FFE000000003C0FFF800001F83FFE000000003C0FFF800001F81F=
FF000=0A=
00000780FFF800001F81FFF00000000780FFF800001F80FFF80000000F00FFF800001F80F=
FF800=0A=
00000F00FFF800001F807FFC0000001E00FFF800001F807FFC0000001E00FFF800001F807=
FFC00=0A=
00001E00FFF800001F803FFE0000003C00FFF800001F803FFE0000003C00FFF800001F801=
FFF00=0A=
00007800FFF800001F801FFF0000007800FFF800001F800FFF800000F000FFF800001F800=
FFF80=0A=
0000F000FFF800001F8007FFC00001E000FFF800001F8007FFC00001E000FFF800001F800=
3FFE0=0A=
0003C000FFF800001F8003FFE00003C000FFF800001F8003FFE00003C000FFF800001F800=
1FFF0=0A=
00078000FFF800001F8001FFF000078000FFF800001F8000FFF8000F0000FFF800001F800=
0FFF8=0A=
000F0000FFF800001F80007FFC001E0000FFF800001F80007FFC001E0000FFF800001F800=
03FFE=0A=
003C0000FFF800001F80003FFE003C0000FFF800001F80001FFF00780000FFF800001F800=
01FFF=0A=
00780000FFF800001F80001FFF00780000FFF800001F80000FFF80F00000FFF800001F800=
00FFF=0A=
80F00000FFF800001F800007FFC1E00000FFF800001F800007FFC1E00000FFF800001F800=
003FF=0A=
E3C00000FFF800001F800003FFE3C00000FFF800001F800001FFF7800000FFF800001F800=
001FF=0A=
F7800000FFF800001F800001FFF7800000FFF800001F800000FFFF000000FFF800001F800=
000FF=0A=
FF000000FFF800001F8000007FFE000000FFF800001F8000007FFE000000FFF800001F800=
0003F=0A=
FC000000FFF800001F8000003FFC000000FFF800001F8000001FF8000000FFF800001F800=
0001F=0A=
F8000000FFF800007FE000000FF0000000FFF800FFFFFFF0000FF00007FFFFFFFFFFFFFFF=
0000F=0A=
F00007FFFFFFFFFFFFFFF00007E00007FFFFFFFFFFFFFFF00007E00007FFFFFFFFFFFFFFF=
00003=0A=
C00007FFFFFFFF68477CC671>I<FFFFFFC0000000FFFFFFF0FFFFFFE0000000FFFFFFF0FF=
FFFF=0A=
F0000000FFFFFFF0FFFFFFF8000000FFFFFFF0FFFFFFFC000000FFFFFFF0001FFFFC00000=
0007F=0A=
E000001FFFFE000000001F8000001FFFFF000000001F8000001FFFFF800000001F8000001=
FFFFF=0A=
C00000001F8000001FBFFFE00000001F8000001F9FFFE00000001F8000001F9FFFF000000=
01F80=0A=
00001F8FFFF80000001F8000001F87FFFC0000001F8000001F83FFFE0000001F8000001F8=
1FFFF=0A=
0000001F8000001F80FFFF0000001F8000001F80FFFF8000001F8000001F807FFFC000001=
F8000=0A=
001F803FFFE000001F8000001F801FFFF000001F8000001F800FFFF800001F8000001F800=
7FFF8=0A=
00001F8000001F8007FFFC00001F8000001F8003FFFE00001F8000001F8001FFFF00001F8=
00000=0A=
1F8000FFFF80001F8000001F80007FFFC0001F8000001F80003FFFC0001F8000001F80003=
FFFE0=0A=
001F8000001F80001FFFF0001F8000001F80000FFFF8001F8000001F800007FFFC001F800=
0001F=0A=
800003FFFE001F8000001F800001FFFF001F8000001F800001FFFF001F8000001F800000F=
FFF80=0A=
1F8000001F8000007FFFC01F8000001F8000003FFFE01F8000001F8000001FFFF01F80000=
01F80=0A=
00000FFFF81F8000001F8000000FFFF81F8000001F80000007FFFC1F8000001F80000003F=
FFE1F=0A=
8000001F80000001FFFF1F8000001F80000000FFFF9F8000001F800000007FFFDF8000001=
F8000=0A=
00007FFFDF8000001F800000003FFFFF8000001F800000001FFFFF8000001F800000000FF=
FFF80=0A=
00001F8000000007FFFF8000001F8000000003FFFF8000001F8000000003FFFF8000001F8=
00000=0A=
0001FFFF8000001F8000000000FFFF8000001F80000000007FFF8000001F80000000003FF=
F8000=0A=
001F80000000001FFF8000001F80000000001FFF8000001F80000000000FFF8000001F800=
00000=0A=
0007FF8000001F800000000003FF8000001F800000000001FF8000007FE00000000000FF8=
000FF=0A=
FFFFF000000000FF8000FFFFFFF0000000007F8000FFFFFFF0000000003F8000FFFFFFF00=
00000=0A=
001F8000FFFFFFF0000000000F000054477CC65D>I<FFFFFFFFFFFF800000FFFFFFFFFFFF=
FC00=0A=
00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000001FFF80000FFFFC0=
0001F=0A=
FF800001FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FF=
F8000=0A=
000FFFC0001FFF8000000FFFE0001FFF8000000FFFE0001FFF80000007FFF0001FFF80000=
007FF=0A=
F0001FFF80000007FFF0001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF=
8001F=0A=
FF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FF=
F8000=0A=
0007FFF8001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FFF0001FFF80000=
00FFF=0A=
E0001FFF8000000FFFE0001FFF8000000FFFC0001FFF8000001FFF80001FFF8000003FFF8=
0001F=0A=
FF8000007FFF00001FFF800001FFFE00001FFF80000FFFF800001FFFFFFFFFFFF000001FF=
FFFFF=0A=
FFFFC000001FFFFFFFFFFE0000001FFFFFFFFFF00000001FFFC00000000000001FFFC0000=
00000=0A=
00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000=
0001F=0A=
FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FF=
FC000=0A=
00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000=
00000=0A=
00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000=
0001F=0A=
FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FF=
FC000=0A=
00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000FFFFFFFFF80=
00000=0A=
00FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF80000000=
04547=0A=
7CC651>80 =
D<00007FF00007000007FFFF000F00001FFFFFC01F00007FFFFFF03F0000FFFFFFFC=0A=
7F0003FFC00FFEFF0007FE0000FFFF0007FC00003FFF000FF000001FFF001FF0000007FF0=
01FE0=0A=
000003FF003FE0000001FF003FC0000001FF007FC0000000FF007FC00000007F007FC0000=
0007F=0A=
00FFC00000003F00FFC00000003F00FFC00000003F00FFE00000003F00FFE00000001F00F=
FF000=0A=
00001F00FFF80000001F00FFFC0000001F00FFFF00000000007FFFC0000000007FFFFE000=
00000=0A=
7FFFFFE00000003FFFFFFF0000003FFFFFFFF000001FFFFFFFFC00001FFFFFFFFF00000FF=
FFFFF=0A=
FFC00007FFFFFFFFE00007FFFFFFFFF00003FFFFFFFFF80000FFFFFFFFFC00007FFFFFFFF=
E0000=0A=
3FFFFFFFFE00000FFFFFFFFF000001FFFFFFFF0000003FFFFFFF80000001FFFFFF8000000=
00FFF=0A=
FFC000000000FFFFC0000000001FFFC0000000000FFFE00000000007FFE00000000003FFE=
07800=0A=
000001FFE0F800000000FFE0F800000000FFE0F8000000007FE0F8000000007FE0F800000=
0007F=0A=
E0FC000000007FE0FC000000007FC0FC000000007FC0FE000000007FC0FE000000007F80F=
F0000=0A=
0000FF80FF80000000FF80FFC0000000FF00FFE0000001FE00FFF8000003FE00FFFE00000=
7FC00=0A=
FFFF80000FF800FFFFFC007FF000FE3FFFFFFFE000FC0FFFFFFF8000F803FFFFFF0000F00=
07FFF=0A=
F80000E00003FFC00000334979C742>83 =
D<3FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003F=0A=
FFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFF0003FFF8003=
FFF00=0A=
7FF80003FFF80007FF807FE00003FFF80001FF807FC00003FFF80000FF807F800003FFF80=
0007F=0A=
807F000003FFF800003F807F000003FFF800003F807E000003FFF800001F807E000003FFF=
80000=0A=
1F807E000003FFF800000F807C000003FFF800000F807C000003FFF800000F807C000003F=
FF800=0A=
000F807C000003FFF800000F80FC000003FFF800000FC0F8000003FFF8000007C0F800000=
3FFF8=0A=
000007C0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007C000000=
003FF=0A=
F80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000000=
00003=0A=
FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000=
00000=0A=
03FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000=
00000=0A=
0003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000=
00000=0A=
000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000=
00000=0A=
00000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80=
00000=0A=
0000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF=
80000=0A=
000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003F=
FF800=0A=
00000000000003FFF80000000000000003FFF80000000000000003FFF8000000000000000=
3FFF8=0A=
0000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000=
003FF=0A=
F8000000000003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFFF80000000=
3FFFF=0A=
FFFFFFF800000003FFFFFFFFFFF800004A467CC553>I<FFFFFFFFF80001FFFFFFC0FFFFFF=
FFF8=0A=
0001FFFFFFC0FFFFFFFFF80001FFFFFFC0FFFFFFFFF80001FFFFFFC0FFFFFFFFF80001FFF=
FFFC0=0A=
001FFFC000000000FF8000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC=
00000=0A=
00003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0=
00000=0A=
1FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC00=
00000=0A=
003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E000=
0001F=0A=
FFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000=
00000=0A=
3E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E00000=
01FFF=0A=
C0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC000000=
0003E=0A=
0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001=
FFFC0=0A=
000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC00000000=
03E00=0A=
00001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FF=
FC000=0A=
0000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003=
E0000=0A=
001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC=
00000=0A=
00003E0000001FFFC0000000003E0000001FFFC0000000003E0000001FFFC0000000003E0=
00000=0A=
1FFFC0000000003E0000000FFFC0000000007E0000000FFFC0000000007C0000000FFFE00=
00000=0A=
007C0000000FFFE000000000FC00000007FFE000000000F800000007FFE000000001F8000=
00003=0A=
FFF000000001F800000001FFF000000003F000000001FFF800000007E000000000FFF8000=
00007=0A=
E0000000007FFC0000001FC0000000003FFE0000003F80000000001FFF800000FF0000000=
0000F=0A=
FFE00007FE000000000003FFFE007FFC000000000001FFFFFFFFF00000000000007FFFFFF=
FE000=0A=
00000000000FFFFFFF8000000000000001FFFFFC00000000000000000FFFC000000000524=
87CC6=0A=
5B>I<FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFF=
C03F=0A=
FFFFFFF0001FFFFFF0FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFFC03FFFFFFFF0001FF=
FFFF0=0A=
007FFF0000001FFFE00000000FF800007FFF0000000FFFE000000003E000007FFF8000000=
FFFE0=0A=
00000007E000003FFF8000000FFFF000000007C000003FFFC0000007FFF000000007C0000=
03FFF=0A=
C0000007FFF80000000FC000001FFFC0000003FFF80000000F8000001FFFE0000003FFF80=
00000=0A=
1F8000000FFFE0000003FFFC0000001F0000000FFFE0000001FFFC0000001F0000000FFFF=
00000=0A=
01FFFE0000003F00000007FFF0000001FFFE0000003E00000007FFF8000001FFFE0000007=
E0000=0A=
0003FFF8000003FFFF0000007C00000003FFF8000003FFFF0000007C00000003FFFC00000=
3FFFF=0A=
000000FC00000001FFFC000007FFFF800000F800000001FFFE000007FFFF800000F800000=
001FF=0A=
FE000007FFFFC00001F800000000FFFE00000F9FFFC00001F000000000FFFF00000F9FFFC=
00003=0A=
F0000000007FFF00001F9FFFE00003E0000000007FFF00001F0FFFE00003E0000000007FF=
F8000=0A=
1F0FFFE00007E0000000003FFF80003F0FFFF00007C0000000003FFFC0003E07FFF00007C=
00000=0A=
00001FFFC0007E07FFF8000F80000000001FFFC0007C03FFF8000F80000000001FFFE0007=
C03FF=0A=
F8001F80000000000FFFE000FC03FFFC001F00000000000FFFE000F801FFFC001F0000000=
0000F=0A=
FFF000F801FFFE003F000000000007FFF001F801FFFE003E000000000007FFF801F000FFF=
E007E=0A=
000000000003FFF803F000FFFF007C000000000003FFF803E0007FFF007C000000000003F=
FFC03=0A=
E0007FFF00FC000000000001FFFC07E0007FFF80F8000000000001FFFE07C0003FFF80F80=
00000=0A=
000001FFFE0FC0003FFFC1F8000000000000FFFE0F80001FFFC1F0000000000000FFFF0F8=
0001F=0A=
FFC3F00000000000007FFF1F80001FFFE3E00000000000007FFF1F00000FFFE3E00000000=
00000=0A=
7FFF9F00000FFFF7E00000000000003FFFBF00000FFFF7C00000000000003FFFFE000007F=
FFFC0=0A=
0000000000001FFFFE000007FFFF800000000000001FFFFC000003FFFF800000000000001=
FFFFC=0A=
000003FFFF800000000000000FFFFC000003FFFF000000000000000FFFF8000001FFFF000=
00000=0A=
0000000FFFF8000001FFFF0000000000000007FFF0000000FFFE0000000000000007FFF00=
00000=0A=
FFFE0000000000000003FFF0000000FFFC0000000000000003FFE00000007FFC000000000=
00000=0A=
03FFE00000007FFC0000000000000001FFE00000007FF80000000000000001FFC00000003=
FF800=0A=
00000000000001FFC00000003FF80000000000000000FF800000001FF0000000000000000=
0FF80=0A=
0000001FF000000000000000007F800000001FE000000000000000007F000000000FE0000=
00000=0A=
000000007F000000000FE000000000000000003E0000000007C00000000074487DC67B>87=0A=
D<FFFFFFFFF000000FFFFFF8FFFFFFFFF000000FFFFFF8FFFFFFFFF000000FFFFFF8FFFFF=
FFFF0=0A=
00000FFFFFF8FFFFFFFFF000000FFFFFF8003FFFF0000000001FF000001FFFF0000000000=
FC000=0A=
000FFFF8000000001F8000000FFFFC000000001F80000007FFFC000000003F00000003FFF=
E0000=0A=
00007E00000003FFFF00000000FC00000001FFFF00000000FC00000000FFFF80000001F80=
00000=0A=
00FFFFC0000003F0000000007FFFC0000003F0000000003FFFE0000007E0000000003FFFF=
00000=0A=
0FC0000000001FFFF000000FC0000000000FFFF800001F80000000000FFFFC00003F00000=
00000=0A=
07FFFC00003F000000000003FFFE00007E000000000003FFFF0000FC000000000001FFFF0=
000FC=0A=
000000000000FFFF8001F8000000000000FFFFC003F00000000000007FFFC003F00000000=
00000=0A=
3FFFE007E00000000000003FFFF00FC00000000000001FFFF00FC00000000000000FFFF81=
F8000=0A=
00000000000FFFFC3F0000000000000007FFFC3F0000000000000003FFFE7E00000000000=
00003=0A=
FFFFFC0000000000000001FFFFFC0000000000000000FFFFF80000000000000000FFFFF00=
00000=0A=
00000000007FFFF000000000000000003FFFE000000000000000003FFFC00000000000000=
0001F=0A=
FF8000000000000000001FFF8000000000000000001FFF8000000000000000001FFF80000=
00000=0A=
000000001FFF8000000000000000001FFF8000000000000000001FFF80000000000000000=
01FFF=0A=
8000000000000000001FFF8000000000000000001FFF8000000000000000001FFF8000000=
00000=0A=
0000001FFF8000000000000000001FFF8000000000000000001FFF8000000000000000001=
FFF80=0A=
00000000000000001FFF8000000000000000001FFF8000000000000000001FFF800000000=
00000=0A=
00001FFF8000000000000000001FFF8000000000000000001FFF8000000000000000001FF=
F8000=0A=
000000000000001FFF8000000000000000001FFF8000000000000000FFFFFFFFF80000000=
00000=0A=
FFFFFFFFF8000000000000FFFFFFFFF8000000000000FFFFFFFFF8000000000000FFFFFFF=
FF800=0A=
000055477EC65A>89 =
D<0007FFFC000000007FFFFFC0000001FFFFFFF8000003FFFFFFFE000007=0A=
FE001FFF000007FF0003FFC0000FFF8001FFE0000FFF8000FFF0000FFF80007FF0000FFF8=
0007F=0A=
F8000FFF80007FF80007FF00003FFC0007FF00003FFC0003FE00003FFC0000F800003FFC0=
00000=0A=
00003FFC00000000003FFC00000000003FFC00000000003FFC00000007FFFFFC000000FFF=
FFFFC=0A=
000007FFFFFFFC00003FFFE03FFC0000FFFE003FFC0003FFF0003FFC0007FFC0003FFC000=
FFF00=0A=
003FFC001FFE00003FFC003FFC00003FFC007FF800003FFC007FF800003FFC00FFF000003=
FFC00=0A=
FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000007FFC007FF=
80000=0A=
FFFC007FF80001EFFC003FFC0003EFFC003FFF0007CFFF000FFFC03F8FFFF807FFFFFF07F=
FFC01=0A=
FFFFFC03FFFC007FFFF001FFFC0003FF80007FF8362E7DAD3A>97 =
D<007FC00000000000FFFFC0=0A=
0000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC0000000000=
003FF=0A=
C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000=
00001=0A=
FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000=
00000=0A=
01FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000=
00000=0A=
0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00=
00000=0A=
000001FFC00FFC00000001FFC07FFFC0000001FFC3FFFFF0000001FFCFFFFFFC000001FFD=
FF00F=0A=
FF000001FFFF8003FF800001FFFE0001FFC00001FFF800007FE00001FFF000007FF00001F=
FE000=0A=
003FF80001FFE000001FFC0001FFE000001FFC0001FFE000001FFE0001FFE000001FFE000=
1FFE0=0A=
00000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF8=
001FF=0A=
E000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FF=
F8001=0A=
FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000=
FFF00=0A=
01FFE000000FFF0001FFE000000FFF0001FFE000001FFE0001FFE000001FFE0001FFE0000=
01FFC=0A=
0001FFE000001FFC0001FFE000003FF80001FFF000003FF80001FFF800007FF00001FFFC0=
000FF=0A=
E00001FFFE0001FFC00001FFBF0007FF800001FF1FE01FFE000001FE0FFFFFFC000001FC0=
3FFFF=0A=
F0000001F800FFFF80000001F0001FF800000039487CC742>I<00001FFFC0000000FFFFF8=
0000=0A=
07FFFFFE00001FFFFFFF80007FFC00FFC000FFE001FFC001FFC003FFE003FF8003FFE007F=
F0003=0A=
FFE00FFE0003FFE00FFE0003FFE01FFC0001FFC01FFC0001FFC03FFC0000FF803FFC00003=
E007F=0A=
F8000000007FF8000000007FF800000000FFF800000000FFF800000000FFF800000000FFF=
80000=0A=
0000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000=
0007F=0A=
F8000000007FF8000000007FFC000000003FFC000000003FFC000000001FFC000000F81FF=
E0000=0A=
00F80FFE000000F80FFF000001F007FF800003F003FFC00007E001FFE0000FC000FFF0001=
F8000=0A=
7FFE00FF00001FFFFFFE000007FFFFF8000000FFFFE00000001FFE00002D2E7CAD35>I<00=
0000=0A=
00007FC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00=
00000=0A=
0000FFFFC0000000000003FFC0000000000001FFC0000000000001FFC0000000000001FFC=
00000=0A=
00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001F=
FC000=0A=
0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000000=
1FFC0=0A=
000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000=
001FF=0A=
C0000000000001FFC00000000FFC01FFC0000000FFFF81FFC0000007FFFFE1FFC000001FF=
FFFF9=0A=
FFC000007FFC03FFFFC00000FFF0007FFFC00001FFC0001FFFC00003FF80000FFFC00007F=
F0000=0A=
07FFC0000FFE000003FFC0000FFE000003FFC0001FFC000003FFC0001FFC000003FFC0003=
FFC00=0A=
0003FFC0003FFC000003FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC00=
0FFF8=0A=
000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC=
000FF=0A=
F8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003F=
FC000=0A=
7FF8000003FFC0007FF8000003FFC0007FF8000003FFC0003FF8000003FFC0003FFC00000=
3FFC0=0A=
003FFC000003FFC0001FFC000003FFC0001FFC000003FFC0000FFE000007FFC00007FF000=
00FFF=0A=
C00003FF00001FFFC00001FFC0003FFFC00000FFE000FFFFE000007FF807FBFFFF80001FF=
FFFF3=0A=
FFFF800007FFFFC3FFFF800001FFFF03FFFF8000001FF803FFFF8039487CC742>I<00001F=
FE00=0A=
000001FFFFE0000007FFFFF800001FFFFFFE00007FFC07FF0000FFE001FF8001FFC0007FC=
003FF=0A=
80003FE007FF00003FF00FFE00001FF01FFE00000FF81FFC00000FF83FFC00000FFC3FFC0=
00007=0A=
FC7FFC000007FC7FF8000007FC7FF8000007FE7FF8000007FEFFF8000007FEFFF8000007F=
EFFFF=0A=
FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFFF800000000FFF800000000FFF80=
00000=0A=
00FFF8000000007FF8000000007FF8000000007FFC000000003FFC000000003FFC0000000=
03FFC=0A=
0000001C1FFE0000003E0FFE0000003E07FF0000007E07FF000000FC03FF800001F801FFC=
00003=0A=
F0007FF0001FE0003FFE00FFC0001FFFFFFF800007FFFFFE000000FFFFF80000000FFF800=
02F2E=0A=
7DAD36>I<000000FFC000000007FFF80000003FFFFC000000FFFFFF000001FFC1FF000007=
FF03=0A=
FF80000FFC03FF80000FF807FFC0001FF807FFC0003FF007FFC0003FF007FFC0003FE003F=
F8000=0A=
7FE003FF80007FE001FF00007FE000FE00007FE0003800007FE0000000007FE0000000007=
FE000=0A=
0000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000=
00000=0A=
7FE0000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000007=
FF000=0A=
0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000=
00000=0A=
7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007=
FF000=0A=
0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000=
00000=0A=
7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007=
FF000=0A=
0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000=
00000=0A=
7FF0000000007FF0000000007FF00000003FFFFFF800003FFFFFF800003FFFFFF800003FF=
FFFF8=0A=
00003FFFFFF800002A487DC724>I<00000000001F8000007FF000FFE00007FFFF03FFF000=
1FFF=0A=
FFC7FFF0007FFFFFFFC7F800FFE03FFE0FF801FF800FFC0FF803FF0007FE0FF807FE0003F=
F07F0=0A=
07FE0003FF07F00FFC0001FF81C00FFC0001FF80000FFC0001FF80001FFC0001FFC0001FF=
C0001=0A=
FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0000FFC0001FF8=
0000F=0A=
FC0001FF80000FFC0001FF800007FE0003FF000007FE0003FF000003FF0007FE000001FF8=
00FFC=0A=
000000FFE03FF8000001FFFFFFF0000001DFFFFFC0000003C7FFFF00000003C07FF000000=
007C0=0A=
000000000007C0000000000007C0000000000007C0000000000007E0000000000007F0000=
00000=0A=
0007F8000000000007FFFFFFF0000007FFFFFFFF000003FFFFFFFFE00003FFFFFFFFF8000=
1FFFF=0A=
FFFFFE0001FFFFFFFFFF0000FFFFFFFFFF80007FFFFFFFFF8003FFFFFFFFFFC00FFFFFFFF=
FFFC0=0A=
1FF800001FFFE03FE0000001FFE07FC00000007FF07FC00000003FF0FF800000001FF0FF8=
00000=0A=
001FF0FF800000001FF0FF800000001FF0FF800000001FF07FC00000003FE07FC00000003=
FE03F=0A=
E00000007FC03FF0000000FFC01FFC000003FF800FFF00000FFF0003FFF000FFFC0000FFF=
FFFFF=0A=
F000003FFFFFFFC0000007FFFFFE000000003FFFC0000035447DAE3B>I<007FC000000000=
00FF=0A=
FFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC000000=
00000=0A=
03FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000=
00000=0A=
0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00=
00000=0A=
000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC=
00000=0A=
00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001F=
FC000=0A=
0000000001FFC001FFC0000001FFC00FFFF8000001FFC03FFFFE000001FFC0FFFFFF00000=
1FFC1=0A=
FC07FF800001FFC3E003FFC00001FFC7C001FFC00001FFCF0001FFE00001FFDE0000FFE00=
001FF=0A=
DC0000FFE00001FFFC0000FFF00001FFF80000FFF00001FFF00000FFF00001FFF00000FFF=
00001=0A=
FFF00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000F=
FF000=0A=
01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0000=
0FFF0=0A=
0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00=
000FF=0A=
F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE=
00000=0A=
FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001F=
FE000=0A=
00FFF00001FFE00000FFF00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0F=
FFFFF=0A=
C07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE03B487CC742>I<00FC0001FE0003FF00=
07FF=0A=
800FFFC01FFFE01FFFE01FFFE01FFFE01FFFE01FFFE00FFFC007FF8003FF0001FE0000FC0=
00000=0A=
00000000000000000000000000000000000000000000000000000000000000007FC0FFFFC=
0FFFF=0A=
C0FFFFC0FFFFC0FFFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC=
001FF=0A=
C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC=
001FF=0A=
C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC=
0FFFF=0A=
FFFFFFFFFFFFFFFFFFFFFFFFFF18497CC820>I<007FC000000000FFFFC000000000FFFFC0=
0000=0A=
0000FFFFC000000000FFFFC000000000FFFFC00000000003FFC00000000001FFC00000000=
001FF=0A=
C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00=
00000=0A=
0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000000=
1FFC0=0A=
0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000=
00000=0A=
01FFC00000000001FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801F=
FC000=0A=
7FFFF801FFC0000FFE0001FFC00007F00001FFC0000FE00001FFC0003FC00001FFC0007F8=
00001=0A=
FFC000FE000001FFC001FC000001FFC007F8000001FFC00FF0000001FFC01FC0000001FFC=
03F80=0A=
000001FFC0FF00000001FFC1FE00000001FFC3FF00000001FFCFFF80000001FFDFFFC0000=
001FF=0A=
FFFFC0000001FFFFFFE0000001FFFFFFF0000001FFFCFFF8000001FFF87FFC000001FFE03=
FFC00=0A=
0001FFC01FFE000001FFC01FFF000001FFC00FFF800001FFC007FFC00001FFC003FFC0000=
1FFC0=0A=
01FFE00001FFC001FFF00001FFC000FFF80001FFC0007FFC0001FFC0003FFC0001FFC0001=
FFE00=0A=
01FFC0000FFF0001FFC0000FFF8001FFC0000FFFC0FFFFFF807FFFFFFFFFFF807FFFFFFFF=
FFF80=0A=
7FFFFFFFFFFF807FFFFFFFFFFF807FFFFF38487CC73F>107 =
D<007FC000FFFFC000FFFFC000FF=0A=
FFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001F=
FC000=0A=
01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0000=
1FFC0=0A=
0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00=
001FF=0A=
C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC=
00001=0A=
FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001F=
FC000=0A=
01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0000=
1FFC0=0A=
0001FFC00001FFC00001FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFFFF80FFFFFF8=
0FFFF=0A=
FF8019487CC720>I<007FC001FFC00000FFE00000FFFFC00FFFF80007FFFC0000FFFFC03F=
FFFE=0A=
001FFFFF0000FFFFC0FFFFFF007FFFFF8000FFFFC1FC07FF80FE03FFC000FFFFC3E003FFC=
1F001=0A=
FFE00003FFC7C001FFC3E000FFE00001FFCF0001FFE78000FFF00001FFDE0000FFEF00007=
FF000=0A=
01FFDC0000FFEE00007FF00001FFFC0000FFFE00007FF80001FFF80000FFFC00007FF8000=
1FFF0=0A=
0000FFF800007FF80001FFF00000FFF800007FF80001FFF00000FFF800007FF80001FFE00=
000FF=0A=
F000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF=
00000=0A=
7FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007=
FF800=0A=
01FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF8000=
1FFE0=0A=
0000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00=
000FF=0A=
F000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF=
00000=0A=
7FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007=
FF800=0A=
01FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF8000=
1FFE0=0A=
0000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF800FFFFFFC=
07FFF=0A=
FFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFF=
FE03F=0A=
FFFFF0FFFFFFC07FFFFFE03FFFFFF05C2E7CAD63>I<007FC001FFC00000FFFFC00FFFF800=
00FF=0A=
FFC03FFFFE0000FFFFC0FFFFFF0000FFFFC1FC07FF8000FFFFC3E003FFC00003FFC7C001F=
FC000=0A=
01FFCF0001FFE00001FFDE0000FFE00001FFDC0000FFE00001FFFC0000FFF00001FFF8000=
0FFF0=0A=
0001FFF00000FFF00001FFF00000FFF00001FFF00000FFF00001FFE00000FFF00001FFE00=
000FF=0A=
F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE=
00000=0A=
FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001F=
FE000=0A=
00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0000=
1FFE0=0A=
0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00=
001FF=0A=
E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF=
000FF=0A=
FFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FF=
FFFE0=0A=
3B2E7CAD42>I<00000FFF0000000000FFFFF000000007FFFFFE0000001FFFFFFF8000003F=
FC03=0A=
FFC00000FFE0007FF00001FF80001FF80003FF00000FFC0007FE000007FE000FFE000007F=
F000F=0A=
FC000003FF001FFC000003FF803FFC000003FFC03FF8000001FFC03FF8000001FFC07FF80=
00001=0A=
FFE07FF8000001FFE07FF8000001FFE0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF=
0FFF8=0A=
000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000=
001FF=0A=
F0FFF8000001FFF07FF8000001FFE07FF8000001FFE07FF8000001FFE07FF8000001FFE03=
FFC00=0A=
0003FFC03FFC000003FFC01FFC000003FF801FFE000007FF800FFE000007FF0007FF00000=
FFE00=0A=
03FF80001FFC0001FFC0003FF80000FFE0007FF000007FFC03FFE000001FFFFFFF8000000=
7FFFF=0A=
FE00000000FFFFF0000000000FFF000000342E7DAD3B>I<007FC00FFC000000FFFFC07FFF=
C000=0A=
00FFFFC3FFFFF00000FFFFCFFFFFFC0000FFFFDFF01FFF0000FFFFFF8007FF800003FFFE0=
001FF=0A=
C00001FFF80000FFE00001FFF00000FFF00001FFE000007FF80001FFE000003FFC0001FFE=
00000=0A=
3FFC0001FFE000003FFE0001FFE000001FFE0001FFE000001FFF0001FFE000001FFF0001F=
FE000=0A=
001FFF0001FFE000000FFF0001FFE000000FFF8001FFE000000FFF8001FFE000000FFF800=
1FFE0=0A=
00000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8=
001FF=0A=
E000000FFF8001FFE000000FFF8001FFE000000FFF0001FFE000001FFF0001FFE000001FF=
F0001=0A=
FFE000001FFE0001FFE000001FFE0001FFE000003FFC0001FFE000003FFC0001FFE000007=
FF800=0A=
01FFF000007FF80001FFF80000FFF00001FFFC0001FFE00001FFFE0003FFC00001FFFF000=
7FF80=0A=
0001FFFFE03FFE000001FFEFFFFFFC000001FFE3FFFFF0000001FFE0FFFF80000001FFE01=
FF800=0A=
000001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE=
00000=0A=
00000001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001F=
FE000=0A=
0000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE000000000000=
1FFE0=0A=
0000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC00000000=
0FFFF=0A=
FFC00000000039427CAD42>I<00FF803F8000FFFF80FFF000FFFF83FFFC00FFFF87FFFE00=
FFFF=0A=
8FC3FF00FFFF8F07FF0003FF9E0FFF8001FFBC0FFF8001FFB80FFF8001FFF80FFF8001FFF=
00FFF=0A=
8001FFF007FF0001FFF007FF0001FFE003FE0001FFE000F80001FFE000000001FFE000000=
001FF=0A=
C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC=
00000=0A=
0001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000=
001FF=0A=
C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC=
00000=0A=
0001FFC000000001FFC000000001FFC000000001FFC0000000FFFFFFE00000FFFFFFE0000=
0FFFF=0A=
FFE00000FFFFFFE00000FFFFFFE00000292E7CAD31>114 =
D<000FFF00E0007FFFF3E001FFFFFF=0A=
E007FFFFFFE00FF800FFE01FC0001FE03F80000FE03F000007E07F000003E07F000003E0F=
F0000=0A=
03E0FF000003E0FF800003E0FFC0000000FFF0000000FFFE000000FFFFF800007FFFFFC00=
07FFF=0A=
FFF0003FFFFFFC001FFFFFFF000FFFFFFF8007FFFFFFC003FFFFFFE000FFFFFFF0003FFFF=
FF000=0A=
03FFFFF800001FFFF8000000FFFC0000001FFC7800000FFCF8000007FCF8000003FCFC000=
003FC=0A=
FC000003FCFE000003F8FE000003F8FF000003F8FF800007F0FFC0000FF0FFF0001FE0FFF=
C00FF=0A=
C0FFFFFFFF80FC7FFFFE00F81FFFF800E003FF8000262E7CAD2F>I<0001F000000001F000=
0000=0A=
01F000000001F000000001F000000001F000000003F000000003F000000003F000000007F=
00000=0A=
0007F000000007F00000000FF00000000FF00000001FF00000003FF00000003FF00000007=
FF000=0A=
0001FFF0000003FFF000000FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC00=
0FFF0=0A=
000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000=
000FF=0A=
F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00=
00000=0A=
FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF=
001F0=0A=
00FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000F=
FF001=0A=
F0007FF001E0007FF803E0003FF803E0003FFC07C0001FFE0F80000FFFFF800007FFFE000=
001FF=0A=
FC0000001FF00024427EC12E>I<007FE000003FF000FFFFE0007FFFF000FFFFE0007FFFF0=
00FF=0A=
FFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF00003FFE00001FFF00001FFE00000F=
FF000=0A=
01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0000=
0FFF0=0A=
0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00=
000FF=0A=
F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE=
00000=0A=
FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001F=
FE000=0A=
00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0000=
1FFE0=0A=
0000FFF00001FFE00001FFF00001FFE00001FFF00001FFE00001FFF00001FFE00003FFF00=
000FF=0A=
E00007FFF00000FFE0000F7FF000007FE0001F7FF000007FF0003E7FF800003FFC00FC7FF=
FE000=0A=
1FFFFFF87FFFE00007FFFFE07FFFE00001FFFF807FFFE000003FFE007FFFE03B2E7CAD42>=
I<FF=0A=
FFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFF01FFE=
00000=0A=
1FC001FFF000001F8001FFF000001F8000FFF800001F0000FFF800003F00007FF800003E0=
0007F=0A=
FC00007E00003FFC00007C00003FFE0000FC00001FFE0000F800001FFF0001F800000FFF0=
001F0=0A=
00000FFF8003F0000007FF8003E0000007FFC007E0000007FFC007E0000003FFE007C0000=
003FF=0A=
E00FC0000001FFE00F80000001FFF01F80000000FFF01F00000000FFF83F000000007FF83=
E0000=0A=
00007FFC7E000000003FFC7C000000003FFEFC000000001FFEF8000000001FFFF80000000=
01FFF=0A=
F8000000000FFFF0000000000FFFF00000000007FFE00000000007FFE00000000003FFC00=
00000=0A=
0003FFC00000000001FF800000000001FF800000000000FF000000000000FF00000000000=
07E00=0A=
00000000003C000000382E7DAD3F>I<FFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFF=
FFFF=0A=
07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFE03FFC0001FFC00003FC=
003FF=0A=
E0000FFC00001F8001FFE0000FFC00001F0001FFE0000FFE00001F0001FFF00007FE00003=
F0000=0A=
FFF0000FFF00003E0000FFF8000FFF00007E00007FF8000FFF00007C00007FF8001FFF800=
07C00=0A=
003FFC001FFF8000F800003FFC003FFFC000F800003FFE003EFFC001F800001FFE003EFFC=
001F0=0A=
00001FFE007EFFE003F000000FFF007C7FE003E000000FFF00FC7FF003E000000FFF80F83=
FF007=0A=
E0000007FF80F83FF007C0000007FF81F83FF80FC0000003FFC1F01FF80F80000003FFC3F=
01FFC=0A=
0F80000003FFE3E00FFC1F80000001FFE3E00FFC1F00000001FFE7E00FFE3F00000000FFF=
7C007=0A=
FE3E00000000FFFFC007FF3E00000000FFFF8003FF7E000000007FFF8003FF7C000000007=
FFF80=0A=
03FFFC000000003FFF0001FFF8000000003FFF0001FFF8000000003FFE0000FFF80000000=
01FFE=0A=
0000FFF0000000001FFE0000FFF0000000000FFC00007FE0000000000FFC00007FE000000=
0000F=0A=
F800003FE00000000007F800003FC00000000007F800003FC00000000003F000001F80000=
00000=0A=
01E000000F0000004F2E7DAD56>I<7FFFFF801FFFFF007FFFFF801FFFFF007FFFFF801FFF=
FF00=0A=
7FFFFF801FFFFF007FFFFF801FFFFF00007FF80001FF0000007FFC0001FC0000003FFE000=
3F800=0A=
00001FFF0007F00000000FFF0007E000000007FF800FC000000003FFC01F8000000003FFE=
03F80=0A=
00000001FFF07F0000000000FFF8FE00000000007FF9FC00000000003FFFF800000000003=
FFFF0=0A=
00000000001FFFE000000000000FFFC0000000000007FFC0000000000003FFC0000000000=
001FF=0A=
E0000000000001FFF0000000000001FFF8000000000003FFFC000000000003FFFE0000000=
00007=0A=
FFFE00000000000FEFFF00000000001FCFFF80000000003F87FFC0000000007F03FFE0000=
00000=0A=
FE01FFE000000001FC00FFF000000001F8007FF800000003F0007FFC00000007F0003FFE0=
00000=0A=
0FE0001FFF0000001FC0000FFF0000003F800007FF800000FF800007FFC000FFFFF8003FF=
FFFC0=0A=
FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC03A2E7EAD3=
F>I<=0A=
7FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC00=
0FFFF=0A=
8000FFF000000FE00000FFF800000FC00000FFF800000FC000007FFC00000F8000007FFC0=
0001F=0A=
8000003FFC00001F0000003FFE00003F0000001FFE00003E0000001FFF00007E0000000FF=
F0000=0A=
7C0000000FFF8000FC00000007FF8000F800000007FFC001F800000003FFC001F00000000=
3FFE0=0A=
03F000000003FFE003F000000001FFF003E000000001FFF007E000000000FFF007C000000=
000FF=0A=
F80FC0000000007FF80F80000000007FFC1F80000000003FFC1F00000000003FFE3F00000=
00000=0A=
1FFE3E00000000001FFF7E00000000000FFF7C00000000000FFFFC00000000000FFFFC000=
00000=0A=
0007FFF8000000000007FFF8000000000003FFF0000000000003FFF0000000000001FFE00=
00000=0A=
000001FFE0000000000000FFC0000000000000FFC00000000000007F800000000000007F8=
00000=0A=
000000003F000000000000003F000000000000003F000000000000003E000000000000007=
E0000=0A=
00000000007C00000000000000FC000000001F8000F8000000003FC001F8000000007FE00=
1F000=0A=
000000FFF003F000000000FFF003E000000000FFF007E000000000FFF00FC000000000FFF=
01F80=0A=
00000000FFF03F80000000007FE07F00000000007F43FE00000000003FFFF800000000001=
FFFF0=0A=
000000000007FFC0000000000001FE00000000000039427EAD3F>I E /Fy=0A=
1 59 df<3C7EFFFFFFFF7E3C08087A8714>58 D E /Fz 24 122 =
df<78FCFCFCFC780000000000=0A=
000000000000000000000000000078FCFCFCFC78061F7A9E12>58 =
D<0000030000000000030000=0A=
0000000300000000000780000000000780000000000FC0000000000FC0000000000FC0000=
00000=0A=
17E00000000013E00000000013E00000000023F00000000021F00000000021F0000000004=
0F800=0A=
00000040F80000000040F800000000807C00000000807C00000001807E00000001003E000=
00001=0A=
003E00000002003F00000002001F00000002001F00000004000F80000004000F800000040=
00F80=0A=
0000080007C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F00=
00020=0A=
0001F00000200001F00000400001F80000400000F80000400000F800008000007C0000800=
0007C=0A=
00008000007C00010000003E00010000003E00030000003F00030000001F00070000001F0=
01F80=0A=
00003F80FFE00003FFFCFFE00003FFFC2E327EB132>65 =
D<00003FE0010001FFF8030007F01E03=0A=
001F800307003E000087007800004F00F000002F01E000001F03C000000F078000000F0F8=
00000=0A=
070F000000071F000000031E000000033E000000033C000000017C000000017C000000017=
C0000=0A=
00017800000000F800000000F800000000F800000000F800000000F800000000F80000000=
0F800=0A=
000000F800000000F800000000F800000000F80000000078000000007C000000007C00000=
0017C=0A=
000000013C000000013E000000011E000000011F000000020F000000020F8000000607800=
00004=0A=
03C000000801E000000800F00000100078000020003E0000C0001F8003800007F00F00000=
1FFFC=0A=
0000003FE00028337CB130>67 =
D<FFFF80FFFF8007F00003E00003E00003E00003E00003E00003=0A=
E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E=
00003=0A=
E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E=
00003=0A=
E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00007F=
000FF=0A=
FF80FFFF8011317DB017>73 =
D<7FFFFFFFFFE07FFFFFFFFFE07E000F8007E078000F8001E07000=0A=
0F8000E060000F80006040000F80002040000F800020C0000F800030C0000F80003080000=
F8000=0A=
1080000F80001080000F80001080000F80001080000F80001080000F80001000000F80000=
00000=0A=
0F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000=
F8000=0A=
0000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000=
00000=0A=
0F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000=
F8000=0A=
0000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000=
00000=0A=
0F80000000000F80000000000F80000000001FC00000000FFFFF8000000FFFFF80002C317=
EB030=0A=
>84 =
D<00FE00000303C0000C00E00010007000100038003C003C003E001C003E001E003E001E0=
0=0A=
08001E0000001E0000001E0000001E00000FFE0000FC1E0003E01E000F801E001F001E003=
E001E=0A=
003C001E007C001E00F8001E04F8001E04F8001E04F8003E04F8003E0478003E047C005E0=
43E00=0A=
8F080F0307F003FC03E01E1F7D9E21>97 =
D<003F8000E0600380180700040F00041E001E1C003E=0A=
3C003E7C003E7C0008780000F80000F80000F80000F80000F80000F80000F80000F80000F=
80000=0A=
7800007C00007C00003C00011E00011E00020F000207000403801800E060003F80181F7D9=
E1D>=0A=
99 =
D<000001E000003FE000003FE0000003E0000001E0000001E0000001E0000001E0000001E=
0=0A=
000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E00=
00001=0A=
E0001F81E000F061E001C019E0078005E00F0003E00E0003E01E0001E03C0001E03C0001E=
07C00=0A=
01E0780001E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0F8000=
1E0F8=0A=
0001E0780001E0780001E03C0001E03C0001E01C0001E01E0003E00E0005E0070009E0038=
011F0=0A=
00E061FF003F81FF20327DB125>I<003F800000E0E0000380380007003C000E001E001E00=
1E00=0A=
1C000F003C000F007C000F0078000F8078000780F8000780F8000780FFFFFF80F8000000F=
80000=0A=
00F8000000F8000000F8000000F8000000780000007C0000003C0000003C0000801E00008=
00E00=0A=
01000F0002000780020001C00C0000F03000001FC000191F7E9E1D>I<000000F0007F0308=
01C1=0A=
C41C0380E81C070070080F0078001E003C001E003C003E003E003E003E003E003E003E003=
E003E=0A=
003E003E003E001E003C001E003C000F007800070070000780E00009C1C000087F0000180=
00000=0A=
180000001800000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800=
E000F=0A=
C0180001E0300000F070000070E0000038E0000038E0000038E0000038E00000387000007=
07000=0A=
0070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>103=0A=
D<0780000000FF80000000FF800000000F800000000780000000078000000007800000000=
78000=0A=
0000078000000007800000000780000000078000000007800000000780000000078000000=
00780=0A=
0000000780000000078000000007800000000780FE00000783078000078C03C000079001E=
00007=0A=
A001E00007A000F00007C000F00007C000F000078000F000078000F000078000F00007800=
0F000=0A=
078000F000078000F000078000F000078000F000078000F000078000F000078000F000078=
000F0=0A=
00078000F000078000F000078000F000078000F000078000F000078000F000078000F0000=
78000=0A=
F0000FC001F800FFFC1FFF80FFFC1FFF8021327EB125>I<0F001F801F801F801F800F0000=
0000=0A=
000000000000000000000000000000000000000780FF80FF800F800780078007800780078=
00780=0A=
0780078007800780078007800780078007800780078007800780078007800780078007800=
FC0FF=0A=
F8FFF80D307EAF12>I<07800000FF800000FF8000000F8000000780000007800000078000=
0007=0A=
8000000780000007800000078000000780000007800000078000000780000007800000078=
00000=0A=
078000000780000007801FFC07801FFC078007E0078007800780060007800400078008000=
78010=0A=
000780600007808000078100000783800007878000078FC0000793C00007A1E00007C1F00=
00780=0A=
F0000780780007807C0007803C0007803E0007801F0007800F0007800F80078007C007800=
3C007=0A=
8003E00FC007F8FFFC0FFFFFFC0FFF20327EB123>107 =
D<0780FF80FF800F8007800780078007=0A=
8007800780078007800780078007800780078007800780078007800780078007800780078=
00780=0A=
0780078007800780078007800780078007800780078007800780078007800780078007800=
78007=0A=
800FC0FFFCFFFC0E327EB112>I<0780FE001FC000FF83078060F000FF8C03C18078000F90=
01E2=0A=
003C0007A001E4003C0007A000F4001E0007C000F8001E0007C000F8001E00078000F0001=
E0007=0A=
8000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007800=
0F000=0A=
1E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0=
00780=0A=
00F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F=
0001E=0A=
00078000F0001E00078000F0001E000FC001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF03=
41F7E=0A=
9E38>I<0780FE0000FF83078000FF8C03C0000F9001E00007A001E00007A000F00007C000=
F000=0A=
07C000F000078000F000078000F000078000F000078000F000078000F000078000F000078=
000F0=0A=
00078000F000078000F000078000F000078000F000078000F000078000F000078000F0000=
78000=0A=
F000078000F000078000F000078000F000078000F000078000F0000FC001F800FFFC1FFF8=
0FFFC=0A=
1FFF80211F7E9E25>I<001FC00000F0780001C01C00070007000F0007801E0003C01C0001=
C03C=0A=
0001E03C0001E0780000F0780000F0780000F0F80000F8F80000F8F80000F8F80000F8F80=
000F8=0A=
F80000F8F80000F8F80000F8780000F07C0001F03C0001E03C0001E01E0003C01E0003C00=
F0007=0A=
8007800F0001C01C0000F07800001FC0001D1F7E9E21>I<0781FC00FF860700FF8803C00F=
9001=0A=
E007A000F007C00078078000780780003C0780003C0780003E0780001E0780001F0780001=
F0780=0A=
001F0780001F0780001F0780001F0780001F0780001F0780001F0780003E0780003E07800=
03C07=0A=
80007C0780007807C000F007A000F007A001E00798038007860F000781F80007800000078=
00000=0A=
0780000007800000078000000780000007800000078000000780000007800000078000000=
FC000=0A=
00FFFC0000FFFC0000202D7E9E25>I<0783E0FF8C18FF907C0F907C07A07C07C03807C000=
07C0=0A=
0007C00007800007800007800007800007800007800007800007800007800007800007800=
00780=0A=
000780000780000780000780000780000780000780000FC000FFFE00FFFE00161F7E9E19>=
114=0A=
D<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F800007E000=
03FF0=0A=
001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC0001CC0001CE0001=
CE000=0A=
18F00038F00030CC0060C301C080FE00161F7E9E1A>I<0040000040000040000040000040=
0000=0A=
C00000C00000C00001C00001C00003C00007C0000FC0001FFFE0FFFFE003C00003C00003C=
00003=0A=
C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C=
00003=0A=
C01003C01003C01003C01003C01003C01003C01003C01001C02001E02000E0400078C0001=
F0014=0A=
2C7FAB19>I<078000F000FF801FF000FF801FF0000F8001F000078000F000078000F00007=
8000=0A=
F000078000F000078000F000078000F000078000F000078000F000078000F000078000F00=
00780=0A=
00F000078000F000078000F000078000F000078000F000078000F000078000F000078000F=
00007=0A=
8000F000078001F000078001F000078001F000038002F00003C004F00001C008F80000703=
0FF80=0A=
001FC0FF80211F7E9E25>I<FFF07FF80FFCFFF07FF80FFC0FC007C003F00F8003C001C007=
8003=0A=
C00080078003C0008003C003E0010003C003E0010003C007E0010001E004F0020001E004F=
00200=0A=
01E00870020000F00878040000F00878040000F0103804000078103C08000078103C08000=
07820=0A=
1C0800003C201E1000003C201E1000003C400E1000001E400F2000001E400F2000001E800=
72000=0A=
000F8007C000000F8007C000000F0003C0000007000380000007000380000006000180000=
00200=0A=
0100002E1F7F9E30>119 =
D<FFF801FF80FFF801FF800FC0007C00078000380007C000300003C0=0A=
00200003C000200001E000400001E000400001F000400000F000800000F00080000078010=
00000=0A=
78010000007C010000003C020000003C020000001E040000001E040000001F040000000F0=
80000=0A=
000F080000000790000000079000000007D000000003E000000003E000000001C00000000=
1C000=0A=
000001C000000000800000000080000000010000000001000000000100000000020000000=
00200=0A=
000000040000007004000000F80C000000F808000000F8100000007030000000304000000=
01F80=0A=
000000212D7F9E23>121 D E /FA 12 85 =
df<1F00318060C04040C060C060C060C060C060C060=0A=
C060C060404060C031801F000B107F8F0F>48 =
D<0C003C00CC000C000C000C000C000C000C000C=0A=
000C000C000C000C000C00FF8009107E8F0F>I<1F00618040C08060C0600060006000C001=
8003=0A=
0006000C00102020207FC0FFC00B107F8F0F>I<1F00218060C060C000C0008001800F0000=
8000=0A=
400060C060C060804060801F000B107F8F0F>I<0300030007000F000B0013003300230043=
00C3=0A=
00FFE003000300030003001FE00B107F8F0F>I<20803F002C002000200020002F00308020=
4000=0A=
6000600060C06080C061801F000B107F8F0F>I<0780184030C060C06000C000CF00F080E0=
40C0=0A=
60C060C060406060C030801F000B107F8F0F>I<40007FE07FC08080808001000200040004=
000C=0A=
0008000800180018001800180018000B117E900F>I<1F00318060C060C060C071803F000F=
0033=0A=
8061C0C060C060C060404060801F000B107F8F0F>I<1F00318060C0C040C060C060C06040=
E021=0A=
E01E600060004060C0608043003E000B107F8F0F>I<FC007E1C00701600B01600B01600B0=
1301=0A=
3013013011823011823011823010C43010C430106830106830106830383030FE31FE17117=
F901B=0A=
>77 =
D<7FFF8060C18040C080C0C0C080C04080C04000C00000C00000C00000C00000C00000C00=
0=0A=
00C00000C00000C00000C0000FFC0012117F9016>84 D E /FB 4 128 =
df<70F8F8F87005057C=0A=
840D>58 =
D<E0000000780000001E0000000780000001E0000000780000001C0000000700000003=0A=
C0000000F00000003C0000000F00000003C0000003C000000F0000003C000000F0000003C=
00000=0A=
070000001C00000078000001E00000078000001E00000078000000E00000001A1A7C9723>=
62=0A=
D<001000001000001000001000003800003800003800003800E0380E3FBBF80FFFE003FF8=
000FE=0A=
00007C0000FE0001EF0001C7000383800301800600C00400400800201716809517>I<01F8=
000E=0A=
06001001002000804000808000801106749E0D>127 D E /FC 65 124 =
df<00003FE00000E010=0A=
00018038000380780003807800070030000700000007000000070000000E0000000E00000=
00E00=0A=
0000FFFFE0000E00E0001C01C0001C01C0001C01C0001C01C0001C0380003803800038038=
00038=0A=
03800038070000380700007007000070071000700E2000700E2000700E2000E00E2000E00=
64000=0A=
E0038000E0000000C0000001C0000001C000003180000079800000F3000000620000003C0=
00000=0A=
1D29829F1A>12 D<060F0E1C386040800808709F17>19 =
D<0E1F3F3F1D0102020404081020C008=0A=
0E779F0E>39 =
D<000100020004000800100020006000C0018001800300070006000E000C001C00=0A=
18003800380030007000700060006000E000E000C000C000C000C000C000C000C000C000C=
000C0=0A=
00C000C000C0004000600060002000100010000800102E79A113>I<001000000800000400=
0006=0A=
0000020000030000030000030000010000018000018000018000018000018000018000018=
00003=0A=
80000380000380000300000300000300000700000700000600000600000E00000C00000C0=
0001C=0A=
0000180000380000300000700000600000E00000C0000180000100000300000600000C000=
01800=0A=
00300000600000800000112E80A113>I<1C3C3C3C3C040408081020204080060E7D840E>4=
4=0A=
D<7FF0FFE07FE00C037D8A10>I<70F8F8F0E005057B840E>I<000F800030E000E07001C07=
00380=0A=
300380380700380F00780F00780E00781E00781E00703C00F03C00F03C00F03C00F07801E=
07801=0A=
E07801E07801C07003C0F003C0F00380F00780F00700700700700E00701C0030380018700=
00FC0=0A=
00151F7C9D17>48 =
D<000200020006000E003C00DC031C001C0038003800380038007000700070=0A=
007000E000E000E000E001C001C001C001C003800380038003800780FFF80F1E7B9D17>I<=
001F=0A=
000061800080E00100E00200700220700420700410700820F00820F00820F00840E00881E=
00703=0A=
C0000380000700000C0000180000600000800003000004000008004010004010008020018=
07E03=0A=
0047FF0041FE0080FC00807800141F7C9D17>I<001F800060E00080700100300200380420=
3804=0A=
20380410380420700460700380600000E00001C000030000FE00001C00000600000700000=
78000=0A=
0780000780300780780780780780F00F00800F00401E00401C0040380020E0001F8000151=
F7C9D=0A=
17>I<0000600000E00000E00000E00001C00001C00001C000038000038000030000070000=
0700=0A=
000600000E00000C0000180000180000300000300000630000C7000087000107000307000=
60E00=0A=
040E00080E003F8E00607C00801FC0001C00001C000038000038000038000038000070000=
07000=0A=
00600013277E9D17>I<0007C0001C200030200060E000C1E00181E00380C00700000F0000=
0E00=0A=
001E00001E78001D84003E06003E07003C07007C0780780780780780780780700F00700F0=
0F00F=0A=
00F00E00F01E00701C00601C0070380030700010C0000F8000131F7B9D17>54=0A=
D<001F000061800080C00100600300600600600600600600600E00C00F00800F818007C30=
007E4=0A=
0003F80001F80003FC00067E00183F00300F00200700600700C00300C00300C0030080060=
08006=0A=
00C00C00C008004030003060001F8000131F7B9D17>56 =
D<070F1F1F0E00000000000000000000=0A=
70F8F8F0E008147B930E>58 =
D<0078000186000603000801000801801001802001802003004003=0A=
00700700780E00F03C0060780000F00003E0000780000F00000E00000C000018400018400=
00880=0A=
000F00000000000000000000000000000000001C00003E00003E00003C000038000011217=
8A017=0A=
>63 =
D<00000200000006000000060000000E0000001E0000001E0000003F0000002F0000004F0=
0=0A=
00004F0000008F0000010F0000010F0000020F0000020F0000040F00000C0F0000080F000=
0100F=0A=
0000100F0000200F80003FFF800040078000C007800080078001000780010007800200078=
00200=0A=
0780060007801E000F80FF807FF81D207E9F22>65 =
D<01FFFFC0001E00F0001E0078001E003800=0A=
1E003C003C003C003C003C003C003C003C003C0078007800780078007800F0007801E000F=
00780=0A=
00FFFE0000F00F8000F003C001E001C001E001E001E001E001E001E003C001E003C001E00=
3C001=0A=
E003C001C0078003C00780078007800F0007801E000F007800FFFFE0001E1F7D9E20>I<00=
00FC=0A=
040007030C001C00980030007800E0007801C000380380003003800030070000300E00003=
01E00=0A=
00201E0000203C0000003C00000078000000780000007800000078000000F0000000F0000=
000F0=0A=
000000F0000000F00001007000010070000100700002007000020038000400180008001C0=
01000=0A=
0E0060000381800000FE00001E217A9F20>I<01FFFF80001E00E0001E0070001E0038001E=
001C=0A=
003C001C003C000E003C000E003C000E0078000E0078000E0078000E0078000E00F0001E0=
0F000=0A=
1E00F0001E00F0001E01E0003C01E0003C01E0003C01E0007803C0007003C0007003C000E=
003C0=0A=
01C0078001C00780038007800E0007801C000F007000FFFFC0001F1F7D9E22>I<01FFFFFE=
001E=0A=
001C001E000C001E0004001E0004003C0004003C0004003C0004003C00040078080800780=
80000=0A=
7808000078180000F0300000FFF00000F0300000F0300001E0200001E0200001E0200001E=
00010=0A=
03C0002003C0002003C0004003C00040078000800780018007800100078007000F001F00F=
FFFFE=0A=
001F1F7D9E1F>I<0000FC040007030C001C00980030007800E0007801C000380380003003=
8000=0A=
30070000300E0000301E0000201E0000203C0000003C00000078000000780000007800000=
07800=0A=
0000F0000000F000FFF0F0000780F0000780F0000F0070000F0070000F0070000F0070001=
E0038=0A=
001E0018003E001C002E000E00CC000383040000FC00001E217A9F23>71=0A=
D<01FFF3FFE0001F003E00001E003C00001E003C00001E003C00003C007800003C0078000=
03C00=0A=
7800003C007800007800F000007800F000007800F000007800F00000F001E00000FFFFE00=
000F0=0A=
01E00000F001E00001E003C00001E003C00001E003C00001E003C00003C007800003C0078=
00003=0A=
C007800003C007800007800F000007800F000007800F000007800F00000F801F0000FFF1F=
FE000=0A=
231F7D9E22>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C00007800=
0078=0A=
0000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C00003C00=
003C0=0A=
0003C0000780000780000780000780000F8000FFF800141F7E9E11>I<01FFF03FE0001F00=
0F80=0A=
001E000E00001E000800001E001000003C002000003C004000003C010000003C020000007=
80400=0A=
0000780800000078100000007830000000F0F0000000F1F8000000F278000000F47800000=
1E83C=0A=
000001F03C000001E03C000001E01E000003C01E000003C01E000003C00F000003C00F000=
00780=0A=
0F00000780078000078007800007800780000F8007C000FFF03FF800231F7D9E23>75=0A=
D<01FFF8001F00001E00001E00001E00003C00003C00003C00003C0000780000780000780=
00078=0A=
0000F00000F00000F00000F00001E00001E00001E00001E00103C00203C00203C00603C00=
40780=0A=
0407800C0780180780380F00F0FFFFF0181F7D9E1C>I<01FE00007FC0001E0000FC00001E=
0000=0A=
F80000170001780000170001780000270002F00000270004F00000270004F00000270008F=
00000=0A=
470009E00000470011E00000470021E00000470021E00000870043C00000838043C000008=
38083=0A=
C00000838083C0000103810780000103820780000103820780000103840780000203840F0=
00002=0A=
03880F00000203900F00000203900F00000401E01E00000401E01E00000401C01E00000C0=
1801E=0A=
00001C01803E0000FF8103FFC0002A1F7D9E29>I<01FF007FE0001F000F00001F00040000=
1780=0A=
0400001780040000278008000023C008000023C008000023C008000041E010000041E0100=
00041=0A=
F010000040F010000080F0200000807820000080782000008078200001003C400001003C4=
00001=0A=
003C400001001E400002001E800002001E800002000F800002000F800004000F000004000=
70000=0A=
04000700000C000700001C00020000FF80020000231F7D9E22>I<0001FC0000070700001C=
01C0=0A=
003000E000E0006001C000700380007007800038070000380E0000381E0000381C0000383=
C0000=0A=
383C00003878000078780000787800007878000078F00000F0F00000F0F00000E0F00001E=
0F000=0A=
01C0F00003C0700003807000070078000F0038001E0038003C001C0070000E00E00007838=
00001=0A=
FC00001D217A9F23>I<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C00=
3C00=0A=
3C003C003C003C0078007800780078007800F0007800E000F003C000F00F0000FFFC0000F=
00000=0A=
01E0000001E0000001E0000001E0000003C0000003C0000003C0000003C00000078000000=
78000=0A=
0007800000078000000F800000FFF000001E1F7D9E1F>I<01FFFF00001E03C0001E00E000=
1E00=0A=
70001E0078003C0078003C0078003C0078003C0078007800F0007800F0007801E0007801C=
000F0=0A=
070000F01E0000FFF00000F0380001E01C0001E01E0001E00E0001E00F0003C01E0003C01=
E0003=0A=
C01E0003C01E0007803C0007803C0807803C0807803C100F801C10FFF00C20000007C01D2=
07D9E=0A=
21>82 =
D<0007E040001C18C0003005800060038000C0038001C001800180010003800100038001=0A=
00038001000380000003C0000003C0000003F8000001FF800001FFE000007FF000001FF00=
00001=0A=
F800000078000000780000003800000038002000380020003800200030006000700060006=
00060=0A=
00E0007000C000E8038000C606000081F800001A217D9F1A>I<0FFFFFE01E0780C0180780=
4010=0A=
07804020078040200F0040600F0040400F0040400F0040801E0080001E0000001E0000001=
E0000=0A=
003C0000003C0000003C0000003C00000078000000780000007800000078000000F000000=
0F000=0A=
0000F0000000F0000001E0000001E0000001E0000001E0000003E00000FFFF00001B1F789=
E20>=0A=
I<7FFC1FF807C003C00780010007800100078001000F0002000F0002000F0002000F00020=
01E00=0A=
04001E0004001E0004001E0004003C0008003C0008003C0008003C0008007800100078001=
00078=0A=
00100078001000F0002000F0002000F0002000F0004000F00040007000800070010000300=
20000=0A=
380400000C18000007E000001D20779E22>I<FFF007FC0F8000E00F0000C00F0000800F00=
0100=0A=
0F0001000F0002000F0004000F0004000F800800078008000780100007802000078020000=
78040=0A=
000780400007808000078100000781000007C2000003C2000003C4000003C8000003C8000=
003D0=0A=
000003D0000003E0000003C0000003C000000380000001800000010000001E20779E22>I<=
FFF1=0A=
FFC0FF801F003E001C001F003C0018001F003C0010000F003C0010000F003C0020000F003=
C0020=0A=
000F003E0040000F003E00C0000F005E0080000F005E0100000F009E0100000F019E02000=
00F01=0A=
1E0200000F021E0400000F021E0400000F041E0800000F041E0800000F081E1000000F081=
E3000=0A=
000F101E2000000F101E4000000F201E4000000F601E8000000FC01E80000007801F00000=
00780=0A=
1F00000007001E00000007001E00000006000C00000006000800000004000800000029207=
79E2D=0A=
>I<00FFF07FE0000F801F00000F001C00000F801000000780300000078020000007C04000=
0003=0A=
C080000003C100000003E200000001E400000001EC00000001F800000000F000000000F80=
00000=0A=
00F800000000F8000000017C000000023C000000063C000000043E000000081E000000101=
E0000=0A=
00201F000000400F000000800F000001800F8000010007800007000780001F000FC000FFC=
07FF8=0A=
00231F7E9E22>I<FFF003FC1F8000E00F0000C00F800080078001000780020007C0040003=
C00C=0A=
0003C0080003E0100003E0200001E0400001F0400001F0800000F1000000FA000000FE000=
0007C=0A=
000000780000007800000070000000F0000000F0000000F0000000E0000001E0000001E00=
00001=0A=
E0000001E0000003C000003FFC00001E1F779E22>I<00F1800389C00707800E03801C0380=
3C03=0A=
80380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C4=
0308C=0A=
800F070013147C9317>97 =
D<07803F8007000700070007000E000E000E000E001C001C001CF01D=0A=
0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0=
01020=0A=
7B9F15>I<007E0001C1000300800E07801E07801C07003C0200780000780000780000F000=
00F0=0A=
0000F00000F00000F0000070010070020030040018380007C00011147C9315>I<00007800=
03F8=0A=
0000700000700000700000700000E00000E00000E00000E00001C00001C000F1C00389C00=
70780=0A=
0E03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F=
01C40=0A=
703C40705C40308C800F070015207C9F17>I<007C01C207010E011C013C013802780C79F0=
7E00=0A=
F000F000F000F0007000700170023804183807C010147C9315>I<00007800019C00033C00=
033C=0A=
000718000700000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C000=
01C00=0A=
00380000380000380000380000380000700000700000700000700000700000700000E0000=
0E000=0A=
00E00000E00000C00001C00001C0000180003180007B0000F300006600003C00001629829=
F0E>=0A=
I<003C6000E27001C1E00380E00700E00F00E00E01C01E01C01E01C01E01C03C03803C038=
03C03=0A=
803C03803C07003C07001C0F001C17000C2E0003CE00000E00000E00001C00001C00301C0=
07838=0A=
00F0700060E0003F8000141D7E9315>I<01E0000FE00001C00001C00001C00001C0000380=
0003=0A=
8000038000038000070000070000071E000763000E81800F01C00E01C00E01C01C03801C0=
3801C=0A=
03801C0380380700380700380700380E10700E20700C20701C20700C40E00CC0600700142=
07D9F=0A=
17>I<00C001E001E001C000000000000000000000000000000E0033002300438043004700=
8700=0A=
0E000E000E001C001C001C003840388030807080310033001C000B1F7C9E0E>I<00018000=
03C0=0A=
0003C0000380000000000000000000000000000000000000000000003C000046000087000=
08700=0A=
010700010700020E00000E00000E00000E00001C00001C00001C00001C000038000038000=
03800=0A=
00380000700000700000700000700000E00000E00030E00079C000F180006300003C00001=
22882=0A=
9E0E>I<01E0000FE00001C00001C00001C00001C000038000038000038000038000070000=
0700=0A=
000703C00704200E08E00E11E00E21E00E40C01C80001D00001E00001F800038E00038700=
03870=0A=
00383840707080707080707080703100E03100601E0013207D9F15>I<03C01FC003800380=
0380=0A=
038007000700070007000E000E000E000E001C001C001C001C00380038003800380070007=
00070=0A=
007100E200E200E200E200640038000A207C9F0C>I<1C0F80F0002630C318004740640C00=
4780=0A=
680E004700700E004700700E008E00E01C000E00E01C000E00E01C000E00E01C001C01C03=
8001C=0A=
01C038001C01C038001C01C0708038038071003803806100380380E100380380620070070=
06600=0A=
300300380021147C9325>I<1C0F802630C04740604780604700704700708E00E00E00E00E=
00E0=0A=
0E00E01C01C01C01C01C01C01C03843803883803083807083803107003303001C016147C9=
31A>=0A=
I<007C0001C3000301800E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C=
0F003=0A=
C0F00780F00700700F00700E0030180018700007C00013147C9317>I<01C1E00262180474=
1C04=0A=
781C04701E04701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01C038038078038=
07003=0A=
80E003C1C0072380071E000700000700000E00000E00000E00000E00001C00001C0000FFC=
00017=0A=
1D809317>I<00F0400388C00705800E03801C03803C0380380700780700780700780700F0=
0E00=0A=
F00E00F00E00F00E00F01C00F01C00703C00705C0030B8000F38000038000038000070000=
07000=0A=
00700000700000E00000E0000FFE00121D7C9315>I<1C1E00266100478380478780470780=
4703=0A=
008E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000=
07000=0A=
0030000011147C9313>I<00FC030206010C030C070C060C000F800FF007F803FC003E000E=
700E=0A=
F00CF00CE008401020601F8010147D9313>I<018001C0038003800380038007000700FFF0=
0700=0A=
0E000E000E000E001C001C001C001C003800380038003820704070407080708031001E000=
C1C7C=0A=
9B0F>I<0E00C03300E02301C04381C04301C04701C08703800E03800E03800E03801C0700=
1C07=0A=
001C07001C07101C0E20180E20180E201C1E200C264007C38014147C9318>I<0E03803307=
8023=0A=
07C04383C04301C04700C08700800E00800E00800E00801C01001C01001C01001C02001C0=
2001C=0A=
04001C04001C08000E300003C00012147C9315>I<0E00C1C03300E3C02301C3E04381C1E0=
4301=0A=
C0E04701C060870380400E0380400E0380400E0380401C0700801C0700801C0700801C070=
1001C=0A=
0701001C0602001C0F02000C0F04000E13080003E1F0001B147C931E>I<0383800CC44010=
68E0=0A=
1071E02071E02070C040E00000E00000E00000E00001C00001C00001C00001C040638080F=
38080=0A=
F38100E5810084C60078780013147D9315>I<0E00C03300E02301C04381C04301C04701C0=
8703=0A=
800E03800E03800E03801C07001C07001C07001C07001C0E00180E00180E001C1E000C3C0=
007DC=0A=
00001C00001C00003800F03800F07000E06000C0C0004380003E0000131D7C9316>I<FFFF=
F014=0A=
017C8C17>123 D E /FD 78 125 =
df<000FE0FE00007FF3FF0000F87F8F8001E0FF1F8003E0FE=0A=
1F8007C0FE1F8007C07E0F0007C03E000007C03E000007C03E000007C03E000007C03E000=
0FFFF=0A=
FFF000FFFFFFF00007C03E000007C03E000007C03E000007C03E000007C03E000007C03E0=
00007=0A=
C03E000007C03E000007C03E000007C03E000007C03E000007C03E000007C03E000007C03=
E0000=0A=
07C03E000007C03E00003FF9FFE0003FF9FFE0002120809F1E>11 =
D<000FE000007FF80000F81C=0A=
0001E07C0003E07C0007C07C0007C07C0007C0380007C0000007C0000007C0000007C1FE0=
0FFFF=0A=
FE00FFFFFE0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03=
E0007=0A=
C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E003FF9FFC03FF=
9FFC0=0A=
1A20809F1D>I<000FFE00007FFE0000F87E0001E0FE0003E0FE0007C07E0007C07E0007C0=
3E00=0A=
07C03E0007C03E0007C03E0007C03E00FFFFFE00FFFFFE0007C03E0007C03E0007C03E000=
7C03E=0A=
0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0007C03E0=
007C0=0A=
3E0007C03E0007C03E003FF9FFC03FF9FFC01A20809F1D>I<387CFEFEFEFEFE7C7C7C7C7C=
7C7C=0A=
3838383838383800000000387CFEFEFE7C3807207C9F10>33 =
D<387CFEFFFF7F3B030306060E0C=0A=
18702008107D9F0E>39 =
D<0018007000E001C00380038007000E000E001E001C003C003C007800=0A=
780078007800F800F000F000F000F000F000F000F000F000F000F80078007800780078003=
C003C=0A=
001C001E000E000E0007000380038001C000E0007000180D2D7DA114>I<C000700038001C=
000E=0A=
000E0007000380038003C001C001E001E000F000F000F000F000F80078007800780078007=
80078=0A=
00780078007800F800F000F000F000F001E001E001C003C00380038007000E000E001C003=
80070=0A=
00C0000D2D7DA114>I<387CFEFFFF7F3B030306060E0C18702008107D860E>44=0A=
D<FFF0FFF0FFF0FFF00C047F8B11>I<387CFEFEFE7C3807077D860E>I<0000600000E0000=
0E000=0A=
01C00001C0000380000380000380000700000700000700000E00000E00001C00001C00001=
C0000=0A=
380000380000380000700000700000E00000E00000E00001C00001C000038000038000038=
00007=0A=
00000700000700000E00000E00001C00001C00001C0000380000380000380000700000700=
000E0=0A=
0000E00000C00000132D7DA11A>I<01FC0007FF001F07C01E03C03E03E07C01F07C01F07C=
01F0=0A=
FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8F=
C01F8=0A=
7C01F07C01F07C01F03E03E01E03C01F8FC007FF0001FC00151D7E9C1A>I<00E00001E000=
0FE0=0A=
00FFE000F3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00=
003E0=0A=
0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000FFFF8=
0FFFF=0A=
80111D7C9C1A>I<07F0001FFE00383F007C1F80FE0FC0FE0FC0FE0FE0FE07E07C07E03807=
E000=0A=
0FE0000FC0000FC0001F80001F00003E0000780000F00000E00001C0000380600700600E0=
0601C=0A=
00E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131D7D9C1A>I<01FC0007FF000E0F801E0FC03F=
07E0=0A=
3F07E03F07E03F07E01E0FC0000FC0000F80001F0001FC0001FC00000F800007C00003E00=
003F0=0A=
0003F83803F87C03F8FE03F8FE03F8FE03F0FC03F07807E03C0FC01FFF8003FC00151D7E9=
C1A>=0A=
I<0001C00003C00007C00007C0000FC0001FC0003BC00073C00063C000C3C00183C00383C=
00703=0A=
C00E03C00C03C01803C03803C07003C0E003C0FFFFFEFFFFFE0007C00007C00007C00007C=
00007=0A=
C00007C000FFFE00FFFE171D7F9C1A>I<3803803FFF803FFF003FFE003FFC003FF0003F80=
0030=0A=
000030000030000030000033F80037FE003C1F00380F801007C00007C00007E00007E0780=
7E0FC=0A=
07E0FC07E0FC07E0FC07C0780FC0600F80381F001FFC0007F000131D7D9C1A>I<003F0001=
FFC0=0A=
07E0E00F81E01F03F01E03F03E03F07C03F07C01E07C0000FC1000FCFF00FDFFC0FD03E0F=
E01F0=0A=
FE01F0FC01F8FC01F8FC01F8FC01F87C01F87C01F87C01F83C01F03E01F01E03E00F07C00=
7FF80=0A=
01FE00151D7E9C1A>I<6000007FFFF87FFFF87FFFF07FFFE07FFFC0E00180C00300C00300=
C006=0A=
00000C0000180000380000380000780000700000F00000F00001F00001F00001F00001F00=
003F0=0A=
0003F00003F00003F00003F00003F00001E00000C000151E7D9D1A>I<01FC0007FF000F07=
801E=0A=
03C01C01E03C01E03C01E03E01E03F01E03FC3C01FE3801FFF000FFE0007FF8007FFC01FF=
FE03C=0A=
3FF0780FF07803F8F001F8F000F8F00078F00078F000707800707C00E03E03C00FFF8003F=
C0015=0A=
1D7E9C1A>I<01FC000FFF001F07803E03C07C03E07C01E0FC01F0FC01F0FC01F0FC01F8FC=
01F8=0A=
FC01F8FC01F87C03F87C03F83E05F81FFDF807F9F80041F80001F03C01F07E01F07E03E07=
E03E0=0A=
7E07C03C0780381F001FFC0007F000151D7E9C1A>I<387CFEFEFE7C38000000000000387C=
FEFE=0A=
FE7C3807147D930E>I<7FFFFFFF80FFFFFFFFC0FFFFFFFFC0000000000000000000000000=
0000=0A=
00000000000000000000000000000000000000000000000000000000000000FFFFFFFFC0F=
FFFFF=0A=
FFC07FFFFFFF80220F7D9229>61 =
D<07F8001FFE00381F80780F80FC0FC0FC0FC0FC0FC0780FC0=0A=
301F80001F00003E00007C0000700000E00000E00000C00000C00000C00000C00000C0000=
0C000=0A=
00000000000000000000000001C00003E00007F00007F00007F00003E00001C00012207D9=
F19>=0A=
63 =
D<0000C000000001E000000001E000000001E000000003F000000003F000000007F800000=
0=0A=
07F80000000FFC0000000CFC0000000CFC000000187E000000187E000000387F000000303=
F0000=0A=
00303F000000601F800000601F800000E01FC00000C00FC00000FFFFC00001FFFFE000018=
007E0=0A=
00038007F000030003F000030003F000060001F800060001F8000E0001FC00FFE01FFFC0F=
FE01F=0A=
FFC0221F7E9E27>65 =
D<FFFFFE00FFFFFFC007C007E007C003F007C001F807C001FC07C001FC07=0A=
C001FC07C001FC07C001FC07C001F807C003F807C007F007C00FE007FFFF8007FFFFC007C=
003F0=0A=
07C001F807C001FC07C000FC07C000FE07C000FE07C000FE07C000FE07C000FE07C000FC0=
7C001=0A=
FC07C003F807C007F0FFFFFFE0FFFFFF001F1F7E9E25>I<0007FC02003FFF0E00FE03DE03=
F000=0A=
FE07E0003E0FC0001E1F80001E3F00000E3F00000E7F0000067E0000067E000006FE00000=
0FE00=0A=
0000FE000000FE000000FE000000FE000000FE0000007E0000007E0000067F0000063F000=
0063F=0A=
00000C1F80000C0FC0001807E0003803F0007000FE01C0003FFF800007FC001F1F7D9E26>=
I<FF=0A=
FFFE0000FFFFFFC00007E007F00007E001F80007E000FC0007E0007E0007E0003F0007E00=
03F00=0A=
07E0001F8007E0001F8007E0001F8007E0001FC007E0001FC007E0001FC007E0001FC007E=
0001F=0A=
C007E0001FC007E0001FC007E0001FC007E0001FC007E0001F8007E0001F8007E0001F800=
7E000=0A=
3F0007E0003F0007E0007E0007E000FC0007E001F80007E007F000FFFFFFC000FFFFFE000=
0221F=0A=
7E9E28>I<FFFFFFE0FFFFFFE007E007E007E001E007E000E007E0006007E0007007E00030=
07E0=0A=
003007E0603007E0603007E0600007E0E00007E1E00007FFE00007FFE00007E1E00007E0E=
00007=0A=
E0600007E0600C07E0600C07E0000C07E0001807E0001807E0001807E0003807E0007807E=
000F8=0A=
07E003F0FFFFFFF0FFFFFFF01E1F7E9E22>I<FFFFFFE0FFFFFFE007E007E007E001E007E0=
00E0=0A=
07E0006007E0007007E0003007E0003007E0603007E0603007E0600007E0E00007E1E0000=
7FFE0=0A=
0007FFE00007E1E00007E0E00007E0600007E0600007E0600007E0000007E0000007E0000=
007E0=0A=
000007E0000007E0000007E0000007E00000FFFF8000FFFF80001C1F7E9E21>I<0007FC02=
0000=0A=
3FFF0E0000FE03DE0003F000FE0007E0003E000FC0001E001F80001E003F00000E003F000=
00E00=0A=
7F000006007E000006007E00000600FE00000000FE00000000FE00000000FE00000000FE0=
00000=0A=
00FE003FFFE0FE003FFFE07E00007E007E00007E007F00007E003F00007E003F00007E001=
F8000=0A=
7E000FC0007E0007E0007E0003F000FE0000FE01FE00003FFF8E000007FC0600231F7D9E2=
9>I<=0A=
FFFF0FFFF0FFFF0FFFF007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E=
0007E=0A=
0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007FFFFFE000=
7FFFF=0A=
FE0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0=
007E0=0A=
007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E00FFFF0FFFF0FFFF0FF=
FF024=0A=
1F7E9E29>I<FFFFFFFF07E007E007E007E007E007E007E007E007E007E007E007E007E007=
E007=0A=
E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101F7E9E14>I<03=
FFFC=0A=
03FFFC000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00=
00FC0=0A=
000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0100FC07C0FC0FE0FC0FE0FC0F=
E0F80=0A=
FC1F80783F003FFE000FF000161F7F9E1B>I<FFFF00FFE0FFFF00FFE007E0001E0007E000=
1800=0A=
07E000300007E000600007E001C00007E003800007E006000007E00C000007E018000007E=
03000=0A=
0007E0F0000007E1F8000007E3F8000007E6FC000007EC7E000007F87F000007F03F00000=
7E01F=0A=
800007E00FC00007E00FE00007E007E00007E003F00007E001F80007E000FC0007E000FC0=
007E0=0A=
007E0007E0007F00FFFF03FFF0FFFF03FFF0241F7E9E29>I<FFFF8000FFFF800007E00000=
07E0=0A=
000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00=
00007=0A=
E0000007E0000007E0000007E0000007E0000007E0000007E000C007E000C007E000C007E=
001C0=0A=
07E001C007E001C007E0038007E0038007E00F8007E01F80FFFFFF80FFFFFF801A1F7E9E1=
F>I<=0A=
FFE000003FF8FFF000007FF807F000007F0006F80000DF0006F80000DF0006F80000DF000=
67C00=0A=
019F00067C00019F00063E00031F00063E00031F00061F00061F00061F00061F00060F800=
C1F00=0A=
060F800C1F000607C0181F000607C0181F000607C0181F000603E0301F000603E0301F000=
601F0=0A=
601F000601F0601F000600F8C01F000600F8C01F0006007D801F0006007D801F0006003F0=
01F00=0A=
06003F001F0006003F001F0006001E001F00FFF01E03FFF8FFF00C03FFF82D1F7E9E32>I<=
FFE0=0A=
00FFF0FFF000FFF007F000060007F800060006FC000600067E000600063F000600063F800=
60006=0A=
1F800600060FC006000607E006000603F006000601F806000601FC06000600FC060006007=
E0600=0A=
06003F060006001F860006001FC60006000FE600060007E600060003F600060001FE00060=
000FE=0A=
00060000FE000600007E000600003E000600001E000600000E00FFF0000600FFF00006002=
41F7E=0A=
9E29>I<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F0000FC7F=
0000=0A=
FE7E00007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007=
FFE00=0A=
007FFE00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F8001F80FC003F007E00=
7E001=0A=
F81F8000FFFF00001FF800201F7D9E27>I<FFFFFE00FFFFFF8007E00FE007E003F007E001=
F807=0A=
E001F807E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E001F807E003F007E=
00FE0=0A=
07FFFF8007FFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E000000=
7E000=0A=
0007E0000007E0000007E0000007E00000FFFF0000FFFF00001E1F7E9E24>I<001FF80000=
FFFF=0A=
0001F81F8007E007E00FC003F01F8001F81F8001F83F0000FC7F0000FE7F0000FE7E00007=
EFE00=0A=
007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007F7E000=
07E7E=0A=
00007E7F0000FE3F0000FC3F87C1FC1F8FE1F80FD833F007F81FE001F81F8000FFFF00001=
FFE03=0A=
00000E0300000F0700000FFF000007FF000007FE000007FE000003FC000001F8000000F02=
0287D=0A=
9E27>I<FFFFF80000FFFFFF000007E01FC00007E007E00007E003F00007E003F00007E003=
F800=0A=
07E003F80007E003F80007E003F80007E003F00007E003F00007E007E00007E01FC00007F=
FFF00=0A=
0007FFFC000007E03E000007E01F000007E00F800007E00F800007E00FC00007E00FC0000=
7E00F=0A=
C00007E00FE00007E00FE00007E00FE00007E00FE03007E007F03007E003F860FFFF01FFC=
0FFFF=0A=
007F80241F7E9E27>I<03FC080FFF381E03F83800F8700078700038F00038F00018F00018=
F800=0A=
00FC00007FC0007FFE003FFF801FFFC00FFFF007FFF000FFF80007F80000FC00007C00003=
CC000=0A=
3CC0003CC0003CE00038E00078F80070FE01E0E7FFC081FF00161F7D9E1D>I<7FFFFFFC7F=
FFFF=0A=
FC7C07E07C7007E01C6007E00C6007E00CE007E00EC007E006C007E006C007E006C007E00=
60007=0A=
E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E=
00000=0A=
07E0000007E0000007E0000007E0000007E0000007E0000007E00003FFFFC003FFFFC01F1=
E7E9D=0A=
24>I<FFFF01FFE0FFFF01FFE007E0000C0007E0000C0007E0000C0007E0000C0007E0000C=
0007=0A=
E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E00=
00C00=0A=
07E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E=
0000C=0A=
0007E0000C0003E000180001F000180001F000300000F8006000007E03C000001FFF80000=
003FC=0A=
0000231F7E9E28>I<FFFE007FF0FFFE007FF007E000070007E000060007F0000E0003F000=
0C00=0A=
03F8000C0001F800180001F800180000FC00300000FC00300000FE007000007E006000007=
F0060=0A=
00003F00C000003F00C000001F818000001F818000001FC38000000FC30000000FE700000=
007E6=0A=
00000007E600000003FC00000003FC00000001F800000001F800000001F800000000F0000=
00000=0A=
F000000000600000241F7F9E27>I<FFFE0FFFC0FFE0FFFE0FFFC0FFE00FC000FC000E000F=
E000=0A=
FC000E0007E000FE000C0007E000FE000C0003F000FE00180003F001FF00180003F001BF0=
01800=0A=
01F801BF00300001F8031F80300001FC031F80700000FC031F80600000FC060FC06000007=
E060F=0A=
C0C000007E0E0FE0C000007E0C07E0C000003F0C07E18000003F1803F18000003F9803F38=
00000=0A=
1F9803F30000001FB001FB0000000FF001FE0000000FF001FE0000000FE000FE00000007E=
000FC=0A=
00000007C0007C00000007C0007C00000003C000780000000380003800000001800030000=
0331F=0A=
7F9E36>I<FFFE007FF0FFFE007FF00FE000070007F0000E0003F8000C0003F800180001FC=
0038=0A=
0000FE00300000FE006000007F00E000003F80C000003F818000001FC38000000FE300000=
00FE6=0A=
00000007FE00000003FC00000003F800000001F800000001F800000001F800000001F8000=
00001=0A=
F800000001F800000001F800000001F800000001F800000001F800000001F80000003FFFC=
00000=0A=
3FFFC000241F7F9E27>89 =
D<FEFEFEE0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0=0A=
E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0FEFEFE072D7BA10E>91 =
D<FEFEFE0E0E0E0E0E0E0E0E0E0E=0A=
0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0EFEFEFE072D7FA10=
E>93=0A=
D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007FFE01F03E03E03E=
07C03=0A=
E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F9319>97 =
D<FF0000FF00001F0000=0A=
1F00001F00001F00001F00001F00001F00001F00001F00001F00001F1FC01F7FF01FE0F81=
F807C=0A=
1F007E1F003E1F003E1F003F1F003F1F003F1F003F1F003F1F003F1F003E1F003E1F007C1=
F807C=0A=
1EC1F81C7FE0181F8018207E9F1D>I<01FE0007FF801F0FC03E0FC03E0FC07C0FC07C0300=
FC00=0A=
00FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F81C007FF0001FC0=
01314=0A=
7E9317>I<0007F80007F80000F80000F80000F80000F80000F80000F80000F80000F80000=
F800=0A=
00F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00F8FC00F8FC00F8FC0=
0F8FC=0A=
00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E9F1D>I<01FE0007FF800F=
83C0=0A=
1E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00003=
E0018=0A=
1E00180F807007FFE000FF8015147F9318>I<001F8000FFC001F3E003E7E003C7E007C7E0=
07C3=0A=
C007C00007C00007C00007C00007C000FFFC00FFFC0007C00007C00007C00007C00007C00=
007C0=0A=
0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0003FFC003FFC0=
01320=0A=
7F9F10>I<01FC3C07FFFE0F079E1E03DE3E03E03E03E03E03E03E03E03E03E01E03C00F07=
800F=0A=
FF0009FC001800001800001C00001FFF800FFFF007FFF81FFFFC3C007C70003EF0001EF00=
01EF0=0A=
001E78003C78003C3F01F80FFFE001FF00171E7F931A>I<FF0000FF00001F00001F00001F=
0000=0A=
1F00001F00001F00001F00001F00001F00001F00001F0FC01F3FE01F61F01FC0F81F80F81=
F00F8=0A=
1F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8F=
FE3FF=0A=
FFE3FF18207D9F1D>I<1C003E007F007F007F003E001C00000000000000000000000000FF=
00FF=0A=
001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE=
00B21=0A=
7EA00E>I<0038007C00FE00FE00FE007C003800000000000000000000000001FE01FE003E=
003E=0A=
003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E3=
03E78=0A=
3EFC3CFC7C78783FF01FC00F2A83A010>I<FF0000FF00001F00001F00001F00001F00001F=
0000=0A=
1F00001F00001F00001F00001F00001F01FE1F01FE1F00F01F00C01F03801F07001F0C001=
F1800=0A=
1F7C001FFC001F9E001F0F001E0F801E07C01E03C01E01E01E01F01E00F8FFC3FFFFC3FF1=
8207E=0A=
9F1C>I<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F=
001F=0A=
001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B207E9F0E>I<FE=
0FE0=0A=
3F80FE1FF07FC01E70F9C3E01E407D01F01E807E01F01F807E01F01F007C01F01F007C01F=
01F00=0A=
7C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C0=
1F01F=0A=
007C01F01F007C01F0FFE3FF8FFEFFE3FF8FFE27147D932C>I<FE0FC0FE3FE01E61F01EC0=
F81E=0A=
80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F0=
0F81F=0A=
00F8FFE3FFFFE3FF18147D931D>I<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC=
007E=0A=
FC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF001=
7147F=0A=
931A>I<FF1FC0FF7FF01FE1F81F80FC1F007E1F007E1F003E1F003F1F003F1F003F1F003F=
1F00=0A=
3F1F003F1F003E1F007E1F007C1F80FC1FC1F81F7FE01F1F801F00001F00001F00001F000=
01F00=0A=
001F00001F0000FFE000FFE000181D7E931D>I<01F81807FE381F87783F01F83E01F87E00=
F87C=0A=
00F8FC00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87E00F87E00F83F01F81F87F80FF=
EF803=0A=
F8F80000F80000F80000F80000F80000F80000F80000F80007FF0007FF181D7E931C>I<FE=
3C00=0A=
FEFF001EDF801F9F801F9F801F1F801F06001F00001F00001F00001F00001F00001F00001=
F0000=0A=
1F00001F00001F00001F0000FFF000FFF00011147E9315>I<0FE63FFE701E600EE006E006=
F800=0A=
FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>I<01800180=
0180=0A=
03800380038007800F803F80FFFCFFFC0F800F800F800F800F800F800F800F800F800F800=
F860F=0A=
860F860F860F8607CC03F801F00F1D7F9C14>I<FF07F8FF07F81F00F81F00F81F00F81F00=
F81F=0A=
00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F01F81F01F80F06F807F=
CFF03=0A=
F8FF18147D931D>I<FFE07F80FFE07F801F001C000F8018000F80180007C0300007C03000=
03E0=0A=
600003E0600001F0C00001F0C00001F9C00000F9800000FF8000007F0000007F0000003E0=
00000=0A=
3E0000001C0000001C000019147F931C>I<FFE7FE1FE0FFE7FE1FE01F00F003001F00F803=
000F=0A=
80F806000F80F8060007C1BC0C0007C1BC0C0007C1BE0C0003E31E180003E31E180001F60=
F3000=0A=
01F60F300001F60FB00000FC07E00000FC07E000007803C000007803C000007803C000003=
00180=0A=
0023147F9326>I<FFE1FF00FFE1FF000F80700007C0E00007E0C00003E1800001F3800000=
FF00=0A=
00007E0000003E0000003F0000007F8000006F800000C7C0000183E0000381F0000701F80=
00E00=0A=
FC00FF81FF80FF81FF8019147F931C>I<FFE07F80FFE07F801F001C000F8018000F801800=
07C0=0A=
300007C0300003E0600003E0600001F0C00001F0C00001F9C00000F9800000FF8000007F0=
00000=0A=
7F0000003E0000003E0000001C0000001C0000001800000018000078300000FC300000FC6=
00000=0A=
C0E00000E1C000007F8000001E000000191D7F931C>I<3FFFE03FFFE03C07C0380F80701F=
8060=0A=
3F00603E00607C0000F80001F80003F00003E06007C0600F80601F80E03F00C03E01C07C0=
3C0FF=0A=
FFC0FFFFC013147F9317>I<FFFFFF80FFFFFF801902808C1A>I<FFFFFFFFFFFFE0FFFFFFF=
FFFFF=0A=
E03302808C34>I E /FE 88 126 =
df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8700000000000=0A=
70F8F8F870051C779B18>33 =
D<4010E038F078E038E038E038E038E038E038E038E038E038E038=0A=
60300D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FFFFE0FF=
FFE0=0A=
7FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07FFFC01E3C001=
E3C00=0A=
1E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C00001C00001C00003F000=
0FFC=0A=
003FFE007DCF0071C700E1C380E1C780E1C780E1C780F1C00079C0003DC0001FE0000FF80=
003FC=0A=
0001DE0001CF0001C70061C380F1C380F1C380E1C380E1C70071C70079DE003FFE001FF80=
007E0=0A=
0001C00001C00001C00000C00011247D9F18>I<3803007C07807C0780EE0F80EE0F00EE0F=
00EE=0A=
1F00EE1E00EE1E00EE3E007C3C007C3C00387C0000780000780000F80000F00001F00001E=
00001=0A=
E00003E00003C00003C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0=
EE03E=0A=
0EE03C07C03C07C018038013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C=
3800=0A=
1C38001C73F01C73F01CE3F00FE3800FC7000F87000F07001F0E003F0E007B8E0073DC00E=
1DC00=0A=
E0F800E0F800E07070E0787070FC707FFFE03FCFE00F03C0141C7F9B18>I<007000F001E0=
03C0=0A=
07800F001E001C00380038007000700070007000E000E000E000E000E000E000E000E0007=
00070=0A=
0070007000380038001C001E000F00078003C001F000F000700C24799F18>40=0A=
D<6000F00078003C001E000F000780038001C001C000E000E000E000E0007000700070007=
00070=0A=
00700070007000E000E000E000E001C001C0038007800F001E003C007800F00060000C247=
C9F18=0A=
>I<01C00001C00001C00001C000C1C180F1C780F9CF807FFF001FFC0007F00007F0001FFC=
007F=0A=
FF00F9CF80F1C780C1C18001C00001C00001C00001C00011147D9718>I<00600000F00000=
F000=0A=
00F00000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F0000=
0F000=0A=
00F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C788518>I=
<7FFF=0A=
00FFFF80FFFF807FFF0011047D8F18>I<3078FCFC78300606778518>I<000300000780000=
78000=0A=
0F80000F00001F00001E00001E00003E00003C00007C0000780000780000F80000F00001F=
00001=0A=
E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E00003E00003C0=
0003C=0A=
00007C0000780000F80000F00000F0000060000011247D9F18>I<01F00007FC000FFE001F=
1F00=0A=
1C07003803807803C07001C07001C0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E=
000E0=0A=
E000E0F001E07001C07001C07803C03803801C07001F1F000FFE0007FC0001F000131C7E9=
B18>=0A=
I<01800380038007800F803F80FF80FB80438003800380038003800380038003800380038=
00380=0A=
0380038003800380038003807FFCFFFE7FFC0F1C7B9B18>I<03F0000FFE003FFF007C0F80=
7003=0A=
C0E001C0F000E0F000E06000E00000E00000E00001C00001C00003C0000780000F00001E0=
0003C=0A=
0000780000F00001E00007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>=
I<07=0A=
F8001FFE003FFF007807807803C07801C03001C00001C00003C0000380000F0003FF0003F=
E0003=0A=
FF000007800003C00001C00000E00000E00000E0F000E0F000E0F001C0F003C07C07803FF=
F001F=0A=
FE0003F800131C7E9B18>I<001F00003F0000770000770000E70001E70001C70003870007=
8700=0A=
0707000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FFFFF80007000007000=
00700=0A=
000700000700000700007FF000FFF8007FF0151C7F9B18>I<1FFF803FFF803FFF80380000=
3800=0A=
003800003800003800003800003800003800003BF8003FFE003FFF003C07801803C00001C=
00000=0A=
E00000E06000E0F000E0F000E0E001C07003C07C0F803FFF001FFC0003F000131C7E9B18>=
I<00=0A=
7E0001FF0007FF800F83C01E03C01C03C0380180380000700000700000E1F800E7FE00FFF=
F00FE=0A=
0780F803C0F001C0F000E0E000E0F000E07000E07000E07000E03801C03C03C01E07800FF=
F0007=0A=
FE0001F800131C7E9B18>I<E00000FFFFE0FFFFE0FFFFE0E003C0E00780000700000E0000=
1E00=0A=
001C0000380000380000700000700000E00000E00000E00001C00001C00001C00001C0000=
3C000=0A=
038000038000038000038000038000038000038000131D7E9C18>I<03F8000FFE001FFF00=
3E0F=0A=
803803807001C07001C07001C07001C03803803C07801FFF0007FC000FFE001F1F003C078=
07001=0A=
C0F001E0E000E0E000E0E000E0E000E07001C07803C03E0F801FFF000FFE0003F800131C7=
E9B18=0A=
>I<03F0000FFC001FFE003C0F00780780700380E001C0E001C0E001C0E001E0E001E07001=
E078=0A=
03E03C0FE01FFFE00FFEE003F0E00000E00001C00001C00001C0300380780780780F00783=
E003F=0A=
FC001FF00007C000131C7E9B18>I<3078FCFC783000000000000000003078FCFC78300614=
7793=0A=
18>I<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A789318>I<000=
30000=0A=
0780001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000FC00007E0=
0003F=0A=
00001FC00007E00003F00001FC00007E00003F00001F8000078000030011187D9918>I<7F=
FFC0=0A=
FFFFE0FFFFE0FFFFE0000000000000000000000000FFFFE0FFFFE0FFFFE07FFFC0130C7E9=
318>=0A=
I<600000F00000FC00007E00003F00001FC00007E00003F00001FC00007E00003F00001F8=
0001F=0A=
80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000F0000060000011187=
D9918=0A=
>I<007C0001FE0007FF000F87801E03C03C1DC0387FC070FFE071E3E071C1E0E1C1E0E380=
E0E3=0A=
80E0E380E0E380E0E380E0E380E0E1C1C071C1C071E3C070FF80387F003C1C001E00E00F8=
3E007=0A=
FFC001FF80007E00131C7E9B18>64 =
D<00700000F80000F80000D80000D80001DC0001DC0001DC=0A=
00018C00038E00038E00038E00038E000306000707000707000707000707000FFF800FFF8=
00FFF=0A=
800E03800E03801C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>I<FFFC00FFFF00FFFF=
801C=0A=
03C01C01C01C00E01C00E01C00E01C00E01C01E01C01C01C07C01FFF801FFF001FFFC01C0=
3C01C=0A=
00E01C00F01C00701C00701C00701C00701C00F01C00E01C03E0FFFFC0FFFF80FFFE00141=
C7F9B=0A=
18>I<00F8E003FEE007FFE00F07E01E03E03C01E03800E07000E07000E0700000E00000E0=
0000=0A=
E00000E00000E00000E00000E00000E000007000007000E07000E03800E03C00E01E01C00=
F07C0=0A=
07FF8003FE0000F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03C01C03C01C01E0=
1C00=0A=
E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00701C00701C00F01C00E=
01C00=0A=
E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B18>I<FFFFF0FFFFF0FFFF=
F01C=0A=
00701C00701C00701C00701C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0=
E001C=0A=
0E001C0E001C00001C00001C00381C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8151=
C7F9B=0A=
18>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C00001C1C001C1C001C=
1C00=0A=
1FFC001FFC001FFC001C1C001C1C001C1C001C00001C00001C00001C00001C00001C00001=
C0000=0A=
FFC000FFC000FFC000131C7E9B18>I<01F1C003FDC00FFFC01F0FC01C03C03803C03801C0=
7001=0A=
C07001C0700000E00000E00000E00000E00000E00000E00FF0E01FF0E00FF07001C07001C=
07003=0A=
C03803C03803C01C07C01F0FC00FFFC003FDC001F1C0141C7E9B18>I<7F07F0FF8FF87F07=
F01C=0A=
01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01FFFC01FFFC01FFFC01C0=
1C01C=0A=
01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C07F07F0FF8FF87F07F0151=
C7F9B=0A=
18>I<7FFF00FFFF807FFF0001C00001C00001C00001C00001C00001C00001C00001C00001=
C000=0A=
01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0000=
1C000=0A=
7FFF00FFFF807FFF00111C7D9B18>I<01FFC003FFC001FFC0000E00000E00000E00000E00=
000E=0A=
00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0=
0000E=0A=
00000E00F00E00F00E00F03C007FFC003FF0000FC000121C7D9B18>I<7F07F0FF87F87F07=
F01C=0A=
03C01C07801C07001C0E001C1E001C3C001C38001C70001CF0001DF0001DF0001FB8001FB=
8001F=0A=
1C001E1C001C0E001C0E001C07001C07001C03801C03801C01C07F03F0FF87F87F03F0151=
C7F9B=0A=
18>I<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E00000E=
0000=0A=
0E00000E00000E00000E00000E00000E00000E00000E00000E00700E00700E00700E00700=
E0070=0A=
7FFFF0FFFFF07FFFF0141C7F9B18>I<FC01F8FE03F8FE03F83B06E03B06E03B06E03B06E0=
3B8E=0A=
E03B8EE0398CE0398CE039DCE039DCE039DCE038D8E038D8E038F8E03870E03870E03800E=
03800=0A=
E03800E03800E03800E03800E0FE03F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07=
F01D=0A=
81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C3=
1C01C=0A=
39C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151=
C7F9B=0A=
18>I<0FF8003FFE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E0=
0380=0A=
E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380F007807007007=
80F00=0A=
7FFF003FFE000FF800111C7D9B18>I<FFFE00FFFF80FFFFC01C03C01C01E01C00E01C0070=
1C00=0A=
701C00701C00701C00701C00E01C01E01C03C01FFFC01FFF801FFE001C00001C00001C000=
01C00=0A=
001C00001C00001C00001C0000FF8000FF8000FF8000141C7F9B18>I<0FF8003FFE007FFF=
0078=0A=
0F00700700F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00=
380E0=0A=
0380E00380E00380E00380E1E380E1E380F0E78070F700787F007FFF003FFE000FFC00001=
C0000=0A=
1E00000E00000F0000070000070011227D9B18>I<7FF800FFFE007FFF001C0F801C03801C=
03C0=0A=
1C01C01C01C01C01C01C03C01C03801C0F801FFF001FFE001FFE001C0F001C07001C03801=
C0380=0A=
1C03801C03801C03801C039C1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>I<03F380=
1FFF=0A=
803FFF807C0F80700780E00380E00380E00380E000007000007800003F00001FF00007FE0=
000FF=0A=
00000F800003C00001C00000E00000E06000E0E000E0E001E0F001C0F80780FFFF80FFFE0=
0E7F8=0A=
00131C7E9B18>I<7FFFF8FFFFF8FFFFF8E07038E07038E07038E070380070000070000070=
0000=0A=
7000007000007000007000007000007000007000007000007000007000007000007000007=
00000=0A=
700000700007FF0007FF0007FF00151C7F9B18>I<FF83FEFF83FEFF83FE1C00701C00701C=
0070=0A=
1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701=
C0070=0A=
1C00701C00701C00700E00E00F01E00783C003FF8001FF00007C00171C809B18>I<FF07F8=
FF07=0A=
F8FF07F81C01C01C01C01C01C01C01C00E03800E03800E03800E03800F078007070007070=
00707=0A=
00070700038E00038E00038E00038E00018C0001DC0001DC0001DC0000D80000F80000F80=
00070=0A=
00151C7F9B18>I<FE03F8FE03F8FE03F87000707000707000703800E03800E03800E03800=
E038=0A=
00E038F8E038F8E039DCE039DCE019DCC019DCC019DCC0198CC01D8DC01D8DC01D8DC01D8=
DC00D=0A=
8D800D05800F07800F07800E0380151C7F9B18>I<7F8FE07F9FE07F8FE00E07000F070007=
0E00=0A=
078E00039C0003DC0001F80001F80000F00000F00000700000F00000F80001F80001DC000=
39E00=0A=
038E00070F000707000E07800E03801E03C07F07F0FF0FF87F07F0151C7F9B18>I<FF07F8=
FF07=0A=
F8FF07F81C01C01E03C00E03800F0780070700070700038E00038E0001DC0001DC0001DC0=
000F8=0A=
0000F80000700000700000700000700000700000700000700000700000700001FC0003FE0=
001FC=0A=
00151C7F9B18>I<3FFFE07FFFE07FFFE07001C07003C0700780700700000F00001E00001C=
0000=0A=
3C0000780000700000F00001E00001C00003C0000780000700000F00001E00E01C00E03C0=
0E078=0A=
00E07000E0FFFFE0FFFFE0FFFFE0131C7E9B18>I<FFF8FFF8FFF8E000E000E000E000E000=
E000=0A=
E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E=
000E0=0A=
00E000E000E000E000FFF8FFF8FFF80D24779F18>I<600000F00000F00000F80000780000=
7C00=0A=
003C00003C00003E00001E00001F00000F00000F00000F800007800007C00003C00003C00=
003E0=0A=
0001E00001F00000F00000F800007800007800007C00003C00003E00001E00001E00001F0=
0000F=0A=
00000F8000078000078000030011247D9F18>I<FFF8FFF8FFF80038003800380038003800=
3800=0A=
3800380038003800380038003800380038003800380038003800380038003800380038003=
80038=0A=
0038003800380038FFF8FFF8FFF80D247F9F18>I<7FFF00FFFF80FFFF807FFF0011047D7F=
18>=0A=
95 =
D<1FE0003FF8007FFC00781E00300E0000070000070000FF0007FF001FFF007F070078070=
0=0A=
E00700E00700E00700F00F00781F003FFFF01FFBF007E1F014147D9318>97=0A=
D<7E0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1E=
00F80=0A=
E00F00700E00700E00380E00380E00380E00380E00380E00380F00700F00700F80E00FC1E=
00FFF=0A=
C00EFF80063E00151C809B18>I<01FE0007FF001FFF803E0780380300700000700000E000=
00E0=0A=
0000E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC00121=
47D93=0A=
18>I<001F80003F80001F8000038000038000038000038000038003E3800FFB801FFF803C=
1F80=0A=
380F80700780700380E00380E00380E00380E00380E00380E00380700780700780380F803=
C1F80=0A=
1FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380=
E001=0A=
C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF8007FF0001FC0=
01214=0A=
7D9318>I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007FFFC0FFFFC0FFFF=
C001=0A=
C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C=
00001=0A=
C0007FFF007FFF007FFF00131C7F9B18>I<01E1F007FFF80FFFF81E1E301C0E0038070038=
0700=0A=
3807003807003807001C0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03=
FFFE0=0A=
7801F0700070E00038E00038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9=
318>=0A=
I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C=
00F80=0A=
E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E=
07FC3=0A=
FCFFE7FE7FC3FC171C809B18>I<03800007C00007C00007C0000380000000000000000000=
0000=0A=
00007FC000FFC0007FC00001C00001C00001C00001C00001C00001C00001C00001C00001C=
00001=0A=
C00001C00001C00001C00001C000FFFF00FFFF80FFFF00111D7C9C18>I<0038007C007C00=
7C00=0A=
3800000000000000000FFC1FFC0FFC001C001C001C001C001C001C001C001C001C001C001=
C001C=0A=
001C001C001C001C001C001C001C001C001C001C6038F078FFF07FE03F800E277E9C18>I<=
FE00=0A=
00FE0000FE00000E00000E00000E00000E00000E00000E3FF00E7FF00E3FF00E07800E0F0=
00E1E=0A=
000E3C000E78000EF0000FF8000FFC000F9C000F0E000E0F000E07000E03800E03C0FFC7F=
8FFC7=0A=
F8FFC7F8151C7F9B18>I<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E0=
0000=0A=
E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E=
00000=0A=
E00000E00000E0007FFFC0FFFFE07FFFC0131C7E9B18>I<7CE0E000FFFBF8007FFFF8001F=
1F1C=0A=
001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C0=
01C1C=0A=
1C001C1C1C001C1C1C001C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FE=
FF80=0A=
7FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00=
E00E0=0A=
0E00E00E00E07FC3FCFFE7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F80380380=
7001=0A=
C07001C0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF0=
00FFE=0A=
0001F00013147E9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00=
380E=0A=
00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E0=
0000E=0A=
00000E00000E00000E00000E00007FC000FFE0007FC000151E809318>I<01E38007FB801F=
FF80=0A=
3E1F80380F80700780700780E00380E00380E00380E00380E00380E003807007807007803=
80F80=0A=
3C1F801FFF800FFB8003E380000380000380000380000380000380000380000380003FF80=
03FF8=0A=
003FF8151E7E9318>I<7F87E0FF9FF07FBFF803F87803F03003E00003C00003C000038000=
0380=0A=
000380000380000380000380000380000380000380007FFE00FFFF007FFE0015147F9318>=
I<07=0A=
F7003FFF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003FE00001F00600=
780E0=0A=
0380E00380F00380F80F00FFFF00FFFC00E7F00011147D9318>I<01800003800003800003=
8000=0A=
0380007FFFC0FFFFC0FFFFC00380000380000380000380000380000380000380000380000=
38000=0A=
0380400380E00380E00380E001C1C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE0=
7E07=0A=
E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E=
00E01=0A=
E00F03E007FFFC03FFFE01FCFC1714809318>I<7F8FF0FF8FF87F8FF01E03C00E03800E03=
800E=0A=
0380070700070700070700038E00038E00038E00038E0001DC0001DC0001DC0000F80000F=
80000=0A=
700015147F9318>I<FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01C=
F9C0=0A=
1CF9C01CD9C01CD9C00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>I<=
7F8F=0A=
F07F9FF07F8FF0070700078E00039E0001DC0001F80000F80000700000F00000F80001DC0=
0039E=0A=
00038E000707000F07807F8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01=
C00E=0A=
03800E0380070380070700070700038700038600038E0001CE0001CE0000CC0000CC0000D=
C0000=0A=
780000780000780000700000700000700000F00000E00079E0007BC0007F80003F00001E0=
00015=0A=
1E7F9318>I<3FFFF07FFFF07FFFF07001E07003C0700780000F00001E00003C0000F80001=
F000=0A=
03C0000780000F00701E00703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0=
001F=0A=
E0007FE000780000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00=
000E0=0A=
0001E0007FC000FF8000FF80007FC00001E00000E00000E00000E00000E00000E00000E00=
000E0=0A=
0000E00000E00000E00000E000007800007FE0001FE00007E013247E9F18>I<7C0000FF00=
00FF=0A=
C00003C00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E=
00000=0A=
F000007FC0003FE0003FE0007FC000F00000E00000E00000E00000E00000E00000E00000E=
00000=0A=
E00000E00000E00000E00003C000FFC000FF00007C000013247E9F18>125=0A=
D E /FF 41 122 =
df<0000F000F8F001F8F003F8F00780000700000F00000F00000F00000F0000=0A=
0F00000F00000F0000FFF8F0FFF8F0FFF8F00F00F00F00F00F00F00F00F00F00F00F00F00=
F00F0=0A=
0F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F0142180A018>12=0A=
D<787878781830306060E0050A7D830D>44 =
D<FFC0FFC0FFC00A037F8B0F>I<F0F0F0F004047C=0A=
830D>I<F0F0F0F0000000000000000000000000F0F0F0F004147C930D>58=0A=
D<001F0000001F0000003F8000003B8000003B8000007BC0000073C0000071C00000F1E00=
000E1=0A=
E00000E0E00001E0F00001E0F00001C0F00003C0780003C078000380780007803C0007803=
C0007=0A=
003C000FFFFE000FFFFE000FFFFE001E000F001E000F003C000F803C0007803C000780780=
007C0=0A=
780003C0780003C0F00003E01B207F9F1E>65 =
D<FFFFC0FFFFC0FFFFC0F00000F00000F00000F0=0A=
0000F00000F00000F00000F00000F00000F00000F00000FFFF80FFFF80FFFF80F00000F00=
000F0=0A=
0000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFFE0FFFFE0FFF=
FE013=0A=
207B9F1B>69 =
D<F00078F00078F00078F00078F00078F00078F00078F00078F00078F00078F000=0A=
78F00078F00078F00078FFFFF8FFFFF8FFFFF8F00078F00078F00078F00078F00078F0007=
8F000=0A=
78F00078F00078F00078F00078F00078F00078F00078F0007815207B9F20>72=0A=
D<F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F004207C9=
F0D>=0A=
I<003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003=
C003C=0A=
003C003C003C003C003C003C003C003C003CC078E078FFF07FE00FC00E217E9F15>I<F000=
3EF0=0A=
007CF000F8F001F0F003E0F007C0F00780F00F00F01F00F03E00F07C00F0F800F1F000F3F=
800F3=0A=
F800F7FC00FFBC00FF1E00FE1F00FC0F00F80780F00780F003C0F003E0F001E0F000F0F00=
0F8F0=0A=
0078F0003CF0003CF0001EF0001F18207B9F20>I<F00000F00000F00000F00000F00000F0=
0000=0A=
F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F=
00000=0A=
F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFF80FFFF80F=
FFF80=0A=
11207B9F19>I<F80001F8FC0003F8FC0003F8F4000378F6000778F6000778F6000778F300=
0E78=0A=
F3000E78F3000E78F3801E78F3801E78F1801C78F1C03C78F1C03C78F0C03878F0C03878F=
0E078=0A=
78F0E07878F0607078F070F078F070F078F030E078F039E078F039E078F019C078F019C07=
8F019=0A=
C078F00F8078F00F8078F00F8078F00000781D207B9F28>I<003F000000FFC00003FFF000=
07E1=0A=
F8000F807C001F003E001E001E003C000F003C000F00780007807800078078000780F0000=
3C0F0=0A=
0003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F80007C0780=
00780=0A=
78000780780007803C000F003C000F001E001E001F003E000F807C0007E1F80003FFF0000=
0FFC0=0A=
00003F00001A227DA021>79 =
D<FFF800FFFF00FFFF80F00FC0F003E0F001E0F000F0F000F0F000=0A=
F0F000F0F000F0F000F0F000F0F001E0F003E0F00FC0FFFF80FFFF00FFF800F00000F0000=
0F000=0A=
00F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000014207B9F1D>=
I<01=0A=
FC0007FF800FFFC01F03C03C00C03C00007800007800007800007800007800007C00003C0=
0003F=0A=
00001FE0000FFC0007FE0001FF00003F800007C00003C00003E00001E00001E00001E0000=
1E000=0A=
01E00001C0C003C0F007C0FC0F807FFF001FFE0003F80013227EA019>83=0A=
D<FFFFFFC0FFFFFFC0FFFFFFC0001E0000001E0000001E0000001E0000001E0000001E000=
0001E=0A=
0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0=
00000=0A=
1E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001=
E0000=0A=
001E0000001E0000001E00001A207E9F1F>I<07E03FF87FFC701E401F000F000F000F003F=
07FF=0A=
1FFF7E0FF80FF00FF00FF00FF83F7FFF3FEF1F8F10147E9316>97 =
D<F00000F00000F00000F000=0A=
00F00000F00000F00000F00000F00000F00000F00000F00000F1F000F7FC00FFFE00FC3E0=
0F80F=0A=
00F00F00F00780F00780F00780F00780F00780F00780F00780F00F00F00F00F81F00FC3E0=
0FFFC=0A=
00F7F800F1E00011207D9F17>I<03F00FFC1FFE3E0E3C0278007800F000F000F000F000F0=
00F0=0A=
00780078003C013E0F1FFF0FFE03F010147E9314>I<000780000780000780000780000780=
0007=0A=
8000078000078000078000078000078000078007C7800FF7801FFF803E1F807C078078078=
0F807=0A=
80F00780F00780F00780F00780F00780F00780F00780780780780F803E1F801FFF800FF78=
007C7=0A=
8011207E9F17>I<03F0000FFC001FFE003E1F003C0700780700700380FFFF80FFFF80FFFF=
80F0=0A=
0000F00000F000007000007800003C01003E07001FFF0007FE0001F80011147F9314>I<00=
7E01=0A=
FE03FE078007000F000F000F000F000F000F000F00FFF0FFF0FFF00F000F000F000F000F0=
00F00=0A=
0F000F000F000F000F000F000F000F000F000F000F000F20809F0E>I<03E0F00FFFF01FFF=
F03E=0A=
3E003C1E00780F00780F00780F00780F00780F003C1E003E3E001FFC003FF80033E000300=
00038=0A=
00003FFE003FFF801FFFC03FFFE07803F0F000F0F000F0F000F0F801F07E07E03FFFC00FF=
F0003=0A=
FC00141E7F9317>I<F000F000F000F000F000F000F000F000F000F000F000F000F1F8F3FC=
F7FE=0A=
FC1FF80FF80FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F10207=
D9F17=0A=
>I<F0F0F0F00000000000000000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F004207D=
9F0B>=0A=
I<F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000=
0F01F=0A=
00F01E00F03C00F07800F0F000F1E000F3C000F78000FFC000FFC000FFE000F9F000F8F00=
0F0F8=0A=
00F07C00F07C00F03E00F01E00F01F00F00F8011207D9F16>107 =
D<F0F0F0F0F0F0F0F0F0F0F0=0A=
F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F004207D9F0B>I<F0FC07E0F3FE1FF0F7=
FF3F=0A=
F8FE0F7078F807C03CF807C03CF007803CF007803CF007803CF007803CF007803CF007803=
CF007=0A=
803CF007803CF007803CF007803CF007803CF007803CF007803CF007803C1E147D9325>I<=
F1F8=0A=
F3FCF7FEFC1FF80FF80FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF=
00F10=0A=
147D9317>I<01F80007FE001FFF803F0FC03C03C07801E07801E0F000F0F000F0F000F0F0=
00F0=0A=
F000F0F000F07801E07801E03C03C03F0FC01FFF8007FE0001F80014147F9317>I<F1F000=
F7FC=0A=
00FFFE00FC3E00F81F00F00F00F00F80F00780F00780F00780F00780F00780F00780F00F0=
0F00F=0A=
00F81F00FC3E00FFFC00F7F800F1E000F00000F00000F00000F00000F00000F00000F0000=
0F000=0A=
00F00000111D7D9317>I<03C7800FF7801FFF803E1F807C0F80780780780780F00780F007=
80F0=0A=
0780F00780F00780F00780F807807807807C0F803E1F801FFF800FF78007C780000780000=
78000=0A=
0780000780000780000780000780000780000780111D7E9317>I<F0E0F3E0F7E0FF00FC00=
FC00=0A=
F800F800F000F000F000F000F000F000F000F000F000F000F000F0000B147D9310>I<07F0=
1FFC=0A=
3FFC780C7800780078007C003FC01FF00FF803F8007C003C003CC03CF07CFFF87FF00FC00=
E147F=0A=
9311>I<1E001E001E001E001E001E00FFF0FFF0FFF01E001E001E001E001E001E001E001E=
001E=0A=
001E001E001E001E001E201FF00FF007C00C1A7F9910>I<F00FF00FF00FF00FF00FF00FF0=
0FF0=0A=
0FF00FF00FF00FF00FF00FF00FF00FF01FF03FFFFF7FEF3F0F10147D9317>I<F003C0F003=
C078=0A=
03807807807807803C0F003C0F003C0F001E0E001E1E001E1E000F1C000F3C000F3C00073=
80007=0A=
380007B80003F00003F00001E00012147F9315>I<F01F00F0F01F80F0F01F80F0781B81E0=
783B=0A=
81E0783BC1E07839C1E03C31C3C03C71C3C03C71E3C01C70E3801E60E7801E60E7801EE0E=
7800E=0A=
E077000EC077000EC0770007C07E0007C03E0007803E001C147F931F>I<7801E07C03C03E=
0780=0A=
1E0F000F0F00079E0003FC0003F80001F80000F00001F00001F80003FC00079E000F0F000=
E0F00=0A=
1E07803C03C07801E0F801F01414809315>I<F003C0F003C07807807807807C07803C0F00=
3C0F=0A=
001E0F001E1E000E1E000F1C000F1C00073C0007380003B80003B80003B00001F00001F00=
000E0=0A=
0000E00001C00001C00003C0000380000780007F00007E00007C0000121D7F9315>I=0A=
E /FG 9 122 df<FFFFFFC0FFFFFFC01A027C8B23>0 =
D<01800180018001800180C183F18F399C=0A=
0FF003C003C00FF0399CF18FC1830180018001800180018010147D9417>3=0A=
D<0001FE00000007FF8000001E01E000007800780000E0001C00018000060003000003000=
60000=0A=
01800C000000C00C000000C01800000060300000003030000000303000000030600000001=
86000=0A=
0000186000000018C00000000CC00000000CC00000000CC00000000CC00000000CC000000=
00CC0=0A=
0000000CC00000000CC00000000C600000001860000000186000000018300000003030000=
00030=0A=
300000003018000000600C000000C00C000000C006000001800300000300018000060000E=
0001C=0A=
000078007800001E01E0000007FF80000001FE0000262B7DA02D>13 =
D<03C00FF01FF83FFC7FFE=0A=
7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003C010127D9317>15=0A=
D<C0000000F00000003C0000000F00000003C0000000F0000000380000000E00000007800=
00001=0A=
E0000000780000001E0000000780000001C00000078000001E00000078000001E00000078=
00000=0A=
0E00000038000000F0000003C000000F0000003C00000070000000C000000000000000000=
00000=0A=
00000000000000000000000000000000000000007FFFFF80FFFFFFC01A247C9C23>21=0A=
D<00000C00000C0000180000180000300000300000600000600000C00000C000018000018=
00001=0A=
80000300000300000600000600000C00000C0000180000180000300000300000600000600=
000C0=0A=
0000C0000180000180000300000300000600000600000600000C00000C000018000018000=
03000=0A=
00300000600000600000C00000400000162C7AA000>54 =
D<004000C00180018001800300030003=0A=
000600060006000C000C00180018001800300030003000600060006000C000C0006000600=
06000=0A=
3000300030001800180018000C000C0006000600060003000300030001800180018000C00=
0400A=0A=
2E7CA112>104 =
D<C000C0006000600060003000300030001800180018000C000C000600060006=0A=
0003000300030001800180018000C000C00180018001800300030003000600060006000C0=
00C00=0A=
180018001800300030003000600060006000C000C0000A2E7DA112>I<0200070007000700=
0700=0A=
0700070002000200020002007270FFF872700200020002000700070007000700070007000=
70007=0A=
00070007000700070007000700070007000700070002000200020002000200020002000D2=
A7D9F=0A=
14>121 D E /FH 90 125 =
df<003F07C000E0DC6001C0F0F00381F0F00701E0600700E0000700=0A=
E0000700E0000700E0000700E0000700E0000700E000FFFFFF000700E0000700E0000700E=
00007=0A=
00E0000700E0000700E0000700E0000700E0000700E0000700E0000700E0000700E000070=
0E000=0A=
0700E0000700E0000700E0000700E0000700E0007FC3FE001C20809F1A>11=0A=
D<003F0000E0C001C0C00381E00701E00701E007000007000007000007000007000007000=
0FFFF=0A=
E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E=
00700=0A=
E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000E0E001C1E00381=
E007=0A=
00E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E00700E0070=
0E007=0A=
00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070=
0E007=0A=
00E07FE7FE1720809F19>I<001F81F80000F04F040001C07C06000380F80F000300F00F00=
0700=0A=
F00F00070070000007007000000700700000070070000007007000000700700000FFFFFFF=
F0007=0A=
0070070007007007000700700700070070070007007007000700700700070070070007007=
00700=0A=
0700700700070070070007007007000700700700070070070007007007000700700700070=
07007=0A=
00070070070007007007007FE3FE3FF02420809F26>I<70F8F8F8F8F8F8F8707070707070=
7070=0A=
70702020202020000000000070F8F8F87005217CA00D>33 =
D<7038F87CFC7EFC7E743A04020402=0A=
04020804080410081008201040200F0E7E9F17>I<0080008007E00C981084208260824081=
C087=0A=
C08FC08FC086E080F08078803F803FE01FF807FC00FE009E008E00870087F083F083F0838=
08380=0A=
8240864084208818B007C000800080008010257DA117>36 =
D<0078000000840000018400000302=0A=
0000070200000702000007020000070200000704000007040000070800000708000003100=
00003=0A=
A00FFC03C001E0038001C001C0008001C0010003E0010004E0020008F0020018700400307=
80800=0A=
70380800701C1000F01E1000F00E2000F0074000F003C0087001C0087801E010380670101=
C1838=0A=
6007E00F801E227EA023>38 =
D<70F8FCFC74040404080810102040060E7C9F0D>I<0020004000=0A=
800100020006000C000C00180018003000300030007000600060006000E000E000E000E00=
0E000=0A=
E000E000E000E000E000E000E0006000600060007000300030003000180018000C000C000=
60002=0A=
0001000080004000200B2E7DA112>I<800040002000100008000C00060006000300030001=
8001=0A=
80018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000C=
000C0=0A=
00C001C001800180018003000300060006000C00080010002000400080000B2E7DA112>I<=
0006=0A=
0000000600000006000000060000000600000006000000060000000600000006000000060=
00000=0A=
060000000600000006000000060000FFFFFFF0FFFFFFF0000600000006000000060000000=
60000=0A=
0006000000060000000600000006000000060000000600000006000000060000000600000=
00600=0A=
001C1E7D9923>43 =
D<70F8FCFC74040404080810102040060E7C840D>I<FFC0FFC00A027F8A0F>=0A=
I<70F8F8F87005057C840D>I<000100030003000600060006000C000C000C001800180018=
0030=0A=
0030003000600060006000C000C000C00180018001800300030003000600060006000C000=
C000C=0A=
00180018001800300030003000600060006000C000C000C000102D7DA117>I<03F0000E1C=
001C=0A=
0E00180600380700700380700380700380700380F003C0F003C0F003C0F003C0F003C0F00=
3C0F0=0A=
03C0F003C0F003C0F003C0F003C0F003C0F003C0700380700380700380780780380700180=
6001C=0A=
0E000E1C0003F000121F7E9D17>I<018003800F80F3800380038003800380038003800380=
0380=0A=
038003800380038003800380038003800380038003800380038003800380038007C0FFFE0=
F1E7C=0A=
9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C0=
0007=0A=
C0000780000780000F00000E00001C0000380000700000600000C00001800003000006004=
00C00=0A=
401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F=
8078=0A=
0780780780380F80000F80000F00000F00000E00001C0000380003F000003C00000E00000=
F0000=0A=
07800007800007C02007C0F807C0F807C0F807C0F00780400780400F00200E001C3C0003F=
00012=0A=
1F7E9D17>I<000600000600000E00000E00001E00002E00002E00004E00008E00008E0001=
0E00=0A=
020E00020E00040E00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E000=
00E00=0A=
000E00000E00000E00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF800=
1FE0=0A=
0010000010000010000010000010000010000011F000161C00180E0010070010078000038=
00003=0A=
800003C00003C00003C07003C0F003C0F003C0E00380400380400700200600100E000C380=
003E0=0A=
00121F7E9D17>I<007C000182000701000E03800C07801C07803803003800007800007000=
0070=0A=
0000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C0700=
3C070=0A=
03C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07F=
FF80=0A=
7FFF804001008002008002008004000008000008000010000020000020000040000040000=
0C000=0A=
00C00001C0000180000380000380000380000380000780000780000780000780000780000=
78000=0A=
078000030000121F7D9D17>I<03F0000C0C00100600300300200180600180600180600180=
7001=0A=
807803003E03003F06001FC8000FF00003F80007FC000C7E00103F00300F806003804001C=
0C001=0A=
C0C000C0C000C0C000C0C000806001802001001002000C0C0003F000121F7E9D17>I<03F0=
000E=0A=
18001C0C00380600380700700700700380F00380F00380F003C0F003C0F003C0F003C0F00=
3C070=0A=
07C07007C03807C0180BC00E13C003E3C0000380000380000380000700300700780600780=
E0070=0A=
0C002018001070000FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F8=
7005=0A=
147C930D>I<70F8F8F8700000000000000000000070F0F8F878080808101010202040051D=
7C93=0A=
0D>I<7FFFFFE0FFFFFFF00000000000000000000000000000000000000000000000000000=
0000=0A=
00000000FFFFFFF07FFFFFE01C0C7D9023>61 =
D<07000F800F800F800700000000000000000000=0A=
000200020002000200020002000600060004000C001C00380078007000F018F03CF03CF01=
CF008=0A=
701838200FC00E207D9615>I<0FC0307040384038E03CF03CF03C603C0038007000E000C0=
0180=0A=
0180010003000200020002000200020002000000000000000000000007000F800F800F800=
7000E=0A=
207D9F15>I<001F800000E0700001000800060006000800010008000100100F00802030C0=
4020=0A=
60404040C0202041C01C2041C01C2081801C1083801C1083801C1083801C1083801C10838=
01C10=0A=
83801C1081801C1041C01C1041C01C1040C03C2020605C202030CC40100F0780080000000=
80000=0A=
0006000070010001C000E01F00001FF0001C207D9F23>I<00010000000380000003800000=
0380=0A=
000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F00=
00020=0A=
7800002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE0001000=
F0001=0A=
000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F2=
07F9F=0A=
22>I<FFFFE0000F80380007801E0007801F0007800F0007800F8007800F8007800F800780=
0F80=0A=
07800F8007800F0007801F0007801E0007803C0007FFF00007803C0007801E0007800F000=
7800F=0A=
8007800780078007C0078007C0078007C0078007C0078007C00780078007800F8007800F0=
00780=0A=
1F000F803C00FFFFF0001A1F7E9E20>I<000FC040007030C001C009C0038005C0070003C0=
0E00=0A=
01C01E0000C01C0000C03C0000C07C0000407C00004078000040F8000000F8000000F8000=
000F8=0A=
000000F8000000F8000000F8000000F8000000F8000000780000007C0000407C0000403C0=
00040=0A=
1C0000401E0000800E000080070001000380020001C0040000703800000FC0001A217D9F2=
1>I<=0A=
FFFFE0000F803C0007801E000780070007800380078003C0078001E0078001E0078001F00=
78000=0A=
F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F=
80780=0A=
00F8078000F0078000F0078000F0078001E0078001E0078003C0078003800780070007800=
E000F=0A=
803C00FFFFE0001D1F7E9E23>I<FFFFFF000F800F00078003000780030007800100078001=
8007=0A=
8000800780008007800080078080800780800007808000078080000781800007FF8000078=
18000=0A=
0780800007808000078080000780800007800020078000200780002007800040078000400=
78000=0A=
40078000C0078000C0078001800F800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F0007=
8003=0A=
0007800300078001000780018007800080078000800780008007800080078080000780800=
00780=0A=
8000078080000781800007FF8000078180000780800007808000078080000780800007800=
00007=0A=
8000000780000007800000078000000780000007800000078000000FC00000FFFE0000191=
F7E9E=0A=
1E>I<000FE0200078186000E004E0038002E0070001E00F0000E01E0000601E0000603C00=
0060=0A=
3C0000207C00002078000020F8000000F8000000F8000000F8000000F8000000F8000000F=
80000=0A=
00F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E0001E01E0001E00F0001E=
00700=0A=
01E0038002E000E0046000781820000FE0001E217D9F24>I<FFF8FFF80F800F8007800F00=
0780=0A=
0F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800=
F0007=0A=
800F0007FFFF0007800F0007800F0007800F0007800F0007800F0007800F0007800F00078=
00F00=0A=
07800F0007800F0007800F0007800F0007800F0007800F000F800F80FFF8FFF81D1F7E9E2=
2>I<=0A=
FFFC0FC007800780078007800780078007800780078007800780078007800780078007800=
78007=0A=
800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>I<0FFF80007C0000=
3C00=0A=
003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C000=
03C00=0A=
003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C00F83C00F038004=
07800=0A=
40700030E0000F800011207E9E17>I<FFFC0FFC0FC003E007800180078001000780020007=
8004=0A=
000780080007801000078020000780400007808000078100000783000007878000078F800=
00793=0A=
C0000791E00007A1E00007C0F0000780F0000780780007803C0007803C0007801E0007801=
E0007=0A=
800F000780078007800780078007C00FC007E0FFFC3FFC1E1F7E9E23>I<FFFE000FC00007=
8000=0A=
0780000780000780000780000780000780000780000780000780000780000780000780000=
78000=0A=
07800007800007800007800007800207800207800207800207800607800407800407800C0=
7801C=0A=
0F807CFFFFFC171F7E9E1C>I<FF80001FF80F80001F800780001F0005C0002F0005C0002F=
0005=0A=
C0002F0004E0004F0004E0004F000470008F000470008F000470008F000438010F0004380=
10F00=0A=
0438010F00041C020F00041C020F00041C020F00040E040F00040E040F00040E040F00040=
7080F=0A=
000407080F000407080F000403900F000403900F000401E00F000401E00F000401E00F000=
E00C0=0A=
0F001F00C01F80FFE0C1FFF8251F7E9E2A>I<FF803FF807C007C007C0038005E0010005E0=
0100=0A=
04F001000478010004780100043C0100043C0100041E0100040F0100040F0100040781000=
40781=0A=
000403C1000401E1000401E1000400F1000400F1000400790004003D0004003D0004001F0=
00400=0A=
1F0004000F0004000700040007000E0003001F000300FFE001001D1F7E9E22>I<001F8000=
00F0=0A=
F00001C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E078000=
1E078=0A=
0001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80=
001F0=0A=
780001E07C0003E07C0003E03C0003C03C0003C01E0007800E0007000F000F0007801E000=
1C038=0A=
0000F0F000001F80001C217D9F23>I<FFFFE0000F80780007801C0007801E0007800F0007=
800F=0A=
8007800F8007800F8007800F8007800F8007800F8007800F0007801E0007801C000780780=
007FF=0A=
E000078000000780000007800000078000000780000007800000078000000780000007800=
00007=0A=
8000000780000007800000078000000FC00000FFFC0000191F7E9E1F>I<001F800000F0F0=
0001=0A=
C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E07C0003E0780=
001E0=0A=
F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F07=
80001=0A=
E0780001E07C0003E03C0003C03C0F03C01E1087800E2047000F204F0007A03E0001E0380=
000F0=0A=
F010001FB01000003010000038300000387000003FF000001FE000001FE000000FC000000=
7801C=0A=
297D9F23>I<FFFF80000F80F0000780780007803C0007801E0007801E0007801F0007801F=
0007=0A=
801F0007801F0007801E0007801E0007803C00078078000780F00007FF80000781C000078=
0E000=0A=
0780F0000780700007807800078078000780780007807C0007807C0007807C0007807C040=
7807E=0A=
0407803E040FC01E08FFFC0F10000003E01E207E9E21>I<07E0800C198010078030038060=
0180=0A=
600180E00180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE000=
3FF00=0A=
001F800007800003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F=
00600=0A=
CE0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030=
800F=0A=
0010800F0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F0=
00000=0A=
0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000=
F0000=0A=
000F0000000F0000000F0000001F800007FFFE001C1F7E9E21>I<FFFC3FF80FC007C00780=
0380=0A=
0780010007800100078001000780010007800100078001000780010007800100078001000=
78001=0A=
0007800100078001000780010007800100078001000780010007800100078001000780010=
00780=0A=
010007800100038002000380020001C0020001C0040000E008000070180000382000000FC=
0001D=0A=
207E9E22>I<FFF003FE1F8000F80F0000600F800060078000400780004003C0008003C000=
8003=0A=
C0008001E0010001E0010001F0010000F0020000F0020000F806000078040000780400003=
C0800=0A=
003C0800003C0800001E1000001E1000001F3000000F2000000F20000007C0000007C0000=
007C0=0A=
00000380000003800000038000000100001F207F9E22>I<FFF07FF81FF01F800FC007C00F=
0007=0A=
8003800F00078001000F0007C00100078007C00200078007C00200078007C0020003C009E=
00400=0A=
03C009E0040003C009E0040003E010F00C0001E010F0080001E010F0080001E0207808000=
0F020=0A=
78100000F02078100000F0403C10000078403C20000078403C20000078C03E2000003C801=
E4000=0A=
003C801E4000003C801E4000001F000F8000001F000F8000001F000F8000001E000780000=
00E00=0A=
070000000E00070000000C000300000004000200002C207F9E2F>I<7FF81FF80FE00FC007=
C007=0A=
0003C0020001E0040001F00C0000F0080000781000007C1000003C2000003E4000001E400=
0000F=0A=
8000000F8000000780000003C0000007E0000005E0000009F0000018F8000010780000207=
C0000=0A=
603C0000401E0000801F0001800F0001000780020007C0070003C01F8007E0FFE01FFE1F1=
F7F9E=0A=
22>I<FFF003FF1F8000F80F8000600780004007C0004003E0008001E0008001F0010000F0=
0300=0A=
00F80200007C0400003C0400003E0800001E0800001F1000000FB0000007A0000007C0000=
003C0=0A=
000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C00=
00003=0A=
C0000007C000007FFE00201F7F9E22>I<7FFFF87C00F87000F06001E04001E0C003C0C003=
C080=0A=
0780800F80800F00001E00001E00003C00003C0000780000F80000F00001E00001E00003C=
00403=0A=
C0040780040F80040F000C1E000C1E00083C00183C0018780038F801F8FFFFF8161F7D9E1=
C>I<=0A=
FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C=
0C0C0=0A=
C0C0C0C0FEFE072D7CA10D>I<080410082010201040204020804080408040B85CFC7EFC7E=
7C3E=0A=
381C0F0E7B9F17>I<FEFE0606060606060606060606060606060606060606060606060606=
0606=0A=
06060606060606060606060606FEFE072D7FA10D>I<081020204040808080B8FCFC7C3806=
0E7D=0A=
9F0D>96 =
D<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E001E0E0038=0A=
0E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>I<0E0000FE=
0000=0A=
0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000EC3800=
F01C0=0A=
0F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00700E00700=
E00E0=0A=
0F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C70007000F000F000=
F000=0A=
F000F000F00070007000380138011C020E0C03F010147E9314>I<000380003F8000038000=
0380=0A=
00038000038000038000038000038000038000038000038003E380061B801C07803803803=
80380=0A=
700380700380F00380F00380F00380F00380F00380F003807003807003803803803807801=
C0780=0A=
0E1B8003E3F815207E9F19>I<03F0000E1C001C0E00380700380700700700700380F00380=
F003=0A=
80FFFF80F00000F00000F000007000007000003800801800801C010007060001F80011147=
F9314=0A=
>I<007C00C6018F038F07060700070007000700070007000700FFF0070007000700070007=
0007=0A=
000700070007000700070007000700070007000700070007007FF01020809F0E>I<0000E0=
03E3=0A=
300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E380033E00=
02000=0A=
002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C00030C0003=
06000=0A=
603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E00000E00000E00=
000E=0A=
00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C00E01C00E0=
1C00E=0A=
01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC162=
07F9F=0A=
19>I<1C003E003E003E001C000000000000000000000000000E007E000E000E000E000E00=
0E00=0A=
0E000E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C>I<00E001F0=
01F0=0A=
01F000E0000000000000000000000000007007F000F000700070007000700070007000700=
07000=0A=
700070007000700070007000700070007000700070007000706070F060F0C061803F000C2=
8829E=0A=
0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E=
0000=0A=
0E0FF00E03C00E03000E02000E04000E08000E10000E30000E70000EF8000F38000E1C000=
E1E00=0A=
0E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E000E=
000E=0A=
000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0=
00E00=0A=
0E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E81C81C000F=
00F0=0A=
0E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E0=
00E00=0A=
E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00=
E00FF=0A=
E7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C00E01C00E01=
C00E=0A=
01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16147F931=
9>I<=0A=
01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F=
000F0=0A=
7000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FEC3800F01C0=
0F00=0A=
E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E00F00E00E=
00F01=0A=
E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE00=
0151D=0A=
7F9319>I<03E0800619801C05803C0780380380780380700380F00380F00380F00380F003=
80F0=0A=
0380F003807003807803803803803807801C0B800E138003E380000380000380000380000=
38000=0A=
0380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E000E000E00=
0E00=0A=
0E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030704030C010=
C010=0A=
C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D147E9312>I<=
0200=0A=
02000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E000E000E000=
E000E=0A=
080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E01C00E01C0=
0E01=0A=
C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E03C00603C=
0030D=0A=
C001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E00800701000701000382=
0003=0A=
820003820001C40001C40001EC0000E80000E80000700000700000700000200015147F931=
8>I<=0A=
FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C0400707C0800704C0800=
704E0=0A=
80038861000388710003C8730001D0320001D03A0000F03C0000E01C0000E01C000060180=
00040=0A=
08001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000E40000EC0000780000=
3800=0A=
003C00007C00004E000087000107000303800201C00601E01E01E0FF03FE1714809318>I<=
FF83=0A=
F81E01E01C00C00E00800E00800E008007010007010003820003820003820001C40001C40=
001EC=0A=
0000E80000E800007000007000007000002000002000004000004000004000F08000F0800=
0F100=0A=
006200003C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E001C0038007=
8007=0A=
010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC1601808C17>I<FFFFFFFFFFF=
02C01=0A=
808C2D>I E /FI 19 121 df<F8F8F8F8F8383070706060E0050C7AA911>39=0A=
D<0001FF00000FFFE0003FFFFC007FFFFE00FE01FE01F8003E03F0000C07C000000FC0000=
01F80=0A=
00001F0000003F0000003E0000007E0000007C0000007C0000007C000000F8000000F8000=
000F8=0A=
000000F8000000F8000000F8000000F8000000F8001FFEF8001FFEF8001FFE7C001FFE7C0=
0003E=0A=
7C00003E7E00003E3E00003E3F00003E1F00003E1F80003E0FC0003E07C0003E03F0003E0=
1F800=0A=
3E00FE00FE007FFFFE003FFFFC000FFFE00001FF001F2C7CAA28>71 =
D<F800003EF800003EF800=0A=
003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF8000=
03EF8=0A=
00003EF800003EF800003EF800003EF800003EF800003EFFFFFFFEFFFFFFFEFFFFFFFEFFF=
FFFFE=0A=
F800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF=
80000=0A=
3EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003=
EF800=0A=
003E1F2A7BA92A>I<F800003F80F800007F00F80000FE00F80001FC00F80003F800F80007=
F000=0A=
F8000FE000F8001FC000F8003F8000F8007F0000F800FE0000F801FC0000F803F80000F80=
3F000=0A=
00F807E00000F80FC00000F81F800000F83F800000F87FC00000F8FFE00000F9FBE00000F=
BF3F0=0A=
0000FFE1F80000FFC0F80000FF807C0000FF007E0000FE003E0000FC001F0000F8001F800=
0F800=0A=
0F8000F80007C000F80007E000F80003E000F80001F000F80001F800F80000FC00F800007=
C00F8=0A=
00007E00F800003F00F800001F00F800000F80F800000FC0222A7BA92A>75=0A=
D<F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000=
0F800=0A=
00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000=
0F800=0A=
00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000=
0FFFF=0A=
FFFFFFFFFFFFFFFFFFFF182A7BA920>I<FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0=
0000=0A=
F800000000F800000000F800000000F800000000F800000000F800000000F800000000F80=
00000=0A=
00F800000000F800000000F800000000F800000000F800000000F800000000F800000000F=
80000=0A=
0000F800000000F800000000F800000000F800000000F800000000F800000000F80000000=
0F800=0A=
000000F800000000F800000000F800000000F800000000F800000000F800000000F800000=
000F8=0A=
00000000F800000000F800000000F800000000F800000000F800000000F80000242A7EA92=
9>84=0A=
D<01FE000FFF803FFFC03FFFE03C03F03001F00001F80000F80000F80000F80000F80000F=
8007F=0A=
F807FFF81FFFF83FE0F87F00F8FC00F8F800F8F800F8F800F8FC01F87E07F87FFFF83FFFF=
81FFC=0A=
F807E0F8151B7E9A1D>97 =
D<007FC001FFF007FFFC0FFFFC1FC07C1F00083E00007C00007C0000=0A=
7C0000F80000F80000F80000F80000F80000F80000F800007C00007C00007E00003E00001=
F000C=0A=
1FC07C0FFFFC07FFFC01FFF0007F80161B7E9A1B>99 =
D<00003E00003E00003E00003E00003E00=0A=
003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00FC3E03FF3E07F=
FFE0F=0A=
FFFE1FC1FE3F007E3E003E7C003E7C003EFC003EF8003EF8003EF8003EF8003EF8003EF80=
03EF8=0A=
003EFC003E7C003E7C003E3E007E3F00FE1FC1FE0FFFFE07FFBE03FF3E00FC3E172A7EA91=
F>I<=0A=
007E0003FF8007FFC00FFFE01F83F03F00F03E00787C00787C003878003CFFFFFCFFFFFCF=
FFFFC=0A=
FFFFFCF80000F80000F800007800007C00007C00003E00003F000C1FC07C0FFFFC07FFFC0=
1FFF0=0A=
007F80161B7E9A1B>I<F80000F80000F80000F80000F80000F80000F80000F80000F80000=
F800=0A=
00F80000F80000F80000F80000F80000F83F80F8FFE0F9FFF0FBFFF8FF81F8FE00FCFE007=
CFC00=0A=
7CFC007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007=
CF800=0A=
7CF8007CF8007CF8007CF8007CF8007CF8007C162A7CA91F>104 =
D<F8F8F8F8F8000000000000=0A=
00000000F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8052A7CA90E>=
I<F8=0A=
0000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80=
000F8=0A=
0000F80000F800FCF801F8F803F0F807E0F80FC0F81F80F83F00F87E00F87C00F8F800F9F=
000FB=0A=
F800FFFC00FFFC00FF7E00FE3F00FC3F00FC1F80F80F80F80FC0F807E0F807E0F803F0F80=
1F8F8=0A=
01F8F800FCF8007E172A7CA91D>107 =
D<F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8=0A=
F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8052A7CA90E>I<F83F80F8FFE0F9FFF0FB=
FFF8=0A=
FF81F8FE00FCFE007CFC007CFC007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF=
8007C=0A=
F8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007C161B7C9A1F>11=
0=0A=
D<F83CF8FCF9FCFBFCFFE0FF80FF00FE00FC00FC00FC00F800F800F800F800F800F800F80=
0F800=0A=
F800F800F800F800F800F800F800F8000E1B7C9A14>114 =
D<03FC001FFF803FFFC07FFFC07C07=0A=
C0F80080F80000F80000F80000FC00007F80007FF8003FFE001FFF0007FF8000FFC0000FE=
00007=0A=
E00003E00003E04003E0E007E0FC0FC0FFFFC07FFF801FFE0003F800131B7E9A17>I<F800=
7CF8=0A=
007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF8007CF80=
07CF8=0A=
007CF8007CF8007CF8007CF8007CF8007CF800FCF801FCFC07FCFFFFFC7FFF7C3FFC7C1FE=
07C16=0A=
1B7C9A1F>117 =
D<7C000FC03E001F803F001F001F803E000F807C0007C0FC0003E0F80001F1F0=0A=
0001FBE00000FFC000007FC000003F8000001F0000001F0000003F8000007FC00000FBC00=
000F3=0A=
E00001F1F00003E0F80007C07C000F807C000F803E001F001F003E000F807E000FC0FC000=
7E01B=0A=
1B809A1C>120 D E end=0A=
%%EndProlog=0A=
%%BeginSetup=0A=
%%Feature: *Resolution 300dpi=0A=
TeXDict begin=0A=
=0A=
%%EndSetup=0A=
%%Page: 0 1=0A=
0 0 bop 150 1076 a FI(The)19 b(Linux)h(Kernel)f(Hack)n(ers')h(Guide)p=0A=
150 1141 1800 12 v 1012 1205 a FH(Cop)o(yrigh)o(t)1238 1204=0A=
y(c)1225 1205 y FG(\015)c FH(1992{1995)37 b(Mic)o(hael)16 =
b(K.)g(Johnson)1577=0A=
1269 y(Alpha)h(v)o(ersion)e(0.6)150 1606 y FF(A)20 =
b(ho)q(dgep)q(o)q(dge)j=0A=
(collection)d(of)g(info)o(rmation,)g(sp)q(eculation,)j(and)e(ramblings)e(=
ab)q=0A=
(out)i(the)h(Linux)e(k)o(ernel.)150 1670 y(This)15 =
b(is)f(only)g(a)g(draft.)=0A=
19 b(Please)c(mail)e(any)h(co)o(rrections,)g(ampli\014cations,)g=0A=
(suggestions,)i(etc.)e(to)h(Michael)f(K.)150 1734 y(Johnson,)j=0A=
FE(johnsonm AT nigel DOT vnet DOT net)o FF(,)12 b(Edito)o(r.)150 1863=0A=
y(Edito)o(rial)19 b(comments)h(lo)q(ok)f(lik)o(e)h(this:)30=0A=
b FD([This)24 b(is)f(an)g(editorial)j(commen)o(t.])34 b FF(I)20=0A=
b(invite)g(answ)o(ers)h(to)150 1927 y(any)16 b(questions)j(in)d(these)i=0A=
(comments.)k(The)17 =
b(mo)o(re)d(help)j(I)f(get)h(on)f(these,)h(the)h(few)o=0A=
(er)d(of)h(these)i(ugly)e(com-)150 1992 =
y(ments)h(new)o(er)g(versions)g(of)f=0A=
(the)h(guide)g(will)f(have.)24 b(Some)16 =
b(of)g(these)i(a)o(re)e(merely)f(la)=0A=
o(rge)g(notices)j(to)f(myself)150 2056 =
y(to)g(\014nish)h(some)d(task)j(I)e=0A=
(sta)o(rted.)24 b(If)16 =
b(y)o(ou)h(w)o(ould)f(lik)o(e)h(to)f(help)h(b)o(y)g=0A=
(w)o(o)o(rking)f(on)g(a)g(section)i(that)g(has)f(notes)150=0A=
2120 =
y(lik)o(e)e(this,)h(please)g(contact)h(me)d(to)h(see)h(what)g(help)g(I)f=0A=
(need.)150 2249 =
y(This)f(w)o(o)o(rk)d(is)i(currently)h(rather)f(fragmented,)f=0A=
(and)i(will)f(remain)e(in)j(that)f(state)i(until)e(most)g(of)f(the)i=0A=
(sections)150 2314 y(have)g(b)q(een)h(written,)f(so)g(that)g(revision)g=0A=
(combining)f(those)i(sections)g(can)f(b)q(e)g(done)h(intelligently)l(.)20=0A=
b(Substan-)150 2378 =
y(tial)f(revision)g(to)g(o)q(ccur)g(at)g(that)h(time)f=0A=
(should)h(address)g(the)g(p)o(roblems)e(with)i(unnecessa)o(rily)h(duplica=
ted)=0A=
150 2442 y(info)o(rmation)14 =
b(and)i(lack)f(of)g(structure,)h(and)g(mak)o(e)f=0A=
(the)h(guide)g(easier)f(to)g(follo)o(w)f(and)i(mo)o(re)e(succinct.)p=0A=
eop=0A=
%%Page: 1 2=0A=
1 1 bop 150 -84 1800 3 v 1937 -100 a FH(i)150 88 y FF(Ho)o(w)o(ever,)15=0A=
b(the)i(section)h(on)e(device)h(drivers)f(should)i(b)q(e)f(helpful)g(to)f=0A=
(some.)22 b(Other)17 b(sections)h(a)o(re)e(mostly)f(a)150 153=0A=
y(little)h(out)g(of)e(date)i(and)g(in)g(need)g(of)f(revision)g(anyw)o(a)o=
(y)l=0A=
(.)20 b(Please)c(b)q(ea)o(r)f(with)h(me,)e(o)o(r)g(b)q(etter)j(y)o(et,)e=0A=
(help.)p eop=0A=
%%Page: 2 3=0A=
2 2 bop 150 -84 1800 3 v 1925 -100 a FH(ii)150 200 y(Cop)o(yrigh)o(t)376=0A=
199 y(c)364 200 y FG(\015)15 b FH(1992,)f(1993,)f(1994,)h(1995)29=0A=
b(Mic)o(hael)17 b(K.)e(Johnson)150 265 =
y(201)f(Ho)o(w)o(ell)i(Street,)f(Apt.)=0A=
f(1C,)h(Chap)q(el)h(Hill,)h(North)e(Carolina)30 b(27514-4818)150=0A=
329 y FE(johnsonm AT nigel DOT vnet DOT net)150 541 y FC(The)17 b(Linux)g(Kernel)e=0A=
(Hackers')h(Guide)j FH(ma)o(y)14 =
b(b)q(e)i(repro)q(duced)g(and)g(distributed)=0A=
g(in)g(whole)g(or)f(in)h(part,)150 606 y(sub)s(ject)f(to)g(the)g(follo)o=0A=
(wing)h(conditions:)206 731 y(0.)22 b(The)13 =
b(cop)o(yrigh)o(t)g(notice)h(ab)=0A=
q(o)o(v)o(e)e(and)i(this)f(p)q(ermission)i(notice)e(m)o(ust)g(b)q(e)h=0A=
(preserv)o(ed)f(complete)h(on)264 795 y(all)i(complete)g(or)e(partial)i=0A=
(copies.)206 897 y(1.)22 =
b(An)o(y)f(translation)h(or)f(deriv)m(ativ)o(e)i(w)o=0A=
(ork)e(of)g FC(The)i(Linux)g(Kernel)f(Hackers')f(Guide)26 b=0A=
FH(m)o(ust)21 b(b)q(e)264 961 y(appro)o(v)o(ed)14 =
b(b)o(y)i(the)f(author)f=0A=
(in)j(writing)e(b)q(efore)h(distribution.)206 1063 y(2.)22=0A=
b(If)14 b(y)o(ou)f(distribute)i =
FC(The)g(Linux)h(Kernel)e(Hackers')g(Guide)k=0A=
FH(in)c(part,)f(instructions)i(for)e(obtaining)264 1127 y(the)18=0A=
b(complete)g(v)o(ersion)g(of)g =
FC(The)h(Linux)g(Kernel)f(Hackers')g(Guide)k=0A=
FH(m)o(ust)17 b(b)q(e)i(included,)h(and)e(a)264 1192 y(means)d(for)f=0A=
(obtaining)i(a)f(complete)h(v)o(ersion)g(pro)o(vided.)206 1293=0A=
y(3.)22 b(Small)13 b(p)q(ortions)g(ma)o(y)e(b)q(e)j(repro)q(duced)f(as)f=0A=
(illustrations)i(for)e(reviews)h(or)f(quotes)g(in)h(other)f(w)o(orks)264=0A=
1358 =
y(without)j(this)g(p)q(ermission)i(notice,)f(if)f(prop)q(er)h(citation)f=0A=
(is)h(giv)o(en.)206 1460 y(4.)22 =
b(The)f(GNU)h(General)f(Public)j(License)f=0A=
(referenced)f(b)q(elo)o(w)g(ma)o(y)f(b)q(e)h(repro)q(duced)h(under)f(the)=
264=0A=
1524 y(conditions)16 b(giv)o(en)g(within)g(it.)206 1626 y(5.)22=0A=
b(Sev)o(eral)f(sections)h(of)e(this)h(do)q(cumen)o(t)h(are)e(held)j(under=
)e=0A=
(separate)g(cop)o(yrigh)o(t.)36 b(When)22 b(these)264 1690=0A=
y(sections)15 b(are)g(co)o(v)o(ered)h(b)o(y)f(a)g(di\013eren)o(t)h(cop)o=0A=
(yrigh)o(t,)f(the)h(sep)q(erate)f(cop)o(yrigh)o(t)g(is)h(noted.)k=0A=
FD(If)e(y)o(ou)264 1754 y(distribute)d =
FC(The)f(Linux)g(Kernel)f(Hackers')g=0A=
(Guide)k FD(in)e(part,)h(and)e(that)h(part)h(is,)f(in)f(whole,)264=0A=
1819 =
y(held)k(under)g(a)f(sep)q(erate)i(cop)o(yrigh)o(t,)g(the)e(conditions)j=0A=
(of)d(that)i(cop)o(yrigh)o(t)f(apply)l(.)150 1944 y FH(Exceptions)13=0A=
b(to)f(these)h(rules)g(ma)o(y)e(b)q(e)i(gran)o(ted)f(for)g(academic)h(pur=
p)q=0A=
(oses:)19 b(W)l(rite)13 b(to)f(Mic)o(hael)h(K.)f(John-)150=0A=
2008 y(son,)h(at)f(the)h(ab)q(o)o(v)o(e)f(address,)i(or)e(email)i=0A=
FE(johnsonm AT nigel DOT vnet DOT net)p FH(,)c(and)j(ask.)18 =
b(These)c(restrictions)150=0A=
2073 =
y(are)h(here)g(to)g(protect)g(the)g(authors,)f(not)h(to)g(restrict)g(y)o=0A=
(ou)f(as)h(educators)g(and)h(learners.)150 2220 y(All)21 =
b(source)f(co)q(de)h=0A=
(in)f FC(The)i(Linux)f(Kernel)f(Hackers')g(Guide)k =
FH(is)c(placed)h(under)g=0A=
(the)f(GNU)g(General)150 2285 y(Public)120 b(License.)330 b(See)119=0A=
b(App)q(endix)h FD(??)329 b FH(for)117 b(a)150 2349 y(cop)o(y)20=0A=
b(of)g(the)g(GNU)g(\\GPL.")f(Source)h(co)q(de)h(for)e(all)j(full)f(exampl=
e)g=0A=
(programs)e(is)h(a)o(v)m(ailable)i(on-line)150 2414 y(as)d=0A=
FE(tsx-11.mit.edu:/pub/linux)o(/docs/ha)o(cker-so)o(urce.ta)o(r.Z)d=0A=
FH(and)k(a)f(cop)o(y)g(of)g(the)g(GPL)g(is)150 2478 =
y(a)o(v)m(ailable)h(in)f=0A=
(that)e(\014le)i(as)f FE(COPYING)p FH(.)f FD([O.K.,)24 b(so)c(it)i=0A=
FC(wil)r(l)j FD(b)q(e)c(a)o(v)m(ailable)i(when)d(there)i(is)f(some)150=0A=
2542 y(source)d(to)g(distribute)p FB(:)8 b(:)g(:)f FD(])p eop=0A=
%%Page: 3 4=0A=
3 3 bop 150 -84 1800 3 v 1912 -100 a FH(iii)150 88 y(UNIX)16=0A=
b(is)g(a)e(trademark)h(of)f(X/Op)q(en)150 153 =
y(MS-DOS)i(is)f(a)g(trademark)f=0A=
(of)h(Microsoft)g(Corp)q(oration.)150 217 y(Lin)o(ux)h(is)g(not)f(a)g=0A=
(trademark,)f(and)h(has)g(no)g(connection)i(to)d(UNIX)1311=0A=
201 y FA(TM)1378 217 y FH(or)g(X/Op)q(en.)150 281 y(If)22 b(an)o(y)f=0A=
(trademarks)g(ha)o(v)o(e)g(b)q(een)i(unin)o(ten)o(tionally)h(unac)o(kno)o=0A=
(wledged,)g(please)e(inform)g(the)g(editor,)150 346 y(Mic)o(hael)16=0A=
b(K.)e(Johnson,)h(201)e(Ho)o(w)o(ell)j(Street,)e(Apt.)g(1C,)f(Chap)q(el)j=0A=
(Hill,)g(North)e(Carolina)30 b(27514-4818,)150 410 y(email)16=0A=
b FE(johnsonm AT nigel DOT vnet DOT net)p FH(.)p eop=0A=
%%Page: 4 5=0A=
4 4 bop 150 -84 1800 3 v 1913 -100 a FH(iv)150 266 y =
Fz(In)n(tro)r(duction)=0A=
150 399 y FH(The)17 b FC(The)h(Linux)h(Kernel)d(Hackers')i(Guide)i=0A=
FH(is)e(inspired)g(b)o(y)f(all)h(of)e(us)h(\\k)o(ernel)g(hac)o(k)o(er)g(w=
)o=0A=
(annab)q(ees")150 463 =
y(who)g(just)g(did)h(not)f(kno)o(w)g(enough)g(ab)q(out)=0A=
h(unix)g(systems)f(to)f(hac)o(k)h(the)h(Lin)o(ux)g(k)o(ernel)g(when)g(it)=
f=0A=
(\014rst)150 528 y(came)12 =
b(out,)h(and)f(had)h(to)f(learn)h(slo)o(wly)l(.)19=0A=
b(This)13 =
b(guide)h(is)f(designed)h(to)d(help)j(y)o(ou)e(get)g(up)h(to)f(sp)q=0A=
(eed)h(on)g(the)150 592 =
y(concepts)i(that)e(are)h(not)g(in)o(tuitiv)o(ely)i=0A=
(ob)o(vious,)e(and)h(to)e(do)q(cumen)o(t)i(the)f(in)o(ternal)h(structures=
)f=0A=
(of)g(Lin)o(ux)150 657 =
y(so)f(that)g(y)o(ou)f(don't)h(ha)o(v)o(e)g(to)g(read)=0A=
g(the)h(whole)f(k)o(ernel)h(source)g(to)f(\014gure)g(out)g(what)g(is)h(ha=
pp)q=0A=
(ening)h(with)150 721 =
y(one)g(v)m(ariable,)i(or)d(to)h(disco)o(v)o(er)g(the)g=0A=
(purp)q(ose)h(of)f(one)g(function)h(call.)221 809 y(Wh)o(y)g(Lin)o(ux?)29=0A=
b(W)l(ell,)18 =
b(Lin)o(ux)h(is)f(the)f(\014rst)g(free)g(unix)i(clone)f(for)e=0A=
(the)i(386)e(to)h(b)q(e)h(freely)g(a)o(v)m(ailable.)150 873=0A=
y(It)g(is)h(a)e(complete)i(re-write,)g(and)f(has)g(b)q(een)h(k)o(ept)f=0A=
(small,)h(so)e(it)i(do)q(es)f(not)g(ha)o(v)o(e)f(a)h(lot)g(of)f(the)h(tim=
e-)=0A=
150 937 =
y(honored)d(baggage)f(that)g(other)h(free)g(op)q(erating)g(systems)g=0A=
(\(lik)o(e)h(386BSD\))e(carry)l(,)g(and)h(so)g(is)g(easier)h(to)150=0A=
1002 y(understand)g(and)f(mo)q(dify)l(.)221 1090 y(Unix)20=0A=
b(has)e(b)q(een)j(around)e(for)f(o)o(v)o(er)g(t)o(w)o(en)o(t)o(y)g(y)o(ea=
rs,)=0A=
h(but)g(only)g(in)h(the)f(last)g(few)g(y)o(ears)g(ha)o(v)o(e)f(mi-)150=0A=
1154 =
y(cro)q(computers)d(b)q(ecome)g(p)q(o)o(w)o(erful)g(enough)g(to)f(run)h=0A=
(a)f(mo)q(dern)i(protected,)e(m)o(ultiuser,)h(m)o(ultitasking)150=0A=
1218 y(op)q(erating)g(system.)20 b(F)l(urthermore,)14 b(unix)i(implemen)o=0A=
(tations)g(ha)o(v)o(e)e(not)h(b)q(een)h(free.)k(Because)15=0A=
b(of)g(this,)150 1283 =
y(v)o(ery)g(little)h(free)g(do)q(cumen)o(tation)f(has)g=0A=
(b)q(een)i(written,)e(at)f(least)h(for)g(the)g(k)o(ernel)h(in)o(ternals.)=
221=0A=
1371 =
y(Unix,)g(though)f(simple)i(at)e(\014rst,)g(has)g(gro)o(wn)f(more)h(and)=0A=
h(more)f(app)q(endages,)h(and)g(has)f(b)q(ecome)h(a)150 1435=0A=
y(v)o(ery)g(complex)i(system,)e(whic)o(h)i(only)f(\\wizards")g(understand=
.)25=0A=
b(With)17 b(Lin)o(ux,)h(ho)o(w)o(ev)o(er,)d(w)o(e)i(ha)o(v)o(e)f(a)150=0A=
1499 y(c)o(hance)g(to)e(c)o(hange)i(this,)f(for)f(a)h(few)g(reasons:)218=0A=
1624 y FG(\017)23 b FH(Lin)o(ux)16 =
b(has)f(a)g(simple)i(k)o(ernel,)e(with)h=0A=
(w)o(ell-structured)g(in)o(terfaces.)218 1726 y FG(\017)23=0A=
b FH(One)15 =
b(p)q(erson,)g(Lin)o(us)h(T)l(orv)m(alds,)f(has)g(con)o(trol)f=0A=
(of)g(what)h(co)q(de)g(is)g(added)h(to)e(Lin)o(ux,)h(and)g(he)h(do)q(es)2=
64=0A=
1791 y(this)d(w)o(ork)f(gratis.)18 b(This)13 b(means)g(that)f(random)g=0A=
(pieces)j(of)d(co)q(de)h(are)g(not)f(forced)h(in)o(to)f(the)h(k)o(ernel)2=
64=0A=
1855 =
y(b)o(y)i(some)g(compan)o(y's)f(p)q(olitics,)j(and)e(the)h(k)o(ernel)f=0A=
(in)o(terfaces)h(sta)o(y)e(relativ)o(ely)i(clean.)218 1957=0A=
y FG(\017)23 b FH(The)14 =
b(source)h(is)g(free,)f(so)g(man)o(y)h(p)q(eople)h=0A=
(can)e(study)h(it)g(and)f(learn)h(to)f(understand)h(it,)g(b)q(ecoming)264=0A=
2021 =
y(\\wizards")g(in)h(their)f(o)o(wn)g(righ)o(t,)g(and)g(ev)o(en)o(tually)=0A=
h(con)o(tribute)g(co)q(de)g(to)e(the)h(e\013ort.)221 2146 =
y(It)g(is)i(our)e=0A=
(hop)q(e)h(that)f(this)h(b)q(o)q(ok)g(will)i(help)f(the)e(nascen)o(t)h(k)=
o=0A=
(ernel)g(hac)o(k)o(er)g(learn)g(ho)o(w)f(to)g(hac)o(k)h(the)150=0A=
2211 =
y(Lin)o(ux)g(k)o(ernel,)g(b)o(y)f(giving)h(an)f(understanding)i(of)e(ho)=0A=
o(w)f(the)h(k)o(ernel)h(is)g(structured.)p eop=0A=
%%Page: 5 6=0A=
5 5 bop 150 -84 1800 3 v 1926 -100 a FH(v)150 266 y Fz(Thanks)20=0A=
b(to)p Fy(:)12 b(:)g(:)150 445 y FD(Lin)o(us)18 b(T)l(orv)m(alds,)24=0A=
b =
FH(of)d(course,)i(for)e(starting)h(this)g(whole)g(time)g(sink,)i(and)e(fo=
r)=0A=
f(gen)o(tly)h(pro)o(viding)264 509 y(explanations)17 b(whenev)o(er)f=0A=
(necessary)l(.)22 b(He)17 =
b(has)e(done)i(a)e(w)o(onderful)i(job)f(of)f(k)o=0A=
(eeping)i(the)f(k)o(ernel)264 574 =
y(source)f(co)q(de)h(understandable)h(and)f=0A=
(neat.)k(I)c(can't)f(imagine)h(ha)o(ving)g(learned)g(so)f(m)o(uc)o(h)h(in=
)g=0A=
(the)264 638 y(past)e(few)h(y)o(ears)g(without)g(Lin)o(ux.)150=0A=
739 y FD(Krishna)k(Balasubramanian)h FH(and)e FD(Douglas)g(Johnson,)23=0A=
b FH(for)15 b(writing)g(m)o(uc)o(h)g(of)f(the)h(section)g(on)264=0A=
803 y(memory)f(managemen)o(t,)g(and)i(helping)h(with)e(the)h(rest.)150=0A=
904 y FD(Stanley)i(Scalsky)l(,)23 b FH(for)15 =
b(helping)i(do)q(cumen)o(t)e=0A=
(the)h(system)e(call)j(in)o(terface.)150 1004 y FD(Rik)h(F)l(aith,)24=0A=
b FH(for)14 =
b(writing)i(the)f(section)h(on)f(ho)o(w)g(to)g(write)g(a)g(SCSI)h=0A=
(device)g(driv)o(er.)150 1105 y FD(Rob)q(ert)j(Baruc)o(h,)24=0A=
b FH(for)19 b(the)g(review)g(of)g =
FC(Writing)h(UNIX)f(Devic)n(e)g(Drivers)k=0A=
FH(and)c(for)g(his)g(help)i(with)264 1169 y(the)15 =
b(section)h(on)f(writing)h=0A=
(device)g(driv)o(ers.)150 1270 y FD(Lin)o(ux)i(Journal,)25=0A=
b FH(for)11 =
b(pro)o(viding)i(me)f(with)h(a)f(Lin)o(ux-related)i(job,)e(and)g=0A=
(for)g(allo)o(wing)h(me)f(to)g(do)g(w)o(ork)264 1334 =
y(on)j(the)g(KHG)g(on)g=0A=
(their)h(time.)150 1435 y FD(Kim)h(Johnson,)h(m)o(y)f(wife,)23=0A=
b FH(for)15 =
b(tolerating)i(and)f(encouraging)g(me)g(ev)o(en)h(when)f(I)h(sp)q=0A=
(end)g(m)o(y)f(time)264 1499 =
y(on)f(crazy)g(stu\013)g(lik)o(e)i(Lin)o(ux.)150=0A=
1723 y Fz(Cop)n(yrigh)n(t)k(Ac)n(kno)n(wledgemen)n(ts:)150=0A=
1902 y FD(Lin)o(ux)d(Memory)e(Managemen)o(t:)24 b FH(The)43=0A=
b(original)i(v)o(ersion)e(of)g(this)h(do)q(cumen)o(t)f(is)h(cop)o(y-)264=0A=
1966 y(righ)o(t)385 1965 y(c)372 1966 y FG(\015)14 b FH(1993)f(Krishna)i=0A=
(Balasubramanian.)20 b(Some)13 b(c)o(hanges)h(cop)o(yrigh)o(t)1583=0A=
1965 y(c)1571 1966 y FG(\015)g FH(1993)e(Mic)o(hael)j(K.)264=0A=
2031 y(Johnson)g(and)h(Douglas)f(R.)g(Johnson.)150 2131 y =
FD(Ho)o(w)i(System)=0A=
f(Calls)j(W)l(ork:)k =
FH(The)d(original)h(v)o(ersion)g(of)e(this)i(do)q(cumen)=0A=
o(t)f(is)h(cop)o(yrigh)o(t)1806 2130 y(c)1794 2131 y FG(\015)f=0A=
FH(1993)264 2196 y(Stanley)c(Scalsky)l(.)k(Some)15 b(c)o(hanges)h(cop)o=0A=
(yrigh)o(t)1105 2195 y(c)1093 2196 y FG(\015)f =
FH(1993)f(Mic)o(hael)i(K.)g=0A=
(Johnson)150 2296 y FD(W)l(riting)j(a)f(SCSI)f(Device)h(Driv)o(er)23=0A=
b FH(The)41 =
b(original)g(v)o(ersion)g(of)f(this)g(do)q(cumen)o(t)h(is)g(cop)o=0A=
(y-)264 2361 y(righ)o(t)385 2360 y(c)372 2361 y FG(\015)15=0A=
b FH(1993)e(Ric)o(k)m(ard)i(E.)f(F)l(aith.)19 b(Some)14 =
b(mo)q(di\014cations)=0A=
h(are)f(cop)o(yrigh)o(t)1582 2360 y(c)1570 2361 y FG(\015)g=0A=
FH(1993)f(Mic)o(hael)i(K.)264 2425 y(Johnson.)20 b(The)15 =
b(author)f(has)h=0A=
(appro)o(v)o(ed)g(the)g(inclusion)i(of)e(this)g(material,)g(despite)h(the=
)f=0A=
(sligh)o(tly)264 2489 y(more)10 b(restrictiv)o(e)h(cop)o(yrigh)o(t)g(on)g=0A=
(this)g(whole)g(do)q(cumen)o(t.)19 b(The)11 =
b(original)h(cop)o(yrigh)o(t)f=0A=
(restrictions,)264 2554 y FC(which)16 =
b(stil)r(l)g(apply)h(to)f(any)g(work)h=0A=
(derive)n(d)f(solely)g(fr)n(om)g(this)g(work,)g FH(are:)p eop=0A=
%%Page: 6 7=0A=
6 6 bop 150 -84 1800 3 v 1913 -100 a FH(vi)432 88 y(Cop)o(yrigh)o(t)661=0A=
87 y(c)649 88 y FG(\015)19 b FH(1993)e(Ric)o(k)m(ard)j(E.)e(F)l(aith)g=0A=
(\(faith AT cs DOT unc DOT edu\).)31 b(All)20 b(righ)o(ts)e(re-)364 153=0A=
y(serv)o(ed.)h(P)o(ermission)12 b(is)h(gran)o(ted)e(to)g(mak)o(e)h(and)g=0A=
(distribute)h(v)o(erbatim)f(copies)h(of)f(this)364 217 y(pap)q(er)f(pro)o=0A=
(vided)h(the)f(cop)o(yrigh)o(t)g(notice)g(and)g(this)h(p)q(ermission)g=0A=
(notice)g(are)f(preserv)o(ed)364 281 y(on)k(all)h(copies.)264=0A=
383 =
y(If)g(y)o(ou)g(wish)h(to)f(mak)o(e)g(a)g(deriv)o(ed)i(w)o(ork,)d(please)=0A=
i(start)e(from)h(the)h(original)g(do)q(cumen)o(t.)24 b(T)l(o)16=0A=
b(do)264 448 =
y(so,)f(please)h(con)o(tact)f(Ric)o(k)m(ard)i(E.)e(F)l(aith,)h=0A=
FE(faith AT cs DOT unc DOT edu)p =
FH(.)j(The)c(original)i(is)f(a)o(v)m(ailable)i(for)264=0A=
512 =
y(anon)o(ymous)c(ftp)h(as)g(ftp.cs.unc.edu:/pub/faith/pap)q(ers/scsi.pap)=0A=
q(er.tar.gz.)p eop=0A=
%%Page: 7 8=0A=
7 7 bop 150 461 a Fx(Con)m(ten)m(ts)150 761 y FD(0)42 b(Before)18=0A=
b(Y)l(ou)g(Begin)p FB(:)8 b(:)g(:)1247 b FD(1)218 849 y FH(0.1)46=0A=
b(T)o(yp)q(ographical)16 b(Con)o(v)o(en)o(tions)36 b FB(:)22=0A=
b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)91 b FH(1)218 936 y(0.2)46 b(Assumptions)e=0A=
FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91=0A=
b FH(2)218 1024 y(0.3)46 b(Hac)o(king)15 b(Wisdom)31 b FB(:)22=0A=
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91 b FH(2)150=0A=
1158 y FD(1)42 b(Device)18 b(Driv)o(ers)1367 b(4)218 1245 y=0A=
FH(1.1)46 b(What)14 b(is)i(a)f(Device)h(Driv)o(er?)40 b FB(:)23=0A=
b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=
(:)g=0A=
(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91 b FH(4)218 1333 y(1.2)46=0A=
b(User-space)15 b(device)i(driv)o(ers)12 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(=
:)g=0A=
(:)h(:)f(:)91 b FH(5)323 1421 y(1.2.1)50 b(Example:)21 b FE(vgalib)14=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91 b FH(6)323=0A=
1509 y(1.2.2)50 b(Example:)21 b(mouse)15 b(con)o(v)o(ersion)25=0A=
b =
FB(:)e(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)=
h=0A=
(:)f(:)g(:)h(:)f(:)91 b FH(8)218 1597 y(1.3)46 b(Device)16=0A=
b(Driv)o(er)f(Basics)28 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(=
:)f=0A=
(:)91 b FH(8)323 1685 y(1.3.1)50 b(Namespace)38 b FB(:)22 =
b(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(=
:)g=0A=
(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91 b FH(8)323 1772 y(1.3.2)50=0A=
b(Allo)q(cating)17 b(memory)i =
FB(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)91=0A=
b FH(8)323 1860 y(1.3.3)50 b(Character)15 =
b(vs.)f(blo)q(c)o(k)i(devices)36=0A=
b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)h(:)f(:)g(:)h(:)f(:)69 b FH(10)323 1948 y(1.3.4)50 b(In)o(terrupts)15=0A=
b(vs.)20 b(P)o(olling)44 b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(10)323 2036 y(1.3.5)50 b(The)16 =
b(sleep-w)o(ak)o(eup)g(mec)o(hanism)27=0A=
b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h=0A=
(:)f(:)g(:)h(:)f(:)69 b FH(12)323 2124 y(1.3.6)50 b(The)16=0A=
b(VFS)41 b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(13)218 2212 y(1.4)46 b(Character)14 b(Device)i(Driv)o(ers)42=0A=
b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(20)323 2300=0A=
y(1.4.1)50 b(Initialization)43 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)=0A=
f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)69 b FH(21)323 2387 y(1.4.2)50 b(In)o(terrupts)15 b(vs.)20=0A=
b(P)o(olling)44 b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(21)323=0A=
2475 y(1.4.3)50 b(TTY)15 b(driv)o(ers)45 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(=
:)h=0A=
(:)f(:)g(:)h(:)f(:)69 b FH(24)1025 2678 y(vii)p eop=0A=
%%Page: 8 9=0A=
8 8 bop 150 -84 1800 3 v 150 -100 a Fw(CONTENTS)1480 b FH(viii)218=0A=
88 y(1.5)46 b(Blo)q(c)o(k)16 b(Device)g(Driv)o(ers)21 b =
FB(:)i(:)f(:)g(:)h(:)=0A=
f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(24)323 176 y(1.5.1)50 =
b(Initialization)43=0A=
b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b=0A=
FH(25)323 264 y(1.5.2)50 b(The)16 b(Bu\013er)g(Cac)o(he)e FB(:)22=0A=
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=
(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(26)323 352 y(1.5.3)50=0A=
b(The)16 b(Strategy)e(Routine)38 b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(26)323 440 y(1.5.4)50 b(Example)16 b(Driv)o(ers)32 b FB(:)22=0A=
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=
(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(27)218 528 y(1.6)46=0A=
b(Supp)q(orting)16 b(F)l(unctions)47 b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(=
:)g=0A=
(:)h(:)f(:)69 b FH(27)218 615 y(1.7)46 b(W)l(riting)16 =
b(a)e(SCSI)i(Device)g=0A=
(Driv)o(er)24 b =
FB(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)=0A=
g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(42)323=0A=
703 y(1.7.1)50 b(Wh)o(y)15 =
b(Y)l(ou)g(W)l(an)o(t)g(to)f(W)l(rite)i(a)f(SCSI)h=0A=
(Driv)o(er)38 b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h=0A=
(:)f(:)69 b FH(42)323 791 y(1.7.2)50 b(What)15 b(is)g(SCSI?)37=0A=
b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(43)323=0A=
879 y(1.7.3)50 b(SCSI)16 b(Commands)27 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)h(:)=0A=
f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)69 b FH(46)323 967 y(1.7.4)50 b(Getting)15 b(Started)h=0A=
FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(48)323=0A=
1055 y(1.7.5)50 b(Before)15 b(Y)l(ou)h(Begin:)21 b(Gathering)15=0A=
b(T)l(o)q(ols)h FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h=0A=
(:)f(:)g(:)h(:)f(:)69 b FH(48)323 1143 y(1.7.6)50 b(The)16=0A=
b(Lin)o(ux)g(SCSI)g(In)o(terface)31 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(49)323 1230 y(1.7.7)50 b(The)16 b FE(Scsi)p 661 1230 15=0A=
2 v 16 w(Host)f FH(Structure)38 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(49)323 1318 y(1.7.8)50 b(The)16 b FE(Scsi)p 661 1318 V=0A=
16 w(Cmnd)f FH(Structure)38 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b=0A=
FH(63)218 1406 y(1.8)46 b(Ac)o(kno)o(wledgemen)o(ts)29 b FB(:)22=0A=
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=
(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(66)218=0A=
1494 y(1.9)46 b(Net)o(w)o(ork)14 b(Device)i(Driv)o(ers)37 b=0A=
FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(66)150 1627=0A=
y FD(2)42 b(The)18 b FE(/proc)f FD(\014lesystem)1211 b(67)218=0A=
1715 y FH(2.1)46 b FE(/proc)14 b FH(Directories)i(and)f(Files)37=0A=
b FB(:)22 =
b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(67)218 1803=0A=
y(2.2)46 b(Structure)15 b(of)g(the)g(/pro)q(c)g(\014lesystem)37=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(75)218 1891 y(2.3)46 b(Programming)14=0A=
b(the)h(/pro)q(c)g(\014lesystem)40 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)=0A=
g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69=0A=
b FH(76)150 2024 y FD(3)42 b(The)18 b(Lin)o(ux)g(sc)o(heduler)1212=0A=
b(85)218 2112 y FH(3.1)46 b(The)15 b(co)q(de)45 b FB(:)23 =
b(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(=
:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(86)150=0A=
2245 y FD(4)42 b(Ho)o(w)17 b(System)f(Calls)j(W)l(ork)1121=0A=
b(90)218 2333 y FH(4.1)46 b(What)14 =
b(Do)q(es)h(the)h(386)e(Pro)o(vide?)42=0A=
b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(90)218 2421 y(4.2)46=0A=
b(Ho)o(w)14 b(Lin)o(ux)j(Uses)e(In)o(terrupts)g(and)h(Exceptions)41=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f=0A=
(:)69 b FH(92)218 2509 y(4.3)46 b(Ho)o(w)14 =
b(Lin)o(ux)j(Initializes)h(the)d=0A=
(system)g(call)h(v)o(ectors)43 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)=0A=
h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(93)p eop=0A=
%%Page: 9 10=0A=
9 9 bop 150 -84 1800 3 v 150 -100 a Fw(CONTENTS)1505 b FH(ix)218=0A=
88 y(4.4)46 b(Ho)o(w)14 b(to)h(Add)h(Y)l(our)f(Own)g(System)g(Calls)24=0A=
b =
FB(:)e(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)=
f=0A=
(:)g(:)h(:)f(:)69 b FH(94)150 222 y FD(5)42 b(Lin)o(ux)18 b(Memory)f=0A=
(Managemen)o(t)1027 b(96)218 310 y FH(5.1)46 b(Ov)o(erview)c=0A=
FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(=
:)69=0A=
b FH(96)218 397 y(5.2)46 b(Ph)o(ysical)16 b(memory)28 b FB(:)22=0A=
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(98)218=0A=
485 y(5.3)46 b(A)15 b(user)g(pro)q(cess')g(view)h(of)f(memory)i=0A=
FB(:)23 =
b(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)69 b FH(99)218 573 y(5.4)46 b(Memory)14=0A=
b(Managemen)o(t)g(data)h(in)h(the)f(pro)q(cess)h(table)29 b=0A=
FB(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46=0A=
b FH(100)218 661 y(5.5)g(Memory)14 b(initialization)49 b FB(:)22=0A=
b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=
(:)h=0A=
(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(101)323 749=0A=
y(5.5.1)k(Pro)q(cesses)15 b(and)h(the)f(Memory)g(Manager)31=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f=0A=
(:)46 b FH(101)218 837 y(5.6)g(Acquiring)16 =
b(and)g(F)l(reeing)g(Memory:)j(P)=0A=
o(aging)c(P)o(olicy)43 b FB(:)22 =
b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)=0A=
f(:)g(:)h(:)f(:)46 b FH(103)218 924 y(5.7)g(The)15 =
b(page)g(fault)h(handlers)=0A=
37 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)=0A=
f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(105)218=0A=
1012 y(5.8)g(P)o(aging)21 b =
FB(:)h(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)=0A=
h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=
(:)g=0A=
(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(106)218 1100 y(5.9)g(80386)14=0A=
b(Memory)g(Mangamen)o(t)37 b FB(:)22 =
b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)=0A=
h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46=0A=
b FH(108)323 1188 y(5.9.1)k(P)o(aging)15 b(on)g(the)g(386)39=0A=
b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(108)323=0A=
1276 y(5.9.2)k(Segmen)o(ts)15 b(in)h(the)g(80386)23 b =
FB(:)f(:)h(:)f(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(=
:)h=0A=
(:)f(:)46 b FH(109)323 1364 y(5.9.3)k(Selectors)16 b(in)g(the)f(80386)35=0A=
b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(111)323 1451 =
y(5.9.4)k(Segmen)o(t)=0A=
15 b(descriptors)38 b FB(:)22 =
b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46=0A=
b FH(112)323 1539 y(5.9.5)k(Macros)14 b(used)i(in)g(setting)f(up)h=0A=
(descriptors)44 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f=0A=
(:)g(:)h(:)f(:)46 b FH(114)150 1673 y FD(A)29 b(Bibliograph)o(y)1363=0A=
b(116)218 1760 y FH(A.1)35 b(Normal)15 b(Bibliograph)o(y)23=0A=
b =
FB(:)g(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)=
h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(116)218=0A=
1848 y(A.2)35 b(Annotated)15 b(Bibliograph)o(y)31 b FB(:)22=0A=
b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h=
(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(117)150 1982 y FD(B)31=0A=
b(T)l(our)18 b(of)g(the)g(Lin)o(ux)f(k)o(ernel)h(source)929=0A=
b(124)218 2069 y FH(B.1)37 b(Bo)q(oting)15 b(the)g(system)j=0A=
FB(:)k(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)=
g(:)=0A=
h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(125)218=0A=
2157 y(B.2)37 b(Spinning)17 b(the)e(wheel)27 b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(=
:)h=0A=
(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(126)218 2245 y(B.3)37 b(Ho)o(w)14=0A=
b(the)i(k)o(ernel)g(sees)f(a)g(pro)q(cess)28 b FB(:)22 =
b(:)h(:)f(:)h(:)f(:)g=0A=
(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(=
:)f=0A=
(:)46 b FH(127)218 2333 y(B.4)37 b(Creating)15 =
b(and)g(destro)o(ying)g(pro)q=0A=
(cesses)46 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)=0A=
g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(128)218 2421 y(B.5)37=0A=
b(Executing)16 b(programs)39 b FB(:)23 =
b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(=
:)h=0A=
(:)f(:)46 b FH(128)218 2509 y(B.6)37 b(Accessing)16 b(\014lesystems)22=0A=
b =
FB(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)=
h=0A=
(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46 b FH(129)p=0A=
eop=0A=
%%Page: 10 11=0A=
10 10 bop 150 -84 1800 3 v 150 -100 a Fw(CONTENTS)1518 b FH(x)218=0A=
88 y(B.7)37 b(Quic)o(k)16 =
b(Anatom)o(y)e(of)h(a)g(Filesystem)h(T)o(yp)q(e)46=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f=0A=
(:)g(:)h(:)f(:)46 b FH(130)218 176 y(B.8)37 b(The)15 =
b(console)h(driv)o(er)38=0A=
b FB(:)22 =
b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f=0A=
(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)46=0A=
b FH(132)p eop=0A=
%%Page: 1 12=0A=
1 11 bop 150 438 a Fv(Chapter)34 b(0)150 686 y Fx(Before)42=0A=
b(Y)-10 b(ou)39 b(Begin)p Fu(:)17 b(:)d(:)150 961 y Ft(0.1)70=0A=
b(T)n(yp)r(ographical)23 b(Con)n(v)n(en)n(tions)150 1090 y=0A=
FD(Bold)194 b FH(Used)12 b(to)f(mark)g FD(new)i(concepts)p=0A=
FH(,)f FD(W)-6 b(ARNINGS)p FH(,)12 b(and)g FD(k)o(eyw)o(ords)e=0A=
FH(in)i(a)f(language.)150 1193 y FC(italics)182 b FH(Used)19=0A=
b(for)f FC(emphasis)g =
FH(in)h(text,)f(and)h(o)q(ccasionally)h(for)d(quotes)h=0A=
(or)g(in)o(tro)q(ductions)i(at)450 1258 y(the)15 =
b(b)q(eginning)j(of)c(a)h=0A=
(section.)150 1361 y Fw(slan)o(ted)160 b FH(Used)18 b(to)e(mark)h=0A=
FD(meta-v)m(ariables)i =
FH(in)f(the)g(text,)e(esp)q(ecially)k(in)e(represen)o=0A=
(tations)f(of)450 1426 y(the)e(command)g(line.)22 b(F)l(or)14=0A=
b(example,)550 1528 y FE(ls)24 b(-l)14 b Fw(fo)q(o)450 1631=0A=
y FH(where)j Fw(fo)q(o)f FH(w)o(ould)h(\\stand)f(for")g(a)g(\014lename,)i=0A=
(suc)o(h)f(as)f FE(/bin/cp)p FH(.)24 b(Sometimes,)17 b(this)450=0A=
1695 =
y(migh)o(t)f(b)q(e)i(di\016cult)g(to)e(see,)g(and)h(so)f(the)h(text)f=0A=
(is)h(put)g(in)g(angle)g(brac)o(k)o(ets,)f(lik)o(e)i(this:)450=0A=
1760 y FG(h)p Fw(slan)o(ted)p FG(i)p FH(.)150 1863 y FE(Typewriter)60=0A=
b FH(Used)16 b(to)e(represen)o(t)h(screen)h(in)o(teraction,)f(as)g(in)550=0A=
1958 y Fs(ls)21 b(-l)h(/bin/cp)550 2015 y(-rwxr-xr-x)42 b(1)21=0A=
b(root)86 b(wheel)h(12104)20 b(Sep)i(25)f(15:53)g(/bin/cp)450=0A=
2117 y FH(Also)14 =
b(used)h(for)e(co)q(de)i(examples,)f(whether)h(it)f(is)g=0A=
(\\C")g(co)q(de,)g(a)g(shell)h(script,)g(or)e(some-)450 2182=0A=
y(thing)20 =
b(else,)i(and)e(to)f(displa)o(y)j(general)e(\014les,)i(suc)o(h)e=0A=
(as)f(con\014guration)i(\014les.)35 b(When)450 2246 y(necessary)13=0A=
b(for)f(clarit)o(y's)h(sak)o(e,)f(these)h(examples)h(or)e(\014gures)h(wil=
l)i=0A=
(b)q(e)e(enclosed)i(in)e(thin)450 2311 y(b)q(o)o(xes.)p 150=0A=
2370 101 2 v 150 2435 2 66 v 164 2414 a FF(Key)p 249 2435 V=0A=
150 2437 101 2 v 213 w FH(Represen)o(ts)j(a)f(k)o(ey)g(to)f(press.)20=0A=
b(Y)l(ou)c(will)h(often)d(see)i(it)f(in)h(this)g(form:)550=0A=
2517 y(Press)p 670 2478 143 2 v 670 2529 2 51 v 29 w FF(return)p=0A=
811 2529 V 670 2531 143 2 v 30 w FH(to)f(con)o(tin)o(ue.)1039=0A=
2678 y(1)p eop=0A=
%%Page: 2 13=0A=
2 12 bop 150 -84 1800 3 v 150 -100 a FD(0.2.)42 b(Assumptions)1362=0A=
b FH(2)150 88 y Fr(3)263 b FH(A)12 =
b(diamond)i(in)f(the)f(margin,)h(lik)o(e)h=0A=
(a)e(blac)o(k)h(diamond)g(on)f(a)g(ski)h(hill,)i(marks)d(\\danger")450=0A=
153 =
y(or)j(\\caution.")k(Read)d(paragraphs)f(mark)o(ed)f(this)i(w)o(a)o(y)e=0A=
(carefully)l(.)150 328 y Ft(0.2)70 b(Assumptions)150 461 y=0A=
FH(T)l(o)13 b(read)g FC(The)i(Linux)g(Kernel)f(Hackers')g(Guide)s=0A=
FH(,)g(y)o(ou)f(should)h(ha)o(v)o(e)f(a)g(reasonably)g(go)q(o)q(d)g=0A=
(understand-)150 526 =
y(ing)i(of)f(C.)g(That)g(is,)g(y)o(ou)g(should)i(b)q(e)f=0A=
(able)g(to)f(read)g(C)g(co)q(de)h(without)g(ha)o(ving)g(to)e(lo)q(ok)i(up=
)g=0A=
(ev)o(erything.)150 590 y(Y)l(ou)e(should)g(b)q(e)g(able)g(to)e(write)i=0A=
(simple)g(C)f(programs,)g(and)g(understand)h FE(struct)p =
FH('s,)e(p)q(oin)o=0A=
(ters,)i(macros,)150 654 y(and)j(ANSI)h(C)f(protot)o(yping.)22=0A=
b(Y)l(ou)16 =
b(do)g(not)f(ha)o(v)o(e)h(to)f(ha)o(v)o(e)h(a)g(thorough)f(kno)o=0A=
(wledge)i(of)e(the)h(standard)150 719 =
y(I/O)d(library)l(,)h(b)q(ecause)g(the)=0A=
f(standard)f(libraries)j(are)d(not)g(a)o(v)m(ailable)j(in)f(the)e(k)o(ern=
el.)=0A=
20 b(Some)13 b(of)g(the)f(more)150 783 y(often)j(used)g(standard)g(I/O)g=0A=
(functions)h(ha)o(v)o(e)f(b)q(een)h(rewritten)f(for)f(use)i(within)g(the)=
f(k)=0A=
o(ernel,)h(but)f(these)150 847 =
y(are)g(explained)i(in)f(this)g(b)q(o)q(ok)f=0A=
(where)h(necessary)l(.)221 935 =
y(Y)l(ou)f(should)i(b)q(e)f(able)g(to)e(use)i=0A=
(a)f(go)q(o)q(d)h(text)e(editor,)i(recompile)h(the)e(Lin)o(ux)i(k)o(ernel=
,)e=0A=
(and)h(do)f(basic)150 1000 =
y(system)g(administration)h(tasks,)e(suc)o(h)h(as)=0A=
g(making)g(new)h(device)g(en)o(tries)g(in)g(/dev/.)221 1087=0A=
y(Y)l(ou)f(should)h(also)f(b)q(e)h(able)g(to)f(read,)g(as)f(I)i(do)f(not)=
g=0A=
(o\013er)g(supp)q(ort)h(for)e(this)i(b)q(o)q(ok)p FB(:)8 b(:)g(:)264=0A=
1204 y FH(\\)p FC(Hel)r(lo,)15 =
b(sir,)h(I'm)h(having)f(some)g(pr)n(oblems)g=0A=
(with)h(this)f(b)n(o)n(ok)g(you)h(wr)n(ote.)p FH(")264 1268=0A=
y(\\Y)l(es?")264 1333 y(\\)p FC(I)f(c)n(an)-5 b('t)16 =
b(r)n(e)n(ad)g(it.)p=0A=
FH(")264 1397 y(\\Is)f(it)g(plugged)i(in?")264 1461 y(\\)p=0A=
FC(Y)m(es.)27 b(I)20 =
b(also)f(trie)n(d)g(a)g(lamp)h(in)e(that)i(so)n(cket,)f=0A=
(so)g(I)g(know)g(it)g(is)g(getting)g(p)n(ower.)29 b(But)20=0A=
b(I)264 1526 y(r)n(e)n(al)r(ly)15 b(don)-5 b('t)17 =
b(think)f(that's)g(the)h=0A=
(pr)n(oblem.)p FH(")264 1590 y(\\Wh)o(y)d(not?")264 1654 y(\\)p=0A=
FC(I)i(c)n(an)-5 b('t)16 b(r)n(e)n(ad.)p FH(")264 1719 y(\\)j(Oh.)32=0A=
b(W)l(ell,)22 b(let's)d(start)f(here.)33 b(See)20 b(this?)33=0A=
b(Rep)q(eat)20 b(after)f(me:)28 b FC(The)20 b(c)n(at)g(sat)g(on)g(the)264=0A=
1783 y(r)n(at)p FB(:)8 b(:)g(:)d FH(")150 1959 y Ft(0.3)70=0A=
b(Hac)n(king)22 b(Wisdom)150 2092 y FH(This)d(is)f(a)g(collection)i(of)d=0A=
(little)j(things)e(that)f(y)o(ou)h(need)h(to)e(kno)o(w)h(b)q(efore)g(y)o(=
ou)g=0A=
(start)f(hac)o(king.)28 b(It)18 b(is)150 2156 =
y(rather)h(ram)o(bling,)i(and)f=0A=
(almost)f(resem)o(bles)i(a)e(glossary)g(in)i(form,)f(but)g(it)g(is)g(not)=
f(a)=0A=
h(reference,)h(but)150 2220 y(rather)15 =
b(a)f(hac)o(k)o(er's)h(narativ)o(e,)f=0A=
(a)h(short)g(course)g(in)h(k)o(ernel)g(hac)o(king.)150 2372=0A=
y Fq(Static)i(v)m(ariables)150 2489 y FD(Alw)o(a)o(ys)12 b(initialize)j=0A=
(static)f(v)m(ariables.)21 b FH(I)10 =
b(cannot)h(o)o(v)o(eremphasize)g(this.)=0A=
19 b(Man)o(y)9 b(seemingly)j(random)150 2554 =
y(bugs)i(ha)o(v)o(e)f(b)q(een)h=0A=
(caused)g(b)o(y)g(not)f(initializin)q(g)j(static)d(v)m(ariables.)21=0A=
b(Because)14 b(the)g(k)o(ernel)g(is)g(not)f(really)h(a)p eop=0A=
%%Page: 3 14=0A=
3 13 bop 150 -84 1800 3 v 150 -100 a FD(0.3.)42 b(Hac)o(king)18=0A=
b(Wisdom)1264 b FH(3)150 88 y(standard)13 b(executable,)h(the)g=0A=
FD(bss)e =
FH(segmen)o(t)h(ma)o(y)g(or)f(ma)o(y)h(not)g(b)q(e)h(zero)q(ed,)g=0A=
(dep)q(ending)h(on)e(the)h(metho)q(d)150 153 =
y(used)i(for)e(b)q(o)q(oting.)=0A=
150 306 y Fp(libc)j Fq(una)n(v)m(ailable)150 423 y FH(Muc)o(h)j(of)f=0A=
FE(libc)g FH(is)i(una)o(v)m(ailable.)35 b(That)19 b(is,)i(all)g(of)e=0A=
FE(libc)h =
FH(is)g(una)o(v)m(ailable,)i(but)e(man)o(y)g(of)f(the)h(most)150=0A=
488 y(common)12 b(functions)h(are)f(duplicated.)21 b(See)12=0A=
b(the)h(section)g FD([not)i(here)f(y)o(et])e =
FH(for)g(simple)i(do)q(cumen)o=0A=
(tation)150 552 y(of)f(these)g(functions.)20 b(Most)12 b(of)h(the)g(do)q=0A=
(cumen)o(tation)h(for)e(these)i(are)e(the)i(section)f(3)g(and)h(section)f=
(9)g=0A=
(man)150 616 y(pages.)150 770 y Fq(Lin)n(ux)18 b(is)h(not)f=0A=
Fo(unix)572 752 y FA(TM)150 887 y =
FH(Ho)o(w)o(ev)o(er,)g(it)h(is)h(close.)31=0A=
b(It)19 b(is)g(not)f(plan)i(9,)f(nor)f(is)h(it)g(Mac)o(h.)31=0A=
b(It)18 b(is)i(not)e(primarily)i(in)o(tended)g(to)e(b)q(e)150=0A=
951 y(a)j(great)g(commercial)h(success.)39 b(P)o(eople)23 =
b(will)g(not)e(lo)q=0A=
(ok)h(kindly)h(up)q(on)f(suggestions)f(to)g(c)o(hange)h(it)150=0A=
1016 y(fundamen)o(tally)c(to)e(attain)h(an)o(y)f(of)h(these)g(goals.)25=0A=
b(It)17 b(has)f(b)q(een)j(suggested)d(that)h(part)f(of)g(the)h(reason)150=0A=
1080 y(that)12 =
b(the)i(qualit)o(y)f(of)g(the)g(Lin)o(ux)i(k)o(ernel)f(is)g=0A=
(so)e(high)i(is)g(the)f(un)o(b)q(ending)i(dev)o(otion)f(of)f(the)g(Lin)o(=
ux)h=0A=
(k)o(ernel)150 1144 y(hac)o(k)o(ers)h(to)f(ha)o(ving)i(fun)f(pla)o(ying)h=0A=
(with)g(their)g(new)f(k)o(ernel.)150 1298 y Fq(Useful)j(references)150=0A=
1415 y FH(Y)l(ou)23 =
b(will)i(encoun)o(ter)e(certain)g(references)h(that)e(y)o=0A=
(ou)h(will)h(need)g(to)f(understand.)43 b(F)l(or)23 b(instance,)150=0A=
1479 y(\\Stev)o(ens")15 b(and)h(\\Bac)o(h".)21 b(Read)c(the)f(annotated)f=0A=
(bibliograph)o(y)i(\(App)q(endix)h(A\))d(for)g(a)h(list)h(of)e(b)q(o)q(ok=
s)=0A=
150 1544 y(that)f(y)o(ou)h(should)i(at)d(least)h(recognize)i(references)e=0A=
(to,)g(ev)o(en)g(if)h(y)o(ou)f(ha)o(v)o(e)f(not)h(read)g(them.)150=0A=
1697 y Fq(Read)j(the)h(F)-6 b(A)n(Q)p eop=0A=
%%Page: 4 15=0A=
4 14 bop 150 438 a Fv(Chapter)34 b(1)150 686 y Fx(Device)41=0A=
b(Driv)m(ers)150 961 y Ft(1.1)70 b(What)23 =
b(is)f(a)h(Device)e(Driv)n(er?)150=0A=
1094 y FH(Making)16 b(hardw)o(are)f(w)o(ork)g(is)i(tedious.)23=0A=
b(T)l(o)16 b(write)g(to)f(a)h(hard)g(disk,)h(for)e(example,)i(requires)g=0A=
(that)e(y)o(ou)150 1158 y(write)c(magic)h(n)o(um)o(b)q(ers)g(in)g(magic)f=0A=
(places,)i(w)o(ait)e(for)g(the)g(hard)g(driv)o(e)h(to)f(sa)o(y)g(that)f(i=
t)i=0A=
(is)g(ready)f(to)g(receiv)o(e)150 1222 y(data,)17 =
b(and)g(then)h(feed)g(it)f=0A=
(the)g(data)g(it)h(w)o(an)o(ts,)e(v)o(ery)h(carefully)l(.)27=0A=
b(T)l(o)17 b(write)h(to)e(a)h(\015opp)o(y)h(disk)g(is)g(ev)o(en)150=0A=
1287 =
y(harder,)i(and)g(requires)g(that)f(the)g(program)g(sup)q(ervise)i(the)e=0A=
(\015opp)o(y)h(disk)g(driv)o(e)g(almost)f(constan)o(tly)150=0A=
1351 y(while)e(it)e(is)h(running.)221 1439 =
y(Instead)g(of)f(putting)h(co)q=0A=
(de)g(in)h(eac)o(h)f(application)h(y)o(ou)f(write)f(to)h(con)o(trol)f(eac=
)o=0A=
(h)h(device,)h(y)o(ou)e(share)150 1503 =
y(the)c(co)q(de)h(b)q(et)o(w)o(een)f=0A=
(applications.)20 b(T)l(o)11 =
b(mak)o(e)f(sure)h(that)g(that)f(co)q(de)i(is)f=0A=
(not)g(compromised,)h(y)o(ou)e(protect)150 1568 =
y(it)i(from)g(users)g(and)g=0A=
(normal)g(programs)f(that)h(use)g(it.)19 b(If)13 =
b(y)o(ou)e(do)h(it)h(righ)o=0A=
(t,)f(y)o(ou)g(will)h(b)q(e)g(able)g(to)e(add)i(and)150 1632=0A=
y(remo)o(v)o(e)i(devices)j(from)e(y)o(our)f(system)h(without)g(c)o(hangin=
g)h=0A=
(y)o(our)f(applications)h(at)f(all.)24 b(F)l(urthermore,)150=0A=
1696 y(y)o(ou)19 =
b(need)g(to)g(b)q(e)g(able)h(to)e(load)h(y)o(our)g(program)f=0A=
(in)o(to)h(memory)f(and)h(run)g(it,)h(whic)o(h)g(the)f(op)q(erating)150=0A=
1761 y(system)f(also)g(do)q(es.)29 b(So,)18 =
b(an)g(op)q(erating)h(system)e=0A=
(is)i(essen)o(tially)g(a)f(preiviledged,)k(general,)c(sharable)150=0A=
1825 =
y(library)e(or)f(lo)o(w-lev)o(el)h(hardw)o(are)f(and)g(memory)g(and)g=0A=
(pro)q(cess)h(con)o(trol)f(functions)g(and)h(routines.)221=0A=
1913 y(All)i(v)o(ersions)e(of)h Fn(un)p FB(?)p Fn(x)f =
FH(ha)o(v)o(e)g(an)h=0A=
(abstract)e(w)o(a)o(y)h(of)g(reading)h(and)g(writing)g(devices.)26=0A=
b(By)17 b(making)150 1977 =
y(the)d(devices)h(act)e(as)h(m)o(uc)o(h)g(as)f(p)q=0A=
(ossible)j(lik)o(e)f(regular)e(\014les,)i(the)f(same)g(calls)g(\()p=0A=
FE(read\(\))p FH(,)f FE(write\(\))p FH(,)g(etc.\))150 2042=0A=
y(can)i(b)q(e)g(used)h(for)e(devices)i(and)f(\014les.)21 b(Within)16=0A=
b(the)f(k)o(ernel,)g(there)g(are)g(a)f(set)h(of)f(functions,)i(registered=
)150=0A=
2106 =
y(with)f(the)g(\014lesystem,)g(whic)o(h)g(are)g(called)h(to)e(handle)i=0A=
(requests)f(to)f(do)h(I/O)g(on)f(\\device)i(sp)q(ecial)h(\014les,")150=0A=
2170 y(whic)o(h)f(are)f(those)g(whic)o(h)h(represen)o(t)f(devices.)953=0A=
2154 y Fm(1)221 2258 y =
FH(All)k(devices)g(con)o(trolled)g(b)o(y)e(the)h(same)=0A=
g(device)h(driv)o(er)f(are)g(giv)o(en)g(the)g(same)g =
FD(ma)s(jor)j(n)o(um)o=0A=
(b)q(er,)150 2323 y =
FH(and)c(of)f(those)h(with)g(the)g(same)f(ma)s(jor)f(n)o=0A=
(um)o(b)q(er,)i(di\013eren)o(t)h(devices)g(are)f(distinguished)i(b)o(y)e=0A=
(di\013eren)o(t)150 2387 y FD(minor)h(n)o(um)o(b)q(ers.)512=0A=
2371 y Fm(2)p 150 2418 720 2 v 207 2450 a FA(1)225 2465 y Fl(Se)q(e)h=0A=
Fk(mknod\(1,2\))10 b Fl(fo)q(r)18 =
b(an)h(ex)q(p)s(l)r(a)r(n)s(a)r(t)r(i)r(o)r=0A=
(n)h(of)d(ho)q(w)i(to)f(m)q(a)r(k)r(e)g(th)r(e)r(s)q(e)h(\014l)r(e)r(s)r(=
.)=0A=
207 2498 y FA(2)225 2513 y =
Fl(Th)r(i)r(s)g(is)f(no)r(t)h(st)q(r)q(i)r(c)r(t)r=0A=
(l)r(y)h(tru)s(e)r(,)e(bu)r(t)h(is)f(cl)q(o)r(s)r(e)i(en)q(o)s(u)r(g)s(h)=
r(.)=0A=
k(If)17 =
b(y)o(o)r(u)j(un)r(d)s(e)r(r)r(s)q(t)r(a)r(n)s(d)g(wh)s(e)r(r)q(e)g=0A=
(it)d(is)h(no)r(t)h(tr)q(u)r(e)r(,)g(y)o(o)q(u)h(do)r(n)s(')q(t)1039=0A=
2678 y FH(4)p eop=0A=
%%Page: 5 16=0A=
5 15 bop 150 -84 1800 3 v 150 -100 a FD(1.2.)42 b(User-space)18=0A=
b(device)g(driv)o(ers)1075 b FH(5)221 88 y(This)21 =
b(c)o(hapter)g(explains)i=0A=
(ho)o(w)d(to)h(write)g(an)o(y)g(t)o(yp)q(e)g(of)g(Lin)o(ux)h(device)g(dri=
v)o=0A=
(er)g(that)e(y)o(ou)h(migh)o(t)150 153 y(need)16 b(to,)f(including)j(c)o=0A=
(haracter,)c(blo)q(c)o(k,)i(SCSI,)g(and)g(net)o(w)o(ork)e(driv)o(ers.)21=0A=
b FD([W)l(ell,)e(it)g(will)g(when)e(it)i(is)150 217 y(done)p=0A=
FB(:)8 b(:)g(:)e FD(])18 b FH(It)f(explains)i(what)d(functions)i(y)o(ou)f=0A=
(need)h(to)f(write,)h(ho)o(w)e(to)h(initialize)j(y)o(our)d(driv)o(ers)h(a=
nd)=0A=
150 281 =
y(obtain)f(memory)e(for)h(them)h(e\016cien)o(tly)l(,)h(and)e(what)g=0A=
(function)h(are)f(built)i(in)f(to)f(Lin)o(ux)i(to)e(mak)o(e)f(y)o(our)150=0A=
346 y(job)g(easier.)221 434 =
y(Creating)k(device)j(driv)o(ers)e(for)f(Lin)o=0A=
(ux)j(is)e(easier)g(than)g(y)o(ou)g(migh)o(t)g(think.)35 b(It)20=0A=
b(merely)g(in)o(v)o(olv)o(es)150 498 y(writing)15 b(a)g(few)f(functions)i=0A=
(and)f(registering)g(them)g(with)g(the)f(Virtual)i(Filesystem)f(Switc)o(h=
)h=0A=
(\(VFS\),)d(so)150 562 =
y(that)h(when)i(the)f(prop)q(er)h(device)h(sp)q(ecial)=0A=
g(\014les)f(are)f(accessed,)g(the)g(VFS)g(can)h(call)g(y)o(our)f(function=
s.)=0A=
221 650 y(Ho)o(w)o(ev)o(er,)i(a)i(w)o(ord)e(of)h(w)o(arning)h(is)g(due)g=0A=
(here:)27 b(W)l(riting)19 b(a)f(device)i(driv)o(er)f FD(is)f=0A=
FH(writing)h(a)f(part)g(of)150 715 y(the)g(Lin)o(ux)i(k)o(ernel.)29=0A=
b(This)19 =
b(means)f(that)g(y)o(our)f(driv)o(er)i(runs)f(with)h(k)o(ernel)f(p)=0A=
q(ermissions,)i(and)f(can)f(do)150 779 y(an)o(ything)13 =
b(it)h(w)o(an)o(ts)d=0A=
(to:)19 b(write)13 =
b(to)f(an)o(y)h(memory)l(,)f(reformat)g(y)o(our)h(hard)g=0A=
(driv)o(e,)g(damage)g(y)o(our)f(monitor)150 843 =
y(or)h(video)h(card,)g(or)f=0A=
(ev)o(en)h(break)g(y)o(our)f(dishes,)h(if)g(y)o(our)f(dish)o(w)o(asher)h(=
is)g=0A=
(con)o(trolled)h(b)o(y)e(y)o(our)g(computer.)150 908 y(Be)j(careful.)221=0A=
996 =
y(Also,)e(y)o(our)f(driv)o(er)h(will)h(run)f(in)h(k)o(ernel)g(mo)q(de,)e=0A=
(and)h(the)g(Lin)o(ux)h(k)o(ernel,)g(lik)o(e)g(most)e Fn(un)p=0A=
FB(?)p Fn(x)g FH(k)o(ernels,)150 1060 y(is)h(non-pre-emptible.)21=0A=
b(This)14 =
b(means)f(that)f(if)i(y)o(ou)f(driv)o(er)g(tak)o(es)g(a)f(long)i=0A=
(time)f(to)g(w)o(ork)f(without)h(giving)150 1124 =
y(other)i(programs)g(a)g(c)o=0A=
(hance)h(to)f(w)o(ork,)g(y)o(our)g(computer)h(will)h(app)q(ear)f(to)f=0A=
(\\freeze")g(when)h(y)o(our)g(driv)o(er)150 1189 y(is)g(running.)21=0A=
b(Normal)15 =
b(user-mo)q(de)h(pre-emptiv)o(e)g(sc)o(heduling)h(do)q(es)e(not)g=0A=
(apply)h(to)f(y)o(our)f(driv)o(er.)221 1276 =
y(If)f(y)o(ou)g(c)o(ho)q(ose)h=0A=
(to)e(write)i(a)f(device)i(driv)o(er,)f(y)o(ou)f(m)o(ust)f(tak)o(e)h(ev)o=0A=
(erything)h(written)f(here)h(as)f(a)g(guide,)150 1341 y(and)21=0A=
b(no)f(more.)35 b(I)21 =
b(cannot)f(guaran)o(tee)g(that)f(this)i(c)o(hapter)g=0A=
(will)h(b)q(e)f(free)f(of)g(errors,)h(and)f(I)h(cannot)150=0A=
1405 y(guaran)o(tee)d(that)g(y)o(ou)g(will)i(not)e(damage)g(y)o(our)g=0A=
(computer,)h(ev)o(en)g(if)g(y)o(ou)f(follo)o(w)g(these)h(instructions)150=0A=
1470 y(exactly)l(.)31 b(It)18 =
b(is)i(highly)g(unlik)o(ely)h(that)d(y)o(ou)g=0A=
(will)i(damage)e(it,)i(but)e(I)h(cannot)g(guaran)o(tee)f(against)g(it.)15=
0=0A=
1534 =
y(There)e(is)g(only)g(one)g(\\infallible")j(direction)e(I)f(can)g(giv)o=0A=
(e)f(y)o(ou:)21 b FD(Bac)o(k)d(up!)k FH(Bac)o(k)15 =
b(up)h(b)q(efore)g(y)o(ou)=0A=
g(test)150 1598 =
y(y)o(our)f(new)g(device)i(driv)o(er,)e(or)g(y)o(ou)f(ma)o(y)=0A=
h(regret)g(it)g(later.)150 1775 y Ft(1.2)70 b(User-space)22=0A=
b(device)f(driv)n(ers)150 1908 y =
FH(It)d(is)h(not)f(alw)o(a)o(ys)f(necessary)=0A=
h(to)g(write)g(a)g(device)i(driv)o(er)e(for)g(a)g(device,)i(esp)q(ecially=
)g=0A=
(in)f(applications)150 1973 =
y(where)g(no)g(t)o(w)o(o)e(applications)k(will)f=0A=
(comp)q(ete)g(for)e(the)h(device.)32 b(The)19 =
b(most)f(useful)i(example)g(of)=0A=
f(this)150 2037 =
y(is)f(a)g(memory-mapp)q(ed)g(device,)i(but)e(y)o(ou)f(can)h=0A=
(also)g(do)g(this)g(with)h(devices)g(in)f(I/O)h(space)f(\(devices)150=0A=
2101 y(accessed)e(with)g FE(inb\(\))e FH(and)i FE(outb\(\))p=0A=
FH(,)e(etc.\).)20 b(If)c(y)o(our)e(pro)q(cess)i(is)g(running)g(as)f(sup)q=0A=
(eruser)i(\(ro)q(ot\),)c(y)o(ou)150 2166 y(can)i(use)h(the)g=0A=
FE(mmap\(\))e =
FH(call)j(to)d(map)h(some)g(of)g(y)o(our)g(pro)q(cess)h(memory)=0A=
f(to)f(actual)i(memory)f(lo)q(cations,)150 2230 y(b)o(y)21=0A=
b FE(mmap\(\))p FH('ing)e(a)i(section)g(of)f(/dev/mem.)36 b(When)21=0A=
b(y)o(ou)f(ha)o(v)o(e)g(done)h(this)g(mapping,)i(it)e(is)g(prett)o(y)150=0A=
2294 =
y(easy)c(to)f(write)h(and)g(read)f(from)h(real)g(memory)f(addresses)h=0A=
(just)f(as)h(y)o(ou)f(w)o(ould)i(read)e(and)h(write)g(an)o(y)150=0A=
2359 y(v)m(ariables.)p 150 2389 720 2 v 150 2432 a =
Fl(ne)r(e)r(d)g(to)f(rea)s=0A=
(d)h(th)r(i)q(s)g(se)q(c)r(t)q(i)r(o)s(n)r(,)f(an)r(d)i(if)c(y)o(o)r(u)k(=
do)r=0A=
(n)r(')q(t)e(bu)s(t)g(w)o(a)r(n)r(t)g(to)g(le)q(a)r(r)r(n)r(,)g(re)q(a)r(=
d)i=0A=
(th)q(e)f(co)r(d)s(e)g(for)g(th)q(e)g(tt)o(y)g(de)r(v)r(i)r(c)r(e)r(s)r(,=
)f=0A=
(wh)r(i)r(c)q(h)150 2484 y(us)r(e)r(s)i(up)h(2)e(ma)5 b(j)q(o)r(r)19=0A=
b(n)o(u)r(m)r(b)t(e)r(r)r(s)r(,)e(an)r(d)j(ma)r(y)f(us)r(e)f(a)f(th)q(i)r=
(r)q=0A=
(d)j(an)r(d)f(p)q(o)s(s)q(s)r(i)r(b)s(l)r(y)g(fou)s(r)r(t)q(h)h(b)o(y)f(t=
h)q=0A=
(e)g(tim)t(e)g(y)o(o)q(u)h(re)q(a)r(d)g(th)q(i)r(s)r(.)p eop=0A=
%%Page: 6 17=0A=
6 16 bop 150 -84 1800 3 v 150 -100 a FD(1.2.)42 b(User-space)18=0A=
b(device)g(driv)o(ers)1075 b FH(6)221 88 y(If)20 b(y)o(our)f(driv)o(er)h=0A=
(needs)h(to)e(resp)q(ond)i(to)e(in)o(terrupts,)i(then)f(y)o(ou)f(really)i=0A=
(need)g(to)e(b)q(e)i(w)o(orking)e(in)150 153 y(k)o(ernel)c(space,)g(and)f=0A=
(need)h(to)f(write)h(a)f(real)g(device)i(driv)o(er,)f(as)f(there)g(is)h(n=
o)g=0A=
(go)q(o)q(d)f(w)o(a)o(y)f(at)h(this)h(time)g(to)150 217 =
y(deliv)o(er)g(in)o=0A=
(terrupts)e(to)g(user)h(pro)q(cesses.)19 b(Although)14 =
b(the)g(DOSEMU)f(pro)s=0A=
(ject)g(has)g(created)h(something)150 281 y(called)22 =
b(the)f(SIG)h(\(Silly)g=0A=
(In)o(terrupt)f(Generator\))f(whic)o(h)i(allo)o(ws)f(in)o(terrupts)g(to)f=
(b)q=0A=
(e)h(p)q(osted)h(to)e(user)150 346 y(pro)q(cesses)15 =
b(\(I)f(b)q(eliev)o(e)i=0A=
(through)e(the)g(use)h(of)e(signals\),)i(the)f(SIG)h(is)f(not)g(particula=
rly)=0A=
h(fast,)f(and)g(should)150 410 =
y(b)q(e)i(though)o(t)e(of)h(as)g(a)g(last)g=0A=
(resort)f(for)h(things)g(lik)o(e)i(DOSEMU.)221 498 y(An)g(in)o(terrupt)h=0A=
(\(for)e(those)h(who)g(don't)g(kno)o(w\))f(is)i(an)f(asyncronous)g=0A=
(noti\014cation)h(p)q(osted)g(b)o(y)f(the)150 562 =
y(hardw)o(are)g(to)h(alert)=0A=
g(the)g(device)i(driv)o(er)e(of)g(some)g(condition.)30 b(Y)l(ou)18=0A=
b(ha)o(v)o(e)g(lik)o(ely)i(dealt)e(with)h(`IR)o(Q's)150 627=0A=
y(when)d(setting)f(up)h(y)o(our)f(hardw)o(are;)f(an)h(IR)o(Q)h(is)g(an)f=0A=
(\\In)o(terrupt)g(ReQuest)i(line,")f(whic)o(h)g(is)g(triggered)150=0A=
691 =
y(when)i(the)g(device)i(w)o(an)o(ts)c(to)i(talk)g(to)f(the)h(driv)o(er.)=0A=
28 b(This)19 =
b(ma)o(y)e(b)q(e)h(b)q(ecause)h(it)f(has)g(data)f(to)g(giv)o(e)i=0A=
(to)150 755 y(the)14 b(driv)o(e,)h(or)f(b)q(ecause)h(it)f(is)h(no)o(w)f=0A=
(ready)g(to)g(receiv)o(e)h(data,)e(or)h(b)q(ecause)h(of)f(some)g(other)g=0A=
(\\exceptional)150 820 =
y(condition")f(that)d(the)i(driv)o(er)g(needs)g(to)f=0A=
(kno)o(w)g(ab)q(out.)19 b(It)11 =
b(is)i(similar)f(to)f(user-lev)o(el)i(pro)q=0A=
(cesses)f(receiving)150 884 y(a)17 b FD(signal,)i =
FH(so)d(similar)i(that)e=0A=
(the)h(same)g FE(sigaction)e =
FH(structure)i(is)g(used)h(in)f(the)g(k)o(ernel)=0A=
h(to)e(deal)i(with)150 949 =
y(in)o(terrupts)f(as)f(is)h(used)g(in)g(user-lev)o=0A=
(el)i(programs)c(to)h(deal)h(with)g(signals.)25 b(Where)16=0A=
b(the)h(user-lev)o(el)h(has)150 1013 y(its)13 =
b(signals)i(deliv)o(ered)g(to)d=0A=
(it)i(b)o(y)f(the)g(k)o(ernel,)h(the)g(k)o(ernel)g(has)f(in)o(terrupt)h=0A=
(deliv)o(ered)h(to)d(it)i(b)o(y)f(hardw)o(are.)221 1101 y(If)d(y)o(our)h=0A=
(driv)o(er)g(m)o(ust)f(b)q(e)h(accessible)i(to)d(m)o(ultiple)i(pro)q(cess=
es)f=0A=
(at)f(once,)i(and/or)e(manage)g(con)o(ten)o(tion)150 1165 y(for)17=0A=
b(a)h(resource,)h(then)f(y)o(ou)g(also)g(need)h(to)e(write)i(a)e(real)i=0A=
(device)g(driv)o(er)g(at)e(the)h(k)o(ernel)h(lev)o(el,)h(and)e(a)150=0A=
1229 =
y(user-space)e(device)g(driv)o(er)g(will)h(not)e(b)q(e)h(su\016cien)o(t)=0A=
f(or)g(ev)o(en)h(p)q(ossible.)150 1382 y Fq(1.2.1)55 b(Example:)22=0A=
b Fp(vgalib)150 1499 y =
FH(A)d(go)q(o)q(d)g(example)h(of)f(a)g(user-space)h=0A=
(driv)o(er)f(is)h(the)f FE(vgalib)f FH(library)l(.)33 b(The)20=0A=
b(standard)e FE(read\(\))h FH(and)150 1563 y FE(write\(\))14=0A=
b =
FH(calls)i(are)f(really)h(inadequate)g(for)e(writing)i(a)f(really)h(fast)=
e=0A=
(graphics)h(driv)o(er,)g(and)h(so)e(instead)150 1628 y(there)i(is)g(a)f=0A=
(library)h(whic)o(h)h(acts)e(conceptually)i(lik)o(e)g(a)e(device)i(driv)o=0A=
(er,)e(but)h(runs)g(in)g(user)g(space.)21 b(An)o(y)150 1692=0A=
y(pro)q(cesses)14 b(whic)o(h)f(use)h(it)f FD(m)o(ust)f =
FH(run)i(setuid)g(ro)q=0A=
(ot,)e(b)q(ecause)i(it)g(uses)f(the)g FE(ioperm\(\))f =
FH(system)h(call.)20=0A=
b(It)13 b(is)150 1756 =
y(p)q(ossible)j(for)e(a)g(pro)q(cess)g(that)g(is)g(not)=0A=
g(setuid)h(ro)q(ot)f(to)f(write)i(to)e(/dev/mem)h(if)h(y)o(ou)f(ha)o(v)o(=
e)g=0A=
(a)f(group)h FE(mem)150 1821 y FH(or)g FE(kmem)g =
FH(whic)o(h)h(is)g(allo)o(w)=0A=
o(ed)g(write)g(p)q(ermission)h(to)d(/dev/mem)i(and)f(the)h(pro)q(cess)g(i=
s)g=0A=
(prop)q(erly)g(setgid,)150 1885 =
y(but)g(only)h(a)f(pro)q(cess)g(running)i(as)=0A=
e(ro)q(ot)f(can)h(execute)h(the)f FE(ioperm\(\))f FH(call.)221=0A=
1973 y(There)19 =
b(are)f(sev)o(eral)h(I/O)g(p)q(orts)g(asso)q(ciated)g(with)g=0A=
(V)o(GA)f(graphics.)31 b FE(vgalib)18 b FH(creates)h(sym)o(b)q(olic)150=0A=
2037 y(names)12 b(for)g(this)h(with)f FE(#define)g =
FH(statemen)o(ts,)f(and)i=0A=
(then)f(issues)h(the)g FE(ioperm\(\))e =
FH(call)j(lik)o(e)f(this)g(to)e(mak)o=0A=
(e)150 2102 =
y(it)k(p)q(ossible)i(for)e(the)g(pro)q(cess)h(to)e(read)h(and)h=0A=
(write)f(directly)i(from)d(and)h(to)g(those)g(p)q(orts:)351=0A=
2213 y Fs(if)21 b(\(ioperm\(CRT_IC,)e(1,)i(1\)\))g({)438 2270=0A=
y(printf\("VGAlib:)e(can't)h(get)i(I/O)f(permissions)e(\\n"\);)438=0A=
2326 y(exit)i(\(-1\);)351 2383 y(})351 2440 y(ioperm\(CRT_IM,)40=0A=
b(1,)22 b(1\);)351 2497 y(ioperm\(ATT_IW,)d(1,)i(1\);)p eop=0A=
%%Page: 7 18=0A=
7 17 bop 150 -84 1800 3 v 150 -100 a FD(1.2.)42 b(User-space)18=0A=
b(device)g(driv)o(ers)1075 b FH(7)264 88 y Fj([)p Fi(:)7 b(:)g(:)e=0A=
Fj(])150 207 y FH(It)17 =
b(only)h(needs)g(to)e(do)h(error)g(c)o(hec)o(king)h=0A=
(once,)g(b)q(ecause)g(the)f(only)h(reason)e(for)h(the)g FE(ioperm\(\))f=0A=
FH(call)j(to)150 271 =
y(fail)d(is)g(that)e(it)i(is)f(not)g(b)q(eing)i(called)f=0A=
(b)o(y)g(the)f(sup)q(eruser,)h(and)f(this)h(status)e(is)i(not)e(going)i(t=
o)e=0A=
(c)o(hange.)221 359 y(After)19 =
b(making)i(this)f(call,)j(the)d(pro)q(cess)h=0A=
(is)f(allo)o(w)o(ed)h(to)f(use)g FE(inb)g FH(and)g FE(outb)g=0A=
FH(mac)o(hine)h(instruc-)-1895 b Fr(3)150 423 y FH(tions,)16=0A=
b(but)h(only)g(on)f(the)g(sp)q(eci\014ed)j(p)q(orts.)k(These)16=0A=
b(instructions)i(can)e(b)q(e)h(accessed)g(without)f(writing)150=0A=
488 y(directly)21 b(in)g(assem)o(bly)f(b)o(y)g(including)j=0A=
FE(<linux/asm>)p =
FH(,)c(but)h(will)i(only)e(w)o(ork)f(if)h(y)o(ou)g(compile)h=0A=
FD(with)150 552 y(optimization)f(on,)c FH(b)o(y)f(giving)h(the)g=0A=
FE(-O)p FC(?)f FH(to)f(gcc.)20 b(Read)c FE(<linux/asm>)e =
FH(for)g(details.)=0A=
221 640 y(After)19 b(arranging)g(for)g(p)q(ort)g(I/O,)g FE(vgalib)g=0A=
FH(arranges)g(for)g(writing)h(directly)g(to)f(k)o(ernel)i(memory)150=0A=
704 y(with)16 b(the)f(follo)o(wing)h(co)q(de:)351 815 y Fs(/*)21=0A=
b(open)g(/dev/mem)f(*/)351 872 =
y(if)h(\(\(mem_fd)f(=3D)i(open\("/dev/mem",)c=0A=
(O_RDWR\))j(\))g(<)h(0\))f({)438 929 y(printf\("VGAlib:)e(can't)h(open)h=0A=
(/dev/mem)g(\\n"\);)438 985 y(exit)g(\(-1\);)351 1042 y(})351=0A=
1156 y(/*)g(mmap)g(graphics)f(memory)h(*/)351 1212 =
y(if)g(\(\(graph_mem)f(=3D)h=0A=
(malloc\(GRAPH_SIZE)e(+)i(\(PAGE_SIZE-1\)\)\))e(=3D=3D)i(NULL\))g({)438=0A=
1269 y(printf\("VGAlib:)e(allocation)g(error)i(\\n"\);)438=0A=
1326 y(exit)g(\(-1\);)351 1383 y(})351 1440 y(if)g(\(\(unsigned)f=0A=
(long\)graph_mem)f(\045)i(PAGE_SIZE\))438 1496 =
y(graph_mem)f(+=3D)h(PAGE_SIZE)f=0A=
(-)i(\(\(unsigned)e(long\)graph_mem)e(\045)k(PAGE_SIZE\);)351=0A=
1553 y(graph_mem)e(=3D)h(\(unsigned)f(char)h(*\)mmap\()438 1610=0A=
y(\(caddr_t\)graph_me)o(m,)438 1667 y(GRAPH_SIZE,)438 1724=0A=
y(PROT_READ|PROT_WR)o(ITE,)438 1780 y(MAP_SHARED|MAP_FI)o(XED,)438=0A=
1837 y(mem_fd,)438 1894 y(GRAPH_BASE)351 1951 y(\);)351 2007=0A=
y(if)g(\(\(long\)graph_mem)e(<)i(0\))h({)438 2064 =
y(printf\("VGAlib:)d(mmap)i=0A=
(error)f(\\n"\);)438 2121 y(exit)h(\(-1\);)351 2178 y(})150=0A=
2296 y FH(It)16 b(\014rst)g(op)q(ens)g(/dev/mem,)g(then)g(allo)q(cates)h=0A=
(memory)e(enough)h(so)g(that)f(the)h(mapping)h(can)f(b)q(e)h(done)150=0A=
2361 =
y(on)g(a)f(page)h(\(4)f(KB\))h(b)q(oundary)l(,)h(and)f(then)g(attempts)f=0A=
(the)h(map.)25 b FE(GRAPH)p 1453 2361 15 2 v 16 w(SIZE)17 b=0A=
FH(is)g(the)g(size)h(of)e(V)o(GA)150 2425 y(memory)l(,)22 b(and)f=0A=
FE(GRAPH)p 559 2425 V 17 w(BASE)f =
FH(is)i(the)f(\014rst)g(address)g(of)g(V)o=0A=
(GA)g(memory)g(in)h(/dev/mem.)37 b(Then)22 b(b)o(y)150 2489=0A=
y(writing)15 b(to)g(the)g(address)f(that)h(is)g(returned)g(b)o(y)g=0A=
FE(mmap\(\))p FH(,)f(the)h(pro)q(cess)g(is)g(actually)h(writing)f(to)f=0A=
(screen)150 2554 y(memory)l(.)p eop=0A=
%%Page: 8 19=0A=
8 18 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1178 b FH(8)150 88 y Fq(1.2.2)55 b(Example:)22=0A=
b(mouse)17 b(con)n(v)n(ersion)150 206 y FH(If)c(y)o(ou)f(w)o(an)o(t)f(a)h=0A=
(driv)o(er)h(that)f(acts)g(a)g(bit)h(more)f(lik)o(e)i(a)e(k)o(ernel-lev)o=
(el)=0A=
j(driv)o(er,)e(but)f(do)q(es)h(not)f(liv)o(e)i(in)f(k)o(ernel)150=0A=
270 y(space,)18 =
b(y)o(ou)f(can)g(also)h(mak)o(e)e(a)h(\014fo,)h(or)e(named)i=0A=
(pip)q(e.)28 b(This)18 =
b(usually)h(liv)o(es)f(in)g(the)g(/dev/)f(directory)=0A=
150 334 =
y(\(although)i(it)g(do)q(esn't)g(need)h(to\))e(and)i(acts)e(substan)o=0A=
(tially)i(lik)o(e)h(a)d(device)j(once)e(set)g(up.)32 =
b(Ho)o(w)o(ev)o(er,)150=0A=
399 y(\014fo's)15 =
b(are)f(one-directional)k(only)d(|)h(they)f(ha)o(v)o(e)g=0A=
(one)g(reader)h(and)f(one)g(writer.)221 487 y(F)l(or)20 =
b(instance,)j(it)e=0A=
(used)h(to)e(b)q(e)i(that)e(if)h(y)o(ou)g(had)g(a)g(PS/2-st)o(yle)g(mouse=
,)h=0A=
(and)f(w)o(an)o(ted)f(to)h(run)150 551 y(XF)l(ree86,)12 =
b(y)o(ou)g(had)g(to)g=0A=
(create)f(a)h(\014fo)g(called)i(/dev/mouse,)e(and)g(run)h(a)f(program)f=0A=
(called)i(mcon)o(v)f(whic)o(h)150 615 y(read)17 b(PS/2)h(mouse)f=0A=
(\\droppings")h(from)e(/dev/psaux,)i(and)g(wrote)e(the)i(equiv)m(alen)o(t=
)h=0A=
(microsoft-st)o(yle)150 680 y(\\droppings")c(to)f(/dev/mouse.)19=0A=
b(Then)c(XF)l(ree86)f(w)o(ould)h(read)f(the)h(\\droppings")g(from)e=0A=
(/dev/mouse,)150 744 =
y(and)i(it)h(w)o(ould)f(b)q(e)h(as)f(if)h(there)f(w)o=0A=
(ere)g(a)g(microsoft)f(mouse)i(connected)g(to)e(/dev/mouse.)1692=0A=
727 y Fm(3)150 921 y Ft(1.3)70 b(Device)20 b(Driv)n(er)i(Basics)150=0A=
1054 y =
FH(W)l(e)e(will)h(assume)f(that)f(y)o(ou)g(decide)i(that)e(y)o(ou)g=0A=
(do)h(not)f(wish)i(to)e(write)g(a)h(user-space)g(device,)i(and)150=0A=
1118 y(w)o(ould)13 =
b(rather)f(implemen)o(t)i(y)o(our)e(device)j(in)e(the)g(k)=0A=
o(ernel.)20 b(Y)l(ou)13 =
b(will)h(probably)f(b)q(e)h(writing)f(writing)g(t)o=0A=
(w)o(o)150 1183 y(\014les,)j(a)g FE(.c)f FH(\014le)i(and)f(a)g=0A=
FE(.h)f =
FH(\014le,)i(and)f(p)q(ossibly)h(mo)q(difying)g(other)e(\014les)i(as)=0A=
e(w)o(ell,)i(as)e(will)j(b)q(e)e(describ)q(ed)150 1247 =
y(b)q(elo)o(w.)k(W)l=0A=
(e)15 =
b(will)h(refer)f(to)f(y)o(our)g(\014les)h(as)f(fo)q(o.c)g(and)h(fo)q=0A=
(o.h,)f(and)h(y)o(our)f(driv)o(er)h(will)h(b)q(e)f(the)g FE(foo)f=0A=
FH(driv)o(er.)221 1335 y =
FD([Should)j(I)e(include)i(at)f(the)g(b)q(eginning)i=0A=
(of)e(this)g(section)g(an)h(example)e(of)h(c)o(hargen)h(and)150=0A=
1399 y(c)o(harsink?)30 b(Man)o(y)19 =
b(writers)i(do,)f(but)g(I)g(don't)h(kno)o=0A=
(w)d(that)j(it)f(is)g(the)g(b)q(est)g(w)o(a)o(y)l(.)29 b(I'd)20=0A=
b(lik)o(e)150 1464 y(p)q(eople's)f(opinions)f(on)g(this.])150=0A=
1617 y Fq(1.3.1)55 b(Namespace)150 1734 y FH(One)15 =
b(of)e(the)h(\014rst)g=0A=
(things)g(y)o(ou)f(will)j(need)f(to)e(do,)h(b)q(efore)g(writing)g(an)o(y)=
g=0A=
(co)q(de,)g(is)g(to)g(name)g(y)o(our)f(device.)150 1799 y(This)19=0A=
b(name)f(should)i(b)q(e)f(a)f(short)f(\(probably)i(t)o(w)o(o)e(or)h(three=
)g=0A=
(c)o(haracter\))f(string.)30 b(F)l(or)17 b(instance,)j(the)150=0A=
1863 y(parallel)c(device)g(is)f(the)g(\\)p FE(lp)p FH(")e(device,)j(the)f=0A=
(\015oppies)g(are)g(the)f(\\)p FE(fd)p =
FH(")g(devices,)i(and)e(SCSI)h(disks)h=0A=
(are)e(the)150 1927 y(\\)p FE(sd)p FH(")j(devices.)27 b(As)18=0A=
b(y)o(ou)f(write)g(y)o(our)g(driv)o(er,)h(y)o(ou)f(will)i(giv)o(e)f(y)o(o=
ur)f=0A=
(functions)h(names)f(pre\014xed)i(with)150 1992 y(y)o(our)f(c)o(hosen)g=0A=
(string)h(to)f(a)o(v)o(oid)g(an)o(y)g(namespace)g(confusion.)31=0A=
b(W)l(e)18 b(will)i(call)g(y)o(our)d(pre\014x)i FE(foo,)g FH(and)150=0A=
2056 y(giv)o(e)c(y)o(our)g(functions)h(names)f(lik)o(e)i FE(foo)p=0A=
841 2056 15 2 v 16 w(read\(\),)23 b(foo)p 1120 2056 V 17 w(write\(\),)14=0A=
b FH(etc.)150 2209 y Fq(1.3.2)55 b(Allo)r(cating)18 b(memor)o(y)150=0A=
2326 y =
FH(Memory)j(allo)q(cation)j(in)f(the)f(k)o(ernel)h(is)g(a)f(little)i=0A=
(di\013eren)o(t)f(from)f(memory)f(allo)q(cation)j(in)f(normal)150=0A=
2391 y(user-lev)o(el)18 b(programs.)24 b(Instead)17 =
b(of)f(ha)o(ving)h(a)g=0A=
FE(malloc\(\))e FH(capable)j(of)f(deliv)o(ering)h(almost)f(unlimited)p=0A=
150 2430 720 2 v 207 2458 a FA(3)225 2473 y =
Fl(Ev)q(e)r(n)i(th)q(o)s(u)r(g)s=0A=
(h)g(XF)o(r)r(e)r(e)r(8)r(6)g(is)e(no)q(w)h(ab)r(l)r(e)h(to)e(rea)s(d)i(P=
S)r=0A=
(/)s(2)f(sty)r(l)r(e)g(\\d)r(r)r(o)r(p)s(p)s(i)q(n)s(g)s(s)q(")s(,)f(th)q=
(e)h=0A=
(co)r(n)r(c)r(e)r(p)s(t)r(s)g(in)g(th)q(i)r(s)g(ex)q(a)s(m)s(p)s(l)r(e)15=
0=0A=
2525 y(sti)r(l)r(l)h(sta)s(n)r(d)s(.)j(If)17 =
b(y)o(o)q(u)j(ha)q(v)q(e)f(a)d=0A=
(b)q(e)r(t)q(t)r(e)r(r)j(ex)q(a)r(m)t(p)s(l)q(e)r(,)f(I'd)h(b)q(e)g(gl)q(=
a)r=0A=
(d)h(to)d(se)q(e)i(it.)p eop=0A=
%%Page: 9 20=0A=
9 19 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1178 b FH(9)150 88 y(amoun)o(ts)14 =
b(of)h(memory)l(,)g=0A=
(there)g(is)h(a)e FE(kmalloc\(\))g FH(function)i(that)f(is)h(a)e(bit)i=0A=
(di\013eren)o(t:)218 209 y FG(\017)23 b FH(Memory)18 =
b(is)i(pro)o(vided)g(in)=0A=
h(pieces)f(whose)g(size)g(is)g(a)f(p)q(o)o(w)o(er)g(of)g(2,)h(except)g(th=
at)e=0A=
(pieces)j(larger)264 273 =
y(than)c(128)g(b)o(ytes)h(are)f(allo)q(cated)i(in)g=0A=
(blo)q(c)o(ks)f(whose)g(size)g(is)h(a)e(p)q(o)o(w)o(er)g(of)h(2)f(min)o(u=
s)i=0A=
(some)e(small)264 337 y(amoun)o(t)h(for)g(o)o(v)o(erhead.)30=0A=
b(Y)l(ou)19 =
b(can)g(request)f(an)o(y)h(o)q(dd)g(size,)h(but)f(memory)f(will)j=0A=
(not)d(b)q(e)h(used)264 402 y(an)o(y)13 =
b(more)g(e\016cien)o(tly)j(if)e(y)o=0A=
(ou)f(request)h(a)f(31-b)o(yte)h(piece)h(than)f(it)g(will)h(if)f(y)o(ou)g=0A=
(request)f(a)h(32)f(b)o(yte)264 466 y(piece.)21 b(Also,)15=0A=
b(there)g(is)g(a)g(limit)h(to)e(the)h(amoun)o(t)f(of)g(memory)h(that)f(ca=
n)h=0A=
(b)q(e)g(allo)q(cated,)h(whic)o(h)f(is)264 530 =
y(curren)o(tly)g(131056)f(b)o=0A=
(ytes.)218 630 y FG(\017)23 b FE(kmalloc\(\))13 b =
FH(tak)o(es)g(a)h(second)h=0A=
(argumen)o(t,)e(the)i(priorit)o(y)l(.)20 b(This)15 =
b(is)g(used)f(as)g(an)h=0A=
(argumen)o(t)e(to)h(the)264 695 y FE(get)p 339 695 15 2 v 16=0A=
w(free)p 451 695 V 17 w(page\(\))h =
FH(function,)i(where)g(it)f(is)h(used)f=0A=
(to)g(determine)h(when)g(to)e(return.)23 b(The)16 b(usual)264=0A=
759 y(priorit)o(y)g(is)g FE(GFP)p 550 759 V 17 w(KERNEL)p =
FH(.)e(If)i(it)g=0A=
(ma)o(y)f(b)q(e)i(called)g(from)e(within)i(an)f(in)o(terrupt,)g(use)g=0A=
FE(GFP)p 1793 759 V 17 w(ATOMIC)264 823 y =
FH(and)h(b)q(e)h(truly)g(prepared)g=0A=
(for)f(it)g(to)g(fail)h(\(i.e.)f(don't)g(panic\).)27 b(This)18=0A=
b(is)g(b)q(ecause)h(if)f(y)o(ou)f(sp)q(ecify)264 888 y FE(GFP)p=0A=
339 888 V 16 w(KERNEL)p FH(,)c FE(kmalloc\(\))h =
FH(ma)o(y)f(sleep,)i(whic)o=0A=
(h)h(cannot)e(b)q(e)h(done)f(on)h(an)f(in)o(terrupt.)20 b(The)14=0A=
b(other)264 952 y(option)j(is)h FE(GFP)p 530 952 V 17 w(BUFFER)p=0A=
FH(,)e(whic)o(h)i(is)f(used)h(only)g(when)g(the)f(k)o(ernel)h(is)g(allo)q=0A=
(cating)g(bu\013er)g(space,)264 1016 =
y(and)d(nev)o(er)g(in)h(device)h(driv)o=0A=
(ers.)150 1137 y(T)l(o)12 b(free)g(memory)f(allo)q(cated)i(with)f=0A=
FE(kmalloc\(\))p FH(,)f(use)h(one)g(of)g(t)o(w)o(o)e(functions:)19=0A=
b FE(kfree\(\))11 b FH(or)g FE(kfree)p 1852 1137 V 17 w(s\(\))p=0A=
FH(.)150 1201 y(These)16 b(di\013er)g(from)f FE(free\(\))f=0A=
FH(in)i(a)f(few)g(w)o(a)o(ys)f(as)h(w)o(ell:)218 1321 y FG(\017)23=0A=
b FE(kfree\(\))14 b FH(is)h(a)g(macro)f(whic)o(h)h(calls)h=0A=
FE(kfree)p 1018 1321 V 17 w(s\(\))e =
FH(and)h(acts)g(lik)o(e)h(the)f(standard)=0A=
f FE(free\(\))g FH(outside)264 1386 y(the)h(k)o(ernel.)218=0A=
1485 y FG(\017)23 b =
FH(If)e(y)o(ou)g(kno)o(w)f(what)g(size)i(ob)s(ject)f(y)o=0A=
(ou)f(are)h(freeing,)i(y)o(ou)d(can)h(sp)q(eed)h(things)g(up)f(b)o(y)g=0A=
(calling)264 1550 y FE(kfree)p 387 1550 V 16 w(s\(\))g FH(directly)l(.)39=0A=
b(It)21 b(tak)o(es)g(t)o(w)o(o)f(argumen)o(ts:)30 b(the)22=0A=
b(\014rst)e(is)i(the)f(p)q(oin)o(ter)h(that)e(y)o(ou)h(are)264=0A=
1614 y(freeing,)14 b(as)g(in)h(the)f(single)h(argumen)o(t)f(to)f=0A=
FE(kfree\(\))p =
FH(,)g(and)h(the)g(second)h(is)g(the)f(size)h(of)e(the)i(ob)s=0A=
(ject)264 1678 y(b)q(eing)h(freed.)150 1799 y(See)g(section)g(1.6)e(for)g=0A=
(more)h(information)g(on)h FE(kmalloc\(\))p FH(,)d FE(kfree\(\))p=0A=
FH(,)h(and)h(other)g(useful)h(functions.)221 1887 =
y(The)e(other)f(w)o(a)o(y)g=0A=
(to)g(acquire)h(memory)g(is)g(to)f(allo)q(cate)i(it)f(at)f(initialization=
)k=0A=
(time.)i(Y)l(our)14 b(initializa-)150 1951 y(tion)h(function,)g=0A=
FE(foo)p 508 1951 V 17 w(init\(\))p =
FH(,)e(tak)o(es)h(one)h(argumen)o(t,)e(a)=0A=
i(p)q(oin)o(ter)g(to)f(the)h(curren)o(t)f(end)h(of)g(memory)l(.)k(It)150=0A=
2015 y(can)e(tak)o(e)g(as)f(m)o(uc)o(h)h(memory)g(as)g(it)g(w)o(an)o(ts)f=0A=
(to,)g(sa)o(v)o(e)h(a)f(p)q(oin)o(ter)i(or)f(p)q(oin)o(ters)g(to)g(that)f=0A=
(memory)l(,)h(and)150 2080 =
y(return)d(a)f(p)q(oin)o(ter)h(to)f(the)g(new)h=0A=
(end)h(of)e(memory)l(.)19 b(The)14 =
b(adv)m(an)o(tage)f(of)g(this)h(o)o(v)o=0A=
(er)e(statically)j(allo)q(cating)150 2144 y(large)h(bu\013ers)g(\()p=0A=
FE(char)23 b(bar[20000])p FH(\))14 =
b(is)i(that)f(if)h(the)f(fo)q(o)g(driv)o=0A=
(er)h(detects)g(that)f(the)g(fo)q(o)g(device)i(is)f(not)150=0A=
2208 y(attac)o(hed)f(to)g(the)h(computer,)f(the)g(memory)g(is)i(not)e(w)o=0A=
(asted.)20 b(The)c FE(init\(\))f FH(function)h(is)g(discussed)h(in)150=0A=
2273 y(Section)f(1.3.6.)221 2361 y(Be)i(gen)o(tle)g(when)h(y)o(ou)e(use)h=0A=
(kmallo)q(c.)30 b(Use)18 b(only)g(what)g(y)o(ou)f(ha)o(v)o(e)h(to.)27=0A=
b(Remem)o(b)q(er)19 b(that)e(k)o(ernel)150 2425 y(memory)12=0A=
b(is)h(unsw)o(appable,)h(and)e(th)o(us)g(allo)q(cating)i(extra)e(memory)g=
(in)=0A=
h(the)g(k)o(ernel)g(is)g(a)f(far)g(w)o(orse)f(thing)150 2489=0A=
y(to)i(do)g(in)h(the)f(k)o(ernel)h(than)f(in)i(a)e(user-lev)o(el)h(progra=
m.)=0A=
19 b(T)l(ak)o(e)13 =
b(only)g(what)g(y)o(ou)g(need,)h(and)g(free)f(it)g(when)=0A=
150 2554 =
y(y)o(ou)i(are)g(done,)g(unless)h(y)o(ou)f(are)g(going)g(to)g(use)g=0A=
(it)h(righ)o(t)f(a)o(w)o(a)o(y)e(again.)p eop=0A=
%%Page: 10 21=0A=
10 20 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(10)221 88 y FD([I)17 =
b(b)q(eliev)o(e)g(that)h=0A=
(it)f(is)g(p)q(ossible)g(to)h(allo)q(cate)h(sw)o(appable)e(memory)f(with)=
i=0A=
(the)f(vmallo)q(c)150 153 y(function,)f(but)d(that)h(will)h(b)q(e)e(do)q=0A=
(cumen)o(ted)h(in)f(the)h(VMM)e(section)i(when)f(it)h(gets)f(written.)150=0A=
217 y(In)h(the)h(mean)o(time,)h(en)o(terprising)g(hac)o(k)o(ers)e(are)h=0A=
(encouraged)h(to)f(lo)q(ok)g(it)h(up)e(themselv)o(es.])150=0A=
370 y Fq(1.3.3)55 b(Character)19 b(vs.)f(blo)r(c)n(k)g(devices)150=0A=
488 y =
FH(There)e(are)g(t)o(w)o(o)e(main)j(t)o(yp)q(es)f(of)f(devices)j(under)=0A=
e(all)h Fn(un)p FB(?)p Fn(x)f =
FH(systems,)f(c)o(haracter)g(and)h(blo)q(c)o(k)=0A=
h(devices.)150 552 y(Character)12 =
b(devices)i(are)e(those)g(for)g(whic)o(h)i=0A=
(no)e(bu\013ering)j(is)e(p)q(erformed,)g(and)g(blo)q(c)o(k)g(devices)h(ar=
e)e=0A=
(those)150 616 y(whic)o(h)18 =
b(are)e(accessed)i(through)f(a)f(cac)o(he.)26=0A=
b(Blo)q(c)o(k)17 =
b(devices)i(m)o(ust)d(b)q(e)i(random)e(access,)i(but)f(c)o=0A=
(haracter)150 681 =
y(devices)g(are)f(not)f(required)i(to)f(b)q(e,)g(though)g=0A=
(some)f(are.)22 b(Filesystems)17 b(can)f(only)g(b)q(e)h(moun)o(ted)f(if)g=0A=
(they)150 745 y(are)f(on)g(blo)q(c)o(k)h(devices.)221 833 y(Character)j=0A=
(devices)j(are)e(read)h(from)e(and)i(written)f(to)g(with)h(t)o(w)o(o)e=0A=
(function:)31 b FE(foo)p 1699 833 15 2 v 17 w(read\(\))20 b=0A=
FH(and)150 897 y FE(foo)p 225 897 V 17 w(write\(\))p FH(.)e(The)c=0A=
FE(read\(\))f FH(and)h FE(write\(\))e FH(calls)j(do)e(not)h(return)f(un)o=0A=
(til)i(the)f(op)q(eration)f(is)i(complete.)150 962 =
y(By)h(con)o(trast,)e(blo)=0A=
q(c)o(k)i(devices)h(do)e(not)g(ev)o(en)h(implemen)o(t)h(the)f=0A=
FE(read\(\))e FH(and)i FE(write\(\))f FH(functions,)h(and)150=0A=
1026 =
y(instead)j(ha)o(v)o(e)f(a)h(function)g(whic)o(h)h(has)e(historically)i=0A=
(b)q(een)g(called)g(the)f(\\strategy)e(routine.")30 b(Reads)150=0A=
1090 y(and)13 =
b(writes)h(are)e(done)i(through)f(the)g(bu\013er)h(cac)o(he)g=0A=
(mec)o(hanism)g(b)o(y)f(the)g(generic)h(functions)g FE(bread\(\),)150=0A=
1155 y(breada\(\),)e FH(and)i FE(bwrite\(\))p FH(.)k(These)13=0A=
b(functions)h(go)e(through)h(the)g(bu\013er)h(cac)o(he,)g(and)f(so)g(ma)o=
(y)f=0A=
(or)h(ma)o(y)150 1219 =
y(not)j(actually)h(call)g(the)f(strategy)f(routine,)i=0A=
(dep)q(ending)h(on)f(whether)f(or)g(not)f(the)i(blo)q(c)o(k)g(requested)f=
(is)=0A=
150 1283 y(in)h(the)f(bu\013er)h(cac)o(he)f(\(for)f(reads\))h(or)f(on)h=0A=
(whether)g(or)f(not)h(the)g(bu\013er)h(cac)o(he)f(is)h(full)g(\(for)e=0A=
(writes\).)22 b(A)150 1348 y(request)16 =
b(ma)o(y)f(b)q(e)h(asyncronous:)21=0A=
b FE(breada\(\))15 b =
FH(can)h(request)g(the)g(strategy)e(routine)i(to)g(sc)o=0A=
(hedule)h(reads)150 1412 y(that)e(ha)o(v)o(e)h(not)g(b)q(een)h(ask)o(ed)f=0A=
(for,)f(and)h(to)g(do)g(it)g(asyncronously)l(,)g(in)h(the)g(bac)o(kground=
,)e=0A=
(in)i(the)f(hop)q(es)150 1477 =
y(that)c(they)g(will)i(b)q(e)f(needed)g(later.)=0A=
19 b(A)13 =
b(more)e(complete)i(explanation)h(of)e(the)g(bu\013er)h(cac)o(he)g=0A=
(is)f(presen)o(ted)150 1541 y(b)q(elo)o(w)k(in)g(Section)g=0A=
FD(??)j([When)g(that)f(section)g(is)g(written)p FB(:)8 b(:)g(:)f=0A=
FD(])221 1629 y FH(The)17 =
b(sources)g(for)g(c)o(haracter)g(devices)i(are)e(k)=0A=
o(ept)g(in)h FB(:)8 b(:)g(:)d FH(/k)o(ernel/c)o(hr)p 1431 1629=0A=
14 2 v 17 w(drv/,)17 b(and)h(the)f(sources)h(for)150 1693 y(blo)q(c)o(k)g=0A=
(devices)h(are)e(k)o(ept)h(in)g FB(:)8 b(:)g(:)e FH(/k)o(ernel/blk)p=0A=
956 1693 V 17 w(drv/.)27 b(They)18 =
b(ha)o(v)o(e)f(similar)h(in)o(terfaces,)g=0A=
(and)g(are)f(v)o(ery)150 1757 y(m)o(uc)o(h)12 =
b(alik)o(e,)h(except)g(for)e=0A=
(reading)i(and)f(writing.)19 b(Because)13 =
b(of)f(the)g(di\013erence)i(in)f=0A=
(reading)g(and)f(writing,)150 1822 y(initialization)26 =
b(is)d(di\013eren)o=0A=
(t,)i(as)d(blo)q(c)o(k)h(devices)h(ha)o(v)o(e)f(to)e(register)i(a)f(strat=
egy)=0A=
f(routine,)k(whic)o(h)e(is)150 1886 y(registered)15 =
b(in)g(a)g(di\013eren)o=0A=
(t)g(w)o(a)o(y)f(than)g(the)h FE(foo)p 975 1886 15 2 v 17 w(read\(\))e=0A=
FH(and)i FE(foo)p 1309 1886 V 17 w(write\(\))e FH(routines)i(of)f(a)h(c)o=0A=
(haracter)150 1951 y(device)i(driv)o(er.)j(Sp)q(eci\014cs)d(are)e(dealt)h=0A=
(with)f(in)h(Section)g(1.4.1)e(and)h(Section)h(1.5.1)150 2104=0A=
y Fq(1.3.4)55 b(In)n(terrupts)19 b(vs.)24 b(P)n(olling)150=0A=
2221 y FH(Hardw)o(are)13 b(is)h(slo)o(w.)19 b(That)13 b(is,)h(in)g(the)f=0A=
(time)h(it)g(tak)o(es)f(to)f(get)h(information)h(from)f(y)o(our)g(a)o(v)o=0A=
(erage)f(device,)150 2285 y(the)19 =
b(CPU)f(could)i(b)q(e)g(o\013)f(doing)g=0A=
(something)g(far)f(more)g(useful)i(than)f(w)o(aiting)g(for)f(a)g(busy)h(b=
ut)g=0A=
(slo)o(w)150 2350 y(device.)i(So)15 =
b(to)g(k)o(eep)g(from)g(ha)o(ving)g(to)f=0A=
FD(busy-w)o(ait)i FH(all)g(the)f(time,)g FD(in)o(terrupts)h=0A=
FH(are)f(pro)o(vided)h(whic)o(h)150 2414 =
y(can)i(in)o(terrupt)h(whatev)o(er)f=0A=
(is)h(happ)q(ening)h(so)e(that)f(the)i(op)q(erating)f(system)g(can)h(do)f=0A=
(some)g(task)g(and)150 2478 y(return)j(to)g(what)g(it)h(w)o(as)f(doing)h=0A=
(without)f(losing)i(information.)39 b(In)22 =
b(an)g(ideal)g(w)o(orld,)h(all)g=0A=
(devices)150 2543 y(w)o(ould)15 =
b(probably)h(w)o(ork)e(b)o(y)h(using)h(in)o=0A=
(terrupts.)k(Ho)o(w)o(ev)o(er,)13 =
b(on)i(a)g(PC)g(or)f(clone,)i(there)f(are)g=0A=
(only)g(a)g(few)p eop=0A=
%%Page: 11 22=0A=
11 21 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(11)150 88 y(in)o(terrupts)15=0A=
b(a)o(v)m(ailable)i(for)d(use)h(b)o(y)g(y)o(our)g(p)q(eripherals,)h(so)f=0A=
(some)f(driv)o(ers)i(ha)o(v)o(e)e(to)h(p)q(oll)h(the)f(hardw)o(are:)150=0A=
153 =
y(ask)g(the)g(hardw)o(are)g(if)h(it)f(is)h(ready)f(to)g(transfer)g(data)f=0A=
(y)o(et.)20 b(This)c(unfortunately)g(w)o(astes)e(time,)h(but)h(it)150=0A=
217 y(sometimes)f(needs)h(to)f(b)q(e)h(done.)221 305 =
y(Also,)c(some)e(hardw)o=0A=
(are)h(\(lik)o(e)h(memory-mapp)q(ed)g(displa)o(ys\))g(is)f(as)g(fast)f(as=
)h=0A=
(the)h(rest)e(of)h(the)g(mac)o(hine,)150 369 y(and)k(do)q(es)g(not)g=0A=
(generate)f(output)h(asyncronously)l(,)g(so)g(an)f(in)o(terrupt-driv)o(en=
)j=0A=
(driv)o(er)e(w)o(ould)g(b)q(e)h(rather)150 434 =
y(silly)l(,)h(ev)o(en)e(if)h=0A=
(in)o(terrupts)f(w)o(ere)g(pro)o(vided.)221 522 =
y(In)i(Lin)o(ux,)g(man)o(y)g=0A=
(of)f(the)g(driv)o(ers)h(are)f(in)o(terrupt-driv)o(en,)i(but)f(some)f(are=
)g=0A=
(not,)g(and)h(at)f(least)h(one)150 586 =
y(can)f(b)q(e)g(either,)g(and)g(can)g=0A=
(b)q(e)g(switc)o(hed)g(bac)o(k)g(and)g(forth)f(at)g(run)o(time.)21=0A=
b(F)l(or)15 b(instance,)h(the)g FE(lp)g FH(device)150 650 =
y(\(the)g(parallel)=0A=
h(p)q(ort)f(driv)o(er\))g(normally)h(p)q(olls)g(the)g(prin)o(ter)f(to)f(s=
ee)i=0A=
(if)f(the)g(prin)o(ter)h(is)f(ready)g(to)g(accept)150 715 =
y(output,)g(and)g=0A=
(if)h(the)g(prin)o(ter)f(sta)o(ys)f(in)j(a)e(not)f(ready)i(phase)f(for)g(=
to)q=0A=
(o)g(long,)g(the)g(driv)o(er)h(will)h(sleep)g(for)150 779 =
y(a)f(while,)j(and)=0A=
e(try)f(again)h(later.)28 b(This)18 b(impro)o(v)o(es)g(system)f(p)q=0A=
(erformance.)28 b(Ho)o(w)o(ev)o(er,)17 b(if)h(y)o(ou)g(ha)o(v)o(e)f(a)150=0A=
843 =
y(parallel)e(card)f(that)f(supplies)i(an)f(in)o(terrupt,)g(the)g(driv)o=0A=
(er)g(will)h(utilize)h(that,)d(whic)o(h)h(will)h(usually)g(mak)o(e)150=0A=
908 y(p)q(erformance)g(ev)o(en)h(b)q(etter.)221 996 y(There)21=0A=
b(are)g(some)g(imp)q(ortan)o(t)g(programming)g(di\013erences)i(b)q(et)o(w=
)o=0A=
(een)f(in)o(terrupt-driv)o(en)h(driv)o(ers)150 1060 y(and)18=0A=
b(p)q(olling)i(driv)o(ers.)29 b(T)l(o)18 =
b(understand)h(this)f(di\013erence,)=0A=
j(y)o(ou)d(ha)o(v)o(e)f(to)h(understand)h(a)e(little)j(bit)e(of)150=0A=
1124 y(ho)o(w)c(system)g(calls)h(w)o(ork)e(under)i Fn(un)p=0A=
FB(?)p Fn(x)p FH(.)k(The)c(k)o(ernel)g(is)f(not)g(a)g(separate)g(task)f=0A=
(under)i Fn(un)p FB(?)p Fn(x)p FH(.)k(Rather,)150 1189 =
y(it)g(is)g(as)f(if)h=0A=
(eac)o(h)f(pro)q(cess)h(has)f(a)g(cop)o(y)h(of)f(the)g(k)o(ernel.)30=0A=
b(When)19 b(a)f(pro)q(cess)h(executes)g(a)f(system)g(call,)150=0A=
1253 y(it)g(do)q(es)g(not)f(transfer)f(con)o(trol)i(to)e(another)h(pro)q=0A=
(cess,)h(but)g(rather,)f(the)h(pro)q(cess)f(c)o(hanges)h(execution)150=0A=
1317 y(mo)q(des,)f(and)f(is)h(said)g(to)f(b)q(e)h(\\in)g(k)o(ernel)g(mo)q=0A=
(de.")23 b(In)17 =
b(this)g(mo)q(de,)f(it)h(executes)g(k)o(ernel)g(co)q(de)g=0A=
(whic)o(h)g(is)150 1382 y(trusted)e(to)g(b)q(e)g(safe.)221=0A=
1470 =
y(In)d(k)o(ernel)h(mo)q(de,)f(the)g(pro)q(cess)h(can)f(still)h(access)f=0A=
(the)g(user-space)h(memory)e(that)g(it)h(w)o(as)g(previously)150=0A=
1534 y(executing)21 =
b(in,)g(whic)o(h)g(is)g(done)f(through)f(a)h(set)g(of)f=0A=
(macros:)29 b FE(get)p 1336 1534 15 2 v 16 w(fs)p 1400 1534=0A=
V 17 w(*\(\))20 b FH(and)g FE(memcpy)p 1746 1534 V 16 w(fromfs\(\))150=0A=
1598 y FH(read)15 b(user-space)h(memory)l(,)f(and)h FE(put)p=0A=
818 1598 V 16 w(fs)p 882 1598 V 17 w(*\(\))f FH(and)h FE(memcpy)p=0A=
1219 1598 V 16 w(tofs\(\))f FH(write)g(to)g(user-space)h(memory)l(.)150=0A=
1663 =
y(Because)g(the)g(pro)q(cess)g(is)h(still)g(running,)g(but)f(in)g(a)g=0A=
(di\013eren)o(t)h(mo)q(de,)f(there)g(is)g(no)g(question)g(of)g(where)150=0A=
1727 =
y(in)i(memory)f(to)g(put)g(the)h(data,)e(or)h(where)h(to)f(get)g(it)g=0A=
(from.)26 b(Ho)o(w)o(ev)o(er,)16 =
b(when)i(an)f(in)o(terrupt)h(o)q(ccurs,)150=0A=
1791 y(an)o(y)13 =
b(pro)q(cess)g(migh)o(t)g(curren)o(tly)g(b)q(e)h(running,)g=0A=
(so)f(these)g(macros)f(cannot)h(b)q(e)h(used)f(|)h(if)f(they)g(are,)g(the=
y)=0A=
150 1856 y(will)18 =
b(either)f(write)g(o)o(v)o(er)f(random)g(memory)g(space)h=0A=
(of)f(the)g(running)i(pro)q(cess)f(or)f(cause)h(the)f(k)o(ernel)i(to)150=0A=
1920 y(panic.)221 2008 y FD([Explain)23 b(ho)o(w)e(to)h(use)f=0A=
FE(verify)p 854 2008 V 16 w(area\(\))p =
FD(,)h(whic)o(h)g(is)f(only)h(used)f=0A=
(on)h(cpu's)f(that)i(don't)150 2072 y(pro)o(vide)18 =
b(write)g(protection)h=0A=
(while)f(op)q(erating)i(in)e(k)o(ernel)f(mo)q(de,)h(to)g(c)o(hec)o(k)e=0A=
(whether)i(the)150 2137 y(area)h(is)e(safe)h(to)g(write)g(to.])221=0A=
2224 y =
FH(Instead,)e(when)h(sc)o(heduling)i(the)d(in)o(terrupt,)h(a)f(driv)o=0A=
(er)h(m)o(ust)e(also)i(pro)o(vide)g(temp)q(orary)e(space)i(in)150=0A=
2289 y(whic)o(h)e(to)e(put)h(the)g(information,)h(and)f(then)g(sleep.)21=0A=
b(When)14 =
b(the)g(in)o(terrupt-driv)o(en)h(part)f(of)f(the)i(driv)o(er)150=0A=
2353 =
y(has)i(\014lled)h(up)g(that)e(temp)q(orary)g(space,)h(it)g(w)o(ak)o(es)=0A=
f(up)h(the)g(pro)q(cess,)g(whic)o(h)g(copies)h(the)f(information)150=0A=
2417 y(from)j(that)g(temp)q(orary)g(space)i(in)o(to)e(the)h(pro)q(cess')g=0A=
(user)g(space)g(and)g(returns.)37 b(In)21 b(a)g(blo)q(c)o(k)h(device)150=0A=
2482 y(driv)o(er,)15 b(this)g(temp)q(orary)f(space)h(is)g(automatically)h=0A=
(pro)o(vided)f(b)o(y)g(the)g(bu\013er)h(cac)o(he)f(mec)o(hanism,)g(but)15=
0=0A=
2546 =
y(in)h(a)f(c)o(haracter)f(device)j(driv)o(er,)e(the)g(driv)o(er)h(is)g=0A=
(resp)q(onsible)h(for)e(allo)q(cating)h(it)f(itself.)p eop=0A=
%%Page: 12 23=0A=
12 22 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(12)150 88 y Fq(1.3.5)55 b(The)19=0A=
b(sleep-w)n(ak)n(eup)f(mec)n(hanism)150 206 y =
FD([Begin)f(b)o(y)e(giving)i(a)=0A=
f(general)h(description)h(of)d(ho)o(w)h(sleeping)g(is)g(used)f(and)h(what=
)h=0A=
(it)f(do)q(es.)150 270 =
y(This)h(should)f(men)o(tion)h(things)f(lik)o(e)h(all)=0A=
g(pro)q(cesses)g(sleeping)f(on)h(an)f(ev)o(en)o(t)g(are)h(w)o(ok)o(en)d(a=
t)=0A=
150 334 =
y(once,)k(and)g(then)g(they)f(con)o(tend)h(for)g(the)g(ev)o(en)o(t)e=0A=
(again,)k(etc)p FB(:)8 b(:)g(:)e FD(])221 422 y FH(P)o(erhaps)19=0A=
b(the)h(b)q(est)h(w)o(a)o(y)e(to)g(try)g(to)h(understand)g(the)g(Lin)o(ux=
)h=0A=
(sleep-w)o(ak)o(eup)g(mec)o(hanism)g(is)g(to)150 487 y(read)13=0A=
b(the)g(source)g(for)g(the)p 609 487 15 2 v 626 487 V 47 w=0A=
FE(sleep)p 763 487 V 17 w(on\(\))f =
FH(function,)i(used)g(to)e(implemen)o(t)i=0A=
(b)q(oth)g(the)f FE(sleep)p 1755 487 V 16 w(on\(\))g FH(and)150=0A=
551 y FE(interruptible)p 465 551 V 15 w(sleep)p 600 551 V 17=0A=
w(on\(\))i FH(calls.)264 660 y Fs(static)20 b(inline)h(void)g=0A=
(__sleep_on\(struc)o(t)e(wait_queue)h(**p,)h(int)g(state\))264=0A=
716 y({)351 773 y(unsigned)f(long)h(flags;)351 830 =
y(struct)f(wait_queue)g=0A=
(wait)h(=3D)h({)f(current,)f(NULL)h(};)351 943 y(if)g(\(!p\))438=0A=
1000 y(return;)351 1057 y(if)g(\(current)f(=3D=3D)i(task[0]\))438=0A=
1114 y(panic\("task[0])d(trying)h(to)i(sleep"\);)351 1171 =
y(current->state)d=0A=
(=3D)i(state;)351 1227 y(add_wait_queue\(p)o(,)e(&wait\);)351=0A=
1284 y(save_flags\(flags)o(\);)351 1341 y(sti\(\);)351 1398=0A=
y(schedule\(\);)351 1455 y(remove_wait_queu)o(e\(p,)f(&wait\);)351=0A=
1511 y(restore_flags\(fl)o(ags\);)264 1568 y(})221 1684 y FH(A)12=0A=
b FE(wait)p 366 1684 V 16 w(queue)g =
FH(is)g(a)g(circular)h(list)g(of)f(p)q=0A=
(oin)o(ters)h(to)e(task)g(structures,)h(de\014ned)i(in)f =
FE(<linux/wait.h>)=0A=
150 1749 y FH(to)i(b)q(e)264 1857 y Fs(struct)20 b(wait_queue)g({)351=0A=
1914 y(struct)g(task_struct)g(*)h(task;)351 1971 =
y(struct)f(wait_queue)g(*)i=0A=
(next;)264 2028 y(};)150 2144 y FE(state)17 b FH(is)i(either)g=0A=
FE(TASK)p 567 2144 V 16 w(INTERRUPTIBLE)e FH(or)g FE(TASK)p=0A=
1066 2144 V 17 w(UNINTERUPTIBLE)p =
FH(,)f(dep)q(ending)k(on)e(whether)g(or)150=0A=
2208 =
y(not)e(the)h(sleep)g(should)g(b)q(e)h(in)o(terruptable)f(b)o(y)f(suc)o=0A=
(h)h(things)g(as)f(system)g(calls.)24 b(In)17 =
b(general,)g(the)g(sleep)150=0A=
2273 =
y(should)c(b)q(e)f(in)o(terruptible)i(if)e(the)g(device)h(is)f(a)f(slo)o=0A=
(w)h(one;)g(one)g(whic)o(h)h(can)f(blo)q(c)o(k)g(inde\014nitely)l(,)j=0A=
(including)150 2337 y(terminals)h(and)f(net)o(w)o(ork)f(devices)j(or)e=0A=
(pseudo)q(devices.)221 2425 y FE(add)p 296 2425 V 16 w(wait)p=0A=
408 2425 V 17 w(queue\(\))f =
FH(turns)h(o\013)h(in)o(terrupts,)f(if)h(they)f=0A=
(w)o(ere)g(enabled,)h(and)g(adds)f(the)g(new)h FE(struct)150=0A=
2489 y(wait)p 249 2489 V 17 w(queue)i =
FH(declared)i(at)f(the)g(b)q(eginning)i=0A=
(of)e(the)g(function)h(to)f(the)g(list)h FE(p)p FH(.)32 b(It)19=0A=
b(then)g(reco)o(v)o(ers)g(the)150 2554 =
y(original)d(in)o(terrupt)g(state)e=0A=
(\(enabled)i(or)f(disabled\),)h(and)g(returns.)p eop=0A=
%%Page: 13 24=0A=
13 23 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(13)221 88 y FE(save)p 320 88=0A=
15 2 v 16 w(flags\(\))17 b =
FH(is)i(a)f(macro)g(whic)o(h)h(sa)o(v)o(es)e(the)h=0A=
(pro)q(cess)h(\015ags)f(in)h(its)f(argumen)o(t.)28 b(This)19=0A=
b(is)g(done)150 153 y(to)14 b(preserv)o(e)h(the)g(previous)g(state)f(of)g=0A=
(the)h(in)o(terrupt)g(enable)h(\015ag.)j(This)c(w)o(a)o(y)l(,)f(the)h=0A=
FE(restore)p 1770 153 V 16 w(flags\(\))150 217 y =
FH(later)f(can)g(restore)f=0A=
(the)h(in)o(terrupt)g(state,)f(whether)h(it)g(w)o(as)f(enabled)j(or)d=0A=
(disabled.)21 b FE(sti\(\))14 b FH(then)g(allo)o(ws)150 281=0A=
y(in)o(terrupts)e(to)e(o)q(ccur,)i(and)g FE(schedule\(\))e=0A=
FH(\014nds)i(a)f(new)h(pro)q(cess)f(to)g(run,)h(and)g(switc)o(hes)f(to)g(=
it.)=0A=
19 b(Sc)o(hedule)150 346 =
y(will)i(not)e(c)o(ho)q(ose)h(this)g(pro)q(cess)g=0A=
(to)f(run)g(again)h(un)o(til)h(the)e(state)g(is)h(c)o(hanged)g(to)f=0A=
FE(TASK)p 1702 346 V 16 w(RUNNING)g FH(b)o(y)150 410 y FE(wake)p=0A=
249 410 V 17 w(up\(\))14 b =
FH(called)j(on)e(the)g(same)g(w)o(ait)g(queue,)h=0A=
FE(p)p FH(,)e(or)h(conceiv)m(ably)j(b)o(y)d(something)g(else.)221=0A=
498 y(The)21 b(pro)q(cess)h(then)g(remo)o(v)o(es)e(itself)i(from)f(the)g=0A=
FE(wait)p 1187 498 V 17 w(queue)p FH(,)h(restores)e(the)i(orginal)g(in)o=0A=
(terrupt)150 562 y(condition)16 b(with)g FE(restore)p 624 562=0A=
V 16 w(flags\(\))p FH(,)e(and)h(returns.)221 650 y(Whenev)o(er)23=0A=
b(con)o(ten)o(tion)g(for)g(a)g(resource)g(migh)o(t)g(o)q(ccur,)i(there)e=0A=
(needs)h(to)f(b)q(e)g(a)g(p)q(oin)o(ter)h(to)e(a)150 715 y=0A=
FE(wait)p 249 715 V 17 w(queue)11 b FH(asso)q(ciated)h(with)g(that)f=0A=
(resource.)18 b(Then,)13 b(whenev)o(er)f(con)o(ten)o(tion)g(do)q(es)g(o)q=0A=
(ccur,)g(eac)o(h)g(pro-)150 779 =
y(cess)f(that)f(\014nds)h(itself)g(lo)q(c)o=0A=
(k)o(ed)h(out)e(of)g(access)h(to)f(the)g(resource)h(sleeps)h(on)e(that)g=0A=
(resource's)g FE(wait)p 1804 779 V 17 w(queue)p FH(.)150 843=0A=
y(When)18 =
b(an)o(y)g(pro)q(cess)g(is)h(\014nished)h(using)e(a)g(resource)g=0A=
(for)f(whic)o(h)i(there)f(is)h(a)e FE(wait)p 1608 843 V 17=0A=
w(queue)p FH(,)h(it)g(should)150 908 =
y(w)o(ak)o(e)i(up)h(and)f(pro)q(cesses)h=0A=
(that)f(migh)o(t)g(b)q(e)i(sleeping)g(on)e(that)g FE(wait)p=0A=
1389 908 V 17 w(queue)p FH(,)h(probably)g(b)o(y)f(calling)150=0A=
972 y FE(wake)p 249 972 V 17 w(up\(\))p FH(,)14 b(or)h(p)q(ossibly)h=0A=
FE(wake)p 715 972 V 17 w(up)p 780 972 V 17 w(interruptible\(\))p=0A=
FH(.)221 1060 =
y(If)j(y)o(ou)f(don't)h(understand)g(wh)o(y)g(a)f(pro)q(cess)h=0A=
(migh)o(t)g(w)o(an)o(t)f(to)g(sleep,)j(or)d(w)o(an)o(t)g(more)g(details)i=
(on)=0A=
150 1124 y(when)e(and)g(ho)o(w)f(to)g(structure)h(this)g(sleeping,)i(I)e=0A=
(urge)f(y)o(ou)h(to)f(buy)h(one)g(of)f(the)h(op)q(erating)f(systems)150=0A=
1189 =
y(textb)q(o)q(oks)e(listed)h(in)g(App)q(endix)i(A)d(and)g(lo)q(ok)h(up)f=0A=
FD(m)o(utual)j(exclusion)e FH(and)g FD(deadlo)q(c)o(k.)221=0A=
1276 y([This)f(is)f(a)h(cop-out.)24 b(I)14 =
b(should)h(tak)o(e)f(the)g(time)h=0A=
(to)f(explain)i(and)f(giv)o(e)e(examples,)j(but)e(I)150 1341=0A=
y(am)h(not)g(trying)h(to)f(write)h(an)g(OS)f(text,)h(and)f(I)g(w)o(an)o(t=
)f=0A=
(to)i(k)o(eep)e(this)h(under)g(1000)h(pages)p FB(:)8 b(:)g(:)d=0A=
FD(])150 1492 y(1.3.5.1)54 b(More)18 b(adv)m(anced)g(sleeping)150=0A=
1609 y FH(If)12 b(the)g FE(sleep)p 390 1609 V 17 w(on\(\))p=0A=
FH(/)p FE(wake)p 622 1609 V 16 w(up\(\))f =
FH(mec)o(hanism)i(in)g(Lin)o(ux)g=0A=
(do)q(es)g(not)e(satisfy)h(y)o(our)g(device)h(driv)o(er)g(needs,)150=0A=
1674 y(y)o(ou)j(can)g(co)q(de)g(y)o(our)g(o)o(wn)f(v)o(ersions)h(of)g=0A=
FE(sleep)p 975 1674 V 16 w(on\(\))g FH(and)g FE(wake)p 1288=0A=
1674 V 17 w(up\(\))f FH(that)g(\014t)h(y)o(our)g(needs.)23=0A=
b(F)l(or)15 b(an)150 1738 y(example)21 =
b(of)e(this,)i(lo)q(ok)f(at)f(the)h=0A=
(serial)h(device)g(driv)o(er)g(\()p FB(:)8 b(:)g(:)d =
FH(/k)o(ernel/c)o(hr)p=0A=
1452 1738 14 2 v 16 w(drv/serial.c\))20 b(in)h(function)150=0A=
1803 y FE(block)p 273 1803 15 2 v 16 w(til)p 361 1803 V 17=0A=
w(ready\(\))p FH(,)15 =
b(where)h(quite)g(a)g(bit)g(has)g(to)f(b)q(e)h(done)h=0A=
(b)q(et)o(w)o(een)f(the)g FE(add)p 1568 1803 V 16 w(wait)p=0A=
1680 1803 V 17 w(queue\(\))f FH(and)150 1867 y(the)g FE(schedule\(\))p=0A=
FH(.)150 2020 y Fq(1.3.6)55 b(The)19 b(VFS)150 2137 y FH(The)g(Virtual)g=0A=
(Filesystem)g(Switc)o(h,)g(or)f FD(VFS)p FH(,)g(is)h(the)g(mec)o(hanism)f=0A=
(whic)o(h)i(allo)o(ws)e(Lin)o(ux)i(to)d(moun)o(t)150 2202 y(man)o(y)h=0A=
(di\013eren)o(t)h(\014lesystems)g(at)f(the)g(same)g(time.)29=0A=
b(In)19 =
b(the)f(\014rst)g(v)o(ersions)h(of)e(Lin)o(ux,)j(all)f(\014lesystem)=0A=
150 2266 =
y(access)j(w)o(en)o(t)g(straigh)o(t)f(in)o(to)i(routines)f(whic)o(h)=0A=
i(understo)q(o)q(d)e(the)h FE(minix)e FH(\014lesystem.)42 b(T)l(o)22=0A=
b(mak)o(e)g(it)150 2330 =
y(p)q(ossible)g(for)d(other)g(\014lesystems)i(to)e(b)=0A=
q(e)i(written,)f(\014lesystem)h(calls)g(had)f(to)f(pass)h(through)g(a)f(l=
a)o=0A=
(y)o(er)150 2395 =
y(of)f(indirection)j(whic)o(h)e(w)o(ould)g(switc)o(h)f(the)h=0A=
(call)g(to)f(the)g(routine)h(for)f(the)g(correct)g(\014lesystem.)30=0A=
b(This)150 2459 y(w)o(as)15 =
b(done)h(b)o(y)g(some)f(generic)i(co)q(de)f(whic)=0A=
o(h)g(can)g(handle)h(generic)g(cases)f(and)f(a)h(structure)f(of)h(p)q(oin=
)o=0A=
(ters)150 2524 =
y(to)h(functions)i(whic)o(h)g(handle)g(sp)q(eci\014c)g(cases.)=0A=
28 b(One)19 =
b(structure)e(is)i(of)e(in)o(terest)h(to)f(the)h(device)i(driv)o=0A=
(er)p eop=0A=
%%Page: 14 25=0A=
14 24 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(14)150 88 y(writer;)15 b(the)g=0A=
FE(file)p 474 88 15 2 v 17 w(operations)e FH(structure.)221=0A=
176 y(F)l(rom)h(/usr/include/lin)o(ux/fs.h:)264 294 y Fs(struct)20=0A=
b(file_operations)f({)351 351 y(int)43 b(\(*lseek\))63 b(\(struct)21=0A=
b(inode)g(*,)g(struct)g(file)f(*,)i(off_t,)e(int\);)351 407=0A=
y(int)43 b(\(*read\))85 b(\(struct)21 b(inode)g(*,)g(struct)g(file)f(*,)i=0A=
(char)f(*,)g(int\);)351 464 y(int)43 b(\(*write\))63 b(\(struct)21=0A=
b(inode)g(*,)g(struct)g(file)f(*,)i(char)f(*,)g(int\);)351=0A=
521 y(int)43 b(\(*readdir\))19 =
b(\(struct)i(inode)g(*,)g(struct)g(file)f(*,)i=0A=
(struct)e(dirent)h(*,)721 578 y(int)g(count\);)351 635 y(int)43=0A=
b(\(*select\))e(\(struct)21 b(inode)g(*,)g(struct)g(file)f(*,)i(int,)721=0A=
691 y(select_table)e(*\);)351 748 y(int)43 b(\(*ioctl\))63=0A=
b(\(struct)21 b(inode)g(*,)g(struct)g(file)f(*,)i(unsigned)e(int,)721=0A=
805 y(unsigned)g(int\);)351 862 y(int)43 b(\(*mmap\))85 b(\(struct)21=0A=
b(inode)g(*,)g(struct)g(file)f(*,)i(unsigned)e(long,)721 919=0A=
y(size_t,)h(int,)g(unsigned)f(long\);)351 975 y(int)43 b(\(*open\))85=0A=
b(\(struct)21 b(inode)g(*,)g(struct)g(file)f(*\);)351 1032=0A=
y(void)h(\(*release\))e(\(struct)i(inode)g(*,)g(struct)g(file)f(*\);)264=0A=
1089 y(};)221 1214 y =
FH(Essen)o(tially)l(,)e(this)f(structure)f(constitutes)h=0A=
(a)f(parital)h(list)h(of)e(the)h(functions)g(that)f(y)o(ou)g(ma)o(y)g(ha)=
o(v)=0A=
o(e)150 1278 y(to)f(write)g(to)f(create)h(y)o(our)g(driv)o(er.)221=0A=
1366 y(This)42 =
b(section)h(details)g(the)f(actions)g(and)h(requiremen)o(ts)f=0A=
(of)g(the)g(functions)h(in)g(the)150 1431 y FE(file)p 249 1431=0A=
V 17 w(operations)20 b FH(structure.)38 b(It)21 b(do)q(cumen)o(ts)h(all)g=0A=
(the)g(argumen)o(ts)f(that)f(these)i(functions)g(tak)o(e.)150=0A=
1495 y =
FD([It)j(should)g(also)g(detail)h(all)g(the)e(defaults,)k(and)d(co)o=0A=
(v)o(er)f(more)g(carefully)i(the)f(p)q(ossible)150 1559 y(return)19=0A=
b(v)m(alues.)150 1711 y(1.3.6.1)54 b(The)18 b FE(lseek\(\))f=0A=
FD(function)150 1828 y FH(This)k(function)f(is)h(called)g(when)g(the)f=0A=
(system)f(call)i FE(lseek\(\))e FH(is)h(called)i(on)e(the)g(device)h(sp)q=0A=
(ecial)h(\014le)150 1892 y(represen)o(ting)17 b(y)o(our)f(device.)26=0A=
b(An)17 b(understanding)h(of)e(what)g(the)g(system)h(call)g=0A=
FE(lseek\(\))f FH(do)q(es)h(should)150 1957 =
y(b)q(e)f(su\016cien)o(t)g(to)f=0A=
(explain)h(this)g(function,)g(whic)o(h)g(mo)o(v)o(es)e(to)h(the)g(desired=
)i=0A=
(o\013set.)j(It)15 b(tak)o(es)g(these)g(four)150 2021 y(argumen)o(ts:)150=0A=
2138 y FE(struct)23 b(inode)g(*)h(inode)450 2203 y FH(P)o(oin)o(ter)15=0A=
b(to)f(the)i(ino)q(de)g(structure)f(for)g(this)g(device.)150=0A=
2306 y FE(struct)23 b(file)g(*)h(file)450 2371 y FH(P)o(oin)o(ter)15=0A=
b(to)f(the)i(\014le)g(structure)f(for)f(this)i(device.)150=0A=
2474 y FE(off)p 225 2474 V 17 w(t)23 b(offset)450 2538 y FH(O\013set)16=0A=
b FD(from)h(origin)g FH(to)e(mo)o(v)o(e)f(to.)p eop=0A=
%%Page: 15 26=0A=
15 25 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(15)150 88 y FE(int)23 b(origin)61=0A=
b FH(0)15 =
b(=3D)g(tak)o(e)g(the)g(o\013set)g(from)g(absolute)g(o\013set)h(0)e=0A=
(\(the)h(b)q(eginning\).)450 153 =
y(1)g(=3D)g(tak)o(e)g(the)g(o\013set)g(from)g=0A=
(the)g(curren)o(t)g(p)q(osition.)450 217 =
y(2)g(=3D)g(tak)o(e)g(the)g(o\013set)g=0A=
(from)g(the)g(end.)150 334 y FE(lseek\(\))f FH(returns)h FE(-errno)g=0A=
FH(on)g(error,)f(or)h FG(\025)g =
FH(0)g(the)g(absolute)h(p)q(osition)g(after)e=0A=
(the)i(lseek.)221 422 y(If)23 b(there)g(is)g(no)g FE(lseek\(\))p=0A=
FH(,)g(the)g(k)o(ernel)h(will)g(tak)o(e)e(the)h(default)h(action,)g(whic)=
o(h)=0A=
g(is)f(to)f(mo)q(dify)150 487 y(the)f FE(file->f)p 405 487=0A=
15 2 v 16 w(pos)f FH(elemen)o(t.)36 b(F)l(or)20 b(an)g FE(origin)g=0A=
FH(of)g(2,)h(the)f(default)h(action)g(is)g(to)f(return)g FE(-EINVAL)150=0A=
551 y FH(if)g FE(file->f)p 367 551 V 16 w(inode)e =
FH(is)i(NULL,)g(otherwise)f=0A=
(it)g(sets)g FE(file->f)p 1244 551 V 17 w(pos)f FH(to)h FE(file->f)p=0A=
1579 551 V 16 w(inode->i)p 1787 551 V 16 w(size)g FH(+)150=0A=
615 y FE(offset)p FH(.)g(Because)c(of)f(this,)h(if)g FE(lseek\(\))f=0A=
FH(should)i(return)e(an)h(error)f(for)g(y)o(our)g(device,)i(y)o(ou)e(m)o(=
ust)=0A=
g(write)150 680 y(an)h FE(lseek\(\))f FH(function)i(whic)o(h)g(returns)f=0A=
(that)g(error.)150 831 y FD(1.3.6.2)54 b(The)18 b FE(read\(\))f=0A=
FD(and)h FE(write\(\))e FD(functions)150 948 y =
FH(The)f(read)f(and)h(write)g=0A=
(functions)g(read)f(and)h(write)g(a)f(c)o(haracter)g(string)g(to)g(the)h=0A=
(device.)21 b(If)14 b(there)h(is)g(no)150 1013 y FE(read\(\))g=0A=
FH(or)h FE(write\(\))g FH(function)h(in)g(the)f FE(file)p 961=0A=
1013 V 17 w(operations)f =
FH(structure)h(registered)h(with)f(the)h(k)o(ernel,)=0A=
150 1077 y(and)11 b(the)f(device)i(is)f(a)f(c)o(haracter)g(device,)i=0A=
FE(read\(\))e FH(or)g FE(write\(\))f =
FH(system)h(calls,)i(resp)q(ectiv)o(ely)=0A=
l(,)h(will)f(return)150 1141 y FE(-EINVAL)p =
FH(.)h(If)i(the)g(device)h(is)f=0A=
(a)f(blo)q(c)o(k)h(device,)h(these)f(functions)g(should)g(not)f(b)q(e)i=0A=
(implemen)o(ted,)g(as)e(the)150 1206 y(VFS)g(will)h(route)e(requests)h=0A=
(through)g(the)f(bu\013er)i(cac)o(he,)f(whic)o(h)h(will)g(call)g(y)o(our)=
e=0A=
(strategy)f(routine.)20 b(See)150 1270 =
y(Section)d(1.5.2)d(for)i(details)h=0A=
(on)e(ho)o(w)h(the)g(bu\013er)h(cac)o(he)f(do)q(es)h(this.)22=0A=
b(The)16 b FE(read)g FH(and)g FE(write)f FH(functions)150 1334=0A=
y(tak)o(e)f(these)i(argumen)o(ts:)150 1452 y FE(struct)23 b(inode)g(*)h=0A=
(inode)450 1516 y FH(This)17 =
b(is)g(a)f(p)q(oin)o(ter)h(to)e(the)i(ino)q(de)g=0A=
(of)f(the)h(device)h(sp)q(ecial)g(\014le)f(whic)o(h)g(w)o(as)f(accessed.)=
450=0A=
1580 y(F)l(rom)23 =
b(this,)j(y)o(ou)d(can)h(do)g(sev)o(eral)g(things,)i(based)=0A=
e(on)f(the)h FE(struct)f(inode)g FH(dec-)450 1645 y(laration)h(ab)q(out)f=0A=
(100)g(lines)i(in)o(to)e(/usr/include/lin)o(ux/fs.h.)47 b(F)l(or)23=0A=
b(instance,)j(y)o(ou)450 1709 y(can)18 =
b(\014nd)g(the)g(minor)g(n)o(um)o(b)q=0A=
(er)g(of)g(the)g(\014le)g(b)o(y)g(this)g(construction:)26 b=0A=
FE(unsigned)c(int)450 1773 y(minor)h(=3D)h(MINOR\(inode->i)p=0A=
980 1773 V 15 w(rdev\);)18 b FH(The)g(de\014nition)h(of)e(the)h=0A=
FE(MINOR)e FH(macro)h(is)h(in)450 1838 y FE(<linux/fs.h>)p=0A=
FH(,)g(as)g(are)h(man)o(y)f(other)h(useful)h(de\014nitions.)32=0A=
b(Read)20 b(fs.h)e(and)i(a)e(few)450 1902 =
y(device)h(driv)o(ers)f(for)f(more)=0A=
h(details,)h(and)f(see)g(section)g(1.6)f(for)g(a)h(short)f(description.)4=
50=0A=
1966 y FE(inode->i)p 645 1966 V 16 w(mode)11 b =
FH(can)h(b)q(e)g(used)g(to)f=0A=
(\014nd)h(the)g(mo)q(de)g(of)f(the)g(\014le,)i(and)f(there)g(are)f(macros=
)450=0A=
2031 y(a)o(v)m(ailable)17 b(for)d(this,)i(as)f(w)o(ell.)150=0A=
2134 y FE(struct)23 b(file)g(*)h(file)450 2199 y FH(P)o(oin)o(ter)15=0A=
b(to)f(\014le)j(structure)e(for)f(this)i(device.)150 2302 y=0A=
FE(char)23 b(*)h(buf)61 b FH(This)20 b(is)f(a)g(bu\013er)h(of)e(c)o=0A=
(haracters)g(to)h(read)g(or)f(write.)32 b(It)19 b(is)g(lo)q(cated)h(in)f=0A=
FC(user-sp)n(ac)n(e)450 2367 y FH(memory)l(,)14 =
b(and)h(therefore)g(m)o(ust)f=0A=
(b)q(e)h(accessed)h(using)f(the)g FE(get)p 1537 2367 V 17 w(fs*\(\),)23=0A=
b(put)p 1793 2367 V 17 w(fs*\(\),)450 2431 y FH(and)g FE(memcpy*fs\(\))d=0A=
FH(macros)i(detailed)i(in)f(section)g(1.6.)41 b(User-space)23=0A=
b(memory)e(is)450 2495 =
y(inaccessible)h(during)f(an)e(in)o(terrupt,)i(so)e=0A=
(if)h(y)o(our)f(driv)o(er)g(is)i(in)o(terrupt)e(driv)o(en,)i(y)o(ou)p=0A=
eop=0A=
%%Page: 16 27=0A=
16 26 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(16)450 88 y(will)17 =
b(ha)o(v)o(e)e(to)f(cop)o=0A=
(y)h(the)h(con)o(ten)o(ts)e(of)h(y)o(our)g(bu\013er)h(in)o(to)f(a)g(queue=
.)=0A=
150 192 y FE(int)23 b(count)85 b FH(This)18 =
b(is)f(a)g(coun)o(t)f(of)h(c)o=0A=
(haracters)f(in)i FE(buf)e FH(to)g(b)q(e)i(read)f(or)f(written.)25=0A=
b(It)17 b(is)h(the)f(size)g(of)450 256 y FE(buf)p =
FH(,)f(and)h(is)g(ho)o(w)f=0A=
(y)o(ou)h(kno)o(w)f(that)g(y)o(ou)g(ha)o(v)o(e)g(reac)o(hed)h(the)g(end)h=
(of)=0A=
e FE(buf)p FH(,)g(as)g FE(buf)g FH(is)450 321 =
y(not)f(guaran)o(teed)g(to)f(b)=0A=
q(e)i(n)o(ull-terminated.)150 472 y FD(1.3.6.3)54 b(The)18=0A=
b FE(readdir\(\))e FD(function)150 589 y =
FH(This)h(function)g(is)g(another)f=0A=
(artifact)g(of)g FE(file)p 963 589 15 2 v 17 w(operations)f=0A=
FH(b)q(eing)j(used)f(for)f(implemen)o(ting)i(\014lesys-)150=0A=
654 y(tems)13 b(as)h(w)o(ell)h(as)e(device)i(driv)o(ers.)20=0A=
b(Do)13 b(not)g(implemen)o(t)j(it.)j(The)14 b(k)o(ernel)h(will)g(return)f=0A=
FE(-ENOTDIR)f FH(if)h(the)150 718 y(system)h(call)h FE(readdir\(\))e=0A=
FH(is)i(called)h(on)e(y)o(our)f(device)j(sp)q(ecial)g(\014le.)150=0A=
869 y FD(1.3.6.4)54 b(The)18 b FE(select\(\))e FD(function)150=0A=
987 y FH(The)h FE(select\(\))f =
FH(function)i(is)g(generally)g(most)e(useful)i=0A=
(with)f(c)o(haracter)g(devices.)26 b(It)17 b(is)h(usually)g(used)150=0A=
1051 y(to)13 b(m)o(ultiplex)i(reads)e(without)h(p)q(olling)h(|)f(the)g=0A=
(application)h(calls)g(the)e FE(select\(\))f =
FH(system)h(call,)i(giving)150=0A=
1115 =
y(it)i(a)g(list)g(of)g(\014le)h(descriptors)f(to)f(w)o(atc)o(h,)g(and)h=0A=
(the)g(k)o(ernel)h(rep)q(orts)f(bac)o(k)f(to)h(the)g(program)e(on)i(whic)=
o(h)=0A=
150 1180 y(\014le)i(descriptor)g(has)f(w)o(ok)o(en)g(it)h(up.)30=0A=
b(It)18 b(is)h(also)f(used)h(as)f(a)g(timer.)30 b(Ho)o(w)o(ev)o(er,)18=0A=
b(the)g FE(select\(\))f FH(func-)150 1244 =
y(tion)i(in)h(y)o(our)e(device)i=0A=
(driv)o(er)f(is)h(not)e(directly)i(called)g(b)o(y)f(the)g(system)f(call)i=0A=
FE(select\(\))p FH(,)e(and)h(so)g(the)150 1308 y FE(file)p=0A=
249 1308 V 17 w(operations)13 b(select\(\))h =
FH(only)i(needs)g(to)f(do)g(a)g=0A=
(few)g(things.)20 b(Its)15 b(argumen)o(ts)g(are:)150 1426 y=0A=
FE(struct)23 b(inode)g(*)h(inode)450 1490 y FH(P)o(oin)o(ter)15=0A=
b(to)f(the)i(ino)q(de)g(structure)f(for)g(this)g(device.)150=0A=
1593 y FE(struct)23 b(file)g(*)h(file)450 1658 y FH(P)o(oin)o(ter)15=0A=
b(to)f(the)i(\014le)g(structure)f(for)f(this)i(device.)150=0A=
1761 y FE(int)23 b(sel)p 320 1761 V 17 w(type)450 1826 y FH(The)15=0A=
b(select)h(t)o(yp)q(e)g(to)e(p)q(erform:)p 450 1840 449 2 v=0A=
449 1905 2 65 v 499 1885 a FE(SEL)p 574 1885 15 2 v 17 w(IN)p=0A=
659 1905 2 65 v 49 w FH(read)p 897 1905 V 450 1906 449 2 v=0A=
449 1971 2 65 v 475 1951 a FE(SEL)p 550 1951 15 2 v 17 w(OUT)p=0A=
659 1971 2 65 v 49 w FH(write)p 897 1971 V 450 1972 449 2 v=0A=
449 2037 2 65 v 499 2017 a FE(SEL)p 574 2017 15 2 v 17 w(EX)p=0A=
659 2037 2 65 v 49 w FH(exception)p 897 2037 V 450 2038 449=0A=
2 v 150 2109 a FE(select)p 297 2109 15 2 v 16 w(table)24 b(*)f(wait)450=0A=
2174 y FH(If)c FE(wait)e =
FH(is)i(not)f(NULL)h(and)g(there)f(is)h(no)f(error)g=0A=
(condition)h(caused)g(b)o(y)f(the)h(select,)450 2238 y FE(select\(\))12=0A=
b =
FH(should)i(put)f(the)g(pro)q(cess)h(to)e(sleep,)j(and)e(arrange)f(to)h(b=
)q=0A=
(e)g(w)o(ok)o(en)g(up)g(when)450 2303 =
y(the)k(device)i(b)q(ecomes)f(ready)l=0A=
(,)g(usually)g(through)f(an)h(in)o(terrupt.)26 b(If)18 b FE(wait)f=0A=
FH(is)g(NULL,)450 2367 =
y(then)g(the)f(driv)o(er)h(should)h(quic)o(kly)f(see)g=0A=
(if)g(the)f(device)i(is)f(ready)l(,)g(and)f(return)h(ev)o(en)f(if)450=0A=
2431 y(it)f(is)h(not.)k(The)15 b FE(select)p 880 2431 V 16=0A=
w(wait\(\))g FH(function)h(do)q(es)f(this)h(already)l(.)p eop=0A=
%%Page: 17 28=0A=
17 27 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(17)221 88 y(If)16 =
b(the)g(calling)i(program)d=0A=
(w)o(an)o(ts)g(to)g(w)o(ait)h(un)o(til)h(one)f(of)g(the)g(devices)h(up)q(=
on)g=0A=
(whic)o(h)g(it)f(is)h(selecting)150 153 y(b)q(ecomes)12 =
b(a)o(v)m(ailable)h=0A=
(for)e(the)g(op)q(eration)h(it)f(is)h(in)o(terested)g(in,)h(the)e(pro)q(c=
ess)=0A=
h(will)h(ha)o(v)o(e)e(to)g(b)q(e)h(put)f(to)g(sleep)150 217=0A=
y(un)o(til)i(one)f(of)g(those)g(op)q(erations)g(b)q(ecomes)h(a)o(v)m=0A=
(ailable.)20 b(This)13 b(do)q(es)f FD(not)h FH(require)f(use)h(of)e(a)h=0A=
FE(sleep)p 1817 217 15 2 v 17 w(on*\(\))150 281 y FH(function,)20=0A=
b(ho)o(w)o(ev)o(er.)30 b(Instead)19 b(the)g FE(select)p 941=0A=
281 V 16 w(wait\(\))f FH(function)i(is)f(used.)31 b(\(See)20=0A=
b(section)f(1.6)f(for)g(the)150 346 y(de\014nition)g(of)d(the)h=0A=
FE(select)p 631 346 V 17 w(wait\(\))f FH(function\).)23 b(The)16=0A=
b(sleep)h(state)e(that)h FE(select)p 1585 346 V 16 w(wait\(\))f=0A=
FH(will)j(cause)150 410 y(is)13 b(the)g(same)g(as)f(that)g(of)g=0A=
FE(sleep)p 702 410 V 17 w(on)p 767 410 V 17 w(interruptible\(\))p=0A=
FH(,)f(and,)i(in)g(fact,)g FE(wake)p 1514 410 V 16 w(up)p 1578=0A=
410 V 17 w(interruptible\(\))150 475 y =
FH(is)j(used)f(to)g(w)o(ak)o(e)f(up)i=0A=
(the)f(pro)q(cess.)221 562 y(Ho)o(w)o(ev)o(er,)h FE(select)p=0A=
566 562 V 17 w(wait\(\))g =
FH(will)k(not)d(mak)o(e)g(the)h(pro)q(cess)g(go)f=0A=
(to)g(sleep)h(righ)o(t)g(a)o(w)o(a)o(y)l(.)25 b(It)18 b(returns)150=0A=
627 y(directly)l(,)h(and)f(the)g FE(select\(\))e FH(function)j(y)o(ou)e=0A=
(wrote)g(should)h(then)g(return.)27 b(The)18 =
b(pro)q(cess)g(isn't)g(put)150=0A=
691 y(to)i(sleep)h(un)o(til)g(the)f(system)g(call)h FE(sys)p=0A=
841 691 V 17 w(select\(\))p =
FH(,)f(whic)o(h)h(originall)h(called)g(y)o(our)d=0A=
FE(select\(\))g FH(func-)150 755 =
y(tion,)h(uses)f(the)g(information)g(giv)o=0A=
(en)h(to)e(it)i(b)o(y)f(the)g FE(select)p 1221 755 V 16 w(wait\(\))f=0A=
FH(function)i(to)e(put)i(the)f(pro)q(cess)150 820 y(to)i(sleep.)40=0A=
b FE(select)p 507 820 V 17 w(wait\(\))20 b =
FH(adds)i(the)g(pro)q(cess)g(to)f=0A=
(the)h(w)o(ait)f(queue,)j(but)d FE(do)p 1592 820 V 17 w(select\(\))g=0A=
FH(\(called)150 884 y(from)e FE(sys)p 337 884 V 17 w(select\(\))p=0A=
FH(\))f(actually)j(puts)f(the)f(pro)q(cess)i(to)e(sleep)i(b)o(y)e(c)o=0A=
(hanging)i(the)f(pro)q(cess)g(state)f(to)150 949 y FE(TASK)p=0A=
249 949 V 17 w(INTERRUPTIBLE)13 b FH(and)i(calling)i FE(schedule\(\))p=0A=
FH(.)221 1036 y(The)f(\014rst)g(argumen)o(t)g(to)g FE(select)p=0A=
819 1036 V 16 w(wait\(\))g FH(is)h(the)g(same)f FE(wait)p 1333=0A=
1036 V 16 w(queue)g FH(that)g(should)h(b)q(e)h(used)f(for)150=0A=
1101 y(a)22 b FE(sleep)p 318 1101 V 16 w(on\(\))p =
FH(,)h(and)f(the)g(second)h=0A=
(is)f(the)g FE(select)p 1081 1101 V 16 w(table)g =
FH(that)f(w)o(as)g(passed)h=0A=
(to)g(y)o(our)f FE(select\(\))150 1165 y FH(function.)221 1253=0A=
y(After)14 b(ha)o(ving)i(explained)h(all)f(this)g(in)g(excruciating)g=0A=
(detail,)g(here)g(are)f(t)o(w)o(o)f(rules)i(to)e(follo)o(w:)206=0A=
1378 y(1.)22 b(Call)16 b FE(select)p 507 1378 V 16 w(wait\(\))e=0A=
FH(if)i(the)f(device)i(is)f(not)e(ready)l(,)h(and)h(return)f(0.)206=0A=
1480 y(2.)22 b(Return)15 b(1)g(if)h(the)f(device)i(is)f(ready)l(.)221=0A=
1605 y(If)43 b(y)o(ou)f(pro)o(vide)i(a)e FE(select\(\))g FH(function,)50=0A=
b(do)43 b(not)g(pro)o(vide)g(timeouts)g(b)o(y)g(setting)150=0A=
1669 y FE(current->timeout)p FH(,)22 b(as)h(the)g FE(select\(\))e=0A=
FH(mec)o(hanism)j(uses)f FE(current->timeout)p =
FH(,)f(and)h(the)g(t)o(w)o(o)=0A=
150 1734 =
y(metho)q(ds)f(cannot)f(co-exist,)j(as)d(there)h(is)g(only)h(one)f=0A=
FE(timeout)e FH(for)i(eac)o(h)f(pro)q(cess.)40 b(Instead,)24=0A=
b(con-)150 1798 y(sider)15 =
b(using)f(a)g(timer)g(to)f(pro)o(vide)h(timeouts.)=0A=
20 b(See)14 b(the)g(description)h(of)f(the)g FE(add)p 1541=0A=
1798 V 17 w(timer\(\))e FH(function)j(in)150 1863 y(section)h(1.6)e(for)h=0A=
(details.)150 2014 y FD(1.3.6.5)54 b(The)18 b FE(ioctl\(\))f=0A=
FD(function)150 2131 y FH(The)d FE(ioctl\(\))e =
FH(function)j(pro)q(cesses)f=0A=
(io)q(ctl)g(calls.)21 b(The)13 b(structure)h(of)f(y)o(our)g=0A=
FE(ioctl\(\))f FH(function)i(will)i(b)q(e:)150 2196 =
y(\014rst)d(error)f(c)o=0A=
(hec)o(king,)i(then)g(one)f(gian)o(t)g(\(p)q(ossibly)h(nested\))f(switc)o=
(h)g=0A=
(statemen)o(t)f(to)h(handle)h(all)g(p)q(ossible)150 2260 y(io)q(ctls.)24=0A=
b(The)16 b(io)q(ctl)i(n)o(um)o(b)q(er)e(is)h(passed)f(as)g=0A=
FE(cmd)p =
FH(,)g(and)g(the)g(argumen)o(t)g(to)f(the)i(io)q(ctl)g(is)g(passed)f=0A=
(as)g FE(arg)p FH(.)150 2324 =
y(It)f(is)h(go)q(o)q(d)e(to)h(ha)o(v)o(e)f(an)h=0A=
(understanding)i(of)d(ho)o(w)h FE(ioctls)f =
FH(ough)o(t)g(to)g(w)o(ork)g(b)q=0A=
(efore)i(making)f(them)g(up.)150 2389 =
y(If)j(y)o(ou)f(are)g(not)g(sure)g(ab)q=0A=
(out)g(y)o(our)g(io)q(ctls,)i(do)e(not)g(feel)h(ashamed)g(to)e(ask)h(some=
one)=0A=
h(kno)o(wledgeable)150 2453 =
y(ab)q(out)f(it,)i(for)e(a)g(few)g(reasons:)25=0A=
b(y)o(ou)17 =
b(ma)o(y)g(not)g(ev)o(en)h(need)h(an)e(io)q(ctl)i(for)e(y)o(our)g=0A=
(purp)q(ose,)h(and)g(if)g(y)o(ou)150 2517 y(do)d(need)g(an)g(io)q(ctl,)h=0A=
(there)f(ma)o(y)f(b)q(e)h(a)g(b)q(etter)g(w)o(a)o(y)e(to)h(do)h(it)g(than=
)g=0A=
(what)f(y)o(ou)h(ha)o(v)o(e)f(though)o(t)g(of.)19 b(Since)p=0A=
eop=0A=
%%Page: 18 29=0A=
18 28 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(18)150 88 y(io)q(ctls)18 =
b(are)e(the)h(least)g=0A=
(regular)g(part)g(of)f(the)h(device)i(in)o(terface,)e(it)g(tak)o(es)f(p)q=0A=
(erhaps)i(the)f(most)f(w)o(ork)g(to)150 153 =
y(get)f(this)g(part)g(righ)o(t.)=0A=
20 b(T)l(ak)o(e)15 =
b(the)g(time)g(and)h(energy)f(y)o(ou)g(need)h(to)f(get)f=0A=
(it)i(righ)o(t.)150 270 y FE(struct)23 b(inode)g(*)h(inode)450=0A=
334 y FH(P)o(oin)o(ter)15 =
b(to)f(the)i(ino)q(de)g(structure)f(for)g(this)g=0A=
(device.)150 438 y FE(struct)23 b(file)g(*)h(file)450 502 y=0A=
FH(P)o(oin)o(ter)15 =
b(to)f(the)i(\014le)g(structure)f(for)f(this)i(device.)=0A=
150 606 y FE(unsigned)23 b(int)g(cmd)450 670 y FH(This)17 =
b(is)f(the)h(io)q=0A=
(ctl)g(command.)23 b(It)16 =
b(is)h(generally)g(used)g(as)e(the)i(switc)o(h)f=0A=
(v)m(ariable)i(for)d(a)450 734 y(case)g(statemen)o(t.)150 838=0A=
y FE(unsigned)23 b(int)g(arg)450 902 y =
FH(This)c(is)g(the)f(argumen)o(t)f(to)=0A=
h(the)g(command.)29 b(This)19 b(is)g(user)g(de\014ned.)30 b(Since)20=0A=
b(this)e(is)450 967 y(the)h(same)f(size)h(as)f(a)h FE(\(void)k(*\))p=0A=
FH(,)18 =
b(this)h(can)g(b)q(e)g(used)g(as)f(a)h(p)q(oin)o(ter)g(to)e(user)i=0A=
(space,)450 1031 =
y(accessed)d(through)f(the)g(fs)g(register)g(as)g(usual.)150=0A=
1161 y FD(Returns:)103 b FE(-errno)14 b FH(on)h(error)450 1225=0A=
y(Ev)o(ery)g(other)g(return)g(is)g(user-de\014ned.)221 1355=0A=
y(If)d(the)f FE(ioctl\(\))g FH(slot)h(in)g(the)g FE(file)p=0A=
822 1355 15 2 v 17 w(operations)e =
FH(structure)i(is)g(not)f(\014lled)j(in,)f=0A=
(the)f(VFS)g(will)h(return)150 1419 y FE(-EINVAL)p =
FH(.)g(Ho)o(w)o(ev)o(er,)g=0A=
(in)j(all)f(cases,)f(if)h FE(cmd)f FH(is)h(one)f(of)g FE(FIOCLEX)p=0A=
FH(,)g FE(FIONCLEX)p FH(,)e FE(FIONBIO)p FH(,)i(or)f FE(FIOASYNC)p=0A=
FH(,)150 1483 y(default)j(pro)q(cessing)g(will)h(b)q(e)f(done:)150=0A=
1601 y FE(FIOCLEX)132 b FH(0x5451)450 1665 y(Sets)15 =
b(the)g(close-on-exec)i=0A=
(bit.)150 1768 y FE(FIONCLEX)108 b FH(0x5450)450 1833 y(Clears)15=0A=
b(the)h(close-on-exec)g(bit.)150 1936 y FE(FIONBIO)132 b FH(0x5421)450=0A=
2001 y(If)15 b FE(arg)g FH(is)h(non-zero,)f(set)g FE(O)p 923=0A=
2001 V 17 w(NONBLOCK)p FH(,)f(otherwise)h(clear)h FE(O)p 1494=0A=
2001 V 17 w(NONBLOCK)p FH(.)150 2104 y FE(FIOASYNC)108 b FH(0x5452)450=0A=
2168 y(If)22 b FE(arg)f FH(is)g(non-zero,)i(set)e FE(O)p 955=0A=
2168 V 17 w(SYNC)p FH(,)g(otherwise)g(clear)h FE(O)p 1449 2168=0A=
V 17 w(SYNC)p FH(.)f FE(O)p 1620 2168 V 17 w(SYNC)g =
FH(is)g(not)g(y)o(et)450=0A=
2233 y(implemen)o(ted,)e(but)f(it)f(is)h(do)q(cumen)o(ted)h(here)e(and)h=0A=
(parsed)f(in)i(the)e(k)o(ernel)h(for)f(com-)450 2297 y(pleteness.)150=0A=
2414 =
y(Note)i(that)g(y)o(ou)h(ha)o(v)o(e)f(to)g(a)o(v)o(oid)h(these)f(four)h=0A=
(n)o(um)o(b)q(ers)g(when)g(creating)g(y)o(our)f(o)o(wn)g(io)q(ctls,)j(sin=
ce)e=0A=
(if)150 2479 =
y(they)f(con\015ict,)h(the)f(VFS)g(io)q(ctl)h(co)q(de)f(will)i=0A=
(in)o(terpret)e(them)f(as)h(b)q(eing)h(one)f(of)f(these)h(four,)g(and)g(a=
ct)=0A=
150 2543 =
y(appropriately)l(,)d(causing)g(a)e(v)o(ery)h(hard)g(to)g(trac)o(k)f=0A=
(do)o(wn)h(bug.)p eop=0A=
%%Page: 19 30=0A=
19 29 bop 150 -84 1800 3 v 150 -100 a FD(1.3.)42 b(Device)18=0A=
b(Driv)o(er)g(Basics)1156 b FH(19)150 88 y FD(1.3.6.6)54 b(The)18=0A=
b FE(mmap\(\))f FD(function)150 202 y FE(struct)23 =
b(inode)g(*)h(inode)450=0A=
266 y FH(P)o(oin)o(ter)15 b(to)f(ino)q(de)j(structure)e(for)f(device.)150=0A=
370 y FE(struct)23 b(file)g(*)h(file)450 434 y FH(P)o(oin)o(ter)15=0A=
b(to)f(\014le)j(structure)e(for)f(device.)150 537 y FE(unsigned)23=0A=
b(long)g(addr)450 602 y FH(Beginning)17 =
b(of)e(address)g(in)h(main)g(memory)e=0A=
(to)h FE(mmap\(\))f FH(in)o(to.)150 705 y FE(size)p 249 705=0A=
15 2 v 17 w(t)23 b(len)68 b FH(Length)16 b(of)e(memory)h(to)g=0A=
FE(mmap\(\))p FH(.)150 809 y FE(int)23 b(prot)109 b FH(One)16=0A=
b(of:)p 450 825 857 2 v 449 889 2 65 v 499 870 a FE(PROT)p=0A=
598 870 15 2 v 16 w(READ)p 731 889 2 65 v 50 w FH(region)f(can)g(b)q(e)h=0A=
(read.)p 1305 889 V 450 891 857 2 v 449 955 2 65 v 475 936=0A=
a FE(PROT)p 574 936 15 2 v 17 w(WRITE)p 731 955 2 65 v 49 w=0A=
FH(region)f(can)g(b)q(e)h(written.)p 1305 955 V 450 957 857=0A=
2 v 449 1021 2 65 v 499 1002 a FE(PROT)p 598 1002 15 2 v 16=0A=
w(EXEC)p 731 1021 2 65 v 50 w FH(region)f(can)g(b)q(e)h(executed.)p=0A=
1305 1021 V 450 1023 857 2 v 449 1087 2 65 v 499 1068 a FE(PROT)p=0A=
598 1068 15 2 v 16 w(NONE)p 731 1087 2 65 v 50 w =
FH(region)f(cannot)g(b)q(e)h=0A=
(accessed.)p 1305 1087 V 450 1089 857 2 v 150 1196 a FE(unsigned)23=0A=
b(long)g(off)450 1261 y FH(O\013set)15 b(in)h(the)e(\014le)i(to)e=0A=
FE(mmap\(\))g FH(from.)19 =
b(This)c(address)g(in)g(the)g(\014le)h(will)g(b)q=0A=
(e)f(mapp)q(ed)h(to)450 1325 y(address)f FE(addr)p FH(.)450=0A=
1409 y FD([Here,)i(giv)o(e)d(a)i(p)q(oin)o(ter)g(to)g(the)f(do)q(cumen)o=0A=
(tation)i(for)e(the)g(new)g(vmm)f(\(Vir-)450 1473 y(tual)20=0A=
b(Memory)e(Mangamen)o(t\))g(in)o(terface,)j(and)e(sho)o(w)e(ho)o(w)h(the)=
h=0A=
(functions)450 1538 y(can)f(b)q(e)f(used)f(b)o(y)g(a)i(device)f=0A=
FE(mmap\(\))f FD(function.)25 b(Krishna)18 =
b(should)f(ha)o(v)o(e)f(the)450=0A=
1602 y(do)q(cumen)o(tation)h(for)e(the)h(vmm)d(in)o(terface)k(in)e(the)h=0A=
(memory)e(managemen)o(t)450 1666 y(section.])150 1818 y(1.3.6.7)54=0A=
b(The)18 b FE(open\(\))f FD(and)h FE(release\(\))e FD(functions)150=0A=
1931 y FE(struct)23 b(inode)g(*)h(inode)450 1996 y FH(P)o(oin)o(ter)15=0A=
b(to)f(ino)q(de)j(structure)e(for)f(device.)150 2099 y FE(struct)23=0A=
b(file)g(*)h(file)450 2163 y FH(P)o(oin)o(ter)15 =
b(to)f(\014le)j(structure)e=0A=
(for)f(device.)150 2293 y FE(open\(\))d =
FH(is)i(called)g(when)g(a)f(device)h=0A=
(sp)q(ecial)h(\014les)f(is)g(op)q(ened.)20 b(It)12 =
b(is)g(the)h(p)q(olicy)g=0A=
(mec)o(hanism)g(resp)q(onsible)150 2357 =
y(for)i(ensuring)h(consistency)l(.)22=0A=
b(If)16 =
b(only)g(one)g(pro)q(cess)f(is)h(allo)o(w)o(ed)g(to)f(op)q(en)h(the)g=0A=
(device)g(at)f(once,)h FE(open\(\))150 2422 y =
FH(should)g(lo)q(c)o(k)g(the)f=0A=
(device,)h(using)g(whatev)o(er)e(lo)q(c)o(king)j(mec)o(hanism)e(is)h=0A=
(appropriate,)f(usually)h(setting)f(a)150 2486 =
y(bit)g(in)f(some)g(state)f(v)=0A=
m(ariable)j(to)d(mark)h(it)g(as)g(busy)l(.)20 b(If)14 b(a)g(pro)q(cess)g=0A=
(already)h(is)f(using)h(the)f(device)i(\(if)e(the)150 2551=0A=
y(busy)j(bit)g(is)g(already)g(set\))f(then)h FE(open\(\))e=0A=
FH(should)j(return)f FE(-EBUSY)p =
FH(.)e(If)i(more)f(than)g(one)h(pro)q(cess)g=0A=
(ma)o(y)p eop=0A=
%%Page: 20 31=0A=
20 30 bop 150 -84 1800 3 v 150 -100 a FD(1.4.)42 b(Character)20=0A=
b(Device)d(Driv)o(ers)1049 b FH(20)150 88 y(op)q(en)15 b(the)g(device,)h=0A=
(this)f(function)g(is)g(resp)q(onsible)i(to)d(set)g(up)h(an)o(y)f(necessa=
ry)h=0A=
(queues)h(that)d(w)o(ould)i(not)150 153 y(b)q(e)i(set)g(up)g(in)g=0A=
FE(write\(\))p FH(.)24 b(If)17 b(no)f(suc)o(h)h(device)i(exists,)e=0A=
FE(open\(\))e FH(should)j(return)f FE(-ENODEV)e FH(to)h(indicate)150=0A=
217 y(this.)k(Return)c(0)f(on)g(success.)221 305 y FE(release\(\))c=0A=
FH(is)j(called)h(only)e(when)h(the)f(pro)q(cess)g(closes)h(its)f(last)g(o=
p)q=0A=
(en)h(\014le)g(descriptor)f(on)g(the)g(\014les.)150 369 =
y(If)i(devices)i(ha)o=0A=
(v)o(e)d(b)q(een)j(mark)o(ed)d(as)h(busy)l(,)g FE(release\(\))f=0A=
FH(should)i(unset)g(the)f(busy)g(bits)h(if)f(appropriate.)150=0A=
434 y(If)h(y)o(ou)g(need)h(to)e(clean)i(up)f FE(kmalloc\(\))p=0A=
FH('ed)f(queues)i(or)e(reset)h(devices)h(to)e(preserv)o(e)h(their)h(sanit=
)o=0A=
(y)l(,)f(this)150 498 y(is)g(the)f(place)h(to)f(do)g(it.)20=0A=
b(If)15 b(no)h FE(release\(\))d =
FH(function)k(is)e(de\014ned,)h(none)g(is)g=0A=
(called.)150 649 y FD(1.3.6.8)54 b(The)18 b FE(init\(\))f FD(function)150=0A=
767 y FH(This)h(function)h(is)f(not)f(actually)i(included)h(in)f(the)f=0A=
FE(file)p 1164 767 15 2 v 16 w(operations)f =
FH(structure,)g(but)h(y)o(ou)f=0A=
(are)h(re-)150 831 y(quired)24 =
b(to)d(implemen)o(t)j(it,)g(b)q(ecause)g(it)e=0A=
(is)h(this)g(function)g(that)f(registers)g(the)h FE(file)p=0A=
1698 831 V 16 w(operations)150 895 y FH(structure)14 =
b(with)g(the)g(VFS)g(in)=0A=
h(the)f(\014rst)f(place)i(|)g(without)f(this)g(function,)h(the)f(VFS)g(co=
uld)=0A=
h(not)e(route)150 960 y(an)o(y)k(requests)g(to)f(the)h(driv)o(er.)26=0A=
b(This)17 =
b(function)h(is)g(called)g(when)g(the)f(k)o(ernel)h(\014rst)e(b)q=0A=
(o)q(ots)h(and)g(is)h(con-)150 1024 y(\014guring)g(itself.)26=0A=
b FE(init\(\))16 b FH(is)i(passed)f(a)g(v)m(ariable)h(holding)h(the)e=0A=
(address)g(of)g(the)g(curren)o(t)g(end)h(of)e(used)150 1088=0A=
y(memory)l(.)j(The)12 =
b(init)i(function)g(then)e(detects)h(all)h(devices,)g=0A=
(allo)q(cates)f(an)o(y)f(memory)g(it)h(will)h(w)o(an)o(t)e(based)150=0A=
1153 y(on)17 b(ho)o(w)f(man)o(y)g(devices)i(exist)f(\(this)g(is)g(often)g=0A=
(used)g(to)f(hold)i(suc)o(h)f(things)g(as)f(queues,)i(for)e(in)o(terrupt)=
150=0A=
1217 =
y(driv)o(en)f(devices\),)h(and)e(then,)h(sa)o(ving)f(the)h(addresses)f=0A=
(it)h(needs,)g(it)g(returns)f(the)h(new)g(end)g(of)f(memory)l(.)150=0A=
1282 y(Y)l(ou)j(will)h(ha)o(v)o(e)f(to)f(call)i(y)o(our)e FE(init\(\))g=0A=
FH(function)h(from)f(the)h(correct)f(place:)24 b(for)16 =
b(a)h(c)o(haracter)f=0A=
(device,)150 1346 y(this)k(is)g FE(chr)p 368 1346 V 17 w(dev)p=0A=
457 1346 V 17 w(init\(\))f FH(in)h FB(:)8 b(:)g(:)e =
FH(/k)o(ernel/c)o(hr)p=0A=
981 1346 14 2 v 17 w(dev/mem.c.)33 b(In)20 =
b(general,)h(y)o(ou)f(will)h(only)=0A=
f(pass)g(the)150 1410 y FE(memory)p 297 1410 15 2 v 16 w(start)15=0A=
b FH(v)m(ariable)h(to)f(y)o(our)g FE(init\(\))f FH(function.)221=0A=
1498 y(While)e(the)f FE(init\(\))g =
FH(function)h(runs,)g(it)f(registers)g(y)o=0A=
(our)g(driv)o(er)g(b)o(y)h(calling)g(the)g(prop)q(er)f(registration)150=0A=
1562 y(function.)34 b(F)l(or)19 b(c)o(haracter)g(devices,)j(this)e(is)g=0A=
FE(register)p 1160 1562 V 16 w(chrdev\(\))p FH(.)1378 1546=0A=
y Fm(4)1430 1562 y FE(register)p 1625 1562 V 16 w(chrdev\(\))f=0A=
FH(tak)o(es)150 1627 y(three)f(argumen)o(ts:)24 b(the)17 =
b(ma)s(jor)g(device)=0A=
i(n)o(um)o(b)q(er)f(\(an)f(in)o(t\),)h(the)f(\\name")h(of)f(the)h(device)=
h=0A=
(\(a)e(string\),)150 1691 y(and)e(the)h(address)f(of)g(the)g=0A=
FC(devic)n(e)p 731 1691 V 17 w FE(fops)f(file)p 954 1691 V=0A=
17 w(operations)g FH(structure.)221 1779 =
y(When)h(this)h(is)h(done,)e(and)h=0A=
(a)f(c)o(haracter)g(or)g(blo)q(c)o(k)h(sp)q(ecial)i(\014le)e(is)g(accesse=
d,)g=0A=
(the)g(VFS)f(\014lesystem)150 1843 y(switc)o(h)k(automagically)f(routes)g=0A=
(the)h(call,)h(whatev)o(er)d(it)i(is,)g(to)f(the)g(prop)q(er)h(function,)=
g=0A=
(if)g(a)f(function)150 1908 =
y(exists.)i(If)c(the)f(function)h(do)q(es)f(not)g=0A=
(exist,)g(the)h(VFS)f(routines)h(tak)o(e)e(some)h(default)h(action.)221=0A=
1996 y(The)i FE(init\(\))f FH(function)h(usually)i(displa)o(ys)f(some)e=0A=
(information)h(ab)q(out)g(the)g(driv)o(er,)h(and)f(usually)150=0A=
2060 y(rep)q(orts)d(all)h(hardw)o(are)e(found.)21 b(All)16=0A=
b(rep)q(orting)g(is)f(done)h(via)f(the)h FE(printk\(\))e FH(function.)150=0A=
2237 y Ft(1.4)70 b(Character)23 b(Device)d(Driv)n(ers)150 2370=0A=
y FD([W)l(rite)f(appropriate)h(blurb)f(here])p 150 2412 720=0A=
2 v 207 2444 a FA(4)225 2459 y Fl(Se)q(e)g(se)q(c)r(t)r(i)q(o)s(n)r=0A=
Fh(??)p eop=0A=
%%Page: 21 32=0A=
21 31 bop 150 -84 1800 3 v 150 -100 a FD(1.4.)36 b(Character)20=0A=
b(Device)e(Driv)o(ers)1054 b FH(21)150 88 y Fq(1.4.1)55 =
b(Initialization)150=0A=
206 y FH(Besides)21 b(functions)g(de\014ned)h(b)o(y)e(the)g=0A=
FE(file)p 929 206 15 2 v 16 w(operations)f =
FH(structure,)i(there)f(is)h(at)e=0A=
(least)h(one)g(other)150 270 =
y(function)g(that)f(y)o(ou)g(will)i(ha)o(v)o(e)e=0A=
(to)f(write,)i(the)g FE(foo)p 1075 270 V 16 w(init\(\))f FH(function.)33=0A=
b(Y)l(ou)19 b(will)i(ha)o(v)o(e)e(to)g(c)o(hange)150 334 y=0A=
FE(chr)p 225 334 V 17 w(dev)p 314 334 V 17 w(init\(\))14 b=0A=
FH(in)h(c)o(hr)p 603 334 14 2 v 17 w(drv/mem.c)f(to)g(call)i(y)o(our)f=0A=
FE(foo)p 1167 334 15 2 v 17 w(init\(\))f FH(function.)20 b=0A=
FE(foo)p 1609 334 V 17 w(init\(\))14 b FH(will)j(tak)o(e)150=0A=
399 y(one)g(argumen)o(t,)f FE(long)24 b(mem)p 648 399 V 16=0A=
w(start)p FH(,)17 b(whic)o(h)g(will)i(b)q(e)f(the)f(address)g(of)f(the)h=0A=
(curren)o(t)g(end)g(of)g(allo)q(cated)150 463 y(memory)l(.)i(If)13=0A=
b(y)o(our)f(driv)o(er)i(needs)f(to)g(allo)q(cate)g(more)g(than)f(4K)h(of)=
g=0A=
(con)o(tiguous)g(space)g(at)f(run)o(time,)i(here)150 527 =
y(is)k(the)f(place.)=0A=
28 b(Simply)19 b(sa)o(v)o(e)e FE(mem)p 749 527 V 16 w(start)g=0A=
FH(in)h(an)g(appropriate)f(v)m(ariable,)i(add)f(ho)o(w)o(ev)o(er)e(m)o(uc=
)o=0A=
(h)i(space)150 592 y(y)o(ou)i(need)h(to)e FE(mem)p 487 592=0A=
V 17 w(start)p FH(,)h(and)g(return)g(the)g(new)g(v)m(alue.)36=0A=
b(Y)l(our)20 b(driv)o(er)g(will)i(no)o(w)e(ha)o(v)o(e)f(exclusiv)o(e)150=0A=
656 =
y(access)c(to)g(the)g(memory)g(b)q(et)o(w)o(een)g(the)h(old)f(and)h(new)f=0A=
(v)m(alues)i(of)d FE(mem)p 1367 656 V 17 w(start)p FH(.)221=0A=
744 y FE(foo)p 296 744 V 16 w(init\(\))e FH(should)i(\014rst)e(call)h=0A=
FE(register)p 973 744 V 16 w(chrdev\(\))f =
FH(to)g(register)g(itself)i(and)e=0A=
(a)o(v)o(oid)h(device)h(n)o(um-)150 808 y(b)q(er)i(con)o(ten)o(tion.)k=0A=
FE(register)p 665 808 V 16 w(chrdev\(\))14 b =
FH(tak)o(es)g(three)h(argumen)o=0A=
(ts:)150 926 y FE(int)23 b(major)85 b FH(This)16 =
b(is)f(the)h(ma)s(jor)d(n)o=0A=
(um)o(b)q(er)j(whic)o(h)g(the)f(driv)o(er)h(wishes)g(to)e(allo)q(cate.)15=
0=0A=
1029 y FE(char)23 b(*name)61 b FH(This)12 =
b(is)g(the)g(sym)o(b)q(olic)h(name)=0A=
f(of)f(the)h(driv)o(er.)19 b(It)11 =
b(is)h(curren)o(tly)h(not)e(used)h(for)f=0A=
(an)o(ything,)450 1093 y(but)k(this)h(ma)o(y)e(c)o(hange)i(in)g(the)f=0A=
(future.)150 1197 y FE(struct)23 b(file)p 416 1197 V 17 =
w(operations)f(*f)p=0A=
743 1197 V 17 w(ops)450 1261 y FH(This)14 b(is)f(the)g(address)g(of)f(y)o=0A=
(our)h FE(file)p 1081 1261 V 17 w(operations)e =
FH(structure)i(de\014ned)h(in)=0A=
g(Section)g FD(??)150 1365 y(Returns:)103 b FH(0)15 =
b(if)h(no)f(other)f(c)o=0A=
(haracter)h(device)i(has)e(registered)g(with)h(the)f(same)g(ma)s(jor)f(n)=
o=0A=
(um)o(b)q(er.)450 1429 =
y(non-0)j(if)g(the)g(call)g(fails,)h(presumably)f(b)q=0A=
(ecause)h(another)e(c)o(haracter)g(device)i(has)e(al-)450 1493=0A=
y(ready)f(allo)q(cated)h(that)f(ma)s(jor)e(n)o(um)o(b)q(er.)221=0A=
1611 y(Generally)l(,)18 b(the)f FE(foo)p 593 1611 V 17 w(init\(\))f=0A=
FH(routine)i(will)h(then)e(attempt)f(to)h(detect)g(the)g(hardw)o(are)g(th=
at)f=0A=
(it)h(is)150 1675 y(supp)q(osed)d(to)f(b)q(e)h(driving.)20=0A=
b(It)14 b(should)g(mak)o(e)f(sure)g(that)g(all)h(necessary)g(data)e=0A=
(structures)h(are)g(\014lled)i(out)150 1739 =
y(for)i(all)i(presen)o(t)f(hardw)=0A=
o(are,)f(and)h(ha)o(v)o(e)f(some)h(w)o(a)o(y)e(of)i(ensuring)g(that)f=0A=
(non-presen)o(t)i(hardw)o(are)e(do)q(es)150 1804 =
y(not)e(get)g(accessed.)20=0A=
b FD([detail)g(di\013eren)o(t)f(w)o(a)o(ys)c(of)j(doing)g(this.])150=0A=
1957 y Fq(1.4.2)55 b(In)n(terrupts)19 b(vs.)24 b(P)n(olling)150=0A=
2074 y FH(In)19 b(a)g(p)q(olling)i(driv)o(er,)f(the)f FE(foo)p=0A=
712 2074 V 16 w(read\(\))f FH(and)h FE(foo)p 1054 2074 V 17=0A=
w(write\(\))f FH(functions)i(are)e(prett)o(y)g(easy)h(to)f(write.)150=0A=
2139 y(Here)d(is)h(an)f(example)h(of)f FE(foo)p 671 2139 V=0A=
17 w(write\(\))p FH(:)264 2256 y Fs(static)20 b(int)h(foo_write\(struct)e=0A=
(inode)i(*)g(inode,)g(struct)f(file)h(*)h(file,)721 2313 =
y(char)f(*)h(buf,)f=0A=
(int)g(count\))264 2370 y({)351 2427 y(unsigned)f(int)h(minor)g(=3D)g=0A=
(MINOR\(inode->i_rdev\))o(;)351 2483 y(char)g(ret;)p eop=0A=
%%Page: 22 33=0A=
22 32 bop 150 -84 1800 3 v 150 -100 a FD(1.4.)36 b(Character)20=0A=
b(Device)e(Driv)o(ers)1054 b FH(22)351 88 y Fs(while)21 =
b(\(count)f(>)i(0\))f=0A=
({)438 145 y(ret)g(=3D)h(foo_write_byte\(m)o(inor\))o(;)264 202=0A=
y(if)f(\(ret)g(<)h(0\))f({)525 259 y(foo_handle_error\(W)o(RITE,)d(ret,)j=0A=
(minor\);)525 316 y(continue;)438 372 y(})438 429 y(buf++)g(=3D)g(ret;)g=0A=
(count--)351 486 y(})351 543 y(return)f(count;)264 599 y(})150=0A=
718 y FE(foo)p 225 718 15 2 v 17 w(write)p 362 718 V 16 w(byte\(\))14=0A=
b FH(and)g FE(foo)p 695 718 V 17 w(handle)p 856 718 V 16 w(error\(\))f=0A=
FH(are)h(either)h(functions)g(de\014ned)g(elsewhere)h(in)f(fo)q(o.c)150=0A=
783 y(or)g(pseudo)q(co)q(de.)21 b FE(WRITE)15 b FH(w)o(ould)g(b)q(e)h(a)f=0A=
(constan)o(t)f(or)h FE(#define)p FH(.)221 870 =
y(It)g(should)h(b)q(e)g(clear)g=0A=
(from)e(this)i(example)g(ho)o(w)e(to)h(co)q(de)h(the)f FE(foo)p=0A=
1367 870 V 17 w(read\(\))f FH(function)i(as)f(w)o(ell.)221=0A=
958 y(In)o(terrupt-driv)o(en)f(driv)o(ers)h(are)e(a)h(little)h(more)e=0A=
(di\016cult.)21 b(Here)14 b(is)h(an)f(example)g(of)g(a)f FE(foo)p=0A=
1769 958 V 17 w(write\(\))150 1023 y =
FH(that)h(is)i(in)o(terrupt-driv)o(en:)=0A=
264 1134 y =
Fs(static)k(int)h(foo_write\(struct)e(inode)i(*)g(inode,)g(struct)=0A=
f(file)h(*)h(file,)721 1191 y(char)f(*)h(buf,)f(int)g(count\))264=0A=
1247 y({)351 1304 =
y(unsigned)f(int)h(minor)g(=3D)g(MINOR\(inode->i_rdev\))o(;)=0A=
351 1361 y(unsigned)f(long)h(copy_size;)351 1418 y(unsigned)f(long)h=0A=
(total_bytes_writt)o(en)e(=3D)i(0;)351 1475 =
y(unsigned)f(long)h(bytes_written;)=0A=
351 1531 y(struct)f(foo_struct)g(*foo)h(=3D)h(&foo_table[minor)o(];)351=0A=
1645 y(do)f({)438 1702 =
y(copy_size)f(=3D)h(\(count)g(<=3D)g(FOO_BUFFER_SIZE)e(?)j=0A=
(count)e(:)i(FOO_BUFFER_SIZE\);)438 1759 y(memcpy_fromfs\(foo)o(->foo)o=0A=
(_buff)o(er,)d(buf,)i(copy_size\);)438 1872 =
y(while)g(\(copy_size\))e({)525=0A=
1929 y(/*)j(initiate)e(interrupts)f(*/)525 2043 y(if)j(\(some_error_has)o=0A=
(_occu)o(red\))40 b({)612 2099 y(/*)22 =
b(handle)e(error)h(condition)f(*/)525=0A=
2156 y(})525 2270 =
y(current->timeout)f(=3D)i(jiffies)g(+)g(FOO_INTERRUPT_TIME)o=0A=
(OUT;)612 2326 y(/*)h(set)f(timeout)f(in)i(case)f(an)g(interrupt)f(has)h=0A=
(been)g(missed)g(*/)525 2383 =
y(interruptible_slee)o(p_on\()o(&foo-)o(>foo_)o=0A=
(wait)o(_queu)o(e\);)525 2440 =
y(bytes_written)e(=3D)j(foo->bytes_xfered)o(;)525=0A=
2497 y(foo->bytes_written)c(=3D)k(0;)525 2554 =
y(if)g(\(current->signa)o(l)d(&)j=0A=
(~current->block)o(ed\))d({)p eop=0A=
%%Page: 23 34=0A=
23 33 bop 150 -84 1800 3 v 150 -100 a FD(1.4.)42 b(Character)20=0A=
b(Device)d(Driv)o(ers)1049 b FH(23)612 88 y Fs(if)22 =
b(\(total_bytes_wri)o=0A=
(tten)c(+)k(bytes_written\))699 145 =
y(return)f(total_bytes_writte)o(n)e(+)i=0A=
(bytes_written;)612 202 y(else)699 259 =
y(return)g(-EINTR;)f(/*)i(nothing)e=0A=
(was)h(written,)f(system)1092 316 =
y(call)h(was)g(interrupted,)e(try)i(again)g=0A=
(*/)525 372 y(})438 429 y(})438 543 y(total_bytes_writt)o(en)e(+=3D)i=0A=
(bytes_written;)438 599 y(buf)g(+=3D)h(bytes_written;)438 656=0A=
y(count)f(-=3D)g(bytes_written;)351 770 =
y(})g(while)g(\(count)g(>)g(0\);)351=0A=
883 y(return)f(total_bytes_written)o(;)264 940 y(})264 1054=0A=
y(static)g(void)h(foo_interrupt\(int)d(irq\))264 1111 y({)351=0A=
1167 =
y(struct)i(foo_struct)g(*foo)h(=3D)h(&foo_table[foo_i)o(rq[i)o(rq]];)351=0A=
1281 =
y(/*)f(Here,)g(do)g(whatever)f(actions)h(ought)g(to)g(be)g(taken)g(on)g=0A=
(an)h(interrupt.)416 1338 y(Look)f(at)h(a)f(flag)g(in)g(foo_table)f(to)i=0A=
(know)f(whether)f(you)h(ought)g(to)g(be)416 1394 =
y(reading)g(or)g(writing.)f=0A=
(*/)351 1508 y(/*)h(Increment)f(foo->bytes_xfered)e(by)k(however)e(many)h=0A=
(characters)f(were)416 1565 y(read)h(or)h(written)e(*/)351=0A=
1678 y(if)h(\(buffer)g(too)g(full/empty\))438 1735 y(wake_up_interrupt)o=0A=
(ible\()o(&foo-)o(>foo_)o(wait_)o(queu)o(e\);)264 1792 y(})221=0A=
2015 y FH(Again,)26 b(a)e FE(foo)p 499 2015 15 2 v 17 w(read\(\))f=0A=
FH(function)i(is)g(written)g(analagously)l(.)47 b FE(foo)p=0A=
1453 2015 V 17 w(table[])23 b FH(is)i(an)f(arra)o(y)f(of)150=0A=
2080 =
y(structures,)f(eac)o(h)f(of)g(whic)o(h)h(has)f(sev)o(eral)g(mem)o(b)q=0A=
(ers,)i(some)d(of)h(whic)o(h)h(are)f FE(foo)p 1610 2080 V 17=0A=
w(wait)p 1723 2080 V 16 w(queue)g FH(and)150 2144 y FE(bytes)p=0A=
273 2144 V 16 w(xfered)p FH(,)16 =
b(whic)o(h)i(can)f(b)q(e)g(used)g(for)f(b)q=0A=
(oth)h(reading)h(and)e(writing.)25 b FE(foo)p 1531 2144 V 17=0A=
w(irq[])16 b FH(is)h(an)g(arra)o(y)e(of)150 2208 =
y(16)h(in)o(tegers,)h(and)g=0A=
(is)g(used)h(for)e(lo)q(oking)i(up)f(whic)o(h)h(en)o(try)e(in)i=0A=
FE(foo)p 1319 2208 V 17 w(table[])d =
FH(is)j(asso)q(ciated)f(with)g(the)150=0A=
2273 y FE(irq)e FH(generated)g(and)g(rep)q(orted)h(to)e(the)h=0A=
FE(foo)p 924 2273 V 17 w(interrupt\(\))f FH(function.)221 2361=0A=
y(T)l(o)20 b(tell)h(the)g(in)o(terrupt-handling)h(co)q(de)f(to)f(call)h=0A=
FE(foo)p 1179 2361 V 17 w(interrupt\(\))p =
FH(,)f(y)o(ou)g(need)h(to)f(use)g=0A=
(either)150 2425 y FE(request)p 321 2425 V 16 w(irq\(\))c FH(or)g=0A=
FE(irqaction\(\))p FH(.)23 b(This)17 b(is)g(either)h(done)f(when)g=0A=
FE(foo)p 1415 2425 V 17 w(open\(\))f =
FH(is)h(called,)h(or)e(if)h(y)o(ou)150=0A=
2489 y(w)o(an)o(t)g(to)g(k)o(eep)h(things)h(simple,)h(when)e=0A=
FE(foo)p 922 2489 V 17 w(init\(\))f FH(is)h(called.)30 b FE(request)p=0A=
1471 2489 V 16 w(irq\(\))18 b FH(is)g(the)g(simpler)h(of)150=0A=
2554 y(the)14 =
b(t)o(w)o(o,)e(and)i(w)o(orks)f(rather)h(lik)o(e)h(an)e(old-st)=0A=
o(yle)i(signal)g(handler.)20 b(It)14 =
b(tak)o(es)f(t)o(w)o(o)g(argumen)o(ts:)=0A=
18 b(the)c(\014rst)p eop=0A=
%%Page: 24 35=0A=
24 34 bop 150 -84 1800 3 v 150 -100 a FD(1.5.)42 b(Blo)q(c)o(k)18=0A=
b(Device)g(Driv)o(ers)1148 b FH(24)150 88 y(is)16 =
b(the)g(n)o(um)o(b)q(er)g=0A=
(of)f(the)h FE(irq)g =
FH(y)o(ou)f(are)g(requesting,)i(and)e(the)h(second)h(is)=0A=
f(a)f(p)q(oin)o(ter)h(to)g(y)o(our)f(in)o(terrupt)150 153 y(handler,)22=0A=
b(whic)o(h)f(m)o(ust)f(tak)o(e)g(an)g(in)o(teger)h(argumen)o(t)e(\(the)h(=
irq)=0A=
h(that)e(w)o(as)h(generated\))g(and)g(ha)o(v)o(e)g(a)150 217=0A=
y(return)d(t)o(yp)q(e)g(of)f FE(void)p FH(.)24 b FE(request)p=0A=
752 217 15 2 v 17 w(irq\(\))16 b FH(returns)h FE(-EINVAL)e=0A=
FH(if)j FE(irq)e FB(>)h =
FH(15)g(or)f(if)h(the)g(p)q(oin)o(ter)h(to)e(the)150=0A=
281 y(in)o(terrupt)f(handler)g(is)g FE(NULL)p FH(,)e FE(-EBUSY)h=0A=
FH(if)g(that)g(in)o(terrupt)h(has)f(already)g(b)q(een)i(tak)o(en,)e(or)f(=
0)h=0A=
(on)h(success.)221 369 y FE(irqaction\(\))23 b =
FH(w)o(orks)g(rather)h(lik)o=0A=
(e)i(the)f(user-lev)o(el)h FE(sigaction\(\))p FH(,)f(and)g(in)g(fact)f=0A=
(reuses)h(the)150 434 y FE(sigaction)15 b FH(structure.)24=0A=
b(The)17 b FE(sa)p 744 434 V 17 w(restorer\(\))f FH(\014eld)i(of)e(the)h=0A=
(sigaction)g(structure)f(is)h(not)g(used,)g(but)150 498 y(ev)o(erything)i=0A=
(else)h(is)g(the)e(same.)31 b(See)20 b(the)f(en)o(try)f(for)g=0A=
FE(irqaction\(\))g FH(in)h(Section)h(1.6,)f FD(Supp)q(orting)150=0A=
562 y(F)l(unctions)p FH(,)c(for)g(further)g(information)g(ab)q(out)g=0A=
FE(irqaction\(\))p FH(.)150 716 y Fq(1.4.3)55 b(TTY)19 b(driv)n(ers)150=0A=
833 y FD([The)14 =
b(reasons)f(that)h(this)f(section)g(has)g(not)h(b)q(een)f=0A=
(written)h(are)g(that)f(I)g(don't)h(kno)o(w)e(enough)150 897=0A=
y(ab)q(out)25 b(TTY)g(stu\013)f(y)o(et.)41 b(T)l(ed)24 =
b(re-wrote)h(the)f(tt)=0A=
o(y)f(devices)g(for)h(the)g(1.1)h(series,)g(but)f(I)150 962=0A=
y(ha)o(v)o(en't)17 b(studied)h(them)g(y)o(et.])150 1139 y Ft(1.5)70=0A=
b(Blo)r(c)n(k)22 b(Device)e(Driv)n(ers)150 1272 y FH(T)l(o)12=0A=
b(moun)o(t)g(a)g(\014lesystem)h(on)g(a)f(device,)i(it)e(m)o(ust)g(b)q(e)h=
(a)f=0A=
(blo)q(c)o(k)h(device)h(driv)o(en)g(b)o(y)e(a)g(blo)q(c)o(k)h(device)h(dr=
iv)o=0A=
(er.)150 1336 =
y(This)h(means)g(that)f(the)h(device)i(m)o(ust)d(b)q(e)i(a)e=0A=
(random)h(access)g(device,)h(not)e(a)h(stream)f(device.)21=0A=
b(In)15 b(other)150 1400 =
y(w)o(ords,)f(y)o(ou)h(m)o(ust)g(b)q(e)g(able)h(to)f=0A=
(seek)g(to)g(an)o(y)g(lo)q(cation)h(on)f(the)g(ph)o(ysical)i(device)f(at)=
f=0A=
(an)o(y)g(time.)221 1488 y(Y)l(ou)20 b(do)h(not)f(pro)o(vide)h=0A=
FE(read\(\))f FH(and)h FE(write\(\))e =
FH(routines)i(for)f(a)h(blo)q(c)o(k)g=0A=
(device.)38 b(Instead,)21 b(y)o(our)150 1553 y(driv)o(er)13=0A=
b(uses)g FE(block)p 496 1553 V 17 w(read\(\))f FH(and)h FE(block)p=0A=
875 1553 V 16 w(write\(\))p =
FH(,)f(whic)o(h)i(are)f(generic)h(functions,)f=0A=
(pro)o(vided)h(b)o(y)f(the)150 1617 =
y(VFS,)g(whic)o(h)h(will)h(call)f(the)f=0A=
FD(strategy)h FH(routine,)g(or)f FE(request\(\))f =
FH(function,)i(whic)o(h)g=0A=
(y)o(ou)f(write)g(in)h(place)150 1681 y(of)i FE(read\(\))f=0A=
FH(and)i FE(write\(\))e FH(for)h(y)o(our)g(driv)o(er.)23 b(This)17=0A=
b(strategy)e(routine)i(is)g(also)f(called)i(b)o(y)f(the)f FD(bu\013er)150=0A=
1746 y(cac)o(he)g =
FH(\(See)f(section)h(??\),)f(whic)o(h)h(is)g(called)h(b)o=0A=
(y)e(the)g(VFS)h(routines)f(\(See)h(c)o(hapter)f(??\))21 b(whic)o(h)16=0A=
b(is)f(ho)o(w)150 1810 y(normal)g(\014les)h(on)f(normal)h(\014lesystems)f=0A=
(are)g(read)g(and)h(written.)221 1898 =
y(Requests)d(for)g(I/O)g(are)g(giv)o=0A=
(en)h(b)o(y)f(the)g(bu\013er)h(cac)o(he)g(to)e(a)h(routine)g(called)i=0A=
FE(ll)p 1563 1898 V 17 w(rw)p 1628 1898 V 17 w(block\(\))p=0A=
FH(,)d(whic)o(h)150 1962 =
y(constructs)f(lists)i(of)e(requests)g(ordered)h(b)o=0A=
(y)g(an)f FD(elev)m(ator)k(algorithm,)g =
FH(whic)o(h)e(sorts)d(the)i(lists)g=0A=
(to)f(mak)o(e)150 2027 =
y(accesses)k(faster)f(and)h(more)g(e\016cien)o(t.)20=0A=
b(It,)15 b(in)h(turn,)e(calls)i(y)o(our)f FE(request\(\))e=0A=
FH(function)j(to)e(actually)i(do)150 2091 y(the)f(I/O.)221=0A=
2179 y(Note)k(that)g(although)h(SCSI)h(disks)f(and)g(CDR)o(OMs)f(are)h=0A=
(considered)h(blo)q(c)o(k)g(devices,)g(they)f(are)150 2243=0A=
y(handled)c(sp)q(ecially)g(\(as)d(are)h(all)h(SCSI)g(devices\).)20=0A=
b(Refer)15 =
b(to)e(section)i(1.7,)e(W)l(riting)h(a)g(SCSI)h(Driv)o(er,)f(for)=0A=
150 2307 y(details.)291 2291 y Fm(5)p 150 2338 720 2 v 207=0A=
2366 a FA(5)225 2381 y =
Fl(Al)r(t)q(h)s(o)r(u)s(g)r(h)h(SC)s(S)s(I)f(di)q(d)s=0A=
(s)r(k)r(s)g(an)s(d)h(CD)s(R)s(O)s(M)t(s)f(ar)q(e)g(bl)r(o)t(ck)h(de)r(v)=
s(i)=0A=
q(c)r(e)r(s)r(,)f(SC)s(S)s(I)f(ta)q(p)t(e)r(s)r(,)h(li)q(k)r(e)g(ot)q(h)r=
(e)r=0A=
(r)h(ta)q(p)s(e)r(s)r(,)f(ar)q(e)h(ge)q(n)s(e)r(r)r(a)r(l)r(l)r(y)150=0A=
2433 =
y(us)r(e)r(d)k(as)f(c)o(h)r(a)r(r)r(a)r(c)r(t)q(e)r(r)h(de)r(v)r(i)r(c)r=0A=
(e)r(s)r(.)p eop=0A=
%%Page: 25 36=0A=
25 35 bop 150 -84 1800 3 v 150 -100 a FD(1.5.)42 b(Blo)q(c)o(k)18=0A=
b(Device)g(Driv)o(ers)1148 b FH(25)150 88 y Fq(1.5.1)55 =
b(Initialization)150=0A=
206 y FH(Initialization)24 b(of)c(blo)q(c)o(k)i(devices)g(is)g(a)f(bit)g=0A=
(more)g(complex)h(than)f(initialization)j(of)c(c)o(haracter)g(de-)150=0A=
270 =
y(vices,)f(esp)q(ecially)i(as)d(some)g(\\initialization")i(has)e(to)g(b)q=0A=
(e)h(done)f(at)g(compile)h(time.)29 b(There)19 b(is)f(also)g(a)150=0A=
334 y FE(register)p 345 334 15 2 v 16 w(blkdev\(\))13 b FH(call)i(that)f=0A=
(corresp)q(onds)g(to)f(the)h(c)o(haracter)g(device)h FE(register)p=0A=
1651 334 V 16 w(chrdev\(\))e FH(call,)150 399 =
y(whic)o(h)j(the)f(driv)o(er)h=0A=
(m)o(ust)f(call)h(to)e(sa)o(y)h(that)f(it)i(is)g(presen)o(t,)e(w)o(orking=
,)h=0A=
(and)g(activ)o(e.)150 550 y FD(1.5.1.1)54 b(The)18 b(\014le)g(blk.h)150=0A=
667 y =
FH(A)o(t)e(the)g(top)f(of)h(y)o(our)f(driv)o(er)i(co)q(de,)f(after)g=0A=
(all)h(other)e(included)k(header)d(\014les,)h(y)o(ou)f(need)h(to)e(write)=
h(t)=0A=
o(w)o(o)150 732 y(lines)h(of)e(co)q(de:)264 857 y Fs(#define)20=0A=
b(MAJOR)p 551 857 14 2 v 15 w(NR)h Fg(DEVICE)p 795 857 V 16=0A=
w Fs(MAJOR)264 921 y(#include)f("blk.h")150 1046 y FH(where)g=0A=
Fw(DEVICE)p 469 1046 15 2 v 17 w FE(MAJOR)e =
FH(is)i(the)f(ma)s(jor)f(n)o(um)o=0A=
(b)q(er)i(of)e(y)o(our)h(device.)34 b(driv)o(ers/blo)q(c)o(k/blk.h)20=0A=
b(requires)150 1111 y(the)15 b(use)h(of)f(the)g FE(MAJOR)p=0A=
560 1111 V 16 w(NR)g FH(de\014ne)i(to)d(set)h(up)h(man)o(y)e(other)h=0A=
(de\014nes)i(and)e(macros)f(for)h(y)o(our)g(driv)o(er.)221=0A=
1199 y(No)o(w)f(y)o(ou)h(need)h(to)f(edit)h(blk.h.)21 b(Under)16=0A=
b FE(#ifdef)23 b(MAJOR)p 1224 1199 V 17 w(NR)p FH(,)14 b(there)i(is)f(a)g=0A=
(section)h(of)f(de\014nes)i(that)150 1263 =
y(are)h(conditionally)j(included)h=0A=
(for)c(certain)h(ma)s(jor)e(n)o(um)o(b)q(ers,)j(protected)e(b)o(y)h=0A=
FE(#elif)k(\(MAJOR)p 1817 1263 V 17 w(NR)g(=3D=3D)150 1327 y Fw(DEVICE)p=0A=
333 1327 V 17 w FE(MAJOR\))p FH(.)16 =
b(A)o(t)g(the)h(end)h(of)e(this)i(list,)=0A=
g(y)o(ou)e(will)j(add)e(another)g(section)g(for)f(y)o(our)h(driv)o(er.)25=0A=
b(In)150 1392 y(that)14 b(section,)i(the)f(follo)o(wing)h(lines)h(are)e=0A=
(required:)264 1517 y Fs(#define)20 b(DEVICE)p 573 1517 14=0A=
2 v 14 w(NAME)h(")p Fg(device)p Fs(")264 1581 y(#define)f(DEVICE)p=0A=
573 1581 V 14 w(REQUEST)h(do)p 806 1581 V 15 w Fg(dev)p 884=0A=
1581 V 16 w Fs(request)264 1646 y(#define)f(DEVICE)p 573 1646=0A=
V 14 w(ON\(device\))g(/*)i Fg(usually)13 b(blank,)f(see)j(b)q(elo)o(w)22=0A=
b Fs(*/)264 1710 y(#define)e(DEVICE)p 573 1710 V 14 =
w(OFF\(device\))g(/*)h=0A=
Fg(usually)13 b(blank,)g(see)i(b)q(elo)o(w)22 b Fs(*/)264 1774=0A=
y(#define)e(DEVICE)p 573 1774 V 14 =
w(NR\(device\))g(\(MINOR\(device\)\))221=0A=
1900 y FE(DEVICE)p 368 1900 15 2 v 16 w(NAME)15 b FH(is)g(simply)i(the)e=0A=
(device)i(name.)i(See)d(the)g(other)e(en)o(tries)i(in)g(blk.h)g(for)e=0A=
(examples.)221 1987 y FE(DEVICE)p 368 1987 V 16 w(REQUEST)h=0A=
FH(is)i(y)o(our)f(strategy)f(routine,)i(whic)o(h)g(will)h(do)f(all)g(the)=
g=0A=
(I/O)g(on)f(the)g(device.)25 b(See)150 2052 y(section)16 b(1.5.3)d(for)i=0A=
(more)g(details)h(on)f(the)g(strategy)f(routine.)221 2140 y=0A=
FE(DEVICE)p 368 2140 V 16 w(ON)c FH(and)g FE(DEVICE)p 669 2140=0A=
V 17 w(OFF)g =
FH(are)g(for)f(devices)j(that)d(need)j(to)d(b)q(e)i(turned)g(on)=0A=
f(and)h(o\013,)g(lik)o(e)g(\015oppies.)150 2204 y(In)16 b(fact,)e(the)h=0A=
(\015opp)o(y)h(driv)o(er)f(is)h(curren)o(tly)g(the)f(only)h(device)g(driv=
)o=0A=
(er)g(whic)o(h)g(uses)f(these)h(de\014nes.)221 2292 y FE(DEVICE)p=0A=
368 2292 V 16 w(NR\(device\))h =
FH(is)i(used)h(to)e(determine)h(the)g(n)o(um)o=0A=
(b)q(er)g(of)f(the)h(ph)o(ysical)h(device)g(from)e(the)150=0A=
2356 y(minor)e(device)i(n)o(um)o(b)q(er.)k(F)l(or)16 =
b(instance,)h(in)f(the)g=0A=
FE(hd)g =
FH(driv)o(er,)g(since)i(the)e(second)g(hard)g(driv)o(e)h(starts)e(at)=0A=
150 2421 y(minor)g(64,)g FE(DEVICE)p 502 2421 V 16 w(NR\(device\))f=0A=
FH(is)i(de\014ned)g(to)f(b)q(e)h FE(\(MINOR\(device\)>>6\))p=0A=
FH(.)221 2508 =
y(If)f(y)o(our)g(driv)o(er)g(is)h(in)o(terrupt-driv)o(en,)g(y)o=0A=
(ou)f(will)i(also)e(set)p eop=0A=
%%Page: 26 37=0A=
26 36 bop 150 -84 1800 3 v 150 -100 a FD(1.5.)42 b(Blo)q(c)o(k)18=0A=
b(Device)g(Driv)o(ers)1148 b FH(26)264 88 y Fs(#define)20 b(DEVICE)p=0A=
573 88 14 2 v 14 w(INTR)h(do)p 740 88 V 16 w Fg(dev)150 214=0A=
y FH(whic)o(h)f(will)i(b)q(ecome)e(a)f(v)m(ariable)i(automatically)f=0A=
(de\014ned)h(and)f(used)g(b)o(y)g(the)f(remainder)h(of)g(blk.h,)150=0A=
278 y(sp)q(eci\014cally)e(b)o(y)d(the)g FE(SET)p 596 278 15=0A=
2 v 17 w(INTR\(\))g FH(and)g FE(CLEAR)p 980 278 V 16 w(INTR)g=0A=
FH(macros.)221 366 =
y(Y)l(ou)g(migh)o(t)g(also)g(consider)h(setting)g(these)f=0A=
(de\014nes:)264 491 y Fs(#define)20 b(DEVICE)p 573 491 14 2=0A=
v 14 w(TIMEOUT)h Fg(DEV)p 853 491 V 16 w Fs(TIMER)264 555 y(#define)f=0A=
(TIMEOUT)p 595 555 V 14 w(VALUE)h Fg(n)150 681 y FH(where)15=0A=
b Fw(n)g =
FH(is)h(the)f(n)o(um)o(b)q(er)g(of)g(ji\016es)h(\(clo)q(c)o(k)f(tic)=0A=
o(ks;)g(h)o(undredths)h(of)e(a)h(second)g(on)g(Lin)o(ux/386\))g(to)g(time=
)150=0A=
745 y(out)h(after)g(if)i(no)e(in)o(terrupt)i(is)f(receiv)o(ed.)26=0A=
b(These)17 =
b(are)f(used)i(if)f(y)o(our)f(device)j(can)d(b)q(ecome)i(\\stuc)o=0A=
(k":)k(a)150 809 y(condition)17 b(where)f(the)g(driv)o(er)g(w)o(aits)g=0A=
(inde\014nitely)j(for)c(an)h(in)o(terrupt)g(that)f(will)i(nev)o(er)f(arri=
v)o=0A=
(e.)22 b(If)16 b(y)o(ou)150 874 y(de\014ne)f(these,)g(they)f(will)i=0A=
(automatically)e(b)q(e)h(used)g(in)g FE(SET)p 1171 874 15 2=0A=
v 17 w(INTR)f =
FH(to)f(mak)o(e)h(y)o(our)f(driv)o(er)i(time)g(out.)k(Of)150=0A=
938 =
y(course,)f(y)o(our)f(driv)o(er)h(will)h(ha)o(v)o(e)f(to)f(b)q(e)h(able)g=0A=
(to)f(handle)i(the)f(p)q(ossibilit)o(y)i(of)d(b)q(eing)i(timed)f(out)g(b)=
o(y)=0A=
f(a)150 1002 y(timer.)j(See)c(section)g(??)21 b(for)14 =
b(an)h(explanation)i=0A=
(of)d(ho)o(w)h(to)g(do)g(this.)150 1154 y FD(1.5.1.2)54 b(Recognizing)20=0A=
b(PC)d(standard)i(partitions)150 1271 =
y([Insp)q(ect)j(the)g(routines)h(in)f=0A=
(genhd.c)g(and)g(include)h(detailed,)h(correct)f(instructions)h(on)150=0A=
1335 y(ho)o(w)g(to)i(use)e(them)h(to)g(allo)o(w)h(y)o(our)f(device)g(to)g=0A=
(use)f(the)i(standard)g(dos)e(partitioni)q(ng)150 1400 y(sc)o(heme.])150=0A=
1553 y Fq(1.5.2)55 b(The)19 b(Bu\013er)e(Cac)n(he)150 1670=0A=
y FD([Here,)28 b(it)d(should)g(b)q(e)g(explained)g(brie\015y)g(ho)o(w)f=0A=
FE(ll)p 1205 1670 V 17 w(rw)p 1270 1670 V 17 w(block\(\))f=0A=
FD(is)i(called,)j(ab)q(out)e(get-)150 1735 =
y(blk\(\))d(and)g(bread\(\))h(and)=0A=
f(breada\(\))h(and)f(b)o(write\(\),)i(etc.)39 b(A)23 =
b(real)h(explanation)g=0A=
(of)f(the)150 1799 y(bu\013er)18 =
b(cac)o(he)f(is)g(reserv)o(ed)f(for)i(the)f=0A=
(VFS)g(reference)h(section,)g(where)f(something)g(on)g(the)150=0A=
1863 y(complexit)o(y)g(order)i(of)f(Bac)o(h's)g(treatmen)o(t)g(of)g(the)f=0A=
(bu\013er)i(cac)o(he)f(should)f(exist.)221 1951 =
y(F)l(or)k(no)o(w,)h(w)o(e)f=0A=
(assume)f(that)i(the)g(reader)g(understands)g(the)g(concepts)f(b)q(ehind)=
i=0A=
(the)150 2016 y(bu\013er)d(cac)o(he.)27 b(If)18 =
b(y)o(ou)g(are)i(a)e(reader)i=0A=
(and)f(don't,)i(please)e(email)g(me)f(and)h(I'll)h(help)f(y)o(ou,)150=0A=
2080 y(whic)o(h)f(will)g(also)g(help)g(me)f(put)h(m)o(y)e(though)o(ts)i=0A=
(together)h(for)f(that)g(section.])150 2233 y Fq(1.5.3)55 b(The)19=0A=
b(Strategy)e(Routine)150 2350 y =
FH(All)d(reading)f(and)f(writing)h(of)f(blo)q=0A=
(c)o(ks)h(is)g(done)g(through)f(the)g FD(strategy)j(routine)p=0A=
FH(.)21 b(This)13 b(routine)g(tak)o(es)150 2415 y(no)19 =
b(argumen)o(ts)f(and)=0A=
h(returns)g(nothing,)h(but)f(it)g(kno)o(ws)g(where)g(to)f(\014nd)i(a)f(li=
st)h=0A=
(of)e(requests)h(for)g(I/O)150 2479 y(\()p FE(CURRENT)p FH(,)12=0A=
b(de\014ned)j(b)o(y)e(default)i(as)e FE(blk)p 858 2479 V 17=0A=
w(dev[MAJOR)p 1091 2479 V 16 w(NR].current)p 1371 2479 V 15=0A=
w(request)p FH(\),)g(and)g(kno)o(ws)g(ho)o(w)h(to)150 2544=0A=
y(get)e(data)g(from)g(the)h(device)h(in)o(to)f(the)g(blo)q(c)o(ks.)19=0A=
b(It)13 b(is)g(called)i(with)e(in)o(terrupts)g FD(disabled)g=0A=
FH(so)g(as)f(to)g(a)o(v)o(oid)p eop=0A=
%%Page: 27 38=0A=
27 37 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)36 b(Supp)q(orting)20=0A=
b(F)l(unctions)1146 b FH(27)150 88 y(race)20 =
b(conditions,)h(and)f(is)g(resp)=0A=
q(onsible)i(for)d(turning)h(on)g(in)o(terrupts)g(with)g(a)f(call)i(to)e=0A=
FE(sti\(\))g FH(b)q(efore)150 153 y(returning.)221 241 y(The)12=0A=
b(strategy)f(routine)h(\014rst)g(calls)h(the)f FE(INIT)p 1000=0A=
241 15 2 v 17 w(REQUEST)f FH(macro,)h(whic)o(h)h(mak)o(es)e(sure)i(that)e=0A=
(requests)150 305 =
y(are)i(really)h(on)f(the)g(request)g(list)g(and)h(do)q(es)=0A=
f(some)g(other)f(sanit)o(y)h(c)o(hec)o(king.)20 b FE(add)p=0A=
1535 305 V 17 w(request\(\))12 b FH(will)i(ha)o(v)o(e)150 369=0A=
y(already)j(sorted)f(the)g(requests)g(in)h(the)g(prop)q(er)f(order)h=0A=
(according)f(to)g(the)g(elev)m(ator)h(algorithm)g(\(using)150=0A=
434 =
y(an)h(insertion)h(sort,)e(as)h(it)g(is)h(called)g(once)g(for)e(ev)o(ery)=0A=
h(request\),)g(so)g(the)g(strategy)e(routine)j(\\merely")150=0A=
498 y(has)14 b(to)f(satisfy)g(the)h(request,)f(call)i FE(end)p=0A=
827 498 V 17 w(request\(1\))p FH(,)d(whic)o(h)j(will)g(tak)o(e)e(the)h=0A=
(request)g(o\013)g(the)f(list,)i(and)150 562 y(then)j(if)h(there)f(is)g=0A=
(still)i(another)d(request)h(on)g(the)g(list,)h(satisfy)f(it)g(and)g(call=
)h=0A=
FE(end)p 1574 562 V 17 w(request\(1\))p FH(,)e(un)o(til)150=0A=
627 =
y(there)e(are)g(no)g(more)g(requests)g(on)g(the)h(list,)f(at)g(whic)o(h)h=0A=
(time)f(it)h(returns.)221 715 y(If)d(the)g(driv)o(er)g(is)g(in)o=0A=
(terrupt-driv)o(en,)i(the)e(strategy)e(routine)j(need)f(only)h(sc)o(hedul=
e)g=0A=
(the)f(\014rst)g(request)150 779 y(to)20 b(o)q(ccur,)i(and)e(ha)o(v)o(e)h=0A=
(the)f(in)o(terrupt-handler)i(call)g FE(end)p 1167 779 V 17=0A=
w(request\(1\))d FH(and)h(the)h(call)h(the)e(strategy)150 843=0A=
y(routine)e(again,)f(in)h(order)f(to)g(sc)o(hedule)i(the)e(next)g(request=
.)26=0A=
b(If)18 b(the)f(driv)o(er)h(is)f(not)g(in)o(terrupt-driv)o(en,)150=0A=
908 y(the)e(strategy)f(routine)i(ma)o(y)e(not)h(return)g(un)o(til)i(all)f=0A=
(I/O)f(is)h(complete.)221 996 =
y(If)f(for)g(some)f(reason)h(I/O)h(fails)g(p)q=0A=
(ermanen)o(tly)g(on)f(the)g(curren)o(t)g(request,)g FE(end)p=0A=
1585 996 V 17 w(request\(0\))f FH(m)o(ust)150 1060 =
y(b)q(e)i(called)h(to)d=0A=
(destro)o(y)h(the)g(request.)221 1148 =
y(A)g(request)g(ma)o(y)f(b)q(e)i(for)f=0A=
(a)g(read)g(or)g(write.)k(The)d(driv)o(er)f(determines)i(whether)e(a)g=0A=
(request)g(is)h(for)e(a)150 1212 =
y(read)h(or)g(write)g(b)o(y)h(examining)g=0A=
FE(CURRENT->cmd)p FH(.)j(If)c FE(CURRENT->cmd)22 b(=3D=3D)i(READ)p=0A=
FH(,)14 b(the)i(request)f(is)h(for)e(a)150 1276 y(read,)h(and)g(if)g=0A=
FE(CURRENT->cmd)23 b(=3D=3D)g(WRITE)p FH(,)14 =
b(the)h(request)g(is)h(for)e(a)h=0A=
(write.)20 b(If)15 b(the)g(device)i(has)e(sep)q(erate)150 1341=0A=
y(in)o(terrupt)e(routines)g(for)g(handling)h(reads)f(and)g(writes,)g=0A=
FE(SET)p 1188 1341 V 16 w(INTR\()p Fw(n)p FE(\))g FH(m)o(ust)f(b)q(e)h=0A=
(called)i(to)d(assure)h(that)150 1405 y(the)i(prop)q(er)h(in)o(terrupt)f=0A=
(routine)h(will)h(b)q(e)f(called.)221 1493 y FD([Here)23 =
b(I)f(need)g(to)h=0A=
(include)h(samples)e(of)g(b)q(oth)i(a)f(p)q(olled)h(strategy)f(routine)h(=
and)=0A=
f(an)150 1557 y(in)o(terrupt-driv)o(en)h(one.)38 b(The)22 b(in)o=0A=
(terrupt-driv)o(en)i(one)e(should)h(pro)o(vide)f(sep)q(erate)h(read)150=0A=
1622 y(and)18 =
b(write)g(in)o(terrupt)i(routines)e(to)g(sho)o(w)f(the)g(use)h=0A=
(of)f FE(SET)p 1324 1622 V 17 w(INTR)p FD(.])150 1775 y Fq(1.5.4)55=0A=
b(Example)16 b(Driv)n(ers)150 1892 y FD([I'm)i(not)g(sure)f(this)h(b)q=0A=
(elongs)h(here)f(|)f(w)o(e'll)h(see.)24 b(I'll)19 =
b(lea)o(v)o(e)d(the)i(stub)=0A=
g(here)g(for)g(no)o(w.])150 2069 y Ft(1.6)70 b(Supp)r(orting)23=0A=
b(F)-6 b(unctions)150 2202 y FH(Here)20 =
b(is)g(a)f(list)i(of)e(man)o(y)g(of)g=0A=
(the)h(most)f(common)g(supp)q(orting)h(functions)h(a)o(v)m(ailable)g(to)e=0A=
(the)h(device)150 2267 y(driv)o(er)15 b(writer.)20 =
b(If)c(y)o(ou)e(\014nd)i=0A=
(other)f(supp)q(orting)h(functions)g(that)e(are)h(useful,)h(please)g(p)q(=
oin)=0A=
o(t)f(them)g(out)150 2331 =
y(to)g(me.)k(I)d(kno)o(w)f(this)g(is)h(not)f(a)g=0A=
(complete)h(list,)f(but)h(I)f(hop)q(e)h(it)g(is)f(a)g(helpful)i(one.)150=0A=
2525 y FE(add)p 225 2525 V 17 w(request\(\))p eop=0A=
%%Page: 28 39=0A=
28 38 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(28)450 88 y FE(static)23 b(void)g=0A=
(add_request\(struct)f(blk_dev_struct)g(*dev,)1023 153 =
y(struct)h(request)g=0A=
(*)g(req\))450 237 y FH(This)14 b(is)f(a)g(static)f(function)i(in)g(ll)p=0A=
1006 237 14 2 v 18 w(rw)p 1075 237 V 16 =
w(blo)q(c)o(k.c,)f(and)g(cannot)g(b)q=0A=
(e)h(called)g(b)o(y)f(other)g(co)q(de.)450 301 y(Ho)o(w)o(ev)o(er,)i(an)h=0A=
(understanding)h(of)f(this)g(function,)h(as)f(w)o(ell)h(as)e(an)h=0A=
(understanding)h(of)450 365 y FE(ll)p 501 365 15 2 v 17 w(rw)p=0A=
566 365 V 17 w(block\(\))p =
FH(,)d(ma)o(y)g(help)j(y)o(ou)d(understand)i(the)g=0A=
(strategy)d(routine.)450 449 y(If)21 =
b(the)f(device)i(that)d(the)i(request)f=0A=
(is)h(for)f(has)g(an)g(empt)o(y)g(request)g(queue,)i(the)f(re-)450=0A=
514 y(quest)15 b(is)g(put)h(on)e(the)h(queue)h(and)f(the)g(strategy)f=0A=
(routine)i(is)f(called.)21 b(Otherwise,)16 b(the)450 578 =
y(prop)q(er)e(place)=0A=
h(in)g(the)f(queue)h(is)g(c)o(hosen)f(and)h(the)f(request)g(is)g(inserted=
)h=0A=
(in)g(the)f(queue,)450 642 y(main)o(taining)i(prop)q(er)g(order)f(b)o(y)g=0A=
(insertion)h(sort.)450 726 y(Prop)q(er)f(order)g(\(the)g(elev)m(ator)h=0A=
(algorithm\))e(is)i(de\014ned)h(as:)450 829 y FD(a.)31 b FH(Reads)16=0A=
b(come)f(b)q(efore)g(writes.)450 910 y FD(b.)31 b FH(Lo)o(w)o(er)14=0A=
b(minor)i(n)o(um)o(b)q(ers)f(come)g(b)q(efore)h(higher)g(minor)f(n)o(um)o=
(b)q=0A=
(ers.)450 991 y FD(c.)31 b FH(Lo)o(w)o(er)14 b(blo)q(c)o(k)i(n)o(um)o(b)q=0A=
(ers)g(come)f(b)q(efore)g(higher)h(blo)q(c)o(k)g(n)o(um)o(b)q(ers.)450=0A=
1093 =
y(The)h(elev)m(ator)g(algorithm)g(is)g(implemen)o(ted)i(b)o(y)d(the)h=0A=
(macro)f FE(IN)p 1577 1093 V 17 w(ORDER\(\))p FH(,)g(whic)o(h)h(is)450=0A=
1158 y(de\014ned)g(in)f(driv)o(ers/blo)q(c)o(k/blk.h)450 1242=0A=
y FD(De\014ned)i(in:)j FH(driv)o(ers/blo)q(c)o(k/ll)p 1032=0A=
1242 14 2 v 18 w(rw)p 1101 1242 V 16 w(blo)q(c)o(k.c)450 1306=0A=
y FD(See)c(also:)22 b FE(make)p 765 1306 15 2 v 16 w(request\(\))p=0A=
FH(,)14 b FE(ll)p 1072 1306 V 17 w(rw)p 1137 1306 V 17 w(block\(\))p=0A=
FH(.)150 1410 y FE(add)p 225 1410 V 17 w(timer\(\))43 b(void)23=0A=
b(add)p 644 1410 V 17 w(timer\(struct)f(timer)p 1091 1410 V=0A=
17 w(list)h(*)h(timer\))450 1494 y(#include)f(<linux/timer.h>)450=0A=
1577 y FH(Installs)16 b(the)g(timer)f(structures)g(in)h(the)f(list)h=0A=
FE(timer)f FH(in)h(the)f(timer)g(list.)450 1661 y(The)g FE(timer)p=0A=
666 1661 V 17 w(list)g FH(structure)f(is)i(de\014ned)h(b)o(y:)550=0A=
1756 y Fs(struct)k(timer_list)e({)724 1813 =
y(struct)i(timer_list)f(*next;)724=0A=
1870 y(struct)h(timer_list)f(*prev;)724 1927 =
y(unsigned)g(long)h(expires;)724=0A=
1984 y(unsigned)f(long)h(data;)724 2040 =
y(void)g(\(*function\)\(unsigne)o(d)e=0A=
(long\);)550 2097 y(};)450 2200 y FH(In)e(order)e(to)h(call)h=0A=
FE(add)p 843 2200 V 17 w(timer\(\))p =
FH(,)d(y)o(ou)i(need)h(to)e(allo)q(cate)=0A=
i(a)f FE(timer)p 1633 2200 V 16 w(list)g FH(structure,)450=0A=
2264 y(and)d(then)g(call)h FE(init)p 817 2264 V 17 w(timer\(\))p=0A=
FH(,)e(passing)h(it)g(a)g(p)q(oin)o(ter)g(to)f(y)o(our)g FE(timer)p=0A=
1691 2264 V 17 w(list)p FH(.)18 b(It)13 b(will)450 2328 y(n)o(ullify)21=0A=
b(the)f FE(next)e FH(and)i FE(prev)f =
FH(elemen)o(ts,)h(whic)o(h)g(is)g(the)g=0A=
(correct)f(initialization.)35 b(If)450 2393 y(necessary)l(,)18=0A=
b(y)o(ou)g(can)f(allo)q(cate)i(m)o(ultiple)g FE(timer)p 1311=0A=
2393 V 17 w(list)e FH(structures,)g(and)h(link)h(them)450 2457=0A=
y(in)o(to)14 b(a)f(list.)21 b(Do)13 =
b(mak)o(e)g(sure)h(that)g(y)o(ou)f(prop)q=0A=
(erly)i(initialize)i(all)e(the)f(un)o(used)h(p)q(oin)o(ters)450=0A=
2522 y(to)g FE(NULL)p =
FH(,)f(or)g(the)i(timer)f(co)q(de)h(ma)o(y)e(get)h(v)o=0A=
(ery)g(confused.)p eop=0A=
%%Page: 29 40=0A=
29 39 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(29)450 88 y(F)l(or)15 =
b(eac)o(h)g(struct)g(in)h(y)o=0A=
(our)e(list,)i(y)o(ou)f(set)g(three)g(v)m(ariables:)450 214=0A=
y FE(expires)132 b FH(The)17 =
b(n)o(um)o(b)q(er)g(of)f(ji\016es)h(\(100ths)e=0A=
(of)h(a)g(second)h(in)g(Lin)o(ux/86\))g(after)750 278 =
y(whic)o(h)f(to)f(time)=0A=
g(out.)450 382 y FE(function)108 b FH(Kernel-space)17 =
b(function)f(to)f(run)g=0A=
(after)g(timeout)g(has)g(o)q(ccured.)450 485 y FE(data)204=0A=
b FH(P)o(assed)10 b(as)g(the)g(argumen)o(t)g(to)f FE(function)g=0A=
FH(when)i FE(function)e FH(is)i(called.)450 611 y(Ha)o(ving)19=0A=
b(created)h(this)f(list,)i(y)o(ou)e(giv)o(e)g(a)g(p)q(oin)o(ter)h(to)e(th=
e)h=0A=
(\014rst)g(\(usually)h(the)g(only\))450 676 =
y(elemen)o(t)h(of)e(the)h(list)h=0A=
(as)e(the)h(argumen)o(t)f(to)h FE(add)p 1330 676 15 2 v 16=0A=
w(timer\(\))p FH(.)33 b(Ha)o(ving)21 b(passed)f(that)450 740=0A=
y(p)q(oin)o(ter,)f(k)o(eep)f(a)g(cop)o(y)f(of)h(the)g(p)q(oin)o(ter)g(han=
dy)l=0A=
(,)h(b)q(ecause)g(y)o(ou)f(will)h(need)g(to)e(use)i(it)450=0A=
804 =
y(to)e(mo)q(dify)i(the)f(elemen)o(ts)h(of)f(the)g(list)h(\(to)e(set)h(a)g=0A=
(new)g(timeout)g(when)h(y)o(ou)e(need)i(a)450 869 y(function)e(called)h=0A=
(again,)e(to)g(c)o(hange)g(the)g(function)h(to)f(b)q(e)h(called,)g(or)f(t=
o)g=0A=
(c)o(hange)g(the)450 933 =
y(data)f(that)f(is)i(passed)f(to)g(the)g(function\))=0A=
h(and)f(to)g(delete)h(the)f(timer,)g(if)h(necessary)l(.)450=0A=
1017 y FD(Note:)21 b FH(This)15 b(is)g FC(not)f =
FH(pro)q(cess-sp)q(eci\014c.)=0A=
22 b(Therefore,)14 b(if)h(y)o(ou)f(w)o(an)o(t)f(to)h(w)o(ak)o(e)f(a)i=0A=
(certain)450 1081 y(pro)q(cess)20 =
b(at)e(a)h(timeout,)h(y)o(ou)f(will)j(ha)o=0A=
(v)o(e)c(to)h(use)h(the)f(sleep)i(and)e(w)o(ak)o(e)g(primitiv)o(es.)450=0A=
1146 y(The)c(functions)h(that)e(y)o(ou)g(install)j(through)d(this)h(mec)o=0A=
(hanism)h(will)g(run)g(in)f(the)g(same)450 1210 =
y(con)o(text)g(that)f(in)o=0A=
(terrupt)i(handlers)g(run)f(in.)450 1294 y FD(De\014ned)j(in:)j=0A=
FH(k)o(ernel/sc)o(hed.c)450 1358 y FD(See)55 b(also:)87 b FE(timer)p=0A=
892 1358 V 17 w(table)47 b FH(in)i(include/li)q(n)o(ux/timer.h,)59=0A=
b FE(init)p 1757 1358 V 16 w(timer\(\))p FH(,)450 1423 y FE(del)p=0A=
525 1423 V 17 w(timer\(\))p FH(.)150 1526 y FE(cli\(\))180=0A=
b(#define)23 b(cli\(\))p 787 1526 V 804 1526 V 57 w(asm)p 893=0A=
1526 V 910 1526 V 951 1526 V 968 1526 V 93 w(volatile)p 1178=0A=
1526 V 1194 1526 V 57 w(\("cli"::\))450 1610 =
y(#include)g(<asm/system.h>)450=0A=
1694 y FH(Prev)o(en)o(ts)14 =
b(in)o(terrupts)i(from)e(b)q(eing)i(ac)o(kno)o=0A=
(wledged.)k FE(cli)15 b FH(stands)g(for)f(\\CLear)h(In)o(ter-)450=0A=
1758 y(rupt)g(enable".)450 1842 y FD(See)i(also:)22 b FE(sti\(\))150=0A=
1946 y(del)p 225 1946 V 17 w(timer)91 b(void)23 b(del)p 644=0A=
1946 V 17 w(timer\(struct)f(timer)p 1091 1946 V 17 =
w(list)h(*)h(timer\))450=0A=
2030 y(#include)f(<linux/timer.h>)450 2114 y FH(Deletes)16=0A=
b(the)f(timer)g(structures)g(in)h(the)g(list)g FE(timer)e FH(in)i(the)f=0A=
(timer)h(list.)450 2198 =
y(The)h(timer)f(list)h(that)f(y)o(ou)f(delete)j(m)o=0A=
(ust)e(b)q(e)g(the)h(address)f(of)g(a)g(timer)g(list)h(y)o(ou)f(ha)o(v)o(=
e)=0A=
450 2262 y(earlier)k(installed)g(with)g FE(add)p 961 2262 V=0A=
16 w(timer\(\))p FH(.)30 b(Once)20 b(y)o(ou)e(ha)o(v)o(e)h(called)h=0A=
FE(del)p 1710 2262 V 17 w(timer\(\))e FH(to)450 2326 =
y(delete)f(the)e(timer)h=0A=
(from)e(the)i(k)o(ernel)g(timer)g(list,)g(y)o(ou)f(ma)o(y)f(deallo)q(cate=
)j=0A=
(the)f(memory)450 2391 y(used)d(in)h(the)f FE(timer)p 801 2391=0A=
V 16 w(list)g =
FH(structures,)f(as)h(it)g(is)g(no)g(longer)g(referenced)h(b)o=0A=
(y)e(the)h(k)o(ernel)450 2455 y(timer)i(list.)p eop=0A=
%%Page: 30 41=0A=
30 40 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(30)450 88 y FD(De\014ned)18 b(in:)j=0A=
FH(k)o(ernel/sc)o(hed.c)450 153 y FD(See)55 b(also:)87 b FE(timer)p=0A=
892 153 15 2 v 17 w(table)47 b FH(in)i(include/li)q(n)o(ux/timer.h,)59=0A=
b FE(init)p 1757 153 V 16 w(timer\(\))p FH(,)450 217 y FE(add)p=0A=
525 217 V 17 w(timer\(\))p FH(.)150 321 y FE(end)p 225 321=0A=
V 17 w(request\(\))450 385 y(static)23 b(void)g(end)p 811 385=0A=
V 17 w(request\(int)f(uptodate\))450 533 y(#include)h("blk.h")450=0A=
617 y FH(Called)16 =
b(when)g(a)f(request)g(has)g(b)q(een)i(satis\014ed)e(or)g=0A=
(ab)q(orted.)20 b(T)l(ak)o(es)15 b(one)g(argumen)o(t:)450 730=0A=
y FE(uptodate)108 b FH(If)15 =
b(not)g(equal)h(to)f(0,)f(means)h(that)g(the)g=0A=
(request)g(has)g(b)q(een)i(satis\014ed.)750 795 y(If)e(equal)h(to)f(0,)f=0A=
(means)i(that)e(the)h(request)h(has)f(not)f(b)q(een)j(satis\014ed.)450=0A=
908 y(If)d(the)h(request)f(w)o(as)f(satis\014ed)i(\()p FE(uptodate)22=0A=
b(!=3D)i(0)p FH(\),)14 b FE(end)p 1437 908 V 16 w(request\(\))f=0A=
FH(main)o(tains)i(the)450 972 y(request)21 =
b(list,)h(unlo)q(c)o(ks)g(the)f=0A=
(bu\013er,)h(and)f(ma)o(y)f(arrange)g(for)g(the)h(sc)o(heduler)h(to)e(b)q=
(e)=0A=
450 1037 y(run)k(at)g(the)g(next)g(con)o(v)o(enien)o(t)g(time)h(\()p=0A=
FE(need)p 1268 1037 V 16 w(resched)e(=3D)h(1)p =
FH(;)k(this)c(is)h(implicit)h=0A=
(in)450 1101 y FE(wake)p 549 1101 V 17 w(up\(\))p FH(,)15 =
b(and)i(is)g(not)f=0A=
(explicitly)j(part)c(of)h FE(end)p 1331 1101 V 17 w(request\(\))p=0A=
FH(\),)f(b)q(efore)h(w)o(aking)g(up)450 1166 =
y(all)i(pro)q(cesses)g(sleeping)=0A=
h(on)f(the)f FE(wait)p 1133 1166 V 17 w(for)p 1222 1166 V 17=0A=
w(request)f FH(ev)o(en)o(t,)h(whic)o(h)i(is)f(slept)g(on)f(in)450=0A=
1230 y FE(make)p 549 1230 V 17 w(request\(\))p FH(,)c FE(ll)p=0A=
856 1230 V 17 w(rw)p 921 1230 V 17 w(page\(\))p FH(,)h(and)h=0A=
FE(ll)p 1245 1230 V 17 w(rw)p 1310 1230 V 17 w(swap)p 1423=0A=
1230 V 17 w(file\(\))p FH(.)450 1314 y FD(Note:)23 b FH(This)17=0A=
b(function)g(is)f(a)g(static)g(function,)h(de\014ned)g(in)g(driv)o(ers/bl=
o)q=0A=
(c)o(k/blk.h)h(for)450 1378 y(ev)o(ery)13 b(non-SCSI)h(device)h(that)d=0A=
(includes)j(blk.h.)20 b(\(SCSI)14 =
b(devices)g(do)f(this)g(di\013eren)o(tly;)=0A=
450 1443 y(the)20 =
b(high-lev)o(el)j(SCSI)d(co)q(de)h(itself)g(pro)o(vides)f=0A=
(this)h(functionalit)o(y)g(to)e(the)i(lo)o(w-lev)o(el)450 1507=0A=
y(device-sp)q(eci\014c)i(SCSI)d(device)g(driv)o(ers.\))32 b(It)19=0A=
b(includes)j(sev)o(eral)d(de\014nes)h(dep)q(enden)o(t)450 1571=0A=
y(on)15 =
b(static)g(device)h(information,)f(suc)o(h)g(as)g(the)g(device)i(n)o=0A=
(um)o(b)q(er.)j(This)15 b(is)h(marginally)450 1636 y(faster)e(than)h(a)g=0A=
(more)g(generic)h(normal)f(C)g(function.)450 1720 y FD(De\014ned)j(in:)j=0A=
FH(k)o(ernel/blk)p 926 1720 14 2 v 18 w(drv/blk.h)450 1784=0A=
y FD(See)c(also:)22 b FE(ll)p 717 1784 15 2 v 17 w(rw)p 782=0A=
1784 V 17 w(block\(\))p FH(,)13 b FE(add)p 1065 1784 V 17 w(request\(\))p=0A=
FH(,)h FE(make)p 1421 1784 V 16 w(request\(\))p FH(.)150 1887=0A=
y FE(free)p 249 1887 V 17 w(irq\(\))67 b(void)23 b(free)p 668=0A=
1887 V 17 w(irq\(unsigned)f(int)i(irq\))450 1971 y(#include)f=0A=
(<linux/sched.h>)450 2055 y FH(F)l(rees)13 =
b(an)g(irq)h(previously)h(aquired)=0A=
f(with)f FE(request)p 1343 2055 V 16 w(irq\(\))g FH(or)g =
FE(irqaction\(\))p=0A=
FH(.)k(T)l(ak)o(es)450 2120 y(one)e(argumen)o(t:)450 2233 y=0A=
FE(irq)228 b FH(in)o(terrupt)15 b(lev)o(el)i(to)e(free.)450=0A=
2346 y FD(De\014ned)j(in:)j FH(k)o(ernel/irq.c)450 2411 y =
FD(See)c(also:)22=0A=
b FE(request)p 837 2411 V 16 w(irq\(\))p FH(,)14 b FE(irqaction\(\))p=0A=
FH(.)p eop=0A=
%%Page: 31 42=0A=
31 41 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(31)150 88 y FE(get)p 225 88 15 2 v=0A=
17 w(user*\(\))43 b(inline)23 b(unsigned)g(char)g(get)p 1026=0A=
88 V 17 w(user)p 1139 88 V 17 w(byte\(const)f(char)h(*)h(addr\))450=0A=
153 y(inline)f(unsigned)g(short)g(get)p 1050 153 V 17 w(user)p=0A=
1163 153 V 16 w(word\(const)g(short)g(*)h(addr\))450 217 =
y(inline)f(unsigned)=0A=
g(long)g(get)p 1026 217 V 17 w(user)p 1139 217 V 17 w(long\(const)f(int)h=0A=
(*addr\))450 301 y(#include)g(<asm/segment.h>)450 385 y FH(Allo)o(ws)16=0A=
b(a)f(driv)o(er)g(to)g(access)g(data)g(in)h(user)f(space,)g(whic)o(h)h(is=
)g=0A=
(in)g(a)f(di\013eren)o(t)h(segmen)o(t)450 449 =
y(than)f(the)g(k)o(ernel.)450=0A=
533 y FD(Note:)20 b FH(these)12 b(functions)h(ma)o(y)f(cause)h(implicit)h=0A=
(I/O,)f(if)g(the)f(memory)g(b)q(eing)h(accessed)-1895 b Fr(3)450=0A=
598 y FH(has)17 b(b)q(een)h(sw)o(app)q(ed)f(out,)f(and)h(therefore)g=0A=
(pre-emption)g(ma)o(y)f(o)q(ccur)i(at)e(this)h(p)q(oin)o(t.)450=0A=
662 =
y(Do)g(not)h(include)i(these)e(functions)h(in)f(critical)i(sections)e(of)=0A=
g(y)o(our)f(co)q(de)h(ev)o(en)h(if)f(the)450 726 =
y(critical)h(sections)e(are)=0A=
g(protected)g(b)o(y)h FE(cli\(\))p FH(/)p FE(sti\(\))d FH(pairs,)j(b)q=0A=
(ecause)g(that)e(implicit)450 791 =
y(I/O)h(will)h(violate)f(the)f(in)o(tegrit)=0A=
o(y)h(of)f(y)o(our)g FE(cli\(\))p FH(/)p FE(sti\(\))f FH(pair.)24=0A=
b(If)16 b(y)o(ou)g(need)i(to)d(get)450 855 =
y(at)e(user-space)i(memory)l(,)e=0A=
(cop)o(y)h(it)g(to)f(k)o(ernel-space)i(memory)e FC(b)n(efor)n(e)g=0A=
FH(y)o(ou)h(en)o(ter)f(y)o(our)450 919 y(critical)k(section.)450=0A=
1003 y(These)f(functions)g(tak)o(e)e(one)h(argumen)o(t:)450=0A=
1117 y FE(addr)204 b FH(Address)16 b(to)e(get)h(data)f(from.)450=0A=
1242 y FD(Returns:)103 b FH(Data)14 b(at)h(that)f(o\013set)h(in)h(user)g=0A=
(space.)450 1368 y FD(De\014ned)i(in:)j FH(include/asm/segmen)o(t.h)450=0A=
1432 y FD(See)c(also:)22 b FE(memcpy)p 813 1432 V 16 w(*fs\(\))p=0A=
FH(,)14 b FE(put)p 1048 1432 V 17 w(user*\(\))p FH(,)g FE(cli\(\))p=0A=
FH(,)g FE(sti\(\))p FH(.)150 1536 y FE(inb\(\),)23 b(inb)p=0A=
392 1536 V 17 w(p\(\))450 1600 =
y(inline)g(unsigned)g(int)g(inb\(unsigned)f=0A=
(short)i(port\))450 1665 y(inline)f(unsigned)g(int)g(inb)p=0A=
1002 1665 V 17 w(p\(unsigned)g(short)g(port\))450 1749 y(#include)g=0A=
(<asm/io.h>)450 1833 y FH(Reads)13 b(a)g(b)o(yte)f(from)g(a)h(p)q(ort.)18=0A=
b FE(inb\(\))12 b FH(go)q(es)h(as)f(fast)g(as)g(it)h(can,)g(while)i=0A=
FE(inb)p 1723 1833 V 16 w(p\(\))e FH(pauses)450 1897 y(b)q(efore)k=0A=
(returning.)24 b(Some)16 =
b(devices)i(are)e(happier)i(if)f(y)o(ou)f(don't)g=0A=
(read)g(from)g(them)g(as)450 1961 y(fast)e(as)h(p)q(ossible.)22=0A=
b(Both)15 b(functions)h(tak)o(e)e(one)i(argumen)o(t:)450 2075=0A=
y FE(port)204 b FH(P)o(ort)14 b(to)h(read)g(b)o(yte)g(from.)450=0A=
2200 y FD(Returns:)103 b FH(The)12 =
b(b)o(yte)g(is)h(returned)f(in)h(the)f(lo)=0A=
o(w)g(b)o(yte)g(of)g(the)g(32-bit)g(in)o(teger,)h(and)750 2265=0A=
y(the)i(3)g(high)h(b)o(ytes)f(are)g(un)o(used,)h(and)f(ma)o(y)g(b)q(e)g=0A=
(garbage.)450 2390 y FD(De\014ned)j(in:)j FH(include/asm/io.h)450=0A=
2455 y FD(See)c(also:)22 b FE(outb\(\))p FH(,)14 b FE(outb)p=0A=
936 2455 V 16 w(p\(\))p FH(.)p eop=0A=
%%Page: 32 43=0A=
32 42 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(32)150 88 y FE(init)p 249 88 15 2=0A=
v 17 w(timer\(\))450 153 y FH(Inline)43 =
b(function)e(for)f(initializi)q(ng)k=0A=
FE(timer)p 1275 153 V 16 w(list)c FH(structures)h(for)f(use)h(with)450=0A=
217 y FE(add)p 525 217 V 17 w(timer\(\))p FH(.)450 301 y FD(De\014ned)18=0A=
b(in:)j FH(include/lin)o(ux/time)q(r.h)450 365 y FD(See)c(also:)22=0A=
b FE(add)p 741 365 V 17 w(timer\(\))p FH(.)150 469 y FE(irqaction\(\))36=0A=
b(int)23 =
b(irqaction\(unsigned)f(int)h(irq,)h(struct)f(sigaction)f(*new\))450=0A=
553 y(#include)h(<linux/sched.h>)450 637 y FH(Hardw)o(are)16=0A=
b(in)o(terrupts)h(are)g(really)h(a)f(lot)g(lik)o(e)h(signals.)26=0A=
b(Therefore,)17 b(it)g(mak)o(es)f(sense)450 701 =
y(to)i(b)q(e)h(able)h(to)e=0A=
(register)h(an)f(in)o(terrupt)h(lik)o(e)h(a)e(signal.)32 b(The)18=0A=
b FE(sa)p 1595 701 V 17 w(restorer\(\))g FH(\014eld)450 765=0A=
y(of)h(the)h FE(struct)j(sigaction)c =
FH(is)h(not)f(used,)i(but)f(otherwise)g=0A=
(it)g(is)h(the)e(same.)34 b(The)450 830 y(in)o(t)16 =
b(argumen)o(t)f(to)g(the)=0A=
h FE(sa.handler\(\))e =
FH(function)i(ma)o(y)f(mean)h(di\013eren)o(t)h(things,)=0A=
e(de-)450 894 =
y(p)q(ending)h(on)e(whether)g(or)g(not)g(the)g(IR)o(Q)h(is)g=0A=
(installed)h(with)f(the)f FE(SA)p 1624 894 V 17 w(INTERRUPT)f=0A=
FH(\015ag.)450 959 y(If)j(it)h(is)f(not)g(installed)i(with)e(the)h=0A=
FE(SA)p 1089 959 V 16 w(INTERRUPT)e =
FH(\015ag,)h(then)g(the)g(argumen)o(t)g=0A=
(passed)450 1023 y(to)f(the)h(handler)g(is)h(a)e(p)q(oin)o(ter)h(to)f(a)g=0A=
(register)h(structure,)f(and)h(if)g(it)g(is)g(installed)i(with)450=0A=
1087 y(the)c FE(SA)p 578 1087 V 17 w(INTERRUPT)e =
FH(\015ag,)h(then)i(the)e=0A=
(argumen)o(t)g(passed)h(is)g(the)g(n)o(um)o(b)q(er)g(of)g(the)f(IR)o(Q.)4=
50=0A=
1152 y(F)l(or)18 b(an)h(example)h(of)f(handler)h(set)f(to)f(use)i(the)f=0A=
FE(SA)p 1358 1152 V 17 w(INTERRUPT)e =
FH(\015ag,)j(lo)q(ok)f(at)f(ho)o(w)450=0A=
1216 y FE(rs)p 501 1216 V 17 w(interrupt\(\))c FH(is)h(installed)i(in)f=0A=
FB(:)8 b(:)g(:)e FH(/k)o(ernel/c)o(hr)p 1363 1216 14 2 v 17=0A=
w(drv/serial.c)450 1300 y(The)19 b FE(SA)p 598 1300 15 2 v=0A=
17 w(INTERRUPT)f =
FH(\015ag)g(is)i(used)f(to)g(determine)h(whether)f(or)f(not)=0A=
h(the)g(in)o(terrupt)450 1364 =
y(should)j(b)q(e)g(a)f(\\fast")f(in)o(terrupt.)=0A=
38 b(Normally)l(,)22 b(up)q(on)g(return)f(from)g(the)g(in)o(terrupt,)450=0A=
1429 y FE(need)p 549 1429 V 17 w(resched)p FH(,)14 =
b(a)i(global)g(\015ag,)f=0A=
(is)h(c)o(hec)o(k)o(ed.)22 b(If)16 b(it)g(is)g(set)g(\()p FG(6)p=0A=
FH(=3D)d(0\),)i(then)h FE(schedule\(\))450 1493 y =
FH(is)c(run,)g(whic)o(h)g(ma)=0A=
o(y)e(sc)o(hedule)j(another)e(pro)q(cess)g(to)g(run.)19 b(They)11=0A=
b(are)g(also)g(run)g(with)h(all)450 1557 =
y(other)j(in)o(terrupts)g(still)i=0A=
(enabled.)k(Ho)o(w)o(ev)o(er,)14 b(b)o(y)i(setting)f(the)g=0A=
FE(sigaction)f FH(structure)450 1622 y(mem)o(b)q(er)d FE(sa)p=0A=
671 1622 V 16 w(flags)f FH(to)g FE(SA)p 916 1622 V 17 w(INTERRUPT)p=0A=
FH(,)f(\\fast")g(in)o(terrupts)h(are)g(c)o(hosen,)i(whic)o(h)f(lea)o(v)o(=
e)=0A=
450 1686 =
y(out)k(some)g(pro)q(cessing,)g(and)h(v)o(ery)f(sp)q(eci\014cally)j=0A=
(do)d(not)g(call)h FE(schedule\(\))p FH(.)450 1770 y FE(irqaction\(\))e=0A=
FH(tak)o(es)g(t)o(w)o(o)g(argumen)o(ts:)450 1883 y FE(irq)228=0A=
b FH(The)15 =
b(n)o(um)o(b)q(er)h(of)f(the)g(IR)o(Q)h(the)f(driv)o(er)h(wishes)=0A=
g(to)e(acquire.)450 1987 y FE(new)228 b FH(A)15 =
b(p)q(oin)o(ter)h(to)e(a)h=0A=
(sigaction)h(struct.)450 2090 y FD(Returns:)103 b FE(-EBUSY)14=0A=
b FH(if)i(the)f(in)o(terrupt)h(has)f(already)g(b)q(een)i(acquired,)750=0A=
2155 y FE(-EINVAL)d FH(if)i FE(sa.handler\(\))d FH(is)j(NULL,)750=0A=
2219 y(0)f(on)g(success.)450 2332 y FD(De\014ned)j(in:)j =
FH(k)o(ernel/irq.c)=0A=
450 2397 y FD(See)c(also:)22 b FE(request)p 837 2397 V 16 =
w(irq\(\),)h(free)p=0A=
1116 2397 V 17 w(irq\(\))p eop=0A=
%%Page: 33 44=0A=
33 43 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(33)150 88 y FE(IS)p 201 88 15 2 v=0A=
17 w(*\(inode\))43 b(IS)p 501 88 V 17 w(RDONLY\(inode\))22=0A=
b(\(\(inode\)->i)p 1116 88 V 16 w(flags)h(&)h(MS)p 1371 88=0A=
V 16 w(RDONLY\))450 153 y(IS)p 501 153 V 17 w(NOSUID\(inode\))e=0A=
(\(\(inode\)->i)p 1116 153 V 16 w(flags)h(&)h(MS)p 1371 153=0A=
V 16 w(NOSUID\))450 217 y(IS)p 501 217 V 17 w(NODEV\(inode\))e=0A=
(\(\(inode\)->i)p 1092 217 V 16 w(flags)h(&)h(MS)p 1347 217=0A=
V 17 w(NODEV\))450 281 y(IS)p 501 281 V 17 w(NOEXEC\(inode\))e=0A=
(\(\(inode\)->i)p 1116 281 V 16 w(flags)h(&)h(MS)p 1371 281=0A=
V 16 w(NOEXEC\))450 346 y(IS)p 501 346 V 17 =
w(SYNC\(inode\))e(\(\(inode\)->i)=0A=
p 1068 346 V 16 w(flags)h(&)h(MS)p 1323 346 V 17 w(SYNC\))450=0A=
430 y(#include)f(<linux/fs.h>)450 514 y FH(These)14 =
b(\014v)o(e)f(test)f(to)h=0A=
(see)g(if)h(the)f(ino)q(de)i(is)e(on)g(a)g(\014lesystem)h(moun)o(ted)f(th=
e)g=0A=
(corresp)q(ond-)450 578 y(ing)j(\015ag.)150 682 y FE(kfree*\(\))108=0A=
b(#define)23 b(kfree\(x\))g(kfree)p 979 682 V 16 w(s\(\(x\),)g(0\))450=0A=
746 y(void)g(kfree)p 692 746 V 17 w(s\(void)g(*)h(obj,)f(int)g(size\))450=0A=
830 y(#include)g(<linux/malloc.h>)450 914 y FH(F)l(ree)17 b(memory)e=0A=
(previously)j(allo)q(cated)g(with)f FE(kmalloc\(\))p FH(.)22=0A=
b(There)17 b(are)f(t)o(w)o(o)f(p)q(ossible)450 978 y(argumen)o(ts:)450=0A=
1091 y FE(obj)228 b FH(P)o(oin)o(ter)15 b(to)f(k)o(ernel)i(memory)f(to)g=0A=
(free.)450 1195 y FE(size)204 b FH(T)l(o)19 =
b(sp)q(eed)h(this)f(up,)h(if)f(y)=0A=
o(ou)g(kno)o(w)f(the)h(size,)i(use)e FE(kfree)p 1773 1195 V=0A=
16 w(s\(\))g FH(and)750 1259 y(pro)o(vide)f(the)g(correct)f(size.)27=0A=
b(This)18 b(w)o(a)o(y)l(,)f(the)h(k)o(ernel)g(memory)f(allo-)750=0A=
1324 y(cator)g(kno)o(ws)h(whic)o(h)h(buc)o(k)o(et)g(cac)o(he)f(the)h(ob)s=0A=
(ject)e(b)q(elongs)j(to,)e(and)750 1388 y(do)q(esn't)f(ha)o(v)o(e)g(to)g=0A=
(searc)o(h)h(all)g(of)f(the)h(buc)o(k)o(ets.)26 b(\(F)l(or)17=0A=
b(more)g(details)750 1452 =
y(on)e(this)h(terminology)l(,)f(read)g(mm/kmallo)q=0A=
(c.c.\))450 1566 y FD(De\014ned)j(in:)j FH(mm/kmallo)q(c.c,)15=0A=
b(include/linux/mallo)q(c.h)450 1630 y FD(See)i(also:)22 b=0A=
FE(kmalloc\(\))p FH(.)150 1733 y FE(kmalloc\(\))84 b(void)23=0A=
b(*)h(kmalloc\(unsigned)e(int)h(len,)g(int)h(priority\))450=0A=
1817 y(#include)f(<linux/kernel.h>)450 1901 y(kmalloc\(\))18=0A=
b FH(used)i(to)e(b)q(e)i(limited)i(to)c(4096)g(b)o(ytes.)32=0A=
b(It)19 b(is)h(no)o(w)f(limited)i(to)e(131056)450 1966 y(b)o(ytes)13=0A=
b(\(\(32)7 b FG(\003)g FH(4096\))f FG(\000)h FH(16)o(\).)16=0A=
b(Buc)o(k)o(ets,)e(whic)o(h)g(used)g(to)f(b)q(e)h(all)g(exact)f(p)q(o)o(w=
)o=0A=
(ers)g(of)g(2,)g(are)450 2030 =
y(no)o(w)k(a)g(p)q(o)o(w)o(er)g(of)g(2)h(min)o=0A=
(us)g(some)f(small)h(n)o(um)o(b)q(er,)g(except)g(for)f(n)o(um)o(b)q(ers)h=0A=
(less)g(than)450 2094 =
y(or)c(equal)g(to)g(128.)k(F)l(or)c(more)f(details,)i=0A=
(see)g(the)f(implemen)o(tation)h(in)g(mm/kmallo)q(c.c.)450=0A=
2178 y FE(kmalloc\(\))f FH(tak)o(es)g(t)o(w)o(o)g(argumen)o(ts:)450=0A=
2292 y FE(len)228 b FH(Length)16 b(of)g(memory)f(to)g(allo)q(cate.)23=0A=
b(If)16 b(the)g(maxim)o(um)g(is)g(exceeded,)750 2356 =
y(kmallo)q(c)c(will)h=0A=
(log)e(an)g(error)f(message)g(of)h(\\)p FE(kmalloc)23 =
b(of)g(too)h(large)750=0A=
2420 y(a)g(block)f(\(\045d)g(bytes\).)p FH(")c(and)d(return)f=0A=
FE(NULL)p FH(.)p eop=0A=
%%Page: 34 45=0A=
34 44 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(34)450 88 y FE(priority)108 b(GFP)p=0A=
825 88 15 2 v 17 w(KERNEL)40 b FH(or)h FE(GFP)p 1180 88 V 17=0A=
w(ATOMIC)p FH(.)f(If)h FE(GFP)p 1537 88 V 17 w(KERNEL)f =
FH(is)i(c)o(hosen,)=0A=
750 153 y FE(kmalloc\(\))17 b =
FH(ma)o(y)h(sleep,)i(allo)o(wing)f(pre-emption)=0A=
h(to)d(o)q(ccur.)30 b(This)750 217 y(is)17 =
b(the)f(normal)h(w)o(a)o(y)e(of)h=0A=
(calling)i FE(kmalloc\(\))p FH(.)k(Ho)o(w)o(ev)o(er,)16 b(there)g(are)750=0A=
281 y(cases)21 =
b(where)h(it)f(is)h(b)q(etter)f(to)g(return)g(immediately)i=0A=
(if)f(no)f(pages)750 346 =
y(are)c(a)o(v)m(ailable,)i(without)f(attempting)f=0A=
(to)g(sleep)h(to)f(\014nd)h(one.)27 b(One)750 410 y(of)18 =
b(the)h(places)h=0A=
(in)g(whic)o(h)g(this)f(is)h(true)e(is)i(in)g(the)f(sw)o(apping)g(co)q(de=
,)=0A=
750 475 y(b)q(ecause)i(it)g(could)g(cause)f(race)g(conditions,)j(and)d=0A=
(another)g(in)h(the)750 539 =
y(net)o(w)o(orking)g(co)q(de,)i(where)e(things)h=0A=
(can)f(happ)q(en)i(at)d(m)o(uc)o(h)i(faster)750 603 y(sp)q(eed)d(that)f=0A=
(things)h(could)g(b)q(e)h(handled)g(b)o(y)e(sw)o(apping)h(to)e(disk)j(to)=
750=0A=
668 y(mak)o(e)i(space)g(for)f(giving)i(the)g(net)o(w)o(orking)e(co)q(de)i=0A=
(more)f(memory)l(.)750 732 =
y(The)d(most)g(imp)q(ortan)o(t)f(reason)h(for)g=0A=
(using)h FE(GFP)p 1599 732 V 16 w(ATOMIC)f FH(is)g(if)h(it)f(is)750=0A=
796 =
y(b)q(eing)g(called)g(from)d(an)i(in)o(terrupt,)g(when)g(y)o(ou)f(cannot)=0A=
g(sleep,)i(and)750 861 y(cannot)c(receiv)o(e)h(other)f(in)o(terrupts.)450=0A=
964 y FD(Returns:)103 b FE(NULL)15 b FH(on)g(failure.)750 1029=0A=
y(P)o(oin)o(ter)g(to)f(allo)q(cated)j(memory)d(on)h(success.)450=0A=
1142 y FD(De\014ned)j(in:)j FH(mm/kmallo)q(c.c)450 1206 y =
FD(See)c(also:)22=0A=
b FE(kfree\(\))150 1310 y(ll)p 201 1310 V 17 w(rw)p 266 1310=0A=
V 17 w(block\(\))450 1374 y(void)h(ll)p 620 1374 V 17 w(rw)p=0A=
685 1374 V 17 w(block\(int)g(rw,)g(int)h(nr,)f(struct)g(buffer)p=0A=
1538 1374 V 17 w(head)g(*bh[]\))450 1458 y(#include)g(<linux/fs.h>)450=0A=
1542 y FH(No)15 =
b(device)h(driv)o(er)g(will)g(ev)o(er)f(call)h(this)g(co)q=0A=
(de:)k(it)15 b(is)h(called)h(only)e(through)g(the)g(bu\013er)450=0A=
1606 y(cac)o(he.)k(Ho)o(w)o(ev)o(er,)12 =
b(an)h(understanding)h(of)f(this)g=0A=
(function)h(ma)o(y)e(help)i(y)o(ou)e(understand)450 1671 =
y(the)j(function)h=0A=
(of)f(the)g(strategy)f(routine.)450 1755 y(After)k(sanit)o(y)h(c)o(hec)o=0A=
(king,)h(if)f(there)g(are)f(no)h(p)q(ending)h(requests)f(on)f(the)h(devic=
e's)=0A=
h(re-)450 1819 y(quest)f(queue,)i FE(ll)p 773 1819 V 17 w(rw)p=0A=
838 1819 V 17 w(block\(\))d FH(\\plugs")h(the)g(queue)h(so)f(that)f(the)h=0A=
(requests)g(don't)450 1883 y(go)e(out)h(un)o(til)h(all)g(the)f(requests)g=0A=
(are)f(in)i(the)f(queue,)h(sorted)f(b)o(y)g(the)g(elev)m(ator)g(algo-)450=0A=
1948 y(rithm.)32 b FE(make)p 705 1948 V 17 w(request\(\))18=0A=
b FH(is)i(then)f(called)i(for)e(eac)o(h)g(request.)32 b(If)19=0A=
b(the)h(queue)g(had)450 2012 =
y(to)d(b)q(e)i(plugged,)g(then)f(the)g(strategy)=0A=
f(routine)i(for)e(that)g(device)i(is)g(not)e(activ)o(e,)i(and)450=0A=
2076 y(it)e(is)g(called,)h FD(with)i(in)o(terrupts)h(disabled.)30=0A=
b(It)19 b(is)g(the)g(resp)q(onsibilit)o(y)i(of)f(the)450 2141=0A=
y(strategy)e(routine)h(to)f(re-enable)h(in)o(terrupts.)450=0A=
2225 y(De\014ned)f(in:)j FH(devices/blo)q(c)o(k/ll)p 1037 2225=0A=
14 2 v 19 w(rw)p 1107 2225 V 16 w(blo)q(c)o(k.c)450 2289 y=0A=
FD(See)c(also:)22 b FE(make)p 765 2289 15 2 v 16 w(request\(\))p=0A=
FH(,)14 b FE(add)p 1096 2289 V 17 w(request\(\))p FH(.)150=0A=
2393 y FE(MAJOR\(\))132 b(#define)23 b(MAJOR\(a\))g=0A=
(\(\(\(unsigned\)\(a\)\)>>8\))450 2476 y(#include)g(<linux/fs.h>)p=0A=
eop=0A=
%%Page: 35 46=0A=
35 45 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(35)450 88 y(This)18 b(tak)o(es)f(a)h(16)f(bit)h=0A=
(device)h(n)o(um)o(b)q(er)f(and)g(giv)o(es)g(the)g(asso)q(ciated)f(ma)s(j=
or)g=0A=
(n)o(um)o(b)q(er)450 153 =
y(b)o(y)e(shifting)h(o\013)g(the)f(minor)g(n)o(um)o=0A=
(b)q(er.)450 237 y FD(See)i(also:)22 b FE(MINOR\(\))p FH(.)150=0A=
340 y FE(make)p 249 340 15 2 v 17 w(request\(\))450 405 y(static)h(void)g=0A=
(make)p 835 405 V 17 =
w(request\(int)f(major,)h(int)h(rw,)f(struct)g(buffer)p=0A=
1807 405 V 17 w(head)450 469 y(*bh\))450 553 y FH(This)14 =
b(is)f(a)g(static)f=0A=
(function)i(in)g(ll)p 1006 553 14 2 v 18 w(rw)p 1075 553 V=0A=
16 =
w(blo)q(c)o(k.c,)f(and)g(cannot)g(b)q(e)h(called)g(b)o(y)f(other)g(co)q=0A=
(de.)450 617 y(Ho)o(w)o(ev)o(er,)i(an)h(understanding)h(of)f(this)g=0A=
(function,)h(as)f(w)o(ell)h(as)e(an)h(understanding)h(of)450=0A=
682 y FE(ll)p 501 682 15 2 v 17 w(rw)p 566 682 V 17 w(block\(\))p=0A=
FH(,)d(ma)o(y)g(help)j(y)o(ou)d(understand)i(the)g(strategy)d(routine.)45=
0=0A=
765 y FE(make)p 549 765 V 17 w(request\(\))f =
FH(\014rst)h(c)o(hec)o(ks)g(to)g=0A=
(see)h(if)g(the)f(request)g(is)h(readahead)g(or)f(writeahead)450=0A=
830 y(and)19 b(the)h(bu\013er)g(is)g(lo)q(c)o(k)o(ed.)33 b(If)19=0A=
b(so,)h(it)f(simply)i(ignores)e(the)h(request)f(and)g(returns.)450=0A=
894 =
y(Otherwise,)e(it)f(lo)q(c)o(ks)g(the)g(bu\013er)h(and,)f(except)h(for)e=0A=
(SCSI)i(devices,)g(c)o(hec)o(ks)f(to)f(mak)o(e)450 959 =
y(sure)k(that)f(write)=0A=
i(requests)f(don't)f(\014ll)j(the)e(queue,)h(as)f(read)g(requests)g(shoul=
d)h=0A=
(tak)o(e)450 1023 y(precedence.)450 1107 y(If)15 =
b(no)f(spaces)g(are)g(a)o(v)=0A=
m(ailable)i(in)f(the)g(queue,)g(and)f(the)g(request)h(is)g(neither)g=0A=
(readahead)450 1171 y(nor)c(writeahead,)h FE(make)p 868 1171=0A=
V 17 w(request\(\))e FH(sleeps)j(on)e(the)g(ev)o(en)o(t)h FE(wait)p=0A=
1583 1171 V 16 w(for)p 1671 1171 V 17 w(request)p FH(,)f(and)450=0A=
1236 y(tries)18 b(again)g(when)h(w)o(ok)o(en.)27 b(When)19=0A=
b(a)f(space)g(in)h(the)f(queue)h(is)f(found,)h(the)f(request)450=0A=
1300 y(information)23 b(is)g(\014lled)i(in)e(and)g FE(add)p=0A=
1107 1300 V 17 w(request\(\))e =
FH(is)i(called)i(to)d(actually)h(add)g(the)450=0A=
1364 y(request)15 b(to)g(the)g(queue.)450 1448 y FD(De\014ned)j(in:)j=0A=
FH(devices/blo)q(c)o(k/ll)p 1037 1448 14 2 v 19 w(rw)p 1107=0A=
1448 V 16 w(blo)q(c)o(k.c)450 1513 y FD(See)c(also:)22 b FE(add)p=0A=
741 1513 15 2 v 17 w(request\(\))p FH(,)13 b FE(ll)p 1048 1513=0A=
V 17 w(rw)p 1113 1513 V 17 w(block\(\))p FH(.)150 1616 y FE(MINOR\(\))132=0A=
b(#define)23 b(MINOR\(a\))g(\(\(a\)&0xff\))450 1700 y(#include)g=0A=
(<linux/fs.h>)450 1784 y FH(This)18 =
b(tak)o(es)f(a)h(16)f(bit)h(device)i(n)o=0A=
(um)o(b)q(er)e(and)g(giv)o(es)g(the)g(asso)q(ciated)g(minor)g(n)o(um)o(b)=
q=0A=
(er)450 1848 =
y(b)o(y)d(masking)g(o\013)h(the)f(ma)s(jor)f(n)o(um)o(b)q(er.)=0A=
450 1932 y FD(See)j(also:)22 b FE(MAJOR\(\))p FH(.)150 2100=0A=
y FE(memcpy)p 297 2100 V 16 w(*fs\(\))450 2164 y(inline)h(void)g=0A=
(memcpy_tofs\(void)f(*)i(to,)f(const)g(void)h(*)f(from,)1023=0A=
2229 y(unsigned)f(long)i(n\))450 2293 =
y(inline)f(void)g(memcpy_fromfs\(void)f=0A=
(*)h(to,)h(const)f(void)g(*)h(from,)1070 2358 y(unsigned)f(long)h(n\))450=0A=
2441 y(#include)f(<asm/segment.h>)p eop=0A=
%%Page: 36 47=0A=
36 46 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(36)450 88 y(Copies)17 =
b(memory)f(b)q(et)o(w)o(een)i=0A=
(user)e(space)h(and)g(k)o(ernel)h(space)f(in)g(c)o(h)o(unks)h(larger)e(th=
an)=0A=
450 153 y(one)h(b)o(yte,)g(w)o(ord,)f(or)g(long.)25 b(Be)17=0A=
b(v)o(ery)f(careful)i(to)e(get)g(the)h(order)g(of)f(the)h(argumen)o(ts)45=
0=0A=
217 y(righ)o(t!)450 301 y FD(Note:)j FH(these)12 b(functions)h(ma)o(y)f=0A=
(cause)h(implicit)h(I/O,)f(if)g(the)f(memory)g(b)q(eing)h(accessed)-1895=0A=
b Fr(3)450 365 y FH(has)17 b(b)q(een)h(sw)o(app)q(ed)f(out,)f(and)h=0A=
(therefore)g(pre-emption)g(ma)o(y)f(o)q(ccur)i(at)e(this)h(p)q(oin)o(t.)4=
50=0A=
430 =
y(Do)f(not)h(include)i(these)e(functions)h(in)f(critical)i(sections)e(of)=0A=
f(y)o(our)h(co)q(de,)g(ev)o(en)h(if)f(the)450 494 y(critical)j(sections)e=0A=
(are)g(protected)g(b)o(y)g FE(cli\(\))p FH(/)p FE(sti\(\))f=0A=
FH(pairs,)i(b)q(ecause)g(implicit)i(I/O)450 558 y(will)c(violate)g(the)e=0A=
FE(cli\(\))g FH(protection.)22 b(If)16 b(y)o(ou)f(need)i(to)e(get)g(at)g=0A=
(user-space)i(memory)l(,)450 623 y(cop)o(y)e(it)h(to)e(k)o(ernel-space)j=0A=
(memory)d FC(b)n(efor)n(e)h FH(y)o(ou)g(en)o(ter)g(y)o(our)f(critical)j=0A=
(section.)450 707 =
y(These)f(functions)g(tak)o(e)e(three)h(argumen)o(ts:)450=0A=
820 y FE(to)252 b FH(Address)16 b(to)e(cop)o(y)h(data)g(to.)450=0A=
924 y FE(from)204 b FH(Address)16 b(to)e(cop)o(y)h(data)g(from.)450=0A=
1027 y FE(n)276 b FH(Num)o(b)q(er)16 =
b(of)e(b)o(ytes)h(to)g(cop)o(y)l(.)450=0A=
1140 y FD(De\014ned)j(in:)j FH(include/asm/segmen)o(t.h)450=0A=
1205 y FD(See)c(also:)22 b FE(get)p 741 1205 15 2 v 17 w(user*\(\))p=0A=
FH(,)13 b FE(put)p 1024 1205 V 17 w(user*\(\))p FH(,)h FE(cli\(\))p=0A=
FH(,)g FE(sti\(\))p FH(.)150 1308 y FE(outb\(\),)23 b(outb)p=0A=
440 1308 V 17 w(p\(\))450 1373 y(inline)g(void)g(outb\(char)g(value,)g=0A=
(unsigned)g(short)g(port\))450 1437 y(inline)g(void)g(outb)p=0A=
835 1437 V 17 w(p\(char)g(value,)g(unsigned)g(short)g(port\))450=0A=
1521 y(#include)g(<asm/io.h>)450 1605 y FH(W)l(rites)12 =
b(a)g(b)o(yte)h(to)e=0A=
(a)h(p)q(ort.)19 b FE(outb\(\))11 b =
FH(go)q(es)i(as)f(fast)f(as)h(it)h(can,)f=0A=
(while)i FE(outb)p 1723 1605 V 17 w(p\(\))e FH(pauses)450 1669=0A=
y(b)q(efore)h(returning.)19 b(Some)13 =
b(devices)h(are)e(happier)i(if)f(y)o=0A=
(ou)f(don't)g(write)g(to)g(them)h(as)f(fast)450 1733 =
y(as)j(p)q(ossible.)21=0A=
b(Both)15 b(functions)h(tak)o(e)f(t)o(w)o(o)f(argumen)o(ts:)450=0A=
1847 y FE(value)180 b FH(The)15 b(b)o(yte)g(to)g(write.)450=0A=
1950 y FE(port)204 b FH(P)o(ort)14 b(to)h(write)g(b)o(yte)g(to.)450=0A=
2064 y FD(De\014ned)j(in:)j FH(include/asm/io.h)450 2128 y=0A=
FD(See)c(also:)22 b FE(inb\(\))p FH(,)14 b FE(inb)p 888 2128=0A=
V 17 w(p\(\))p FH(.)150 2231 y FE(printk\(\))108 b(int)23 =
b(printk\(const)g=0A=
(char*)g(fmt,)g(...\))450 2315 y(#include)g(<linux/kernel.h>)450=0A=
2399 y(printk\(\))14 b FH(is)i(a)e(v)o(ersion)i(of)e FE(printf\(\))g=0A=
FH(for)h(the)g(k)o(ernel,)g(with)h(some)f(restrictions.)20=0A=
b(It)450 2464 y(cannot)13 =
b(handle)h(\015oats,)e(and)h(has)g(a)g(few)g(other)=0A=
f(limitations,)j(whic)o(h)e(are)g(do)q(cumen)o(ted)450 2528=0A=
y(in)j(k)o(ernel/vsprin)o(tf.c.)k(It)c(tak)o(es)e(a)h(v)m(ariable)i(n)o(u=
m)o=0A=
(b)q(er)e(of)g(argumen)o(ts:)p eop=0A=
%%Page: 37 48=0A=
37 47 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)36 b(Supp)q(orting)20=0A=
b(F)l(unctions)1146 b FH(37)450 88 y FE(fmt)228 b FH(F)l(ormat)14=0A=
b(string,)h FE(printf\(\))f FH(st)o(yle.)450 192 y FE(...)228=0A=
b FH(The)15 b(rest)g(of)g(the)g(argumen)o(ts,)f FE(printf\(\))g=0A=
FH(st)o(yle.)450 310 y FD(Returns:)103 b FH(Num)o(b)q(er)16=0A=
b(of)e(b)o(ytes)h(written.)750 394 y FD(Note:)39 b FE(printk\(\))22=0A=
b FH(ma)o(y)i(cause)g(implicit)i(I/O,)e(if)h(the)f(memory)-1897=0A=
b Fr(3)750 458 y FH(b)q(eing)25 =
b(accessed)g(has)f(b)q(een)h(sw)o(app)q(ed)g=0A=
(out,)g(and)g(therefore)f(pre-)750 523 =
y(emption)d(ma)o(y)f(o)q(ccur)h(at)e=0A=
(this)i(p)q(oin)o(t.)36 b(Also,)22 b FE(printk\(\))d FH(will)j(set)750=0A=
587 y(the)g(in)o(terrupt)g(enable)g(\015ag,)h(so)e =
FD(nev)o(er)k(use)f(it)i=0A=
(in)f(co)q(de)h(pro-)750 651 y(tected)16 b(b)o(y)e FE(cli\(\))p=0A=
FD(.)19 b FH(Because)13 =
b(it)h(causes)f(I/O,)g(it)g(is)g(not)g(safe)f(to)h=0A=
(use)750 716 y(in)18 =
b(protected)e(co)q(de)i(an)o(yw)o(a)o(y)l(,)d(ev)o(en)j=0A=
(it)f(if)g(didn't)g(set)g(the)g(in)o(terrupt)750 780 =
y(enable)f(\015ag.)450=0A=
898 y FD(De\014ned)i(in:)j FH(k)o(ernel/prin)o(tk.c.)150 1002=0A=
y FE(put)p 225 1002 15 2 v 17 w(user*\(\))43 b(inline)23 b(void)g(put)p=0A=
811 1002 V 17 w(user)p 924 1002 V 17 =
w(byte\(char)f(val,)i(char)f(*addr\))450=0A=
1066 y(inline)g(void)g(put)p 811 1066 V 17 w(user)p 924 1066=0A=
V 17 w(word\(short)f(val,)i(short)f(*addr\))450 1131 =
y(inline)g(void)g(put)p=0A=
811 1131 V 17 w(user)p 924 1131 V 17 w(long\(unsigned)f(long)h(val,)g=0A=
(unsigned)g(long)450 1195 y(*addr\))450 1279 =
y(#include)g(<asm/segment.h>)450=0A=
1363 y FH(Allo)o(ws)17 b(a)f(driv)o(er)h(to)f(write)g(data)g(in)i(user)e=0A=
(space,)h(whic)o(h)g(is)g(in)h(a)e(di\013eren)o(t)h(segmen)o(t)450=0A=
1427 y(than)e(the)g(k)o(ernel.)21 b(When)16 =
b(en)o(tering)f(the)g(k)o(ernel)h=0A=
(through)f(a)g(system)g(call,)h(a)f(selector)450 1492 =
y(for)e(the)h(curren)o=0A=
(t)f(user)h(space)g(segmen)o(t)g(is)g(put)g(in)g(the)g(fs)g(segmen)o(t)f=0A=
(register,)g(th)o(us)h(the)450 1556 y(names.)450 1640 y FD(Note:)20=0A=
b FH(these)12 b(functions)h(ma)o(y)f(cause)h(implicit)h(I/O,)f(if)g(the)f=0A=
(memory)g(b)q(eing)h(accessed)-1895 b Fr(3)450 1704 y FH(has)17=0A=
b(b)q(een)h(sw)o(app)q(ed)f(out,)f(and)h(therefore)g(pre-emption)g(ma)o(y=
)f=0A=
(o)q(ccur)i(at)e(this)h(p)q(oin)o(t.)450 1769 =
y(Do)g(not)h(include)i(these)e=0A=
(functions)h(in)f(critical)i(sections)e(of)g(y)o(our)f(co)q(de)h(ev)o(en)=
h=0A=
(if)f(the)450 1833 y(critical)h(sections)e(are)g(protected)g(b)o(y)h=0A=
FE(cli\(\))p FH(/)p FE(sti\(\))d =
FH(pairs,)j(b)q(ecause)g(that)e(implicit)450=0A=
1897 y(I/O)h(will)h(violate)f(the)f(in)o(tegrit)o(y)h(of)f(y)o(our)g=0A=
FE(cli\(\))p FH(/)p FE(sti\(\))f FH(pair.)24 b(If)16 =
b(y)o(ou)g(need)i(to)d=0A=
(get)450 1962 y(at)e(user-space)i(memory)l(,)e(cop)o(y)h(it)g(to)f(k)o=0A=
(ernel-space)i(memory)e FC(b)n(efor)n(e)g =
FH(y)o(ou)h(en)o(ter)f(y)o(our)450=0A=
2026 y(critical)k(section.)450 2110 =
y(These)f(functions)g(tak)o(e)e(t)o(w)o=0A=
(o)g(argumen)o(ts:)450 2223 y FE(val)228 b FH(V)l(alue)16 =
b(to)f(write)450=0A=
2327 y FE(addr)204 b FH(Address)16 b(to)e(write)h(data)g(to.)450=0A=
2440 y FD(De\014ned)j(in:)j FH(asm/segmen)o(t.h)450 2504 y=0A=
FD(See)c(also:)22 b FE(memcpy)p 813 2504 V 16 w(*fs\(\))p FH(,)14=0A=
b FE(get)p 1048 2504 V 17 w(user*\(\))p FH(,)g FE(cli\(\))p=0A=
FH(,)g FE(sti\(\))p FH(.)p eop=0A=
%%Page: 38 49=0A=
38 48 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(38)150 153 y FE(register)p 345 153=0A=
15 2 v 16 w(*dev\(\))450 217 y(int)23 b(register_chrdev\(unsigned)e(int)i=0A=
(major,)h(const)f(char)g(*name,)927 281 =
y(struct)g(file_operations)f(*fops\))=0A=
450 346 y(int)h(register_blkdev\(unsigned)e(int)i(major,)h(const)f(char)g=0A=
(*name,)927 410 y(struct)g(file_operations)f(*fops\))450 494=0A=
y(#include)h(<linux/fs.h>)450 558 y(#include)g(<linux/errno.h>)450=0A=
642 y FH(Registers)13 =
b(a)g(device)h(with)f(the)f(k)o(ernel,)i(letting)f(the)=0A=
g(k)o(ernel)h(c)o(hec)o(k)f(to)f(mak)o(e)g(sure)h(that)450=0A=
707 y(no)18 =
b(other)f(driv)o(er)h(has)g(already)f(grabb)q(ed)i(the)e(same)h=0A=
(ma)s(jor)e(n)o(um)o(b)q(er.)28 b(T)l(ak)o(es)17 b(three)450=0A=
771 y(argumen)o(ts:)450 884 y FE(major)180 b FH(Ma)s(jor)13=0A=
b(n)o(um)o(b)q(er)j(of)f(device)h(b)q(eing)h(registered.)450=0A=
988 y FE(name)204 b FH(Unique)18 =
b(string)e(iden)o(tifying)i(driv)o(er.)24=0A=
b(Used)17 b(in)g(the)g(output)f(for)g(the)750 1052 y(/pro)q(c/devices)g=0A=
(\014le.)450 1156 y FE(fops)204 b FH(P)o(oin)o(ter)11 b(to)g(a)g=0A=
FE(file)p 1091 1156 V 17 w(operations)f =
FH(structure)h(for)g(that)g(device.)=0A=
20 b(This)750 1220 y(m)o(ust)15 b FD(not)g FH(b)q(e)h FE(NULL)p=0A=
FH(,)e(or)h(the)g(k)o(ernel)h(will)h(panic)f(later.)450 1346=0A=
y FD(Returns:)103 b FE(-EINVAL)13 b FH(if)h(ma)s(jor)e(is)i=0A=
FG(\025)g FE(MAX)p 1270 1346 V 16 w(CHRDEV)f FH(or)g FE(MAX)p=0A=
1569 1346 V 17 w(BLKDEV)g FH(\(de\014ned)h(in)750 1410 y =
FE(<linux/fs.h>)p=0A=
FH(\),)f(for)h(c)o(haracter)h(or)g(blo)q(c)o(k)h(devices,)g(resp)q(ectiv)=
o=0A=
(ely)l(.)750 1475 y FE(-EBUSY)e =
FH(if)i(ma)s(jor)e(device)i(n)o(um)o(b)q(er)g=0A=
(has)f(already)g(b)q(een)i(allo)q(cated.)750 1539 y(0)e(on)g(success.)450=0A=
1665 y FD(De\014ned)j(in:)j FH(fs/devices.c)450 1729 y FD(See)c(also:)22=0A=
b FE(unregister)p 909 1729 V 16 w(*dev\(\))150 1897 y(request)p=0A=
321 1897 V 16 w(irq\(\))450 1961 =
y(int)h(request_irq\(unsigned)f(int)h(irq,)g=0A=
(void)h(\(*handler\)\(int\),)832 2026 =
y(unsigned)f(long)g(flags,)g(const)g=0A=
(char)g(*device\))450 2110 y(#include)g(<linux/sched.h>)450=0A=
2174 y(#include)g(<linux/errno.h>)450 2258 y =
FH(Request)e(an)f(IR)o(Q)h(from)=0A=
e(the)h(k)o(ernel,)i(and)e(install)i(an)e(IR)o(Q)h(in)o(terrupt)f(handler=
)h=0A=
(if)450 2322 y(successful.)g(T)l(ak)o(es)15 b(four)g(argumen)o(ts:)450=0A=
2435 y FE(irq)228 b FH(The)15 b(IR)o(Q)i(b)q(eing)f(requested.)p=0A=
eop=0A=
%%Page: 39 50=0A=
39 49 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(39)450 88 y FE(handler)132 b FH(The)11=0A=
b(handler)h(to)e(b)q(e)i(called)h(when)e(the)g(IR)o(Q)h(o)q(ccurs.)19=0A=
b(The)11 b(argumen)o(t)750 153 y(to)16 =
b(the)h(handler)i(function)e(will)i(b)=0A=
q(e)f(the)f(n)o(um)o(b)q(er)g(of)g(the)g(IR)o(Q)h(that)750=0A=
217 y(it)d(w)o(as)g(in)o(v)o(ok)o(ed)g(to)g(handle.)450 321=0A=
y FE(flags)180 b FH(Set)21 b(to)g FE(SA)p 947 321 15 2 v 17=0A=
w(INTERRUPT)f =
FH(to)g(request)h(a)g(\\fast")f(in)o(terrupt)h(or)g(0)g(to)750=0A=
385 y(request)15 b(a)g(normal,)g(\\slo)o(w")f(one.)450 488=0A=
y FE(device)156 b FH(A)15 =
b(string)g(con)o(taining)h(the)g(name)f(of)g(the)g=0A=
(device)i(driv)o(er,)e Fw(device)p FH(.)450 614 y FD(Returns:)103=0A=
b FE(-EINVAL)14 b FH(if)i FE(irq)f FB(>)g FH(15)g(or)f FE(handler)h=0A=
FH(=3D)g FE(NULL)p FH(.)750 679 y FE(-EBUSY)f FH(if)i FE(irq)f=0A=
FH(is)g(already)h(allo)q(cated.)750 743 y(0)f(on)g(success.)450=0A=
869 y(If)34 =
b(y)o(ou)g(need)g(more)g(functionalit)o(y)h(in)f(y)o(our)g(in)o=0A=
(terrupt)g(handling,)40 b(use)34 b(the)450 933 y FE(irqaction\(\))14=0A=
b FH(function.)21 b(This)16 =
b(uses)g(most)e(of)h(the)h(capabilities)i(of)d=0A=
(the)g FE(sigaction)450 997 y =
FH(structure)h(to)g(pro)o(vide)h(in)o(terrupt)g=0A=
(services)g(similar)g(to)f(to)g(the)h(signal)g(services)g(pro-)450=0A=
1062 y(vided)f(b)o(y)g FE(sigaction\(\))d =
FH(to)i(user-lev)o(el)i(programs.)=0A=
450 1146 y FD(De\014ned)h(in:)j FH(k)o(ernel/irq.c)450 1210=0A=
y FD(See)c(also:)22 b FE(free)p 765 1210 V 16 w(irq\(\))p FH(,)15=0A=
b FE(irqaction\(\))p FH(.)150 1378 y FE(select)p 297 1378 V=0A=
16 w(wait\(\))450 1442 y(inline)23 =
b(void)g(select_wait\(struct)f(wait_queue)=0A=
g(**wait_address,)1023 1507 y(select_table)g(*p\))450 1591=0A=
y(#include)h(<linux/sched.h>)450 1674 y =
FH(Add)c(a)e(pro)q(cess)i(to)e(the)h=0A=
(prop)q(er)g FE(select)p 1189 1674 V 17 w(wait)f FH(queue.)30=0A=
b(This)18 b(function)h(tak)o(es)e(t)o(w)o(o)450 1739 y(argumen)o(ts:)450=0A=
1916 y FE(wait)p 549 1916 V 17 w(address)750 1981 y FH(Address)d(of)e(a)h=0A=
FE(wait)p 1106 1981 V 17 w(queue)f =
FH(p)q(oin)o(ter)i(to)f(add)g(to)g(the)g=0A=
(circular)h(list)g(of)750 2045 y(w)o(aits.)450 2149 y FE(p)276=0A=
b FH(If)12 b FE(p)g FH(is)g FE(NULL)p FH(,)f FE(select)p 1137=0A=
2149 V 16 w(wait)g =
FH(do)q(es)i(nothing,)f(otherwise)g(the)g(curren)o(t)750=0A=
2213 y(pro)q(cess)21 b(is)g(put)g(to)f(sleep.)37 b(This)22=0A=
b(should)f(b)q(e)h(the)e FE(select)p 1817 2213 V 17 w(table)750=0A=
2277 y(*wait)14 b =
FH(v)m(ariable)j(that)e(w)o(as)f(passed)h(to)g(y)o(our)g=0A=
FE(select\(\))f FH(function.)450 2391 y FD(De\014ned)k(in:)j=0A=
FH(lin)o(ux/sc)o(hed.h)450 2455 y FD(See)c(also:)22 b FE(*sleep)p=0A=
813 2455 V 16 w(on\(\),)h(wake)p 1068 2455 V 17 w(up*\(\))p=0A=
eop=0A=
%%Page: 40 51=0A=
40 50 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(40)150 88 y FE(*sleep)p 297 88 15=0A=
2 v 16 w(on\(\))44 b(void)23 b(sleep)p 692 88 V 17 w(on\(struct)f(wait)p=0A=
1043 88 V 17 w(queue)h(**)h(p\))450 153 y(void)f(interruptible)p=0A=
884 153 V 16 w(sleep)p 1020 153 V 16 w(on\(struct)g(wait)p=0A=
1371 153 V 16 w(queue)h(**)f(p\))450 237 y(#include)g(<linux/sched.h>)450=0A=
321 y FH(Sleep)c(on)f(an)g(ev)o(en)o(t,)f(putting)h(a)g FE(wait)p=0A=
1142 321 V 17 w(queue)f FH(en)o(try)g(in)h(the)g(list)h(so)e(that)g(the)h=0A=
(pro-)450 385 =
y(cess)h(can)f(b)q(e)h(w)o(ok)o(en)f(on)h(that)e(ev)o(en)o(t.)=0A=
30 b FE(sleep)p 1276 385 V 16 w(on\(\))18 b =
FH(go)q(es)g(in)o(to)h(an)f(unin)=0A=
o(teruptible)450 449 y(sleep:)35 b(The)22 =
b(only)h(w)o(a)o(y)e(the)h(pro)q=0A=
(cess)h(can)f(run)h(is)f(to)g(b)q(e)h(w)o(ok)o(en)e(b)o(y)h=0A=
FE(wake)p 1828 449 V 17 w(up\(\))p FH(.)450 514 y FE(interruptible)p=0A=
765 514 V 15 w(sleep)p 900 514 V 17 w(on\(\))12 b =
FH(go)q(es)h(in)o(to)h(an)f=0A=
(in)o(terruptible)i(sleep)f(that)e(can)i(b)q(e)g(w)o(o-)450=0A=
578 =
y(k)o(en)k(b)o(y)g(signals)h(and)f(pro)q(cess)h(timeouts)f(will)h(cause)g=0A=
(the)f(pro)q(cess)g(to)g(w)o(ak)o(e)f(up.)29 b(A)450 642 y(call)18=0A=
b(to)f FE(wake)p 692 642 V 16 w(up)p 756 642 V 17 w(interruptible\(\))e=0A=
FH(is)j(necessary)g(to)e(w)o(ak)o(e)g(up)i(the)f(pro)q(cess)h(and)450=0A=
707 y(allo)o(w)d(it)h(to)e(con)o(tin)o(ue)i(running)h(where)e(it)g(left)h=0A=
(o\013.)k(Both)15 b(tak)o(e)g(one)g(argumen)o(t:)450 820 y=0A=
FE(p)276 b FH(P)o(oin)o(ter)20 b(to)g(a)f(prop)q(er)i FE(wait)p=0A=
1268 820 V 17 w(queue)e FH(structure)h(that)g(records)g(the)750=0A=
884 y(information)15 b(needed)i(to)d(w)o(ak)o(e)h(the)g(pro)q(cess.)450=0A=
998 y FD(De\014ned)j(in:)j FH(k)o(ernel/sc)o(hed.c)450 1062=0A=
y FD(See)c(also:)22 b FE(select)p 813 1062 V 16 w(wait\(\))p=0A=
FH(,)14 b FE(wake)p 1096 1062 V 17 w(up*\(\))p FH(.)150 1166=0A=
y FE(sti\(\))180 b(#define)23 b(sti\(\))p 787 1166 V 804 1166=0A=
V 57 w(asm)p 893 1166 V 910 1166 V 951 1166 V 968 1166 V 93=0A=
w(volatile)p 1178 1166 V 1194 1166 V 57 w(\("sti"::\))450 1249=0A=
y(#include)g(<asm/system.h>)450 1333 y =
FH(Allo)o(ws)d(in)o(terrupts)f(to)g(b)=0A=
q(e)g(ac)o(kno)o(wledged.)33 b FE(sti)19 b FH(stands)f(for)h(\\SeT)g(In)o=0A=
(terrupt)g(en-)450 1398 y(able".)450 1482 y FD(De\014ned)f(in:)j=0A=
FH(asm/system.h)450 1546 y FD(See)c(also:)22 b FE(cli\(\))p=0A=
FH(.)150 1650 y FE(sys)p 225 1650 V 17 w(get*\(\))67 b(int)23=0A=
b(sys)p 620 1650 V 17 w(getpid\(void\))450 1714 y(int)g(sys)p=0A=
620 1714 V 17 w(getuid\(void\))450 1778 y(int)g(sys)p 620 1778=0A=
V 17 w(getgid\(void\))450 1843 y(int)g(sys)p 620 1843 V 17=0A=
w(geteuid\(void\))450 1907 y(int)g(sys)p 620 1907 V 17 =
w(getegid\(void\))450=0A=
1971 y(int)g(sys)p 620 1971 V 17 w(getppid\(void\))450 2036=0A=
y(int)g(sys)p 620 2036 V 17 w(getpgrp\(void\))450 2120 y FH(These)13=0A=
b(system)f(calls)i(ma)o(y)d(b)q(e)j(used)f(to)f(get)g(the)g(information)h=0A=
(describ)q(ed)i(in)e(the)g(table)450 2184 y(b)q(elo)o(w,)k(or)e(the)i=0A=
(information)f(can)g(b)q(e)h(extracted)f(directly)i(from)d(the)h(pro)q(ce=
ss)h=0A=
(table,)450 2248 y(lik)o(e)f(this:)450 2313 y Fw(fo)q(o)23=0A=
b FE(=3D)h(current->)p Fw(pid)p FE(;)p eop=0A=
%%Page: 41 52=0A=
41 51 bop 150 -84 1800 3 v 150 -100 a FD(1.6.)42 b(Supp)q(orting)20=0A=
b(F)l(unctions)1140 b FH(41)p 450 44 935 2 v 449 109 2 65 v=0A=
499 89 a FE(pid)p 594 109 V 49 w FH(Pro)q(cess)15 b(ID)p 1384=0A=
109 V 450 110 935 2 v 449 175 2 65 v 499 155 a FE(uid)p 594=0A=
175 V 49 w FH(User)g(ID)p 1384 175 V 450 176 935 2 v 449 241=0A=
2 65 v 499 221 a FE(gid)p 594 241 V 49 w FH(Group)g(ID)p 1384=0A=
241 V 450 242 935 2 v 449 307 2 65 v 475 288 a FE(euid)p 594=0A=
307 V 49 w FH(E\013ectiv)o(e)h(user)g(ID)p 1384 307 V 450 308=0A=
935 2 v 449 373 2 65 v 475 354 a FE(egid)p 594 373 V 49 w =
FH(E\013ectiv)o(e)g=0A=
(group)f(ID)p 1384 373 V 450 374 935 2 v 449 439 2 65 v 475=0A=
420 a FE(ppid)p 594 439 V 49 w =
FH(Pro)q(cess)g(ID)h(of)e(pro)q(cess')h(paren)=0A=
o(t)g(pro)q(cess)p 1384 439 V 450 441 935 2 v 449 505 2 65=0A=
v 475 486 a FE(pgid)p 594 505 V 49 w FH(Group)g(ID)g(of)g(pro)q(cess')g=0A=
(paren)o(t)g(pro)q(cess)p 1384 505 V 450 507 935 2 v 450 562=0A=
a(The)g(system)g(calls)h(should)g(not)e(b)q(e)i(used)f(b)q(ecause)h(they)=
f=0A=
(are)g(slo)o(w)o(er)f FC(and)h FH(tak)o(e)f(more)450 626 y(space.)24=0A=
b(Because)17 b(of)e(this,)i(they)g(are)f(no)g(longer)g(exp)q(orted)h(as)f=0A=
(sym)o(b)q(ols)h(throughout)450 691 y(the)e(whole)h(k)o(ernel.)450=0A=
774 y FD(De\014ned)i(in:)j FH(k)o(ernel/sc)o(hed.c)150 1007=0A=
y FE(unregister)p 393 1007 15 2 v 16 w(*dev\(\))450 1071 y(int)i=0A=
(unregister_chrdev\(unsigned)e(int)i(major,)g(const)g(char)h(*name\))450=0A=
1135 y(int)f(unregister_blkdev\(unsigned)e(int)i(major,)g(const)g(char)h=0A=
(*name\))450 1219 y(#include)f(<linux/fs.h>)450 1284 y(#include)g=0A=
(<linux/errno.h>)450 1368 y =
FH(Remo)o(v)o(es)e(the)h(registration)f(for)g(a)g=0A=
(device)i(device)g(with)f(the)g(k)o(ernel,)i(letting)e(the)450=0A=
1432 y(k)o(ernel)16 =
b(giv)o(e)f(the)h(ma)s(jor)d(n)o(um)o(b)q(er)j(to)e(some)=0A=
h(other)g(device.)21 b(T)l(ak)o(es)15 b(t)o(w)o(o)f(argumen)o(ts:)450=0A=
1545 y FE(major)180 b FH(Ma)s(jor)14 =
b(n)o(um)o(b)q(er)i(of)f(device)i(b)q=0A=
(eing)g(registered.)k(Must)15 b(b)q(e)i(the)e(same)750 1610=0A=
y(n)o(um)o(b)q(er)h(giv)o(en)f(to)g FE(register)p 1285 1610=0A=
V 16 w(*dev\(\))p FH(.)450 1713 y FE(name)204 b FH(Unique)18=0A=
b(string)f(iden)o(tifying)i(driv)o(er.)25 b(Must)17 =
b(b)q(e)g(the)g(same)g(n)=0A=
o(um)o(b)q(er)750 1777 y(giv)o(en)f(to)e FE(register)p 1119=0A=
1777 V 16 w(*dev\(\))p FH(.)450 1903 y FD(Returns:)103 b FE(-EINVAL)13=0A=
b FH(if)h(ma)s(jor)e(is)i FG(\025)g FE(MAX)p 1270 1903 V 16=0A=
w(CHRDEV)f FH(or)g FE(MAX)p 1569 1903 V 17 w(BLKDEV)g =
FH(\(de\014ned)h(in)750=0A=
1968 y FE(<linux/fs.h>)p FH(\),)i(for)h(c)o(haracter)f(or)h(blo)q(c)o(k)h=0A=
(devices,)h(resp)q(ectiv)o(ely)l(,)750 2032 =
y(or)c(if)h(there)g(ha)o(v)o(e)f=0A=
(not)g(b)q(een)i(\014le)g(op)q(erations)e(registered)h(for)f(ma)s(jor)750=0A=
2096 y(device)f FE(major)p FH(,)e(or)g(if)h FE(name)f FH(is)h(not)f(the)g=0A=
(same)h(name)f(that)g(the)h(device)750 2161 =
y(w)o(as)h(registered)i(with.)750=0A=
2225 y(0)f(on)g(success.)450 2351 y FD(De\014ned)j(in:)j =
FH(fs/devices.c)450=0A=
2415 y FD(See)c(also:)22 b FE(register)p 861 2415 V 16 w(*dev\(\))p=0A=
eop=0A=
%%Page: 42 53=0A=
42 52 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(42)150 88 y FE(wake)p=0A=
249 88 15 2 v 17 w(up*\(\))67 b(void)23 b(wake)p 668 88 V 17=0A=
w(up\(struct)g(wait)p 1020 88 V 16 w(queue)g(**)h(p\))450 153=0A=
y(void)f(wake)p 668 153 V 17 w(up)p 733 153 V 17 =
w(interruptible\(struct)e=0A=
(wait)p 1347 153 V 17 w(queue)i(**)g(p\))450 237 y(#include)g=0A=
(<linux/sched.h>)450 321 y FH(W)l(ak)o(es)12 =
b(up)h(a)f(pro)q(cess)h(that)e=0A=
(has)h(b)q(een)i(put)f(to)e(sleep)j(b)o(y)e(the)h(matc)o(hing)f=0A=
FE(*sleep)p 1841 321 V 17 w(on\(\))450 385 y FH(function.)52=0A=
b FE(wake)p 776 385 V 17 w(up\(\))25 b =
FH(can)g(b)q(e)i(used)f(to)f(w)o(ak)o=0A=
(e)g(up)h(tasks)f(in)h(a)f(queue)i(where)450 449 =
y(the)g(tasks)e(ma)o(y)h(b)q=0A=
(e)h(in)h(a)e FE(TASK)p 1062 449 V 17 w(INTERRUPTIBLE)e FH(or)i=0A=
FE(TASK)p 1578 449 V 17 w(UNINTERRUPTIBLE)450 514 y FH(state,)35=0A=
b(while)e FE(wake)p 829 514 V 16 w(up)p 893 514 V 17 =
w(interruptible\(\))d=0A=
FH(will)j(only)f(w)o(ak)o(e)f(up)h(tasks)f(in)h(a)450 578 y=0A=
FE(TASK)p 549 578 V 17 w(INTERRUPTIBLE)9 b =
FH(state,)i(and)h(will)h(b)q(e)g=0A=
(insigni\014can)o(tly)h(faster)c(than)i FE(wake)p 1841 578=0A=
V 17 w(up\(\))450 642 y FH(on)j(queues)h(that)f(ha)o(v)o(e)f(only)i(in)o=0A=
(terruptible)h(tasks.)i(These)d(tak)o(e)e(one)i(argumen)o(t:)450=0A=
756 y FE(q)276 b FH(P)o(oin)o(ter)14 b(to)f(the)h FE(wait)p=0A=
1139 756 V 17 w(queue)f =
FH(structure)h(of)g(the)g(pro)q(cess)g(to)g(b)q(e)h=0A=
(w)o(o-)750 820 y(k)o(en.)450 933 y(Note)e(that)g FE(wake)p=0A=
754 933 V 16 w(up\(\))g =
FH(do)q(es)h(not)f(switc)o(h)h(tasks,)e(it)i(only)g=0A=
(mak)o(es)f(pro)q(cesses)h(that)e(are)450 998 =
y(w)o(ok)o(en)h(up)h(runnable,)=0A=
h(so)e(that)g(the)h(next)g(time)g FE(schedule\(\))e =
FH(is)i(called,)h(they)f=0A=
(will)h(b)q(e)450 1062 y(candidates)h(to)f(run.)450 1146 y=0A=
FD(De\014ned)j(in:)j FH(k)o(ernel/sc)o(hed.c)450 1210 y FD(See)c(also:)22=0A=
b FE(select)p 813 1210 V 16 w(wait\(\))p FH(,)14 b FE(*sleep)p=0A=
1144 1210 V 16 w(on\(\))150 1388 y Ft(1.7)70 b(W)-6 b(riting)22=0A=
b(a)h(SCSI)g(Device)e(Driv)n(er)332 1513 y Fj(Cop)o(yrigh)o(t)541=0A=
1512 y(c)529 1513 y Ff(\015)c Fj(1993)e(Ric)o(k)n(ard)h(E.)g(F)m(aith)g=0A=
(\(faith AT cs DOT unc DOT edu\).)26 b(All)16 b(righ)o(ts)h(reserv)o(ed.)28=0A=
b(P)o(er-)264 1570 y(mission)14 b(is)i(gran)o(ted)h(to)f(mak)o(e)f(and)h=0A=
(distribute)h(v)o(erbatim)e(copies)h(of)g(this)h(pap)q(er)g(pro)o(vided)f=0A=
(the)264 1626 y(cop)o(yrigh)o(t)d(notice)h(and)g(this)g(p)q(ermission)f=0A=
(notice)h(are)g(preserv)o(ed)i(on)e(all)f(copies.)332 1683=0A=
y(This)h(is)g(\(with)h(the)g(author's)f(explicit)g(p)q(ermission\))g(a)g(=
mo)q=0A=
(di\014ed)f(cop)o(y)i(of)e(the)j(original)c(do)q(c-)264 1740=0A=
y(umen)o(t.)22 b(If)16 =
b(y)o(ou)f(wish)h(to)g(repro)q(duce)h(just)f(this)g=0A=
(section,)h(y)o(ou)e(are)h(advised)g(to)g(get)g(the)g(original)264=0A=
1797 y(v)o(ersion)e(b)o(y)f(ftp)h(from)e(ftp.cs.unc.edu:/pub/faith/pap)q=0A=
(ers/scsi.pap)q(er.tar.gz)150 1950 y Fq(1.7.1)55 b(Wh)n(y)19=0A=
b(Y)-5 b(ou)19 b(W)-5 b(an)n(t)20 b(to)e(W)-5 b(rite)18 =
b(a)h(SCSI)g(Driv)n=0A=
(er)150 2067 y FH(Curren)o(tly)l(,)c(the)f(Lin)o(ux)i(k)o(ernel)g(con)o=0A=
(tains)e(driv)o(ers)h(for)f(the)h(follo)o(wing)g(SCSI)g(host)f(adapters:)=
20=0A=
b(Adaptec)150 2132 y(1542,)15 b(Adaptec)i(1740,)f(F)l(uture)g(Domain)g=0A=
(TMC-1660/TMC-1680,)d(Seagate)j(ST-01/ST-02,)g(Ultra-)150 2196=0A=
y(Stor)h(14F,)f(and)i(W)l(estern)f(Digital)i(WD-7000.)25 b(Y)l(ou)18=0A=
b(ma)o(y)e(w)o(an)o(t)h(to)g(write)g(y)o(our)g(o)o(wn)g(driv)o(er)h(for)f=
(an)=0A=
150 2260 y(unsupp)q(orted)j(host)e(adapter.)31 b(Y)l(ou)19=0A=
b(ma)o(y)f(also)h(w)o(an)o(t)f(to)g(re-write)h(or)f(up)q(date)i(one)f(of)=
f=0A=
(the)h(existing)150 2325 y(driv)o(ers.)p eop=0A=
%%Page: 43 54=0A=
43 53 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(43)150 88 y Fq(1.7.2)55=0A=
b(What)19 b(is)f(SCSI?)150 206 y =
FH(The)g(forew)o(ord)e(to)g(the)i(SCSI-2)g=0A=
(standard)f(draft)f([ANS])h(giv)o(es)h(a)f(succinct)h(de\014nition)i(of)c=0A=
(the)i(Small)150 270 =
y(Computer)c(System)g(In)o(terface)h(and)f(brie\015y)i=0A=
(explains)g(ho)o(w)e(SCSI-2)g(is)h(related)g(to)f(SCSI-1)h(and)f(CCS:)332=0A=
395 y(The)k(SCSI)g(proto)q(col)f(is)h(designed)h(to)e(pro)o(vide)h(an)g=0A=
(e\016cien)o(t)g(p)q(eer-to-p)q(eer)h(I/O)f(bus)264 459 y(with)11=0A=
b(up)h(to)e(8)h(devices,)i(including)h(one)e(or)e(more)h(hosts.)18=0A=
b(Data)10 b(ma)o(y)h(b)q(e)h(transferred)e(asyn-)264 524 =
y(c)o(hronously)h=0A=
(at)g(rates)f(that)h(only)g(dep)q(end)i(on)e(device)i(implemen)o(tation)f=0A=
(and)g(cable)g(length.)264 588 =
y(Sync)o(hronous)k(data)f(transfers)h(are)f=0A=
(supp)q(orted)i(at)e(rates)h(up)g(to)g(10)f(mega-transfers)g(p)q(er)264=0A=
653 y(second.)41 b(With)23 b(the)f(32)g(bit)h(wide)g(data)f(transfer)f=0A=
(option,)j(data)e(rates)g(of)f(up)i(to)f(40)264 717 y(megab)o(ytes)14=0A=
b(p)q(er)i(second)g(are)e(p)q(ossible.)332 781 =
y(SCSI-2)i(includes)j(command)=0A=
d(sets)g(for)f(magnetic)h(and)h(optical)f(disks,)h(tap)q(es,)f(prin)o(t-)=
264=0A=
846 y(ers,)21 b(pro)q(cessors,)h(CD-R)o(OMs,)f(scanners,)h(medium)g(c)o=0A=
(hangers,)g(and)f(comm)o(unications)264 910 y(devices.)332=0A=
974 y(In)d(1985,)g(when)g(the)g(\014rst)g(SCSI)h(standard)e(w)o(as)h(b)q=0A=
(eing)h(\014nalized)h(as)e(an)g(American)264 1039 =
y(National)d(Standard,)g=0A=
(sev)o(eral)g(man)o(ufacturers)f(approac)o(hed)h(the)h(X3T9.2)d(T)l(ask)i=0A=
(Group.)264 1103 y(They)21 =
b(w)o(an)o(ted)f(to)h(increase)h(the)f(mandatory)f=0A=
(requiremen)o(ts)h(of)g(SCSI)h(and)f(to)f(de\014ne)264 1167=0A=
y(further)13 b(features)g(for)g(direct-access)i(devices.)21=0A=
b(Rather)13 b(than)h(dela)o(y)g(the)g(SCSI)g(standard,)264=0A=
1232 =
y(X3T9.2)d(formed)i(an)g(ad)g(ho)q(c)h(group)e(to)h(dev)o(elop)h(a)f(w)o=0A=
(orking)f(pap)q(er)i(that)e(w)o(as)g(ev)o(en)o(tually)264 1296=0A=
y(called)19 b(the)f(Common)e(Command)h(Set)h(\(CCS\).)26 b(Man)o(y)17=0A=
b(disk)i(pro)q(ducts)f(w)o(ere)f(designed)264 1360 y(using)f(this)f(w)o=0A=
(orking)g(pap)q(er)h(in)g(conjunction)g(with)f(the)h(SCSI)g(standard.)332=0A=
1425 =
y(In)h(parallel)g(with)g(the)f(dev)o(elopmen)o(t)h(of)f(the)g(CCS)h(w)o=0A=
(orking)e(pap)q(er,)i(X3T9.2)e(b)q(egan)264 1489 y(w)o(ork)d(on)h(an)g=0A=
(enhanced)h(SCSI)g(standard)e(whic)o(h)i(w)o(as)e(named)h(SCSI-2.)20=0A=
b(SCSI-2)14 b(included)264 1554 y(the)k(results)h(of)f(the)h(CCS)f(w)o=0A=
(orking)g(pap)q(er)h(and)g(extended)g(them)g(to)e(all)j(device)g(t)o(yp)q=0A=
(es.)264 1618 y(It)13 b(also)h(added)h(cac)o(hing)f(commands,)g(p)q=0A=
(erformance)g(enhancemen)o(t)g(features,)g(and)g(other)264=0A=
1682 y(functions)h(that)f(X3T9.2)f(deemed)i(w)o(orth)o(while.)20=0A=
b(While)c(SCSI-2)f(has)g(gone)f(w)o(ell)i(b)q(ey)o(ond)264=0A=
1747 y(the)e(original)i(SCSI)f(standard)f(\(no)o(w)f(referred)i(to)f(as)g=0A=
(SCSI-1\),)g(it)h(retains)g(a)f(high)h(degree)264 1811 =
y(of)f(compatibilit)o=0A=
(y)j(with)f(SCSI-1)f(devices.)150 1962 y FD(1.7.2.1)54 b(SCSI)17=0A=
b(phases)150 2080 y =
FH(The)d(\\SCSI)f(bus")h(transfers)e(data)h(and)g(state)g=0A=
(information)g(b)q(et)o(w)o(een)h(in)o(terconnected)g(SCSI)g(devices.)150=0A=
2144 y(A)21 =
b(single)h(transaction)e(b)q(et)o(w)o(een)h(an)f(\\initiator")h=0A=
(and)g(a)f(\\target")f(can)h(in)o(v)o(olv)o(e)i(up)f(to)e(8)i(distinct)15=
0=0A=
2208 y(\\phases.")27 b(These)18 b(phases)g(are)g(almost)f(en)o(tirely)i=0A=
(determined)g(b)o(y)f(the)f(target)g(\(e.g.,)g(the)g(hard)h(disk)150=0A=
2273 y(driv)o(e\).)i(The)14 =
b(curren)o(t)g(phase)g(can)g(b)q(e)g(determined)i=0A=
(from)d(an)h(examination)g(of)g(\014v)o(e)g(SCSI)g(bus)h(signals,)150=0A=
2337 y(as)g(sho)o(wn)g(in)h(T)l(able)g(1.1)e([LXT91)o(,)h(p.)g(57].)221=0A=
2425 =
y(Some)h(con)o(trollers)h(\(notably)g(the)g(inexp)q(ensiv)o(e)i(Seagate)=0A=
d(con)o(troller\))h(require)g(direct)h(manipula-)150 2489 =
y(tion)e(of)g(the)g=0A=
(SCSI)h(bus|other)g(con)o(trollers)f(automatically)h(handle)g(these)g(lo)=
o=0A=
(w-lev)o(el)g(details.)24 b(Eac)o(h)150 2554 y(of)15 b(the)g(eigh)o(t)g=0A=
(phases)h(will)h(b)q(e)f(describ)q(ed)h(in)f(detail.)p eop=0A=
%%Page: 44 55=0A=
44 54 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(44)p 471 86 1159 2=0A=
v 470 150 2 65 v 496 131 a(-SEL)p 620 150 V 50 w(-BSY)p 776=0A=
150 V 51 w(-MSG)p 944 150 V 49 w(-C/D)p 1099 150 V 50 w(-I/O)p=0A=
1238 150 V 50 w(PHASE)p 1628 150 V 471 152 1159 2 v 471 162=0A=
V 470 226 2 65 v 520 207 a(HI)p 620 226 V 104 w(HI)p 776 226=0A=
V 126 w(?)p 944 226 V 140 w(?)p 1099 226 V 127 w(?)p 1238 226=0A=
V 84 w(BUS)16 b(FREE)p 1628 226 V 471 228 1159 2 v 470 292=0A=
2 65 v 520 273 a(HI)p 620 292 V 97 w(LO)p 776 292 V 120 w(?)p=0A=
944 292 V 140 w(?)p 1099 292 V 127 w(?)p 1238 292 V 84 w(ARBITRA)l(TION)p=0A=
1628 292 V 471 294 1159 2 v 470 358 2 65 v 538 339 a(I)p 620=0A=
358 V 102 w(I&T)p 776 358 V 110 w(?)p 944 358 V 140 w(?)p 1099=0A=
358 V 127 w(?)p 1238 358 V 84 w(SELECTION)p 1628 358 V 471=0A=
360 1159 2 v 470 424 2 65 v 529 405 a(T)p 620 424 V 94 w(I&T)p=0A=
776 424 V 110 w(?)p 944 424 V 140 w(?)p 1099 424 V 127 w(?)p=0A=
1238 424 V 84 w(RESELECTION)p 1628 424 V 471 426 1159 2 v 470=0A=
490 2 65 v 520 471 a(HI)p 620 490 V 97 w(LO)p 776 490 V 106=0A=
w(HI)p 944 490 V 111 w(HI)p 1099 490 V 97 w(HI)p 1238 490 V=0A=
70 w(D)o(A)l(T)l(A)f(OUT)p 1628 490 V 471 492 1159 2 v 470=0A=
556 2 65 v 520 537 a(HI)p 620 556 V 97 w(LO)p 776 556 V 106=0A=
w(HI)p 944 556 V 111 w(HI)p 1099 556 V 91 w(LO)p 1238 556 V=0A=
63 w(D)o(A)l(T)l(A)g(IN)p 1628 556 V 471 558 1159 2 v 470 622=0A=
2 65 v 520 603 a(HI)p 620 622 V 97 w(LO)p 776 622 V 106 w(HI)p=0A=
944 622 V 104 w(LO)p 1099 622 V 91 w(HI)p 1238 622 V 70 w(COMMAND)p=0A=
1628 622 V 471 624 1159 2 v 470 688 2 65 v 520 669 a(HI)p 620=0A=
688 V 97 w(LO)p 776 688 V 106 w(HI)p 944 688 V 104 w(LO)p 1099=0A=
688 V 85 w(LO)p 1238 688 V 63 w(ST)l(A)l(TUS)p 1628 688 V 471=0A=
690 1159 2 v 470 754 2 65 v 520 735 a(HI)p 620 754 V 97 w(LO)p=0A=
776 754 V 99 w(LO)p 944 754 V 98 w(LO)p 1099 754 V 91 w(HI)p=0A=
1238 754 V 70 w(MESSA)o(GE)g(OUT)p 1628 754 V 471 756 1159=0A=
2 v 470 820 2 65 v 520 801 a(HI)p 620 820 V 97 w(LO)p 776 820=0A=
V 99 w(LO)p 944 820 V 98 w(LO)p 1099 820 V 85 w(LO)p 1238 820=0A=
V 63 w(MESSA)o(GE)g(IN)p 1628 820 V 471 822 1159 2 v 496 867=0A=
a =
Fl(I)g(=3D)i(In)q(i)r(t)r(i)r(a)r(t)q(o)s(r)h(As)r(s)r(e)r(r)r(t)q(s)r(,)=
g(T)=0A=
e(=3D)h(T)m(a)r(r)r(g)r(e)r(t)h(As)r(s)r(e)r(r)r(t)q(s)r(,)g(?)j(=3D)c(HI=
)h(or)g=0A=
(LO)630 964 y FH(T)l(able)e(1.1:)i(SCSI)e(Bus)g(Phase)f(Determination)150=0A=
1130 y(BUS)h(FREE)f(Phase)450 1194 =
y(The)c(BUS)h(FREE)f(phase)g(indicates)i=0A=
(that)d(the)h(SCSI)h(bus)g(is)f(idle)i(and)e(is)h(not)e(curren)o(tly)450=0A=
1258 y(b)q(eing)16 b(used.)150 1362 y(ARBITRA)l(TION)i(Phase)450=0A=
1426 y(The)c(ARBITRA)l(TION)j(phase)d(is)h(en)o(tered)f(when)g(a)g(SCSI)h=0A=
(device)g(attempts)e(to)h(gain)450 1491 y(con)o(trol)f(of)f(the)i(SCSI)f=0A=
(bus.)20 b(Arbitration)13 =
b(can)h(start)d(only)j(if)g(the)f(bus)g(w)o(as)g=0A=
(previously)450 1555 y(in)j(the)g(BUS)g(FREE)f(phase.)21 b(During)16=0A=
b(arbitration,)f(the)h(arbitrating)f(device)i(asserts)450 1619=0A=
y(its)j(SCSI)h(ID)g(on)f(the)g(D)o(A)l(T)l(A)g(BUS.)36 b(F)l(or)20=0A=
b(example,)i(if)e(the)h(arbitrating)f(device's)450 1684 =
y(SCSI)d(ID)g(is)g=0A=
(2,)f(then)h(the)g(device)h(will)g(assert)e FE(0x04)p FH(.)24=0A=
b(If)17 b(m)o(ultiple)h(devices)g(attempt)450 1748 y(sim)o(ultaneous)e=0A=
(arbitration,)e(the)h(device)i(with)e(the)g(highest)h(SCSI)g(ID)f(will)i=0A=
(win.)j(Al-)450 1812 y(though)15 =
b(ARBITRA)l(TION)i(is)f(optional)f(in)h(the)=0A=
f(SCSI-1)h(standard,)e(it)i(is)f(a)g(required)450 1877 =
y(phase)h(in)g(the)f=0A=
(SCSI-2)h(standard.)150 1980 y(SELECTION)g(Phase)450 2045 =
y(After)g(ARBITRA)l=0A=
(TION,)h(the)f(arbitrating)g(device)h(\(no)o(w)e(called)j(the)e(initiator=
\))g=0A=
(as-)450 2109 =
y(serts)g(the)h(SCSI)g(ID)g(of)g(the)f(target)g(on)g(the)h(D)o=0A=
(A)l(T)l(A)g(BUS.)25 b(The)17 b(target,)e(if)i(presen)o(t,)450=0A=
2173 =
y(will)i(ac)o(kno)o(wledge)f(the)g(selection)h(b)o(y)f(raising)g(the)g=0A=
(-BSY)g(line.)29 b(This)18 b(line)i(remains)450 2238 y(activ)o(e)15=0A=
b(as)g(long)h(as)e(the)i(target)e(is)h(connected)h(to)f(the)g(initiator.)=
150=0A=
2341 y(RESELECTION)i(Phase)450 2406 =
y(The)d(SCSI)g(proto)q(col)f(allo)o(ws)h=0A=
(a)f(device)h(to)f(disconnect)i(from)d(the)i(bus)g(while)h(pro)q(cess-)45=
0=0A=
2470 y(ing)i(a)f(request.)23 b(When)17 =
b(the)f(device)i(is)f(ready)l(,)f(it)h=0A=
(reconnects)g(to)e(the)i(host)f(adapter.)450 2534 y(The)e(RESELECTION)h=0A=
(phase)e(is)h(iden)o(tical)i(to)c(the)i(SELECTION)g(phase,)g(with)g(the)p=0A=
eop=0A=
%%Page: 45 56=0A=
45 55 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(45)450 88 y(exception)13=0A=
b(that)f(it)h(is)f(used)h(b)o(y)f(the)h(disconnected)h(target)d(to)h=0A=
(reconnect)g(to)g(the)g(origi-)450 153 y(nal)f(initiator.)19=0A=
b(Driv)o(ers)11 b(whic)o(h)g(do)g(not)f(curren)o(tly)i(supp)q(ort)f=0A=
(RESELECTION)h(do)e(not)450 217 y(allo)o(w)16 =
b(the)g(SCSI)h(target)e(to)g=0A=
(disconnect.)23 b(RESELECTION)18 b(should)f(b)q(e)f(supp)q(orted)450=0A=
281 y(b)o(y)j(all)i(driv)o(ers,)f(ho)o(w)o(ev)o(er,)g(so)f(that)g(m)o=0A=
(ultiple)i(SCSI)f(devices)h(can)f(sim)o(ultaneously)450 346=0A=
y(pro)q(cess)f(commands.)29 b(This)19 =
b(allo)o(ws)g(dramatically)g(increased)=0A=
g(throughput)g(due)g(to)450 410 =
y(in)o(terlea)o(v)o(ed)d(I/O)g(requests.)150=0A=
514 y(COMMAND)f(Phase)450 578 =
y(During)d(this)h(phase,)f(6,)g(10,)f(or)h(12)f=0A=
(b)o(ytes)h(of)f(command)h(information)g(are)f(transferred)450=0A=
642 y(from)j(the)i(initiator)g(to)e(the)h(target.)150 746 =
y(D)o(A)l(T)l(A)g=0A=
(OUT)g(and)h(D)o(A)l(T)l(A)f(IN)h(Phases)450 810 =
y(During)f(these)f(phases,)h=0A=
(data)e(are)i(transferred)e(b)q(et)o(w)o(een)i(the)g(initiator)g(and)f(th=
e)h=0A=
(tar-)450 875 y(get.)j(F)l(or)9 b(example,)j(the)e(D)o(A)l(T)l(A)g(OUT)h=0A=
(phase)f(transfers)f(data)h(from)f(the)i(host)e(adapter)450=0A=
939 y(to)14 b(the)g(disk)h(driv)o(e.)20 b(The)15 b(D)o(A)l(T)l(A)f(IN)g=0A=
(phase)h(transfers)e(data)h(from)f(the)i(disk)g(driv)o(e)g(to)450=0A=
1003 y(the)f(host)f(adapter.)19 b(If)14 =
b(the)g(SCSI)g(command)g(do)q(es)g=0A=
(not)f(require)i(data)e(transfer,)g(then)450 1068 =
y(neither)j(phase)g(is)f=0A=
(en)o(tered.)150 1171 y(ST)l(A)l(TUS)h(Phase)450 1236 =
y(This)c(phase)f(is)g=0A=
(en)o(tered)h(after)e(completion)i(of)f(all)h(commands,)f(and)g(allo)o(ws=
)g=0A=
(the)g(target)450 1300 y(to)16 b(send)g(a)g(status)g(b)o(yte)g(to)f(the)i=0A=
(initiator.)23 b(There)17 =
b(are)f(nine)h(v)m(alid)h(status)d(b)o(ytes,)h(as)=0A=
450 1364 y(sho)o(wn)f(in)i(T)l(able)g(1.2)d([ANS,)i(p.)f(77].)21=0A=
b(Note)15 b(that)g(since)i(bits)1516 1348 y Fm(6)1552 1364=0A=
y FH(1{5)e(are)g(used)i(for)e(the)450 1429 y(status)g(co)q(de)h(\(the)g=0A=
(other)f(bits)i(are)e(reserv)o(ed\),)g(the)h(status)f(b)o(yte)h(should)h(=
b)q=0A=
(e)f(mask)o(ed)450 1493 y(with)g FE(0x3e)e FH(b)q(efore)i(b)q(eing)g=0A=
(examined.)450 1577 =
y(The)f(meanings)h(of)f(the)g(three)g(most)f(imp)q(ortan)=0A=
o(t)h(status)f(co)q(des)h(are)g(outlined)i(b)q(elo)o(w:)450=0A=
1690 y(GOOD)159 b(The)15 =
b(op)q(eration)h(completed)g(successfully)l(.)450=0A=
1858 y(CHECK)f(CONDITION)750 1922 y(An)e(error)e(o)q(ccurred.)20=0A=
b(The)12 b(REQUEST)h(SENSE)g(command)f(should)750 1987 =
y(b)q(e)g(used)h(to)e=0A=
(\014nd)h(out)g(more)f(information)h(ab)q(out)g(the)g(error)f(\(see)h(sec=
-)=0A=
750 2051 y(tion)j(1.7.3\).)450 2155 y(BUSY)175 b(The)12 =
b(device)h(w)o(as)d=0A=
(unable)j(to)e(accept)h(a)f(command.)19 b(This)12 b(ma)o(y)f(o)q(ccur)750=0A=
2219 y(during)16 =
b(a)f(self-test)g(or)g(shortly)g(after)g(p)q(o)o(w)o(er-up.)=0A=
150 2332 y(MESSA)o(GE)g(OUT)g(and)g(MESSA)o(GE)g(IN)h(Phases)450=0A=
2397 =
y(Additional)j(information)f(is)g(transferred)f(b)q(et)o(w)o(een)h(the)g=0A=
(target)e(and)i(the)g(initiator.)450 2461 y(This)23 =
b(information)f(ma)o(y)g=0A=
(regard)f(the)i(status)e(of)h(an)g(outstanding)g(command,)h(or)p=0A=
150 2501 720 2 v 207 2533 a FA(6)225 2548 y Fl(Bi)r(t)18 =
b(0)e(is)i(th)q(e)h=0A=
(le)q(a)r(s)r(t)f(si)q(g)r(n)s(i)r(\014)s(c)r(a)r(n)r(t)g(bi)r(t)q(.)p=0A=
eop=0A=
%%Page: 46 57=0A=
46 56 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(46)p 547 78 1007 2=0A=
v 546 145 2 68 v 572 126 a(V)l(alue)682 109 y FG(y)p 729 145=0A=
V 755 126 a FH(Status)p 1552 145 V 547 147 1007 2 v 547 157=0A=
V 546 221 2 65 v 572 202 a(0x00)p 729 221 V 90 w(GOOD)p 1552=0A=
221 V 547 223 1007 2 v 546 287 2 65 v 572 268 a(0x02)p 729=0A=
287 V 90 w(CHECK)15 b(CONDITION)p 1552 287 V 547 289 1007 2=0A=
v 546 353 2 65 v 572 334 a(0x04)p 729 353 V 90 w(CONDITION)h(MET)p=0A=
1552 353 V 547 355 1007 2 v 546 419 2 65 v 572 400 a(0x08)p=0A=
729 419 V 90 w(BUSY)p 1552 419 V 547 421 1007 2 v 546 485 2=0A=
65 v 572 466 a(0x10)p 729 485 V 90 w(INTERMEDIA)l(TE)p 1552=0A=
485 V 547 487 1007 2 v 546 551 2 65 v 572 532 a(0x14)p 729=0A=
551 V 90 w(INTERMEDIA)l(TE-CONDITION)h(MET)p 1552 551 V 547=0A=
553 1007 2 v 546 617 2 65 v 572 598 a(0x18)p 729 617 V 90 w(RESER)-5=0A=
b(V)g(A)l(TION)17 b(CONFLICT)p 1552 617 V 547 619 1007 2 v=0A=
546 683 2 65 v 572 664 a(0x22)p 729 683 V 90 w(COMMAND)d(TERMINA)l(TED)p=0A=
1552 683 V 547 685 1007 2 v 546 749 2 65 v 572 730 a(0x28)p=0A=
729 749 V 90 w(QUEUE)h(FULL)p 1552 749 V 547 751 1007 2 v 572=0A=
781 a Fe(y)606 796 y =
Fl(Af)q(t)r(e)r(r)j(m)q(a)r(s)r(k)r(i)r(n)s(g)h(wi)r(t)q=0A=
(h)h(0x)r(3)r(e)754 893 y =
FH(T)l(able)c(1.2:)j(SCSI)c(Status)g(Co)q(des)450=0A=
1051 y(ma)o(y)20 =
b(b)q(e)i(a)e(request)h(for)f(a)h(c)o(hange)f(of)h(proto)q=0A=
(col.)37 b(Multiple)22 b(MESSA)o(GE)f(IN)g(and)450 1115 =
y(MESSA)o(GE)g(OUT)g=0A=
(phases)g(ma)o(y)f(o)q(ccur)i(during)g(a)f(single)h(SCSI)g(transaction.)3=
7=0A=
b(If)450 1179 y(RESELECTION)18 =
b(is)f(supp)q(orted,)g(the)g(driv)o(er)g(m)o=0A=
(ust)f(b)q(e)h(able)g(to)f(correctly)h(pro)q(cess)450 1244=0A=
y(the)12 b(SA)-5 b(VE)12 =
b(D)o(A)l(T)l(A)g(POINTERS,)g(RESTORE)h(POINTERS,)g=0A=
(and)f(DISCONNECT)450 1308 y(messages.)23 b(Although)17 =
b(required)h(b)o(y)e=0A=
(the)h(SCSI-2)g(standard,)f(some)g(devices)i(do)e(not)450 1372=0A=
y(automatically)c(send)h(a)f(SA)-5 b(VE)12 b(D)o(A)l(T)l(A)g(POINTERS)h=0A=
(message)e(prior)h(to)g(a)f(DISCON-)450 1437 y(NECT)k(message.)150=0A=
1590 y Fq(1.7.3)55 b(SCSI)20 b(Commands)150 1707 y FH(Eac)o(h)g(SCSI)g=0A=
(command)g(is)g(6,)h(10,)f(or)f(12)h(b)o(ytes)f(long.)35 b(The)20=0A=
b(follo)o(wing)g(commands)g(m)o(ust)f(b)q(e)i(w)o(ell)150 1772=0A=
y(understo)q(o)q(d)16 =
b(b)o(y)f(a)g(SCSI)h(driv)o(er)f(dev)o(elop)q(er.)150=0A=
1889 y(REQUEST)h(SENSE)450 1953 y(Whenev)o(er)21 =
b(a)g(command)f(returns)h(a)=0A=
f(CHECK)h(CONDITION)h(status,)f(the)g(high-)450 2018 =
y(lev)o(el)h(Lin)o(ux)g=0A=
(SCSI)f(co)q(de)g(automatically)g(obtains)g(more)f(information)g(ab)q(out=
)h=0A=
(the)450 2082 y(error)16 b(b)o(y)h(executing)h(the)f(REQUEST)g(SENSE.)25=0A=
b(This)18 b(command)e(returns)h(a)f(sense)450 2146 y(k)o(ey)k(and)f(a)h=0A=
(sense)g(co)q(de)g(\(called)h(the)f(\\additional)h(sense)f(co)q(de,")h(or=
)e=0A=
(ASC,)g(in)i(the)450 2211 y(SCSI-2)14 b(standard)f([ANS]\).)19=0A=
b(Some)13 =
b(SCSI)h(devices)h(ma)o(y)e(also)g(rep)q(ort)g(an)h(\\additional)=0A=
450 2275 y(sense)k(co)q(de)g(quali\014er")g(\(ASCQ\).)26 b(The)18=0A=
b(16)f(p)q(ossible)i(sense)f(k)o(eys)f(are)g(describ)q(ed)i(in)450=0A=
2339 y(T)l(able)c(1.3.)k(F)l(or)14 b(information)g(on)h(the)f(ASC)h(and)g=0A=
(ASCQ,)f(please)i(refer)e(to)g(the)g(SCSI)450 2404 =
y(standard)h([ANS])g(or)f=0A=
(to)h(a)g(SCSI)h(device)g(tec)o(hnical)h(man)o(ual.)p eop=0A=
%%Page: 47 58=0A=
47 57 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(47)p 649 692 803 2=0A=
v 648 756 2 65 v 674 737 a(Sense)16 b(Key)p 901 756 V 50 w(Description)p=0A=
1450 756 V 649 758 803 2 v 649 768 V 648 832 2 65 v 674 813=0A=
a FE(0x00)p 901 832 V 157 w FH(NO)g(SENSE)p 1450 832 V 649=0A=
834 803 2 v 648 898 2 65 v 674 879 a FE(0x01)p 901 898 V 157=0A=
w FH(RECO)o(VERED)g(ERR)o(OR)p 1450 898 V 649 900 803 2 v 648=0A=
964 2 65 v 674 945 a FE(0x02)p 901 964 V 157 w FH(NOT)f(READ)o(Y)p=0A=
1450 964 V 649 966 803 2 v 648 1030 2 65 v 674 1011 a FE(0x03)p=0A=
901 1030 V 157 w FH(MEDIUM)g(ERR)o(OR)p 1450 1030 V 649 1032=0A=
803 2 v 648 1096 2 65 v 674 1077 a FE(0x04)p 901 1096 V 157=0A=
w FH(HARD)o(W)-5 b(ARE)15 b(ERR)o(OR)p 1450 1096 V 649 1098=0A=
803 2 v 648 1162 2 65 v 674 1143 a FE(0x05)p 901 1162 V 157=0A=
w FH(ILLEGAL)h(REQUEST)p 1450 1162 V 649 1164 803 2 v 648 1228=0A=
2 65 v 674 1209 a FE(0x06)p 901 1228 V 157 w FH(UNIT)g(A)l(TTENTION)p=0A=
1450 1228 V 649 1230 803 2 v 648 1294 2 65 v 674 1275 a FE(0x07)p=0A=
901 1294 V 157 w FH(D)o(A)l(T)l(A)f(PR)o(OTECT)p 1450 1294=0A=
V 649 1296 803 2 v 648 1360 2 65 v 674 1341 a FE(0x08)p 901=0A=
1360 V 157 w FH(BLANK)h(CHECK)p 1450 1360 V 649 1362 803 2=0A=
v 648 1426 2 65 v 674 1407 a FE(0x09)p 901 1426 V 157 w =
FH(\(V)l(endor)f(sp)q=0A=
(eci\014c)i(error\))p 1450 1426 V 649 1428 803 2 v 648 1492=0A=
2 65 v 674 1473 a FE(0x0a)p 901 1492 V 157 w FH(COPY)e(ABOR)l(TED)p=0A=
1450 1492 V 649 1494 803 2 v 648 1558 2 65 v 674 1539 a FE(0x0b)p=0A=
901 1558 V 157 w FH(ABOR)l(TED)h(COMMAND)p 1450 1558 V 649=0A=
1560 803 2 v 648 1624 2 65 v 674 1605 a FE(0x0c)p 901 1624=0A=
V 157 w FH(EQUAL)p 1450 1624 V 649 1626 803 2 v 648 1690 2=0A=
65 v 674 1671 a FE(0x0d)p 901 1690 V 157 w =
FH(V)o(OLUME)f(O)o(VERFLO)o(W)p=0A=
1450 1690 V 649 1692 803 2 v 648 1756 2 65 v 674 1737 a FE(0x0e)p=0A=
901 1756 V 157 w FH(MISCOMP)l(ARE)p 1450 1756 V 649 1758 803=0A=
2 v 648 1823 2 65 v 674 1803 a FE(0x0f)p 901 1823 V 157 w FH(RESER)-5=0A=
b(VED)p 1450 1823 V 649 1824 803 2 v 710 1901 a(T)l(able)16=0A=
b(1.3:)j(Sense)d(Key)g(Descriptions)p eop=0A=
%%Page: 48 59=0A=
48 58 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(48)150 88 y(TEST)15=0A=
b(UNIT)h(READ)o(Y)450 153 =
y(This)f(command)g(is)h(used)f(to)f(test)g(the)h=0A=
(target's)f(status.)19 b(If)c(the)g(target)e(can)i(accept)g(a)450=0A=
217 =
y(medium-access)d(command)f(\(e.g.,)f(a)h(READ)g(or)f(a)h(WRITE\),)f(the)=0A=
h(command)g(returns)450 281 y(with)21 b(a)g(GOOD)g(status.)37=0A=
b(Otherwise,)23 b(the)f(command)f(returns)g(with)g(a)g(CHECK)450=0A=
346 y(CONDITION)12 =
b(status)e(and)i(a)e(sense)i(k)o(ey)f(of)g(NOT)g(READ)o=0A=
(Y.)18 b(This)12 b(resp)q(onse)g(usually)450 410 y(indicates)17=0A=
b(that)d(the)h(target)f(is)i(completing)g(p)q(o)o(w)o(er-on)f(self-tests.=
)150=0A=
514 y(INQUIR)l(Y)102 b(This)13 =
b(command)f(returns)g(the)g(target's)f(mak)o=0A=
(e,)g(mo)q(del,)j(and)e(device)i(t)o(yp)q(e.)19 b(The)12 b(high-)450=0A=
578 y(lev)o(el)18 b(Lin)o(ux)f(co)q(de)g(uses)f(this)h(command)f(to)g=0A=
(di\013eren)o(tiate)i(among)d(magnetic)i(disks,)450 642 =
y(optical)c(disks,)g=0A=
(and)f(tap)q(e)g(driv)o(es)h(\(the)f(high-lev)o(el)i(co)q(de)f(curren)o(t=
ly)g=0A=
(do)q(es)f(not)g(supp)q(ort)450 707 =
y(prin)o(ters,)j(pro)q(cessors,)g(or)f=0A=
(juk)o(e)i(b)q(o)o(xes\).)150 810 y(READ)f(and)h(WRITE)450=0A=
875 y(These)21 =
b(commands)g(are)f(used)h(to)f(transfer)g(data)g(from)g(and)h=0A=
(to)f(the)h(target.)35 b(Y)l(ou)450 939 y(should)19 =
b(b)q(e)g(sure)f(y)o(our)=0A=
g(driv)o(er)g(can)h(supp)q(ort)f(simpler)i(commands,)e(suc)o(h)g(as)g(TES=
T)=0A=
450 1003 =
y(UNIT)k(READ)o(Y)g(and)g(INQUIR)l(Y,)h(b)q(efore)f(attempting)f(to)=0A=
g(use)h(the)g(READ)g(and)450 1068 y(WRITE)16 b(commands.)150=0A=
1221 y Fq(1.7.4)55 b(Getting)18 b(Started)150 1338 y =
FH(The)h(author)e(of)h=0A=
(a)g(lo)o(w-lev)o(el)i(device)g(driv)o(er)f(will)h(need)f(to)f(ha)o(v)o(e=
)g=0A=
(an)g(understanding)i(of)e(ho)o(w)g(in)o(ter-)150 1403 y(ruptions)c(are)g=0A=
(handled)i(b)o(y)d(the)h(k)o(ernel.)21 b(A)o(t)13 =
b(minim)o(um,)i(the)f(k)o=0A=
(ernel)h(functions)g(that)e(disable)i(\()p FE(cli\(\))p FH(\))150=0A=
1467 y(and)20 b(enable)h(\()p FE(sti\(\))p =
FH(\))e(in)o(terruptions)i(should)=0A=
g(b)q(e)g(understo)q(o)q(d.)34 b(The)21 b(sc)o(heduling)h(functions)f=0A=
(\(e.g.,)150 1531 y FE(schedule\(\))p FH(,)16 b FE(sleepon\(\))p=0A=
FH(,)f(and)j FE(wakeup\(\))p =
FH(\))d(ma)o(y)h(also)h(b)q(e)h(needed)g(b)o(y)f=0A=
(some)g(driv)o(ers.)25 b(A)17 b(detailed)150 1596 =
y(explanation)f(of)f(these)=0A=
g(functions)h(can)g(b)q(e)g(found)f(in)h(section)g(1.6.)150=0A=
1749 y Fq(1.7.5)55 b(Before)18 b(Y)-5 b(ou)19 b(Begin:)24 b(Gathering)18=0A=
b(T)-5 b(o)r(ols)150 1866 y FH(Before)13 =
b(y)o(ou)g(b)q(egin)h(to)e(write)h=0A=
(a)g(SCSI)h(driv)o(er)f(for)f(Lin)o(ux,)j(y)o(ou)d(will)j(need)f(to)e(obt=
ain)=0A=
h(sev)o(eral)g(resources.)221 1954 =
y(The)k(most)f(imp)q(ortan)o(t)g(is)i(a)f=0A=
(b)q(o)q(otable)g(Lin)o(ux)h(system|preferably)g(one)f(whic)o(h)h(b)q(o)q=0A=
(ots)f(from)f(an)150 2018 y(IDE,)f(RLL,)i(or)e(MFM)g(hard)h(disk.)22=0A=
b(During)16 =
b(the)g(dev)o(elopmen)o(t)g(of)f(y)o(our)h(new)g(SCSI)g(driv)o=0A=
(er,)g(y)o(ou)f(will)150 2083 y(rebuild)21 =
b(the)f(k)o(ernel)g(and)f(reb)q(o)=0A=
q(ot)h(y)o(our)e(system)h(man)o(y)g(times.)33 b(Programming)18=0A=
b(errors)h(ma)o(y)g(result)150 2147 =
y(in)e(the)g(destruction)g(of)e(data)h=0A=
(on)g(y)o(our)g(SCSI)h(driv)o(e)g FC(and)k =
FH(on)c(y)o(our)e(non-SCSI)j(driv)=0A=
o(e.)24 b FC(Back)17 b(up)h(your)150 2211 =
y(system)e(b)n(efor)n(e)f(you)i(b)n=0A=
(e)n(gin)s FH(.)221 2299 =
y(The)g(installed)h(Lin)o(ux)g(system)f(can)g(b)q(e)=0A=
g(quite)h(minimal:)25 b(the)17 =
b(GCC)f(compiler)i(distribution)g(\(in-)150=0A=
2364 y(cluding)e(libraries)g(and)e(the)h(binary)g(utilities\),)h(an)e=0A=
(editor,)g(and)h(the)f(k)o(ernel)h(source)f(are)g(all)i(y)o(ou)d(need.)15=
0=0A=
2428 y(Additional)k(to)q(ols)e(lik)o(e)h FE(od)p FH(,)f FE(hexdump)p=0A=
FH(,)e(and)j FE(less)e FH(will)j(b)q(e)f(quite)g(helpful.)22=0A=
b(All)16 b(of)f(these)g(to)q(ols)g(will)i(\014t)p eop=0A=
%%Page: 49 60=0A=
49 59 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(49)150 88 y(on)15=0A=
b(an)g(inexp)q(ensiv)o(e)j(20-30)c(MB)h(hard)g(disk.)927 72=0A=
y Fm(7)947 88 y FH(.)221 176 =
y(Do)q(cumen)o(tation)c(is)i(essen)o(tial.)19=0A=
b(A)o(t)12 =
b(minim)o(um,)h(y)o(ou)f(will)h(need)g(a)e(tec)o(hnical)j(man)o=0A=
(ual)e(for)f(y)o(our)g(host)150 241 y(adapter.)19 =
b(Since)d(Lin)o(ux)f(is)g=0A=
(freely)g(distributable,)h(and)e(since)i(y)o(ou)e(\(ideally\))h(w)o(an)o(=
t)e=0A=
(to)h(distribute)h(y)o(our)150 305 =
y(source)h(co)q(de)g(freely)l(,)h(a)o(v)o=0A=
(oid)e(non-disclosure)j(agreemen)o(ts)d(\(ND)o(A\).)20 b(Most)15=0A=
b(ND)o(A's)g(will)i(prohibit)g(y)o(ou)150 369 =
y(from)e(releasing)i(y)o(our)e=0A=
(source)g(co)q(de|y)o(ou)i(migh)o(t)e(b)q(e)i(allo)o(w)o(ed)f(to)f(releas=
e)h=0A=
(an)f(ob)s(ject)h(\014le)g(con)o(taining)150 434 y(y)o(our)f(driv)o(er,)g=0A=
(but)g(this)h(is)g(simply)g(not)f(acceptable)h(in)g(the)f(Lin)o(ux)i(comm=
)o=0A=
(unit)o(y)e(at)f(this)i(time.)221 522 y(A)c(man)o(ual)h(that)f(explains)i=0A=
(the)f(SCSI)g(standard)f(will)j(b)q(e)e(helpful.)21 b(Usually)14=0A=
b(the)f(tec)o(hnical)h(man)o(ual)150 586 =
y(for)f(y)o(our)g(disk)i(driv)o(e)f=0A=
(will)h(b)q(e)g(su\016cien)o(t,)f(but)g(a)f(cop)o(y)h(of)f(the)h(SCSI)g=0A=
(standard)f(will)j(often)d(b)q(e)i(helpful.)1929 569 y Fm(8)221=0A=
674 y FH(Before)g(y)o(ou)f(start,)g(mak)o(e)h(hard)g(copies)h(of)e=0A=
FE(hosts.h)p FH(,)g FE(scsi.h)p FH(,)g(and)h(one)h(of)e(the)i(existing)g=0A=
(driv)o(ers)150 738 =
y(in)g(the)f(Lin)o(ux)i(k)o(ernel.)j(These)c(will)h(pro)o=0A=
(v)o(e)d(to)h(b)q(e)h(useful)g(references)g(while)h(y)o(ou)e(write)g(y)o(=
our)=0A=
f(driv)o(er.)150 891 y Fq(1.7.6)55 b(The)19 =
b(Lin)n(ux)f(SCSI)h(In)n(terface)=0A=
150 1009 y =
FH(The)g(high-lev)o(el)h(SCSI)f(in)o(terface)g(in)g(the)g(Lin)o=0A=
(ux)g(k)o(ernel)g(manages)f(all)h(of)f(the)h(in)o(teraction)g(b)q(et)o(w)=
o=0A=
(een)150 1073 y(the)d(k)o(ernel)g(and)f(the)h(lo)o(w-lev)o(el)h(SCSI)f=0A=
(device)h(driv)o(er.)k(Because)16 =
b(of)f(this)h(la)o(y)o(ered)f(design,)h(a)g=0A=
(lo)o(w-lev)o(el)150 1137 =
y(SCSI)g(driv)o(er)h(need)f(only)h(pro)o(vide)f(a)f=0A=
(few)h(basic)h(services)f(to)f(the)h(high-lev)o(el)i(co)q(de.)23=0A=
b(The)16 b(author)f(of)g(a)150 1202 =
y(lo)o(w-lev)o(el)j(driv)o(er)f(do)q(es)g=0A=
(not)f(need)h(to)f(understand)h(the)f(in)o(tricacies)i(of)e(the)h(k)o(ern=
el)g=0A=
(I/O)g(system)f(and,)150 1266 =
y(hence,)g(can)f(write)h(a)e(lo)o(w-lev)o(el)j=0A=
(driv)o(er)f(in)g(a)e(relativ)o(ely)j(short)d(amoun)o(t)h(of)g(time.)221=0A=
1354 y(Tw)o(o)c(main)h(structures)g(\()p FE(Scsi_Host)f FH(and)h=0A=
FE(Scsi_Cmnd)p =
FH(\))f(are)h(used)g(to)g(comm)o(unicate)g(b)q(et)o(w)o(een)h=0A=
(the)150 1418 y(high-lev)o(el)18 =
b(co)q(de)d(and)h(the)f(lo)o(w-lev)o(el)i=0A=
(co)q(de.)j(The)c(next)f(t)o(w)o(o)f(sections)h(pro)o(vide)h(detailed)h=0A=
(information)150 1483 y(ab)q(out)e(these)g(structures)g(and)h(the)f=0A=
(requiremen)o(ts)h(of)e(the)i(lo)o(w-lev)o(el)g(driv)o(er.)150=0A=
1636 y Fq(1.7.7)55 b(The)19 b Fp(Scsi)p 543 1636 16 2 v 17=0A=
w(Host)e Fq(Structure)150 1753 y FH(The)22 b FE(Scsi_Host)f=0A=
FH(structure)h(serv)o(es)g(to)f(describ)q(e)j(the)e(lo)o(w-lev)o(el)h(dri=
v)o=0A=
(er)g(to)e(the)h(high-lev)o(el)j(co)q(de.)150 1818 y(Usually)l(,)e(this)f=0A=
(description)g(is)g(placed)g(in)f(the)g(device)i(driv)o(er's)e(header)g=0A=
(\014le)h(in)g(a)e(C)h(prepro)q(cessor)150 1882 =
y(de\014nition,)c(as)d(sho)o=0A=
(wn)h(in)h(Figure)g(1.1.)221 1970 y(The)d FE(Scsi_Host)g =
FH(structure)g(is)h=0A=
(presen)o(ted)g(in)h(Figure)f(1.2.)k(Eac)o(h)c(of)f(the)g(\014elds)i(will=
)h=0A=
(b)q(e)e(explained)150 2034 =
y(in)i(detail)g(later)f(in)i(this)e(section.)p=0A=
150 2065 720 2 v 207 2097 a FA(7)225 2112 y =
Fl(A)i(us)q(e)r(d)j(20)e(M)q(B)i=0A=
(M)q(F)s(M)h(ha)r(r)r(d)e(di)r(s)r(k)g(an)r(d)h(co)q(n)r(t)q(r)r(o)r(l)r(=
l)r=0A=
(e)r(r)e(sh)r(o)r(u)s(l)r(d)h(co)r(s)q(t)g(le)q(s)r(s)f(th)q(a)s(n)h(US)s=
($)r=0A=
(1)s(0)r(0)r(.)207 2145 y FA(8)225 2160 y =
Fl(Th)r(e)i(Oc)r(t)r(o)r(b)t(e)r(r)=0A=
g(17)q(,)f(19)r(9)r(1)s(,)g(dr)q(a)s(f)q(t)g(of)f(th)r(e)h(SC)s(S)s(I)q(-=
)q=0A=
(2)h(st)q(a)r(n)s(d)s(a)r(r)r(d)g(do)s(c)r(u)s(m)t(e)r(n)q(t)g(is)e(a)o(v=
a)r=0A=
(i)r(l)r(a)r(b)s(l)q(e)i(vi)r(a)g(an)r(o)r(n)r(y)r(m)t(o)r(u)s(s)f(ftp)15=
0=0A=
2212 y(fro)r(m)j Fk(sunsite.u)o(nc)o(.ed)o(u)13 b Fl(in)21=0A=
b Fk(/pub/Linu)o(x/)o(dev)o(elo)o(pm)o(ent)o(/s)o(csi)o(-2)o(.ta)o(r.Z)o=0A=
Fl(,)14 b(an)r(d)22 =
b(is)e(a)o(v)o(a)r(i)r(l)r(a)s(b)r(l)r(e)h(fo)q(r)f(pu)s=0A=
(r)q(c)q(h)s(a)r(s)r(e)h(fro)r(m)150 2264 y(Gl)r(o)s(b)r(a)s(l)16=0A=
b(En)s(g)r(i)r(n)s(e)r(e)r(r)r(i)q(n)s(g)h(D)q(o)s(c)r(u)s(m)s(e)r(n)r(t)=
r(s)=0A=
f(\(2)q(8)r(0)s(5)h(M)q(c)r(G)s(a)r(w)r(,)f(Ir)q(v)r(i)r(n)s(e)r(,)g(CA)h=
(92)=0A=
r(7)r(1)r(4)s(\))q(,)f(\(8)q(0)s(0)r(\))r(-)q(8)r(5)r(4)s(-)q(7)r(1)s(7)r=
(9)h=0A=
(or)f(\(7)q(1)r(4)r(\))r(-)q(2)s(6)r(1)r(-)r(1)r(4)r(5)s(5)r(.)150=0A=
2316 =
y(Pl)r(e)r(a)r(s)r(e)j(re)q(f)q(e)r(r)f(to)g(do)s(c)r(u)s(m)s(e)r(n)r(t)=0A=
g(X3)r(.)q(1)s(3)r(1)r(-)r(1)r(9)r(9)s(X)s(.)k(In)c(ea)q(r)r(l)r(y)h(19)r=
(9)r=0A=
(3)r(,)f(th)q(e)h(m)q(a)r(n)r(u)r(a)s(l)f(co)r(s)q(t)h(US)s($)r(6)r(0)r({=
)s=0A=
(7)r(0)r(.)p eop=0A=
%%Page: 50 61=0A=
50 60 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(50)245 154 y FE(#define)23=0A=
b(FDOMAIN_16X0)46 b({)24 b("Future)f(Domain)g(TMC-16x0",)237=0A=
b(\\)842 219 y(fdomain_16x0_detect,)331 b(\\)842 283 =
y(fdomain_16x0_info,)379=0A=
b(\\)842 347 y(fdomain_16x0_command,)307 b(\\)842 412 =
y(fdomain_16x0_queue,)=0A=
355 b(\\)842 476 y(fdomain_16x0_abort,)g(\\)842 540 =
y(fdomain_16x0_reset,)g=0A=
(\\)842 605 y(NULL,)691 b(\\)842 669 y(fdomain_16x0_biosparam,)259=0A=
b(\\)842 734 y(1,)24 b(6,)f(64,)h(1)f(,0,)h(0})245 798 y(#endif)673=0A=
968 y FH(Figure)16 b(1.1:)j(Device)d(Driv)o(er)f(Header)g(File)245=0A=
1169 y FE(typedef)23 b(struct)245 1233 y({)293 1298 y(char)358=0A=
b(*name;)293 1362 y(int)382 b(\(*)23 b(detect\)\(int\);)293=0A=
1426 y(const)g(char)215 b(*\(*)23 b(info\)\(void\);)293 1491=0A=
y(int)382 b(\(*)23 b(queuecommand\)\(Scsi_Cmnd)e(*,)770 1555=0A=
y(void)j(\(*done\)\(Scsi_Cmnd)d(*\)\);)293 1619 y(int)382 b(\(*)23=0A=
b(command\)\(Scsi_Cmnd)f(*\);)293 1684 y(int)382 b(\(*)23 b=0A=
(abort\)\(Scsi_Cmnd)f(*,)h(int\);)293 1748 y(int)382 b(\(*)23=0A=
b(reset\)\(void\);)293 1812 y(int)382 b(\(*)23 b(slave_attach\)\(int,)f=0A=
(int\);)293 1877 y(int)382 b(\(*)23 b(bios_param\)\(int,)f(int,)h(int)h=0A=
([]\);)293 1941 y(int)382 b(can_queue;)293 2006 y(int)g(this_id;)293=0A=
2070 y(short)23 b(unsigned)g(int)h(sg_tablesize;)293 2134 y(short)334=0A=
b(cmd_per_lun;)293 2199 y(unsigned)262 b(present:1;)293 2263=0A=
y(unsigned)g(unchecked_isa_dma:1;)245 2327 y(})24 b(Scsi_Host;)681=0A=
2498 y FH(Figure)15 b(1.2:)k(The)d FE(Scsi)p 1108 2498 15 2=0A=
v 16 w(Host)f FH(Structure)p eop=0A=
%%Page: 51 62=0A=
51 61 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(51)150 88 y FD(1.7.7.1)54=0A=
b(V)l(ariables)20 b(in)e(the)g FE(Scsi)p 829 88 15 2 v 16 w(Host)f=0A=
FD(structure)150 206 y FH(In)f(general,)g(the)g(v)m(ariables)h(in)f(the)g=0A=
FE(Scsi_Host)e FH(structure)i(are)f(not)g(used)i(un)o(til)f(after)f(the)h=0A=
FE(detect\(\))150 270 y =
FH(function)f(\(see)g(section)g(1.7.7.2.1\))c(is)k=0A=
(called.)21 b(Therefore,)14 =
b(an)o(y)g(v)m(ariables)i(whic)o(h)f(cannot)f(b)q=0A=
(e)h(assigned)150 334 =
y(b)q(efore)k(host)g(adapter)f(detection)i(should)g(b)q=0A=
(e)f(assigned)h(during)g(detection.)31 b(This)20 =
b(situation)f(migh)o(t)150=0A=
399 =
y(o)q(ccur,)e(for)f(example,)i(if)f(a)f(single)i(driv)o(er)f(pro)o(vided)=0A=
g(supp)q(ort)g(for)f(sev)o(eral)h(host)f(adapters)g(with)h(v)o(ery)150=0A=
463 y(similar)22 b(c)o(haracteristics.)37 b(Some)21 =
b(of)g(the)g(parameters)f=0A=
(in)i(the)f FE(Scsi_Host)e FH(structure)i(migh)o(t)g(then)150=0A=
527 =
y(dep)q(end)c(on)e(the)g(sp)q(eci\014c)i(host)e(adapter)g(detected.)150=0A=
679 y FD(1.7.7.1.1)55 b FE(name)150 796 y(name)15 b =
FH(holds)h(a)e(p)q(oin)o=0A=
(ter)i(to)f(a)g(short)f(description)j(of)e(the)g(SCSI)h(host)e(adapter.)1=
50=0A=
947 y FD(1.7.7.1.2)55 b FE(can)p 466 947 V 17 w(queue)150 1065=0A=
y(can_queue)9 b FH(holds)j(the)f(n)o(um)o(b)q(er)g(of)f(outstanding)h=0A=
(commands)f(the)h(host)f(adapter)h(can)f(pro)q(cess.)19 b(Unless)150=0A=
1129 y(RESELECTION)14 =
b(is)f(supp)q(orted)g(b)o(y)f(the)h(driv)o(er)g(and)g=0A=
(the)f(driv)o(er)h(is)g(in)o(terrupt-driv)o(en,)1675 1113 y=0A=
Fm(9)1709 1129 y FH(this)g(v)m(ariable)150 1193 =
y(should)j(b)q(e)g(set)f(to)g=0A=
(1.)150 1345 y FD(1.7.7.1.3)55 b FE(this)p 490 1345 V 17 w(id)150=0A=
1462 y FH(Most)15 =
b(host)h(adapters)g(ha)o(v)o(e)g(a)f(sp)q(eci\014c)k(SCSI)e=0A=
(ID)f(assigned)h(to)e(them.)23 b(This)17 =
b(SCSI)g(ID,)f(usually)i(6)d(or)150=0A=
1526 y(7,)g(is)h(used)g(for)e(RESELECTION.)22 b(The)16 b FE(this_id)e=0A=
FH(v)m(ariable)j(holds)f(the)f(host)g(adapter's)g(SCSI)h(ID.)f(If)150=0A=
1591 =
y(the)h(host)f(adapter)h(do)q(es)g(not)f(ha)o(v)o(e)h(an)f(assigned)i=0A=
(SCSI)f(ID,)g(this)g(v)m(ariable)h(should)g(b)q(e)g(set)e(to)h=0A=
FG(\000)p FH(1)f(\(in)150 1655 =
y(this)h(case,)e(RESELECTION)j(cannot)e(b)q(e)=0A=
h(supp)q(orted\).)150 1807 y FD(1.7.7.1.4)55 b FE(sg)p 442=0A=
1807 V 17 w(tablesize)150 1924 y FH(The)15 =
b(high-lev)o(el)h(co)q(de)f(supp)q=0A=
(orts)g(\\scatter-gather,")d(a)i(metho)q(d)h(of)f(increasing)i(SCSI)f=0A=
(throughput)f(b)o(y)150 1988 y(com)o(bining)i(man)o(y)e(small)h(SCSI)g=0A=
(requests)g(in)o(to)f(a)g(few)h(large)f(SCSI)i(requests.)j(Since)d(most)e=0A=
(SCSI)h(disk)150 2052 y(driv)o(es)k(are)e(formatted)g(with)i(1:1)e(in)o=0A=
(terlea)o(v)o(e,)962 2036 y Fm(10)1018 2052 y =
FH(the)h(time)g(required)i(to)d=0A=
(p)q(erform)h(the)g(SCSI)h(ARBI-)150 2117 =
y(TRA)l(TION)j(and)e(SELECTION)h=0A=
(phases)g(is)g(longer)g(than)f(the)g(rotational)g(latency)h(time)g(b)q(et=
)o=0A=
(w)o(een)p 150 2156 720 2 v 207 2184 a FA(9)225 2199 y =
Fl(So)r(m)s(e)j(of)d=0A=
(th)q(e)j(ea)q(r)r(l)r(y)f(Li)r(n)q(u)s(x)h(dr)q(i)r(v)r(e)q(r)r(s)f(w)o(=
e)r=0A=
(r)q(e)h(no)r(t)f(int)r(e)r(r)q(r)r(u)s(p)r(t)g(dr)r(i)q(v)r(e)r(n)h(an)r=
(d)r=0A=
(,)g(co)q(n)s(s)q(e)r(q)s(u)s(e)r(n)q(t)r(l)r(y)o(,)f(ha)r(d)h(v)o(e)q(r)=
r(y)=0A=
g(p)q(o)s(o)r(r)150 2251 =
y(p)q(e)r(r)r(f)q(o)r(r)r(m)s(a)r(n)s(c)r(e)r(.)192=0A=
2284 y FA(10)225 2299 y =
Fl(\\1)q(:)q(1)c(int)r(e)r(r)q(l)r(e)r(a)q(v)r(e)r(")=0A=
f(m)q(e)q(a)s(n)s(s)f(th)r(a)r(t)h(al)q(l)g(of)e(th)q(e)i(se)q(c)r(t)r(o)=
r(r)=0A=
r(s)g(in)f(a)f(sin)s(g)r(l)r(e)i(tra)s(c)q(k)g(ap)r(p)t(e)r(a)r(r)g(co)q(=
n)s=0A=
(s)r(e)r(c)r(u)r(t)r(i)r(v)q(e)r(l)r(y)h(on)f(th)q(e)g(di)r(s)q(k)150=0A=
2351 y(su)r(r)q(f)q(a)s(c)r(e)r(.)p eop=0A=
%%Page: 52 63=0A=
52 62 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(52)150 88 y(sectors.)298=0A=
72 y Fm(11)363 88 y FH(Therefore,)19 =
b(only)g(one)f(SCSI)h(request)f(can)g(b)=0A=
q(e)h(pro)q(cessed)g(p)q(er)f(disk)h(rev)o(olution,)g(result-)150=0A=
153 =
y(ing)f(in)h(a)e(throughput)g(of)g(ab)q(out)h(50)f(kilob)o(ytes)h(p)q(er)=0A=
g(second.)27 b(When)18 b(scatter-gather)f(is)h(supp)q(orted,)150=0A=
217 =
y(ho)o(w)o(ev)o(er,)c(a)o(v)o(erage)g(throughput)h(is)h(usually)g(o)o(v)o=0A=
(er)f(500)f(kilob)o(ytes)i(p)q(er)g(second.)221 305 y(The)j=0A=
FE(sg_tablesize)f FH(v)m(ariable)j(holds)f(the)g(maxim)o(um)g(allo)o(w)o=0A=
(able)g(n)o(um)o(b)q(er)g(of)f(requests)g(in)i(the)150 369=0A=
y(scatter-gather)d(list.)32 b(If)19 =
b(the)g(driv)o(er)h(do)q(es)f(not)g(supp)=0A=
q(ort)g(scatter-gather,)f(this)i(v)m(ariable)g(should)g(b)q(e)150=0A=
434 y(set)e(to)f FE(SG_NONE)p FH(.)27 b(If)18 =
b(the)g(driv)o(er)g(can)g(supp)=0A=
q(ort)g(an)g(unlimited)i(n)o(um)o(b)q(er)f(of)e(group)q(ed)h(requests,)h=0A=
(this)150 498 y(v)m(ariable)h(should)f(b)q(e)h(set)e(to)g FE(SG_ALL)p=0A=
FH(.)29 b(Some)18 b(driv)o(ers)h(will)h(use)f(the)g(host)f(adapter)g(to)g=0A=
(manage)g(the)150 562 y(scatter-gather)10 =
b(list)i(and)g(ma)o(y)f(need)h(to)f=0A=
(limit)i FE(sg_tablesize)d =
FH(to)h(the)g(n)o(um)o(b)q(er)h(that)f(the)g(host)=0A=
g(adapter)150 627 y(hardw)o(are)j(supp)q(orts.)20 b(F)l(or)15=0A=
b(example,)h(some)f(Adaptec)g(host)g(adapters)g(require)h(a)e(limit)j(of)=
e=0A=
(16.)150 778 y FD(1.7.7.1.5)55 b FE(cmd)p 466 778 15 2 v 17=0A=
w(per)p 555 778 V 17 w(lun)150 895 y FH(The)19 b(SCSI)g(standard)g(supp)q=0A=
(orts)f(the)h(notion)g(of)f(\\link)o(ed)i(commands.")30 b(Link)o(ed)20=0A=
b(commands)f(allo)o(w)150 960 =
y(sev)o(eral)f(commands)f(to)f(b)q(e)i(queued)h=0A=
(consecutiv)o(ely)g(to)d(a)h(single)i(SCSI)f(device.)28 b(The)18=0A=
b FE(cmd_per_lun)150 1024 y =
FH(v)m(ariable)e(sp)q(eci\014es)g(the)f(n)o(um)o=0A=
(b)q(er)f(of)g(link)o(ed)j(commands)d(allo)o(w)o(ed.)20 b(This)15=0A=
b(v)m(ariable)h(should)f(b)q(e)g(set)f(to)g(1)150 1088 y(if)i(command)g=0A=
(linking)i(is)f(not)e(supp)q(orted.)23 b(A)o(t)15 =
b(this)i(time,)f(ho)o(w)o=0A=
(ev)o(er,)f(the)h(high-lev)o(el)i(SCSI)f(co)q(de)f(will)150=0A=
1153 y(not)f(tak)o(e)f(adv)m(an)o(tage)h(of)g(this)g(feature.)221=0A=
1241 =
y(Link)o(ed)f(commands)f(are)g(fundamen)o(tally)h(di\013eren)o(t)g(from)=0A=
f(m)o(ultiple)i(outstanding)e(commands)g(\(as)150 1305 =
y(describ)q(ed)h(b)o=0A=
(y)e(the)g FE(can_queue)e FH(v)m(ariable\).)20 b(Link)o(ed)14=0A=
b(commands)d(alw)o(a)o(ys)g(go)h(to)f(the)h(same)g(SCSI)g(target)150=0A=
1369 y(and)17 =
b(do)g(not)g(necessarily)h(in)o(v)o(olv)o(e)g(a)f(RESELECTION)h=0A=
(phase.)26 b(F)l(urther,)17 b(link)o(ed)i(commands)e(elim-)150=0A=
1434 =
y(inate)i(the)f(ARBITRA)l(TION,)i(SELECTION,)f(and)f(MESSA)o(GE)g(OUT)g=0A=
(phases)h(on)f(all)h(commands)150 1498 y(after)12 =
b(the)g(\014rst)h(one)f(in)=0A=
i(the)e(set.)19 b(In)13 b(con)o(trast,)f(m)o(ultiple)i(outstanding)e=0A=
(commands)h(ma)o(y)f(b)q(e)h(sen)o(t)f(to)g(an)150 1562 y(arbitrary)17=0A=
b(SCSI)h(target,)e(and)i FC(r)n(e)n(quir)n(e)i FH(the)e(ARBITRA)l(TION,)h=0A=
(SELECTION,)f(MESSA)o(GE)f(OUT,)150 1627 =
y(and)e(RESELECTION)i(phases.)150=0A=
1778 y FD(1.7.7.1.6)55 b FE(present)150 1895 y FH(The)15 b=0A=
FE(present)g =
FH(bit)g(is)h(set)f(\(b)o(y)g(the)g(high-lev)o(el)j(co)q(de\))d=0A=
(if)h(the)f(host)g(adapter)g(is)g(detected.)150 2047 y FD(1.7.7.1.7)55=0A=
b FE(unchecked)p 610 2047 V 16 w(isa)p 698 2047 V 17 w(dma)150=0A=
2164 y FH(Some)19 b(host)g(adapters)f(use)h(Direct)g(Memory)g(Access)g=0A=
(\(DMA\))f(to)g(read)h(and)g(write)g(blo)q(c)o(ks)h(of)f(data)150=0A=
2228 =
y(directly)j(from)d(or)h(to)g(the)g(computer's)g(main)h(memory)l(.)35=0A=
b(Lin)o(ux)21 b(is)g(a)f(virtual)h(memory)f(op)q(erating)p=0A=
150 2268 720 2 v 192 2296 a FA(11)225 2311 y =
Fl(Th)r(i)r(s)h(m)q(a)q(y)g(b)q=0A=
(e)g(an)g(o)o(v)q(e)r(r)r(-)q(s)r(i)r(m)s(p)s(l)r(i)q(\014)s(c)r(a)r(t)r(=
i)r=0A=
(o)r(n)s(.)29 b(On)22 =
b(ol)q(d)s(e)r(r)f(de)q(v)s(i)r(c)r(e)r(s)r(,)f(th)q(e)=0A=
h(ac)r(t)q(u)s(a)r(l)g(co)r(m)s(m)t(a)r(n)s(d)h(pr)q(o)s(c)r(e)r(s)r(s)r(=
i)r=0A=
(n)s(g)f(ca)q(n)h(b)q(e)150 2363 =
y(si)q(g)r(n)s(i)r(\014)r(c)r(a)s(n)q(t)r(.)=0A=
f(F)m(u)r(r)r(t)r(h)r(e)r(r)r(,)16 =
b(th)q(e)r(r)r(e)h(is)e(a)f(gr)q(e)r(a)s=0A=
(t)i(de)r(a)r(l)h(of)e(lay)q(e)r(r)r(e)r(d)i(o)o(v)q(e)r(r)q(h)s(e)r(a)r(=
d)h=0A=
(in)e(th)q(e)h(k)o(e)q(r)r(n)s(e)r(l)r(:)k(th)q(e)c(hi)q(g)s(h)r(-)r(l)r(=
e)r=0A=
(v)q(e)r(l)f(SC)s(S)s(I)g(co)r(d)s(e)r(,)150 2415 =
y(th)q(e)j(bu)s(\013)r(e)r=0A=
(r)r(i)r(n)s(g)g(co)r(d)s(e)r(,)f(an)r(d)h(th)q(e)g(\014l)r(e)r(-)q(s)r(y=
)r=0A=
(s)r(t)r(e)r(m)h(co)s(d)r(e)f(al)q(l)g(co)q(n)r(t)q(r)r(i)r(b)s(u)r(t)r(e=
)g=0A=
(to)f(p)q(o)s(o)r(r)h(SC)r(S)s(I)f(p)q(e)r(r)r(f)q(o)r(r)r(m)s(a)s(n)r(c)=
r(e)=0A=
r(.)p eop=0A=
%%Page: 53 64=0A=
53 63 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(53)150 88 y(system)18=0A=
b(that)h(can)g(use)g(more)f(than)h(16)g(MB)f(of)h(ph)o(ysical)h(memory)l(=
.)31=0A=
b(Unfortunately)l(,)19 b(on)g(mac)o(hines)150 153 =
y(using)d(the)f(ISA)h(bus)=0A=
506 136 y Fm(12)544 153 y =
FH(,)f(DMA)f(is)i(limited)h(to)e(the)g(lo)o(w)g(16)=0A=
g(MB)g(of)f(ph)o(ysical)j(memory)l(.)221 241 y(If)d(the)g FE=0A=
(unchecked_isa_dma)d FH(bit)k(is)f(set,)f(the)h(high-lev)o(el)j(co)q(de)d=0A=
(will)i(pro)o(vide)e(data)f(bu\013ers)i(whic)o(h)150 305 y(are)i(guaran)o=0A=
(teed)f(to)g(b)q(e)i(in)g(the)f(lo)o(w)g(16)f(MB)h(of)f(the)h(ph)o(ysical=
)i=0A=
(address)e(space.)25 b(Driv)o(ers)17 b(written)g(for)150 369=0A=
y(host)g(adapters)h(that)f(do)g(not)h(use)g(DMA)f(should)i(set)f(this)g(b=
it)g=0A=
(to)f(zero.)28 b(Driv)o(ers)17 b(sp)q(eci\014c)j(to)d(EISA)150=0A=
434 y(bus)218 417 y Fm(13)270 434 y =
FH(mac)o(hines)e(should)g(also)f(set)g=0A=
(this)g(bit)h(to)e(zero,)h(since)i(EISA)e(bus)h(mac)o(hines)g(allo)o(w)f=0A=
(unrestricted)150 498 y(DMA)h(access.)150 649 y FD(1.7.7.2)54=0A=
b(F)l(unctions)18 b(in)g(the)g FE(Scsi)p 839 649 15 2 v 17=0A=
w(Host)f FD(Structure)150 767 y(1.7.7.2.1)55 b FE(detect\(\))150=0A=
884 y FH(The)11 b FE(detect\(\))f =
FH(function's)i(only)f(argumen)o(t)g(is)g=0A=
(the)h(\\host)e(n)o(um)o(b)q(er,")i(an)f(index)h(in)o(to)f(the)g=0A=
FE(scsi_hosts)150 948 y =
FH(v)m(ariable)i(\(an)e(arra)o(y)f(of)h(t)o(yp)q(e)g=0A=
FE(struct)23 b(Scsi_Host)p FH(\).)17 b(The)12 b FE(detect\(\))e=0A=
FH(function)i(should)g(return)g(a)f(non-)150 1013 =
y(zero)k(v)m(alue)i(if)e=0A=
(the)g(host)g(adapter)g(is)h(detected,)f(and)h(should)g(return)f(zero)g=0A=
(otherwise.)221 1100 =
y(Host)h(adapter)h(detection)h(m)o(ust)f(b)q(e)g(done)h=0A=
(carefully)l(.)27 b(Usually)19 =
b(the)e(pro)q(cess)h(b)q(egins)g(b)o(y)f(lo)q=0A=
(oking)150 1165 =
y(in)j(the)f(R)o(OM)h(area)e(for)h(the)g(\\BIOS)h(signature")=0A=
f(of)g(the)g(host)g(adapter.)31 b(On)20 b(PC/A)l(T-compatible)150=0A=
1229 y(computers,)f(the)g(use)g(of)g(the)f(address)h(space)g(b)q(et)o(w)o=0A=
(een)g FE(0xc0000)f FH(and)h FE(0xfffff)f =
FH(is)h(fairly)h(w)o(ell)f(de-)150=0A=
1294 y(\014ned.)i(F)l(or)13 b(example,)i(the)g(video)g(BIOS)g(on)g(most)e=0A=
(mac)o(hines)j(starts)d(at)g FE(0xc0000)h FH(and)g(the)h(hard)f(disk)150=0A=
1358 y(BIOS,)20 b(if)g(presen)o(t,)g(starts)e(at)h FE(0xc8000)p=0A=
FH(.)32 b(When)19 =
b(a)h(PC/A)l(T-compatible)g(computer)f(b)q(o)q(ots,)h(ev)o=0A=
(ery)150 1422 y(2-kilob)o(yte)e(blo)q(c)o(k)h(from)e FE(0xc0000)g=0A=
FH(to)g FE(0xf8000)f =
FH(is)j(examined)f(for)f(the)h(2-b)o(yte)g(signature)f=0A=
(\()p FE(0x55aa)p FH(\))150 1487 y(whic)o(h)f(indicates)h(that)d(a)h(v)m=0A=
(alid)i(BIOS)f(extension)g(is)g(presen)o(t)f([Nor85)o(].)221=0A=
1574 y(The)21 =
b(BIOS)g(signature)g(usually)h(consists)f(of)g(a)f(series)i(of)=0A=
e(b)o(ytes)g(that)h(uniquely)h(iden)o(ti\014es)h(the)150 1639=0A=
y(BIOS.)e(F)l(or)15 =
b(example,)g(one)h(F)l(uture)f(Domain)g(BIOS)h(signature)=0A=
g(is)f(the)h(string)245 1764 y FE(FUTURE)23 b(DOMAIN)h(CORP.)f(\(C\))g=0A=
(1986-1990)g(1800-V2.07/28/89)150 1954 y FH(found)16 =
b(exactly)f(\014v)o(e)g=0A=
(b)o(ytes)g(from)g(the)g(start)f(of)h(the)g(BIOS)h(blo)q(c)o(k.)221=0A=
2041 =
y(After)c(the)h(BIOS)g(signature)g(is)g(found,)h(it)f(is)g(safe)f(to)g=0A=
(test)g(for)g(the)h(presence)h(of)e(a)g(functioning)i(host)150=0A=
2106 y(adapter)g(in)h(more)f(sp)q(eci\014c)j(w)o(a)o(ys.)h(Since)e(the)f=0A=
(BIOS)h(signatures)e(are)g(hard-co)q(ded)i(in)f(the)g(k)o(ernel,)g(the)15=
0=0A=
2170 =
y(release)j(of)f(a)g(new)g(BIOS)i(can)e(cause)h(the)f(driv)o(er)h(to)f=0A=
(m)o(ysteriously)g(fail.)27 b(F)l(urther,)18 b(p)q(eople)h(who)e(use)150=0A=
2234 =
y(the)f(SCSI)g(adapter)f(exclusiv)o(ely)j(for)d(Lin)o(ux)i(ma)o(y)e(w)o=0A=
(an)o(t)f(to)h(disable)i(the)f(BIOS)h(to)e(sp)q(eed)i(b)q(o)q(ot)e(time.)=
p=0A=
150 2274 720 2 v 192 2302 a FA(12)225 2317 y =
Fl(Th)r(e)k(so)q(-)q(c)r(a)r(l)r=0A=
(l)r(e)r(d)g(\\I)q(n)r(d)s(u)s(s)r(t)q(r)r(y)g(St)q(a)r(n)s(d)s(a)r(r)r(d=
)g=0A=
(Ar)r(c)q(h)r(i)r(t)r(e)q(c)r(t)r(u)s(r)q(e)r(")g(bu)r(s)g(w)o(a)r(s)f(in=
t)r=0A=
(r)r(o)s(d)s(u)r(c)r(e)r(d)h(wi)r(t)r(h)g(th)q(e)f(IB)r(M)i(PC)s(/)s(X)s(=
T)f=0A=
(an)r(d)150 2369 =
y(IB)r(M)i(PC)r(/)s(AT)e(co)q(m)t(p)r(u)s(t)r(e)r(r)q(s)r(.)=0A=
192 2401 y FA(13)225 2416 y =
Fl(Th)r(e)e(\\E)r(x)s(t)q(e)r(n)s(d)s(e)q(d)h(In)=0A=
q(d)r(u)s(s)r(t)r(r)q(y)f(St)r(a)r(n)s(d)r(a)s(r)q(d)g(Ar)r(c)q(h)s(i)q(t=
)r=0A=
(e)r(c)r(t)r(u)r(r)r(e)r(")g(bu)r(s)f(is)g(a)d(no)r(n)s(-)q(p)s(r)r(o)r(p=
)s=0A=
(r)q(i)r(e)r(t)r(a)r(r)r(y)k(32)r(-)q(b)r(i)r(t)f(bu)s(s)g(for)h(38)q(6)g=
(an)=0A=
r(d)150 2468 y(i4)q(8)s(6)i(ma)s(c)q(h)r(i)r(n)s(e)r(s)q(.)p=0A=
eop=0A=
%%Page: 54 65=0A=
54 64 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(54)150 88 y(F)l(or)14=0A=
b(these)i(reasons,)e(if)h(the)h(adapter)e(can)h(b)q(e)h(detected)g(safely=
)f=0A=
(without)g(examining)i(the)e(BIOS,)h(then)150 153 =
y(that)e(alternativ)o(e)i=0A=
(metho)q(d)f(should)h(b)q(e)g(used.)221 241 =
y(Usually)l(,)e(eac)o(h)f(host)g=0A=
(adapter)g(has)g(a)f(series)i(of)f(I/O)g(p)q(ort)g(addresses)g(whic)o(h)h=0A=
(are)f(used)h(for)e(comm)o(u-)150 305 y(nications.)25 b(Sometimes)16=0A=
b(these)h(addresses)g(will)h(b)q(e)f(hard)g(co)q(ded)g(in)o(to)f(the)h(dr=
iv)o=0A=
(er,)g(forcing)f(all)i(Lin)o(ux)150 369 =
y(users)e(who)f(ha)o(v)o(e)g(this)h=0A=
(host)f(adapter)g(to)g(use)g(a)g(sp)q(eci\014c)j(set)d(of)g(I/O)h(p)q(ort=
)f=0A=
(addresses.)21 b(Other)16 b(driv)o(ers)150 434 =
y(are)h(more)f(\015exible,)j=0A=
(and)f(\014nd)f(the)g(curren)o(t)g(I/O)h(p)q(ort)f(address)g(b)o(y)g=0A=
(scanning)g(all)h(p)q(ossible)h(p)q(ort)e(ad-)150 498 y(dresses.)22=0A=
b(Usually)c(eac)o(h)e(host)f(adapter)h(will)i(allo)o(w)e(3)f(or)h(4)g(set=
s)f=0A=
(of)h(addresses,)g(whic)o(h)h(are)e(selectable)150 562 =
y(via)g(hardw)o(are)g=0A=
(jump)q(ers)h(on)f(the)g(host)g(adapter)g(card.)221 650 =
y(After)e(the)g(I/O)h=0A=
(p)q(ort)f(addresses)h(are)f(found,)h(the)f(host)g(adapter)g(can)h(b)q(e)=
g=0A=
(in)o(terrogated)f(to)g(con\014rm)150 715 y(that)19 =
b(it)h(is,)g(indeed,)i=0A=
(the)e(exp)q(ected)g(host)f(adapter.)33 b(These)20 b(tests)e(are)i(host)f=0A=
(adapter)g(sp)q(eci\014c,)j(but)150 779 y(commonly)17 =
b(include)h(metho)q(ds)=0A=
f(to)f(determine)h(the)f(BIOS)i(base)e(address)h(\(whic)o(h)g(can)f(then)=
h(b)=0A=
q(e)g(com-)150 843 y(pared)g(to)e(the)i(BIOS)g(address)g(found)f(during)i=0A=
(the)e(BIOS)i(signature)e(searc)o(h\))g(or)g(to)g(v)o(erify)g(a)g(unique)=
150=0A=
908 =
y(iden)o(ti\014cation)k(n)o(um)o(b)q(er)e(asso)q(ciated)g(with)g(the)g(b)=0A=
q(oard.)28 b(F)l(or)17 b(MCA)h(bus)1436 891 y Fm(14)1491 908=0A=
y FH(mac)o(hines,)h(eac)o(h)f(t)o(yp)q(e)g(of)150 972 y(b)q(oard)12=0A=
b(is)g(giv)o(en)h(a)f(unique)h(iden)o(ti\014cation)h(n)o(um)o(b)q(er)e(wh=
ic)o=0A=
(h)h(no)f(other)f(man)o(ufacturer)h(can)g(use|sev)o(eral)150=0A=
1036 y(F)l(uture)17 b(Domain)f(host)g(adapters,)h(for)f(example,)h(also)g=0A=
(use)g(this)g(n)o(um)o(b)q(er)g(as)f(a)h(unique)h(iden)o(ti\014er)g(on)15=
0=0A=
1101 y(ISA)d(bus)f(mac)o(hines.)20 b(Other)14 b(metho)q(ds)g(of)g(v)o=0A=
(erifying)g(the)g(host)g(adapter)f(existence)i(and)g(function)f(will)150=0A=
1165 y(b)q(e)i(a)o(v)m(ailable)h(to)d(the)i(programmer.)150=0A=
1317 y FD(1.7.7.2.1.1)56 b(Requesting)18 b(the)f(IR)o(Q)150=0A=
1434 y FH(After)c(detection,)h(the)g FE(detect\(\))e =
FH(routine)i(m)o(ust)f=0A=
(request)g(an)o(y)h(needed)g(in)o(terrupt)g(or)f(DMA)g(c)o(hannels)150=0A=
1498 y(from)e(the)h(k)o(ernel.)19 b(There)12 =
b(are)f(16)g(in)o(terrupt)h(c)o=0A=
(hannels,)h(lab)q(eled)h(IR)o(Q)e(0)g(through)f(IR)o(Q)h(15.)18=0A=
b(The)12 b(k)o(ernel)150 1562 =
y(pro)o(vides)k(t)o(w)o(o)e(metho)q(ds)h(for)f=0A=
(setting)i(up)f(an)g(IR)o(Q)i(handler:)k FE(irqaction\(\))13=0A=
b FH(and)j FE(request_irq\(\))p FH(.)221 1650 y(The)g =
FE(request_irq\(\))f=0A=
FH(function)i(tak)o(es)f(t)o(w)o(o)f(parameters,)h(the)g(IR)o(Q)i(n)o(um)=
o(b)=0A=
q(er)f(and)f(a)h(p)q(oin)o(ter)g(to)150 1715 =
y(the)e(handler)h(routine.)k(It)=0A=
15 b(then)g(sets)g(up)g(a)f(default)i FE(sigaction)d FH(structure)i(and)g=0A=
(calls)h FE(irqaction\(\))p FH(.)150 1779 y(The)11 b(co)q(de)328=0A=
1763 y Fm(15)378 1779 y FH(for)f(the)h FE(request_irq\(\))f=0A=
FH(function)i(is)g(sho)o(wn)e(in)i(Figure)g(1.3.)18 b(I)11=0A=
b(will)i(limit)g(m)o(y)d(discussion)150 1843 y(to)15 =
b(the)g(more)g(general)g=0A=
FE(irqaction\(\))f FH(function.)221 1931 y(The)h(declaration)533=0A=
1915 y Fm(16)586 1931 y FH(for)g(the)g FE(irqaction\(\))f =
FH(function)i(is)=0A=
245 2056 y FE(int)24 b(irqaction\()e(unsigned)h(int)h(irq,)f(struct)g=0A=
(sigaction)g(*new)g(\))150 2246 y FH(where)16 =
b(the)g(\014rst)g(parameter,)f=0A=
FE(irq)p =
FH(,)h(is)g(the)g(n)o(um)o(b)q(er)h(of)e(the)h(IR)o(Q)h(that)e(is)i=0A=
(b)q(eing)g(requested,)g(and)f(the)p 150 2287 720 2 v 192 2315=0A=
a FA(14)225 2330 y Fl(Th)r(e)29 =
b(\\M)s(i)r(c)r(r)r(o)r(-)q(C)s(h)s(a)r(n)s=0A=
(n)r(e)r(l)g(Ar)q(c)q(h)s(i)r(t)q(e)r(c)r(t)r(u)s(r)q(e)r(")g(bu)r(s)g(is=
)e=0A=
(IB)q(M)t(')q(s)i(pr)q(o)r(p)s(r)r(i)r(e)r(t)q(a)r(r)r(y)g(32)f(bi)r(t)g(=
bu)r=0A=
(s)g(fo)q(r)g(38)r(6)g(an)r(d)i(i4)q(8)r(6)150 2382 =
y(m)q(a)r(c)q(h)r(i)r(n)s=0A=
(e)r(s)r(.)192 2419 y FA(15)225 2434 y Fl(Li)q(n)r(u)r(x)20=0A=
b(0.9)r(9)s(.)q(7)f(k)o(e)q(r)r(n)r(e)r(l)g(so)q(u)s(r)r(c)r(e)f(co)s(d)s=
(e)r=0A=
(,)f Fk(linux/kern)o(el/)o(ir)o(q.c)192 2471 y FA(16)225 2486=0A=
y =
Fl(Li)q(n)r(u)r(x)j(0.9)r(9)s(.)q(5)f(k)o(e)q(r)r(n)r(e)r(l)g(so)q(u)s(r)=
r=0A=
(c)r(e)f(co)s(d)s(e)r(,)f Fk(linux/kern)o(el/)o(ir)o(q.c)p=0A=
eop=0A=
%%Page: 55 66=0A=
55 65 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(55)245 144 y FE(int)24=0A=
b(request_irq\()e(unsigned)h(int)g(irq,)h(void)f(\(*handler\)\()f(int)i(\=
))g=0A=
(\))245 209 y({)293 273 y(struct)f(sigaction)g(sa;)293 402=0A=
y(sa.sa_handler)46 b(=3D)24 b(handler;)293 466 y(sa.sa_flags)94=0A=
b(=3D)24 b(0;)293 531 y(sa.sa_mask)118 b(=3D)24 b(0;)293 595 =
y(sa.sa_restorer)e=0A=
(=3D)i(NULL;)293 659 y(return)f(irqaction\()g(irq,)g(&sa)g(\);)245=0A=
724 y(})639 894 y FH(Figure)16 b(1.3:)j(The)c FE(request)p=0A=
1138 894 15 2 v 16 w(irq\(\))g FH(F)l(unction)150 1070 =
y(second)h(parameter,)=0A=
e FE(new)p FH(,)g(is)i(a)f(structure)g(with)g(the)g(de\014nition)1271=0A=
1054 y Fm(17)1326 1070 y FH(sho)o(wn)g(in)h(Figure)f(1.4.)245=0A=
1230 y FE(struct)23 b(sigaction)245 1295 y({)293 1359 y(__sighandler_t)f=0A=
(sa_handler;)293 1423 y(sigset_t)166 b(sa_mask;)293 1488 y(int)286=0A=
b(sa_flags;)293 1552 y(void)262 b(\(*sa_restorer\)\(void\);)245=0A=
1617 y(};)678 1787 y FH(Figure)15 b(1.4:)k(The)c FE(sigaction)f=0A=
FH(Structure)221 1940 y(In)20 b(this)h(structure,)g FE(sa_handler)e=0A=
FH(should)i(p)q(oin)o(t)g(to)f(y)o(our)g(in)o(terrupt)g(handler)h(routine=
,)h=0A=
(whic)o(h)150 2004 y(should)16 =
b(ha)o(v)o(e)f(a)g(de\014nition)i(similar)f=0A=
(to)f(the)g(follo)o(wing:)245 2129 y FE(void)24 =
b(fdomain_16x0_intr\()d(int)j=0A=
(irq)f(\))150 2319 y FH(where)15 b FE(irq)f =
FH(will)i(b)q(e)f(the)g(n)o(um)o=0A=
(b)q(er)g(of)f(the)g(IR)o(Q)i(whic)o(h)f(caused)g(the)g(in)o(terrupt)g=0A=
(handler)g(routine)g(to)f(b)q(e)150 2383 y(in)o(v)o(ok)o(ed.)p=0A=
150 2414 720 2 v 192 2446 a FA(17)225 2461 y Fl(Li)q(n)r(u)r(x)20=0A=
b(0.9)r(9)s(.)q(5)f(k)o(e)q(r)r(n)r(e)r(l)g(so)q(u)s(r)r(c)r(e)f(co)s(d)s=
(e)r=0A=
(,)f Fk(linux/incl)o(ude)o(/l)o(inu)o(x/s)o(ig)o(nal)o(.h)p=0A=
eop=0A=
%%Page: 56 67=0A=
56 66 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(56)221 88 y(The)18=0A=
b FE(sa_mask)f =
FH(v)m(ariable)j(is)e(used)h(as)f(an)g(in)o(ternal)h(\015ag)f=0A=
(b)o(y)g(the)g FE(irqaction\(\))f FH(routine.)29 b(T)l(radi-)150=0A=
153 y(tionally)l(,)16 =
b(this)g(v)m(ariable)g(is)g(set)f(to)g(zero)g(prior)g=0A=
(to)g(calling)i FE(irqaction\(\))p FH(.)221 241 y(The)g FE(sa_flags)e=0A=
FH(v)m(ariable)k(can)e(b)q(e)g(set)g(to)f(zero)h(or)f(to)g=0A=
FE(SA_INTERRUPT)p FH(.)23 b(If)18 b(zero)e(is)i(selected,)g(the)150=0A=
305 =
y(in)o(terrupt)i(handler)h(will)h(run)f(with)f(other)g(in)o(terrupts)g=0A=
(enabled,)i(and)f(will)g(return)f(via)h(the)f(signal-)150 369=0A=
y(handling)f(return)e(functions.)26 b(This)18 =
b(option)g(is)f(recommended)h=0A=
(for)f(relativ)o(ely)h(slo)o(w)f(IR)o(Q's,)h(suc)o(h)f(as)150=0A=
434 =
y(those)f(asso)q(ciated)g(with)g(the)g(k)o(eyb)q(oard)f(and)h(timer)g(in)=0A=
o(terrupts.)22 b(If)17 b FE(SA_INTERRUPT)d FH(is)i(selected,)h(the)150=0A=
498 y(handler)k(will)g(b)q(e)g(called)g(with)f(in)o(terrupts)g(disabled)i=0A=
(and)e(return)f(will)j(a)o(v)o(oid)d(the)h(signal-handling)150=0A=
562 y(return)i(functions.)40 b FE(SA_INTERRUPT)21 b =
FH(selects)h(\\fast")f=0A=
(IR)o(Q)i(handler)f(in)o(v)o(o)q(cation)h(routines,)g(and)f(is)150=0A=
627 =
y(recommended)d(for)e(in)o(terrupt)h(driv)o(en)h(hard)f(disk)g(routines.)=0A=
29 b(The)18 b(in)o(terrupt)g(handler)h(should)g(turn)150 691=0A=
y(in)o(terrupts)c(on)g(as)g(so)q(on)g(as)g(p)q(ossible,)i(ho)o(w)o(ev)o(e=
r,)d=0A=
(so)h(that)f(other)h(in)o(terrupts)g(can)h(b)q(e)f(pro)q(cessed.)221=0A=
779 y(The)g FE(sa_restorer)f FH(v)m(ariable)i(is)g(not)f(curren)o(tly)g=0A=
(used,)h(and)f(is)h(traditionally)g(set)f(to)g FE(NULL)p FH(.)221=0A=
867 y(The)k FE(request_irq\(\))d FH(and)j FE(irqaction\(\))f=0A=
FH(functions)h(will)i(return)d(zero)h(if)g(the)g(IR)o(Q)h(w)o(as)d(suc-)1=
50=0A=
931 y(cessfully)g(assigned)f(to)f(the)g(sp)q(eci\014ed)j(in)o(terrupt)e=0A=
(handler)g(routine.)21 b(Non-zero)16 =
b(result)g(co)q(des)g(ma)o(y)e(b)q(e)150=0A=
996 y(in)o(terpreted)i(as)f(follo)o(ws:)150 1113 y FE(-EINVAL)132=0A=
b FH(Either)16 =
b(the)g(IR)o(Q)g(requested)h(w)o(as)d(larger)i(than)f(15,)g=0A=
(or)g(a)h FE(NULL)f FH(p)q(oin)o(ter)h(w)o(as)f(passed)450=0A=
1177 =
y(instead)h(of)f(a)f(v)m(alid)j(p)q(oin)o(ter)f(to)f(the)g(in)o(terrupt)=0A=
g(handler)i(routine.)150 1281 y FE(-EBUSY)156 b FH(The)21 b(IR)o(Q)h=0A=
(requested)f(has)g(already)h(b)q(een)g(allo)q(cated)g(to)e(another)g(in)o=0A=
(terrupt)i(han-)450 1345 y(dler.)e(This)15 =
b(situation)g(should)g(nev)o(er)f=0A=
(o)q(ccur,)h(and)f(is)h(reasonable)f(cause)h(for)e(a)h(call)i(to)450=0A=
1409 y FE(panic\(\))p FH(.)221 1526 =
y(The)f(k)o(ernel)i(uses)f(an)f(In)o(tel)=0A=
i(\\in)o(terrupt)e(gate")g(to)g(set)g(up)h(IR)o(Q)h(handler)g(routines)f=0A=
(requested)g(via)150 1591 y(the)j FE(irqaction\(\))e FH(function.)32=0A=
b(The)19 =
b(In)o(tel)h(i486)e(man)o(ual)h([In)o(t90,)g(p.)g(9-11])e(explains)k=0A=
(the)e(in)o(terrupt)150 1655 y(gate)14 b(as)h(follo)o(ws:)332=0A=
1793 y(In)o(terrupts)25 b(using)p FB(:)8 b(:)g(:)f FH(in)o(terrupt)26=0A=
b(gates)p FB(:)8 b(:)g(:)d FH(cause)26 =
b(the)f(TF)h(\015ag)f([trap)g(\015ag])=0A=
g(to)g(b)q(e)264 1857 y(cleared)14 =
b(after)f(its)h(curren)o(t)f(v)m(alue)i=0A=
(is)f(sa)o(v)o(ed)f(on)g(the)h(stac)o(k)e(as)h(part)g(of)g(the)h(sa)o(v)o=
(ed)=0A=
f(con)o(ten)o(ts)264 1922 y(of)g(the)h(EFLA)o(GS)g(register.)20=0A=
b(In)14 =
b(so)g(doing,)g(the)h(pro)q(cessor)e(prev)o(en)o(ts)h(instruction)h=0A=
(tracing)264 1986 y(from)20 =
b(a\013ecting)i(in)o(terrupt)g(resp)q(onse.)38=0A=
b(A)21 b(subsequen)o(t)h(IRET)g([in)o(terrupt)f(return])f(in-)264=0A=
2050 y(struction)13 =
b(restores)g(the)g(TF)g(\015ag)g(to)f(the)i(v)m(alue)g=0A=
(in)g(the)g(sa)o(v)o(ed)f(con)o(ten)o(ts)f(of)h(the)h(EFLA)o(GS)264=0A=
2115 y(register)h(on)g(the)g(stac)o(k.)332 2179 y FB(:)8 b(:)g(:)22=0A=
b FH(An)17 b(in)o(terrupt)g(whic)o(h)h(uses)f(an)g(in)o(terrupt)g(gate)f=0A=
(clears)i(the)f(IF)g(\015ag)f([interrupt-)264 2243 y(enable)j(\015ag],)e=0A=
(whic)o(h)i(prev)o(en)o(ts)e(other)h(in)o(terrupts)g(from)f(in)o(terferin=
g)h=0A=
(with)h(the)e(curren)o(t)264 2308 y(in)o(terrupt)i(handler.)31=0A=
b(A)18 =
b(subsequen)o(t)i(IRET)f(instruction)h(restores)e(the)g(IF)h(\015ag)f=0A=
(to)g(the)264 2372 =
y(v)m(alue)e(in)g(the)f(sa)o(v)o(ed)g(con)o(ten)o(ts)g(of)=0A=
f(the)i(EFLA)o(GS)f(register)g(on)g(the)g(stac)o(k.)p eop=0A=
%%Page: 57 68=0A=
57 67 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(57)150 88 y FD(1.7.7.2.2)55=0A=
b(Requesting)18 b(the)g(DMA)f(c)o(hannel)150 206 y =
FH(Some)i(SCSI)g(host)f=0A=
(adapters)g(use)h(DMA)f(to)g(access)h(large)f(blo)q(c)o(ks)i(of)e(data)g(=
in)h=0A=
(memory)l(.)30 b(Since)20 b(the)150 270 =
y(CPU)f(do)q(es)h(not)f(ha)o(v)o(e)g=0A=
(to)g(deal)i(with)f(the)f(individual)k(DMA)c(requests,)h(data)f(transfers=
)g=0A=
(are)g(faster)150 334 =
y(than)f(CPU-mediated)g(transfers)f(and)h(allo)o(w)g=0A=
(the)f(CPU)h(to)f(do)h(other)f(useful)i(w)o(ork)d(during)j(a)e(blo)q(c)o(=
k)=0A=
150 399 y(transfer)d(\(assuming)i(in)o(terrupts)f(are)g(enabled\).)221=0A=
487 y(The)10 =
b(host)g(adapter)g(will)i(use)f(a)f(sp)q(eci\014c)j(DMA)c(c)o=0A=
(hannel.)20 b(This)11 b(DMA)f(c)o(hannel)h(will)i(b)q(e)e(determined)150=0A=
551 y(b)o(y)i(the)h FE(detect\(\))e =
FH(function)j(and)f(requested)g(from)e=0A=
(the)i(k)o(ernel)g(with)g(the)g FE(request_dma\(\))d FH(function.)150=0A=
615 =
y(This)k(function)g(tak)o(es)e(the)h(DMA)g(c)o(hannel)h(n)o(um)o(b)q(er)g=0A=
(as)e(its)i(only)f(parameter)g(and)g(returns)g(zero)g(if)h(the)150=0A=
680 =
y(DMA)g(c)o(hannel)h(w)o(as)e(successfully)k(allo)q(cated.)i(Non-zero)c=0A=
(results)f(ma)o(y)g(b)q(e)h(in)o(terpreted)g(as)e(follo)o(ws:)150=0A=
797 y FE(-EINVAL)132 b FH(The)15 b(DMA)g(c)o(hannel)h(n)o(um)o(b)q(er)g=0A=
(requested)g(w)o(as)e(larger)h(than)g(7.)150 900 y FE(-EBUSY)156=0A=
b FH(The)22 =
b(requested)f(DMA)g(c)o(hannel)i(has)e(already)h(b)q(een)g(allo)q=0A=
(cated.)39 b(This)22 b(is)g(a)f(v)o(ery)450 965 =
y(serious)e(situation,)i(and)=0A=
e(will)h(probably)g(cause)f(an)o(y)g(SCSI)h(requests)f(to)f(fail.)32=0A=
b(It)19 b(is)450 1029 y(w)o(orth)o(y)14 b(of)h(a)g(call)h(to)e=0A=
FE(panic\(\))p FH(.)150 1180 y FD(1.7.7.2.3)55 b FE(info\(\))150=0A=
1298 y FH(The)14 b FE(info\(\))e FH(function)i(merely)g(returns)f(a)g(p)q=0A=
(oin)o(ter)h(to)f(a)g(static)g(area)f(con)o(taining)i(a)f(brief)h=0A=
(description)150 1362 y(of)k(the)g(lo)o(w-lev)o(el)h(driv)o(er.)29=0A=
b(This)19 =
b(description,)h(whic)o(h)f(is)g(similar)g(to)e(that)h(p)q(oin)o=0A=
(ted)h(to)e(b)o(y)h(the)h FE(name)150 1426 y =
FH(v)m(ariable,)d(will)h(b)q(e)f=0A=
(prin)o(ted)g(at)e(b)q(o)q(ot)i(time.)150 1578 y FD(1.7.7.2.4)55=0A=
b FE(queuecommand\(\))150 1695 y FH(The)19 b FE(queuecommand\(\))f=0A=
FH(function)i(sets)e(up)i(the)f(host)g(adapter)g(for)f(pro)q(cessing)i(a)=
f=0A=
(SCSI)h(command)150 1759 y(and)j(then)g(returns.)42 b(When)23=0A=
b(the)f(command)h(is)g(\014nished,)j(the)c FE(done\(\))g =
FH(function)h(is)g=0A=
(called)i(with)150 1824 y(the)20 b FE(Scsi_Cmnd)e =
FH(structure)i(p)q(oin)o=0A=
(ter)g(as)g(a)f(parameter.)33 b(This)21 =
b(allo)o(ws)f(the)g(SCSI)g(command)g=0A=
(to)f(b)q(e)150 1888 y(executed)h(in)g(an)f(in)o(terrupt-driv)o(en)i=0A=
(fashion.)32 b(Before)19 b(returning,)i(the)e FE(queuecommand\(\))e=0A=
FH(function)150 1952 y(m)o(ust)e(do)g(sev)o(eral)g(things:)206=0A=
2078 y(1.)22 b(Sa)o(v)o(e)14 b(the)i(p)q(oin)o(ter)f(to)g(the)g=0A=
FE(Scsi_Cmnd)f FH(structure.)206 2179 y(2.)22 b(Sa)o(v)o(e)16=0A=
b(the)g(p)q(oin)o(ter)h(to)f(the)h FE(done\(\))e FH(function)j(in)f(the)f=0A=
FE(scsi_done\(\))f FH(function)j(p)q(oin)o(ter)f(in)g(the)264=0A=
2244 y FE(Scsi_Cmnd)d FH(structure.)19 =
b(See)d(section)g(1.7.7.2.5)c(for)j=0A=
(more)f(information.)206 2345 y(3.)22 b(Set)17 b(up)h(the)g(sp)q(ecial)h=0A=
FE(Scsi_Cmnd)d FH(v)m(ariables)j(required)f(b)o(y)f(the)h(driv)o(er.)27=0A=
b(See)18 b(section)g(1.7.8)e(for)264 2410 y(detailed)g(information)g(on)f=0A=
(the)g FE(Scsi_Cmnd)f FH(structure.)p eop=0A=
%%Page: 58 69=0A=
58 68 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(58)206 88 y(4.)22=0A=
b(Start)17 b(the)h(SCSI)g(command.)28 b(F)l(or)17 =
b(an)h(adv)m(anced)h(host)f=0A=
(adapter,)f(this)i(ma)o(y)e(b)q(e)h(as)g(simple)h(as)264 153=0A=
y(sending)d(the)f(command)g(to)f(a)g(host)h(adapter)f(\\mailb)q(o)o(x.")2=
0=0A=
b(F)l(or)15 b(less)g(adv)m(anced)h(host)f(adapters,)264 217=0A=
y(the)g(ARBITRA)l(TION)j(phase)d(is)h(man)o(ually)g(started.)221=0A=
342 y(The)28 b FE(queuecommand\(\))f FH(function)i(is)h(called)g=0A=
FC(only)i FH(if)d(the)g FE(can_queue)e FH(v)m(ariable)j(\(see)f(sec-)150=0A=
407 y(tion)15 b(1.7.7.1.2\))c(is)k(non-zero.)k(Otherwise)d(the)e=0A=
FE(command\(\))f =
FH(function)i(is)g(used)g(for)f(all)h(SCSI)g(requests.)150=0A=
471 y(The)j FE(queuecommand\(\))d =
FH(function)j(should)g(return)g(zero)f(on)g=0A=
(success)h(\(the)f(curren)o(t)h(high-lev)o(el)h(SCSI)150 535=0A=
y(co)q(de)d(presen)o(tly)g(ignores)f(the)g(return)g(v)m(alue\).)150=0A=
687 y FD(1.7.7.2.5)55 b FE(done\(\))150 804 y FH(The)18 b FE(done\(\))f=0A=
FH(function)i(is)f(called)i(after)d(the)h(SCSI)h(command)f(completes.)28=0A=
b(The)18 b(single)i(parameter)150 868 y(that)10 =
b(this)h(command)f(requires)h=0A=
(is)g(a)f(p)q(oin)o(ter)h(to)f(the)h(same)f FE(Scsi_Cmnd)f=0A=
FH(structure)h(that)g(w)o(as)g(previously)150 933 y(passed)16=0A=
b(to)g(the)g FE(queuecommand\(\))e FH(function.)23 b(Before)16=0A=
b(the)g FE(done\(\))f FH(function)i(is)f(called,)i(the)e FE(result)150=0A=
997 y FH(v)m(ariable)h(m)o(ust)e(b)q(e)i(set)f(correctly)l(.)22=0A=
b(The)16 b FE(result)f FH(v)m(ariable)i(is)f(a)g(32)f(bit)h(in)o(teger,)g=0A=
(eac)o(h)g(b)o(yte)g(of)f(whic)o(h)150 1061 =
y(has)g(sp)q(eci\014c)i(meaning:)=0A=
150 1179 y(Byte)e(0)g(\(LSB\))32 b(This)17 =
b(b)o(yte)g(con)o(tains)g(the)g=0A=
(SCSI)g(ST)l(A)l(TUS)h(co)q(de)f(for)f(the)h(command,)g(as)f(describ)q(ed=
)450=0A=
1243 y(in)g(section)g(1.7.2.1.)150 1347 y(Byte)f(1)168 b(This)16=0A=
b(b)o(yte)f(con)o(tains)g(the)g(SCSI)h(MESSA)o(GE,)f(as)f(describ)q(ed)k(=
in)e=0A=
(section)f(1.7.2.1.)150 1450 y(Byte)g(2)168 b(This)13 b(b)o(yte)g(holds)g=0A=
(the)g(host)g(adapter's)f(return)g(co)q(de.)20 b(The)13 b(v)m(alid)h(co)q=0A=
(des)g(for)e(this)h(b)o(yte)450 1514 y(are)i(giv)o(en)h(in)g=0A=
FE(scsi.h)e FH(and)h(are)g(describ)q(ed)i(b)q(elo)o(w:)450=0A=
1628 y FE(DID)p 525 1628 15 2 v 17 w(OK)163 b FH(No)15 b(error.)450=0A=
1796 y FE(DID)p 525 1796 V 17 w(NO)p 590 1796 V 17 w(CONNECT)750=0A=
1860 y FH(SCSI)g(SELECTION)g(failed)g(b)q(ecause)g(there)f(w)o(as)f(no)h=0A=
(device)i(at)d(the)750 1924 y(address)i(sp)q(eci\014ed.)450=0A=
2092 y FE(DID)p 525 2092 V 17 w(BUS)p 614 2092 V 17 w(BUSY)750=0A=
2156 y FH(SCSI)h(ARBITRA)l(TION)h(failed.)450 2324 y FE(DID)p=0A=
525 2324 V 17 w(TIME)p 638 2324 V 16 w(OUT)750 2389 y FH(A)12=0A=
b(time-out)g(o)q(ccurred)g(for)g(some)f(unkno)o(wn)h(reason,)g(probably)h=0A=
(dur-)750 2453 y(ing)j(SELECTION)g(or)f(while)h(w)o(aiting)g(for)e=0A=
(RESELECTION.)p eop=0A=
%%Page: 59 70=0A=
59 69 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(59)450 153 y FE(DID)p=0A=
525 153 15 2 v 17 w(BAD)p 614 153 V 17 w(TARGET)750 217 y FH(The)18=0A=
b(SCSI)g(ID)g(of)f(the)g(target)f(w)o(as)h(the)h(same)f(as)g(the)h(SCSI)g=
(ID)=0A=
f(of)750 281 y(the)e(host)g(adapter.)450 385 y FE(DID)p 525=0A=
385 V 17 w(ABORT)91 b FH(The)11 =
b(high-lev)o(el)j(co)q(de)e(called)h(the)e=0A=
(lo)o(w-lev)o(el)i FE(abort\(\))d FH(function)i(\(see)750 449=0A=
y(section)k(1.7.7.2.7\).)450 553 y FE(DID)p 525 553 V 17 w(PARITY)67=0A=
b FH(A)15 b(SCSI)h(P)l(ARITY)g(error)f(w)o(as)f(detected.)450=0A=
656 y FE(DID)p 525 656 V 17 w(ERROR)91 b FH(An)14 b(error)f(o)q(ccurred)i=0A=
(whic)o(h)g(lac)o(ks)f(a)g(more)f(appropriate)h(error)f(co)q(de)750=0A=
721 y(\(for)h(example,)i(an)f(in)o(ternal)h(host)f(adapter)g(error\).)450=0A=
824 y FE(DID)p 525 824 V 17 w(RESET)91 b FH(The)11 =
b(high-lev)o(el)j(co)q(de)=0A=
e(called)h(the)e(lo)o(w-lev)o(el)i FE(reset\(\))d FH(function)i(\(see)750=0A=
889 y(section)k(1.7.7.2.8\).)450 1056 y FE(DID)p 525 1056 V=0A=
17 w(BAD)p 614 1056 V 17 w(INTR)750 1121 y FH(An)g(unexp)q(ected)i(in)o=0A=
(terrupt)e(o)q(ccurred)g FC(and)21 b FH(there)15 =
b(is)i(no)e(appropri-)750=0A=
1185 y(ate)g(w)o(a)o(y)f(to)g(handle)j(this)f(in)o(terrupt.)450=0A=
1298 y(Note)k(that)f(returning)h FE(DID_BUS_BUSY)f =
FH(will)i(force)f(the)g=0A=
(command)g(to)f(b)q(e)i(retried,)450 1363 y(whereas)15 b(returning)h=0A=
FE(DID_NO_CONNECT)d FH(will)k(ab)q(ort)e(the)g(command.)150=0A=
1466 y(Byte)g(3)g(\(MSB\))450 1531 y(This)j(b)o(yte)f(is)g(for)g(a)f=0A=
(high-lev)o(el)k(return)d(co)q(de,)h(and)f(should)h(b)q(e)g(left)f(as)g(z=
ero)=0A=
g(b)o(y)g(the)450 1595 y(lo)o(w-lev)o(el)g(co)q(de.)221 1712=0A=
y(Curren)o(t)e(lo)o(w-lev)o(el)i(driv)o(ers)f(do)g(not)f(uniformly)i(\(or=
)e=0A=
(correctly\))g(implemen)o(t)i(error)f(rep)q(orting,)f(so)150=0A=
1777 y(it)k(ma)o(y)f(b)q(e)i(b)q(etter)f(to)f(consult)i FE(scsi.c)e=0A=
FH(to)h(determine)h(exactly)f(ho)o(w)f(errors)h(should)h(b)q(e)f(rep)q=0A=
(orted,)150 1841 y(rather)c(than)g(exploring)h(existing)g(driv)o(ers.)150=0A=
1992 y FD(1.7.7.2.6)55 b FE(command\(\))150 2110 y FH(The)21=0A=
b FE(command\(\))e =
FH(function)i(pro)q(cesses)g(a)f(SCSI)h(command)f(and)h=0A=
(returns)f(when)h(the)f(command)g(is)150 2174 y(\014nished.)k(When)16=0A=
b(the)g(original)h(SCSI)g(co)q(de)f(w)o(as)f(written,)h(in)o(terrupt-driv=
)o=0A=
(en)h(driv)o(ers)f(w)o(ere)g(not)f(sup-)150 2238 y(p)q(orted.)20=0A=
b(The)13 =
b(old)i(driv)o(ers)f(are)f(m)o(uc)o(h)h(less)g(e\016cien)o(t)g(\(in)=0A=
h(terms)e(of)g(resp)q(onse)h(time)g(and)g(latency\))g(than)150=0A=
2303 =
y(the)f(curren)o(t)g(in)o(terrupt-driv)o(en)h(driv)o(ers,)f(but)g(are)g=0A=
(also)g(m)o(uc)o(h)g(easier)g(to)g(write.)19 b(F)l(or)12 =
b(new)h(driv)o(ers,)=0A=
h(this)150 2367 =
y(command)g(can)h(b)q(e)g(replaced)h(with)e(a)h(call)g(to)f=0A=
(the)h FE(queuecommand\(\))d FH(function,)j(as)f(demonstrated)g(in)150=0A=
2431 y(Figure)h(1.5.)365 2415 y Fm(18)p 150 2471 720 2 v 192=0A=
2503 a FA(18)225 2518 y Fl(Li)q(n)r(u)r(x)20 =
b(0.9)r(9)s(.)q(5)f(k)o(e)q(r)r=0A=
(n)r(e)r(l)r(,)f Fk(linux/ker)o(nel)o(/bl)o(k)p 925 2518 12=0A=
2 v 11 w(drv/scsi/)o(aha)o(15)o(42.)o(c)p Fl(,)12 =
b(wr)q(i)r(t)r(t)q(e)r(n)20=0A=
b(b)o(y)f(T)m(o)q(m)t(m)r(y)h(Th)r(o)r(r)r(n)s(.)p eop=0A=
%%Page: 60 71=0A=
60 70 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(60)245 758 y FE(static)23=0A=
b(volatile)g(int)h(internal_done_flag)93 b(=3D)23 b(0;)245 822=0A=
y(static)g(volatile)g(int)h(internal_done_errcode)d(=3D)i(0;)245=0A=
887 y(static)g(void)215 b(internal_done\()22 =
b(Scsi_Cmnd)g(*SCpnt)h(\))245=0A=
951 y({)293 1016 y(internal_done_errcode)e(=3D)j(SCpnt->result;)293=0A=
1080 y(++internal_done_flag;)245 1144 y(})245 1273 =
y(int)g(aha1542_command\()=0A=
e(Scsi_Cmnd)g(*SCpnt)h(\))245 1337 y({)293 1402 =
y(aha1542_queuecommand\()e=0A=
(SCpnt,)i(internal_done)f(\);)293 1530 =
y(while)h(\(!internal_done_flag\);)293=0A=
1595 y(internal_done_flag)f(=3D)h(0;)293 1659 y(return)g=0A=
(internal_done_errcode;)245 1723 y(})636 1894 y FH(Figure)15=0A=
b(1.5:)k(Example)d FE(command\(\))e FH(F)l(unction)p eop=0A=
%%Page: 61 72=0A=
61 71 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(61)221 88 y(The)14=0A=
b(return)f(v)m(alue)i(is)f(the)g(same)f(as)h(the)g FE(result)e=0A=
FH(v)m(ariable)k(in)e(the)g FE(Scsi_Cmnd)e FH(structure.)19=0A=
b(Please)150 153 =
y(see)c(sections)h(1.7.7.2.5)c(and)k(1.7.8)d(for)i(more)g=0A=
(details.)150 304 y FD(1.7.7.2.7)55 b FE(abort\(\))150 421=0A=
y FH(The)16 =
b(high-lev)o(el)i(SCSI)e(co)q(de)g(handles)h(all)g(timeouts.)k=0A=
(This)16 =
b(frees)g(the)g(lo)o(w-lev)o(el)h(driv)o(er)f(from)f(ha)o(ving)150=0A=
486 =
y(to)i(do)h(timing,)h(and)f(p)q(ermits)h(di\013eren)o(t)g(timeout)e(p)q=0A=
(erio)q(ds)j(to)d(b)q(e)h(used)h(for)e(di\013eren)o(t)i(devices)h(\(e.g.,=
)150=0A=
550 y(the)e(timeout)g(for)f(a)g(SCSI)i(tap)q(e)f(driv)o(e)g(is)g(nearly)h=0A=
(in\014nite,)h(whereas)d(the)h(timeout)g(for)f(a)h(SCSI)g(disk)150=0A=
614 y(driv)o(e)e(is)f(relativ)o(ely)i(short\).)221 702 y(The)c=0A=
FE(abort\(\))e =
FH(function)j(is)f(used)h(to)e(request)h(that)f(the)h(curren)o=0A=
(tly)g(outstanding)g(SCSI)g(command,)150 767 y(indicated)19=0A=
b(b)o(y)d(the)h FE(Scsi_Cmnd)e FH(p)q(oin)o(ter,)j(b)q(e)f(ab)q(orted.)24=0A=
b(After)17 b(setting)g(the)f FE(result)g FH(v)m(ariable)i(in)g(the)150=0A=
831 y FE(Scsi_Cmnd)c FH(structure,)h(the)g FE(abort\(\))f FH(function)j=0A=
(returns)e(zero.)20 b(If)15 b FE(code)p =
FH(,)g(the)g(second)h(parameter)f(to)=0A=
150 895 y(the)f FE(abort\(\))e FH(function,)j(is)f(zero,)f(then)h=0A=
FE(result)f FH(should)i(b)q(e)f(set)f(to)g FE(DID_ABORT)p FH(.)18=0A=
b(Otherwise,)d FE(result)150 960 y FH(shoudl)h(b)q(e)g(set)e(equal)i(to)e=0A=
FE(code)p FH(.)20 b(If)15 b FE(code)f FH(is)i(not)e(zero,)h(it)g(is)h=0A=
(usually)g FE(DID_TIME_OUT)d FH(or)i FE(DID_RESET)p FH(.)221=0A=
1048 =
y(Curren)o(tly)l(,)e(none)h(of)f(the)g(lo)o(w-lev)o(el)i(driv)o(ers)f=0A=
(is)f(able)i(to)d(correctly)i(ab)q(ort)f(a)g(SCSI)h(command.)19=0A=
b(The)150 1112 y(initiator)13 =
b(should)f(request)g(\(b)o(y)g(asserting)g(the)=0A=
g FE(-ATN)f FH(line\))i(that)e(the)h(target)f(en)o(ter)h(a)f(MESSA)o(GE)h=0A=
(OUT)150 1176 y(phase.)20 =
b(Then,)c(the)f(initiator)h(should)g(send)g(an)f=0A=
(ABOR)l(T)h(message)f(to)f(the)i(target.)150 1328 y FD(1.7.7.2.8)55=0A=
b FE(reset\(\))150 1445 y FH(The)15 b FE(reset\(\))e =
FH(function)i(is)g(used)=0A=
g(to)f(reset)g(the)g(SCSI)h(bus.)20 b(After)14 =
b(a)g(SCSI)h(bus)g(reset,)f=0A=
(an)o(y)g(executing)150 1509 y(command)h(should)h(fail)g(with)g(a)f=0A=
FE(DID_RESET)f FH(result)h(co)q(de)h(\(see)f(section)h(1.7.7.2.5\).)221=0A=
1597 =
y(Curren)o(tly)l(,)k(none)g(of)f(the)g(lo)o(w-lev)o(el)i(driv)o(ers)e=0A=
(handles)i(resets)e(correctly)l(.)33 b(T)l(o)19 =
b(correctly)g(reset)g(a)150=0A=
1662 y(SCSI)h(command,)f(the)g(initiator)g(should)h(request)f(\(b)o(y)g=0A=
(asserting)g(the)f FE(-ATN)h FH(line\))h(that)e(the)h(target)150=0A=
1726 y(en)o(ter)d(a)h(MESSA)o(GE)f(OUT)g(phase.)25 b(Then,)16=0A=
b(the)h(initiator)g(should)h(send)f(a)f(BUS)h(DEVICE)g(RESET)150=0A=
1790 y(message)d(to)g(the)g(target.)19 b(It)14 b(ma)o(y)g(also)g(b)q(e)h=0A=
(necessary)g(to)f(initiate)h(a)f(SCSI)i(RESET)e(b)o(y)h(asserting)f(the)1=
50=0A=
1855 y FE(-RST)g =
FH(line,)i(whic)o(h)f(will)h(cause)e(all)i(target)d(devices)=0A=
j(to)d(b)q(e)i(reset.)20 b(After)14 b(a)g(reset,)f(it)i(ma)o(y)f(b)q(e)h=0A=
(necessary)150 1919 y(to)g(renegotiate)g(a)f(sync)o(hronous)i(comm)o=0A=
(unications)f(proto)q(col)h(with)f(the)g(targets.)150 2070=0A=
y FD(1.7.7.2.9)55 b FE(slave)p 514 2070 15 2 v 17 w(attach\(\))150=0A=
2188 y FH(The)16 b FE(slave)p 367 2188 V 17 w(attach\(\))f=0A=
FH(function)h(is)h FC(not)j FH(curren)o(tly)d(implemen)o(ted.)24=0A=
b(This)16 b(function)h(w)o(ould)g(b)q(e)f(used)150 2252 =
y(to)h(negotiate)g=0A=
(sync)o(hronous)g(comm)o(unications)h(b)q(et)o(w)o(een)g(the)f(host)g=0A=
(adapter)g(and)g(the)h(target)e(driv)o(e.)150 2316 y(This)i(negotiation)g=0A=
(requires)h(an)e(exc)o(hange)h(of)g(a)f(pair)h(of)f(SYNCHR)o(ONOUS)j(D)o(=
A)l=0A=
(T)l(A)d(TRANSFER)150 2381 =
y(REQUEST)k(messages)g(b)q(et)o(w)o(een)f(the)h=0A=
(initiator)g(and)g(the)g(target.)35 b(This)21 =
b(exc)o(hange)g(should)h(o)q=0A=
(ccur)150 2445 y(under)16 =
b(the)f(follo)o(wing)h(conditions)h([LXT91)o(]:)p=0A=
eop=0A=
%%Page: 62 73=0A=
62 72 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(62)332 88 y(A)21 =
b(SCSI)h(device)h=0A=
(that)e(supp)q(orts)g(sync)o(hronous)g(data)g(transfer)g(recognizes)h(it)=
f=0A=
(has)264 153 =
y(not)d(comm)o(unicated)g(with)h(the)f(other)g(SCSI)h(device)h=0A=
(since)f(receiving)h(the)f(last)f(\\hard")264 217 y(RESET.)332=0A=
281 y(A)j(SCSI)h(device)h(that)e(supp)q(orts)g(sync)o(hronous)g(data)g=0A=
(transfer)g(recognizes)h(it)f(has)264 346 y(not)15 =
b(comm)o(unicated)i(with)g=0A=
(the)f(other)g(SCSI)g(device)i(since)f(receiving)h(a)e(BUS)g(DEVICE)264=0A=
410 y(RESET)f(message.)150 562 y FD(1.7.7.2.10)55 b FE(bios)p=0A=
516 562 15 2 v 17 w(param\(\))150 679 y FH(Lin)o(ux)18 =
b(supp)q(orts)g(the)f=0A=
(MS-DOS)727 662 y Fm(19)782 679 y =
FH(hard)g(disk)h(partitioning)g(system.)26=0A=
b(Eac)o(h)17 b(disk)h(con)o(tains)f(a)g(\\par-)150 743 =
y(tition)h(table")g=0A=
(whic)o(h)g(de\014nes)h(ho)o(w)e(the)h(disk)g(is)g(divided)i(in)o(to)d=0A=
(logical)i(sections.)28 b(In)o(terpretation)17 b(of)150 808=0A=
y(this)i(partition)h(table)f(requires)g(information)g(ab)q(out)g(the)g(si=
ze)h=0A=
(of)e(the)h(disk)h(in)g(terms)e(of)g(cylinders,)150 872 y(heads,)d(and)g=0A=
(sectors)f(p)q(er)h(cylinder.)22 b(SCSI)16 b(disks,)f(ho)o(w)o(ev)o(er,)f=0A=
(hide)i(their)f(ph)o(ysical)h(geometry)e(and)h(are)150 936=0A=
y(accessed)h(logically)h(as)d(a)h(con)o(tiguous)g(list)h(of)f(sectors.)k=0A=
(Therefore,)c(in)g(order)g(to)g(b)q(e)g(compatible)i(with)150=0A=
1001 y(MS-DOS,)h(the)f(SCSI)h(host)g(adapter)f(will)i(\\lie")f(ab)q(out)g=0A=
(its)g(geometry)l(.)26 b(The)18 b(ph)o(ysical)h(geometry)d(of)150=0A=
1065 =
y(the)h(SCSI)g(disk,)g(while)h(a)o(v)m(ailable,)g(is)f(seldom)g(used)g=0A=
(as)f(the)h(\\logical)g(geometry)l(.")23 b(\(The)17 b(reasons)f(for)150=0A=
1129 =
y(this)g(in)o(v)o(olv)o(e)f(arc)o(haic)h(and)f(arbitrary)g(limitations)h=0A=
(imp)q(osed)h(b)o(y)e(MS-DOS.\))221 1217 y(Lin)o(ux)20 b(needs)f(to)f=0A=
(determine)i(the)f(\\logical)h(geometry")e(so)g(that)g(it)h(can)g(correct=
ly)g=0A=
(mo)q(dify)h(and)150 1282 y(in)o(terpret)f(the)h(partition)f(table.)33=0A=
b(Unfortunately)l(,)20 =
b(there)f(is)h(no)f(standard)g(metho)q(d)g(for)g(con)o=0A=
(v)o(erting)150 1346 y(b)q(et)o(w)o(een)d(ph)o(ysical)i(and)e(logical)h=0A=
(geometry)l(.)k(Hence,)c(the)f FE(bios)p 1274 1346 V 17 w(param\(\))f=0A=
FH(function)i(w)o(as)e(in)o(tro)q(duced)150 1410 =
y(in)h(an)f(attempt)f(to)h=0A=
(pro)o(vide)h(access)f(to)g(the)g(host)g(adapter)f(geometry)h(information=
.)=0A=
221 1498 y(The)h FE(size)f =
FH(parameter)h(is)g(the)g(size)h(of)f(the)g(disk)h=0A=
(in)g(sectors.)k(Some)16 b(host)g(adapters)g(use)g(a)g(deter-)150=0A=
1562 y(ministic)f(form)o(ula)e(based)h(on)f(this)h(n)o(um)o(b)q(er)g(to)f=0A=
(calculate)i(the)e(logical)i(geometry)d(of)h(the)h(driv)o(e.)20=0A=
b(Other)150 1627 y(host)12 =
b(adapters)f(store)g(geometry)h(information)g(in)h=0A=
(tables)f(whic)o(h)h(the)f(driv)o(er)g(can)g(access.)19 b(T)l(o)12=0A=
b(facilitate)150 1691 y(this)j(access,)f(the)g FE(dev)f =
FH(parameter)h(con)o=0A=
(tains)g(the)g(driv)o(e's)g(device)i(n)o(um)o(b)q(er.)j(Tw)o(o)14=0A=
b(macros)f(are)h(de\014ned)150 1756 y(in)19 b FE(linux/fs.h)f=0A=
FH(whic)o(h)h(will)h(help)g(to)e(in)o(terpret)h(this)g(v)m(alue:)28=0A=
b FE(MAJOR\(dev\))17 b FH(is)i(the)g(device's)g(ma)s(jor)150=0A=
1820 y(n)o(um)o(b)q(er,)i(and)e FE(MINOR\(dev\))g =
FH(is)h(the)f(device's)i=0A=
(minor)f(n)o(um)o(b)q(er.)33 b(These)20 =
b(are)g(the)f(same)h(ma)s(jor)e(and)=0A=
150 1884 =
y(minor)h(device)i(n)o(um)o(b)q(ers)e(used)h(b)o(y)f(the)g(standard)=0A=
g(Lin)o(ux)h FE(mknod)f FH(command)g(to)f(create)h(the)h(device)150=0A=
1949 y(in)f(the)g FE(/dev)f FH(directory)l(.)30 b(The)19 b=0A=
FE(info)f =
FH(parameter)g(p)q(oin)o(ts)h(to)f(an)g(arra)o(y)g(of)g(three)g(in)=0A=
o(tegers)h(that)f(the)150 2013 y FE(bios_param\(\))c FH(function)i(will)g=0A=
(\014ll)h(in)f(b)q(efore)g(returning:)150 2130 y FE(info[0])132=0A=
b FH(Num)o(b)q(er)16 b(of)e(heads)150 2234 y FE(info[1])132=0A=
b FH(Num)o(b)q(er)16 b(of)e(sectors)h(p)q(er)h(cylinder)150=0A=
2337 y FE(info[2])132 b FH(Num)o(b)q(er)16 b(of)e(cylinders)221=0A=
2454 y(The)k(information)h(in)g FE(info)e FH(is)i FC(not)k=0A=
FH(the)18 =
b(ph)o(ysical)i(geometry)d(of)h(the)h(driv)o(e,)g(but)f(only)h(a)f=0A=
FC(lo)n(gic)n(al)p 150 2494 720 2 v 192 2526 a FA(19)225 2541=0A=
y =
Fl(M)q(S)s(-)q(D)s(O)t(S)h(is)f(a)e(reg)s(i)r(s)q(t)r(e)r(r)r(e)r(d)j(tra=
)s=0A=
(d)s(e)q(m)t(a)r(r)r(k)g(of)f(M)q(i)r(c)r(r)q(o)s(s)q(o)s(f)q(t)g(Co)r(r)=
r(p)=0A=
t(o)r(r)r(a)r(t)r(i)r(o)r(n)s(.)p eop=0A=
%%Page: 63 74=0A=
63 73 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(63)150 88 y(geometry)12=0A=
b(that)g(is)h(iden)o(tical)i(to)d(the)g FC(lo)n(gic)n(al)17=0A=
b FH(geometry)11 =
b(used)j(b)o(y)e(MS-DOS)h(to)f(access)h(the)g(driv)o(e.)20=0A=
b(The)150 153 =
y(distinction)d(b)q(et)o(w)o(een)f(ph)o(ysical)g(and)f(logical)=0A=
i(geometry)d(cannot)h(b)q(e)h(o)o(v)o(erstressed.)150 306 y=0A=
Fq(1.7.8)55 b(The)19 b Fp(Scsi)p 543 306 16 2 v 17 w(Cmnd)e=0A=
Fq(Structure)150 423 y FH(The)c FE(Scsi_Cmnd)e FH(structure,)661=0A=
407 y Fm(20)711 423 y =
FH(as)i(sho)o(wn)f(in)i(Figure)f(1.6,)f(is)h(used)g(b)o=0A=
(y)g(the)g(high-lev)o(el)i(co)q(de)f(to)e(sp)q(ecify)150 488=0A=
y(a)19 =
b(SCSI)g(command)g(for)f(execution)i(b)o(y)f(the)g(lo)o(w-lev)o(el)h=0A=
(co)q(de.)32 b(Man)o(y)18 b(v)m(ariables)i(in)g(the)f FE(Scsi_Cmnd)150=0A=
552 y =
FH(structure)e(can)h(b)q(e)g(ignored)g(b)o(y)g(the)f(lo)o(w-lev)o(el)i=0A=
(device)g(driv)o(er|other)f(v)m(ariables,)h(ho)o(w)o(ev)o(er,)e(are)h(ex-=
)150=0A=
616 y(tremely)e(imp)q(ortan)o(t.)150 768 y FD(1.7.8.1)54 b(Reserv)o(ed)17=0A=
b(Areas)150 885 y(1.7.8.1.1)55 b(Informativ)o(e)18 b(V)l(ariables)150=0A=
1002 y FE(host)d FH(is)g(an)g(index)i(in)o(to)e(the)g FE(scsi_hosts)f=0A=
FH(arra)o(y)l(.)221 1090 y FE(target)f FH(stores)h(the)g(SCSI)h(ID)f(of)g=0A=
(the)g(target)g(of)f(the)i(SCSI)g(command.)k(This)c(information)g(is)f(im=
-)=0A=
150 1154 =
y(p)q(ortan)o(t)f(if)h(m)o(ultiple)h(outstanding)e(commands)h(or)f=0A=
(m)o(ultiple)i(commands)e(p)q(er)h(target)f(are)g(supp)q(orted.)221=0A=
1242 y FE(cmnd)18 b =
FH(is)h(an)f(arra)o(y)g(of)g(b)o(ytes)g(whic)o(h)i(hold)f=0A=
(the)g(actual)g(SCSI)g(command.)31 b(These)19 b(b)o(ytes)f(should)150=0A=
1307 =
y(b)q(e)f(sen)o(t)e(to)h(the)f(SCSI)i(target)e(during)i(the)f(COMMAND)f=0A=
(phase.)22 b FE(cmnd[0])15 b FH(is)h(the)g(SCSI)h(command)150=0A=
1371 y(co)q(de.)j(The)14 b FE(COMMAND_SIZE)e FH(macro,)h(de\014ned)i(in)g=0A=
FE(scsi.h)p =
FH(,)e(can)h(b)q(e)g(used)h(to)e(determine)i(the)f(length)g(of)=0A=
150 1435 y(the)h(curren)o(t)g(SCSI)h(command.)221 1523 y FE(result)10=0A=
b =
FH(is)h(used)h(to)e(store)g(the)h(result)h(co)q(de)f(from)f(the)h(SCSI)h=0A=
(request.)19 b(Please)11 b(see)g(section)h(1.7.7.2.5)150 1588=0A=
y(for)18 b(more)g(information)h(ab)q(out)g(this)g(v)m(ariable.)32=0A=
b(This)19 b(v)m(ariable)i FC(must)i =
FH(b)q(e)c(correctly)g(set)g(b)q(efore)g=0A=
(the)150 1652 y(lo)o(w-lev)o(el)e(routines)e(return.)150 1803=0A=
y FD(1.7.8.1.2)55 b(The)18 b(Scatter-Gather)j(List)150 1921=0A=
y FE(use_sg)e =
FH(con)o(tains)h(a)f(coun)o(t)h(of)f(the)h(n)o(um)o(b)q(er)g=0A=
(of)f(pieces)j(in)e(the)g(scatter-gather)e(c)o(hain.)35 b(If)20=0A=
b FE(use_sg)150 1985 y FH(is)26 b(zero,)h(then)e FE(request_buffer)e=0A=
FH(p)q(oin)o(ts)j(to)e(the)h(data)f(bu\013er)i(for)f(the)g(SCSI)h(command=
,)h=0A=
(and)150 2049 y FE(request_bufflen)14 b =
FH(is)i(the)f(length)i(of)e(this)h=0A=
(bu\013er)g(in)h(b)o(ytes.)k(Otherwise,)16 b FE(request_buffer)e=0A=
FH(p)q(oin)o(ts)150 2114 y(to)f(an)h(arra)o(y)f(of)h FE(scatterlist)e=0A=
FH(structures,)i(and)g FE(use_sg)f =
FH(will)i(indicate)h(ho)o(w)d(man)o(y)h=0A=
(suc)o(h)g(structures)150 2178 =
y(are)h(in)h(the)f(arra)o(y)l(.)k(The)c(use)h=0A=
(of)f FE(request_buffer)e =
FH(is)j(non-in)o(tuitiv)o(e)h(and)e(confusing.)221=0A=
2266 y(Eac)o(h)e(elemen)o(t)i(of)e(the)h FE(scatterlist)e =
FH(arra)o(y)h(con)o=0A=
(tains)h(an)g FE(address)f FH(and)h(a)f FE(length)g =
FH(comp)q(onen)o(t.)150=0A=
2330 y(If)i(the)g FE(unchecked_isa_dma)e FH(\015ag)h(in)i(the)f=0A=
FE(Scsi_Host)f FH(structure)g(is)i(set)f(to)f(1)g(\(see)h(section)h=0A=
(1.7.7.1.7)150 2395 =
y(for)h(more)f(information)i(on)f(DMA)g(transfers\),)f=0A=
(the)h(address)h(is)f(guaran)o(teed)g(to)g(b)q(e)h(within)g(the)f(\014rst=
)150=0A=
2459 y(16)j(MB)g(of)g(ph)o(ysical)i(memory)l(.)35 b(Large)21=0A=
b(amoun)o(ts)e(of)h(data)g(will)i(b)q(e)g(pro)q(cessed)f(b)o(y)f(a)g(sing=
le)i=0A=
(SCSI)p 150 2498 720 2 v 192 2531 a FA(20)225 2546 y =
Fl(Li)q(n)r(u)r(x)e(0.9)=0A=
r(9)s(.)q(7)f(k)o(e)q(r)r(n)r(e)r(l)r(,)f Fk(linux/ker)o(nel)o(/bl)o(k)p=0A=
925 2546 12 2 v 11 w(drv/scsi/)o(scs)o(i.)o(h)p eop=0A=
%%Page: 64 75=0A=
64 74 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(64)245 144 y FE(typedef)23=0A=
b(struct)g(scsi_cmnd)245 209 y({)293 273 y(int)334 b(host;)293=0A=
338 y(unsigned)23 b(char)95 b(target,)699 402 y(lun,)699 466=0A=
y(index;)293 531 y(struct)23 b(scsi_cmnd)g(*next,)699 595 y(*prev;)293=0A=
724 y(unsigned)g(char)95 b(cmnd[10];)293 788 y(unsigned)214=0A=
b(request_bufflen;)293 852 y(void)310 b(*request_buffer;)293=0A=
981 y(unsigned)23 b(char)95 b(data_cmnd[10];)293 1045 y(unsigned)23=0A=
b(short)71 b(use_sg;)293 1110 y(unsigned)23 b(short)71 b(sglist_len;)293=0A=
1174 y(unsigned)214 b(bufflen;)293 1239 y(void)310 b(*buffer;)293=0A=
1367 y(struct)23 b(request)71 b(request;)293 1432 y(unsigned)23=0A=
b(char)95 b(sense_buffer[16];)293 1496 y(int)334 b(retries;)293=0A=
1560 y(int)g(allowed;)293 1625 y(int)g(timeout_per_command,)699=0A=
1689 y(timeout_total,)699 1753 y(timeout;)293 1818 y(unsigned)23=0A=
b(char)95 b(internal_timeout;)293 1882 y(unsigned)214 b(flags;)293=0A=
2011 y(void)23 b(\(*scsi_done\)\(struct)f(scsi_cmnd)g(*\);)293=0A=
2075 y(void)h(\(*done\)\(struct)f(scsi_cmnd)h(*\);)293 2204=0A=
y(Scsi_Pointer)118 b(SCp;)293 2268 y(unsigned)23 b(char)95=0A=
b(*host_scribble;)293 2333 y(int)334 b(result;)245 2461 y(})24=0A=
b(Scsi_Cmnd;)681 2632 y FH(Figure)15 b(1.6:)k(The)d FE(Scsi)p=0A=
1108 2632 15 2 v 16 w(Cmnd)f FH(Structure)p eop=0A=
%%Page: 65 76=0A=
65 75 bop 150 -84 1800 3 v 150 -100 a FD(1.7.)42 b(W)l(riting)19=0A=
b(a)f(SCSI)f(Device)h(Driv)o(er)946 b FH(65)150 88 y(command.)19=0A=
b(The)13 b(length)h(of)e(these)h(data)g(will)h(b)q(e)g(equal)f(to)g(the)g=0A=
(sum)g(of)f(the)h(lengths)h(of)e(all)i(the)f(bu\013ers)150=0A=
153 y(p)q(oin)o(ted)j(to)f(b)o(y)g(the)g FE(scatterlist)f =
FH(arra)o(y)l(.)150=0A=
304 y FD(1.7.8.2)54 b(Scratc)o(h)19 b(Areas)150 421 y =
FH(Dep)q(ending)e(on)d=0A=
(the)h(capabilities)i(and)f(requiremen)o(ts)f(of)f(the)h(host)g(adapter,)=
f=0A=
(the)h(scatter-gather)e(list)150 486 y(can)18 =
b(b)q(e)h(handled)h(in)e(a)g(v)=0A=
m(ariet)o(y)g(of)g(w)o(a)o(ys.)27 b(T)l(o)18 b(supp)q(ort)g(m)o(ultiple)i=0A=
(metho)q(ds,)f(sev)o(eral)f(scratc)o(h)g(areas)150 550 =
y(are)d(pro)o(vided)h=0A=
(for)e(the)i(exclusiv)o(e)h(use)e(of)g(the)g(lo)o(w-lev)o(el)i(driv)o(er.=
)150=0A=
702 y FD(1.7.8.2.1)55 b(The)18 b FE(scsi)p 597 702 15 2 v 16=0A=
w(done\(\))f FD(P)o(oin)o(ter)150 819 y =
FH(This)e(p)q(oin)o(ter)g(should)h(b)=0A=
q(e)f(set)f(to)g(the)h FE(done\(\))f =
FH(function)h(p)q(oin)o(ter)g(in)h(the)e=0A=
FE(queuecommand\(\))f FH(function)150 883 y(\(see)i(section)h(1.7.7.2.4)c=0A=
(for)j(more)g(information\).)k(There)d(are)f(no)g(other)g(uses)g(for)g(th=
is)g=0A=
(p)q(oin)o(ter.)150 1035 y FD(1.7.8.2.2)55 b(The)18 b FE(host)p=0A=
597 1035 V 16 w(scribble)f FD(P)o(oin)o(ter)150 1152 y =
FH(The)j(high-lev)o=0A=
(el)i(co)q(de)e(supplies)i(a)d(pair)h(of)g(memory)f(allo)q(cation)i=0A=
(functions,)g FE(scsi_malloc\(\))d FH(and)150 1216 y FE(scsi_free\(\))p=0A=
FH(,)13 =
b(whic)o(h)i(are)f(guaran)o(teed)g(to)f(return)h(memory)g(in)h(the)g=0A=
(\014rst)f(16)f(MB)h(of)g(ph)o(ysical)i(mem-)150 1280 y(ory)l(.)24=0A=
b(This)18 =
b(memory)e(is,)h(therefore,)f(suitable)i(for)f(use)g(with)g(DMA.)24=0A=
b(The)17 b(amoun)o(t)f(of)g(memory)g(allo-)150 1345 y(cated)f(p)q(er)h=0A=
(request)g FC(must)k =
FH(b)q(e)c(a)f(m)o(ultiple)i(of)e(512)g(b)o(ytes,)g(and)=0A=
h FC(must)k FH(b)q(e)c(less)g(than)f(or)g(equal)h(to)f(4096)150=0A=
1409 y(b)o(ytes.)21 b(The)16 b(total)e(amoun)o(t)h(of)g(memory)g(a)o(v)m=0A=
(ailable)j(via)e FE(scsi_malloc\(\))d =
FH(is)j(a)g(complex)g(function)g(of)150=0A=
1474 y(the)f FE(Scsi_Host)e FH(structure)i(v)m(ariables)h =
FE(sg_tablesize)p=0A=
FH(,)d FE(cmd_per_lun)p FH(,)g(and)i FE(unchecked_isa_dma)p=0A=
FH(.)221 1561 y(The)h FE(host_scribble)e FH(p)q(oin)o(ter)i(is)g(a)o(v)m=0A=
(ailable)i(to)d(p)q(oin)o(t)h(to)g(a)f(region)h(of)g(memory)f(allo)q(cate=
d)i=0A=
(with)150 1626 y FE(scsi_malloc\(\))p =
FH(.)h(The)d(lo)o(w-lev)o(el)h(SCSI)f=0A=
(driv)o(er)g(is)g(resp)q(onsible)i(for)c(managing)i(this)g(p)q(oin)o(ter)=
g=0A=
(and)g(its)150 1690 =
y(asso)q(ciated)g(memory)l(,)g(and)g(should)h(free)g(the)=0A=
f(area)g(when)g(it)h(is)f(no)h(longer)f(needed.)150 1842 y=0A=
FD(1.7.8.2.3)55 b(The)18 b FE(Scsi)p 597 1842 V 16 w(Pointer)f=0A=
FD(Structure)150 1959 y FH(The)g FE(SCp)e =
FH(v)m(ariable,)j(a)e(structure)g=0A=
(of)g(t)o(yp)q(e)g FE(Scsi_Pointer)p =
FH(,)f(is)i(describ)q(ed)h(in)f(Figure)f=0A=
(1.7.)23 b(The)16 b(v)m(ari-)150 2023 =
y(ables)g(in)g(this)g(structure)f(can)h=0A=
(b)q(e)g(used)g(in)g FC(any)j FH(w)o(a)o(y)c(necessary)g(in)h(the)g(lo)o=0A=
(w-lev)o(el)h(driv)o(er.)k(T)o(ypically)l(,)150 2087 y FE(buffer)g=0A=
FH(p)q(oin)o(ts)g(to)g(the)h(curren)o(t)f(en)o(try)g(in)h(the)g=0A=
FE(scatterlist)p FH(,)f FE(buffers_residual)e FH(coun)o(ts)i(the)150=0A=
2152 y(n)o(um)o(b)q(er)c(of)f(en)o(tries)h(remaining)g(in)g(the)g=0A=
FE(scatterlist)p FH(,)e FE(ptr)g =
FH(is)i(used)g(as)f(a)h(p)q(oin)o(ter)f(in)o=0A=
(to)h(the)f(bu\013er,)150 2216 y(and)i FE(this_residual)d =
FH(coun)o(ts)i(the)=0A=
h(c)o(haracters)f(remaining)h(in)h(the)e(transfer.)26 b(Some)17=0A=
b(host)g(adapters)150 2281 =
y(require)f(supp)q(ort)f(of)g(this)h(detail)g(of)f=0A=
(in)o(teraction|others)g(can)h(completely)g(ignore)g(this)f(structure.)22=
1=0A=
2368 =
y(The)c(second)h(set)f(of)g(v)m(ariables)h(pro)o(vide)g(con)o(v)o(enien)=0A=
o(t)g(lo)q(cations)g(to)f(store)f(SCSI)i(status)f(information)150=0A=
2433 y(and)k(v)m(arious)h(p)q(oin)o(ters)g(and)f(\015ags.)p=0A=
eop=0A=
%%Page: 66 77=0A=
66 76 bop 150 -84 1800 3 v 150 -100 a FD(1.8.)42 =
b(Ac)o(kno)o(wledgemen)o(ts)=0A=
1198 b FH(66)245 144 y FE(typedef)23 b(struct)g(scsi_pointer)245=0A=
209 y({)293 273 y(char)358 b(*ptr;)309 b(/*)24 b(data)f(pointer)g(*/)293=0A=
338 y(int)382 b(this_residual;)93 b(/*)24 =
b(left)f(in)h(this)f(buffer)g(*/)=0A=
293 402 y(struct)g(scatterlist)g(*buffer;)237 b(/*)24 =
b(which)f(buffer)g(*/)=0A=
293 466 y(int)382 b(buffers_residual;)21 =
b(/*)j(how)f(many)g(buffers)g(left)h=0A=
(*/)293 595 y(volatile)f(int)167 b(Status;)293 659 y(volatile)23=0A=
b(int)167 b(Message;)293 724 y(volatile)23 b(int)167 b(have_data_in;)293=0A=
788 y(volatile)23 b(int)167 b(sent_command;)293 852 y(volatile)23=0A=
b(int)167 b(phase;)245 917 y(})24 b(Scsi_Pointer;)645 1087=0A=
y FH(Figure)16 b(1.7:)i(The)e FE(Scsi)p 1072 1087 15 2 v 17=0A=
w(Pointer)e FH(Structure)150 1262 y Ft(1.8)70 =
b(Ac)n(kno)n(wledgemen)n(ts)150=0A=
1395 y FH(Thanks)14 =
b(to)g(Drew)g(Ec)o(khardt,)f(Mic)o(hael)j(K.)e(Johnson,)g=0A=
(Karin)h(Bo)q(es,)g(Dev)o(esh)f(Bhatnagar,)f(and)i(Doug)150=0A=
1459 =
y(Ho\013man)f(for)g(reading)g(early)h(v)o(ersions)f(of)g(this)g(pap)q=0A=
(er)h(and)f(for)g(pro)o(viding)h(man)o(y)f(helpful)i(commen)o(ts.)150=0A=
1523 y(Sp)q(ecial)f(thanks)e(to)g(m)o(y)f(o\016cial)i(COMP-291)e=0A=
(\(Professional)h(W)l(riting)h(in)g(Computer)e(Science\))j(\\read-)150=0A=
1588 =
y(ers,")f(Professors)g(P)o(eter)h(Calingaert)h(and)f(Ra)s(j)g(Kumar)g=0A=
(Singh.)150 1765 y Ft(1.9)70 b(Net)n(w)n(ork)22 b(Device)f(Driv)n(ers)150=0A=
1898 y FD([I)15 =
b(ha)o(v)o(e)e(not)i(written)g(this)g(section)g(b)q(ecause)g=0A=
(I)f(don't)i(kno)o(w)d(an)o(ything)i(ab)q(out)g(it.)24 b(I)14=0A=
b(w)o(ould)150 1962 y(appreciate)20 b(help)e(with)g(this.)221=0A=
2050 y(Note)24 b(that)i(Donald)f(Bec)o(k)o(er)f(has)h(written)h(an)e=0A=
(excellen)o(t)i(sk)o(eleton)e(device)g(driv)o(er)150 2114 y(whic)o(h)18=0A=
b(is)f(a)h(v)o(ery)f(go)q(o)q(d)h(start)h(to)o(w)o(ards)e(writing)j(a)d(n=
et)o=0A=
(w)o(ork)g(device)h(driv)o(er.])p eop=0A=
%%Page: 67 78=0A=
67 77 bop 150 438 a Fv(Chapter)34 b(2)150 686 y Fx(The)40 b=0A=
Fd(/pro)s(c)f Fx(\014lesystem)150 940 y FH(The)15 =
b(pro)q(c)g(\014lesystem)g=0A=
(is)g(an)f(in)o(terface)h(to)f(sev)o(eral)h(k)o(ernel)g(data)f(structures=
)g=0A=
(whic)o(h)i(b)q(eha)o(v)o(es)e(remark-)150 1004 y(ably)g(lik)o(e)g(a)f=0A=
(\014lesystem.)20 b(Instead)14 b(of)e(ha)o(ving)i(to)e(read)i(/dev/kmem)f=0A=
(and)g(ha)o(v)o(e)g(some)g(w)o(a)o(y)f(of)h(kno)o(wing)150=0A=
1069 y(where)k(things)h(are,)496 1052 y Fm(1)532 1069 y FH(all)g(an)f=0A=
(application)h(has)f(to)f(do)h(is)h(read)f(\014les)g(and)h(directories)g(=
in)f=0A=
(/pro)q(c.)25 b(This)150 1133 y(w)o(a)o(y)l(,)13 =
b(all)j(the)e(addresses)g=0A=
(of)g(the)h(k)o(ernel)g(data)e(structures)h(are)g(compiled)i(in)o(to)f(th=
e)f=0A=
(pro)q(c)h(\014lesystem)g(at)150 1198 =
y(k)o(ernel)f(compile)i(time,)e(and)f=0A=
(programs)g(whic)o(h)h(use)g(the)g(/pro)q(c)g(in)o(terface)g(need)g(not)g=
(b)q=0A=
(e)g(recompiled)h(or)150 1262 =
y(up)q(dated)j(when)f(the)h(k)o(ernel)g(is)f=0A=
(recompiled.)27 b(It)17 =
b(is)h(p)q(ossible)h(to)d(moun)o(t)h(the)g(pro)q(c)g=0A=
(\014lesystem)h(some-)150 1326 y(where)e(other)g(than)g(/pro)q(c,)g(but)g=0A=
(that)f(destro)o(ys)h(the)g(nice)h(predictablit)o(y)h(of)d(the)i(pro)q(c)=
f=0A=
(\014lesystem,)g(so)150 1391 =
y(w)o(e)e(will)j(con)o(v)o(enien)o(tly)f(ignore)=0A=
f(that)f(option.)20 b(The)15 =
b(information)g(should)g(somewhat)f(resem)o(ble)=0A=
i(Lin)o(ux)150 1455 y(1.0.)150 1632 y Ft(2.1)70 b Fc(/proc)24=0A=
b Ft(Directories)d(and)i(Files)150 1765 y =
FD([This)d(section)f(should)h(b)q=0A=
(e)f(sev)o(erly)f(cut,)i(and)f(the)g(full)h(v)o(ersion)f(put)g(in)g(the)g=0A=
(LPG)g(when)150 1829 y(that)g(is)e(a)o(v)m(ailable.)26 b(In)17=0A=
b(the)h(mean)f(time,)i(b)q(etter)g(here)f(than)g(no)o(where.])221=0A=
1917 y =
FH(In)c(/pro)q(c,)f(there)g(is)h(a)f(sub)q(directory)i(for)d(ev)o(ery)=0A=
i(running)g(pro)q(cess,)g(named)f(b)o(y)h(the)f(n)o(um)o(b)q(er)h(of)f(th=
e)=0A=
150 1982 y(pro)q(cess's)j FE(pid)p FH(.)22 b(These)16 =
b(directories)h(will)h=0A=
(b)q(e)f(explained)h(b)q(elo)o(w.)23 b(There)16 =
b(are)g(also)g(sev)o(eral)g=0A=
(other)g(\014les)150 2046 y(and)f(directories.)21 b(These)16=0A=
b(are:)150 2163 y FE(self)204 b FH(This)18 =
b(refers)f(to)g(the)g(pro)q(cess)h=0A=
(accessing)g(the)f(pro)q(c)h(\014lesystem,)g(and)g(is)f(iden)o(tical)j(to=
)450=0A=
2227 y(the)15 =
b(directory)h(named)f(b)o(y)g(the)h(pro)q(cess)f(id)h(of)f(the)=0A=
g(pro)q(cess)h(doing)f(the)h(lo)q(ok-up.)150 2331 y FE(kmsg)204=0A=
b FH(This)15 b(\014le)h(can)f(b)q(e)g(used)h(instead)f(of)f(the)h=0A=
FE(syslog\(\))e FH(system)i(call)h(to)e(log)g(k)o(ernel)i(mes-)450=0A=
2395 y(sages.)21 b(A)15 =
b(pro)q(cess)h(m)o(ust)f(ha)o(v)o(e)g(sup)q(eruser)i=0A=
(priviledges)h(to)d(read)g(this)h(\014le,)h(and)e(only)450=0A=
2460 y(one)k(pro)q(cess)g(should)h(read)f(this)h(\014le.)32=0A=
b(This)20 b(\014le)g(should)g FD(not)f =
FH(b)q(e)h(read)f(if)g(a)g(syslog)p=0A=
150 2499 720 2 v 207 2531 a FA(1)225 2546 y =
Fl(Us)r(u)r(a)s(l)q(l)r(y)h(a)c=0A=
(\014l)q(e)j(ca)q(l)r(l)r(e)r(d)h(a)c(na)r(m)s(e)r(l)r(i)r(s)r(t)i(\014l)=
r(e)=0A=
r(,)g(oft)r(e)r(n)h(/e)q(t)r(c)r(/)r(p)s(s)r(d)r(a)s(t)q(a)s(b)r(a)s(s)r(=
e)r=0A=
(.)1027 2678 y FH(67)p eop=0A=
%%Page: 68 79=0A=
68 78 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)36 b FE(/proc)17=0A=
b FD(Directories)j(and)e(Files)1027 b FH(68)450 88 y(pro)q(cess)14=0A=
b(is)g(running)h(whic)o(h)g(uses)f(the)g FE(syslog\(\))f =
FH(system)g(call)i=0A=
(facilit)o(y)g(to)e(log)h(k)o(ernel)450 153 y(messages.)150=0A=
256 y FE(loadavg)132 b FH(This)16 =
b(\014le)g(giv)o(es)f(an)h(output)f(lik)o=0A=
(e)h(this:)550 359 y Fs(0.13)21 b(0.14)g(0.05)450 461 y =
FH(These)c(n)o(um)o=0A=
(b)q(ers)f(are)h(the)f(n)o(um)o(b)q(ers)h(normally)g(giv)o(en)g(b)o(y)f=0A=
FE(uptime)f FH(and)i(other)f(com-)450 526 =
y(mands)d(as)g(the)g(load)g(a)o(v)o=0A=
(erage|they)g(are)f(the)i(a)o(v)o(erage)d(n)o(um)o(b)q(er)j(of)e(pro)q=0A=
(cesses)i(trying)450 590 y(to)k(run)h(at)f(once)h(in)h(the)e(last)h(min)o=0A=
(ute,)h(in)f(the)g(last)g(\014v)o(e)g(min)o(utes)g(and)g(in)g(the)g(last)=
450=0A=
655 y(\014fteen)d(min)o(utes,)f(more)g(or)f(less.)150 758 y=0A=
FE(meminfo)132 b FH(This)18 =
b(\014le)h(is)g(a)e(condensed)i(v)o(ersion)g(of)e=0A=
(the)h(output)g(from)f(the)h FE(free)f FH(program.)27 b(Its)450=0A=
822 y(output)15 b(lo)q(oks)g(lik)o(e)i(this:)724 917 y Fs(total:)64=0A=
b(used:)87 b(free:)64 b(shared:)42 b(buffers:)550 974 y(Mem:)65=0A=
b(7528448)42 b(7344128)64 b(184320)42 b(2637824)g(1949696)550=0A=
1031 y(Swap:)h(8024064)f(1474560)g(6549504)450 1134 y FH(Notice)22=0A=
b(that)f(the)g(n)o(um)o(b)q(ers)h(are)f(in)h(b)o(ytes,)g(not)f(KB.)h(Lin)=
o=0A=
(us)g(wrote)f(a)g(v)o(ersion)g(of)450 1198 =
y(free)e(whic)o(h)g(reads)g(this)g=0A=
(\014le)h(and)f(can)g(return)f(either)i(b)o(ytes)e(\()p FE(-b)p=0A=
FH(\))g(or)g(KB)h(\()p FE(-k)p FH(,)g(the)450 1262 y(default\).)h(This)15=0A=
b(is)g(included)i(with)e(the)f FE(procps)g FH(pac)o(k)m(age)g(at)g=0A=
FE(tsx-11.mit.edu)f FH(and)450 1327 y(other)k(places.)29 b(Also)18=0A=
b(notice)g(that)f(there)h(is)g FD(not)g =
FH(a)f(sep)q(erate)h(en)o(try)g(for)f=0A=
(eac)o(h)h(sw)o(ap)450 1391 y(\014le:)j(the)15 b FE(Swap:)20=0A=
b =
FH(line)d(sumarizes)e(all)h(the)g(sw)o(ap)e(space)i(a)o(v)m(ailable)h(to)=
d=0A=
(the)h(k)o(ernel.)150 1495 y FE(uptime)156 b FH(This)14 b(\014le)h(con)o=0A=
(tains)e(t)o(w)o(o)f(things:)20 b(the)13 =
b(time)h(that)f(the)g(system)g(has)h=0A=
(b)q(een)g(up,)g(and)g(the)450 1559 =
y(amoun)o(t)h(of)g(time)h(it)g(has)f(sp)q=0A=
(en)o(t)h(in)g(the)g(idle)h(pro)q(cess.)22 b(Both)15 b(n)o(um)o(b)q(ers)h=0A=
(are)f(giv)o(en)h(as)450 1623 y(decimal)h(quan)o(tities,)f(in)h(seconds)f=0A=
(and)g(h)o(undreths)g(of)f(a)g(second.)22 b(The)16 =
b(t)o(w)o(o)e(decimal)450=0A=
1688 =
y(digits)i(of)e(precision)j(are)d(not)h(guaran)o(teed)f(on)h(all)h(arc)o=0A=
(hitectures,)f(but)g(are)f(curren)o(tly)450 1752 =
y(accurate)e(on)h(all)g(w)o=0A=
(orking)f(implemen)o(tations)i(of)e(Lin)o(ux,)i(due)f(to)f(the)h(con)o(v)=
o=0A=
(enien)o(t)g(100)450 1816 y(Hz)i(clo)q(c)o(k.)21 b(This)16=0A=
b(\014le)g(lo)q(oks)f(lik)o(e)i(this:)550 1911 y Fs(604.33)k(205.45)450=0A=
2014 y =
FH(In)e(this)g(case,)h(the)e(system)h(has)f(b)q(een)i(running)g(for)e=0A=
(604.33)f(seconds,)j(and)e(of)h(that)450 2078 =
y(time,)c(205.45)f(seconds)h=0A=
(ha)o(v)o(e)g(b)q(een)h(sp)q(en)o(t)g(in)g(the)f(idle)i(task.)150=0A=
2182 y FE(kcore)180 b FH(This)18 =
b(is)g(a)g(\014le)g(whic)o(h)h(represen)o=0A=
(ts)e(the)h(ph)o(ysical)h(memory)e(in)i(the)e(curren)o(t)h(system,)450=0A=
2246 y(in)i(the)g(same)f(format)f(as)h(a)g(`core)g(\014le'.)33=0A=
b(This)20 b(can)g(b)q(e)g(used)g(with)g(a)f(debugger)h(to)450=0A=
2311 y(examine)e(v)m(ariables)g(in)f(the)g(k)o(ernel.)25 b(The)17=0A=
b(total)f(length)i(of)e(the)h(\014le)h(is)f(the)g(ph)o(ysical)450=0A=
2375 =
y(memory)e(plus)h(a)f(4KB)g(header)h(to)e(mak)o(e)h(it)g(lo)q(ok)h(lik)o=0A=
(e)g(a)f(core)g(\014le.)150 2478 y FE(stat)204 b FH(The)15=0A=
b FE(stat)g =
FH(\014le)h(return)f(v)m(arious)h(statistics)f(ab)q(out)g(the)g=0A=
(system)g(in)h(ascii)g(format.)j(An)450 2543 y(example)d(of)f=0A=
FE(stat)f FH(\014le)j(is)e(the)h(follo)o(wing:)p eop=0A=
%%Page: 69 80=0A=
69 79 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)42 b FE(/proc)17=0A=
b FD(Directories)j(and)d(Files)1022 b FH(69)550 88 y Fs(cpu)43=0A=
b(5470)21 b(0)h(3764)e(193792)550 145 y(disk)h(0)h(0)f(0)h(0)550=0A=
202 y(page)f(11584)g(937)550 259 y(swap)g(255)g(618)550 316=0A=
y(intr)g(239978)550 372 y(ctxt)g(20932)550 429 y(btime)g(767808289)450=0A=
532 y FH(The)15 b(meaning)h(of)f(the)g(lines)i(b)q(eing)450=0A=
645 y FE(cpu)228 b FH(The)16 =
b(four)f(n)o(um)o(b)q(ers)h(represen)o(t)g(the)g=0A=
(n)o(um)o(b)q(er)g(of)f(ji\016es)i(the)e(system)750 709 =
y(sp)q(en)o(t)g(in)g=0A=
(user)g(mo)q(de,)f(in)i(user)e(mo)q(de)h(with)g(lo)o(w)g(priorit)o(y)f=0A=
(\(nice\),)h(in)750 774 =
y(system)g(mo)q(de,)h(and)g(in)g(the)g(idle)h(task.)j=0A=
(The)c(last)g(v)m(alue)h(should)f(b)q(e)750 838 =
y(100)e(times)i(the)f(second)=0A=
h(en)o(try)f(in)h(the)f FE(uptime)f FH(\014le.)450 942 y FE(disk)204=0A=
b FH(The)17 b(four)e FE(dk)p 991 942 15 2 v 17 w(drive)h =
FH(en)o(tries)h(in)g=0A=
(the)f FE(kernel)p 1568 942 V 17 w(stat)f FH(structure)h(are)750=0A=
1006 y(curren)o(tly)g(un)o(used.)450 1109 y FE(page)204 b FH(This)16=0A=
b(is)h(the)f(n)o(um)o(b)q(er)g(of)g(pages)f(the)h(system)g(brough)o(t)f(i=
n)i=0A=
(from)e(the)750 1174 y(disk)h(and)f(out)g(to)g(the)g(disk.)450=0A=
1277 y FE(swap)204 b FH(Is)15 =
b(the)h(n)o(um)o(b)q(er)f(of)g(sw)o(ap)f(pages)=0A=
h(the)g(system)g(brough)o(t)f(in)i(and)g(out.)450 1381 y FE(intr)204=0A=
b FH(The)17 b(n)o(um)o(b)q(er)h(of)e(in)o(terrupts)h(receiv)o(ed)h(from)f=0A=
(system)f(b)q(o)q(ot.)25 b FD([The)750 1445 y(format)d(of)f(this)h(line)g=0A=
(has)g(c)o(hanged)f(in)h(more)f(recen)o(t)h(k)o(er-)750 1510=0A=
y(nels.])450 1613 y FE(ctxt)204 b FH(The)15 =
b(n)o(um)o(b)q(er)h(of)f(con)o=0A=
(text)f(switc)o(hes)i(the)f(system)g(underw)o(en)o(t.)450 1717=0A=
y FE(btime)180 b FH(The)15 =
b(b)q(o)q(ot)g(time,)h(in)g(seconds)f(since)i(the)=0A=
e(ep)q(o)q(c)o(h.)150 1830 y FE(modules)132 b FH(This)16 b(return)f(the)h=0A=
(list)g(of)f(k)o(ernel)h(mo)q(dules,)g(in)g(ascii)g(form.)k(The)15=0A=
b(format)f(is)i(not)f(w)o(ell)450 1894 y(de\014ned)20 =
b(at)d(this)i(p)q(oin)o=0A=
(t,)g(as)f(it)g(has)g(c)o(hanged)h(from)e(v)o(ersion)i(to)e(v)o(ersion.)2=
9=0A=
b(This)19 b(will)450 1959 y(stabilize)e(with)f(later)f(v)o(ersions)g(of)g=0A=
(Lin)o(ux)h(as)f(the)g(mo)q(dules)i(in)o(terface)e(stabilizes.)150=0A=
2062 y FE(malloc)156 b FH(This)17 =
b(\014le)h(is)f(presen)o(t)g(only)h(if)f=0A=
FE(CONFIG)p 1129 2062 V 16 w(DEBUG)p 1265 2062 V 17 w(MALLOC)e=0A=
FH(w)o(as)h(de\014ned)j(during)e(k)o(ernel)450 2126 y(compilation.)150=0A=
2230 y FE(version)132 b FH(This)17 b(\014le)g(con)o(tains)g(a)f(string)g=0A=
(iden)o(tifying)i(the)f(v)o(ersion)f(of)g(Lin)o(ux)i(that)e(is)g(curren)o=0A=
(tly)450 2294 y(running.)21 b(An)15 b(example)i(is:)550 2446=0A=
y Fs(Linux)k(version)f(1.1.40)h(\(johnsonm AT nigel\))d(\(gcc)j(version)f=0A=
(2.5.8\))h(#3)g(Sat)h(Aug)f(6)g(14:22:05)f(1994)450 2549 y=0A=
FH(Note)14 =
b(that)f(this)i(con)o(tains)f(the)g(v)o(ersion)h(of)e(Lin)o(ux,)j=0A=
(the)e(username)g(and)h(hostname)e(of)p eop=0A=
%%Page: 70 81=0A=
70 80 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)36 b FE(/proc)17=0A=
b FD(Directories)j(and)e(Files)1027 b FH(70)450 88 y(the)17=0A=
b(user)h(that)f(compiled)i(it,)f(the)f(v)o(ersion)h(of)f(gcc,)g(the)h=0A=
(\\iteration")f(of)g(the)g(compi-)450 153 y(lation)h(\(eac)o(h)f(new)h=0A=
(compile)h(will)g(increase)g(the)e(n)o(um)o(b)q(er\),)h(and)g(the)f(outpu=
t)h=0A=
(of)f(the)450 217 y(`date')d(command)h(as)g(of)g(the)g(start)f(of)h(the)g=0A=
(compilation.)150 321 y FE(net)228 b FH(This)14 =
b(is)g(a)f(directory)h(con)o=0A=
(taining)g(three)g(\014les,)g(all)h(of)e(whic)o(h)h(giv)o(e)g(the)g(statu=
s)e=0A=
(of)h(some)450 385 y(part)18 =
b(of)h(the)g(Lin)o(ux)h(net)o(w)o(orking)e(la)o=0A=
(y)o(er.)31 b(These)19 b(\014les)h(con)o(tain)f(binary)h(structures,)450=0A=
449 y(and)13 b(are)f(therefore)g(not)g(readable)i(with)f(cat.)18=0A=
b(Ho)o(w)o(ev)o(er,)12 b(the)h(standard)f(netstat)f(suite)450=0A=
514 y(uses)19 b(these)f(\014les.)30 b(The)18 =
b(binary)h(structures)f(read)g=0A=
(from)g(these)g(\014les)i(are)e(de\014ned)h(in)450 578 y =
FE(<linux/if*.h>)13=0A=
b FH(The)j(\014les)g(are:)450 691 y FE(unix)204 b FD([I)14=0A=
b(do)g(not)g(y)o(et)f(ha)o(v)o(e)f(details)j(on)f(the)g FE(unix)f=0A=
FD(in)o(terface.)24 b(These)750 756 y(details)19 b(will)g(b)q(e)e(added)h=0A=
(later.])450 859 y FE(arp)228 b FD([I)16 =
b(do)h(not)f(y)o(et)g(ha)o(v)o(e)f=0A=
(details)j(on)e(the)h FE(arp)e FD(in)o(terface.)25 b(These)750=0A=
924 y(details)19 b(will)g(b)q(e)e(added)h(later.])450 1027=0A=
y FE(route)180 b FD([I)29 =
b(do)f(not)h(y)o(et)e(ha)o(v)o(e)h(details)h(on)g=0A=
(the)f FE(route)g FD(in)o(terface.)750 1091 y(These)17 =
b(details)i(will)g(b)q=0A=
(e)f(added)g(later.])450 1195 y FE(dev)228 b FD([I)16 =
b(do)h(not)f(y)o(et)g=0A=
(ha)o(v)o(e)f(details)j(on)e(the)h FE(dev)e FD(in)o(terface.)25=0A=
b(These)750 1259 y(details)19 b(will)g(b)q(e)e(added)h(later.])450=0A=
1363 y FE(raw)228 b FD([I)16 =
b(do)h(not)f(y)o(et)g(ha)o(v)o(e)f(details)j(on)=0A=
e(the)h FE(raw)e FD(in)o(terface.)25 b(These)750 1427 y(details)19=0A=
b(will)g(b)q(e)e(added)h(later.])450 1531 y FE(tcp)228 b FD([I)16=0A=
b(do)h(not)f(y)o(et)g(ha)o(v)o(e)f(details)j(on)e(the)h FE(tcp)e=0A=
FD(in)o(terface.)25 b(These)750 1595 y(details)19 =
b(will)g(b)q(e)e(added)h=0A=
(later.])450 1698 y FE(udp)228 b FD([I)16 =
b(do)h(not)f(y)o(et)g(ha)o(v)o(e)f=0A=
(details)j(on)e(the)h FE(udp)e FD(in)o(terface.)25 b(These)750=0A=
1763 y(details)19 b(will)g(b)q(e)e(added)h(later.])150 1901=0A=
y FH(Eac)o(h)13 =
b(of)g(the)g(pro)q(cess)g(sub)q(directories)i(\(those)e(with)=0A=
g(n)o(umerical)i(names)e(and)g(the)h(self)f(directory\))g(ha)o(v)o(e)150=0A=
1966 y(sev)o(eral)i(\014les)i(and)e(sub)q(directories,)h(as)f(w)o(ell.)21=0A=
b(The)16 b(\014les)g(are:)150 2083 y FE(cmdline)132 b FH(This)17=0A=
b(holds)h(the)f(complete)g(command)g(line)h(for)e(the)h(pro)q(cess,)g=0A=
FD(unless)i(the)h(whole)450 2147 =
y(pro)q(cess)j(has)f(b)q(een)g(sw)o(app)q=0A=
(ed)g(out,)f FH(or)e(unless)h(the)f(pro)q(cess)h(is)f(a)g(zom)o(bie.)32=0A=
b(In)450 2212 y(either)15 b(of)e(these)h(later)g(cases,)g(there)g(is)g=0A=
(nothing)h(in)g(this)f(\014le:)20 b(i.e.)g(a)14 =
b(read)g(on)g(this)g(\014le)=0A=
450 2276 y(will)h(return)f(as)f(ha)o(ving)h(read)g(0)f(c)o(haracters.)19=0A=
b(This)14 b(\014le)h(is)f(n)o(ull-terminated,)i(but)d FD(not)450=0A=
2340 y FH(newline-terminated.)150 2444 y FE(cwd)228 b FH(A)14=0A=
b(link)h(to)e(the)h(curren)o(t)g(w)o(orking)g(directory)g(of)f(that)g(pro=
)q=0A=
(cess.)20 b(T)l(o)14 b(\014nd)g(out)g(the)g(cwd)450 2508 =
y(of)h(pro)q(cess)g=0A=
(20,)f(sa)o(y)l(,)h(y)o(ou)g(can)g(do)g(this:)p eop=0A=
%%Page: 71 82=0A=
71 81 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)42 b FE(/proc)17=0A=
b FD(Directories)j(and)d(Files)1022 b FH(71)550 88 y Fs(\(cd)21=0A=
b(/proc/20/cwd;)e(pwd\))150 192 y FE(environ)132 b FH(This)19=0A=
b(\014le)h(con)o(tains)e(the)h(en)o(vironmen)o(t)g(for)f(the)g(pro)q(cess=
.)31=0A=
b(There)18 b(are)h(no)f(newlines)450 256 y(in)f(this)g(\014le:)24=0A=
b(the)16 b(en)o(tries)h(are)f(sep)q(erated)h(b)o(y)g(n)o(ull)h(c)o=0A=
(haracters,)d(and)i(there)f(is)h(a)g(n)o(ull)450 321 =
y(c)o(haracter)d(at)g=0A=
(the)h(end.)20 b(Th)o(us,)14 =
b(to)g(prin)o(t)h(out)g(the)f(en)o(vironmen)o(t)=0A=
h(of)g(pro)q(cess)f(10,)g(y)o(ou)450 385 y(w)o(ould)i(do:)550=0A=
480 y Fs(cat)21 b(/proc/10/environ)e(|)i(tr)h("\\000")e("\\n")450=0A=
582 y FH(This)c(\014le)g(is)g(also)f(n)o(ull-terminated)i(and)e(not)g=0A=
(newline)i(terminated..)150 685 y FE(exe)228 b FH(This)16 =
b(is)f(a)g(link)i=0A=
(to)e(the)g(executable.)21 b(Y)l(ou)15 b(can)h(t)o(yp)q(e)550=0A=
780 y Fs(/proc/10/exe)450 882 y FH(to)f(run)g(another)g(cop)o(y)g(of)g=0A=
(whatev)o(er)f(pro)q(cess)i(10)e(is.)150 985 y FE(fd)252 b=0A=
FH(This)18 =
b(is)g(a)g(sub)q(directory)g(con)o(taining)h(one)f(en)o(try)f(for)=0A=
g(eac)o(h)h(\014le)g(whic)o(h)h(the)f(pro)q(cess)450 1050 =
y(has)d(op)q(en,)g=0A=
(named)g(b)o(y)g(its)g(\014le)h(descripter,)f(and)g(whic)o(h)h(is)f(a)g(l=
ink)=0A=
h(to)e(the)h(actual)g(\014le.)450 1114 =
y(Programs)i(that)i(will)h(tak)o(e)f=0A=
(a)f(\014lename,)j(but)e(will)i(not)d(tak)o(e)h(the)g(standard)f(input,)4=
50=0A=
1178 =
y(and)c(whic)o(h)h(write)f(to)f(a)h(\014le,)h(but)f(will)h(not)f(send)h=0A=
(their)f(output)g(to)f(standard)h(output,)450 1243 y(can)k(b)q(e)h=0A=
(e\013ectiv)o(ely)h(foiled)g(this)e(w)o(a)o(y)l(,)g(assuming)h(that)e=0A=
FE(-i)h FH(is)h(the)f(\015ag)g(designating)450 1307 =
y(an)d(input)h(\014le)h=0A=
(and)e FE(-o)g =
FH(is)h(the)f(\015ag)g(designating)h(an)f(output)g(\014le:)550=0A=
1402 y Fs(...)21 =
b(|)h(foobar)e(-i)i(/proc/self/fd/0)c(-o)k(/proc/self/fd/1)c=0A=
(|)k(...)450 1504 y FC(V)m(oil\023)-23 b(a.)19 b FH(Instan)o(t)14=0A=
b(\014lter!)21 b(Note)14 b(that)f(this)i(will)i(not)d(w)o(ork)f(for)h=0A=
(programs)f(that)h(seek)h(on)450 1568 y(their)h(\014les,)g(as)e(the)i=0A=
(\014les)g(in)g(the)f FE(fd)g FH(directory)g(are)g(not)g(seek)m(able.)150=0A=
1672 y FE(maps)204 b FH(This)17 =
b(is)h(a)e(\014le)i(whic)o(h)f(con)o(tains)g=0A=
(a)f(listing)j(of)d(all)i(the)e(memory)h(mappings)g(that)f(the)450=0A=
1736 y(pro)q(cess)c(is)g(using.)19 b(The)12 b(shared)f(libraries)i(are)e=0A=
(mapp)q(ed)h(in)h(this)e(w)o(a)o(y)l(,)g(so)g(there)h(should)450=0A=
1800 =
y(b)q(e)j(one)g(en)o(try)f(for)f(eac)o(h)i(shared)f(library)i(in)f(use,)=0A=
f(and)h(some)f(pro)q(cesses)h(use)g(memory)450 1865 =
y(maps)g(for)g(other)f=0A=
(purp)q(oses)i(as)f(w)o(ell.)21 b(Here)15 b(is)h(an)f(example:)550=0A=
1959 y Fs(00000000-00013000)j(r-xs)j(00000400)f(03:03)h(12164)550=0A=
2016 y(00013000-00014000)d(rwxp)j(00013400)f(03:03)h(12164)550=0A=
2073 y(00014000-0001c000)d(rwxp)j(00000000)f(00:00)h(0)550=0A=
2130 y(bffff000-c0000000)d(rwxp)j(00000000)f(00:00)h(0)450=0A=
2232 y FH(The)15 =
b(\014rst)g(\014eld)i(is)e(a)g(n)o(um)o(b)q(er)h(de\014ning)=0A=
h(the)e(start)f(of)h(the)g(mapp)q(ed)h(range.)450 2296 y(the)f(second)h=0A=
(\014eld)g(is)g(a)f(n)o(um)o(b)q(er)h(de\014ning)g(the)g(end)f(of)g(the)h=0A=
(mapp)q(ed)f(range.)450 2361 y(The)g(third)h(\014eld)h(giv)o(es)e(the)g=0A=
(\015ags:)450 2425 y FE(r)g FH(means)g(readable,)h FE(-)f =
FH(means)g(not.)450=0A=
2489 y FE(w)g FH(means)g(writeable,)h FE(-)f FH(means)g(not.)450=0A=
2554 y FE(x)g FH(means)g(executable,)h FE(-)f FH(means)g(not.)p=0A=
eop=0A=
%%Page: 72 83=0A=
72 82 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)42 b FE(/proc)17=0A=
b FD(Directories)j(and)d(Files)1022 b FH(72)450 88 y FE(s)15=0A=
b FH(means)g(shared,)g FE(p)g FH(means)g(priv)m(ate.)450 153=0A=
y(The)g(fourth)g(\014eld)i(is)e(the)h(o\013set)f(at)f(whic)o(h)i(it)g(is)=
g=0A=
(mapp)q(ed.)450 217 y(The)21 b(\014fth)h(\014eld)g(indicates)h(the)e=0A=
FC(major)p FH(:)p FC(minor)g =
FH(device)i(n)o(um)o(b)q(er)f(of)e(the)h(\014le)=0A=
i(b)q(eing)450 281 y(mapp)q(ed.)450 346 y(The)15 b(sixth)h(\014eld)h=0A=
(indicates)f(the)f(ino)q(de)i(n)o(um)o(b)q(er)e(of)g(the)h(\014le)g(b)q(e=
ing)=0A=
g(mapp)q(ed.)150 449 y FE(mem)228 b FH(This)13 b(is)g FD(not)f=0A=
FH(the)h(same)f(as)f(the)i(mem)f(\(1,1\))e(device,)k(despite)g(the)e(fact=
)g=0A=
(that)f(it)i(has)f(the)450 514 =
y(same)i(device)i(n)o(um)o(b)q(ers.)k(The)15=0A=
b(/dev/mem)g(device)h(is)f(the)g(ph)o(ysical)h(memory)e(b)q(efore)450=0A=
578 =
y(an)o(y)h(address)f(translation)h(is)h(done,)f(but)g(the)g(mem)g(\014le)=0A=
g(here)h(is)f(the)g(memory)f(of)h(the)450 642 =
y(pro)q(cess)f(that)f(accesses)=0A=
h(it.)20 b(This)14 b(cannot)g(b)q(e)g FE(mmap\(\))p =
FH(ed)f(curren)o(tly)l(,)=0A=
i(and)f(will)h(not)e(b)q(e)450 707 y(un)o(til)j(a)f(general)h=0A=
FE(mmap\(\))e FH(is)i(added)g(to)e(the)i(k)o(ernel.)150 810=0A=
y FE(root)204 b FH(This)21 =
b(is)h(a)e(p)q(oin)o(ter)i(to)e(the)h(ro)q(ot)f=0A=
(directory)h(of)g(the)g(pro)q(cess.)37 b(This)21 b(is)h(useful)g(for)450=0A=
875 y(programs)14 b(that)g(call)j FE(chroot\(\))p =
FH(,)d(suc)o(h)h(as)g(ftp)q=0A=
(d.)150 978 y FE(stat)204 b FH(This)17 =
b(\014le)g(con)o(tains)f(a)g(lot)h(of)=0A=
e(status)h(information)g(ab)q(out)g(the)g(pro)q(cess.)24 b(The)16=0A=
b(\014elds,)450 1042 y(in)g(order,)f(with)g(their)h(prop)q(er)f=0A=
FE(scanf\(\))f FH(format)g(sp)q(eci\014ers,)j(are:)450 1156=0A=
y(pid)f FE(\045d)174 b FH(The)15 b(pro)q(cess)h(id.)450 1259=0A=
y(comm)f FE(\(\045s\))70 b FH(The)12 =
b(\014lename)h(of)e(the)h(executable,)h=0A=
(in)f(paren)o(theses.)19 b(This)13 b(is)f(visible)750 1324=0A=
y(whether)j(or)g(not)g(the)g(executable)i(is)e(sw)o(app)q(ed)h(out.)450=0A=
1427 y(state)e FE(\045c)141 b FH(One)14 =
b(c)o(haracter)f(from)f(the)i(string)=0A=
f(\\RSDZT")g(where)h(R)f(is)h(running,)750 1491 =
y(S)h(is)f(sleeping)i(in)g=0A=
(an)e(in)o(terruptable)h(w)o(ait,)f(D)g(is)h(sleeping)h(in)f(an)f(un-)750=0A=
1556 =
y(in)o(terruptable)i(w)o(ait)f(or)f(sw)o(apping,)h(Z)g(is)h(zom)o(bie,)f=0A=
(and)h(T)f(is)g(traced)750 1620 =
y(or)g(stopp)q(ed)g(\(on)g(a)g(signal\).)450=0A=
1724 y(ppid)i FE(\045d)148 b FH(The)15 b(pid)i(of)d(the)i(paren)o(t.)450=0A=
1827 y(pgrp)f FE(\045d)146 b FH(The)15 =
b(pgrp)h(of)e(the)i(pro)q(cess.)450=0A=
1931 y(session)g FE(\045d)102 b FH(The)15 =
b(session)h(id)g(of)f(the)g(pro)q=0A=
(cess.)450 2034 y(tt)o(y)f FE(\045d)179 b FH(The)15 =
b(tt)o(y)g(the)g(pro)q=0A=
(cess)g(uses.)450 2138 y(tpgid)h FE(\045d)133 b FH(The)19 =
b(pgrp)h(of)e(the)i=0A=
(pro)q(cess)f(whic)o(h)h(curren)o(tly)g(o)o(wns)e(the)h(tt)o(y)g(that)750=0A=
2202 y(the)c(pro)q(cess)h(is)f(connected)i(to.)450 2306 y(\015ags)e=0A=
FE(\045u)148 b FH(The)16 b(\015ags)g(of)g(the)g(pro)q(cess.)23=0A=
b(Curren)o(tly)l(,)16 b(ev)o(ery)g(\015ag)g(has)g(the)g(math)750=0A=
2370 =
y(bit)i(set,)g(b)q(ecause)h(crt0.s)d(c)o(hec)o(ks)i(for)f(math)g(em)o=0A=
(ulation,)i(so)e(this)h(is)750 2434 =
y(not)g(included)i(in)f(the)g(output.)28=0A=
b(This)19 b(is)f(probably)h(a)f(bug,)h(as)e(not)750 2499 y=0A=
FC(every)i =
FH(pro)q(cess)c(is)g(a)f(compiled)j(c)e(program.)j(The)d(math)g=0A=
(bit)g(should)p eop=0A=
%%Page: 73 84=0A=
73 83 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)42 b FE(/proc)17=0A=
b FD(Directories)j(and)d(Files)1022 b FH(73)750 88 y(b)q(e)16=0A=
b(a)f(decimal)h(4,)f(and)g(the)h(traced)f(bit)g(is)h(decimal)h(10.)450=0A=
192 y(min)p 528 192 14 2 v 17 w(\015t)e FE(\045u)102 b FH(The)24=0A=
b(n)o(um)o(b)q(er)g(of)f(minor)h(faults)f(the)h(pro)q(cess)g(has)f(made,)=
i=0A=
(those)750 256 y(whic)o(h)16 =
b(ha)o(v)o(e)f(not)g(required)h(loading)g(a)f=0A=
(memory)g(page)g(from)f(disk.)450 360 y(cmin)p 548 360 V 17=0A=
w(\015t)h FE(\045u)82 b FH(The)14 =
b(n)o(um)o(b)q(er)g(of)g(minor)g(faults)g=0A=
(that)f(the)i(pro)q(cess)f(and)g(its)g(c)o(hildren)750 424=0A=
y(ha)o(v)o(e)h(made.)450 528 y(ma)s(j)p 531 528 V 15 w(\015t)g=0A=
FE(\045u)101 b FH(The)24 =
b(n)o(um)o(b)q(er)f(of)g(ma)s(jor)f(faults)i(the)f=0A=
(pro)q(cess)h(has)f(made,)i(those)750 592 y(whic)o(h)16 b(ha)o(v)o(e)f=0A=
(required)h(loading)g(a)f(memory)g(page)g(from)f(disk.)450=0A=
695 y(cma)s(j)p 551 695 V 16 w(\015t)h FE(\045u)80 b FH(The)14=0A=
b(n)o(um)o(b)q(er)g(of)g(ma)s(jor)e(faults)i(that)f(the)h(pro)q(cess)g(an=
d)g=0A=
(its)g(c)o(hildren)750 760 y(ha)o(v)o(e)h(made.)450 863 y(utime)h=0A=
FE(\045d)123 b FH(The)15 =
b(n)o(um)o(b)q(er)g(of)f(ji\016es)h(that)f(this)h=0A=
(pro)q(cess)g(has)f(b)q(een)i(sc)o(heduled)g(in)750 928 =
y(user)f(mo)q(de.)450=0A=
1031 y(stime)g FE(\045d)131 b FH(The)15 =
b(n)o(um)o(b)q(er)g(of)f(ji\016es)h=0A=
(that)f(this)h(pro)q(cess)g(has)f(b)q(een)i(sc)o(heduled)g(in)750=0A=
1096 y(k)o(ernel)g(mo)q(de.)450 1199 y(cutime)g FE(\045d)103=0A=
b FH(The)18 b(n)o(um)o(b)q(er)h(of)f(ji\016es)g(that)g(this)g(pro)q(ces)h=0A=
(and)f(its)g(c)o(hildren)i(ha)o(v)o(e)750 1263 =
y(b)q(een)c(sc)o(heduled)h(in)=0A=
f(user)g(mo)q(de.)450 1367 y(cstime)g FE(\045d)110 b FH(The)18=0A=
b(n)o(um)o(b)q(er)h(of)f(ji\016es)g(that)g(this)g(pro)q(ces)h(and)f(its)g=
(c)o=0A=
(hildren)i(ha)o(v)o(e)750 1431 =
y(b)q(een)c(sc)o(heduled)h(in)f(k)o(ernel)g=0A=
(mo)q(de.)450 1535 y(coun)o(ter)f FE(\045d)89 b FH(The)24 b(curren)o(t)f=0A=
(maxim)o(um)g(size)h(in)h(ji\016es)e(of)g(the)h(pro)q(cess's)f(next)750=0A=
1599 =
y(timeslice,)h(of)d(what)g(is)h(curren)o(tly)g(left)g(of)f(its)g(curren)=0A=
o(t)g(timeslice,)750 1663 y(if)16 =
b(it)f(is)h(the)f(curren)o(tly)h(running)g=0A=
(pro)q(cess.)450 1767 y(priorit)o(y)f FE(\045d)88 b FH(The)11=0A=
b(standard)f Fn(un)p FB(?)p Fn(x)g =
FH(nice)i(v)m(alue,)g(plus)f(\014fteen.)19=0A=
b(The)11 b(v)m(alue)h(is)f(nev)o(er)750 1831 =
y(negativ)o(e)k(in)h(the)g(k)o=0A=
(ernel.)450 1935 y(timeout)f FE(\045u)83 b FH(The)15 =
b(time)h(in)g(ji\016es)g=0A=
(of)e(the)i(pro)q(cess's)f(next)g(timeout.)450 2103 y(it)p=0A=
483 2103 V 17 w(real)p 573 2103 V 16 w(v)m(alue)i FE(\045u)750=0A=
2167 y FH(The)c(time)f(in)h(ji\016es)g(b)q(efore)g(the)f(in)o(terv)m(al)h=0A=
(timer)g(mec)o(hanism)g(causes)750 2231 y(a)i FE(SIGALRM)f=0A=
FH(to)h(b)q(e)g(sen)o(t)g(to)g(the)g(pro)q(cess.)450 2335 y(start)p=0A=
548 2335 V 15 w(time)h FE(\045d)38 b FH(Time)16 =
b(the)f(pro)q(cess)g(started)=0A=
g(in)h(ji\016es)g(after)e(system)h(b)q(o)q(ot.)450 2438 y(vsize)h=0A=
FE(\045u)142 b FH(Virtual)16 b(memory)f(size)450 2542 y(rss)g=0A=
FE(\045u)183 b FH(Residen)o(t)19 b(Set)f(Size:)26 b(n)o(um)o(b)q(er)17=0A=
b(of)h(pages)f(the)h(pro)q(cess)g(has)f(in)i FD(real)p eop=0A=
%%Page: 74 85=0A=
74 84 bop 150 -84 1800 3 v 150 -100 a FD(2.1.)42 b FE(/proc)17=0A=
b FD(Directories)j(and)d(Files)1022 b FH(74)750 88 y(memory)l(,)11=0A=
b(min)o(us)h(3)e(for)h(administrativ)o(e)g(purp)q(oses.)19=0A=
b(This)12 b(is)f(just)g(the)750 153 y(pages)17 =
b(whic)o(h)i(coun)o(t)e(to)o=0A=
(w)o(ards)f(text,)i(data,)f(or)g(stac)o(k)g(space.)27 b(This)750=0A=
217 y(do)q(es)16 b FD(not)g =
FH(include)i(pages)d(whic)o(h)i(ha)o(v)o(e)e(not)=0A=
g(b)q(een)h(demand-loaded)750 281 =
y(in,)g(or)e(whic)o(h)i(are)f(sw)o(app)q=0A=
(ed)h(out.)450 385 y(rlim)g FE(\045u)156 b FH(Curren)o(t)15=0A=
b(limit)h(on)f(the)h(size)g(of)f(the)g(pro)q(cess,)g(2GB)g(b)o(y)g(defaul=
t.)=0A=
450 488 y(start)p 548 488 14 2 v 15 w(co)q(de)h FE(\045u)37=0A=
b FH(The)15 =
b(address)h(ab)q(o)o(v)o(e)e(whic)o(h)j(program)d(text)g(can)i=0A=
(run.)450 592 y(end)p 523 592 V 17 w(co)q(de)g FE(\045u)60=0A=
b FH(The)15 =
b(address)h(b)q(elo)o(w)f(whic)o(h)i(program)d(text)g(can)i(run.)=0A=
450 760 y(start)p 548 760 V 15 w(stac)o(k)f FE(\045u)750 824=0A=
y FH(The)g(address)h(of)e(the)i(start)e(of)g(the)i(stac)o(k.)450=0A=
928 y(kstk)p 537 928 V 16 w(esp)f FE(\045u)74 b FH(The)18 =
b(curren)o(t)f(v)m=0A=
(alue)i(of)e(esp)h(\(32)f(bit)h(stac)o(k)f(p)q(oin)o(ter\),)h(as)f(found)=
h=0A=
(in)750 992 =
y(the)d(k)o(ernel)h(stac)o(k)f(page)g(for)f(the)i(pro)q(cess.)450=0A=
1096 y(kstk)p 537 1096 V 16 w(eip)g FE(\045u)79 b FH(The)13=0A=
b(curren)o(t)f(v)m(alue)h(of)f(eip)i(\(32)d(bit)i(instruction)g(p)q(oin)o=0A=
(ter\),)g(as)f(found)750 1160 =
y(in)k(the)f(k)o(ernel)h(stac)o(k)f(page)g(for)=0A=
f(the)i(pro)q(cess.)450 1263 y(signal)g FE(\045d)123 b FH(The)15=0A=
b(bitmap)h(of)f(p)q(ending)i(signals)f(\(usually)g(0\).)450=0A=
1367 y(blo)q(c)o(k)o(ed)g FE(\045d)88 b FH(The)15 =
b(bitmap)h(of)f(blo)q(c)o=0A=
(k)o(ed)h(signals)g(\(usually)g(0,)f(2)f(for)h(shells\).)450=0A=
1470 y(sigignore)h FE(\045d)62 b FH(The)15 b(bitmap)h(of)f(ignored)h=0A=
(signals.)450 1574 y(sigcatc)o(h)f FE(\045d)79 b FH(The)15=0A=
b(bitmap)h(of)f(catc)o(hed)g(signals.)450 1677 y(w)o(c)o(han)g=0A=
FE(\045u)113 b FH(This)18 =
b(is)g(the)g(\\c)o(hannel")g(in)h(whic)o(h)f(the)g=0A=
(pro)q(cess)g(is)g(w)o(aiting.)27 b(This)750 1742 y(is)20 =
b(the)g(address)g=0A=
(of)f(a)g(system)h(call,)h(and)f(can)g(b)q(e)g(lo)q(ok)o(ed)h(up)f(in)g(a=
)750=0A=
1806 y(namelist)c(if)g(y)o(ou)f(need)h(a)f(textual)g(name.)150=0A=
1919 y FE(statm)180 b FH(This)17 b(\014le)g(con)o(tains)f(sp)q(ecial)h=0A=
(status)f(information)g(that)f(tak)o(es)g(a)h(bit)g(longer)h(to)e(co)q(ok=
)450=0A=
1984 =
y(than)i(the)g(information)g(in)h(stat,)e(and)h(is)g(needed)h(rarely)f=0A=
(enough)h(that)e(it)h(has)g(b)q(een)450 2048 y(relegated)d(to)f(a)g(sep)q=0A=
(erate)h(\014le.)20 b(F)l(or)13 =
b(eac)o(h)g(\014eld)i(in)f(this)g(\014le,)h=0A=
(the)e(pro)q(c)h(\014lesystem)g(has)450 2112 =
y(to)j(lo)q(ok)g(at)g(eac)o(h)h=0A=
(of)e(the)i(0x300)e(en)o(tries)i(in)g(the)g(page)f(directory)l(,)h(and)f=0A=
(coun)o(t)h(what)450 2177 y(they)d(are)g(doing.)21 b(Here)15=0A=
b(is)h(a)f(description)h(of)f(these)g(\014elds:)450 2290 y(size)h=0A=
FE(\045d)166 b FH(The)11 =
b(total)f(n)o(um)o(b)q(er)h(of)g(pages)f(that)g(the)=0A=
h(pro)q(cess)g(has)g(mapp)q(ed)g(in)h(the)750 2354 y(virtual)k(memory)f=0A=
(space,)g(whether)h(they)f(are)h(in)g(ph)o(ysical)h(memory)750=0A=
2419 y(or)e(not.)450 2522 y(residen)o(t)h FE(\045d)81 b FH(The)18=0A=
b(total)g(n)o(um)o(b)q(er)g(of)g(pages)f(that)h(the)g(pro)q(cess)g(has)g(=
in)h=0A=
(ph)o(ysical)p eop=0A=
%%Page: 75 86=0A=
75 85 bop 150 -84 1800 3 v 150 -100 a FD(2.2.)42 b(Structure)19=0A=
b(of)f(the)g(/pro)q(c)h(\014lesystem)877 b FH(75)750 88 y(memory)l(.)18=0A=
b(This)13 b(should)g(equal)f(the)g(rss)g(\014eld)h(from)e(the)h(stat)f=0A=
(\014le,)i(but)750 153 =
y(is)j(calculated)g(rather)f(than)g(read)g(from)g(the)=0A=
g(pro)q(cess)g(structure.)450 256 y(shared)g FE(\045d)108 b=0A=
FH(The)24 =
b(total)e(n)o(um)o(b)q(er)i(of)f(pages)g(that)g(the)g(pro)q(cess)g=0A=
(has)h(that)e(are)750 321 y(shared)15 b(with)h(at)e(least)i(one)f(other)g=0A=
(pro)q(cess.)450 424 y(trs)g FE(\045d)183 b FH(T)l(ext)20 b(Residen)o(t)h=0A=
(Size:)31 b(the)20 b(total)g(n)o(um)o(b)q(er)g(of)g(text)f(\(co)q(de\))h=0A=
(pages)750 488 y(b)q(elonging)14 b(to)d(the)h(pro)q(cess)h(that)e(are)h=0A=
(presen)o(t)g(in)h(ph)o(ysical)h(memory)l(.)750 553 y(Do)q(es)h=0A=
FD(not)h FH(include)h(shared)f(library)g(pages.)450 656 y(lrs)g=0A=
FE(\045d)188 b FH(Library)13 b(Residen)o(t)g(Size:)20 b(the)12=0A=
b(total)f(n)o(um)o(b)q(er)i(of)f(library)g(pages)g(used)750=0A=
721 =
y(b)o(y)j(the)g(pro)q(cess)h(that)e(are)h(presen)o(t)g(in)h(ph)o(ysical)h=0A=
(memory)l(.)450 824 y(drs)e FE(\045d)176 b FH(Data)10 =
b(Residen)o(t)j(Size:)=0A=
19 b(the)11 =
b(total)g(n)o(um)o(b)q(er)h(of)f(data)f(pages)h(b)q(elonging)750=0A=
889 y(to)16 =
b(the)g(pro)q(cess)h(that)e(are)i(presen)o(t)f(in)h(ph)o(ysical)h=0A=
(memory)l(.)23 b(Include)750 953 y(dirt)o(y)15 b(library)h(pages)f(and)h=0A=
(stac)o(k.)450 1056 y(dt)f FE(\045d)194 b FH(The)16 =
b(n)o(um)o(b)q(er)h(of)e=0A=
(library)i(pages)f(whic)o(h)g(ha)o(v)o(e)g(b)q(een)h(accessed)g(\(i.e.,)7=
50=0A=
1121 y(are)e(dirt)o(y\).)150 1298 y Ft(2.2)70 b(Structure)22=0A=
b(of)h(the)g(/pro)r(c)g(\014lesystem)150 1431 y FH(The)13 b(pro)q(c)g=0A=
(\014lesystem)h(is)f(rather)f(in)o(teresting,)i(b)q(ecause)g(none)f(of)f(=
the)=0A=
h(\014les)h(exist)f(in)h(an)o(y)f(real)g(directory)150 1495=0A=
y(structure.)25 b(Rather,)17 b(the)g(prop)q(er)g(vfs)g(structures)g(are)f=0A=
(\014lled)j(in)f(with)f(functions)h(whic)o(h)g(do)f(gigan)o(tic)150=0A=
1559 y(case)d(statemen)o(ts,)g(and)g(in)h(the)g(case)f(of)g(reading)h(a)f=0A=
(\014le,)i(get)e(a)g(page,)g(\014ll)i(it)e(in,)i(and)e(put)h(the)f(result=
)h=0A=
(in)150 1624 y(user)g(memory)g(space.)221 1712 =
y(One)i(of)f(the)g(most)g(in)o=0A=
(teresting)h(parts)f(of)g(the)h(pro)q(c)f(\014lesystem)h(is)g(the)g(w)o(a=
)o=0A=
(y)e(that)h(the)h(individual)150 1776 y(pro)q(cess)22 =
b(directories)h(are)f=0A=
(implemen)o(ted.)42 b(Essen)o(tially)l(,)25 b(ev)o(ery)c(pro)q(cess)i=0A=
(directory)f(has)g(the)g(ino)q(de)150 1840 y(n)o(um)o(b)q(er)h(of)f(its)g=0A=
(PID)g(shifted)h(left)g(16)f(bits)h(in)o(to)f(a)g(32)g(bit)g(n)o(um)o(b)q=
(er)=0A=
h(greater)f(than)g FE(0x0000ffff)p FH(.)150 1905 y(Within)16=0A=
b(the)f(pro)q(cess)h(directories,)f(ino)q(de)i(n)o(um)o(b)q(ers)e(are)g=0A=
(reused,)g(b)q(ecause)h(the)f(upp)q(er)h(16)f(bits)g(of)g(the)150=0A=
1969 =
y(ino)q(de)h(n)o(um)o(b)q(er)g(ha)o(v)o(e)f(b)q(een)h(mask)o(ed)f(o\013)=0A=
g(after)g(c)o(ho)q(osing)g(the)h(righ)o(t)f(directory)l(.)221=0A=
2057 y(Another)21 =
b(in)o(teresting)i(feature)f(is)g(that)f(unlik)o(e)j(in)e=0A=
(a)g(\\real")g(\014lesystem,)h(where)f(there)g(is)h(one)150=0A=
2121 y FE(file)p 249 2121 15 2 v 17 w(operations)i =
FH(structure)h(for)g(the)h=0A=
(whole)g(\014lesystem,)j(as)c(\014le)i(lo)q(okup)f(is)g(done,)j(di\013ere=
n)o=0A=
(t)150 2186 y FE(file)p 249 2186 V 17 w(operations)14 b =
FH(structures)h(are)g=0A=
(assigned)g(to)g(the)h FE(f)p 1147 2186 V 17 w(ops)e =
FH(mem)o(b)q(er)i(of)f=0A=
(the)g(\014le)i(structure)e(passed)150 2250 y(to)d(those)h(functions,)g=0A=
(dynamically)i(c)o(hanging)e(whic)o(h)h(functions)g(will)g(b)q(e)g(called=
)g=0A=
(for)e(directory)h(lo)q(okup)150 2314 y(and)i(\014le)i(reading.)221=0A=
2402 y =
FD([Expand)g(on)f(this)g(section)h(later)h(|)e(righ)o(t)h(no)o(w)f(it)=0A=
h(is)f(mostly)f(here)i(to)f(remind)h(me)f(to)150 2467 y(\014nish)i(it)p=0A=
FB(:)8 b(:)g(:)e FD(])p eop=0A=
%%Page: 76 87=0A=
76 86 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)42 b(Programming)19=0A=
b(the)e(/pro)q(c)i(\014lesystem)842 b FH(76)150 88 y Ft(2.3)70=0A=
b(Programming)22 b(the)h(/pro)r(c)g(\014lesystem)150 221 y=0A=
FD(Note:)32 b FH(the)21 =
b(co)q(de)g(fragmen)o(ts)f(in)h(this)g(section)h(w)o=0A=
(on't)d(matc)o(h)h(the)h(sources)g(for)f(y)o(our)g(o)o(wn)g(k)o(ernel)-18=
95=0A=
b Fr(3)150 286 y FH(exactly)l(,)15 b(as)e(the)i FE(/proc)e=0A=
FH(\014lesystem)i(has)f(b)q(een)h(expanded)h(since)f(this)g(w)o(as)e=0A=
(originally)j(written,)e(and)g(is)150 350 =
y(b)q(eing)h(expanding)g(still)g=0A=
(more.)k(F)l(or)13 b(instance,)h(the)g FE(root)p 1150 350 15=0A=
2 v 16 w(dir)f FH(structure)h(has)f(nearly)h(doubled)i(in)e(size)150=0A=
414 y(from)g(the)i(one)f(quoted)g(here)h(b)q(elo)o(w.)221 502=0A=
y(Unlik)o(e)21 =
b(in)h(most)d(\014lesystems,)j(not)e(all)i(ino)q(de)f(n)o(um)o=0A=
(b)q(ers)g(in)g(the)g(pro)q(c)g(\014lesystem)g(are)f(unique.)150=0A=
567 y(Some)15 b(\014les)h(are)f(declared)i(in)f(structures)f(lik)o(e)264=0A=
684 y Fs(static)20 b(struct)h(proc_dir_entry)e(root_dir[])g(=3D)j({)438=0A=
741 y({)g(1,1,".")e(},)438 798 y({)i(1,2,"..")e(},)438 855=0A=
y({)i(2,7,"loadavg")d(},)438 911 y({)j(3,6,"uptime")d(},)438=0A=
968 y({)j(4,7,"meminfo")d(},)438 1025 y({)j(5,4,"kmsg")d(},)438=0A=
1082 y({)j(6,7,"version")d(},)438 1138 y({)j(7,4,"self")d(})44=0A=
b(/*)21 b(will)g(change)g(inode)f(#)i(*/)438 1195 y({)g(8,4,"net")d(})264=0A=
1252 y(};)150 1377 y =
FH(and)c(some)f(\014les)i(are)e(dynamically)j(created)d=0A=
(as)h(the)f(\014lesystem)i(is)f(read.)k(All)d(the)f(pro)q(cess)g(director=
ies)=0A=
150 1442 y(\(those)k(with)g(n)o(umerical)h(names)g(and)f FE(self)p=0A=
FH(\))f(essen)o(tially)j(ha)o(v)o(e)e(ino)q(de)h(n)o(um)o(b)q(ers)f(that)=
g=0A=
(are)g(the)g(pid)150 1506 y(shifted)k(left)f(16)f(bits,)j(but)e(the)g=0A=
(\014les)h(within)g(those)f(directories)h(re-use)g(lo)o(w)e(\(1{10)g(or)g=0A=
(so\))h(ino)q(de)150 1570 y(n)o(um)o(b)q(ers,)15 =
b(whic)o(h)i(are)e(added)h=0A=
(at)f(run)o(time)h(to)f(the)g(pid)i(of)e(the)g(pro)q(cess.)21=0A=
b(This)16 b(is)g(done)g(in)g(ino)q(de.c)h(b)o(y)150 1635 y(careful)f=0A=
(re-assignmen)o(t)f(of)g FE(inode)p 760 1635 V 16 w(operation)f=0A=
FH(structures.)221 1723 =
y(Most)g(of)h(the)h(short)e(read-only)i(\014les)h(in)=0A=
f(the)g(ro)q(ot)e(directory)i(and)g(in)g(eac)o(h)f(pro)q(cess)h(sub)q=0A=
(directory)150 1787 y(one)h(use)h(a)f(simpli\014ed)j(in)o(terface)e(pro)o=0A=
(vided)g(b)o(y)f(the)h FE(array)p 1208 1787 V 16 w(inode)p=0A=
1344 1787 V 17 w(operations)d FH(structure,)j(within)150 1851=0A=
y(arra)o(y)l(.c.)221 1939 y(Other)c(directories,)i(suc)o(h)f(as)f(/pro)q=0A=
(c/net/,)g(ha)o(v)o(e)g(their)i(o)o(wn)e(ino)q(de)i(n)o(um)o(b)q(ers.)k(F=
)l=0A=
(or)14 b(instance,)h(the)150 2003 =
y(net)h(directory)g(itself)g(has)f(ino)q=0A=
(de)i(n)o(um)o(b)q(er)f(8.)21 b(The)16 =
b(\014les)g(within)h(that)e(directory)=0A=
h(use)g(ino)q(de)h(n)o(um)o(b)q(ers)150 2068 =
y(from)d(the)g(range)h(128{160,)=0A=
d(and)j(those)f(are)g(uniquely)j(iden)o(ti\014ed)f(in)g(ino)q(de.c)f(and)=
g=0A=
(the)f(\014les)i(giv)o(en)f(the)150 2132 =
y(prop)q(er)g(p)q(ermissions)i(when)=0A=
f(lo)q(ok)o(ed)f(up)h(and)f(read.)221 2220 y(Adding)g(a)e(\014le)i(is)f=0A=
(relativ)o(ely)h(simple,)g(and)f(is)h(left)f(as)f(an)h(exersize)h(for)e(t=
he)h=0A=
(reader.)19 b(Adding)c(a)f(new)150 2284 =
y(directory)k(is)g(a)f(little)i(bit)f=0A=
(harder.)27 b(Assuming)18 =
b(that)f(it)h(is)g(not)f(a)h(dynamically)h(allo)q=0A=
(cated)g(directory)150 2349 y(lik)o(e)d(the)g(pro)q(cess)f(directories,)h=0A=
(here)g(are)e(the)i(steps:)1068 2332 y Fm(2)p 150 2388 720=0A=
2 v 207 2416 a FA(2)225 2431 y =
Fl(Un)r(l)r(e)r(s)r(s)g(y)o(o)q(u)h(ar)q(e)f=0A=
(ma)s(k)r(i)r(n)s(g)g(a)d(su)r(b)t(d)r(i)r(r)r(e)r(c)r(t)q(o)s(r)q(y)k(of=
)d=0A=
(th)q(e)i(re)q(p)r(l)r(i)r(c)r(a)r(t)r(i)r(n)s(g)r(,)f(dy)r(n)s(a)s(m)s(i=
)r=0A=
(c)r(a)r(l)r(l)r(y)h(al)q(l)r(o)t(c)r(a)r(t)r(e)r(d)g(pr)r(o)s(c)r(e)r(s)=
r(s)=0A=
g(di)q(r)r(e)r(c)r(t)q(o)s(r)q(y,)150 2483 =
y(y)o(o)r(u)h(w)o(o)r(u)s(l)r(d)h=0A=
(ha)q(v)q(e)f(to)f(cr)q(e)r(a)r(t)r(e)h(a)d(ne)r(w)j(\014l)r(e)r(s)r(y)r(=
s)r=0A=
(t)r(e)r(m)h(t)o(y)q(p)t(e)r(,)e(si)q(m)t(i)q(l)r(a)s(r)g(to)g(th)r(e)h(p=
r)q=0A=
(o)s(c)g(\014l)r(e)r(s)r(y)r(s)r(t)r(e)r(m)h(in)f(de)r(s)q(i)r(g)s(n)r(.)=
22=0A=
b(Su)r(b)t(d)s(i)r(r)r(e)r(c)q(t)r(o)r(-)150 2535 y(ri)q(e)r(s)15=0A=
b(of)g(th)q(e)h(pr)q(o)t(c)r(e)r(s)q(s)g(di)r(r)q(e)r(c)r(t)r(o)r(r)r(i)r=
(e)r=0A=
(s)f(ar)q(e)h(su)r(p)s(p)s(o)s(r)q(t)r(e)r(d)h(b)o(y)f(th)q(e)g(me)r(c)q(=
h)s=0A=
(a)r(n)s(i)r(s)r(m)h(wh)s(i)q(c)q(h)g(dy)r(n)s(a)r(m)t(i)q(c)r(a)s(l)r(l)=
q(y)=0A=
g(cr)q(e)q(a)s(t)q(e)r(s)f(th)q(e)g(pr)r(o)s(c)r(e)r(s)r(s)p=0A=
eop=0A=
%%Page: 77 88=0A=
77 87 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(77)206 88 y(1.)22=0A=
b(Cho)q(ose)e(a)g FD(unique)g =
FH(range)g(of)g(ino)q(de)h(n)o(um)o(b)q(ers,)h=0A=
(giving)f(y)o(ourself)f(a)g(reasonable)h(amoun)o(t)e(of)264=0A=
153 y(ro)q(om)14 b(for)h(expansion.)21 b(Then,)15 =
b(righ)o(t)g(b)q(efore)g=0A=
(the)h(line)473 247 y Fs(if)21 b(\(!pid\))g({)g(/*)g(not)h(a)f(process)g=0A=
(directory)f(but)h(in)g(/proc/)g(*/)264 349 y FH(add)15 =
b(a)g(section)h(that)=0A=
e(lo)q(oks)i(lik)o(e)g(this:)473 443 y Fs(if)21 =
b(\(\(ino)g(>=3D)g(128\))g(&&)g=0A=
(\(ino)g(<=3D)h(160\)\))f({)g(/*)h(files)e(withing)h(/proc/net)f(*/)603=0A=
500 y(inode->i_mode)f(=3D)j(S_IFREG)e(|)i(0444;)603 556 =
y(inode->i_op)e(=3D)h=0A=
(&proc_net_inode_oper)o(atio)o(ns;)603 613 y(return;)473 670=0A=
y(})264 772 y =
FH(but)e(mo)q(dify)h(it)f(to)f(to)h(do)g(what)f(y)o(ou)h(w)o=0A=
(an)o(t.)31 b(F)l(or)18 =
b(instance,)j(p)q(erhaps)e(y)o(ou)g(ha)o(v)o(e)g(a)g=0A=
(range)f(of)264 836 =
y(200{256,)f(and)i(some)f(\014les,)i(ino)q(des)g(200,)f=0A=
(201,)f(and)h(202,)f(and)h(some)f(directories,)j(whic)o(h)e(are)264=0A=
900 =
y(ino)q(des)d(204)e(and)i(205.)j(Y)l(ou)c(also)g(ha)o(v)o(e)g(a)g(\014le)=0A=
h(that)f(is)g(readable)h(only)g(b)o(y)f(ro)q(ot,)f(ino)q(de)j(206.)264=0A=
983 y(Y)l(our)e(example)h(migh)o(t)f(lo)q(ok)g(lik)o(e)i(this:)473=0A=
1078 y =
Fs(if)k(\(\(ino)g(>=3D)g(200\))g(&&)g(\(ino)g(<=3D)h(256\)\))f({)g(/*)h=0A=
(files)e(withing)h(/proc/foo)f(*/)603 1134 y(switch)h(\(ino\))g({)647=0A=
1191 y(case)g(204:)647 1248 y(case)g(205:)756 1305 =
y(inode->i_mode)e(=3D)j=0A=
(S_IFDIR)e(|)i(0555;)756 1361 =
y(inode->i_op)d(=3D)j(&proc_foo_inode_o)o(perat)o=0A=
(ions;)756 1418 y(break;)647 1475 y(case)f(206:)756 1532 =
y(inode->i_mode)e(=3D)=0A=
j(S_IFREG)e(|)i(0400;)756 1589 =
y(inode->i_op)d(=3D)j(&proc_foo_inode_o)o(perat)=0A=
o(ions;)756 1645 y(break;)647 1702 y(default:)756 1759 =
y(inode->i_mode)d(=3D)j=0A=
(S_IFREG)e(|)i(0444;)756 1816 =
y(inode->i_op)d(=3D)j(&proc_foo_inode_o)o(perat)o=0A=
(ions;)756 1873 y(break;)603 1929 y(})603 1986 y(return;)473=0A=
2043 y(})206 2145 y =
FH(2.)g(Find)e(the)f(de\014nition)i(of)e(the)g(\014les.)=0A=
33 b(If)20 =
b(y)o(our)f(\014les)h(will)h(go)e(in)h(a)f(sub)q(directory)h(of)f=0A=
(/pro)q(c,)h(for)264 2209 y(instance,)15 =
b(y)o(ou)g(will)i(lo)q(ok)e(in)i(ro)=0A=
q(ot.c,)c(and)j(\014nd)g(the)f(follo)o(wing:)364 2303 y Fs(static)20=0A=
b(struct)h(proc_dir_entry)e(root_dir[])g(=3D)j({)473 2360 =
y({)f(1,1,".")g(},)p=0A=
150 2396 720 2 v 150 2439 a =
Fl(di)r(r)q(e)r(c)r(t)r(o)r(r)r(i)r(e)r(s)q(.)i=0A=
(I)15 =
b(su)q(g)r(g)s(e)r(s)r(t)j(go)q(i)r(n)s(g)h(th)q(r)r(o)r(u)s(g)r(h)g=0A=
(th)r(i)r(s)f(ex)q(p)s(l)r(a)r(n)s(a)r(t)r(i)r(o)r(n)h(of)e(ho)q(w)j(to)d=
(ad)=0A=
r(d)i(a)d(no)r(n)s(-)q(d)s(y)r(n)s(a)r(m)t(i)r(c)r(a)r(l)r(l)r(y)r(-)r(a)=
r(l)=0A=
r(l)r(o)s(c)r(a)r(t)r(e)r(d)j(di)r(-)150 2491 =
y(re)q(c)r(t)q(o)s(r)q(y,)i(un)=0A=
s(d)s(e)r(r)q(s)r(t)r(a)r(n)s(d)i(it,)f(an)r(d)i(th)q(e)r(n)f(re)q(a)r(d)=
g=0A=
(th)q(e)g(co)r(d)s(e)f(fo)q(r)g(th)q(e)g(pr)r(o)s(c)r(e)r(s)r(s)g(su)r(b)=
t(d)=0A=
r(i)r(r)r(e)r(c)r(t)r(o)r(r)r(i)q(e)r(s)r(,)g(if)f(y)o(o)q(u)i(wi)r(s)r(h=
)g=0A=
(to)e(ad)r(d)150 2543 =
y(su)r(b)s(d)s(i)r(r)r(e)r(c)r(t)q(o)r(r)r(i)r(e)r(s)e=0A=
(to)e(th)r(e)i(pr)q(o)s(c)r(e)r(s)r(s)g(su)q(b)t(d)s(i)r(r)q(e)r(c)r(t)r(=
o)r=0A=
(r)r(i)r(e)r(s)r(.)p eop=0A=
%%Page: 78 89=0A=
78 88 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(78)473 88 y Fs({)21=0A=
b(1,2,"..")f(},)473 145 y({)h(2,7,"loadavg")e(},)473 202 =
y({)i(3,6,"uptime")e=0A=
(},)473 259 y({)i(4,7,"meminfo")e(},)473 316 y({)i(5,4,"kmsg")f(},)473=0A=
372 y({)h(6,7,"version")e(},)473 429 y({)i(7,4,"self")f(},)43=0A=
b(/*)21 b(will)g(change)g(inode)g(#)g(*/)473 486 y({)g(8,4,"net")f(})364=0A=
543 y(};)264 644 y FH(Y)l(ou)14 =
b(will)h(then)g(add)f(a)f(new)i(\014le)g(to)e=0A=
(this)h(structure,)g(lik)o(e)h(this,)f(using)h(the)f(next)g(a)o(v)m(ailab=
le)i=0A=
(ino)q(de)264 708 y(n)o(um)o(b)q(er:)364 802 y Fs([...])473=0A=
858 y({)21 b(6,7,"version")e(},)473 915 y({)i(7,4,"self")f(},)43=0A=
b(/*)21 b(will)g(change)g(inode)g(#)g(*/)473 972 y({)g(8,4,"net")f(},)473=0A=
1029 y({)h(9,3,"foo")f(})364 1086 y(};)264 1187 y FH(Y)l(ou)15=0A=
b(will)i(then)e(ha)o(v)o(e)g(to)g(pro)o(vide)h(for)e(this)i(new)f(directo=
ry)h=0A=
(in)g(ino)q(de.c,)g(so:)473 1280 y Fs(if)21 =
b(\(!pid\))g({)g(/*)g(not)h(a)f=0A=
(process)g(directory)f(but)h(in)g(/proc/)g(*/)582 1337 =
y(inode->i_mode)e(=3D)i=0A=
(S_IFREG)g(|)g(0444;)582 1394 =
y(inode->i_op)e(=3D)j(&proc_array_inod)o(e_ope)o=0A=
(rati)o(ons;)582 1450 y(switch)e(\(ino\))625 1507 y(case)h(5:)734=0A=
1564 y(inode->i_op)f(=3D)h(&proc_kmsg_inode_o)o(perat)o(ions;)734=0A=
1621 y(break;)625 1678 =
y(case)g(8:)g(/*)h(for)f(the)g(net)g(directory)f(*/)=0A=
734 1734 y(inode->i_mode)f(=3D)j(S_IFDIR)e(|)i(0555;)734 1791=0A=
y(inode->i_op)e(=3D)h(&proc_net_inode_op)o(erati)o(ons;)734 1848=0A=
y(break;)625 1905 y(default:)734 1962 y(break;)734 2018 y(return;)473=0A=
2075 y(})264 2176 y FH(b)q(ecomes)473 2270 y =
Fs(if)g(\(!pid\))g({)g(/*)g(not)=0A=
h(a)f(process)g(directory)f(but)h(in)g(/proc/)g(*/)582 2326=0A=
y(inode->i_mode)e(=3D)i(S_IFREG)g(|)g(0444;)582 2383 =
y(inode->i_op)e(=3D)j=0A=
(&proc_array_inod)o(e_ope)o(rati)o(ons;)582 2440 y(switch)e(\(ino\))625=0A=
2497 y(case)h(5:)734 2554 =
y(inode->i_op)f(=3D)h(&proc_kmsg_inode_o)o(perat)o=0A=
(ions;)p eop=0A=
%%Page: 79 90=0A=
79 89 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(79)734 88 y Fs(break;)625=0A=
145 y(case)21 b(8:)g(/*)h(for)f(the)g(net)g(directory)f(*/)734=0A=
202 y(inode->i_mode)f(=3D)j(S_IFDIR)e(|)i(0555;)734 259 =
y(inode->i_op)e(=3D)h=0A=
(&proc_net_inode_op)o(erati)o(ons;)734 316 y(break;)625 372=0A=
y(case)g(9:)g(/*)h(for)f(the)g(foo)g(directory)f(*/)734 429=0A=
y(inode->i_mode)f(=3D)j(S_IFDIR)e(|)i(0555;)734 486 y(inode->i_op)e(=3D)h=0A=
(&proc_foo_inode_op)o(erati)o(ons;)734 543 y(break;)625 599=0A=
y(default:)734 656 y(break;)734 713 y(return;)473 770 y(})206=0A=
872 y =
FH(3.)h(Y)l(ou)j(no)o(w)g(ha)o(v)o(e)h(to)f(pro)o(vide)h(for)f(the)g=0A=
(con)o(ten)o(ts)g(of)g(the)h(\014les)g(within)h(the)f(fo)q(o)f(directory)=
l(.)=0A=
264 936 =
y(Mak)o(e)j(a)g(\014le)i(called)h(pro)q(c/fo)q(o.c,)g(follo)o(wing)f=0A=
(the)f(follo)o(wing)g(mo)q(del:)1564 919 y Fm(3)1632 936 y=0A=
FD([The)34 b(co)q(de)g(in)264 1000 y FE(proc)p 363 1000 15=0A=
2 v 16 w(lookupfoo\(\))14 b FD(and)h FE(proc)p 851 1000 V 17=0A=
w(readfoo\(\))e =
FD(should)j(b)q(e)f(abstracted,)j(as)d(the)g(function-)264=0A=
1065 y(alit)o(y)j(is)g(used)f(in)h(more)f(than)h(one)g(place.])364=0A=
1159 y Fs(/*)385 1216 y(*)44 b(linux/fs/proc/fo)o(o.c)385 1272=0A=
y(*)385 1329 y(*)g(Copyright)20 =
b(\(C\))h(1993)g(Linus)g(Torvalds,)f(Michael)=0A=
g(K.)h(Johnson,)f(and)i(Your)f(N.)g(Here)385 1386 y(*)385 1443=0A=
y(*)44 b(proc)21 b(foo)g(directory)f(handling)g(functions)385=0A=
1500 y(*)385 1556 y(*)44 b(inode)21 b(numbers)f(200)h(-)h(256)f(are)g=0A=
(reserved)f(for)h(this)g(directory)385 1613 y(*)44 b(\(/proc/foo/)19=0A=
b(and)i(its)h(subdirectories\))385 1670 y(*/)364 1783 y(#include)e=0A=
(<asm/segment.h>)364 1840 y(#include)g(<linux/errno.h>)364=0A=
1897 y(#include)g(<linux/sched.h>)364 1954 =
y(#include)g(<linux/proc_fs.h)o(>)=0A=
364 2011 y(#include)g(<linux/stat.h>)364 2124 y(static)g(int)h=0A=
(proc_readfoo\(struct)d(inode)j(*,)g(struct)g(file)g(*,)g(struct)g(dirent=
)f=0A=
(*,)i(int\);)364 2181 =
y(static)e(int)h(proc_lookupfoo\(stru)o(ct)e(inode)i=0A=
(*,const)f(char)h(*,int,struct)e(inode)i(**\);)364 2238 y(static)f(int)h=0A=
(proc_read\(struct)e(inode)i(*)g(inode,)g(struct)f(file)h(*)h(file,)821=0A=
2295 y(char)f(*)h(buf,)f(int)g(count\);)364 2408 y(static)f(struct)h=0A=
(file_operations)d(proc_foo_operations)g(=3D)k({)p 150 2448 720=0A=
2 v 207 2476 a FA(3)225 2491 y =
Fl(Th)r(i)r(s)e(\014l)r(e)g(is)f(a)o(va)r(i)r=0A=
(l)q(a)s(b)t(e)h(as)f(\014l)r(e)h(pr)r(o)s(c)r(/)r(f)q(o)t(o)r(.)q(c)g(in=
)g=0A=
(th)q(e)h Fb(The)14 b(Linux)g(Kernel)g(Hackers')f(Guide)j =
Fl(so)q(u)s(r)r(c)r=0A=
(e)k(m)q(e)r(n)q(t)r(i)r(o)r(n)s(e)r(d)150 2543 =
y(on)f(th)q(e)g(co)q(p)r(y)r=0A=
(r)r(i)r(g)r(h)r(t)f(pa)r(g)s(e)r(.)p eop=0A=
%%Page: 80 91=0A=
80 90 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(80)538 88 y Fs(NULL,)413=0A=
b(/*)21 b(lseek)g(-)h(default)e(*/)538 145 y(proc_read,)303=0A=
b(/*)21 b(read)g(*/)538 202 y(NULL,)413 b(/*)21 =
b(write)g(-)h(bad)f(*/)538=0A=
259 y(proc_readfoo,)237 b(/*)21 b(readdir)g(*/)538 316 y(NULL,)413=0A=
b(/*)21 b(select)g(-)h(default)e(*/)538 372 y(NULL,)413 b(/*)21=0A=
b(ioctl)g(-)h(default)e(*/)538 429 y(NULL,)413 b(/*)21 b(mmap)g(*/)538=0A=
486 y(NULL,)413 b(/*)21 b(no)h(special)e(open)h(code)g(*/)538=0A=
543 y(NULL)435 b(/*)21 b(no)h(special)e(release)g(code)h(*/)364=0A=
599 y(};)364 713 y(/*)385 770 =
y(*)h(proc)f(directories)e(can)j(do)f(almost)g=0A=
(nothing..)385 827 y(*/)364 883 y(struct)f(inode_operations)f=0A=
(proc_foo_inode_o)o(perat)o(ions)f(=3D)k({)538 940 =
y(&proc_foo_operati)o(ons,)=0A=
62 b(/*)21 b(default)g(foo)g(directory)f(file-ops)g(*/)538=0A=
997 y(NULL,)413 b(/*)21 b(create)g(*/)538 1054 y(proc_lookupfoo,)193=0A=
b(/*)21 b(lookup)g(*/)538 1111 y(NULL,)413 b(/*)21 b(link)g(*/)538=0A=
1167 y(NULL,)413 b(/*)21 b(unlink)g(*/)538 1224 y(NULL,)413=0A=
b(/*)21 b(symlink)g(*/)538 1281 y(NULL,)413 b(/*)21 b(mkdir)g(*/)538=0A=
1338 y(NULL,)413 b(/*)21 b(rmdir)g(*/)538 1394 y(NULL,)413=0A=
b(/*)21 b(mknod)g(*/)538 1451 y(NULL,)413 b(/*)21 b(rename)g(*/)538=0A=
1508 y(NULL,)413 b(/*)21 b(readlink)g(*/)538 1565 y(NULL,)413=0A=
b(/*)21 b(follow_link)f(*/)538 1622 y(NULL,)413 b(/*)21 b(bmap)g(*/)538=0A=
1678 y(NULL,)413 b(/*)21 b(truncate)g(*/)538 1735 y(NULL)435=0A=
b(/*)21 b(permission)f(*/)364 1792 y(};)364 1906 y(static)g(struct)h=0A=
(proc_dir_entry)e(foo_dir[])h(=3D)h({)538 1962 y({)h(1,2,"..")e(},)538=0A=
2019 y({)i(9,1,".")e(},)538 2076 y({)i(200,3,"bar")d(},)538=0A=
2133 y({)j(201,4,"suds")d(},)538 2190 y({)j(202,5,"xyzzy")d(},)538=0A=
2246 y({)j(203,3,"baz")d(},)538 2303 y({)j(204,4,"dir1")d(},)538=0A=
2360 y({)j(205,4,"dir2")d(},)538 2417 y({)j(206,8,"rootfile)o(")d(})364=0A=
2473 y(};)p eop=0A=
%%Page: 81 92=0A=
81 91 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(81)364 88 y Fs(#define)20=0A=
b(NR_FOO_DIRENTRY)f(\(\(sizeof)h(\(foo_dir\)\)/\(size)o(of)f=0A=
(\(foo_dir[0]\)\)\))364 202 =
y(unsigned)h(int)h(get_bar\(char)e(*)j(buffer\);)=0A=
364 259 y(unsigned)e(int)h(get_suds\(char)e(*)j(buffer\);)364=0A=
316 y(unsigned)e(int)h(get_xyzzy\(char)e(*)i(buffer\);)364=0A=
372 y(unsigned)f(int)h(get_baz\(char)e(*)j(buffer\);)364 429=0A=
y(unsigned)e(int)h(get_rootfile\(char)d(*)k(buffer\);)364 599=0A=
y(static)e(int)h(proc_read\(struct)e(inode)i(*)g(inode,)g(struct)f(file)h=
(*)h=0A=
(file,)821 656 y(char)f(*)h(buf,)f(int)g(count\))364 713 y({)538=0A=
770 y(char)g(*)h(page;)538 827 y(int)f(length;)538 883 y(int)g(end;)538=0A=
940 y(unsigned)f(int)h(ino;)538 1054 y(if)g(\(count)g(<)g(0\))712=0A=
1111 y(return)g(-EINVAL;)538 1167 y(page)g(=3D)h(\(char)e(*\))i=0A=
(get_free_page\(GF)o(P_KER)o(NEL\))o(;)538 1224 y(if)f(\(!page\))712=0A=
1281 y(return)g(-ENOMEM;)538 1338 y(ino)g(=3D)h(inode->i_ino;)538=0A=
1394 y(switch)f(\(ino\))f({)712 1451 y(case)h(200:)887 1508=0A=
y(length)f(=3D)i(get_bar\(page\);)887 1565 y(break;)712 1622=0A=
y(case)f(201:)887 1678 y(length)f(=3D)i(get_suds\(page\);)887=0A=
1735 y(break;)712 1792 y(case)f(202:)887 1849 y(length)f(=3D)i=0A=
(get_xyzzy\(page\);)887 1906 y(break;)712 1962 y(case)f(203:)887=0A=
2019 y(length)f(=3D)i(get_baz\(page\);)887 2076 y(break;)712=0A=
2133 y(case)f(206:)887 2190 y(length)f(=3D)i(get_rootfile\(pag)o(e\);)887=0A=
2246 y(break;)712 2303 y(default:)887 2360 y(free_page\(\(unsig)o(ned)d=0A=
(long\))h(page\);)887 2417 y(return)g(-EBADF;)538 2473 y(})538=0A=
2530 y(if)h(\(file->f_pos)f(>=3D)h(length\))f({)p eop=0A=
%%Page: 82 93=0A=
82 92 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(82)712 88 y Fs=0A=
(free_page\(\(unsigned)18 b(long\))j(page\);)712 145 y(return)g(0;)538=0A=
202 y(})538 259 y(if)g(\(count)g(+)g(file->f_pos)f(>)i(length\))712=0A=
316 y(count)f(=3D)h(length)e(-)i(file->f_pos;)538 372 =
y(end)f(=3D)h(count)e(+)i=0A=
(file->f_pos;)538 429 y(memcpy_tofs\(buf,)c(page)j(+)h(file->f_pos,)d=0A=
(count\);)538 486 y(free_page\(\(unsign)o(ed)g(long\))i(page\);)538=0A=
543 y(file->f_pos)e(=3D)j(end;)538 599 y(return)f(count;)364=0A=
713 y(})364 827 y(static)f(int)h(proc_lookupfoo\(stru)o(ct)e(inode)i(*)g=0A=
(dir,const)f(char)h(*)h(name,)e(int)i(len,)538 883 =
y(struct)f(inode)f(**)i=0A=
(result\))364 940 y({)538 997 y(unsigned)e(int)h(pid,)g(ino;)538=0A=
1054 y(int)g(i;)538 1167 y(*result)f(=3D)i(NULL;)538 1224 =
y(if)f(\(!dir\))712=0A=
1281 y(return)g(-ENOENT;)538 1338 =
y(if)g(\(!S_ISDIR\(dir->i_mo)o(de\)\))d({)=0A=
712 1394 y(iput\(dir\);)712 1451 y(return)j(-ENOENT;)538 1508=0A=
y(})538 1565 y(ino)g(=3D)h(dir->i_ino;)538 1622 =
y(i)g(=3D)f(NR_FOO_DIRENTRY;)538=0A=
1678 y(while)g(\(i--)g(>)g(0)h(&&)f(!proc_match\(len,nam)o(e,fo)o(o_dir)o=0A=
(+i\)\))712 1735 y(/*)h(nothing)e(*/;)538 1792 =
y(if)h(\(i)h(<)f(0\))h({)712=0A=
1849 y(iput\(dir\);)712 1906 y(return)f(-ENOENT;)538 1962 y(})538=0A=
2019 y(if)g(\(!\(*result)f(=3D)i(iget\(dir->i_sb,i)o(no\)\)\))c({)712=0A=
2076 y(iput\(dir\);)712 2133 y(return)j(-ENOENT;)538 2190 y(})538=0A=
2246 y(iput\(dir\);)538 2303 y(return)g(0;)364 2360 y(})364=0A=
2473 =
y(static)f(int)h(proc_readfoo\(struct)d(inode)j(*)h(inode,)e(struct)h=0A=
(file)g(*)g(filp,)538 2530 =
y(struct)g(dirent)f(*)i(dirent,)e(int)h(count\))p=0A=
eop=0A=
%%Page: 83 94=0A=
83 93 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)36 b(Programming)19=0A=
b(the)f(/pro)q(c)h(\014lesystem)847 b FH(83)364 88 y Fs({)538=0A=
145 y(struct)21 b(proc_dir_entry)d(*)k(de;)538 202 =
y(unsigned)e(int)h(pid,)g=0A=
(ino;)538 259 y(int)g(i,j;)538 372 y(if)g(\(!inode)g(||)g=0A=
(!S_ISDIR\(inode->i_)o(mode\))o(\))712 429 y(return)g(-EBADF;)538=0A=
486 y(ino)g(=3D)h(inode->i_ino;)538 543 y(if)f(\(\(\(unsigned\))f=0A=
(filp->f_pos\))f(<)j(NR_FOO_DIRENTRY)o(\))d({)712 599 =
y(de)j(=3D)f(foo_dir)g(+)=0A=
g(filp->f_pos;)712 656 y(filp->f_pos++;)712 713 =
y(i)h(=3D)f(de->namelen;)712=0A=
770 y(ino)g(=3D)h(de->low_ino;)712 827 =
y(put_fs_long\(ino,)d(&dirent->d_ino\);)=0A=
712 883 y(put_fs_word\(i,&dire)o(nt->d)o(_recl)o(en\);)712=0A=
940 y(put_fs_byte\(0,i+dir)o(ent->)o(d_nam)o(e\);)712 997 =
y(j)j(=3D)f(i;)712=0A=
1054 y(while)g(\(i--\))887 1111 y(put_fs_byte\(de->)o(name[)o(i],)d=0A=
(i+dirent->d_name\);)712 1167 y(return)j(j;)538 1224 y(})538=0A=
1281 y(return)g(0;)364 1338 y(})364 1508 =
y(unsigned)f(int)h(get_foo\(char)e=0A=
(*)j(buffer\))364 1565 y({)364 1678 =
y(/*)f(code)g(to)g(find)g(everything)f=0A=
(goes)h(here)g(*/)538 1792 =
y(return)g(sprintf\(buffer,)d("format)j(string",)f=0A=
(variables\);)364 1849 y(})364 2019 =
y(unsigned)g(int)h(get_suds\(char)e(*)j=0A=
(buffer\))364 2076 y({)364 2190 =
y(/*)f(code)g(to)g(find)g(everything)f(goes)h=0A=
(here)g(*/)538 2303 y(return)g(sprintf\(buffer,)d("format)j(string",)f=0A=
(variables\);)364 2360 y(})364 2530 =
y(unsigned)g(int)h(get_xyzzy\(char)e(*)i=0A=
(buffer\))p eop=0A=
%%Page: 84 95=0A=
84 94 bop 150 -84 1800 3 v 150 -100 a FD(2.3.)42 b(Programming)19=0A=
b(the)e(/pro)q(c)i(\014lesystem)842 b FH(84)364 88 y Fs({)364=0A=
202 y(/*)21 b(code)g(to)g(find)g(everything)f(goes)h(here)g(*/)538=0A=
316 y(return)g(sprintf\(buffer,)d("format)j(string",)f(variables\);)364=0A=
372 y(})364 543 y(unsigned)g(int)h(get_baz\(char)e(*)j(buffer\))364=0A=
599 y({)364 713 =
y(/*)f(code)g(to)g(find)g(everything)f(goes)h(here)g(*/)538=0A=
827 y(return)g(sprintf\(buffer,)d("format)j(string",)f(variables\);)364=0A=
883 y(})364 1054 y(unsigned)g(int)h(get_rootfile\(char)d(*)k(buffer\))364=0A=
1111 y({)364 1224 =
y(/*)f(code)g(to)g(find)g(everything)f(goes)h(here)g(*/)538=0A=
1338 y(return)g(sprintf\(buffer,)d("format)j(string",)f(variables\);)364=0A=
1394 y(})206 1496 y =
FH(4.)i(Filling)g(in)f(the)f(directories)h(dir1)f(and)g=0A=
(dir2)h(is)f(left)h(as)e(an)h(excersize.)36 b(In)21 =
b(most)e(cases,)i(suc)o=0A=
(h)264 1561 y(directories)16 b(will)h(not)e(b)q(e)g(needed.)22=0A=
b(Ho)o(w)o(ev)o(er,)14 b(if)h(they)g(are,)g(the)g(steps)g(presen)o(ted)h=0A=
(here)g(ma)o(y)e(b)q(e)264 1625 y(applied)20 =
b(recursiv)o(ely)g(to)e(add)h=0A=
(\014les)h(to)d(a)i(directory)g(at)f(another)g(lev)o(el.)31=0A=
b(Notice)20 b(that)d(I)i(sa)o(v)o(ed)264 1689 =
y(a)g(range)g(of)f(200{256)g=0A=
(for)g(/pro)q(c/fo)q(o/)h(and)g(all)h(its)g(sub)q(directories,)h(so)e(the=
re)h=0A=
(are)f(plen)o(t)o(y)g(of)264 1754 y(un)o(used)14 =
b(ino)q(de)g(n)o(um)o(b)q=0A=
(ers)g(in)g(that)e(range)h(for)g(y)o(our)f(\014les)j(in)f(dir1)f(and)h(di=
r2.)=0A=
19 b(I)14 b(suggest)e(reserving)264 1818 y(a)h(range)h(for)f(eac)o(h)h=0A=
(directory)l(,)h(in)f(case)g(y)o(ou)g(need)h(to)e(expand.)20=0A=
b(Also,)14 b(I)h(suggest)e(k)o(eeping)i(all)g(the)264 1882=0A=
y(extra)e(data)h(and)g(functions)h(in)g(fo)q(o.c,)f(rather)f(than)h(makin=
g)h=0A=
(y)o(et)e(another)h(\014le,)h(unless)h(the)e(\014les)264 1947=0A=
y(in)i(the)f(dir1)h(and)f(dir2)g(directories)i(are)e(signi\014can)o(tly)h=0A=
(di\013eren)o(t)h(in)f(concept)f(than)g(fo)q(o.)206 2048 y(5.)22=0A=
b(Mak)o(e)17 b(the)h(appropriate)g(c)o(hanges)h(to)e(fs/pro)q(c/Mak)o=0A=
(e\014le.)29 b(This)18 b(is)h(also)f(left)h(as)f(an)g(excersize)264=0A=
2113 y(for)c(the)h(reader.)221 2238 y FD([Please)j(note:)25=0A=
b(I)18 =
b(ha)o(v)o(e)f(made)h(c)o(hanges)g(similar)h(to)f(these)g(\(I)g(wrote)=0A=
h(the)f(/pro)q(c/net/)150 2302 y(supp)q(ort\).)29 b(Ho)o(w)o(ev)o(er,)18=0A=
b(this)h(has)g(b)q(een)g(written)h(from)f(memory)l(,)f(and)h(ma)o(y)f(b)q=
(e)h=0A=
(unin)o(ten-)150 2367 y(tionally)g(incomplete.)25 b(If)18 =
b(y)o(ou)e(notice)j=0A=
(an)o(y)e(inadequacies,)i(please)f(explain)g(them)g(to)f(me)150=0A=
2431 y(in)d(as)g(complete)h(detail)g(as)f(p)q(ossible.)23 b(My)13=0A=
b(email)i(address)f(is)g FE(johnsonm AT sunsite DOT unc DOT edu)o FD(])p=0A=
eop=0A=
%%Page: 85 96=0A=
85 95 bop 150 438 a Fv(Chapter)34 b(3)150 686 y Fx(The)40 =
b(Lin)m(ux)g(sc)m=0A=
(heduler)150 940 y FD([This)17 =
b(is)g(still)h(prett)o(y)e(w)o(eak,)h(but)f(I)=0A=
g(think)h(that)h(I)e(ha)o(v)o(e)f(remo)o(v)o(ed)g(most)h(or)h(all)h(of)e(=
the)=0A=
h(in-)150 1004 =
y(accuracies)g(that)f(w)o(ere)f(in)g(previous)h(v)o(ersions.)=0A=
22 b(Jim)15 b(Wisner)h(app)q(ears)g(to)g(ha)o(v)o(e)e(dropp)q(ed)150=0A=
1069 =
y(from)j(the)h(face)f(of)h(the)f(net,)h(so)f(I)g(ha)o(v)o(e)f(not)i(b)q=0A=
(een)f(able)h(to)g(get)f(his)h(help)f(at)h(making)f(this)150=0A=
1133 y(c)o(hapter)k(more)f(meaningful.)33 b(If)20 =
b(an)o(y)o(one)f(has)i(a)f=0A=
(cop)o(y)g(of)g(the)g(pap)q(er)i(he)e(wrote)g(on)h(the)150=0A=
1198 =
y(sc)o(heduler,)h(please)e(get)h(in)f(touc)o(h)h(with)f(me,)h(as)f(he)g=0A=
(promised)h(me)e(a)i(cop)o(y)l(,)f(and)h(I'd)f(at)150 1262=0A=
y(least)e(lik)o(e)g(to)g(see)f(what)h(he)f(had)h(to)g(sa)o(y)e(ab)q(out)j=0A=
(the)f(sc)o(heduler.])221 1350 =
y([I'm)g(not)h(going)h(to)e(sp)q(end)h(an)o(y)=0A=
f(further)i(time)e(on)h(this)g(un)o(til)g(the)g(new)f(sc)o(heduler)h(is)1=
50=0A=
1414 y(added)e(to)f(Lin)o(ux.)23 b(The)17 =
b(curren)o(t)g(one)f(do)q(esn't)h=0A=
(handle)g(lots)g(of)f(tasks)g(at)h(once)f(v)o(ery)f(w)o(ell,)150=0A=
1478 =
y(and)j(some)f(da)o(y)g(a)g(new)h(one)f(will)i(b)q(e)f(put)g(in.])221=0A=
1566 y FH(The)e(sc)o(heduler)h(is)f(a)f(function,)i FE(schedule\(\))p=0A=
FH(,)d(whic)o(h)i(is)g(called)i(at)d(v)m(arious)h(times)g(to)f(determine)=
150=0A=
1631 =
y(whether)h(or)f(not)h(to)f(switc)o(h)h(tasks,)e(and)i(if)g(so,)g(whic)o=0A=
(h)g(task)f(to)g(switc)o(h)h(to.)21 b(The)16 =
b(sc)o(heduler)h(w)o(orks)e(in)=0A=
150 1695 y(concert)e(with)g(the)g(function)g FE(do)p 710 1695=0A=
15 2 v 17 w(timer\(\))p =
FH(,)f(whic)o(h)h(is)h(called)g(100)e(times)h(p)q(er)=0A=
g(second)g(\(on)f(Lin)o(ux/x86\),)150 1759 =
y(on)f(eac)o(h)h(system)f(timer)h=0A=
(in)o(terrupt,)g(and)f(with)h(the)g(system)f(call)h(handler)h(part)e=0A=
FE(ret)p 1592 1759 V 16 w(from)p 1704 1759 V 17 w(sys)p 1793=0A=
1759 V 17 w(call\(\))150 1824 y FH(whic)o(h)16 b(is)g(called)h(on)e(the)g=0A=
(return)g(from)g(system)f(calls.)221 1912 y(When)150 1976 y(a)19=0A=
b(system)h(call)h(completes,)g(or)e(when)i(a)e(\\slo)o(w")g(in)o(terrupt)=
h=0A=
(completes,)h FE(ret)p 1541 1976 V 17 w(from)p 1654 1976 V=0A=
17 w(sys)p 1743 1976 V 17 w(call\(\))d FH(is)150 2040 y(called.)j(It)16=0A=
b(do)q(es)f(a)g(bit)h(of)f(w)o(ork,)e(but)j(all)g(w)o(e)f(care)g(ab)q(out=
)g=0A=
(are)g(t)o(w)o(o)f(lines:)264 2158 y Fs(cmpl)21 b($0,_need_resche)o(d)264=0A=
2215 y(jne)g(reschedule)150 2340 y FH(These)c(lines)h(c)o(hec)o(k)e(the)h=0A=
FE(need)p 690 2340 V 16 w(resched)f =
FH(\015ag,)f(and)i(if)g(it)f(is)h(set,)f=0A=
FE(schedule\(\))f FH(is)i(called,)h(c)o(ho)q(osing)e(a)150=0A=
2404 y(new)e(pro)q(cess,)g(and)h(then)f(after)f FE(schedule\(\))g=0A=
FH(has)h(c)o(hosen)g(the)h(new)f(pro)q(cess,)g(a)g(little)h(more)f(magic)=
g=0A=
(in)150 2469 y FE(ret)p 225 2469 V 17 w(from)p 338 2469 V 16=0A=
w(sys)p 426 2469 V 17 w(call\(\))g =
FH(restores)g(the)h(en)o(vironmen)o(t)g=0A=
(for)f(the)h(c)o(hosen)g(pro)q(cess)g(\(whic)o(h)g(ma)o(y)f(w)o(ell)i(b)q=
(e,)=0A=
150 2533 =
y(and)e(usually)i(is,)f(the)f(pro)q(cess)h(whic)o(h)g(is)g(already)f=0A=
(running\),)h(and)g(returns)f(to)f(user)i(space.)20 b(Returning)1027=0A=
2678 y(85)p eop=0A=
%%Page: 86 97=0A=
86 96 bop 150 -84 1800 3 v 150 -100 a FD(3.1.)42 b(The)18 b(co)q(de)1423=0A=
b FH(86)150 88 y(to)15 b(user)g(space)g(causes)h(the)f(new)g(pro)q(cess)h=0A=
(whic)o(h)g(has)f(b)q(een)h(selected)h(to)d(run)i(to)e(b)q(e)i(returned)g=0A=
(to.)221 176 y(In)i FE(sched)p 403 176 15 2 v 16 w(init\(\))f=0A=
FH(in)h(k)o(ernel/sc)o(hed.c,)g FE(request)p 1115 176 V 17=0A=
w(irq\(\))e FH(is)i(used)g(to)f(get)g(the)h(timer)f(in)o(terrupt.)150=0A=
241 y FE(request)p 321 241 V 16 w(irq\(\))i =
FH(sets)g(up)h(housek)o(eeping)h=0A=
(b)q(efore)f(and)g(after)f(in)o(terrupts)g(are)g(serviced,)j(as)d(seen)h(=
in)=0A=
150 305 y FE(<asm/irq.h>)p FH(.)d(Ho)o(w)o(ev)o(er,)10 b(in)o(terrupts)h=0A=
(that)f(are)g(serviced)i(often)f(and)f(that)g(m)o(ust)h(b)q(e)g(serviced)=
h=0A=
(quic)o(kly)l(,)150 369 y(suc)o(h)18 =
b(as)g(serial)h(in)o(terrupts,)g(do)f=0A=
FC(not)f FH(call)j FE(ret)p 973 369 V 16 w(from)p 1085 369=0A=
V 17 w(sys)p 1174 369 V 17 w(call\(\))d FH(when)i(done)f(and)g(do)g(as)g=0A=
(little)h(as)150 434 =
y(p)q(ossible,)k(to)c(k)o(eep)i(the)f(o)o(v)o(erhead)g=0A=
(do)o(wn.)34 b(In)21 b(particular,)h(they)e(only)h(sa)o(v)o(e)e(the)i=0A=
(registers)f(that)f(C)150 498 =
y(w)o(ould)e(clobb)q(er,)g(and)f(assume)g(that)=0A=
g(if)h(the)f(handler)h(is)g(going)f(to)g(use)g(an)o(y)g(others,)g(the)g=0A=
(handler)h(will)150 562 y(deal)i(with)g(that.)28 b(These)19=0A=
b(\\fast")e(in)o(terrupt)h(handlers)i(m)o(ust)d(b)q(e)i(installed)h(with)=
f=0A=
(the)g FE(irqaction\(\))150 627 y =
FH(function)d(describ)q(ed)h(in)f(section)g=0A=
(1.6.)221 715 y(The)g(Lin)o(ux)h(sc)o(heduler)g(is)f(signi\014can)o(tly)h=0A=
(di\013eren)o(t)g(from)e(the)h(sc)o(hedulers)h(in)g(other)e(unices,)i(esp=
)q=0A=
(e-)150 779 y(cially)h(in)e(its)h(treatmen)o(t)d(of)i(`nice)h(lev)o(el')f=0A=
(priorities.)24 b(Instead)16 b(of)g(sc)o(heduling)i(pro)q(cesses)e(with)g=0A=
(higher)150 843 =
y(priorit)o(y)d(\014rst,)f(Lin)o(ux)i(do)q(es)f(round-robin)h=0A=
(sc)o(heduling,)h(but)d(lets)i(higher)f(priorit)o(y)g(pro)q(cesses)g(run)=
g(b)=0A=
q(oth)150 908 y(so)q(oner)18 b(and)g(longer.)28 b(The)18 b(standard)g=0A=
Fn(un)p FB(?)p Fn(x)f =
FH(sc)o(heduler)j(instead)e(uses)g(queues)h(of)f(pro)q=0A=
(cesses.)28 b(Most)150 972 y(implemen)o(tations)14 b(use)f(t)o(w)o(o)f=0A=
(priorit)o(y)h(queues;)h(a)e(standard)h(queue)g(and)g(a)g(\\real)g(time")=
g=0A=
(queue.)20 b(Essen-)150 1036 =
y(tially)l(,)c(all)f(pro)q(cesses)g(on)g(the)g=0A=
(\\real)f(time")h(queue)g(get)g(executed)g(b)q(efore)g(pro)q(cesses)g(on)=
g=0A=
(the)f(standard)150 1101 y(queue,)g(if)f(they)g(are)f(not)h(blo)q(c)o(k)o=0A=
(ed,)h(and)f(within)h(eac)o(h)e(queue,)i(higher)g(nice-lev)o(el)h(pro)q=0A=
(cesses)f(run)f(b)q(efore)150 1165 y(lo)o(w)o(er)i(ones.)20=0A=
b(The)c(Lin)o(ux)g(sc)o(heduler)h(giv)o(es)e(m)o(uc)o(h)g(b)q(etter)h(in)=
o=0A=
(teractiv)o(e)f(p)q(erformance)h(at)e(the)i(exp)q(ense)150=0A=
1229 y(of)f(some)g(\\throughput.")150 1406 y Ft(3.1)70 b(The)22=0A=
b(co)r(de)150 1539 y =
FH(Here)h(is)g(a)g(cop)o(y)f(of)h(the)f(relev)m(an)o(t)i=0A=
(co)q(de)f(from)f(/usr/src/lin)o(ux/k)o(ernel/sc)o(hed.c,)k(annotated)c(a=
nd)=0A=
150 1603 y(abridged.)264 1730 y Fs(void)f(schedule\(void\))264=0A=
1786 y({)438 1843 y(int)g(i,next,c;)438 1900 =
y(struct)g(task_struct)e(**)i=0A=
(p;)264 2013 =
y(/*)g(check)g(alarm,)f(wake)h(up)h(any)f(interruptible)e(tasks)=0A=
i(that)g(have)g(got)g(a)g(signal)g(*/)438 2127 =
y(need_resched)e(=3D)j(0;)438=0A=
2184 =
y(for\(p)f(=3D)g(&LAST_TASK)f(;)i(p)f(>)h(&FIRST_TASK)d(;)j(--p\))f({)150=0A=
2318 y FH(The)30 =
b(pro)q(cess)g(table)g(is)h(an)f(arra)o(y)e(of)i(p)q(oin)o=0A=
(ters)g(to)f FE(struct)23 b(task)p 1423 2318 V 17 w(struct)29=0A=
b FH(structures.)63 b(See)150 2382 y(/usr/include/lin)o(ux/sc)o(hed.h)18=0A=
b(for)d(the)g(de\014nition)i(of)e(this)h(structure.)612 2497=0A=
y Fs(if)22 =
b(\(!*p)f(||)g(\(\(*p\)->state)e(!=3D)j(TASK_INTERRUPTIB)o(LE\)\))=0A=
787 2554 y(continue;)p eop=0A=
%%Page: 87 98=0A=
87 97 bop 150 -84 1800 3 v 150 -100 a FD(3.1.)36 b(The)18 b(co)q(de)1429=0A=
b FH(87)612 88 y Fs(if)22 =
b(\(\(*p\)->timeout)d(&&)i(\(*p\)->timeout)e(<)j=0A=
(jiffies\))e({)150 214 y =
FH(If)e(a)g(pro)q(cess)g(has)g(a)f(timeout)h(and)g=0A=
(has)g(reac)o(hed)g(it,)h(then)f FE(jiffies)f =
FH(\(the)h(n)o(um)o(b)q(er)g=0A=
(of)f(100th's)g(of)g(a)150 278 =
y(second)c(since)g(system)f(start\))f(will)j=0A=
(ha)o(v)o(e)e(passed)h FE(timeout)p FH(.)18 b FE(timeout)11=0A=
b FH(w)o(as)h(originally)i(set)e(as)g FE(jiffies)150 342 y(+)24=0A=
b FC(desir)n(e)n(d)p 337 342 14 2 v 16 w(time)n(out)p FH(.)787=0A=
460 y Fs(\(*p\)->timeout)19 b(=3D)i(0;)787 517 y(\(*p\)->state)e(=3D)j=0A=
(TASK_RUNNING;)612 574 y(})g(else)f(if)g(\(\(*p\)->signal)e(&)j=0A=
(~\(*p\)->blocked\))150 699 y =
FH(If)f(the)f(pro)q(cess)h(has)f(b)q(een)i(sen)=0A=
o(t)e(a)g(signal,)i(and)f(is)g(no)f(longer)h(blo)q(c)o(k)o(ed,)h(then)f(l=
et)g=0A=
(the)g(pro)q(cess)f(b)q(e)150 763 =
y(allo)o(w)o(ed)c(to)e(run)i(again,)e(when)=0A=
i(its)g(turn)f(comes.)787 881 y =
Fs(\(*p\)->state)k(=3D)j(TASK_RUNNING;)438=0A=
938 y(})150 1063 y =
FH(A)o(t)c(this)g(p)q(oin)o(t,)h(all)g(runnable)g(pro)q=0A=
(cesses)g(ha)o(v)o(e)e(b)q(een)j(\015agged)d(as)h(runnable,)i(and)e(w)o(e=
)g=0A=
(are)g(ready)g(to)150 1127 y(c)o(ho)q(ose)f(one)h(to)f(run,)h(b)o(y)f=0A=
(running)i(through)e(the)g(pro)q(cess)h(table.)27 b(What)17=0A=
b(w)o(e)g(are)g(lo)q(oking)h(for)f(is)h(the)150 1191 =
y(pro)q(cess)i(with)h=0A=
(the)f(largest)g(coun)o(ter.)34 b(The)21 b(coun)o(ter)f(for)f(eac)o(h)h=0A=
(runnable)i(pro)q(cess)e(is)h(incremen)o(ted)150 1256 =
y(eac)o(h)d(time)g(the)=0A=
g(sc)o(heduler)h(is)f(called)i(b)o(y)e(an)f(amoun)o(t)g(that)g(is)i(w)o(e=
igh)=0A=
o(ted)f(b)o(y)f(the)h(priorit)o(y)l(,)h(whic)o(h)f(is)150 1320=0A=
y(the)d(k)o(ernel)h(v)o(ersion)g(of)e(the)i(`nice')f(v)m(alue.)22=0A=
b(\(It)14 b(di\013ers)j(in)f(that)e(the)i(priorit)o(y)f(is)h(nev)o(er)f=0A=
(negativ)o(e.\))264 1438 y Fs(/*)21 =
b(this)g(is)g(the)h(scheduler)d(proper:)i=0A=
(*/)438 1551 y(while)g(\(1\))g({)612 1608 y(c)h(=3D)f(-1;)612=0A=
1665 y(next)g(=3D)h(0;)612 1722 y(i)g(=3D)f(NR_TASKS;)612 1778=0A=
y(p)h(=3D)f(&task[NR_TASKS];)612 1835 y(while)g(\(--i\))g({)787=0A=
1892 y(if)g(\(!*--p\))150 2017 y FH(If)15 =
b(there)h(is)f(no)h(pro)q(cess)f=0A=
(in)h(this)g(slot)f(then)g(don't)g(b)q(other)p FB(:)8 b(:)g(:)961=0A=
2135 y Fs(continue;)787 2192 y(if)21 =
b(\(\(*p\)->state)e(=3D=3D)j(TASK_RUNNING)d=0A=
(&&)i(\(*p\)->counter)f(>)h(c\))961 2248 =
y(c)h(=3D)f(\(*p\)->counter,)e(next)i=0A=
(=3D)h(i;)150 2374 y FH(If)14 =
b(the)h(coun)o(ter)f(is)g(higher)h(than)f(an)o(y)=0A=
g(previous)h(coun)o(ter,)f(then)g(mak)o(e)g(the)g(pro)q(cess)h(the)f(next=
)g=0A=
(pro)q(cess,)150 2438 =
y(unless,)i(of)f(course,)g(an)g(ev)o(en)g(higher)h(one)=0A=
g(is)f(encoun)o(tered)h(later)f(in)h(the)g(lo)q(op.)p eop=0A=
%%Page: 88 99=0A=
88 98 bop 150 -84 1800 3 v 150 -100 a FD(3.1.)36 b(The)18 b(co)q(de)1429=0A=
b FH(88)612 88 y Fs(})612 145 y(if)22 b(\(c\))787 202 y(break;)612=0A=
259 y(for\(p)f(=3D)h(&LAST_TASK)d(;)j(p)g(>)f(&FIRST_TASK)f(;)h(--p\))787=0A=
316 y(if)g(\(*p\))961 372 =
y(\(*p\)->counter)e(=3D)j(\(\(*p\)->counter)d(>>)i=0A=
(1\))g(+)1310 429 y(\(*p\)->priority;)150 553 y FH(Here)13=0A=
b(is)f(where)h(the)g(coun)o(ter)f(is)h(set.)18 b(It)13 b(is)g(\014rst)f=0A=
(divided)i(b)o(y)e(2,)h(and)f(then)h(the)f(priorit)o(y)h(is)g(added.)19=0A=
b(Note)150 617 y(that)f(this)g(happ)q(ens)i(only)e(if)h(no)f(pro)q(cess)h=0A=
(has)f(b)q(een)i(found)e(to)g(switc)o(h)g(to,)g(b)q(ecause)i(of)d(the)i=0A=
FE(break;)150 681 y FH(line.)438 798 y Fs(})438 854 y(sti\(\);)438=0A=
911 y(switch_to\(next\);)264 968 y(})150 1092 y FE(sti\(\))14=0A=
b FH(enables)j(in)o(terrupts)e(again,)g(and)g FE(switch)p 1024=0A=
1092 15 2 v 16 w(to\(\))g =
FH(\(de\014ned)h(in)g(lin)o(ux/sc)o(hed.h\))g(sets)=0A=
f(things)g(up)150 1156 y(so)e(that)f(when)i(w)o(e)e(return)h(to)g=0A=
FE(ret)p 747 1156 V 17 w(to)p 812 1156 V 16 w(sys)p 900 1156=0A=
V 17 w(call\(\))p FH(,)f(w)o(e)h(will)i(return)e(from)f FE(ret)p=0A=
1549 1156 V 17 w(to)p 1614 1156 V 17 w(sys)p 1703 1156 V 17=0A=
w(call\(\))g FH(in)o(to)150 1220 y(the)j FC(new)g FH(pro)q(cess.)221=0A=
1308 y(I)g(ha)o(v)o(e)f(truncated)h FE(do)p 614 1308 V 17 w(timer\(\))f=0A=
FH(extremely)l(,)i(only)f(sho)o(wing)g(the)g(pieces)i(that)d(relate)h(sp)=
q=0A=
(eci\014cally)150 1372 y(to)g FE(schedule\(\))p FH(.)20 b(F)l(or)c=0A=
(information)f(on)h(the)g(rest,)f(see)h(the)g(appropriate)g(section.)22=0A=
b(F)l(or)15 b(instance,)i(for)150 1437 y(commen)o(tary)c(on)h(the)g=0A=
FE(itimer)f FH(mec)o(hanism)i(see)f(the)g(section)h(on)f FE(itimers)p=0A=
FH(.)k FD([I)f(supp)q(ose)f(I)f(need)i(to)150 1501 y FC(write)j=0A=
FD(that)i(section)e(no)o(w)p FB(:)8 b(:)g(:)e FD(I)19 =
b(will)j(need)e(to)g=0A=
(put)h(a)f(reference)h(here)g(to)f(that)i(section.])29 b FH(I)150=0A=
1566 y(ha)o(v)o(e)15 =
b(sp)q(eci\014cally)j(left)d(out)g(all)h(the)g(accoun)o=0A=
(ting)f(stu\013,)g(all)h(the)g(timer)f(stu\013,)g(and)h(the)f(\015opp)o(y=
)g=0A=
(timer.)264 1738 y Fs(static)20 b(void)h(do_timer\(struct)e(pt_regs)h(*)i=0A=
(regs\))264 1795 y({)438 1852 y(unsigned)e(long)h(mask;)438=0A=
1909 y(struct)g(timer_struct)e(*tp)i(=3D)h(timer_table+0;)438=0A=
1966 y(struct)f(task_struct)e(**)i(task_p;)438 2079 y(jiffies++;)150=0A=
2203 y FH(Here)h(is)g(where)g FE(jiffies)e FH(is)i(incremen)o(ted.)41=0A=
b(This)22 b(is)g(all-imp)q(ortan)o(t)g(to)f(the)h(rest)f(of)g(the)h(k)o=0A=
(ernel,)150 2267 y(b)q(ecause)16 b(all)g(time)g(calculations)h(\(except)e=0A=
(for)g(timed)g(dela)o(y)h(lo)q(ops\))f(are)g(based)h(on)f(this)g(v)m=0A=
(ariable.)438 2440 y Fs(if)21 b(\(current)f(=3D=3D)i(task[0])e(||)i=0A=
(\(--current->cou)o(nter\))o(<=3D0\))c({)612 2497 =
y(current->counter=3D0;)612=0A=
2554 y(need_resched)i(=3D)h(1;)p eop=0A=
%%Page: 89 100=0A=
89 99 bop 150 -84 1800 3 v 150 -100 a FD(3.1.)42 b(The)18 b(co)q(de)1423=0A=
b FH(89)438 88 y Fs(})264 145 y(})150 327 y FH(Don't)16 =
b(let)h(task)f(0)h=0A=
(run)g(if)g(an)o(ything)g(else)h(can)f(run,)g(b)q(ecause)h(task)e(0)g(do)=
q=0A=
(esn't)h(do)g(an)o(ything.)25 b(If)17 b(task)150 392 =
y(0)g(is)g(running,)i=0A=
(the)e(mac)o(hine)h(is)g(idle,)g(but)g(don't)e(let)i(it)f(b)q(e)h(idle)h(=
if)e=0A=
(an)o(ything)h(else)g(is)f(happ)q(ening,)i(so)150 456 y(run)14=0A=
b(sc)o(hedudule)i(as)d(so)q(on)h(as)f(p)q(ossible.)21 b(Set)14=0A=
b(the)f FE(need)p 1114 456 15 2 v 17 w(resched)g =
FH(\015ag)g(if)h(necessary)g=0A=
(so)f(that)g(sc)o(hedule)150 520 =
y(gets)i(called)h(again)g(as)e(so)q(on)i(as)=0A=
e(p)q(ossible.)p eop=0A=
%%Page: 90 101=0A=
90 100 bop 150 438 a Fv(Chapter)34 b(4)150 686 y Fx(Ho)m(w)39=0A=
b(System)h(Calls)h(W)-10 b(ork)150 940 y FD([This)22 =
b(needs)e(to)h(b)q(e)g=0A=
(a)g(little)h(re-w)o(ork)o(ed)f(and)g(expanded)f(up)q(on,)j(but)e(I)f(am)=
h(w)=0A=
o(aiting)h(to)150 1004 y(see)17 =
b(if)h(the)g(iBCS)g(stu\013)f(mak)o(es)g(an)o=0A=
(y)g(impact)h(on)g(it)g(as)f(I)h(write)g(other)h(stu\013.])221=0A=
1092 y FH(This)c(section)h(co)o(v)o(ers)e(\014rst)g(the)h(mec)o(hanisms)h=0A=
(pro)o(vided)g(b)o(y)f(the)g(386)f(for)g(handling)j(system)d(calls,)150=0A=
1157 y(and)g(then)g(sho)o(ws)f(ho)o(w)g(Lin)o(ux)i(uses)f(those)f(mec)o=0A=
(hanisms.)20 b(This)14 =
b(is)g(not)f(a)h(reference)g(to)f(the)h(individual)150=0A=
1221 y(system)h(calls:)21 b(There)15 =
b(are)g(v)o(ery)g(man)o(y)g(of)g(them,)g=0A=
(new)g(ones)h(are)f(added)h(o)q(ccasionally)l(,)g(and)g(they)f(are)150=0A=
1285 =
y(do)q(cumen)o(ted)h(in)g(man)f(pages)g(that)g(should)h(b)q(e)g(on)f(y)o=0A=
(our)f(Lin)o(ux)j(system.)221 1373 y FD([Ideally)l(,)26 =
b(this)e(c)o(hapter)h=0A=
(should)f(b)q(e)g(part)h(of)e(another)i(section,)i(I)c(think.)43=0A=
b(Ma)o(yb)q(e,)150 1438 y(ho)o(w)o(ev)o(er,)22 =
b(it)g(should)g(just)g(b)q(e)g=0A=
(expanded.)36 b(I)22 =
b(think)g(it)g(b)q(elongs)h(somewhere)e(near)i(the)150=0A=
1502 =
y(c)o(hapter)h(on)f(ho)o(w)f(to)i(write)f(a)h(device)f(driv)o(er,)i(b)q=0A=
(ecause)f(it)g(explains)f(ho)o(w)f(to)i(write)g(a)150 1566=0A=
y(system)16 b(call.])150 1743 y Ft(4.1)70 b(What)23 =
b(Do)r(es)f(the)h(386)h=0A=
(Pro)n(vide?)150 1876 y FH(The)11 =
b(386)f(recognizes)h(t)o(w)o(o)f(ev)o(en)o=0A=
(t)g(classes:)19 b(exceptions)11 b(and)g(in)o(terrupts.)19=0A=
b(Both)10 b(cause)h(a)g(forced)g(con)o(text)150 1941 y(switc)o(h)18=0A=
b(to)g(new)g(a)g(pro)q(cedure)h(or)e(task.)28 b(In)o(terrupts)18=0A=
b(can)g(o)q(ccur)g(at)g(unexp)q(ected)i(times)e(during)h(the)150=0A=
2005 =
y(execution)e(of)f(a)f(program)g(and)h(are)g(used)g(to)f(resp)q(ond)i=0A=
(to)e(signals)i(from)e(hardw)o(are.)22 b(Exceptions)16 b(are)150=0A=
2069 y(caused)g(b)o(y)f(the)g(execution)h(of)f(instructions.)221=0A=
2157 y(Tw)o(o)c(sources)h(of)g(in)o(terrupts)h(are)f(recognized)h(b)o(y)f=0A=
(the)h(386:)k(Mask)m(able)c(in)o(terrupts)g(and)f(Nonmask-)150=0A=
2222 y(able)18 b(in)o(terrupts.)26 b(Tw)o(o)16 =
b(sources)i(of)e(exceptions)j=0A=
(are)e(recognized)h(b)o(y)f(the)h(386:)23 b(Pro)q(cessor)16=0A=
b(detected)150 2286 y(exceptions)g(and)g(programmed)e(exceptions.)221=0A=
2374 =
y(Eac)o(h)c(in)o(terrupt)g(or)g(exception)i(has)e(a)g(n)o(um)o(b)q(er,)h=0A=
(whic)o(h)h(is)e(referred)h(to)f(b)o(y)g(the)g(386)g(literature)h(as)f(th=
e)=0A=
150 2438 y(v)o(ector.)18 b(The)11 =
b(NMI)g(in)o(terrupt)g(and)g(the)g(pro)q=0A=
(cessor)g(detected)h(exceptions)g(ha)o(v)o(e)e(b)q(een)i(assigned)g(v)o=0A=
(ectors)150 2503 y(in)18 =
b(the)g(range)f(0)h(through)f(31,)g(inclusiv)o(e.)30=0A=
b(The)17 =
b(v)o(ectors)g(for)g(mask)m(able)i(in)o(terrupts)e(are)h(determined)=0A=
1027 2678 y(90)p eop=0A=
%%Page: 91 102=0A=
91 101 bop 150 -84 1800 3 v 150 -100 a FD(4.1.)42 b(What)18=0A=
b(Do)q(es)g(the)g(386)f(Pro)o(vide?)969 b FH(91)150 88 y(b)o(y)23=0A=
b(the)f(hardw)o(are.)42 b(External)22 =
b(in)o(terrupt)h(con)o(trollers)g(put)g=0A=
(the)f(v)o(ector)g(on)h(the)f(bus)h(during)h(the)150 153 =
y(in)o(terrupt-ac)o=0A=
(kno)o(wledge)d(cycle.)35 b(An)o(y)20 =
b(v)o(ector)g(in)h(the)f(range)g(32)f=0A=
(through)h(255,)g(inclusiv)o(e,)j(can)d(b)q(e)150 217 =
y(used)e(for)f(mask)m=0A=
(able)h(in)o(terrupts)f(or)g(programmed)g(exceptions.)27 b(See)18=0A=
b(\014gure)g(4.1)e(for)h(a)g(listing)i(of)e(all)150 281 =
y(the)i(p)q(ossible)h=0A=
(in)o(terrupts)f(and)g(exceptions.)31 b FD([Chec)o(k)21 =
b(all)i(this)f(out)g=0A=
(to)g(mak)o(e)e(sure)i(that)h(it)f(is)150 346 y(righ)o(t.])p=0A=
655 409 805 2 v 654 473 2 65 v 794 454 a FH(0)p 841 473 V 50=0A=
w(divide)17 b(error)p 1459 473 V 655 475 805 2 v 654 539 2=0A=
65 v 794 520 a(1)p 841 539 V 50 w(debug)e(exception)p 1459=0A=
539 V 655 541 805 2 v 654 605 2 65 v 794 586 a(2)p 841 605=0A=
V 50 w(NMI)g(in)o(terrupt)p 1459 605 V 655 607 805 2 v 654=0A=
671 2 65 v 794 652 a(3)p 841 671 V 50 w(Breakp)q(oin)o(t)p=0A=
1459 671 V 655 673 805 2 v 654 737 2 65 v 794 718 a(4)p 841=0A=
737 V 50 w(INTO-detected)h(Ov)o(er\015o)o(w)p 1459 737 V 655=0A=
739 805 2 v 654 803 2 65 v 794 784 a(5)p 841 803 V 50 w(BOUND)f(range)g=0A=
(exceeded)p 1459 803 V 655 805 805 2 v 654 869 2 65 v 794 850=0A=
a(6)p 841 869 V 50 w(In)o(v)m(alid)i(op)q(co)q(de)p 1459 869=0A=
V 655 871 805 2 v 654 935 2 65 v 794 916 a(7)p 841 935 V 50=0A=
w(copro)q(cessor)d(not)h(a)o(v)m(ailable)p 1459 935 V 655 937=0A=
805 2 v 654 1001 2 65 v 794 982 a(8)p 841 1001 V 50 w(double)h(fault)p=0A=
1459 1001 V 655 1003 805 2 v 654 1067 2 65 v 794 1048 a(9)p=0A=
841 1067 V 50 w(copro)q(cessor)e(segmen)o(t)h(o)o(v)o(errun)p=0A=
1459 1067 V 655 1069 805 2 v 654 1133 2 65 v 771 1114 a(10)p=0A=
841 1133 V 50 w(in)o(v)m(alid)i(task)e(state)f(segmen)o(t)p=0A=
1459 1133 V 655 1135 805 2 v 654 1199 2 65 v 771 1180 a(11)p=0A=
841 1199 V 50 w(segmen)o(t)g(not)h(presen)o(t)p 1459 1199 V=0A=
655 1201 805 2 v 654 1265 2 65 v 771 1246 a(12)p 841 1265 V=0A=
50 w(stac)o(k)f(fault)p 1459 1265 V 655 1267 805 2 v 654 1331=0A=
2 65 v 771 1312 a(13)p 841 1331 V 50 w(general)h(protection)p=0A=
1459 1331 V 655 1333 805 2 v 654 1397 2 65 v 771 1378 a(14)p=0A=
841 1397 V 50 w(page)g(fault)p 1459 1397 V 655 1399 805 2 v=0A=
654 1463 2 65 v 771 1444 a(15)p 841 1463 V 50 w(reserv)o(ed)p=0A=
1459 1463 V 655 1465 805 2 v 654 1529 2 65 v 771 1510 a(16)p=0A=
841 1529 V 50 w(copro)q(cessor)f(error)p 1459 1529 V 655 1531=0A=
805 2 v 654 1595 2 65 v 703 1576 a(17{31)p 841 1595 V 49 w(reserv)o(ed)p=0A=
1459 1595 V 655 1597 805 2 v 654 1661 2 65 v 680 1642 a(32{255)p=0A=
841 1661 V 49 w(mask)m(able)i(in)o(terrupts)p 1459 1661 V 655=0A=
1663 805 2 v 559 1740 a(Figure)f(4.1:)k(In)o(terrupt)c(and)h(Exception)g=0A=
(Assignmen)o(ts)539 1870 y(HIGHEST)p 773 1890 2 65 v 50 =
w(F)l(aults)g(except)=0A=
f(debug)h(faults)p 773 1954 V 798 1935 a(T)l(rap)f(instructions)i(INTO,)e=0A=
(INT)h(n,)f(INT)g(3)p 773 2018 V 798 1999 a(Debug)h(traps)e(for)h(this)h=0A=
(instruction)p 773 2083 V 798 2063 a(Debug)g(traps)e(for)h(next)g=0A=
(instruction)p 773 2147 V 798 2128 a(NMI)h(in)o(terrupt)550=0A=
2192 y(LO)o(WEST)p 773 2211 V 50 w(INTR)g(in)o(terrupt)433=0A=
2289 =
y(Figure)f(4.2:)k(Priorit)o(y)c(of)g(sim)o(ultaneous)h(in)o(terrupts)g=0A=
(and)f(exceptions)p eop=0A=
%%Page: 92 103=0A=
92 102 bop 150 -84 1800 3 v 150 -100 a FD(4.2.)36 b(Ho)o(w)17=0A=
b(Lin)o(ux)h(Uses)e(In)o(terrupts)j(and)e(Exceptions)648 b=0A=
FH(92)150 88 y Ft(4.2)70 b(Ho)n(w)22 =
b(Lin)n(ux)i(Uses)e(In)n(terrupts)h(and)=0A=
h(Exceptions)150 221 y FH(Under)13 =
b(Lin)o(ux)g(the)f(execution)h(of)f(a)f=0A=
(system)h(call)h(is)g(in)o(v)o(ok)o(ed)f(b)o(y)g(a)g(mask)m(able)g(in)o=0A=
(terrupt)h(or)e FD(exception)150 286 y FH(class)16 =
b(transfer,)f(caused)h(b)o=0A=
(y)g(the)f(instruction)i FE(int)24 b(0x80)p =
FH(.)c(W)l(e)c(use)g(v)o(ector)f=0A=
(0x80)g(to)g(transfer)g(con)o(trol)150 350 y(to)i(the)g(k)o(ernel.)26=0A=
b(This)18 =
b(in)o(terrupt)g(v)o(ector)e(is)i(initialized)i(during)e(system)f=0A=
(startup,)g(along)g(with)g(other)150 414 y(imp)q(ortan)o(t)e(v)o(ectors)f=0A=
(lik)o(e)j(the)e(system)g(clo)q(c)o(k)g(v)o(ector.)221 502=0A=
y(As)g(of)h(v)o(ersion)g(0.99.2)e(of)i(Lin)o(ux,)g(there)g(are)g(116)f=0A=
(system)h(calls.)23 b(Do)q(cumen)o(tation)15 b(for)h(these)g(can)150=0A=
567 y(b)q(e)j(found)h(in)f(the)g(man)g(\(2\))f(pages.)30 b(When)19=0A=
b(a)g(user)g(in)o(v)o(ok)o(es)f(a)h(system)f(call,)j(execution)f(\015o)o(=
w)e=0A=
(is)h(as)150 631 y(follo)o(ws:)218 769 y FG(\017)k =
FH(Eac)o(h)e(call)i(is)f=0A=
(v)o(ectored)g(through)f(a)h(stub)g(in)g(lib)q(c.)42 b(Eac)o(h)21=0A=
b(call)i(within)g(the)f(lib)q(c)i(library)e(is)264 833 y(generally)e(a)f=0A=
FE(syscall)p Fw(X)p FE(\(\))f FH(macro,)h(where)h Fw(X)f =
FH(is)h(the)g(n)o=0A=
(um)o(b)q(er)f(of)g(parameters)g(used)h(b)o(y)f(the)264 897=0A=
y(actual)d(routine.)25 b(Some)16 =
b(system)h(calls)g(are)f(more)h(complex)g=0A=
(then)g(others)f(b)q(ecause)h(of)g(v)m(ariable)264 962 =
y(length)g(argumen)o=0A=
(t)f(lists,)h(but)f(ev)o(en)h(these)g(complex)g(system)f(calls)i(m)o(ust)=
e=0A=
(use)h(the)f(same)g(en)o(try)264 1026 y(p)q(oin)o(t:)j(they)14=0A=
b(just)f(ha)o(v)o(e)g(more)g(parameter)g(setup)h(o)o(v)o(erhead.)19=0A=
b(Examples)14 b(of)f(a)g(complex)h(system)264 1090 y(call)i(include)i=0A=
FE(open\(\))c FH(and)h FE(ioctl\(\))p FH(.)218 1192 y FG(\017)23=0A=
b FH(Eac)o(h)18 b(syscall)h(macro)f(expands)h(to)f(an)g(assem)o(bly)h=0A=
(routine)g(whic)o(h)g(sets)f(up)h(the)g(calling)h(stac)o(k)264=0A=
1256 y(frame)14 b(and)h(calls)p 582 1256 15 2 v 32 w FE(system)p=0A=
743 1256 V 17 w(call\(\))f FH(through)g(an)g(in)o(terrupt,)h(via)g(the)g=0A=
(instruction)g FE(int)24 b($0x80)264 1339 y FH(F)l(or)14 =
b(example,)i(the)f=0A=
(setuid)h(system)f(call)h(is)g(co)q(ded)g(as)p 366 1441 14=0A=
2 v 379 1441 a Fs(syscall1\(int,setuid)o(,uid)p 886 1441 V=0A=
12 w(t,uid\);)264 1543 y FH(Whic)o(h)g(will)g(expand)g(to:)364=0A=
1637 y Fs(_setuid:)407 1694 y(subl)21 b($4,\045exp)407 1751=0A=
y(pushl)g(\045ebx)407 1807 y(movzwl)g(12\(\045esp\),\045eax)407=0A=
1864 y(movl)g(\045eax,4\(\045esp\))407 1921 y(movl)g($23,\045eax)407=0A=
1978 y(movl)g(4\(\045esp\),\045ebx)407 2035 y(int)g($0x80)407=0A=
2091 y(movl)g(\045eax,\045edx)407 2148 y(testl)g(\045edx,\045edx)407=0A=
2205 y(jge)g(L2)407 2262 y(negl)g(\045edx)407 2318 =
y(movl)g(\045edx,_errno)=0A=
407 2375 y(movl)g($-1,\045eax)407 2432 y(popl)g(\045ebx)407=0A=
2489 y(addl)g($4,\045esp)407 2546 y(ret)p eop=0A=
%%Page: 93 104=0A=
93 103 bop 150 -84 1800 3 v 150 -100 a FD(4.3.)42 b(Ho)o(w)17=0A=
b(Lin)o(ux)g(Initializes)j(the)e(system)e(call)j(v)o(ectors)605=0A=
b FH(93)364 88 y Fs(L2:)407 145 y(movl)21 b(\045edx,\045eax)407=0A=
202 y(popl)g(\045ebx)407 259 y(addl)g($4,\045esp)407 316 y(ret)264=0A=
417 y FH(The)63 b(macro)f(de\014nition)j(for)e(the)g FE(syscall)p=0A=
Fw(X)p FE(\(\))e FH(macros)i(can)g(b)q(e)h(found)264 481 y(in)21=0A=
b(/usr/include/lin)o(ux/uni)q(std.h,)i(and)e(the)f(user-space)g(system)g=0A=
(call)h(library)g(co)q(de)g(can)f(b)q(e)264 546 y(found)15=0A=
b(in)h(/usr/src/lib)q(c/syscall/)218 647 y FG(\017)23 b FH(A)o(t)15=0A=
b(this)h(p)q(oin)o(t)g(no)g(system)f(co)q(de)i(for)e(the)g(call)i(has)f(b=
)q=0A=
(een)h(executed.)22 b(Not)15 b(un)o(til)i(the)f(in)o(t)g($0x80)264=0A=
712 y(is)21 b(executed)g(do)q(es)g(the)f(call)h(transfer)f(to)g(the)g(k)o=0A=
(ernel)h(en)o(try)f(p)q(oin)o(t)p 1495 712 15 2 v 38 w FE(system)p=0A=
1656 712 V 17 w(call\(\))p FH(.)34 b(This)264 776 y(en)o(try)16=0A=
b(p)q(oin)o(t)i(is)f(the)g(same)g(for)f(all)i(system)f(calls.)26=0A=
b(It)17 b(is)g(resp)q(onsible)i(for)e(sa)o(ving)g(all)g(registers,)264=0A=
840 =
y(c)o(hec)o(king)d(to)e(mak)o(e)h(sure)g(a)g(v)m(alid)i(system)e(call)h=0A=
(w)o(as)e(in)o(v)o(ok)o(ed)i(and)f(then)h(ultimately)g(transfering)264=0A=
905 y(con)o(trol)21 b(to)g(the)h(actual)g(system)f(call)i(co)q(de)f(via)g=0A=
(the)g(o\013sets)f(in)i(the)p 1529 905 V 39 w FE(sys)p 1618=0A=
905 V 17 w(call)p 1731 905 V 16 w(table)p FH(.)39 b(It)264=0A=
969 y(is)18 b(also)g(resp)q(onsible)i(for)e(calling)p 866 969=0A=
V 37 w FE(ret)p 955 969 V 17 w(from)p 1068 969 V 16 w(sys)p=0A=
1156 969 V 17 w(call\(\))f =
FH(when)i(the)f(system)g(call)h(has)f(b)q(een)264=0A=
1033 y(completed,)d(but)h(b)q(efore)f(returning)h(to)f(user)g(space.)264=0A=
1116 y(Actual)119 b(co)q(de)h(for)e FE(system)p 1044 1116 V=0A=
16 w(call)g FH(en)o(try)h(p)q(oin)o(t)g(can)g(b)q(e)264 1181=0A=
y(found)20 b(in)h(/usr/src/lin)o(ux/k)o(ernel/sys)p 964 1181=0A=
14 2 v 17 =
w(call.S)g(Actual)f(co)q(de)h(for)e(man)o(y)h(of)f(the)h(system)g=0A=
(calls)264 1245 y(can)c(b)q(e)i(found)e(in)i(/usr/src/lin)o(ux/k)o=0A=
(ernel/sys.c,)f(and)g(the)f(rest)g(are)h(found)f(elsewhere.)26=0A=
b FE(find)264 1309 y FH(is)15 b(y)o(our)g(friend.)218 1411=0A=
y FG(\017)23 b FH(After)15 b(the)h(system)g(call)h(has)f(executed,)p=0A=
985 1411 15 2 v 34 w FE(ret)p 1074 1411 V 17 w(from)p 1187=0A=
1411 V 16 w(sys)p 1275 1411 V 17 w(call\(\))f FH(is)i(called.)24=0A=
b(It)16 b(c)o(hec)o(ks)g(to)g(see)264 1475 y(if)f(the)h(sc)o(heduler)g=0A=
(should)g(b)q(e)g(run,)f(and)h(if)f(so,)g(calls)h(it.)218 1577=0A=
y FG(\017)23 b FH(Up)q(on)15 =
b(return)g(from)f(the)h(system)f(call,)i(the)f=0A=
FE(syscall)p Fw(X)p FE(\(\))e =
FH(macro)i(co)q(de)g(c)o(hec)o(ks)g(for)f(a)h=0A=
(negativ)o(e)264 1641 =
y(return)f(v)m(alue,)h(and)f(if)g(there)g(is)h(one,)f=0A=
(puts)g(a)f(p)q(ositiv)o(e)i(cop)o(y)f(of)f(the)h(return)g(v)m(alue)i(in)=
e=0A=
(the)g(global)264 1705 y(v)m(ariable)p 437 1705 V 33 w FE(errno)p=0A=
FH(,)g(so)h(that)g(it)g(can)h(b)q(e)f(accessed)h(b)o(y)f(co)q(de)h(lik)o(=
e)h=0A=
FE(perror\(\))p FH(.)150 1882 y Ft(4.3)70 b(Ho)n(w)22 =
b(Lin)n(ux)i(Initiali)o=0A=
(ze)o(s)c(the)j(system)f(call)f(v)n(ectors)150 2015 y FH(The)11=0A=
b FE(startup)p 410 2015 V 16 w(32\(\))f FH(co)q(de)h(found)g(in)g=0A=
(/usr/src/lin)o(ux/b)q(o)q(ot/head.S)g(starts)e(ev)o(erything)i(o\013)g(b=
)o=0A=
(y)f(calling)150 2080 y FE(setup)p 273 2080 V 16 w(idt\(\))p=0A=
FH(.)25 b(This)17 b(routine)h(sets)f(up)g(an)g(IDT)g(\(In)o(terrupt)f=0A=
(Descriptor)h(T)l(able\))h(with)f(256)f(en)o(tries.)150 2144=0A=
y(No)j(in)o(terrupt)h(en)o(try)f(p)q(oin)o(ts)h(are)f(actually)h(loaded)g=
(b)o=0A=
(y)g(this)g(routine,)g(as)f(that)g(is)h(done)g(only)g(after)150=0A=
2208 =
y(paging)c(has)h(b)q(een)g(enabled)g(and)g(the)f(k)o(ernel)h(has)f(b)q=0A=
(een)h(mo)o(v)o(ed)f(to)g(0xC0000000.)k(An)d(IDT)f(has)g(256)150=0A=
2273 =
y(en)o(tries,)f(eac)o(h)g(4)g(b)o(ytes)g(long,)g(for)g(a)g(total)f(of)h=0A=
(1024)f(b)o(ytes.)221 2361 y(When)32 b FE(start)p 493 2361=0A=
V 16 w(kernel\(\))f =
FH(\(found)g(in)i(/usr/src/lin)o(ux/init/main.c\))g(is)f=0A=
(called)h(it)f(in)o(v)o(ok)o(es)150 2425 y FE(trap)p 249 2425=0A=
V 17 w(init\(\))17 b FH(\(found)i(in)g(/usr/src/lin)o(ux/k)o=0A=
(ernel/traps.c\).)29 b FE(trap)p 1370 2425 V 17 w(init\(\))18=0A=
b FH(sets)g(up)h(the)f(IDT)h(via)150 2489 y(the)11 b(macro)f=0A=
FE(set)p 431 2489 V 17 w(trap)p 544 2489 V 17 w(gate\(\))g=0A=
FH(\(found)h(in)h(/usr/include/asm/system.h\).)18 b FE(trap)p=0A=
1595 2489 V 17 w(init\(\))10 b FH(initializes)150 2554 y(the)15=0A=
b(in)o(terrupt)h(descriptor)f(table)h(as)f(sho)o(wn)g(in)h(\014gure)f(4.3=
.)p=0A=
eop=0A=
%%Page: 94 105=0A=
94 104 bop 150 -84 1800 3 v 150 -100 a FD(4.4.)42 b(Ho)o(w)17=0A=
b(to)h(Add)g(Y)l(our)g(Own)f(System)g(Calls)786 b FH(94)p 666=0A=
44 784 2 v 665 109 2 65 v 781 89 a(0)p 828 109 V 50 w(divide)p=0A=
975 89 14 2 v 18 w(error)p 1449 109 2 65 v 666 110 784 2 v=0A=
665 175 2 65 v 781 155 a(1)p 828 175 V 50 w(debug)p 1449 175=0A=
V 666 176 784 2 v 665 241 2 65 v 781 221 a(2)p 828 241 V 50=0A=
w(nmi)p 1449 241 V 666 242 784 2 v 665 307 2 65 v 781 288 a(3)p=0A=
828 307 V 50 w(in)o(t3)p 1449 307 V 666 308 784 2 v 665 373=0A=
2 65 v 781 354 a(4)p 828 373 V 50 w(o)o(v)o(er\015o)o(w)p 1449=0A=
373 V 666 374 784 2 v 665 439 2 65 v 781 420 a(5)p 828 439=0A=
V 50 w(b)q(ounds)p 1449 439 V 666 441 784 2 v 665 505 2 65=0A=
v 781 486 a(6)p 828 505 V 50 w(in)o(v)m(alid)p 986 486 14 2=0A=
v 19 w(op)p 1449 505 2 65 v 666 507 784 2 v 665 571 2 65 v=0A=
781 552 a(7)p 828 571 V 50 w(device)p 978 552 14 2 v 18 w(not)p=0A=
1062 552 V 16 w(a)o(v)m(ailable)p 1449 571 2 65 v 666 573 784=0A=
2 v 665 637 2 65 v 781 618 a(8)p 828 637 V 50 w(double)p 987=0A=
618 14 2 v 18 w(fault)p 1449 637 2 65 v 666 639 784 2 v 665=0A=
703 2 65 v 781 684 a(9)p 828 703 V 50 w(copro)q(cessor)p 1084=0A=
684 14 2 v 16 w(segmen)o(t)p 1261 684 V 16 w(o)o(v)o(errun)p=0A=
1449 703 2 65 v 666 705 784 2 v 665 769 2 65 v 759 750 a(10)p=0A=
828 769 V 49 w(in)o(v)m(alid)p 986 750 14 2 v 19 w(TSS)p 1449=0A=
769 2 65 v 666 771 784 2 v 665 835 2 65 v 759 816 a(11)p 828=0A=
835 V 49 w(segmen)o(t)p 1018 816 14 2 v 16 w(not)p 1100 816=0A=
V 16 w(presen)o(t)p 1449 835 2 65 v 666 837 784 2 v 665 901=0A=
2 65 v 759 882 a(12)p 828 901 V 49 w(stac)o(k)p 959 882 14=0A=
2 v 16 w(segmen)o(t)p 1449 901 2 65 v 666 903 784 2 v 665 967=0A=
2 65 v 759 948 a(13)p 828 967 V 49 w(general)p 998 948 14 2=0A=
v 17 w(protection)p 1449 967 2 65 v 666 969 784 2 v 665 1033=0A=
2 65 v 759 1014 a(14)p 828 1033 V 49 w(page)p 948 1014 14 2=0A=
v 16 w(fault)p 1449 1033 2 65 v 666 1035 784 2 v 665 1099 2=0A=
65 v 759 1080 a(15)p 828 1099 V 49 w(reserv)o(ed)p 1449 1099=0A=
V 666 1101 784 2 v 665 1165 2 65 v 759 1146 a(16)p 828 1165=0A=
V 49 w(copro)q(cessor)p 1084 1146 14 2 v 16 w(error)p 1449=0A=
1165 2 65 v 666 1167 784 2 v 665 1231 2 65 v 759 1212 a(17)p=0A=
828 1231 V 49 w(alignmen)o(t)p 1052 1212 14 2 v 17 w(c)o(hec)o(k)p=0A=
1449 1231 2 65 v 666 1233 784 2 v 665 1297 2 65 v 691 1278=0A=
a(18{48)p 828 1297 V 48 w(reserv)o(ed)p 1449 1297 V 666 1299=0A=
784 2 v 674 1376 a(Figure)16 =
b(4.3:)j(Initialization)f(of)c(in)o(terrupts)150=0A=
1514 y(A)o(t)19 =
b(this)h(p)q(oin)o(t)g(the)g(in)o(terrupt)g(v)o(ector)f(for)g=0A=
(the)h(system)f(calls)i(is)f(not)g(set)f(up.)34 b(It)20 =
b(is)g(initialized)j=0A=
(b)o(y)150 1578 y FE(sched)p 273 1578 15 2 v 16 w(init\(\))10=0A=
b FH(\(found)g(in)h(/usr/src/lin)o(ux/k)o(ernel/sc)o(hed.c\).)19=0A=
b(A)10 b(call)i(to)d FE(set)p 1513 1578 V 17 w(system)p 1674=0A=
1578 V 17 w(gate)23 b(\(0x80,)150 1642 y(&system)p 321 1642=0A=
V 16 w(call\))15 b FH(sets)g(in)o(terrupt)g(0x80)f(to)h(b)q(e)h(a)f(v)o=0A=
(ector)f(to)h(the)g FE(system)p 1431 1642 V 16 w(call\(\))g=0A=
FH(en)o(try)f(p)q(oin)o(t.)150 1819 y Ft(4.4)70 b(Ho)n(w)22=0A=
b(to)h(Add)h(Y)-6 b(our)24 b(Own)e(System)g(Calls)206 1947=0A=
y FH(1.)g(Create)14 b(a)h(directory)h(under)f(the)h(/usr/src/lin)o(ux/)f=0A=
(directory)h(to)e(hold)i(y)o(our)f(co)q(de.)206 2049 y(2.)22=0A=
b(Put)15 b(an)o(y)g(include)i(\014les)f(in)g(/usr/include/sys/)h(and)e=0A=
(/usr/include/lin)o(ux/.)206 2151 y(3.)22 =
b(Add)f(the)g(relo)q(catable)h(mo)q=0A=
(dule)g(pro)q(duced)h(b)o(y)d(the)i(link)g(of)f(y)o(our)f(new)h(k)o(ernel=
)h=0A=
(co)q(de)g(to)e(the)264 2215 y FE(ARCHIVES)d =
FH(and)i(the)g(sub)q(directory)g=0A=
(to)g(the)f FE(SUBDIRS)g FH(lines)i(of)f(the)f(top)h(lev)o(el)h(Mak)o=0A=
(e\014le.)30 b(See)264 2280 y(fs/Mak)o(e\014le,)14 =
b(target)g(fs.o)h(for)f=0A=
(an)h(example.)206 2381 y(4.)22 b(Add)12 b(a)f FE(#define)p=0A=
588 2381 V 605 2381 V 57 w(NR)p 670 2381 V 17 w Fw(xx)h =
FH(to)f(unistd.h)h=0A=
(to)f(assign)h(a)f(call)i(n)o(um)o(b)q(er)f(for)e(y)o(our)i(system)f(call=
,)i=0A=
(where)264 2446 y Fw(xx)p =
FH(,)h(the)g(index,)h(is)g(something)g(descriptiv)o=0A=
(e)h(relating)e(to)g(y)o(our)g(system)g(call.)20 b(It)15 b(will)h(b)q(e)f=0A=
(used)g(to)264 2510 y(set)g(up)g(the)h(v)o(ector)e(through)h=0A=
FE(sys)p 862 2510 V 17 w(call)p 975 2510 V 16 w(table)g =
FH(to)f(in)o(v)o(ok)o=0A=
(e)h(y)o(ou)g(co)q(de.)p eop=0A=
%%Page: 95 106=0A=
95 105 bop 150 -84 1800 3 v 150 -100 a FD(4.4.)42 b(Ho)o(w)17=0A=
b(to)h(Add)g(Y)l(our)g(Own)f(System)g(Calls)786 b FH(95)206=0A=
88 y(5.)22 b(Add)c(an)g(en)o(try)g(p)q(oin)o(t)h(for)e(y)o(our)h(system)g=0A=
(call)h(to)e(the)i FE(sys)p 1310 88 15 2 v 16 w(call)p 1422=0A=
88 V 17 w(table)e FH(in)i(sys.h.)29 b(It)18 b(should)264 153=0A=
y(matc)o(h)9 b(the)i(index)g(\()p Fw(xx)p =
FH(\))f(that)f(y)o(ou)h(assigned)h=0A=
(in)g(the)g(previous)g(step.)18 b(The)11 b FE(NR)p 1580 153=0A=
V 16 w(syscalls)f FH(v)m(ariable)264 217 y(will)16 =
b(b)q(e)g(recalculated)h=0A=
(automatically)l(.)206 319 y(6.)22 b(Mo)q(dify)16 =
b(an)o(y)f(k)o(ernel)h(co)q=0A=
(de)h(in)f(k)o(ernel/fs/mm/,)f(etc.)g(to)g(tak)o(e)g(in)o(to)h(accoun)o(t=
)f=0A=
(the)h(en)o(vironmen)o(t)264 383 =
y(needed)g(to)f(supp)q(ort)g(y)o(our)g(new)g=0A=
(co)q(de.)206 485 y(7.)22 b(Run)15 =
b(mak)o(e)e(from)g(the)h(top)g(lev)o(el)h=0A=
(to)f(pro)q(duce)g(the)h(new)f(k)o(ernel)g(incorp)q(orating)h(y)o(our)f(n=
ew)g=0A=
(co)q(de.)150 623 y(A)o(t)20 =
b(this)h(p)q(oin)o(t,)h(y)o(ou)e(will)j(ha)o(v)o=0A=
(e)d(to)g(either)h(add)g(a)f(syscall)i(to)e(y)o(our)g(libraries,)j(or)d(u=
se)h=0A=
(the)g(prop)q(er)p 150 687 V 164 687 a FE(syscall)p Fw(n)p=0A=
FE(\(\))14 b FH(macro)g(in)h(y)o(our)g(user)f(program)g(for)g(y)o(our)g=0A=
(programs)f(to)i(access)f(the)h(new)g(system)f(call.)221 775=0A=
y(The)g =
FC(386D)o(X)h(Micr)n(opr)n(o)n(c)n(essor)f(Pr)n(o)n(gr)n(ammer's)g(R)=0A=
n(efer)n(enc)n(e)g(Manual)f =
FH(is)h(a)g(helpful)i(reference,)e(as)f(is)150=0A=
839 y(James)h(T)l(urley's)h FC(A)n(dvanc)n(e)n(d)f(80386)i(Pr)n(o)n(gr)n=0A=
(amming)f(T)m(e)n(chniques.)k FH(See)14 =
b(the)g(Annotated)g(bibliograph)o(y)=0A=
150 903 y(in)i(App)q(endix)h(A.)p eop=0A=
%%Page: 96 107=0A=
96 106 bop 150 438 a Fv(Chapter)34 b(5)150 686 y Fx(Lin)m(ux)40=0A=
b(Memory)g(Managemen)m(t)150 940 y FD([This)18 =
b(c)o(hapter)g(needs)f(to)g(b)=0A=
q(e)g(made)g(m)o(uc)o(h)f(friendlier.)26 b(I'd)18 =
b(hate)f(to)h(remo)o(v)o(e)=0A=
d(detail,)20 b(but)150 1004 y(it)15 b(needs)f(to)h(b)q(e)g(less)f(daun)o=0A=
(ting.)24 b(Man)o(y)14 b(ha)o(v)o(e)f(told)j(me)e(that)h(this)g(is)g(a)g=0A=
(daun)o(ting)g(c)o(hapter,)150 1069 y(and)h(it)g(need)f(not)g(b)q(e.)24=0A=
b(I'll)16 b(re-w)o(ork)g(it)g(later.)24 b(In)15 b(the)h(mean)o(time,)g=0A=
(please)f(b)q(ear)i(with)e(me.])150 1246 y Ft(5.1)70 b(Ov)n(erview)150=0A=
1379 y FH(The)22 b(Lin)o(ux)i(memory)d(manager)h(implemen)o(ts)h(demand)g=0A=
(paging)f(with)h(a)f(cop)o(y-on-write)g(strategy)150 1443 =
y(relying)f(on)f=0A=
(the)h(386's)d(paging)j(supp)q(ort.)35 b(A)20 =
b(pro)q(cess)g(acquires)h(its)f=0A=
(page)g(tables)h(from)e(its)h(paren)o(t)150 1508 y(\(during)d(a)g=0A=
FE(fork\(\))p =
FH(\))e(with)j(the)e(en)o(tries)i(mark)o(ed)e(as)g(read-only)i=0A=
(or)e(sw)o(app)q(ed.)25 b(Then,)18 b(if)f(the)g(pro)q(cess)150=0A=
1572 =
y(tries)d(to)g(write)g(to)g(that)f(memory)h(space,)g(and)h(the)f(page)g=0A=
(is)h(a)f(cop)o(y-on-write)g(page,)g(it)h(is)g(copied,)g(and)150=0A=
1636 y(the)f(page)f(is)h(mark)o(ed)f(read-write.)20 b(An)14=0A=
b FE(exec\(\))e =
FH(results)i(in)h(the)e(reading)i(in)f(of)f(a)g(page)h(or)f=0A=
(so)g(from)g(the)150 1701 y(executable.)21 b(The)16 b(pro)q(cess)f(then)h=0A=
(faults)f(in)h(an)o(y)f(other)g(pages)g(it)g(needs.)221 1788=0A=
y(Eac)o(h)10 =
b(pro)q(cess)i(has)f(a)f(page)h(directory)g(whic)o(h)h(means)f=0A=
(it)g(can)h(access)f(1)f(KB)i(of)f(page)f(tables)i(p)q(oin)o(ting)150=0A=
1853 y(to)k(1)g(MB)g(of)g(4)g(KB)h(pages)f(whic)o(h)h(is)g(4)f(GB)g(of)g=0A=
(memory)l(.)23 b(A)17 =
b(pro)q(cess')f(page)g(directory)h(is)g(initialized)150=0A=
1917 y(during)i(a)e(fork)g(b)o(y)h FE(copy)p 598 1917 15 2=0A=
v 17 w(page)p 711 1917 V 16 w(tables\(\))p FH(.)27 b(The)18=0A=
b(idle)h(pro)q(cess)f(has)g(its)g(page)g(directory)g(initialized)150=0A=
1982 y(during)e(the)f(initialization)k(sequence.)221 2069 =
y(Eac)o(h)d(user)h=0A=
(pro)q(cess)g(has)g(a)f(lo)q(cal)i(descriptor)f(table)g(that)g(con)o(tain=
s)f=0A=
(a)h(co)q(de)g(segmen)o(t)g(and)f(data-)150 2134 =
y(stac)o(k)h(segmen)o(t.)27=0A=
b(These)18 b(user)g(segmen)o(ts)f(extend)h(from)f(0)h(to)f(3)g(GB)h=0A=
(\(0xc0000000\).)24 b(In)19 b(user)f(space)150 2198 =
y(linear)e(addresses)461=0A=
2182 y Fm(1)496 2198 y FH(and)g(logical)g(addresses)911 2182=0A=
y Fm(2)946 2198 y FH(are)f(iden)o(tical.)p 150 2238 720 2 v=0A=
207 2265 a FA(1)225 2280 y Fl(In)23 =
b(th)q(e)h(80)r(3)r(8)r(6)s(,)g(lin)s(e)r=0A=
(a)r(r)g(ad)r(d)s(r)q(e)r(s)r(s)g(ru)q(n)h(fro)r(m)h(0G)r(B)g(to)c(4G)s(B=
)s=0A=
(.)h(A)f(li)q(n)s(e)r(a)r(r)i(ad)r(d)r(r)r(e)r(s)r(s)g(p)q(o)r(i)r(n)q(t)=
r(s)=0A=
f(to)g(a)f(pa)r(r)q(t)r(i)r(c)r(u)r(l)r(a)s(r)150 2332 =
y(m)q(e)r(m)s(o)r(r)r=0A=
(y)i(lo)r(c)r(a)r(t)r(i)r(o)r(n)g(wi)q(t)r(h)s(i)r(n)f(th)r(i)r(s)f(sp)r(=
a)r=0A=
(c)r(e)r(.)35 b(A)21 b(li)q(n)s(e)r(a)r(r)i(ad)r(d)r(r)r(e)r(s)r(s)g(is)e=0A=
Fh(not)d =
Fl(a)j(ph)q(y)r(s)r(i)r(c)r(a)r(l)i(ad)r(d)s(r)r(e)r(s)r(s)f(|)h(it)=0A=
f(is)f(a)g(vi)q(r)r(t)q(u)s(a)r(l)150 2385 =
y(ad)r(d)s(r)q(e)r(s)r(s)r(.)207=0A=
2417 y FA(2)225 2432 y =
Fl(A)c(lo)q(g)s(i)q(c)r(a)s(l)i(ad)r(d)s(r)q(e)r(s)r=0A=
(s)g(co)r(n)r(s)r(i)r(s)r(t)q(s)g(of)f(a)f(se)q(l)q(e)r(c)r(t)r(o)r(r)i(a=
n)r=0A=
(d)h(an)g(o\013)r(s)r(e)r(t)q(.)k(Th)s(e)19 =
b(se)q(l)r(e)r(c)r(t)q(o)r(r)g(p)=0A=
q(o)s(i)q(n)r(t)r(s)g(to)f(a)f(seg)s(m)s(e)r(n)r(t)i(an)r(d)h(th)q(e)150=0A=
2484 =
y(o\013)r(s)r(e)r(t)e(te)q(l)r(l)r(s)g(ho)q(w)i(far)f(int)r(o)g(th)q(a)s=0A=
(t)f(se)q(g)r(m)t(e)r(n)q(t)h(th)q(e)g(ad)r(d)s(r)q(e)r(s)r(s)g(is)e(lo)s=
(c)q=0A=
(a)s(t)q(e)r(d)s(.)1027 2678 y FH(96)p eop=0A=
%%Page: 97 108=0A=
97 107 bop 150 -84 1800 3 v 150 -100 a FD(5.1.)42 b(Ov)o(erview)1418=0A=
b FH(97)221 88 y(The)11 =
b(k)o(ernel)h(co)q(de)g(and)g(data)f(segmen)o(ts)g=0A=
(are)g(priv)o(eleged)i(segmen)o(ts)e(de\014ned)i(in)f(the)f(global)i=0A=
(descrip-)150 153 y(tor)i(table)g(and)h(extend)g(from)f(3)g(GB)g(to)g(4)g=0A=
(GB.)g(The)h(sw)o(app)q(er)f(page)g(directory)h(\()p FE(swapper)p=0A=
1753 153 15 2 v 16 w(page)p 1865 153 V 16 w(dir)150 217 y =
FH(is)g(set)f(up)g=0A=
(so)g(that)g(logical)h(addresses)f(and)h(ph)o(ysical)g(addresses)g(are)f=0A=
(iden)o(tical)i(in)f(k)o(ernel)g(space.)221 305 =
y(The)h(space)g(ab)q(o)o(v)o=0A=
(e)f(3)h(GB)f(app)q(ears)h(in)h(a)e(pro)q(cess')h(page)g(directory)g(as)f=
(p)q=0A=
(oin)o(ters)h(to)g(k)o(ernel)g(page)150 369 y(tables.)i(This)13=0A=
b(space)f(is)g(in)o(visible)j(to)c(the)h(pro)q(cess)g(in)h(user)f(mo)q(de=
)g=0A=
(but)g(the)g(mapping)h(b)q(ecomes)f(relev)m(an)o(t)150 434=0A=
y(when)k(privileged)h(mo)q(de)f(is)f(en)o(tered,)g(for)g(example,)h(to)e=0A=
(handle)j(a)e(system)f(call.)221 522 =
y(Sup)q(ervisor)j(mo)q(de)f(is)h(en)o=0A=
(tered)f(within)i(the)e(con)o(text)g(of)g(the)g(curren)o(t)g(pro)q(cess)g=
(so)=0A=
g(address)g(trans-)150 586 =
y(lation)f(o)q(ccurs)f(with)h(resp)q(ect)f(to)g=0A=
(the)g(pro)q(cess')g(page)g(directory)g(but)g(using)h(k)o(ernel)g(segmen)=
o=0A=
(ts.)k(This)14 b(is)150 650 =
y(iden)o(tically)g(the)e(mapping)g(pro)q(duced)h=0A=
(b)o(y)e(using)i(the)e FE(swapper)p 1239 650 V 16 w(pg)p 1303=0A=
650 V 17 w(dir)g FH(and)h(k)o(ernel)h(segmen)o(ts)e(as)g(b)q(oth)150=0A=
715 y(page)i(directories)i(use)f(the)f(same)h(page)f(tables)h(in)g(this)g=0A=
(space.)20 b(Only)14 b FE(task[0])f FH(\(the)g(idle)i(task)1802=0A=
698 y Fm(3)1835 715 y FD([This)150 779 =
y(should)j(b)q(e)g(do)q(cumen)o(ted)f=0A=
(earlier)j(in)e(this)g(guide)p FB(:)8 b(:)g(:)f FD(])p FH(\))15=0A=
b(uses)g(the)h FE(swapper)p 1585 779 V 16 w(pg)p 1649 779 V=0A=
17 w(dir)e FH(directly)l(.)218 904 y FG(\017)23 b FH(The)15=0A=
b(user)g(pro)q(cess')g FE(segment)p 795 904 V 17 w(base)f =
FH(=3D)i(0x00,)e=0A=
FE(page)p 1189 904 V 16 w(dir)h =
FH(priv)m(ate)h(to)f(the)g(pro)q(cess.)218=0A=
1006 y FG(\017)23 b FH(user)15 =
b(pro)q(cess)h(mak)o(es)f(a)g(system)h(call:)=0A=
21 b FE(segment)p 1118 1006 V 17 w(base)p FH(=3D0xc0000000)13=0A=
b FE(page)p 1603 1006 V 17 w(dir)i FH(=3D)h(same)f(user)264 1070=0A=
y FE(page)p 363 1070 V 16 w(dir)p FH(.)218 1172 y FG(\017)23=0A=
b FE(swapper)p 435 1172 V 16 w(pg)p 499 1172 V 17 w(dir)k =
FH(con)o(tains)h(a)=0A=
g(mapping)g(for)g(all)h(ph)o(ysical)g(pages)f(from)f(0xc0000000)f(to)264=0A=
1236 y(0xc0000000)15 b(+)i FE(end)p 634 1236 V 17 w(mem)p =
FH(,)g(so)g(the)g=0A=
(\014rst)g(768)f(en)o(tries)i(in)g FE(swapper)p 1443 1236 V=0A=
16 w(pg)p 1507 1236 V 17 w(dir)f FH(are)g(0's,)f(and)i(then)264=0A=
1301 =
y(there)d(are)g(4)g(or)f(more)h(that)g(p)q(oin)o(t)g(to)g(k)o(ernel)h=0A=
(page)f(tables.)218 1402 y FG(\017)23 b FH(The)15 b(user)g(page)g=0A=
(directories)i(ha)o(v)o(e)d(the)i(same)f(en)o(tries)g(as)g(tt)f(sw)o(app)=
q=0A=
(er)p 1493 1402 14 2 v 17 w(pg)p 1558 1402 V 16 w(dir)i(ab)q(o)o(v)o(e)f=0A=
(768.)k(The)264 1467 y(\014rst)14 b(768)h(en)o(tries)g(map)g(the)h(user)f=0A=
(space.)150 1592 =
y(The)k(upshot)g(is)g(that)g(whenev)o(er)g(the)g(linear)h=0A=
(address)f(is)g(ab)q(o)o(v)o(e)g(0xc0000000)d(ev)o(erything)k(uses)f(the)=
150=0A=
1656 y(same)c(k)o(ernel)h(page)f(tables.)221 1744 =
y(The)j(user)h(stac)o(k)e=0A=
(sits)h(at)g(the)g(top)g(of)g(the)g(user)h(data)f(segmen)o(t)f(and)i(gro)=
o=0A=
(ws)e(do)o(wn.)29 b(The)18 b(k)o(ernel)150 1809 y(stac)o(k)11=0A=
b(is)i(not)e(a)h(prett)o(y)f(data)h(structure)g(or)f(segmen)o(t)h(that)f(=
I)h=0A=
(can)g(p)q(oin)o(t)h(to)e(with)i(a)e(\\y)o(on)h(lies)h(the)f(k)o(ernel)15=
0=0A=
1873 y(stac)o(k.")19 b(A)14 b FE(kernel)p 502 1873 15 2 v 17=0A=
w(stack)p 639 1873 V 16 w(frame)g FH(\(a)g(page\))h(is)g(asso)q(ciated)g=0A=
(with)g(eac)o(h)g(newly)g(created)g(pro)q(cess)g(and)150 1937=0A=
y(is)h(used)g(whenev)o(er)f(the)h(k)o(ernel)g(op)q(erates)f(within)h(the)=
f=0A=
(con)o(text)g(of)g(that)f(pro)q(cess.)21 b(Bad)15 b(things)h(w)o(ould)150=0A=
2002 y(happ)q(en)21 =
b(if)f(the)g(k)o(ernel)g(stac)o(k)f(w)o(ere)g(to)g(gro)o=0A=
(w)g(b)q(elo)o(w)h(its)g(curren)o(t)f(stac)o(k)g(frame.)32=0A=
b FD([Where)24 b(is)f(the)150 2066 y(k)o(ernel)e(stac)o(k)f(put?)33=0A=
b(I)21 =
b(kno)o(w)e(that)j(there)f(is)g(one)g(for)g(ev)o(ery)f(pro)q(cess,)i=0A=
(but)g(where)e(is)h(it)150 2130 y(stored)d(when)f(it's)i(not)f(b)q(eing)g=0A=
(used?])221 2218 y =
FH(User)c(pages)f(can)i(b)q(e)f(stolen)h(or)e(sw)o(app)q=0A=
(ed.)20 b(A)14 =
b(user)g(page)g(is)h(one)f(that)f(is)i(mapp)q(ed)g(b)q(elo)o=0A=
(w)g(3)e(GB)h(in)150 2283 y(a)h(user)g(page)g(table.)20 =
b(This)c(region)f(do)=0A=
q(es)h(not)f(con)o(tain)g(page)g(directories)h(or)e(page)h(tables.)21=0A=
b(Only)16 b(dirt)o(y)150 2347 y(pages)f(are)g(sw)o(app)q(ed.)p=0A=
150 2386 720 2 v 207 2414 a FA(3)225 2429 y =
Fl(So)r(m)s(e)r(t)r(i)r(m)s(e)r=0A=
(s)h(ca)q(l)r(l)r(e)r(d)h(th)q(e)f(sw)q(a)r(p)r(p)t(e)r(r)g(ta)q(s)r(k)r(=
,)g=0A=
(eve)r(n)h(th)q(o)r(u)s(g)r(h)g(it)d(ha)r(s)i(no)r(t)r(h)r(i)r(n)s(g)g(to=
)f=0A=
(do)h(wi)r(t)q(h)h(sw)q(a)r(p)s(p)r(i)r(n)s(g)f(in)g(th)q(e)g(Li)q(n)r(u)=
s(x)=0A=
150 2481 =
y(im)r(p)s(l)r(e)r(m)s(e)r(n)r(t)r(a)r(t)r(i)q(o)s(n)r(,)i(for)h(hi)=0A=
r(s)q(t)r(o)r(r)r(i)r(c)r(a)r(l)g(rea)s(s)r(o)r(n)s(s)p eop=0A=
%%Page: 98 109=0A=
98 108 bop 150 -84 1800 3 v 150 -100 a FD(5.2.)42 b(Ph)o(ysical)18=0A=
b(memory)1239 b FH(98)221 88 y(Minor)16 =
b(alterations)g(are)g(needed)h(in)g=0A=
(some)f(places)h(\(tests)e(for)g(pro)q(cess)i(memory)e(limits)j(comes)e(t=
o)=0A=
150 153 y(mind\))g(to)e(pro)o(vide)i(supp)q(ort)f(for)g(programmer)f=0A=
(de\014ned)j(segmen)o(ts.)150 330 y Ft(5.2)70 b(Ph)n(ysical)21=0A=
b(memory)150 463 y FH(Here)16 =
b(is)g(a)g(map)f(of)g(ph)o(ysical)i(memory)e(b)=0A=
q(efore)h(an)o(y)g(user)g(pro)q(cesses)g(are)f(executed.)22=0A=
b(The)16 b(column)h(on)150 527 y(the)h(left)h(giv)o(es)f(the)g=0A=
FD(starting)i FH(address)e(of)g(the)g(item,)h(n)o(um)o(b)q(ers)f(in)h=0A=
FC(italics)f FH(are)g(appro)o(ximate.)28 b(The)150 591 y(column)19=0A=
b(in)g(the)f(middle)i(names)e(the)g(item\(s\).)28 b(The)18=0A=
b(column)h(on)f(the)h(far)e(righ)o(t)h(giv)o(es)g(the)g(relev)m(an)o(t)15=
0=0A=
656 =
y(routine)e(or)e(v)m(ariable)j(name)e(or)g(explains)i(the)e(en)o(try)l(.)=0A=
p 150 694 1769 2 v 149 758 2 65 v 186 739 a FC(0x110000)p 393=0A=
758 V 251 w FH(FREE)p 968 758 V 250 w FE(memory)p 1141 739=0A=
15 2 v 16 w(end)g FH(or)g FE(high)p 1396 739 V 16 w(memory)p=0A=
1918 758 2 65 v 150 760 1769 2 v 149 824 2 65 v 393 824 V 601=0A=
805 a(mem)p 676 805 15 2 v 17 w(map)p 968 824 2 65 v 232 w(mem)p=0A=
1069 805 15 2 v 17 w(init\(\))p 1918 824 2 65 v 150 826 1769=0A=
2 v 149 890 2 65 v 393 890 V 554 871 a(inode)p 677 871 15 2=0A=
v 16 w(table)p 968 890 2 65 v 184 w(inode)p 1117 871 15 2 v=0A=
16 w(init\(\))p 1918 890 2 65 v 150 892 1769 2 v 149 956 2=0A=
65 v 393 956 V 569 937 a FH(device)h(data)p 968 956 V 199 w=0A=
FE(device)p 1141 937 15 2 v 16 w(init\(\))p FG(y)p 1918 956=0A=
2 65 v 150 958 1769 2 v 149 1022 2 65 v 186 1003 a FH(0x100000)p=0A=
393 1022 V 153 w(more)e FE(pg)p 688 1003 15 2 v 17 w(table)p=0A=
FH(s)p 968 1022 2 65 v 154 w FE(paging)p 1141 1003 15 2 v 16=0A=
w(init\(\))p 1918 1022 2 65 v 150 1024 1769 2 v 149 1088 2=0A=
65 v 175 1069 a FH(0x0A0000)p 393 1088 V 186 w(RESER)-5 b(VED)p=0A=
968 1088 V 1918 1088 V 150 1090 1769 2 v 149 1154 2 65 v 186=0A=
1135 a FC(0x060000)p 393 1154 V 251 w FH(FREE)p 968 1154 V=0A=
1918 1154 V 150 1156 1769 2 v 149 1220 2 65 v 393 1220 V 497=0A=
1201 a FE(low)p 572 1201 15 2 v 17 w(memory)p 733 1201 V 17=0A=
w(start)p 968 1220 2 65 v 1918 1220 V 150 1222 1769 2 v 149=0A=
1286 2 65 v 186 1267 a FH(0x006000)p 393 1286 V 122 w(k)o(ernel)16=0A=
b(co)q(de)g(+)f(data)p 968 1286 V 1918 1286 V 150 1288 1769=0A=
2 v 149 1353 2 65 v 393 1353 V 462 1333 a FE(floppy)p 609 1333=0A=
15 2 v 16 w(track)p 745 1333 V 17 w(buffer)p 968 1353 2 65=0A=
v 1918 1353 V 150 1354 1769 2 v 149 1483 2 129 v 393 1483 V=0A=
545 1399 a(bad)p 620 1399 15 2 v 17 w(pg)p 685 1399 V 17 w(table)590=0A=
1464 y(bad)p 665 1464 V 16 w(page)p 968 1483 2 129 v 994 1399=0A=
a FH(used)30 b(b)o(y)f FE(page)p 1288 1399 15 2 v 17 w(fault)p=0A=
1425 1399 V 16 w(handler)p FH(s)f(to)h(kill)i(pro-)994 1464=0A=
y(cesses)16 b(gracefully)g(when)f(out)g(of)g(memory)l(.)p 1918=0A=
1483 2 129 v 150 1485 1769 2 v 149 1549 2 65 v 186 1530 a(0x002000)p=0A=
393 1549 V 275 w FE(pg0)p 968 1549 V 276 w FH(the)g(\014rst)g(k)o(ernel)h=0A=
(page)f(table.)p 1918 1549 V 150 1551 1769 2 v 149 1615 2 65=0A=
v 186 1596 a(0x001000)p 393 1615 V 150 w FE(swapper)p 692 1596=0A=
15 2 v 17 w(pg)p 757 1596 V 16 w(dir)p 968 1615 2 65 v 152=0A=
w FH(the)g(k)o(ernel)h(page)f(directory)l(.)p 1918 1615 V 150=0A=
1617 1769 2 v 149 1681 2 65 v 186 1662 a(0x000000)p 393 1681=0A=
V 220 w(n)o(ull)i(page)p 968 1681 V 1918 1681 V 150 1683 1769=0A=
2 v 150 1721 a FG(y)p FH(device-inits)25 b(that)d(acquire)h(memory)f=0A=
(are\(main.c\):)33 b FE(profil)p 1291 1721 15 2 v 17 w(buffer)p=0A=
FH(,)22 b FE(con)p 1559 1721 V 17 w(init)p FH(,)h FE(psaux)p=0A=
1828 1721 V 17 w(init)p FH(,)150 1785 y FE(rd)p 201 1785 V=0A=
17 w(init)p FH(,)h FE(scsi)p 447 1785 V 16 w(dev)p 535 1785=0A=
V 17 w(init)p FH(.)43 b(Note)22 =
b(that)g(all)i(memory)f(not)f(mark)o(ed)g(as)=0A=
h(FREE)g(is)g(RESER)-5 b(VED)150 1862 y(\()p FE(mem)p 243 1862=0A=
V 16 w(init)p FH(\).)19 b(RESER)-5 b(VED)16 =
b(pages)f(b)q(elong)h(to)f(the)g=0A=
(k)o(ernel)h(and)g(are)f FD(nev)o(er)f FH(freed)i(or)f(sw)o(app)q(ed.)p=0A=
eop=0A=
%%Page: 99 110=0A=
99 109 bop 150 -84 1800 3 v 150 -100 a FD(5.3.)42 b(A)18 b(user)f(pro)q=0A=
(cess')i(view)e(of)h(memory)897 b FH(99)150 88 y Ft(5.3)70=0A=
b(A)22 b(user)h(pro)r(cess')h(view)d(of)i(memory)p 150 174=0A=
982 2 v 149 239 2 65 v 177 219 a FH(0xc0000000)p 428 239 V=0A=
74 w(The)16 b(in)o(visible)i(k)o(ernel)p 919 239 V 76 w(reserv)o(ed)p=0A=
1131 239 V 150 240 982 2 v 149 305 2 65 v 428 305 V 558 285=0A=
a(initial)f(stac)o(k)p 919 305 V 1131 305 V 150 306 982 2 v=0A=
149 371 2 65 v 428 371 V 453 351 a(ro)q(om)e(for)f(stac)o(k)h(gro)o(wth)p=0A=
919 371 V 48 w(4)g(pages)p 1131 371 V 150 372 982 2 v 149 437=0A=
2 65 v 175 417 a(0x60000000)p 428 437 V 116 w(shared)g(libraries)p=0A=
919 437 V 1131 437 V 150 438 982 2 v 149 503 2 65 v 332 483=0A=
a FE(brk)p 428 503 V 201 w FH(un)o(used)p 919 503 V 1131 503=0A=
V 150 504 982 2 v 149 569 2 65 v 428 569 V 521 549 a(mallo)q(c)h(memory)p=0A=
919 569 V 1131 569 V 150 570 982 2 v 149 635 2 65 v 219 615=0A=
a FE(end)p 294 615 15 2 v 17 w(data)p 428 635 2 65 v 96 w =
FH(uninitialized)j=0A=
(data)p 919 635 V 1131 635 V 150 636 982 2 v 149 701 2 65 v=0A=
219 682 a FE(end)p 294 682 15 2 v 17 w(code)p 428 701 2 65=0A=
v 121 w FH(initialized)g(data)p 919 701 V 1131 701 V 150 702=0A=
982 2 v 149 767 2 65 v 175 748 a(0x00000000)p 428 767 V 228=0A=
w(text)p 919 767 V 1131 767 V 150 768 982 2 v 221 828 =
a(Both)c(the)i(co)q(de)=0A=
f(segmen)o(t)g(and)g(data)f(segmen)o(t)h(extend)h(all)g(the)f(w)o(a)o(y)f=0A=
(from)g(0x00)g(to)h(3)f(GB.)h(Cur-)150 892 =
y(ren)o(tly)f(the)h(page)f(fault)g=0A=
(handler)h FE(do)p 788 892 15 2 v 17 w(wp)p 853 892 V 17 w(page)f=0A=
FH(c)o(hec)o(ks)g(to)g(ensure)g(that)g(a)g(pro)q(cess)g(do)q(es)h(not)e=0A=
(write)i(to)150 956 y(its)g(co)q(de)g(space.)22 b(Ho)o(w)o(ev)o(er,)14=0A=
b(b)o(y)i(catc)o(hing)g(the)g FE(SEGV)f =
FH(signal,)h(it)g(is)g(p)q(ossible)i=0A=
(to)d(write)h(to)f(co)q(de)h(space,)150 1021 y(causing)g(a)e(cop)o=0A=
(y-on-write)h(to)g(o)q(ccur.)20 b(The)15 b(handler)h FE(do)p=0A=
1138 1021 V 17 w(no)p 1203 1021 V 17 w(page)e =
FH(ensures)h(that)g(an)o(y)f=0A=
(new)h(pages)g(the)150 1085 y(pro)q(cess)j(acquires)g(b)q(elong)g(to)f=0A=
(either)h(the)g(executable,)g(a)g(shared)f(library)l(,)i(the)e(stac)o(k,)=
g=0A=
(or)g(lie)i(within)150 1149 y(the)c FE(brk)g FH(v)m(alue.)221=0A=
1237 y(A)h(user)h(pro)q(cess)g(can)g(reset)g(its)f FE(brk)h=0A=
FH(v)m(alue)h(b)o(y)e(calling)j FE(sbrk\(\))p FH(.)k(This)18=0A=
b(is)f(what)f FE(malloc\(\))g FH(do)q(es)150 1302 =
y(when)i(it)g(needs)h(to.)=0A=
26 b(The)18 b(text)f(and)h(data)f(p)q(ortions)h(are)f(allo)q(cated)i(on)e=0A=
(separate)h(pages)f(unless)i(one)150 1366 y(c)o(ho)q(oses)14=0A=
b(the)h FE(-N)f FH(compiler)h(option.)20 b(Shared)15 b(library)g(load)g=0A=
(addresses)f(are)g(curren)o(tly)h(tak)o(en)f(from)g(the)150=0A=
1430 y(shared)h(image)h(itself.)k(The)c(address)f(is)h(b)q(et)o(w)o(een)f=0A=
(1.5)g(GB)g(and)g(3)g(GB,)f(except)i(in)g(sp)q(ecial)h(cases.)150=0A=
1518 y FD(User)h(pro)q(cess)g(Memory)f(Allo)q(cation)p 150=0A=
1533 986 2 v 149 1597 2 65 v 647 1597 V 673 1578 a FH(sw)o(appable)p=0A=
900 1597 V 50 w(shareable)p 1135 1597 V 150 1599 986 2 v 149=0A=
1663 2 65 v 175 1644 a(a)e(few)g(co)q(de)h(pages)p 647 1663=0A=
V 248 w(Y)p 900 1663 V 210 w(Y)p 1135 1663 V 150 1665 986 2=0A=
v 149 1729 2 65 v 175 1710 a(a)f(few)g(data)f(pages)p 647 1729=0A=
V 250 w(Y)p 900 1729 V 200 w(N?)p 1135 1729 V 150 1731 986=0A=
2 v 149 1795 2 65 v 175 1776 a(stac)o(k)p 647 1795 V 480 w(Y)p=0A=
900 1795 V 210 w(N)p 1135 1795 V 150 1797 986 2 v 149 1861=0A=
2 65 v 175 1842 a FE(pg)p 226 1842 15 2 v 17 w(dir)p 647 1861=0A=
2 65 v 445 w FH(N)p 900 1861 V 210 w(N)p 1135 1861 V 150 1863=0A=
986 2 v 149 1927 2 65 v 175 1908 a(co)q(de/data)h FE(page)p=0A=
490 1908 15 2 v 16 w(table)p 647 1927 2 65 v 134 w FH(N)p 900=0A=
1927 V 210 w(N)p 1135 1927 V 150 1929 986 2 v 149 1993 2 65=0A=
v 175 1974 a(stac)o(k)f FE(page)p 390 1974 15 2 v 17 w(table)p=0A=
647 1993 2 65 v 233 w FH(N)p 900 1993 V 210 w(N)p 1135 1993=0A=
V 150 1995 986 2 v 149 2059 2 65 v 175 2040 a FE(task)p 274=0A=
2040 15 2 v 17 w(struct)p 647 2059 2 65 v 325 w FH(N)p 900=0A=
2059 V 210 w(N)p 1135 2059 V 150 2061 986 2 v 149 2125 2 65=0A=
v 175 2106 a FE(kernel)p 322 2106 15 2 v 16 w(stack)p 458 2106=0A=
V 17 w(frame)p 647 2125 2 65 v 165 w FH(N)p 900 2125 V 210=0A=
w(N)p 1135 2125 V 150 2127 986 2 v 149 2191 2 65 v 175 2172=0A=
a(shlib)j FE(page)p 383 2172 15 2 v 16 w(table)p 647 2191 2=0A=
65 v 241 w FH(N)p 900 2191 V 210 w(N)p 1135 2191 V 150 2193=0A=
986 2 v 149 2257 2 65 v 175 2238 a(a)e(few)g(shlib)i(pages)p=0A=
647 2257 V 244 w(Y)p 900 2257 V 200 w(Y?)p 1135 2257 V 150=0A=
2259 986 2 v 221 2346 a FD([What)25 =
b(do)g(the)f(question)h(marks)f(mean?)44=0A=
b(Do)24 b(they)g(mean)h(that)g(they)f(migh)o(t)h(go)150 2410=0A=
y(either)18 b(w)o(a)o(y)l(,)e(or)h(that)h(y)o(ou)e(are)i(not)f(sure?])j=0A=
FH(The)15 =
b(stac)o(k,)f(shlibs)i(and)e(data)g(are)h(to)q(o)f(far)f(remo)o(v)o=0A=
(ed)150 2474 =
y(from)h(eac)o(h)g(other)g(to)g(b)q(e)h(spanned)g(b)o(y)g(one)f=0A=
(page)h(table.)20 b(All)15 b(k)o(ernel)h FE(page)p 1456 2474=0A=
15 2 v 16 w(table)p FH(s)e(are)g(shared)h(b)o(y)f(all)150 2539=0A=
y(pro)q(cesses)h(so)f(they)h(are)g(not)f(in)h(the)g(list.)21=0A=
b(Only)16 b(dirt)o(y)e(pages)h(are)f(sw)o(app)q(ed.)20 =
b(Clean)c(pages)e(are)=0A=
h(stolen)p eop=0A=
%%Page: 100 111=0A=
100 110 bop 150 -84 1800 3 v 150 -100 a FD(5.4.)42 b(Memory)17=0A=
b(Managemen)o(t)g(data)i(in)f(the)g(pro)q(cess)g(table)522=0A=
b FH(100)150 88 y(so)12 =
b(the)h(pro)q(cess)f(can)h(read)g(them)f(bac)o(k)g=0A=
(in)i(from)d(the)i(executable)h(if)f(it)g(lik)o(es.)20 b(Mostly)12=0A=
b(only)h(clean)g(pages)150 153 y(are)j(shared.)23 b(A)16 =
b(dirt)o(y)g(page)h=0A=
(ends)f(up)h(shared)f(across)g(a)g(fork)f(un)o(til)j(the)e(paren)o(t)g(or=
)g=0A=
(c)o(hild)h(c)o(ho)q(oses)g(to)150 217 y(write)e(to)g(it)g(again.)150=0A=
394 y Ft(5.4)70 b(Memory)23 =
b(Managemen)n(t)f(data)i(in)e(the)h(pro)r(cess)g=0A=
(table)150 527 y FH(Here)15 =
b(is)h(a)f(summary)f(of)h(some)f(of)h(the)g(data)=0A=
f(k)o(ept)h(in)h(the)f(pro)q(cess)h(table)f(whic)o(h)h(is)f(used)h(for)f=0A=
(memory)150 591 y(managmen)o(t:)k =
FD([These)e(should)g(b)q(e)h(m)o(uc)o(h)e=0A=
(b)q(etter)i(do)q(cumen)o(ted.)24 b(W)l(e)17 =
b(need)f(more)i(details.])218=0A=
729 y FG(\017)23 b FH(Pro)q(cess)70 b(memory)g(limits:)131=0A=
b FE(ulong)23 b(start)p 1234 729 15 2 v 16 w(code,)h(end)p=0A=
1466 729 V 16 w(code,)g(end)p 1698 729 V 16 w(data,)g(brk,)264=0A=
794 y(start)p 387 794 V 16 w(stack;)218 895 y FG(\017)f FH(P)o(age)14=0A=
b(fault)h(coun)o(ting:)21 b FE(ulong)i(min)p 903 895 V 17 w(flt,)g(maj)p=0A=
1111 895 V 17 w(flt,)g(cmin)p 1343 895 V 17 w(flt,)g(cmaj)p=0A=
1575 895 V 17 w(flt)218 997 y FG(\017)g FH(Lo)q(cal)13 =
b(descriptor)g(table:)=0A=
19 b FE(struct)k(desc)p 990 997 V 17 w(struct)g(ldt[32])12=0A=
b FH(is)h(the)g(lo)q(cal)g(descriptor)g(table)h(for)264 1061=0A=
y(task.)218 1163 y FG(\017)23 b FE(rss)p FH(:)c(n)o(um)o(b)q(er)d(of)e=0A=
(residen)o(t)i(pages.)218 1265 y FG(\017)23 b FE(swappable)p=0A=
FH(:)18 =
b(if)e(0,)e(then)i(pro)q(cess's)f(pages)g(will)i(not)e(b)q(e)g(sw)o=0A=
(app)q(ed.)218 1366 y FG(\017)23 b FE(kernel)p 411 1366 V 16=0A=
w(stack)p 547 1366 V 16 w(page)p FH(:)d(p)q(oin)o(ter)15 =
b(to)g(page)g(allo)q=0A=
(cated)h(in)g(fork.)218 1468 y FG(\017)23 b FE(saved)p 387=0A=
1468 V 16 w(kernel)p 547 1468 V 16 w(stack)p FH(:)d(V86)14=0A=
b(mo)q(de)i(stu\013.)218 1570 y FG(\017)23 b FE(struct)g(tss)315=0A=
1672 y FD({)g FH(Stac)o(k)14 b(segmen)o(ts)364 1753 y FE(esp0)22=0A=
b FH(k)o(ernel)16 b(stac)o(k)e(p)q(oin)o(ter)i(\()p FE(kernel)p=0A=
1054 1753 V 16 w(stack)p 1190 1753 V 16 w(page)p FH(\))364=0A=
1825 y FE(ss0)22 b FH(k)o(ernel)16 b(stac)o(k)e(segmen)o(t)h(\(0x10\))364=0A=
1898 y FE(esp1)22 b FH(=3D)15 b FE(ss1)g FH(=3D)h FE(esp2)e FH(=3D)i=0A=
FE(ss2)e FH(=3D)i(0)449 1962 y(un)o(used)g(priv)o(elege)g(lev)o(els.)315=0A=
2043 y FD({)23 b FH(Segmen)o(t)15 b(selectors:)20 b FE(ds)j=0A=
FH(=3D)i FE(es)e FH(=3D)h FE(fs)g FH(=3D)g FE(gs)g FH(=3D)g FE(ss)g=0A=
FH(=3D)g FE(0x17)p FH(,)14 b FE(cs)24 b FH(=3D)g FE(0x0f)364 2108=0A=
y FH(All)16 b(p)q(oin)o(t)g(to)e(segmen)o(ts)h(in)h(the)f(curren)o(t)g=0A=
FE(ldt[])p FH(.)315 2189 y FD({)23 b FE(cr3)p =
FH(:)c(p)q(oin)o(ts)d(to)e(the)=0A=
i(page)f(directory)g(for)g(this)g(pro)q(cess.)315 2270 y FD({)23=0A=
b FE(ldt)p FH(:)p 471 2270 V 36 w FE(LDT\(n\))15 b FH(selector)g(for)g=0A=
(curren)o(t)g(task's)f(LDT.)p eop=0A=
%%Page: 101 112=0A=
101 111 bop 150 -84 1800 3 v 150 -100 a FD(5.5.)42 b(Memory)17=0A=
b(initializa)q(ti)q(on)1117 b FH(101)150 88 y Ft(5.5)70 b(Memory)23=0A=
b(initial)o(i)o(zati)o(on)150 221 y FH(In)16 b FE(start)p 330=0A=
221 15 2 v 16 w(kernel\(\))e =
FH(\(main.c\))h(there)g(are)g(3)g(v)m(ariables)i=0A=
(related)e(to)g(memory)g(initialization:)245 305 y FE(memory)p=0A=
392 305 V 17 w(start)138 b FH(starts)14 =
b(out)g(at)h(1)g(MB.)g(Up)q(dated)g=0A=
(b)o(y)h(device)g(initialization.)245 370 y FE(memory)p 392=0A=
370 V 17 w(end)186 b FH(end)16 =
b(of)e(ph)o(ysical)j(memory:)i(8)c(MB,)g(16)f=0A=
(MB,)h(or)g(whatev)o(er.)245 434 y FE(low)p 320 434 V 17 w(memory)p=0A=
481 434 V 17 w(start)49 b FH(end)16 =
b(of)e(the)i(k)o(ernel)g(co)q(de)f(and)h=0A=
(data)e(that)h(is)h(loaded)f(initially)l(.)221 513 y(Eac)o(h)10=0A=
b(device)h(init)h(t)o(ypically)g(tak)o(es)d FE(memory)p 979=0A=
513 V 17 w(start)g =
FH(and)i(returns)f(an)g(up)q(dated)h(v)m(alue)h(if)f(it)f=0A=
(allo)q(cates)150 577 y(space)16 b(at)g FE(memory)p 476 577=0A=
V 16 w(start)f FH(\(b)o(y)h(simply)h(grabbing)f(it\).)22 b=0A=
FE(paging)p 1272 577 V 17 w(init\(\))15 b FH(initializes)k(the)d(page)g=0A=
(tables)150 641 y(in)i(the)f FE(swapper)p 456 641 V 16 w(pg)p=0A=
520 641 V 17 w(dir)f =
FH(\(starting)g(at)h(0xc0000000\))d(to)i(co)o(v)o(er)h=0A=
(all)h(of)e(the)h(ph)o(ysical)h(memory)f(from)150 706 y FE(memory)p=0A=
297 706 V 16 w(start)j FH(to)f FE(memory)p 657 706 V 16 w(end)p=0A=
FH(.)34 b(Actually)22 b(the)e(\014rst)f(4)h(MB)g(is)g(done)h(in)g=0A=
FE(startup)p 1690 706 V 16 w(32)f FH(\(head.S\).)150 770 y=0A=
FE(memory)p 297 770 V 16 w(start)c FH(is)i(incremen)o(ted)g(if)f(an)o(y)f=0A=
(new)h FE(page)p 1076 770 V 17 w(table)p FH(s)f(are)g(added.)25=0A=
b(The)17 b(\014rst)g(page)f(is)h(zero)q(ed)150 834 =
y(to)e(trap)f(n)o(ull)j(p)=0A=
q(oin)o(ter)f(references)f(in)h(the)g(k)o(ernel.)221 922 y(In)21=0A=
b FE(sched)p 406 922 V 16 w(init\(\))f FH(the)g FE(ldt)g FH(and)h=0A=
FE(tss)f FH(descriptors)g(for)g FE(task[0])g =
FH(are)g(set)g(in)h(the)g(GDT,)e=0A=
(and)150 987 y(loaded)f(in)o(to)f(the)g(TR)h(and)f(LDTR)h(\(the)f(only)g=0A=
(time)h(it's)f(done)g(explicitly\).)29 b(A)17 =
b(trap)f(gate)h(\(0x80\))e(is)=0A=
150 1051 y(set)j(up)h(for)f FE(system)p 513 1051 V 17 w(call\(\))p=0A=
FH(.)29 b(The)19 b(nested)g(task)f(\015ag)g(is)h(turned)g(o\013)g(in)g=0A=
(preparation)g(for)f(en)o(tering)150 1115 y(user)f(mo)q(de.)23=0A=
b(The)17 b(timer)g(is)f(turned)h(on.)24 b(The)16 b FE(task)p=0A=
1081 1115 V 17 w(struct)g FH(for)f FE(task[0])h =
FH(app)q(ears)g(in)h(its)g=0A=
(en)o(tiret)o(y)150 1180 y(in)f FE(<linux/sched.h>)p FH(.)221=0A=
1267 y FE(mem)p 296 1267 V 16 w(map)11 b =
FH(is)h(then)g(constructed)f(b)o(y)g=0A=
FE(mem)p 909 1267 V 17 w(init\(\))f =
FH(to)h(re\015ect)h(the)f(curren)o(t)g=0A=
(usage)g(of)g(ph)o(ysical)i(pages.)150 1332 y(This)j(is)f(the)h(state)e=0A=
(re\015ected)i(in)g(the)f(ph)o(ysical)i(memory)e(map)g(of)f(the)i(previou=
s)g=0A=
(section.)221 1420 =
y(Then)f(Lin)o(ux)i(mo)o(v)o(es)d(in)o(to)h(user)g(mo)q=0A=
(de)h(with)f(an)g FE(iret)g FH(after)f(pushing)i(the)g(curren)o(t)f=0A=
FE(ss)p FH(,)f FE(esp)p FH(,)g(etc.)150 1484 y(Of)21 =
b(course)f(the)h(user)f=0A=
(segmen)o(ts)g(for)g FE(task[0])f =
FH(are)i(mapp)q(ed)g(righ)o(t)f(o)o(v)o(er)=0A=
g(the)g(k)o(ernel)h(segmen)o(ts)f(so)150 1548 =
y(execution)c(con)o(tin)o(ues)g=0A=
(exactly)g(where)f(it)g(left)h(o\013.)150 1636 y FE(task[0])p=0A=
FH(:)218 1761 y FG(\017)23 b FE(pg)p 315 1761 V 17 w(dir)c=0A=
FH(=3D)h FE(swapper)p 646 1761 V 17 w(pg)p 711 1761 V 16 w(dir)g=0A=
FH(whic)o(h)h(means)f(the)g(the)g(only)g(addresses)h(mapp)q(ed)f(are)g(in=
)h=0A=
(the)264 1826 y(range)15 b(3)f(GB)h(to)g(3)g(GB)g(+)g FE(high)p=0A=
834 1826 V 17 w(memory)p FH(.)218 1927 y FG(\017)23 b FE(LDT[1])14=0A=
b FH(=3D)h(user)h(co)q(de,)f(base=3D0xc0000000,)e(size)k(=3D)e(640K)218=0A=
2029 y FG(\017)23 b FE(LDT[2])14 b =
FH(=3D)h(user)h(data,)e(base=3D0xc0000000,)f=0A=
(size)j(=3D)g(640K)221 2154 y(The)j(\014rst)f FE(exec\(\))g =
FH(sets)g(the)h=0A=
(LDT)g(en)o(tries)g(for)f FE(task[1])g =
FH(to)g(the)h(user)g(v)m(alues)h(of)e=0A=
(base)h(=3D)g(0x0,)150 2219 y(limit)f(=3D)e(T)l(ASK)p 437 2219=0A=
14 2 v 18 w(SIZE)g(=3D)h(0xc0000000.)k(Thereafter,)16 =
b(no)h(pro)q(cess)f(sees)=0A=
h(the)f(k)o(ernel)i(segmen)o(ts)d(while)150 2283 =
y(in)h(user)f(mo)q(de.)150=0A=
2436 y Fq(5.5.1)55 b(Pro)r(cesses)18 b(and)h(the)f(Memory)f(Manager)150=0A=
2554 y FH(Memory-related)e(w)o(ork)f(done)i(b)o(y)f FE(fork\(\))p=0A=
FH(:)p eop=0A=
%%Page: 102 113=0A=
102 112 bop 150 -84 1800 3 v 150 -100 a FD(5.5.)42 b(Memory)17=0A=
b(initializa)q(ti)q(on)1117 b FH(102)218 88 y FG(\017)23 b=0A=
FH(Memory)14 b(allo)q(cation)315 190 y FD({)23 b FH(1)15 =
b(page)g(for)f(the)h=0A=
FE(task)p 754 190 15 2 v 17 w(struct)p FH(.)315 271 y FD({)23=0A=
b FH(1)15 b(page)g(for)f(the)h(k)o(ernel)h(stac)o(k.)315 352=0A=
y FD({)23 b FH(1)15 b(for)f(the)h FE(pg)p 600 352 V 17 w(dir)g=0A=
FH(and)g(some)g(for)g FE(pg)p 1024 352 V 17 w(table)p FH(s)f(\(cop)o(y)p=0A=
1302 352 14 2 v 16 w(page)p 1409 352 V 16 w(tables\))218 454=0A=
y FG(\017)23 b FH(Other)15 b(c)o(hanges)315 555 y FD({)23 b=0A=
FE(ss0)14 b =
FH(set)h(to)g(k)o(ernel)h(stac)o(k)e(segmen)o(t)h(\(0x10\))f(to)g=0A=
(b)q(e)i(sure?)315 636 y FD({)23 b FE(esp0)14 b =
FH(set)h(to)g(top)g(of)f(the)=0A=
i(newly)g(allo)q(cated)g FE(kernel)p 1282 636 15 2 v 16 w(stack)p=0A=
1418 636 V 17 w(page)315 717 y FD({)23 b FE(cr3)14 b FH(set)h(b)o(y)g=0A=
FE(copy)p 683 717 V 17 w(page)p 796 717 V 17 w(tables\(\))f=0A=
FH(to)g(p)q(oin)o(t)i(to)f(newly)h(allo)q(cated)g(page)f(directory)l(.)31=
5=0A=
798 y FD({)23 b FE(ldt)g(=3D)p 510 798 V 41 w(LDT\(task)p 719=0A=
798 V 16 w(nr\))15 b FH(creates)g(new)g(ldt)h(descriptor.)315=0A=
879 y FD({)23 b FH(descriptors)15 =
b(set)g(in)h(gdt)f(for)g(new)g(tss)g(and)g=0A=
FE(ldt[])p FH(.)315 960 y FD({)23 b FH(The)15 =
b(remaining)h(registers)f(are)g=0A=
(inherited)i(from)e(paren)o(t.)150 1085 y(The)i(pro)q(cesses)g(end)h(up)f=0A=
(sharing)g(their)h(co)q(de)f(and)g(data)f(segmen)o(ts)g(\(although)h(they=
)g=0A=
(ha)o(v)o(e)f(separate)150 1150 =
y(lo)q(cal)f(desctriptor)g(tables,)f(the)h=0A=
(en)o(tries)f(p)q(oin)o(t)h(to)f(the)g(same)g(segmen)o(ts\).)19=0A=
b(The)c(stac)o(k)e(and)i(data)e(pages)150 1214 y(will)k(b)q(e)f(copied)g=0A=
(when)g(the)f(paren)o(t)g(or)g(c)o(hild)h(writes)g(to)e(them)h(\(cop)o=0A=
(y-on-write\).)150 1302 y(Memory-related)g(w)o(ork)f(done)i(b)o(y)f=0A=
FE(exec\(\))p FH(:)218 1427 y FG(\017)23 b FH(memory)14 =
b(allo)q(cation)315=0A=
1529 y FD({)23 b FH(1)15 =
b(page)g(for)f(exec)i(header)f(en)o(tire)h(\014le)g=0A=
(for)f(omagic)315 1610 y FD({)23 b FH(1)15 =
b(page)g(or)f(more)h(for)g(stac)o=0A=
(k)f(\(MAX)p 994 1610 14 2 v 16 w(AR)o(G)p 1112 1610 V 16 =
w(P)l(A)o(GES\))218=0A=
1712 y FG(\017)23 b FE(clear)p 387 1712 15 2 v 16 w(page)p=0A=
499 1712 V 17 w(tables\(\))14 b =
FH(used)i(to)e(remo)o(v)o(e)h(old)g(pages.)=0A=
218 1813 y FG(\017)23 b FE(change)p 411 1813 V 16 w(ldt\(\))14=0A=
b FH(sets)h(the)h(descriptors)f(in)h(the)g(new)f FE(LDT[])218=0A=
1915 y FG(\017)23 b FE(ldt[1])14 b =
FH(=3D)h(co)q(de)h(base=3D0x00,)f(limit=3DT)l=0A=
(ASK)p 1072 1915 14 2 v 19 w(SIZE)218 2017 y FG(\017)23 b FE(ldt[2])14=0A=
b FH(=3D)h(data)g(base=3D0x00,)f(limit=3DT)l(ASK)p 1070 2017 V 19=0A=
w(SIZE)264 2081 =
y(These)h(segmen)o(ts)g(are)g(DPL=3D3,)g(P=3D1,)f(S=3D1,)i(G=3D1.)j=0A=
(t)o(yp)q(e=3Da)d(\(co)q(de\))f(or)f(2)h(\(data\))218 2183 y=0A=
FG(\017)23 b FH(Up)17 b(to)e FE(MAX)p 471 2183 15 2 v 17 w(ARG)p=0A=
560 2183 V 17 w(PAGES)h FH(dirt)o(y)h(pages)f(of)g(argv)g(and)h(en)o(vp)g=0A=
(are)f(allo)q(cated)i(and)e(stashed)h(at)f(the)264 2247 =
y(top)e(of)h(the)g=0A=
(data)g(segmen)o(t)g(for)f(the)i(newly)g(created)f(user)g(stac)o(k.)218=0A=
2349 y FG(\017)23 b FH(Set)15 =
b(the)g(instruction)h(p)q(oin)o(ter)g(of)f(the)=0A=
g(caller)h FE(eip)24 b(=3D)g(ex.a)p 1301 2349 V 16 w(entry)218=0A=
2451 y FG(\017)f FH(Set)12 b(the)g(stac)o(k)g(p)q(oin)o(ter)g(of)g(the)g=0A=
(caller)i(to)d(the)i(stac)o(k)e(just)h(created)g(\(esp)g(=3D)h(stac)o(k)e=
(p)q=0A=
(oin)o(ter\))i(These)264 2515 =
y(will)j(b)q(e)g(p)q(opp)q(ed)h(o\013)e(the)h=0A=
(stac)o(k)e(when)i(the)f(caller)h(resumes.)p eop=0A=
%%Page: 103 114=0A=
103 113 bop 150 -84 1800 3 v 150 -100 a FD(5.6.)42 b(Acquiring)20=0A=
b(and)d(F)l(reeing)i(Memory:)k(P)o(aging)18 b(P)o(olicy)538=0A=
b FH(103)218 88 y FG(\017)23 b FH(up)q(date)15 b(memory)g(limits)264=0A=
153 y FE(end)p 339 153 15 2 v 16 w(code)24 b(=3D)f(ex.a)p 618=0A=
153 V 17 w(text)264 217 y(end)p 339 217 V 16 w(data)h(=3D)f(end)p=0A=
594 217 V 17 w(code)h(+)f(ex.a)p 874 217 V 17 w(data)264 281=0A=
y(brk)g(=3D)h(end)p 482 281 V 17 w(data)f(+)h(ex.a)p 762 281=0A=
V 16 w(bss)221 407 y FH(In)o(terrupts)16 b(and)g(traps)f(are)h(handled)i=0A=
(within)f(the)f(con)o(text)g(of)f(the)h(curren)o(t)g(task.)22=0A=
b(In)17 b(particular,)150 471 =
y(the)k(page)f(directory)g(of)g(the)h(curren)o=0A=
(t)f(pro)q(cess)h(is)g(used)g(in)g(address)g(translation.)35=0A=
b(The)21 b(segmen)o(ts,)150 535 y(ho)o(w)o(ev)o(er,)e(are)g(k)o(ernel)i=0A=
(segmen)o(ts)e(so)g(that)f(all)j(linear)f(addresses)g(p)q(oin)o(t)g(in)o(=
to)f=0A=
(k)o(ernel)h(memory)l(.)33 b(F)l(or)150 600 y(example,)23 b(assume)e(a)f=0A=
(user)h(pro)q(cess)g(in)o(v)o(ok)o(es)g(a)g(system)f(call)i(and)f(the)g(k=
)o=0A=
(ernel)h(w)o(an)o(ts)e(to)g(access)h(a)150 664 y(v)m(ariable)15=0A=
b(at)f(address)g(0x01.)k(The)c(linear)h(address)f(is)h(0xc0000001)d(\(usi=
ng)i=0A=
(k)o(ernel)h(segmen)o(ts\))e(and)h(the)150 728 =
y(ph)o(ysical)j(address)f(is)h=0A=
(0x01.)22 b(The)16 b(later)g(is)h(b)q(ecause)g(the)f(pro)q(cess')g(page)g=0A=
(directory)g(maps)g(this)g(range)150 793 y(exactly)g(as)e FE(page)p=0A=
461 793 V 17 w(pg)p 526 793 V 17 w(dir)p FH(.)221 881 y(The)21=0A=
b(k)o(ernel)g(space)g(\(0xc0000000)d(+)j FE(high)p 1005 881=0A=
V 17 w(memory)p FH(\))e(is)j(mapp)q(ed)f(b)o(y)g(the)g(k)o(ernel)g(page)g=0A=
(tables)150 945 =
y(whic)o(h)e(are)f(themselv)o(es)h(part)e(of)h(the)g(RESER)-5=0A=
b(VED)19 b(memory)l(.)28 b(They)19 =
b(are)f(therefore)g(shared)g(b)o(y)g(all)=0A=
150 1009 y(pro)q(cesses.)28 b(During)18 b(a)g(fork)f FE(copy)p=0A=
764 1009 V 17 w(page)p 877 1009 V 16 w(tables\(\))g FH(treats)g(RESER)-5=0A=
b(VED)18 b(page)g(tables)g(di\013eren)o(tly)l(.)150 1074 =
y(It)e(sets)g(p)q=0A=
(oin)o(ters)g(in)h(the)f(pro)q(cess)g(page)g(directories)h(to)f(p)q(oin)o=
(t)g=0A=
(to)g(k)o(ernel)g(page)g(tables)h(and)f(do)q(es)g(not)150 1138=0A=
y(actually)11 b(allo)q(cate)g(new)g(page)f(tables)h(as)f(it)h(do)q(es)f=0A=
(normally)l(.)19 b(As)11 b(an)f(example)h(the)g FE(kernel)p=0A=
1705 1138 V 16 w(stack)p 1841 1138 V 17 w(page)150 1202 y FH(\(whic)o(h)g=0A=
(sits)g(somewhere)g(in)g(the)g(k)o(ernel)h(space\))f(do)q(es)g(not)f(need=
)i=0A=
(an)e(asso)q(ciated)h FE(page)p 1628 1202 V 17 w(table)f =
FH(allo)q(cated)150=0A=
1267 y(in)16 b(the)f(pro)q(cess')g FE(pg)p 503 1267 V 17 w(dir)g=0A=
FH(to)g(map)g(it.)221 1355 =
y(The)g(in)o(terrupt)g(instruction)i(sets)d(the)i=0A=
(stac)o(k)e(p)q(oin)o(ter)i(and)f(stac)o(k)g(segmen)o(t)f(from)h(the)g=0A=
(privilege)i(0)150 1419 y(v)m(alues)e(sa)o(v)o(ed)d(in)j(the)e(tss)g(of)g=0A=
(the)h(curren)o(t)f(task.)18 b(Note)13 =
b(that)g(the)h(k)o(ernel)g(stac)o(k)e=0A=
(is)i(a)f(really)i(fragmen)o(ted)150 1483 =
y(ob)s(ject)f(|)h(it's)f(not)g(a)g=0A=
(single)i(ob)s(ject,)d(but)i(rather)f(a)g(bunc)o(h)h(of)f(stac)o(k)g(fram=
es)f=0A=
(eac)o(h)i(allo)q(cated)g(when)g(a)150 1548 =
y(pro)q(cess)e(is)f(created,)h=0A=
(and)f(released)h(when)g(it)g(exits.)19 b(The)13 b(k)o(ernel)g(stac)o(k)e=0A=
(should)i(nev)o(er)g(gro)o(w)e(so)h(rapidly)150 1612 y(within)k(a)f(pro)q=0A=
(cess)h(con)o(text)e(that)h(it)g(extends)h(b)q(elo)o(w)g(the)f(curren)o(t=
)g=0A=
(frame.)150 1789 y Ft(5.6)70 b(Acquiring)22 b(and)h(F)-6 b(reeing)23=0A=
b(Memory:)30 b(P)n(aging)24 b(P)n(olicy)150 1922 y FH(When)17=0A=
b(an)o(y)f(k)o(ernel)i(routine)f(w)o(an)o(ts)e(memory)h(it)h(ends)g(up)g=0A=
(calling)h FE(get)p 1411 1922 V 17 w(free)p 1524 1922 V 17=0A=
w(page\(\))p FH(.)23 b(This)17 b(is)g(at)f(a)150 1986 =
y(lo)o(w)o(er)g(lev)o=0A=
(el)h(than)f FE(kmalloc\(\))e FH(\(in)j(fact)e FE(kmalloc\(\))g=0A=
FH(uses)h FE(get)p 1276 1986 V 16 w(free)p 1388 1986 V 17 w(page\(\))f=0A=
FH(when)i(it)f(needs)g(more)150 2051 y(memory\).)221 2139 y=0A=
FE(get)p 296 2139 V 16 w(free)p 408 2139 V 17 w(page\(\))23=0A=
b FH(tak)o(es)f(one)i(parameter,)h(a)e(priorit)o(y)l(.)45 =
b(P)o(ossible)25=0A=
b(v)m(alues)f(are)f FE(GFP)p 1780 2139 V 17 w(BUFFER)p FH(,)150=0A=
2203 y FE(GFP)p 225 2203 V 17 w(KERNEL)p FH(,)13 b(and)i FE(GFP)p=0A=
572 2203 V 17 w(ATOMIC)p =
FH(.)f(It)h(tak)o(es)f(a)g(page)h(o\013)g(of)f(the)h=0A=
FE(free)p 1357 2203 V 17 w(page)p 1470 2203 V 17 w(list)p =
FH(,)f(up)q(dates)h=0A=
FE(mem)p 1852 2203 V 17 w(map)p FH(,)150 2267 =
y(zero)q(es)g(the)g(page)g(and)=0A=
g(returns)f(the)h(ph)o(ysical)h(address)f(of)g(the)f(page)h(\(note)f(that=
)h=0A=
FE(kmalloc\(\))e FH(returns)150 2332 y(a)j(ph)o(ysical)h(address.)22=0A=
b(The)16 =
b(logic)g(of)g(the)g(mm)f(dep)q(ends)j(on)d(the)h(iden)o(tit)o(y)h=0A=
(map)f(b)q(et)o(w)o(een)g(logical)h(and)150 2396 y(ph)o(ysical)f=0A=
(addresses\).)221 2484 y(That)f(itself)i(is)g(simple)h(enough.)23=0A=
b(The)17 b(problem,)f(of)g(course,)g(is)h(that)e(the)i FE(free)p=0A=
1629 2484 V 16 w(page)p 1741 2484 V 17 w(list)f FH(ma)o(y)150=0A=
2548 y(b)q(e)d(empt)o(y)l(.)19 b(If)12 =
b(y)o(ou)g(did)h(not)f(request)g(an)h=0A=
(atomic)f(op)q(eration,)g(at)g(this)h(stage,)e(y)o(ou)h(en)o(ter)g(in)o(t=
o)g=0A=
(the)h(realm)p eop=0A=
%%Page: 104 115=0A=
104 114 bop 150 -84 1800 3 v 150 -100 a FD(5.6.)42 b(Acquiring)20=0A=
b(and)d(F)l(reeing)i(Memory:)k(P)o(aging)18 b(P)o(olicy)538=0A=
b FH(104)150 88 y(of)14 =
b(page)f(stealing)i(whic)o(h)g(w)o(e'll)f(go)g(in)o=0A=
(to)g(in)h(a)e(momen)o(t.)19 b(As)14 b(a)f(last)h(resort)f(\(and)h(for)g=0A=
(atomic)f(requests\))150 153 y(a)18 =
b(page)f(is)i(torn)e(o\013)h(from)g(the)g=0A=
FE(secondary)p 927 153 15 2 v 15 w(page)p 1038 153 V 17 w(list)f=0A=
FH(\(as)h(y)o(ou)f(ma)o(y)h(ha)o(v)o(e)f(guessed,)i(when)f(pages)150=0A=
217 y(are)d(freed,)g(the)g FE(secondary)p 648 217 V 16 w(page)p=0A=
760 217 V 17 w(list)f FH(gets)h(\014lled)i(up)f(\014rst\).)221=0A=
305 y(The)11 b(actual)h(manipulation)h(of)e(the)h FE(page)p=0A=
939 305 V 16 w(list)p FH(s)f(and)h FE(mem)p 1237 305 V 16 w(map)f=0A=
FH(o)q(ccurs)h(in)h(this)e(m)o(ysterious)h(macro)150 369 y(called)k=0A=
FE(REMOVE)p 425 369 V 17 w(FROM)p 538 369 V 16 w(MEM)p 626=0A=
369 V 17 w(QUEUE\(\))e =
FH(whic)o(h)h(y)o(ou)g(probably)g(nev)o(er)g(w)o(an)o=0A=
(t)e(to)i(lo)q(ok)g(in)o(to.)k(Su\016ce)d(it)f(to)150 434 =
y(sa)o(y)h(that)h=0A=
(in)o(terrupts)g(are)g(disabled.)27 b FD([I)20 b(think)g(that)g(this)g=0A=
(should)g(b)q(e)g(explained)h(here.)30 b(It)20 b(is)150 498=0A=
y(not)e FC(that)g FD(hard)p FB(:)8 b(:)g(:)f FD(])221 586 y=0A=
FH(No)o(w)16 b(bac)o(k)h(to)g(the)g(page)g(stealing)h(bit.)26=0A=
b FE(get)p 1018 586 V 17 w(free)p 1131 586 V 17 w(page\(\))16=0A=
b FH(calls)i FE(try)p 1483 586 V 17 w(to)p 1548 586 V 17 w(free)p=0A=
1661 586 V 17 w(page\(\))e FH(whic)o(h)150 650 y(rep)q(eatedly)j(calls)h=0A=
FE(shrink)p 627 650 V 16 w(buffers\(\))d FH(and)i FE(swap)p=0A=
1064 650 V 16 w(out\(\))f FH(in)h(that)f(order)g(un)o(til)h(it)g(is)f=0A=
(successful)i(in)150 715 y(freeing)h(a)g(page.)36 b(The)21=0A=
b(priorit)o(y)g(is)g(increased)h(on)e(eac)o(h)h(successiv)o(e)h(iteration=
)f=0A=
(so)f(that)g(these)h(t)o(w)o(o)150 779 y(routines)16 =
b(run)f(through)g(their)=0A=
h(page)f(stealing)h(lo)q(ops)f(more)g(often.)221 867 =
y(Here's)g(one)g(run)g=0A=
(through)g FE(swap)p 796 867 V 17 w(out\(\))p FH(:)218 992=0A=
y FG(\017)23 b FH(Run)16 =
b(through)f(the)g(pro)q(cess)g(table)h(and)f(get)g=0A=
(a)g(sw)o(appable)h(task)e(sa)o(y)h Fw(Q.)218 1094 y FG(\017)23=0A=
b FH(Find)16 b(a)e(user)i(page)f(table)h(\(not)e(RESER)-5 b(VED\))16=0A=
b(in)g Fw(Q)p FH('s)f(space.)218 1195 y FG(\017)23 b FH(F)l(or)14=0A=
b(eac)o(h)h Fw(page)h FH(in)g(the)f(table)g FE(try)p 873 1195=0A=
V 17 w(to)p 938 1195 V 17 w(swap)p 1051 1195 V 17 w(out\()23=0A=
b Fw(page)h FE(\))p FH(.)218 1297 y FG(\017)f FH(Quit)16 =
b(when)f(a)g(page)g=0A=
(is)h(freed.)150 1422 y(Note)e(that)f FE(swap)p 455 1422 V=0A=
17 w(out\(\))g FH(\(called)i(b)o(y)f FE(try)p 884 1422 V 17=0A=
w(to)p 949 1422 V 17 w(free)p 1062 1422 V 16 w(page\(\))p FH(\))f(main)o=0A=
(tains)i(static)e(v)m(ariables)j(so)d(it)i(ma)o(y)150 1487=0A=
y(resume)g(the)h(searc)o(h)f(where)g(it)h(left)f(o\013)h(on)f(the)g(previ=
ous)=0A=
h(call.)150 1587 y FE(try)p 225 1587 V 17 w(to)p 290 1587 V=0A=
17 w(swap)p 403 1587 V 16 w(out\(\))k =
FH(scans)h(the)f(page)h(tables)g(of)f=0A=
(all)h(user)g(pro)q(cesses)g(and)g(enforces)g(the)f(stealing)150=0A=
1651 y(p)q(olicy:)206 1777 y(1.)i(Do)14 =
b(not)h(\014ddle)i(with)e(RESER)-5=0A=
b(VED)16 b(pages.)206 1878 y(2.)22 b(Age)15 b(the)g(page)g(if)h(it)f(is)h=0A=
(mark)o(ed)f(accessed)h(\(1)e(bit\).)206 1980 y(3.)22 b(Don't)14=0A=
b(tamp)q(er)h(with)g(recen)o(tly)h(acquired)g(pages)f(\()p=0A=
FE(last)p 1249 1980 V 17 w(free)p 1362 1980 V 16 w(pages[])p=0A=
FH(\).)206 2082 y(4.)22 b(Lea)o(v)o(e)15 b(dirt)o(y)g(pages)g(with)h=0A=
FE(map)p 806 2082 V 16 w(counts)f FB(>)g FH(1)g(alone.)206=0A=
2183 y(5.)22 b(Decremen)o(t)15 b(the)g FE(map)p 645 2183 V=0A=
17 w(count)f FH(of)h(clean)h(pages.)206 2285 y(6.)22 b(F)l(ree)15=0A=
b(clean)h(pages)f(if)h(they)f(are)g(unmapp)q(ed.)206 2387 y(7.)22=0A=
b(Sw)o(ap)15 b(dirt)o(y)g(pages)g(with)g(a)g FE(map)p 835 2387=0A=
V 17 w(count)f FH(of)h(1.)p eop=0A=
%%Page: 105 116=0A=
105 115 bop 150 -84 1800 3 v 150 -100 a FD(5.7.)42 b(The)18=0A=
b(page)g(fault)g(handlers)1067 b FH(105)221 88 y(Of)16 =
b(these)h(actions,)f=0A=
(6)g(and)h(7)f(will)i(stop)e(the)g(pro)q(cess)h(as)f(they)g(result)h(in)g=0A=
(the)g(actual)f(freeing)h(of)f(a)150 153 y(ph)o(ysical)h(page.)23=0A=
b(Action)17 =
b(5)e(results)i(in)g(one)f(of)g(the)g(pro)q(cesses)h(losing)g(an)=0A=
f(unshared)h(clean)g(page)f(that)150 217 y(w)o(as)11 b(not)h(accessed)h=0A=
(recen)o(tly)g(\(decremen)o(t)f Fw(Q)p FE(->rss)p FH(\))g(whic)o(h)h(is)g=0A=
(not)f(all)h(that)f(bad,)g(but)h(the)f(cum)o(ulativ)o(e)150=0A=
281 y(e\013ects)19 =
b(of)g(a)f(few)h(iterations)g(can)g(slo)o(w)f(do)o(wn)h(a)=0A=
f(pro)q(cess)h(considerably)l(.)32 b(A)o(t)19 =
b(presen)o(t,)g(there)g(are)f=0A=
(6)150 346 =
y(iterations,)d(so)g(a)g(page)g(shared)g(b)o(y)g(6)g(pro)q(cesses)=0A=
h(can)f(get)g(stolen)g(if)h(it)f(is)h(clean.)221 434 =
y(P)o(age)i(table)h(en)o=0A=
(tries)g(are)g(up)q(dated)g(and)g(the)g(TLB)g(in)o(v)m(alidated.)33=0A=
b FD([W)l(onder)22 b(ab)q(out)h(the)f(lat-)150 498 y(ter.)j(It)18=0A=
b(seems)e(unnecessary)i(since)g(accessed)f(pages)h(aren't)i(o\013ed)e(and=
)g=0A=
(there)g(is)g(a)g(w)o(alk)150 562 y(through)23 =
b(man)o(y)f(page)g(tables)i(b)=0A=
q(et)o(w)o(een)d(iterations)k FB(:)8 b(:)g(:)d FD(ma)o(y)22=0A=
b(b)q(e)g(in)h(case)g(an)f(in)o(terrupt)150 627 =
y(came)c(along)g(and)g(w)o=0A=
(an)o(ted)f(the)h(most)f(recen)o(tly)h(axed)g(page?])221 715=0A=
y FH(The)25 =
b(actual)h(w)o(ork)e(of)h(freeing)h(the)g(page)f(is)h(done)f(b)o=0A=
(y)h FE(free)p 1364 715 15 2 v 16 w(page\(\))p =
FH(,)h(the)e(complemen)o(t)h=0A=
(of)150 779 y FE(get)p 225 779 V 17 w(free)p 338 779 V 16 w(page\(\))p=0A=
FH(.)19 b(It)c(ignores)f(RESER)-5 b(VED)16 b(pages,)e(up)q(dates)h=0A=
FE(mem)p 1374 779 V 17 w(map)p FH(,)e(then)i(frees)g(the)f(page)h(and)150=0A=
843 y(up)q(dates)g(the)g FE(page)p 497 843 V 17 w(list)p =
FH(s)f(if)h(it)g(is)=0A=
h(unmapp)q(ed.)21 b(F)l(or)14 =
b(sw)o(apping)h(\(in)g(6)g(ab)q(o)o(v)o(e\),)f=0A=
FE(write)p 1681 843 V 16 w(swap)p 1793 843 V 17 w(page\(\))150=0A=
908 y FH(gets)h(called)h(and)g(do)q(es)f(nothing)h(remark)m(able)g(from)e=0A=
(the)i(memory)e(managemen)o(t)h(p)q(ersp)q(ectiv)o(e.)221 996=0A=
y(The)i(details)h(of)e FE(shrink)p 662 996 V 17 w(buffers\(\))g=0A=
FH(w)o(ould)h(tak)o(e)f(us)i(to)q(o)e(far)g(a\014eld.)27 =
b(Essen)o(tially)18=0A=
b(it)f(lo)q(oks)h(for)150 1060 =
y(free)d(bu\013ers,)h(then)g(writes)f(out)g=0A=
(dirt)o(y)g(bu\013ers,)h(then)g(go)q(es)f(at)g(busy)g(bu\013ers)h(and)g=0A=
(calls)g FE(free)p 1793 1060 V 17 w(page\(\))150 1124 y =
FH(when)g(its)f(able)=0A=
h(to)f(free)g(all)h(the)f(bu\013ers)h(on)f(a)g(page.)221 1212=0A=
y(Note)j(that)h(page)g(directories)h(and)f(page)g(tables)h(along)f(with)h=0A=
(RESER)-5 b(VED)20 b(pages)f(do)g(not)f(get)150 1276 y(sw)o(app)q(ed,)d=0A=
(stolen)h(or)f(aged.)20 =
b(They)c(are)f(mapp)q(ed)h(in)g(the)f(pro)q(cess)h=0A=
(page)f(directory)h(through)f(reserv)o(ed)150 1341 y(page)g(tables.)20=0A=
b(They)c(are)f(freed)g(only)h(on)f(exit)h(from)e(the)h(pro)q(cess.)150=0A=
1514 y Ft(5.7)70 b(The)22 b(page)h(fault)g(handlers)150 1647=0A=
y FH(When)16 =
b(a)g(pro)q(cess)g(is)g(created)g(via)g(fork,)f(it)h(starts)e=0A=
(out)i(with)g(a)f(page)h(directory)g(and)g(a)f(page)h(or)f(so)g(of)150=0A=
1711 y(the)g(executable.)21 b(So)16 b(the)f(page)g(fault)g(handler)i(is)e=0A=
(the)h(source)f(of)g(most)f(of)h(a)g(pro)q(cesses')g(memory)l(.)221=0A=
1799 y(The)e(page)g(fault)g(handler)h FE(do)p 734 1799 V 17=0A=
w(page)p 847 1799 V 16 w(fault\(\))e FH(retriev)o(es)h(the)g(faulting)h=0A=
(address)f(from)f(the)h(register)150 1864 y(cr2.)29 b(The)19=0A=
b(error)f(co)q(de)h(\(retriev)o(ed)g(in)g(sys)p 903 1864 14=0A=
2 v 16 =
w(call.S\))g(di\013eren)o(tiates)h(user/sup)q(ervisor)g(access)e(and)h=0A=
(the)150 1928 =
y(reason)j(for)g(the)h(fault)f(|)h(write)g(protection)g(or)f(a)=0A=
g(missing)h(page.)42 b(The)23 b(former)f(is)h(handled)h(b)o(y)150=0A=
1992 y FE(do)p 201 1992 15 2 v 17 w(wp)p 266 1992 V 17 w(page\(\))14=0A=
b FH(and)i(the)f(latter)g(b)o(y)g FE(do)p 843 1992 V 17 w(no)p=0A=
908 1992 V 17 w(page\(\))p FH(.)221 2080 y(If)21 =
b(the)h(faulting)g(address)f=0A=
(is)h(greater)e(than)h(T)l(ASK)p 1149 2080 14 2 v 18 w(SIZE)g(the)h(pro)q=0A=
(cess)f(receiv)o(es)h(a)f(SIGKILL.)150 2144 y =
FD([Wh)o(y)h(this)i(c)o(hec)o=0A=
(k?)37 b(This)24 =
b(can)f(only)g(happ)q(en)h(in)f(k)o(ernel)g(mo)q(de)g(b)q=0A=
(ecause)g(of)g(segmen)o(t)150 2209 y(lev)o(el)18 b(protection.])221=0A=
2297 y FH(These)c(routines)g(ha)o(v)o(e)g(some)f(subtleties)i(as)f(they)g=0A=
(can)g(get)f(called)j(from)d(an)h(in)o(terrupt.)19 b(Y)l(ou)c(can't)150=0A=
2361 y(assume)g(that)g(it)g(is)h(the)f(`curren)o(t')f(task)h(that)f(is)i=0A=
(executing.)221 2449 y FE(do)p 272 2449 15 2 v 16 w(no)p 336=0A=
2449 V 17 w(page\(\))f FH(handles)h(three)f(p)q(ossible)i(situations:)206=0A=
2554 y(1.)22 b(The)15 b(page)g(is)h(sw)o(app)q(ed.)p eop=0A=
%%Page: 106 117=0A=
106 116 bop 150 -84 1800 3 v 150 -100 a FD(5.8.)36 b(P)o(aging)1461=0A=
b FH(106)206 88 y(2.)22 b(The)15 =
b(page)g(b)q(elongs)h(to)f(the)g(executable)=0A=
i(or)d(a)h(shared)g(library)l(.)206 190 y(3.)22 b(The)15 b(page)g(is)h=0A=
(missing)g(|)g(a)e(data)h(page)g(that)g(has)g(not)f(b)q(een)j(allo)q(cate=
d.)=0A=
221 315 y(In)f(all)h(cases)e FE(get)p 531 315 15 2 v 17 w(empty)p=0A=
668 315 V 17 w(pgtable\(\))f =
FH(is)j(called)g(\014rst)e(to)h(ensure)g(the)g=0A=
(existence)h(of)e(a)h(page)g(table)150 380 y(that)e(co)o(v)o(ers)f(the)i=0A=
(faulting)g(address.)20 b(In)15 b(case)f(3)h FE(get)p 1071=0A=
380 V 16 w(empty)p 1207 380 V 17 w(page\(\))e FH(is)i(called)h(to)e(pro)o=0A=
(vide)h(a)f(page)h(at)150 444 =
y(the)g(required)i(address)e(and)g(in)h(case)f=0A=
(of)g(the)g(sw)o(app)q(ed)h(page,)f FE(swap)p 1339 444 V 16=0A=
w(in\(\))g FH(is)h(called.)221 532 =
y(In)d(case)g(2,)g(the)g(handler)h(calls)g=0A=
FE(share)p 878 532 V 17 w(page\(\))e FH(to)g(see)i(if)f(the)g(page)g(is)h=0A=
(shareable)f(with)h(some)e(other)150 596 y(pro)q(cess.)20 b(If)15=0A=
b(that)g(fails)h(it)f(reads)g(in)h(the)f(page)g(from)g(the)g(executable)h=
(or)=0A=
f(library)h(\(It)e(rep)q(eats)i(the)f(call)150 661 y(to)d FE(share)p=0A=
326 661 V 17 w(page\(\))f =
FH(in)j(case)f(another)f(pro)q(cess)h(did)h(the)f=0A=
(same)f(mean)o(while\).)20 b(An)o(y)13 b(p)q(ortion)g(of)f(the)h(page)150=0A=
725 y(b)q(ey)o(ond)j(the)f(brk)g(v)m(alue)i(is)e(zero)q(ed.)221=0A=
813 =
y(A)f(page)h(read)f(in)i(from)d(the)i(disk)g(is)g(coun)o(ted)g(as)f(a)h=0A=
(ma)s(jor)e(fault)h(\()p FE(maj)p 1445 813 V 17 w(flt)p FH(\).)19=0A=
b(This)c(happ)q(ens)h(with)150 877 y(a)h FE(swap)p 289 877=0A=
V 17 w(in\(\))f =
FH(or)h(when)h(it)f(is)h(read)f(from)g(the)g(executable)i(or)=0A=
d(a)h(library)l(.)27 b(Other)18 b(cases)f(are)g(deemed)150=0A=
942 y(minor)e(faults)h(\()p FE(min)p 500 942 V 16 w(flt)p FH(\).)221=0A=
1029 y(When)e(a)f(shareable)h(page)f(is)h(found,)g(it)g(is)g=0A=
(write-protected.)20 b(A)13 =
b(pro)q(cess)h(that)f(writes)h(to)f(a)g(shared)=0A=
150 1094 y(page)i(will)i(then)e(ha)o(v)o(e)g(to)g(go)f(through)h=0A=
FE(do)p 889 1094 V 17 w(wp)p 954 1094 V 17 w(page\(\))f =
FH(whic)o(h)i(do)q=0A=
(es)g(the)f(cop)o(y-on-write.)150 1206 y FE(do)p 201 1206 V=0A=
17 w(wp)p 266 1206 V 17 w(page\(\))f FH(do)q(es)i(the)f(follo)o(wing:)218=0A=
1332 y FG(\017)23 b FH(send)15 =
b(SIGSEGV)h(if)g(an)o(y)e(user)i(pro)q(cess)f=0A=
(is)h(writing)g(to)e(curren)o(t)h FE(code)p 1483 1332 V 17=0A=
w(space)p FH(.)218 1433 y FG(\017)23 b FH(If)15 b(the)g(old)h(page)f(is)h=0A=
(not)f(shared)g(then)h(just)e(unprotect)i(it.)264 1498 y(Else)i=0A=
FE(get)p 438 1498 V 17 w(free)p 551 1498 V 16 w(page\(\))f=0A=
FH(and)h FE(copy)p 915 1498 V 16 w(page\(\))p FH(.)27 b(The)18=0A=
b(page)f(acquires)h(the)g(dirt)o(y)g(\015ag)f(from)g(the)264=0A=
1562 y(old)e(page.)20 b(Decremen)o(t)15 =
b(the)g(map)g(coun)o(t)g(of)g(the)h=0A=
(old)f(page.)150 1739 y Ft(5.8)70 b(P)n(aging)150 1872 y FH(P)o(aging)16=0A=
b(is)g(sw)o(apping)g(on)g(a)g(page)g(basis)g(rather)f(than)h(b)o(y)g(en)o=0A=
(tire)g(pro)q(cesses.)23 b(W)l(e)16 b(will)h(use)g(sw)o(apping)150=0A=
1936 y(here)12 b(to)f(refer)h(to)f(paging,)h(since)h(Lin)o(ux)g(only)f=0A=
(pages,)g(and)g(do)q(es)g(not)f(sw)o(ap,)h(and)g(p)q(eople)h(are)e(more)g=0A=
(used)150 2001 y(to)17 b(the)h(w)o(ord)f(\\sw)o(ap")g(than)g(\\page.")27=0A=
b(Kernel)19 b(pages)f(are)f(nev)o(er)h(sw)o(app)q(ed.)28 b(Clean)18=0A=
b(pages)g(are)f(also)150 2065 y(not)f(written)g(to)g(sw)o(ap.)23=0A=
b(They)16 b(are)g(freed)h(and)f(reloaded)i(when)e(required.)25=0A=
b(The)16 b(sw)o(app)q(er)h(main)o(tains)150 2130 =
y(a)g(single)h(bit)g(of)f=0A=
(aging)g(info)h(in)g(the)f FE(PAGE)p 894 2130 V 17 w(ACCESSED)f=0A=
FH(bit)i(of)f(the)g(page)g(table)h(en)o(tries.)26 b FD([What)21=0A=
b(are)150 2194 y(the)d(main)o(tainance)h(details?)25 b(Ho)o(w)16=0A=
b(is)i(it)g(used?])221 2282 y =
FH(Lin)o(ux)j(supp)q(orts)f(m)o(ultiple)i(sw)o=0A=
(ap)e(\014les)h(or)e(devices)j(whic)o(h)f(ma)o(y)e(b)q(e)i(turned)g(on)f(=
or)f=0A=
(o\013)i(b)o(y)f(the)150 2346 y(sw)o(ap)q(on)25 b(and)g(sw)o(ap)q(o\013)g=0A=
(system)g(calls.)51 b(Eac)o(h)24 b(sw)o(ap\014le)i(or)f(device)h(is)g=0A=
(describ)q(ed)h(b)o(y)e(a)g FE(struct)150 2410 y(swap)p 249=0A=
2410 V 17 w(info)p 362 2410 V 16 w(struct)15 b FH(\(sw)o(ap.c\).)264=0A=
2528 y Fs(static)20 b(struct)h(swap_info_struct)d({)p eop=0A=
%%Page: 107 118=0A=
107 117 bop 150 -84 1800 3 v 150 -100 a FD(5.8.)42 b(P)o(aging)1455=0A=
b FH(107)394 88 y Fs(unsigned)21 b(long)f(flags;)394 145 =
y(struct)h(inode)g=0A=
(*)g(swap_file;)394 202 y(unsigned)g(int)g(swap_device;)394=0A=
259 y(unsigned)g(char)f(*)i(swap_map;)394 316 =
y(char)f(*)h(swap_lockmap;)394=0A=
372 y(int)g(lowest_bit;)394 429 y(int)g(highest_bit;)264 486=0A=
y(})f(swap_info[MAX_SWAP)o(FILES)o(];)221 611 y =
FH(The)d(\015ags)g(\014eld)i=0A=
(\()p FE(SWP)p 619 611 15 2 v 16 w(USED)e FH(or)g FE(SWP)p=0A=
880 611 V 17 w(WRITEOK)p =
FH(\))f(is)i(used)g(to)f(con)o(trol)g(access)g(to)g=0A=
(the)h(sw)o(ap)e(\014les.)150 675 y(When)h FE(SWP)p 360 675=0A=
V 16 w(WRITEOK)f =
FH(is)g(o\013)h(space)f(will)i(not)e(b)q(e)h(allo)q(cated)g=0A=
(in)g(that)f(\014le.)27 b(This)17 =
b(is)h(used)g(b)o(y)f(sw)o(ap)q(o\013)150=0A=
740 y(when)22 b(it)g(tries)g(to)f(un)o(use)h(a)g(\014le.)40=0A=
b(When)22 =
b(sw)o(ap)q(on)g(adds)g(a)f(new)h(sw)o(ap)f(\014le)i(it)f(sets)f=0A=
FE(SWP)p 1772 740 V 17 w(USED)p FH(.)g(A)150 804 y(static)d(v)m(ariable)i=0A=
FE(nr)p 502 804 V 17 w(swapfiles)d =
FH(stores)g(the)i(n)o(um)o(b)q(er)f(of)g=0A=
(curren)o(tly)h(activ)o(e)f(sw)o(ap)g(\014les.)30 b(The)19=0A=
b(\014elds)150 869 y FE(lowest)p 297 869 V 16 w(bit)c FH(and)h=0A=
FE(highest)p 657 869 V 16 w(bit)f =
FH(b)q(ound)h(the)f(free)g(region)h(in)g=0A=
(the)f(sw)o(ap)g(\014le)h(and)g(are)e(used)i(to)f(sp)q(eed)150=0A=
933 y(up)h(the)f(searc)o(h)g(for)g(free)g(sw)o(ap)f(space.)221=0A=
1021 =
y(The)k(user)h(program)e(mksw)o(ap)h(initializes)j(a)d(sw)o(ap)g(device)=0A=
i(or)e(\014le.)31 b(The)18 b(\014rst)g(page)h(con)o(tains)f(a)150=0A=
1085 y(signature)12 b(\(`)p FE(SWAP-SPACE)p =
FH('\))c(in)k(the)g(last)f(10)g=0A=
(b)o(ytes,)h(and)f(holds)h(a)f(bitmap.)19 b(Initially)14 =
b(0's)d(in)h(the)g=0A=
(bitmap)150 1149 y(signal)18 b(bad)f(pages.)25 b(A)17 b(`1')e(in)j(the)f=0A=
(bitmap)g(means)g(the)g(corresp)q(onding)h(page)f(is)g(free.)25=0A=
b(This)18 b(page)e(is)150 1214 y(nev)o(er)f(allo)q(cated)i(so)d(the)i=0A=
(initialization)i(needs)e(to)e(b)q(e)i(done)g(just)f(once.)221=0A=
1302 y(The)i(syscall)h FE(swapon\(\))e =
FH(is)i(called)g(b)o(y)f(the)h(user)f=0A=
(program)f(sw)o(ap)q(on)h(t)o(ypically)h(from)f(/etc/rc.)25=0A=
b(A)150 1366 y(couple)16 =
b(of)f(pages)g(of)g(memory)g(are)f(allo)q(cated)j=0A=
(for)d FE(swap)p 1132 1366 V 17 w(map)h FH(and)g FE(swap)p=0A=
1420 1366 V 17 w(lockmap)p FH(.)221 1454 y FE(swap)p 320 1454=0A=
V 16 w(map)f =
FH(holds)h(a)f(b)o(yte)g(for)g(eac)o(h)h(page)f(in)h(the)g(sw)o=0A=
(ap\014le.)20 b(It)14 b(is)h(initialized)j(from)13 =
b(the)i(bitmap)g(to)150=0A=
1518 =
y(con)o(tain)e(a)h(0)f(for)f(a)o(v)m(ailable)j(pages)e(and)h(128)e(for)h=0A=
(un)o(usable)i(pages.)k(It)13 =
b(is)h(used)g(to)e(main)o(tain)i(a)f(coun)o(t)g=0A=
(of)150 1583 =
y(sw)o(ap)j(requests)g(on)g(eac)o(h)h(page)f(in)h(the)g(sw)o(ap)=0A=
f(\014le.)24 b FE(swap)p 1157 1583 V 17 w(lockmap)15 b =
FH(holds)i(a)f(bit)h=0A=
(for)f(eac)o(h)g(page)h(that)150 1647 =
y(is)f(used)f(to)g(ensure)h(m)o(utual)f=0A=
(exclusion)i(when)f(reading)g(or)e(writing)i(sw)o(ap)f(\014les.)221=0A=
1735 =
y(When)f(a)f(page)h(of)f(memory)g(is)h(to)f(b)q(e)i(sw)o(app)q(ed)f(out)=0A=
f(an)h(index)h(to)e(the)g(sw)o(ap)h(lo)q(cation)g(is)g(obtained)150=0A=
1799 y(b)o(y)f(a)g(call)i(to)d FE(get)p 457 1799 V 17 w(swap)p=0A=
570 1799 V 17 w(page\(\))p FH(.)18 =
b(This)c(index)h(is)f(then)f(stored)g(in)h=0A=
(bits)g(1{31)e(of)h(the)g(page)h(table)f(en)o(try)150 1864=0A=
y(so)g(the)g(sw)o(app)q(ed)g(page)g(ma)o(y)f(b)q(e)i(lo)q(cated)f(b)o(y)g=0A=
(the)g(page)g(fault)g(handler,)i FE(do)p 1450 1864 V 16 w(no)p=0A=
1514 1864 V 17 w(page\(\))e FH(when)g(needed.)221 1951 y(The)18=0A=
b(upp)q(er)g(7)g(bits)g(of)f(the)h(index)h(giv)o(e)f(the)g(sw)o(ap\014le)=
g=0A=
(\(or)f(device\))h(and)g(the)g(lo)o(w)o(er)f(24)h(bits)g(giv)o(e)150=0A=
2016 y(the)g(page)h(n)o(um)o(b)q(er)f(on)h(that)e(device.)31=0A=
b(That)18 =
b(mak)o(es)g(as)g(man)o(y)g(as)g(128)f(sw)o(ap\014les,)i(eac)o(h)g=0A=
(with)g(ro)q(om)150 2080 =
y(for)c(ab)q(out)g(64)g(GB,)g(but)g(the)h(space)g(o)=0A=
o(v)o(erhead)f(due)h(to)e(the)i FE(swap)p 1301 2080 V 17 w(map)f=0A=
FH(w)o(ould)g(b)q(e)h(large.)21 b(Instead)16 b(the)150 2144=0A=
y(sw)o(ap\014le)g(size)g(is)g(limited)h(to)d(16)h(MB,)f(b)q(ecause)j(the)=
e=0A=
FE(swap)p 1170 2144 V 16 w(map)g FH(then)h(tak)o(es)e(1)h(page.)221=0A=
2232 y(The)h(function)h FE(swap)p 593 2232 V 17 w(duplicate\(\))d=0A=
FH(is)j(used)g(b)o(y)f FE(copy)p 1200 2232 V 17 w(page)p 1313=0A=
2232 V 16 w(tables\(\))g FH(to)f(let)i(a)f(c)o(hild)i(pro)q(cess)150=0A=
2297 y(inherit)f(sw)o(app)q(ed)f(pages)g(during)g(a)f(fork.)21=0A=
b(It)16 b(just)f(incremen)o(ts)i(the)e(coun)o(t)h(main)o(tained)g(in)h=0A=
FE(swap)p 1865 2297 V 16 w(map)150 2361 y FH(for)e(that)f(page.)20=0A=
b(Eac)o(h)15 =
b(pro)q(cess)g(will)i(sw)o(ap)e(in)h(a)f(separate)f(cop)o(y)h=0A=
(of)g(the)g(page)g(when)h(it)g(accesses)f(it.)221 2449 y FE(swap)p=0A=
320 2449 V 16 w(free\(\))g =
FH(decremen)o(ts)i(the)f(coun)o(t)g(main)o(tained)=0A=
h(in)g FE(swap)p 1325 2449 V 17 w(map)p FH(.)22 b(When)16 =
b(the)h(coun)o(t)f=0A=
(drops)g(to)150 2513 =
y(0)d(the)h(page)f(can)g(b)q(e)h(reallo)q(cated)h(b)o(y)=0A=
e FE(get)p 874 2513 V 17 w(swap)p 987 2513 V 16 w(page\(\))p=0A=
FH(.)19 b(It)13 =
b(is)h(called)h(eac)o(h)f(time)f(a)g(sw)o(app)q(ed)h(page)f=0A=
(is)p eop=0A=
%%Page: 108 119=0A=
108 118 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(108)150 88 y(read)13 =
b(in)o(to)g(memory)g=0A=
(\()p FE(swap)p 630 88 15 2 v 16 w(in\(\))p =
FH(\))f(or)h(when)h(a)e(page)h=0A=
(is)h(to)f(b)q(e)g(discarded)i(\()p FE(free)p 1554 88 V 16=0A=
w(one)p 1642 88 V 17 w(table\(\))p FH(,)d(etc.\).)150 266 y=0A=
Ft(5.9)70 b(80386)24 b(Memory)f(Mangamen)n(t)150 398 y FH(A)c(logical)h=0A=
(address)f(sp)q(eci\014ed)i(in)e(an)g(instruction)h(is)f(\014rst)g=0A=
(translated)f(to)h(a)f(linear)i(address)f(b)o(y)g(the)150 463=0A=
y(segmen)o(ting)f(hardw)o(are.)26 b(This)18 =
b(linear)g(address)g(is)g(then)g=0A=
(translated)f(to)g(a)g(ph)o(ysical)i(address)e(b)o(y)h(the)150=0A=
527 y(paging)d(unit.)150 680 y Fq(5.9.1)55 b(P)n(aging)20 =
b(on)e(the)h(386)=0A=
150 798 y =
FH(There)j(are)g(t)o(w)o(o)e(lev)o(els)j(of)e(indirection)j(in)f=0A=
(address)f(translation)g(b)o(y)f(the)h(paging)g(unit.)41 b(A)21=0A=
b FD(page)150 862 y(directory)g =
FH(con)o(tains)d(p)q(oin)o(ters)i(to)e(1024)f=0A=
(page)i(tables.)31 b(Eac)o(h)19 b FD(page)j(table)e =
FH(con)o(tains)e(p)q(oin)=0A=
o(ters)i(to)150 926 y(1024)14 b(pages.)19 b(The)c(register)g(CR3)g(con)o=0A=
(tains)g(the)g(ph)o(ysical)h(base)f(address)g(of)f(the)h(page)g(directory=
)g=0A=
(and)150 991 y(is)f(stored)e(as)h(part)f(of)h(the)g(TSS)g(in)h(the)f=0A=
FE(task)p 926 991 V 17 w(struct)f FH(and)h(is)g(therefore)g(loaded)h(on)f=0A=
(eac)o(h)g(task)f(switc)o(h.)150 1103 =
y(A)j(32-bit)h(Linear)g(address)f(is)h=0A=
(divided)h(as)e(follo)o(ws:)p 150 1109 1391 2 v 149 1174 2=0A=
65 v 175 1154 a(31)330 b(22)p 620 1174 V 49 w(21)g(12)p 1091=0A=
1174 V 49 w(11)g(0)p 1540 1174 V 150 1175 1391 2 v 149 1240=0A=
2 65 v 343 1220 a(DIR)p 620 1240 V 352 w(T)l(ABLE)p 1091 1240=0A=
V 291 w(OFFSET)p 1540 1240 V 150 1241 1391 2 v 150 1292 a(Ph)o(ysical)16=0A=
b(address)f(is)h(then)g(computed)f(\(in)h(hardw)o(are\))e(as:)p=0A=
150 1322 1005 2 v 149 1386 2 65 v 357 1367 a(CR3)h(+)h(DIR)p=0A=
620 1386 V 50 w(p)q(oin)o(ts)g(to)e(the)h(table)p 1017 1367=0A=
14 2 v 17 w(base.)p 1154 1386 2 65 v 150 1388 1005 2 v 149=0A=
1452 2 65 v 175 1433 a(table)p 276 1433 14 2 v 17 w(base)g(+)h(T)l(ABLE)p=0A=
620 1452 2 65 v 50 w(p)q(oin)o(ts)g(to)e(the)h(page)p 1010=0A=
1433 14 2 v 17 w(base.)p 1154 1452 2 65 v 150 1454 1005 2 v=0A=
149 1518 2 65 v 223 1499 a(ph)o(ysical)p 384 1499 14 2 v 18=0A=
w(address)g(=3D)p 620 1518 2 65 v 50 w(page)p 740 1499 14 2 v=0A=
16 w(base)h(+)f(OFFSET)p 1154 1518 2 65 v 150 1520 1005 2 v=0A=
221 1606 =
a(P)o(age)j(directories)h(\(page)g(tables\))g(are)f(page)h(aligned)h=0A=
(so)e(the)h(lo)o(w)o(er)f(12)h(bits)g(are)f(used)i(to)e(store)150=0A=
1671 =
y(useful)e(information)g(ab)q(out)f(the)g(page)g(table)h(\(page\))e(p)q=0A=
(oin)o(ted)i(to)f(b)o(y)g(the)g(en)o(try)l(.)150 1783 =
y(F)l(ormat)f(for)g(P)o=0A=
(age)h(directory)g(and)h(P)o(age)e(table)i(en)o(tries:)p 150=0A=
1798 1444 2 v 149 1862 2 65 v 175 1843 a(31)330 b(12)p 620=0A=
1862 V 49 w(11)30 b(9)p 768 1862 V 49 w(8)50 b(7)55 b(6)62=0A=
b(5)55 b(4)49 b(3)80 b(2)119 b(1)94 b(0)p 1592 1862 V 150 1864=0A=
1444 2 v 149 1928 2 65 v 276 1909 a(ADDRESS)p 620 1928 V 171=0A=
w(OS)p 768 1928 V 69 w(0)50 b(0)f(D)h(A)g(0)f(0)h(U/S)g(R/W)f(P)p=0A=
1592 1928 V 150 1930 1444 2 v 243 1992 a(D)h(1)15 =
b(means)g(page)g(is)g(dirt)=0A=
o(y)h(\(unde\014ned)g(for)f(page)g(directory)g(en)o(try\).)175=0A=
2056 y(R/W)50 b(0)15 b(means)g(readonly)g(for)g(user.)196 2121=0A=
y(U/S)50 b(1)15 b(means)g(user)g(page.)247 2185 y(P)50 b(1)15=0A=
b(means)g(page)g(is)g(presen)o(t)h(in)g(memory)l(.)244 2249=0A=
y(A)50 b(1)15 =
b(means)g(page)g(has)g(b)q(een)h(accessed)g(\(set)f(to)f(0)h(b)=0A=
o(y)g(aging\).)217 2314 y(OS)51 b(bits)15 =
b(can)h(b)q(e)f(used)h(for)f(LR)o=0A=
(U)h(etc,)f(and)g(are)g(de\014ned)h(b)o(y)f(the)h(OS.)150 2369=0A=
y(The)f(corresp)q(onding)i(de\014nitions)g(for)d(Lin)o(ux)j(are)d(in)i=0A=
FE(<linux/mm.h>)p FH(.)221 2456 y(When)h(a)h(page)f(is)h(sw)o(app)q(ed,)g=0A=
(bits)g(1{31)e(of)i(the)f(page)g(table)h(en)o(try)g(are)f(used)h(to)f(mar=
k)g=0A=
(where)g(a)150 2521 y(page)e(is)h(stored)f(in)h(sw)o(ap)e(\(bit)i(0)e(m)o=0A=
(ust)h(b)q(e)h(0\).)p eop=0A=
%%Page: 109 120=0A=
109 119 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(109)221 88 y(P)o(aging)19=0A=
b(is)g(enabled)i(b)o(y)f(setting)f(the)g(highest)h(bit)g(in)g(CR0.)33=0A=
b FD([in)23 b(head.S?])e FH(A)o(t)d(eac)o(h)i(stage)e(of)150=0A=
153 y(the)h(address)h(translation)f(access)h(p)q(ermissions)h(are)e(v)o=0A=
(eri\014ed)h(and)g(pages)f(not)g(presen)o(t)g(in)i(memory)150=0A=
217 y(and)14 b(protection)g(violations)h(result)f(in)h(page)f(faults.)19=0A=
b(The)14 b(fault)g(handler)h(\(in)g(memory)l(.c\))e(then)h(either)150=0A=
281 =
y(brings)i(in)g(a)f(new)g(page)g(or)g(un)o(writeprotects)g(a)g(page)g(or)=0A=
f(do)q(es)i(whatev)o(er)f(needs)h(to)e(b)q(e)i(done.)150 435=0A=
y Fq(P)n(age)j(F)-5 b(ault)19 b(handling)g(Information)218=0A=
547 y FG(\017)k FH(The)15 b(register)g(CR2)g(con)o(tains)h(the)f(linear)h=0A=
(address)g(that)e(caused)i(the)f(last)g(page)g(fault.)218 648=0A=
y FG(\017)23 b FH(P)o(age)14 =
b(F)l(ault)h(Error)g(Co)q(de)g(\(16)f(bits\):)p=0A=
264 665 952 2 v 263 729 2 65 v 289 710 a(bit)p 368 729 V 50=0A=
w(cleared)p 753 729 V 246 w(set)p 1214 729 V 264 731 952 2=0A=
v 264 741 V 263 805 2 65 v 305 786 a(0)p 368 805 V 66 =
w(page)h(not)g(presen)o=0A=
(t)p 753 805 V 54 w(page)h(lev)o(el)g(protection)p 1214 805=0A=
V 264 807 952 2 v 263 871 2 65 v 305 852 a(1)p 368 871 V 66=0A=
w(fault)f(due)h(to)f(read)p 753 871 V 49 w(fault)h(due)g(to)e(write)p=0A=
1214 871 V 264 873 952 2 v 263 937 2 65 v 305 918 a(2)p 368=0A=
937 V 66 w(sup)q(ervisor)i(mo)q(de)p 753 937 V 59 w(user)g(mo)q(de)p=0A=
1214 937 V 264 939 952 2 v 264 987 a(The)f(rest)g(are)g(unde\014ned.)21=0A=
b(These)16 b(are)f(extracted)g(in)h(sys)p 1271 987 14 2 v 16=0A=
w(call.S.)221 1135 y(The)g(T)l(ranslation)h(Lo)q(ok)m(aside)h(Bu\013er)g=0A=
(\(TLB\))e(is)h(a)g(hardw)o(are)f(cac)o(he)h(for)f(ph)o(ysical)i(addresse=
s)e=0A=
(of)150 1199 y(the)e(most)g(recen)o(tly)h(used)f(virtual)h(addresses.)20=0A=
b(When)15 =
b(a)f(virtual)h(address)f(is)h(translated)f(the)g(386)f(\014rst)150=0A=
1264 y(lo)q(oks)19 =
b(in)g(the)f(TLB)h(to)e(see)i(if)g(the)f(information)h(it)=0A=
f(needs)h(is)g(a)o(v)m(ailable.)31 b(If)19 =
b(not,)f(it)h(has)f(to)f(mak)o(e)h=0A=
(a)150 1328 =
y(couple)e(of)f(memory)g(references)h(to)f(get)f(at)h(the)g(page)=0A=
g(directory)h(and)f(then)h(the)f(page)g(table)h(b)q(efore)g(it)150=0A=
1393 y(can)g(actually)g(get)f(at)g(the)g(page.)21 b(Three)15=0A=
b(ph)o(ysical)i(memory)e(references)h(for)f(address)g(translation)h(for)1=
50=0A=
1457 y(ev)o(ery)f(logical)h(memory)f(reference)h(w)o(ould)g(kill)h(the)e=0A=
(system,)f(hence)j(the)e(TLB.)221 1545 =
y(The)h(TLB)g(is)h(\015ushed)g(if)g=0A=
(CR3)f(loaded)g(or)g(b)o(y)g(task)f(switc)o(h)i(that)e(c)o(hanges)h(CR0.)=
22=0A=
b(It)17 b(is)f(explicitly)150 1609 y(\015ushed)g(in)g(Lin)o(ux)h(b)o(y)e=0A=
(calling)i FE(invalidate\(\))c FH(whic)o(h)j(just)f(reloads)h(CR3.)150=0A=
1762 y Fq(5.9.2)55 b(Segmen)n(ts)17 b(in)i(the)f(80386)150=0A=
1879 y FH(Segmen)o(t)13 b(registers)h(are)f(used)h(in)g(address)g=0A=
(translation)f(to)g(generate)g(a)h(linear)g(address)g(from)f(a)g(logical)=
150=0A=
1944 y(\(virtual\))i(address.)264 2068 y Fs(linear)p 399 2068=0A=
V 14 w(address)20 b(=3D)i(segment)p 785 2068 V 14 w(base)f(+)h(logical)p=0A=
1106 2068 V 14 w(address)150 2192 y FH(The)15 =
b(linear)i(address)e(is)h(then)=0A=
f(translated)g(in)o(to)h(a)e(ph)o(ysical)j(address)e(b)o(y)g(the)h(paging=
)f=0A=
(hardw)o(are.)221 2279 y(Eac)o(h)f(segmen)o(t)g(in)h(the)g(system)f(is)h=0A=
(describ)q(ed)h(b)o(y)f(a)f(8)g(b)o(yte)h(segmen)o(t)f(descriptor)h(whic)=
o(h)=0A=
g(con)o(tains)150 2344 y(all)h(p)q(ertinen)o(t)g(information)g(\(base,)e=0A=
(limit,)i(t)o(yp)q(e,)f(privilege\).)150 2456 y =
FD(The)j(segmen)o(ts)e(are:)=0A=
150 2520 y(Regular)j(segmen)o(ts)p eop=0A=
%%Page: 110 121=0A=
110 120 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(110)218 88 y FG(\017)23 b=0A=
FH(co)q(de)15 b(and)h(data)e(segmen)o(ts)150 212 y =
FD(System)j(segmen)o(ts)=0A=
218 400 y FG(\017)23 b FH(\(TSS\))14 b(task)h(state)f(segmen)o(ts)218=0A=
501 y FG(\017)23 b FH(\(LDT\))14 b(lo)q(cal)i(descriptor)g(tables)150=0A=
649 y(Characteristics)f(of)g(system)g(segmen)o(ts:)218 772=0A=
y FG(\017)23 b FH(System)15 =
b(segmen)o(ts)f(are)h(task)g(sp)q(eci\014c.)218=0A=
873 y FG(\017)23 b FH(There)d(is)g(a)f(T)l(ask)h(State)f(Segmen)o(t)h=0A=
(\(TSS\))f(asso)q(ciated)h(with)g(eac)o(h)g(task)f(in)i(the)f(system.)33=0A=
b(It)264 938 y(con)o(tains)13 b(the)h FE(tss)p 592 938 15 2=0A=
v 16 w(struct)f FH(\(sc)o(hed.h\).)19 b(The)13 =
b(size)i(of)e(the)g(segmen)o=0A=
(t)g(is)h(that)f(of)g(the)g FE(tss)p 1793 938 V 17 w(struct)264=0A=
1002 y FH(excluding)20 b(the)f FE(i387)p 651 1002 V 17 w(union)f=0A=
FH(\(232)f(b)o(ytes\).)30 b(It)19 =
b(con)o(tains)g(all)g(the)g(information)g=0A=
(necessary)g(to)264 1066 y(restart)14 b(the)h(task.)218 1168=0A=
y FG(\017)23 b FH(The)17 b(LDT's)f(con)o(tain)h(regular)g(segmen)o(t)f=0A=
(descriptors)h(that)f(are)h(priv)m(ate)g(to)f(a)h(task.)23=0A=
b(In)18 b(Lin)o(ux)264 1232 y(there)13 =
b(is)g(one)g(LDT)g(p)q(er)g(task.)18=0A=
b(There)13 =
b(is)h(ro)q(om)e(for)g(32)g(descriptors)i(in)f(the)g(lin)o(ux)i=0A=
FE(task)p 1781 1232 V 16 w(struct)p FH(.)264 1296 y(The)j(normal)g(LDT)f=0A=
(generated)h(b)o(y)g(Lin)o(ux)h(has)f(a)f(size)i(of)e(24)h(b)o(ytes,)g(he=
nce)=0A=
g(ro)q(om)g(for)f(only)h(3)264 1361 y(en)o(tries)d(as)g(ab)q(o)o(v)o(e.)k=0A=
(Its)d(con)o(ten)o(ts)e(are:)315 1462 y FD({)23 b FH(LDT[0])14=0A=
b(Null)i(\(mandatory\))315 1542 y FD({)23 b FH(LDT[1])14 =
b(user)h(co)q(de)h=0A=
(segmen)o(t)f(descriptor.)315 1622 y FD({)23 b FH(LDT[2])14=0A=
b(user)h(data/stac)o(k)f(segmen)o(t)g(descriptor.)218 1723=0A=
y FG(\017)23 b FH(The)17 =
b(user)g(segmen)o(ts)g(all)h(ha)o(v)o(e)e(base=3D0x00)=0A=
h(so)g(that)f(the)h(linear)i(address)e(is)g(the)g(same)g(as)g(the)264=0A=
1788 y(logical)f(address.)221 1911 =
y(T)l(o)f(k)o(eep)i(trac)o(k)e(of)g(all)i=0A=
(these)f(segmen)o(ts,)g(the)g(386)f(uses)h(a)g(global)g(descriptor)h(tabl=
e)f=0A=
(\(GDT\))f(that)150 1976 y(is)22 b(setup)g(in)h(memory)e(b)o(y)h(the)f=0A=
(system)h(\(lo)q(cated)g(b)o(y)f(the)h(GDT)f(register\).)39=0A=
b(The)22 b(GDT)f(con)o(tains)150 2040 =
y(a)f(segmen)o(t)g(descriptors)h(for)f=0A=
(eac)o(h)g(task)g(state)f(segmen)o(t,)i(eac)o(h)g(lo)q(cal)g(descriptor)g=0A=
(tablet)f(and)h(also)150 2104 y(regular)15 b(segmen)o(ts.)20=0A=
b(The)15 =
b(Lin)o(ux)i(GDT)d(con)o(tains)h(just)g(t)o(w)o(o)f(normal)h(segmen)=0A=
o(t)g(en)o(tries:)218 2228 y FG(\017)23 b FH(GDT[0])13 =
b(is)j(the)f(n)o(ull)i=0A=
(descriptor.)218 2329 y FG(\017)23 b FH(GDT[1])13 =
b(is)j(the)f(k)o(ernel)h=0A=
(co)q(de)g(segmen)o(t)e(descriptor.)218 2430 y FG(\017)23 b=0A=
FH(GDT[2])13 b(is)j(the)f(k)o(ernel)h(data/stac)o(k)d(segmen)o(t)i=0A=
(descriptor.)150 2554 =
y(The)g(rest)g(of)g(the)g(GDT)g(is)g(\014lled)i(with)f=0A=
(TSS)f(and)h(LDT)f(system)g(descriptors:)p eop=0A=
%%Page: 111 122=0A=
111 121 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(111)218 88 y FG(\017)23 b=0A=
FH(GDT[3])13 b(???)218 185 y FG(\017)23 b FH(GDT[4])13 =
b(=3D)i(TSS0,)g(GDT[5])f=0A=
(=3D)h(LDT0,)218 283 y FG(\017)23 b FH(GDT[6])13 =
b(=3D)i(TSS1,)g(GDT[7])f(=3D)h=0A=
(LDT1)218 380 y FG(\017)23 b FB(:)8 b(:)g(:)d FH(etc)15 b FB(:)8=0A=
b(:)g(:)150 493 y FD(Note)18 b(LDT[n])h(!=3D)e(LDTn)218 607 y=0A=
FG(\017)23 b FH(LDT[n])14 =
b(=3D)i(the)f(n)o(th)g(descriptor)h(in)g(the)f(LDT)g=0A=
(of)g(the)g(curren)o(t)g(task.)218 704 y FG(\017)23 b FH(LDTn)15=0A=
b(=3D)h(a)e(descriptor)i(in)g(the)f(GDT)g(for)f(the)i(LDT)f(of)f(the)i(n)=
o(th)f=0A=
(task.)221 818 =
y(A)o(t)h(presen)o(t)g(the)h(GDT)f(has)g(a)g(total)g(of)h(256)=0A=
e(en)o(tries)i(or)f(ro)q(om)g(for)g(as)g(man)o(y)h(as)f(126)f(tasks.)24=0A=
b(The)150 882 y(k)o(ernel)19 =
b(segmen)o(ts)f(ha)o(v)o(e)g(base)g(0xc0000000)f=0A=
(whic)o(h)i(is)g(where)f(the)h(k)o(ernel)g(liv)o(es)h(in)f(the)f(linear)i=0A=
(view.)150 946 =
y(Before)g(a)g(segmen)o(t)g(can)h(b)q(e)g(used,)h(the)e(con)o=0A=
(ten)o(ts)g(of)g(the)g(descriptor)h(for)f(that)g(segmen)o(t)f(m)o(ust)h(b=
)q=0A=
(e)150 1011 y(loaded)c(in)o(to)f(the)g(segmen)o(t)g(register.)20=0A=
b(The)15 b(386)g(has)g(a)g(complex)h(set)e(of)h(criteria)h(regarding)f=0A=
(access)h(to)150 1075 =
y(segmen)o(ts)e(so)g(y)o(ou)g(can't)g(simply)i(load)f=0A=
(a)f(descriptor)h(in)o(to)g(a)f(segmen)o(t)g(register.)20 b(Also)15=0A=
b(these)f(segmen)o(t)150 1139 =
y(registers)i(ha)o(v)o(e)g(programmer)f(in)o=0A=
(visible)k(p)q(ortions.)24 b(The)16 =
b(visible)j(p)q(ortion)d(is)h(what)f(is)h=0A=
(usually)g(called)150 1204 =
y(a)e(segmen)o(t)g(register:)k(cs,)c(ds,)g(es,)g=0A=
(fs,)g(gs,)f(and)i(ss.)221 1292 y(The)g(programmer)f(loads)h(one)g(of)f=0A=
(these)i(registers)f(with)g(a)g(16-bit)g(v)m(alue)h(called)g(a)f(selector=
.)23=0A=
b(The)150 1356 y(selector)c(uniquely)h(iden)o(ti\014es)g(a)e(segmen)o(t)g=0A=
(descriptor)h(in)g(one)f(of)g(the)g(tables.)30 b(Access)19=0A=
b(is)f(v)m(alidated)150 1420 =
y(and)d(the)h(corresp)q(onding)g(descriptor)f=0A=
(loaded)h(b)o(y)g(the)f(hardw)o(are.)221 1508 y(Curren)o(tly)e(Lin)o(ux)h=0A=
(largely)g(ignores)g(the)f(\(o)o(v)o(erly?\))19 b(complex)14=0A=
b(segmen)o(t)f(lev)o(el)h(protection)g(a\013orded)150 1572=0A=
y(b)o(y)h(the)g(386.)k(It)c(is)h(biased)g(to)o(w)o(ards)e(the)h(paging)g=0A=
(hardw)o(are)g(and)g(the)g(asso)q(ciated)h(page)f(lev)o(el)h(protec-)150=0A=
1637 y(tion.)k(The)c(segmen)o(t)e(lev)o(el)j(rules)f(that)e(apply)i(to)f=0A=
(user)g(pro)q(cesses)h(are)206 1750 y(1.)22 b(A)15 =
b(pro)q(cess)g(cannot)g=0A=
(directly)i(access)e(the)g(k)o(ernel)h(data)f(or)g(co)q(de)g(segmen)o(ts)=
206=0A=
1847 y(2.)22 b(There)17 =
b(is)g(alw)o(a)o(ys)f(limit)j(c)o(hec)o(king)f(but)f=0A=
(giv)o(en)g(that)f(ev)o(ery)h(user)g(segmen)o(t)g(go)q(es)f(from)h(0x00)f=
(to)=0A=
264 1912 y(0xc0000000)j(it)i(is)h(unlik)o(ely)h(to)e(apply)l(.)39=0A=
b FD([This)25 b(has)g(c)o(hanged,)i(and)e(needs)e(up)q(dating,)264=0A=
1976 y(please.])150 2127 y Fq(5.9.3)55 b(Selectors)17 =
b(in)i(the)f(80386)150=0A=
2245 y FH(A)13 =
b(segmen)o(t)f(selector)h(is)g(loaded)g(in)o(to)f(a)h(segmen)o=0A=
(t)f(register)g(\(cs,)h(ds,)g(etc.\))18 b(to)12 =
b(select)h(one)g(of)f(the)h=0A=
(regular)150 2309 y(segmen)o(ts)i(in)h(the)f(system)g(as)g(the)g(one)g=0A=
(addressed)h(via)f(that)g(segmen)o(t)g(register.)150 2397 y(Segmen)o(t)g=0A=
(selector)h(F)l(ormat:)p 150 2411 852 2 v 149 2476 2 65 v 175=0A=
2456 a(15)480 b(3)p 747 2476 V 49 w(2)15 b(1)p 858 2476 V 85=0A=
w(0)p 1001 2476 V 150 2477 852 2 v 149 2542 2 65 v 395 2522=0A=
a(index)p 747 2542 V 278 w(TI)p 858 2542 V 56 w(RPL)p 1001=0A=
2542 V 150 2543 852 2 v eop=0A=
%%Page: 112 123=0A=
112 122 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(112)150 88 y FD(TI)23 b FH(T)l(able)16=0A=
b(indicator:)264 153 y(0)f(means)g(selector)g(indexes)i(in)o(to)e(GDT)264=0A=
217 y(1)g(means)g(selector)g(indexes)i(in)o(to)e(LDT)150 319=0A=
y FD(RPL)23 b FH(Priv)o(elege)16 b(lev)o(el.)22 b(Lin)o(ux)16=0A=
b(uses)f(only)h(t)o(w)o(o)e(priv)o(elege)j(lev)o(els.)264 383=0A=
y(0)e(means)g(k)o(ernel)264 448 y(3)g(means)g(user)150 573=0A=
y FD(Examples:)150 698 y(Kernel)j(co)q(de)h(segmen)o(t)264=0A=
762 y =
FH(TI=3D0,)c(index=3D1,)h(RPL=3D0,)g(therefore)e(selector)i(=3D)g(0x08)e=0A=
(\(GDT[1]\))150 864 y FD(User)k(data)g(segmen)o(t)264 928 y=0A=
FH(TI=3D1,)d(index=3D2,)h(RPL=3D3,)g(therefore)e(selector)i(=3D)g(0x17)e(=
\(LDT[2]\))=0A=
150 1054 y(Selectors)i(used)g(in)g(Lin)o(ux:)p 150 1059 1258=0A=
2 v 149 1124 2 65 v 175 1104 a FD(TI)p 255 1124 V 50 w(index)p=0A=
429 1124 V 50 w(RPL)p 585 1124 V 50 w(selector)p 809 1124 V=0A=
51 w(segmen)o(t)p 1206 1124 V 1407 1124 V 150 1125 1258 2 v=0A=
149 1190 2 65 v 192 1170 a FH(0)p 255 1190 V 66 w(1)p 429 1190=0A=
V 151 w(0)p 585 1190 V 133 w(0x08)p 809 1190 V 131 =
w(k)o(ernel)g(co)q(de)p=0A=
1206 1190 V 173 w(GDT[1])p 1407 1190 V 150 1191 1258 2 v 149=0A=
1256 2 65 v 192 1236 a(0)p 255 1256 V 66 w(2)p 429 1256 V 151=0A=
w(0)p 585 1256 V 133 w(0x10)p 809 1256 V 131 =
w(k)o(ernel)g(data/stac)o(k)p=0A=
1206 1256 V 48 w(GDT[2])p 1407 1256 V 150 1257 1258 2 v 149=0A=
1322 2 65 v 192 1303 a(0)p 255 1322 V 66 w(3)p 429 1322 V 151=0A=
w(0)p 585 1322 V 133 w(???)p 809 1322 V 161 w(???)p 1206 1322=0A=
V 333 w(GDT[3])p 1407 1322 V 150 1323 1258 2 v 149 1388 2 65=0A=
v 192 1369 a(1)p 255 1388 V 66 w(1)p 429 1388 V 151 w(3)p 585=0A=
1388 V 133 w(0x0F)p 809 1388 V 124 w(user)f(co)q(de)p 1206=0A=
1388 V 211 w(LDT[1])p 1407 1388 V 150 1389 1258 2 v 149 1454=0A=
2 65 v 192 1435 a(1)p 255 1454 V 66 w(2)p 429 1454 V 151 w(3)p=0A=
585 1454 V 133 w(0x17)p 809 1454 V 131 w(user)g(data/stac)o(k)p=0A=
1206 1454 V 86 w(LDT[2])p 1407 1454 V 150 1456 1258 2 v 150=0A=
1504 a(Selectors)h(for)f(system)f(segmen)o(ts)h(are)g(not)g(to)g(b)q(e)h=0A=
(loaded)g(directly)g(in)o(to)g(segmen)o(t)f(registers.)20 b(Instead)150=0A=
1581 y(one)15 b(m)o(ust)g(load)g(the)h(TR)f(or)g(LDTR.)150=0A=
1693 y(On)h(en)o(try)f(in)o(to)g(syscall:)218 1818 y FG(\017)23=0A=
b FH(ds)15 =
b(and)g(es)h(are)f(set)f(to)h(the)g(k)o(ernel)h(data)f(segmen)o(t)=0A=
g(\(0x10\))218 1920 y FG(\017)23 b =
FH(fs)c(is)h(set)f(to)g(the)g(user)h(data)=0A=
e(segmen)o(t)h(\(0x17\))f(and)i(is)g(used)g(to)f(access)g(data)g(p)q(oin)=
o=0A=
(ted)h(to)f(b)o(y)264 1985 y(argumen)o(ts)14 =
b(to)h(the)g(system)g(call.)218=0A=
2086 y FG(\017)23 b FH(The)14 =
b(stac)o(k)f(segmen)o(t)h(and)g(p)q(oin)o(ter)g=0A=
(are)g(automatically)h(set)e(to)h(ss0)f(and)i(esp0)f(b)o(y)g(the)g(in)o=0A=
(terrupt)264 2151 y(and)h(the)g(old)h(v)m(alues)g(restored)f(when)h(the)f=0A=
(syscall)h(returns.)150 2304 y Fq(5.9.4)55 b(Segmen)n(t)17=0A=
b(descriptors)150 2421 y =
FH(There)k(is)h(a)e(segmen)o(t)h(descriptor)g(used)g=0A=
(to)g(describ)q(e)h(eac)o(h)f(segmen)o(t)g(in)h(the)f(system.)36=0A=
b(There)21 b(are)150 2486 y(regular)15 b(descriptors)g(and)f(system)h=0A=
(descriptors.)20 b(Here's)14 =
b(a)g(descriptor)h(in)h(all)f(its)g(glory)l(.)20=0A=
b(The)15 b(strange)p eop=0A=
%%Page: 113 124=0A=
113 123 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(113)150 88 y(format)14 =
b(is)i(essen)o(tally)=0A=
g(to)e(main)o(tain)i(compatibilit)o(y)h(with)e(the)g(286.)k(Note)c(that)g=
(it)=0A=
g(tak)o(es)g(8)g(b)o(ytes.)p 150 103 1778 2 v 149 160 2 57=0A=
v 175 143 a Fj(63{54)p 303 160 V 48 w(55)p 394 160 V 50 w(54)p=0A=
485 160 V 49 w(53)p 577 160 V 49 w(52)p 668 160 V 50 w(51{48)p=0A=
822 160 V 48 w(47)p 913 160 V 72 w(46)p 1049 160 V 71 w(45)p=0A=
1140 160 V 57 w(44{40)p 1307 160 V 129 w(39{16)p 1609 160 V=0A=
215 w(15{0)p 1926 160 V 150 161 1778 2 v 149 218 2 57 v 184=0A=
201 a(Base)p 303 218 V 65 w(G)p 394 218 V 59 w(D)p 485 218=0A=
V 60 w(R)p 577 218 V 60 w(U)p 668 218 V 57 w(Limit)p 822 218=0A=
V 56 w(P)p 913 218 V 57 w(DPL)p 1049 218 V 59 w(S)p 1140 218=0A=
V 59 w(TYPE)p 1307 218 V 50 w(Segmen)o(t)e(Base)p 1609 218=0A=
V 51 w(Segmen)o(t)g(Limit)p 1926 218 V 149 275 V 175 258 a(31{24)p=0A=
303 275 V 394 275 V 485 275 V 577 275 V 668 275 V 414 w(19{16)p=0A=
822 275 V 913 275 V 1049 275 V 1140 275 V 1307 275 V 619 w(23{0)p=0A=
1609 275 V 225 w(15{0)p 1926 275 V 150 277 1778 2 v 150 373=0A=
a FD(Explanation:)253 431 y(R)50 b FH(reserv)o(ed)15 b(\(0\))185=0A=
496 y FD(DPL)50 b FH(0)15 b(means)g(k)o(ernel,)g(3)g(means)g(user)251=0A=
560 y FD(G)50 b FH(1)15 =
b(means)g(4K)g(gran)o(ularit)o(y)g(\(Alw)o(a)o(ys)f=0A=
(set)h(in)h(Lin)o(ux\))252 624 y FD(D)50 b FH(1)15 =
b(means)g(default)g(op)q=0A=
(erand)h(size)g(32bits)252 689 y FD(U)50 b FH(programmer)14=0A=
b(de\014nable)256 753 y FD(P)50 b FH(1)15 =
b(means)g(presen)o(t)g(in)h(ph)o=0A=
(ysical)g(memory)263 817 y FD(S)50 b FH(0)15 =
b(means)g(system)f(segmen)o(t,)h=0A=
(1)g(means)g(normal)g(co)q(de)h(or)e(data)h(segmen)o(t.)175=0A=
882 y FD(T)o(yp)q(e)50 b FH(There)15 =
b(are)g(man)o(y)g(p)q(ossibilities.)23=0A=
b(In)o(terpreted)15 b(di\013eren)o(tly)j(for)c(system)h(and)g(normal)g=0A=
(descriptors.)150 985 y FD(Lin)o(ux)j(system)e(descriptors:)150=0A=
1050 y =
FH(TSS:)f(P=3D1,)g(DPL=3D0,)g(S=3D0,)g(t)o(yp)q(e=3D9,)g(limit)i(=3D)e(23=
1)f(ro)=0A=
q(om)h(for)f(1)h FE(tss)p 1384 1050 15 2 v 17 w(struct)p FH(.)150=0A=
1114 =
y(LDT:)g(P=3D1,)g(DPL=3D0,)f(S=3D0,)i(t)o(yp)q(e=3D2,)f(limit)h(=3D)g(23)=
e(ro)q=0A=
(om)h(for)f(3)h(segmen)o(t)g(descriptors.)150 1178 =
y(The)g(base)h(is)f(set)g=0A=
(during)h FE(fork\(\))p =
FH(.)j(There)d(is)g(a)e(TSS)i(and)f(LDT)g(for)g(eac)o=0A=
(h)g(task.)150 1291 y FD(Lin)o(ux)j(regular)h(k)o(ernel)f(descriptors:)k=0A=
FH(\(head.S\))150 1355 y(co)q(de:)e(P=3D1,)15 =
b(DPL=3D0,)g(S=3D1,)g(G=3D1,)g(D=3D1,)f=0A=
(t)o(yp)q(e=3Da,)h(base=3D0xc0000000,)f(limit=3D0x3\013\013)150 1420=0A=
y(data:)19 =
b(P=3D1,)c(DPL=3D0,)g(S=3D1,)g(G=3D1,)g(D=3D1,)f(t)o(yp)q(e=3D2,)h=0A=
(base=3D0xc0000000,)e(limit=3D0x3\013\013)150 1597 y FD(The)18=0A=
b(LDT)g(for)g(task[0])h(con)o(tains:)i FH(\(sc)o(hed.h\))150=0A=
1661 y(co)q(de:)f(P=3D1,)15 =
b(DPL=3D3,)g(S=3D1,)g(G=3D1,)g(D=3D1,)f(t)o(yp)q(e=3Da,)h=0A=
(base=3D0xc0000000,)f(limit=3D0x9f)150 1726 y(data:)19 =
b(P=3D1,)c(DPL=3D3,)g(S=3D1,)g=0A=
(G=3D1,)g(D=3D1,)f(t)o(yp)q(e=3D2,)h(base=3D0xc0000000,)e(limit=3D0x9f)15=
0=0A=
1903 y FD(The)18 b(default)g(LDT)h(for)f(the)g(remaining)h(tasks:)h=0A=
FH(\()p FE(exec\(\))p FH(\))150 1967 y(co)q(de:)g(P=3D1,)15 =
b(DPL=3D3,)g(S=3D1,)g=0A=
(G=3D1,)g(D=3D1,)f(t)o(yp)q(e=3Da,)h(base=3D0,)g(limit=3D)i(0xb\013\013)1=
50=0A=
2031 =
y(data:)i(P=3D1,)c(DPL=3D3,)g(S=3D1,)g(G=3D1,)g(D=3D1,)f(t)o(yp)q(e=3D2,)=
h(base=3D0,)g=0A=
(limit=3D)i(0xb\013\013)221 2209 =
y(The)e(size)h(of)f(the)g(k)o(ernel)h(segmen)o=0A=
(ts)e(is)i(0x40000)d(pages)i(\(4KB)g(pages)g(since)i(G=3D1)e(=3D)g(1)g(Gi=
gab)o=0A=
(yte.)150 2273 =
y(The)j(t)o(yp)q(e)g(implies)i(that)e(the)g(p)q(ermissions)h=0A=
(on)f(the)g(co)q(de)h(segmen)o(t)e(is)i(read-exec)f(and)h(on)f(the)g(data=
)150=0A=
2337 y(segmen)o(t)d(is)g(read-write.)150 2450 y =
FD(Registers)i(asso)q(ciated)=0A=
g(with)f(segmen)o(tation.)21 b FH(F)l(ormat)13 =
b(of)g(segmen)o(t)g(register:)=0A=
19 b(\(Only)c(the)f(selec-)150 2514 y(tor)g(is)i(programmer)e(visible\))p=0A=
eop=0A=
%%Page: 114 125=0A=
114 124 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(114)p 150 44 1180 2 v 149=0A=
109 2 65 v 192 89 a(16-bit)p 348 109 V 191 w(32-bit)p 765 109=0A=
V 252 w(32-bit)p 1084 109 V 1329 109 V 150 110 1180 2 v 149=0A=
175 2 65 v 175 155 a(selector)p 348 175 V 50 w(ph)o(ysical)17=0A=
b(base)e(addr)p 765 175 V 50 w(segmen)o(t)f(limit)p 1084 175=0A=
V 52 w(attributes)p 1329 175 V 150 176 1180 2 v 150 224 =
a(The)k(in)o(visible)=0A=
j(p)q(ortion)d(of)f(the)h(segmen)o(t)f(register)h(is)h(more)e(con)o(v)o=0A=
(enien)o(tly)i(view)o(ed)g(in)f(terms)f(of)h(the)150 300 =
y(format)f(used)i=0A=
(in)g(the)g(descriptor)f(table)h(en)o(tries)g(that)f(the)g(programmer)f(s=
ets)=0A=
h(up.)30 b(The)19 b(descriptor)150 364 =
y(tables)f(ha)o(v)o(e)g(registers)g=0A=
(asso)q(ciated)g(with)g(them)g(that)f(are)h(used)h(to)e(lo)q(cate)h(them)=
g=0A=
(in)h(memory)l(.)28 b(The)150 429 y(GDTR)19 b(\(and)f(IDTR\))h(are)g=0A=
(initialized)j(at)c(startup)h(once)g(the)g(tables)g(are)g(de\014ned.)32=0A=
b(The)19 b(LDTR)g(is)150 493 =
y(loaded)d(on)f(eac)o(h)g(task)g(switc)o(h.)150=0A=
605 y FD(F)l(ormat)j(of)f(GDTR)i(\(and)f(IDTR\):)p 150 622=0A=
642 2 v 149 686 2 65 v 275 667 a FH(32-bits)p 533 686 V 187=0A=
w(16-bits)p 790 686 V 150 688 642 2 v 149 752 2 65 v 175 733=0A=
a(Linear)e(base)f(addr)p 533 752 V 50 w(table)h(limit)p 790=0A=
752 V 150 754 642 2 v 221 837 a(The)21 b(TR)g(and)f(LDTR)i(are)e(loaded)i=0A=
(from)e(the)g(GDT)g(and)h(so)g(ha)o(v)o(e)f(the)h(format)e(of)i(the)f(oth=
er)=0A=
150 901 y(segmen)o(t)11 b(registers.)18 b(The)12 =
b(task)f(register)g(\(TR\))g=0A=
(con)o(tains)g(the)h(descriptor)g(for)f(the)g(curren)o(tly)h(executing)15=
0=0A=
965 y(task's)j(TSS.)h(The)g(execution)h(of)f(a)g(jump)g(to)f(a)h(TSS)g=0A=
(selector)h(causes)f(the)g(state)f(to)h(b)q(e)g(sa)o(v)o(ed)g(in)h(the)15=
0=0A=
1030 =
y(old)f(TSS,)g(the)g(TR)g(is)g(loaded)g(with)g(the)g(new)g(descriptor)g=0A=
(and)g(the)g(registers)f(are)h(restored)f(from)g(the)150 1094=0A=
y(new)i(TSS.)g(This)h(is)f(the)g(pro)q(cess)g(used)h(b)o(y)f(sc)o(hedule)=
h=0A=
(to)f(switc)o(h)g(to)f(v)m(arious)i(user)f(tasks.)24 b(Note)17=0A=
b(that)150 1158 y(the)g(\014eld)i FE(tss)p 406 1158 15 2 v=0A=
17 w(struct.ldt)d FH(con)o(tains)h(a)g(selector)h(for)e(the)i(LDT)f(of)g=0A=
(that)f(task.)26 b(It)17 b(is)h(used)g(to)f(load)150 1223 y(the)e(LDTR.)g=0A=
(\(sc)o(hed.h\))150 1376 y Fq(5.9.5)55 b(Macros)19 =
b(used)g(in)f(setting)g=0A=
(up)h(descriptors)150 1493 y FH(Some)f(assem)o(bler)g(macros)e(are)i=0A=
(de\014ned)h(in)f(sc)o(hed.h)g(and)g(system.h)f(to)g(ease)h(access)g(and)=
g=0A=
(setting)f(of)150 1557 y(descriptors.)j(Eac)o(h)15 =
b(TSS)h(en)o(try)f(and)g=0A=
(LDT)g(en)o(try)g(tak)o(es)f(8)h(b)o(ytes.)150 1669 y FD(Manipulating)20=0A=
b(GDT)e(system)e(descriptors:)218 1790 y FG(\017)p 267 1790=0A=
V 40 w FE(TSS\(n\))p FH(,)p 264 1855 V 278 1855 a FE(LDT\(n\))e=0A=
FH(These)i(pro)o(vide)g(the)f(index)h(in)o(to)g(the)f(GDT)f(for)h(the)g(n=
'th)=0A=
g(task.)218 1955 y FG(\017)p 267 1955 V 40 w FE(LDT\(n\))f=0A=
FH(is)i(stored)f(in)h(the)f(the)g(ldt)h(\014eld)g(of)f(the)g=0A=
FE(tss)p 1205 1955 V 17 w(struct)g FH(b)o(y)g(fork.)218 2056=0A=
y FG(\017)p 267 2056 V 40 w FE(set)p 356 2056 V 17 w(tssldt)p=0A=
517 2056 V 16 w(desc\(n,)23 b(addr,)g(limit,)g(type\))264 2120=0A=
y(ulong)g(*n)c FH(p)q(oin)o(ts)h(to)e(the)i(GDT)e(en)o(try)h(to)g(set)g=0A=
(\(see)g(fork.c\).)31 b(The)20 b(segmen)o(t)f(base)g(\(TSS)g(or)264=0A=
2184 y(LDT\))d(is)h(set)g(to)f(0xc0000000)f(+)i FE(addr)p FH(.)24=0A=
b(Sp)q(eci\014c)19 =
b(instances)f(of)e(the)h(ab)q(o)o(v)o(e)g(are,)f(where)h=0A=
(lt)o(yp)q(e)264 2249 =
y(refers)e(to)f(the)h(b)o(yte)g(con)o(taining)h(P)l(,)f=0A=
(DPL,)g(S)h(and)f(t)o(yp)q(e:)264 2425 y FE(set)p 339 2425=0A=
V 16 w(ldt)p 427 2425 V 17 w(desc\(n,)23 b(addr\))15 b =
FH(lt)o(yp)q(e)g(=3D)h=0A=
(0x82)564 2489 =
y(P=3D1,)i(DPL=3D0,)h(S=3D0,)g(t)o(yp)q(e=3D2)f(means)g(LDT)g(en)o=0A=
(try)l(.)29 b(limit)20 b(=3D)e(23)g(=3D>)h(ro)q(om)564 2554 y(for)14=0A=
b(3)h(segmen)o(t)g(descriptors.)p eop=0A=
%%Page: 115 126=0A=
115 125 bop 150 -84 1800 3 v 150 -100 a FD(5.9.)42 b(80386)18=0A=
b(Memory)f(Mangamen)o(t)981 b FH(115)264 153 y FE(set)p 339=0A=
153 15 2 v 16 w(tss)p 427 153 V 17 w(desc\(n,)23 b(addr\))15=0A=
b FH(lt)o(yp)q(e)g(=3D)h(0x89)564 217 =
y(P=3D1,)e(DPL=3D0,)h(S=3D0,)f(t)o(yp)q(e)h(=3D)g=0A=
(9,)f(means)h(a)o(v)m(ailable)h(80386)e(TSS)h(limit)h(=3D)f(231)564=0A=
281 y(ro)q(om)f(for)h(1)g(tss)p 846 281 14 2 v 16 w(struct.)218=0A=
394 y FG(\017)23 b FE(load)p 363 394 15 2 v 16 w(TR\(n\))p=0A=
FH(,)264 458 y FE(load)p 363 458 V 16 w(ldt\(n\))12 b =
FH(load)h(descriptors)f=0A=
(for)g(task)g(n)o(um)o(b)q(er)h(n)g(in)o(to)f(the)h(task)e(register)i(and=
)f=0A=
(ldt)h(register.)218 560 y FG(\017)23 b FE(ulong)g(get)p 482=0A=
560 V 17 w(base)g(\(struct)g(desc)p 905 560 V 16 w(struct)g(ldt\))15=0A=
b FH(gets)g(the)g(base)g(from)g(a)g(descriptor.)218 662 y FG(\017)23=0A=
b FE(ulong)g(get)p 482 662 V 17 w(limit)g(\(ulong)g(segment\))d=0A=
FH(gets)i(the)g(limit)h(\(size\))f(from)f(a)h(segmen)o(t)f(selector.)264=0A=
726 y(Returns)15 =
b(the)h(size)g(of)f(the)g(segmen)o(t)g(in)h(b)o(ytes.)218=0A=
828 y FG(\017)23 b FE(set)p 339 828 V 16 w(base\(struct)g(desc)p=0A=
738 828 V 16 w(struct)g(ldt,)h(ulong)f(base\))p FH(,)264 892=0A=
y FE(set)p 339 892 V 16 w(limit\(struct)g(desc)p 762 892 V=0A=
16 w(struct)g(ldt,)h(ulong)f(limit\))264 956 y FH(Will)17 =
b(set)e(the)h(base)=0A=
g(and)f(limit)j(for)d(descriptors)h(\(4K)f(gran)o(ular)g(segmen)o(ts\).)2=
0=0A=
b(The)c(limit)h(here)f(is)264 1021 =
y(actually)g(the)f(size)h(in)g(b)o(ytes)f=0A=
(of)g(the)g(segmen)o(t.)218 1123 y FG(\017)p 267 1123 V 40=0A=
w FE(set)p 356 1123 V 17 w(seg)p 445 1123 V 16 w(desc\(gate)p=0A=
677 1123 V 16 w(addr,)23 b(type,)h(dpl,)f(base,)g(limit\))264=0A=
1187 y FH(Default)15 =
b(v)m(alues)h(0x00408000)d(=3D>)j(D=3D1,)e(P=3D1,)h(G=3D0)264=0A=
1251 =
y(Presen)o(t,)f(op)q(eration)i(size)g(is)f(32)g(bit)h(and)f(max)g(size)h=0A=
(is)g(1M.)264 1316 y FE(gate)p 363 1316 V 16 w(addr)f =
FH(m)o(ust)g(b)q(e)g(a)=0A=
g FE(\(ulong)23 b(*\))p eop=0A=
%%Page: 116 127=0A=
116 126 bop 150 438 a Fv(App)s(endix)34 b(A)150 686 y =
Fx(Biblio)q(graph)m(y)=0A=
150 940 y FH(Tw)o(o)14 b(bibliographies)k(for)d(no)o(w)p FB(:)8=0A=
b(:)g(:)150 1117 y Ft(A.1)69 b(Normal)22 b(Bibliograph)n(y)1016=0A=
2678 y FH(116)p eop=0A=
%%Page: 117 128=0A=
117 127 bop 150 461 a Fx(Biblio)q(graph)m(y)150 710 y FH([ANS])70=0A=
b FC(Dr)n(aft)26 =
b(Pr)n(op)n(ose)n(d)f(A)o(meric)n(an)f(National)i(Standar)n=0A=
(d)f(for)h(Information)g(Systems:)38 b(Smal)r(l)339 775 y(Computer)17=0A=
b(System)e(Interfac)n(e)g({)g(2)h(\(SCSI-2\))p FH(.)i(\(X3T9.2/86-109,)11=0A=
b(revision)k(10h,)f(Octob)q(er)339 839 y(17,)g(1991\).)150=0A=
941 y([In)o(t90])59 b(In)o(tel.)20 b =
FC(i486)d(Pr)n(o)n(c)n(essor)e(Pr)n(o)n=0A=
(gr)n(ammer's)h(R)n(efer)n(enc)n(e)f(Manual)p FH(.)k(In)o(tel/McGra)o=0A=
(w-Hill,)d(1990.)150 1043 y([LXT91])22 b FC(LXT)17 =
b(SCSI)f(Pr)n(o)n(ducts:)=0A=
21 b(Sp)n(e)n(ci\014c)n(ation)14 =
b(and)j(OEM)e(T)m(e)n(chnic)n(al)g(Manual)p=0A=
FH(,)g(1991.)150 1144 y([Nor85])42 b(P)o(eter)15 b(Norton.)20=0A=
b =
FC(The)d(Peter)g(Norton)g(Pr)n(o)n(gr)n(ammer's)f(Guide)h(to)g(the)g(IBM)=
g=0A=
(PC)p FH(.)k(Bellevue,)339 1209 y(W)l(ashington:)f(Microsoft)14=0A=
b(Press,)h(1985.)150 1386 y Ft(A.2)69 b(Annotated)23 =
b(Bibliograph)n(y)150=0A=
1519 y FH(This)18 =
b(anon)o(tated)f(bibliograph)o(y)h(co)o(v)o(ers)f(b)q(o)q=0A=
(oks)h(on)f(op)q(erating)g(system)g(theory)g(as)g(w)o(ell)i(as)e(di\013er=
en)o=0A=
(t)150 1583 y(kinds)23 b(of)f(programming)f(in)i(a)f Fn(un)p=0A=
FB(?)p Fn(x)f FH(en)o(vironmen)o(t.)41 b(The)22 =
b(price)h(mark)o(ed)e(ma)o(y)=0A=
h(or)f(ma)o(y)h(not)f(b)q(e)150 1647 =
y(an)d(exact)g(price,)i(but)e(should)h=0A=
(b)q(e)g(close)g(enough)f(for)g(go)o(v)o(ernmen)o(t)f(w)o(ork.)28=0A=
b FD([If)21 b(y)o(ou)f(ha)o(v)o(e)g(a)h(b)q(o)q(ok)150 1712=0A=
y(that)j(y)o(ou)e(think)i(should)f(go)h(in)f(the)g(bibliograph)o(y)l(,)k=0A=
(please)c(write)i(a)e(short)h(review)f(of)150 1776 =
y(it)e(and)g(send)e(all)j=0A=
(the)f(necessary)f(information)i(\(title,)h(author,)g(publisher,)g(ISBN,)=
e=0A=
(and)150 1841 y(appro)o(ximate)d(price\))i(and)d(the)h(review)g(to)g=0A=
FE(johnsonm AT sunsite DOT unc DOT edu)p FD(])221 1928 y FH(This)d(v)o(ersion)h(is)f=0A=
(slo)o(wly)h(going)f(a)o(w)o(a)o(y)l(,)f(in)i(fa)o(v)o(or)e(of)g(a)h(real=
)h=0A=
(bibliograph)o(y)l(.)150 2107 y FD(Title:)238 b FH(The)15 b(Design)h(of)f=0A=
(the)g(UNIX)h(Op)q(erating)g(System)150 2183 y FD(Author:)182=0A=
b FH(Maurice)16 b(J.)f(Bac)o(h)150 2259 y FD(Publisher:)129=0A=
b FH(Pren)o(tice)16 b(Hall,)g(1986)150 2335 y FD(ISBN:)219=0A=
b FH(0-13-201799-7)150 2411 y FD(Appr.)19 b(Price:)77 b FH($65.00)1016=0A=
2678 y(117)p eop=0A=
%%Page: 118 129=0A=
118 128 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(118)264 88 y(This)19 =
b(is)g(one)g(of)g(the)g(b)q=0A=
(o)q(oks)g(that)f(Lin)o(us)i(used)f(to)f(design)i(Lin)o(ux.)32=0A=
b(It)19 b(is)g(a)g(description)264 153 =
y(of)d(the)g(data)g(structures)g(used)=0A=
h(in)g(the)g(System)f(V)g(k)o(ernel.)25 b(Man)o(y)15 =
b(of)h(the)h(names)f(of)=0A=
g(the)264 217 =
y(imp)q(ortan)o(t)h(functions)h(in)h(the)e(Lin)o(ux)i(source)f=0A=
(come)f(from)g(this)h(b)q(o)q(ok,)g(and)g(are)f(named)264 281=0A=
y(after)f(the)h(algorithms)f(presen)o(ted)i(here.)25 b(F)l(or)16=0A=
b(instance,)h(if)h(y)o(ou)e(can't)g(quite)i(\014gure)f(out)264=0A=
346 =
y(what)g(exactly)h(getblk\(\),)g(brelse\(\),)h(bread\(\),)e(breada\(\),)h=0A=
(and)g(b)o(write\(\))f(are,)h(c)o(hapter)g(3)264 410 =
y(explains)e(v)o(ery)f=0A=
(w)o(ell.)332 475 =
y(While)j(most)d(of)i(the)f(algorithms)h(are)f(similar)i=0A=
(or)e(the)g(same,)g(a)h(few)f(di\013erences)j(are)264 539 y(w)o(orth)14=0A=
b(noting:)318 622 y FG(\017)23 b FH(The)13 =
b(Lin)o(ux)i(bu\013er)g(cac)o(he)f=0A=
(is)g(dynamically)h(resized,)g(so)e(the)g(algorithm)h(for)f(dealing)364=0A=
686 =
y(with)j(getting)f(new)i(bu\013ers)f(is)h(a)e(bit)h(di\013eren)o(t.)23=0A=
b(Therefore)16 b(the)g(ab)q(o)o(v)o(e)f(referenced)364 751=0A=
y(explanation)h(of)f(getblk\(\))g(is)g(a)g(little)i(di\013eren)o(t)f(than=
)f=0A=
(the)h(getblk\(\))f(in)h(Lin)o(ux.)318 832 y FG(\017)23 b FH(Lin)o(ux)11=0A=
b(do)q(es)g(not)f(curren)o(tly)h(use)g(streams,)f(and)h(if/when)g(streams=
)e=0A=
(are)i(implemen)o(ted)364 896 =
y(for)j(Lin)o(ux,)i(they)g(are)e(lik)o(ely)j=0A=
(to)e(ha)o(v)o(e)g(somewhat)f(di\013eren)o(t)j(seman)o(tics.)318=0A=
977 y FG(\017)23 b FH(The)12 b(seman)o(tics)g(and)h(calling)h(structure)e=0A=
(for)f(device)j(driv)o(ers)f(is)f(di\013eren)o(t.)21 b(The)12=0A=
b(con-)364 1041 y(cept)h(is)i(similar,)f(and)g(the)g(c)o(hapter)f(on)h=0A=
(device)h(driv)o(ers)e(is)i(still)g(w)o(orth)d(reading,)i(but)364=0A=
1106 =
y(for)g(details)j(on)e(the)g(device)i(driv)o(er)f(structures,)e(the)i=0A=
FC(The)h(Linux)f(Kernel)g(Hackers')364 1170 y(Guide)j =
FH(is)d(the)f(prop)q=0A=
(er)g(reference.)318 1251 y FG(\017)23 b FH(The)15 =
b(memory)g(managemen)o(t)f=0A=
(algorithms)h(are)g(somewhat)g(di\013eren)o(t.)264 1334 y(There)g(are)f=0A=
(other)h(small)g(di\013erences)i(as)e(w)o(ell,)g(but)g(a)f(go)q(o)q(d)h=0A=
(understanding)h(of)f(this)g(text)264 1398 y(will)h(help)h(y)o(ou)e=0A=
(understand)h(the)f(Lin)o(ux)h(source.)150 1577 y FD(Title:)238=0A=
b FH(Adv)m(anced)17 =
b(Programming)d(in)i(the)f(UNIX)h(En)o(vironmen)o(t)150=0A=
1653 y FD(Author:)182 b FH(W.)14 b(Ric)o(hard)j(Stev)o(ens)150=0A=
1729 y FD(Publisher:)129 b FH(Addison)16 b(W)l(esley)l(,)g(1992)150=0A=
1805 y FD(ISBN:)219 b FH(0-201-56317-7)150 1881 y FD(Appr.)19=0A=
b(Price:)77 b FH($50.00)264 2036 y(This)16 =
b(excellen)o(t)h(tome)d(co)o(v)o=0A=
(ers)h(the)g(stu\013)h(y)o(ou)f FC(r)n(e)n(al)r(ly)g FH(ha)o(v)o(e)g(to)f=0A=
(kno)o(w)h(to)g(write)g FC(r)n(e)n(al)g Fn(un)p FB(?)p Fn(x)264=0A=
2101 y =
FH(programs.)j(It)c(includes)j(a)c(discussion)j(of)e(the)g(v)m(arious)=0A=
h(standards)e(for)h Fn(un)p FB(?)p Fn(x)f FH(implemen-)264=0A=
2165 =
y(tations,)i(including)k(POSIX,)e(X/Op)q(en)g(XPG3,)e(and)h(FIPS,)g(and)=0A=
g(concen)o(trates)g(on)g(t)o(w)o(o)264 2230 =
y(implemen)o(tations,)e(SVR4)f=0A=
(and)g(pre-release)g(4.4)f(BSD,)g(whic)o(h)i(it)f(refers)f(to)g(as)g=0A=
(4.3+BSD.)264 2294 =
y(The)j(b)q(o)q(ok)g(concen)o(trates)f(hea)o(vily)i(on)f=0A=
(application)h(and)f(fairly)g(complete)h(sp)q(eci\014cation,)264=0A=
2358 y(and)f(notes)g(whic)o(h)h(features)f(relate)g(to)g(whic)o(h)h=0A=
(standards)f(and)g(releases.)332 2423 y(The)f(c)o(hapters)f(include:)22=0A=
b(Unix)14 b(Standardization)h(and)f(Implemen)o(tations,)g(File)h(I/O,)264=0A=
2487 =
y(Files)d(and)f(Directories,)h(Standard)e(I/O)i(Library)l(,)g(System)f=0A=
(Data)f(Files)i(and)f(Information,)264 2551 y(The)20 =
b(En)o(vironmen)o(t)g=0A=
(of)f(a)h(Unix)g(Pro)q(cess,)h(Pro)q(cess)f(Con)o(trol,)g(Pro)q(cess)f=0A=
(Relationships,)p eop=0A=
%%Page: 119 130=0A=
119 129 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(119)264 88 y(Signals,)18 =
b(T)l(erminal)g(I/O,)g=0A=
(Adv)m(anced)g(I/O)g(\(non-blo)q(c)o(king,)h(streams,)d(async,)i(memory-)=
264=0A=
153 =
y(mapp)q(ed,)f(etc.\),)g(Daemon)f(Pro)q(cesses,)h(In)o(terpro)q(cess)h=0A=
(Comm)o(unication,)f(Adv)m(anced)i(In-)264 217 y(terpro)q(cess)d(Comm)o=0A=
(unication,)g(and)h(some)f(example)h(applications,)h(including)h(c)o(hapt=
ers)=0A=
264 281 y(on)14 =
b(A)g(Database)f(Library)l(,)i(Commm)o(unicating)g(with)f(a)g=0A=
(P)o(ostScript)g(Prin)o(ter,)g(A)g(Mo)q(dem)264 346 =
y(Dialer,)h(and)h(then)f=0A=
(a)g(seemingly)i(misplaced)f(\014nal)g(c)o(hapter)f(on)h(Pseudo)f(T)l=0A=
(erminals.)332 410 y(I)10 =
b(ha)o(v)o(e)g(found)h(that)e(this)i(b)q(o)q(ok)f=0A=
(mak)o(es)f(it)i(p)q(ossible)h(for)d(me)h(to)g(write)g(useable)i(programs=
)264=0A=
475 y(for)i Fn(un)p FB(?)p Fn(x)p FH(.)19 =
b(It)c(will)i(help)f(y)o(ou)f(ac)o=0A=
(hiev)o(e)h(POSIX)g(compliance)g(in)g(w)o(a)o(ys)e(that)h(w)o(on't)e(brea=
k)=0A=
264 539 y(SVR4)k(or)f(BSD,)g(as)h(a)f(general)h(rule.)26 b(This)17=0A=
b(b)q(o)q(ok)g(will)h(sa)o(v)o(e)e(y)o(ou)h(ten)f(times)h(its)g(cost)f(in=
)264=0A=
603 y(frustration.)150 779 y FD(Title:)238 b FH(Adv)m(anced)17=0A=
b(80386)c(Programming)i(T)l(ec)o(hniques)150 855 y FD(Author:)182=0A=
b FH(James)15 b(L.)g(T)l(urley)150 932 y FD(Publisher:)129=0A=
b FH(Osb)q(orne)16 b(McGra)o(w-Hill,)f(1988)150 1008 y FD(ISBN:)219=0A=
b FH(0-07-881342-5)150 1084 y FD(Appr.)19 b(Price:)77 b FH($22.95)264=0A=
1236 y(This)13 =
b(b)q(o)q(ok)h(co)o(v)o(ers)e(the)h(80386)f(quite)i(w)o(ell,)g=0A=
(without)f(touc)o(hing)h(on)f(an)o(y)g(other)f(hardw)o(are.)264=0A=
1301 y(Some)h(co)q(de)h(samples)g(are)g(included.)22 b(All)14=0A=
b(ma)s(jor)f(features)g(are)g(co)o(v)o(ered,)g(as)g(are)h(man)o(y)f(of)26=
4=0A=
1365 y(the)j(concepts)i(needed.)26 b(The)17 =
b(c)o(hapters)f(of)g(this)i(b)q=0A=
(o)q(ok)f(are:)22 b(Basics,)c(Memory)e(Segmen-)264 1429 y(tation,)j=0A=
(Privilege)i(Lev)o(els,)g(P)o(aging,)e(Multitasking,)i(Comm)o(unicating)e=0A=
(Among)g(T)l(asks,)264 1494 =
y(Handling)d(F)l(aults)f(and)f(In)o(terrupts,)h=0A=
(80286)e(Em)o(ulation,)i(8086)e(Em)o(ulation,)i(Debugging,)264=0A=
1558 =
y(The)k(80387)g(Numeric)h(Pro)q(cessor)f(Extension,)i(Programming)e(for)=0A=
g(P)o(erformance,)h(Re-)264 1623 y(set)f(and)h(Real)g(Mo)q(de,)g(Hardw)o=0A=
(are,)g(and)f(a)g(few)h(app)q(endices,)i(including)g(tables)e(of)f(the)26=
4=0A=
1687 y(memory)14 =
b(managemen)o(t)h(structures)g(as)f(a)h(handy)h(reference.)=0A=
332 1751 y(The)e(author)g(has)g(a)g(go)q(o)q(d)g(writing)h(st)o(yle:)20=0A=
b(If)14 b(y)o(ou)g(are)g(tec)o(hnically)i(minded,)g(y)o(ou)e(will)264=0A=
1816 =
y(\014nd)i(y)o(ourself)f(caugh)o(t)g(up)h(just)f(reading)h(this)g(b)q(o)=0A=
q(ok.)21 b(One)16 b(strong)f(feature)g(of)g(this)h(b)q(o)q(ok)264=0A=
1880 =
y(for)k(Lin)o(ux)i(is)f(that)f(the)h(author)f(is)h(v)o(ery)f(careful)h=0A=
(not)g(to)f(explain)i(ho)o(w)e(to)g(do)h(things)264 1944 y(under)c(DOS,)f=0A=
(nor)h(ho)o(w)f(to)g(deal)h(with)g(particular)g(hardw)o(are.)23=0A=
b(In)17 b(fact,)f(the)h(only)g(times)264 2009 =
y(he)g(men)o(tions)f(DOS)h(and)=0A=
g(PC-compatible)g(hardw)o(are)f(are)h(in)g(the)g(in)o(tro)q(duction,)g(wh=
ere)=0A=
264 2073 y(he)e(promises)h(nev)o(er)f(to)g(men)o(tion)g(them)g(again.)150=0A=
2249 y FD(Title:)238 b FH(The)15 b(C)g(Programming)g(Language,)f(second)i=0A=
(edition)150 2325 y FD(Author:)182 b FH(Brian)16 b(W.)e(Kernighan)j(and)e=0A=
(Dennis)h(M.)f(Ritc)o(hie)150 2401 y FD(Publisher:)129 b =
FH(Pren)o(tice)16=0A=
b(Hall,)g(1988)150 2477 y FD(ISBN:)219 b FH(0-13-110362-8)13=0A=
b(\(pap)q(er\))i(0-13-110370-9)e(\(hard\))150 2554 y FD(Appr.)19=0A=
b(Price:)77 b FH($35.00)p eop=0A=
%%Page: 120 131=0A=
120 130 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(120)264 88 y(The)18 =
b(C)g(programming)f(bible.)31=0A=
b(Includes)20 b(a)d(C)h(tutorial,)h Fn(un)p FB(?)p Fn(x)e =
FH(in)o(terface)h=0A=
(reference,)i(C)264 153 y(reference,)15 b(and)h(standard)e(library)i=0A=
(reference.)332 217 =
y(Y)l(ou)f(program)f(in)i(C,)f(y)o(ou)g(buy)g(this)h(b)q=0A=
(o)q(ok.)k(It's)15 b(that)f(simple.)150 396 y FD(Title:)238=0A=
b FH(Op)q(erating)16 b(Systems:)k(Design)15 b(and)h(Implemen)o(tation)150=0A=
472 y FD(Author:)182 b FH(Andrew)16 b(S.)f(T)l(anen)o(baum)150=0A=
548 y FD(Publisher:)129 b FH(Pren)o(tice)16 b(Hall,)g(1987)150=0A=
624 y FD(ISBN:)219 b FH(0-13-637406-9)150 700 y FD(Appr.)19=0A=
b(Price:)77 b FH($50.00)264 855 y(This)16 =
b(b)q(o)q(ok,)f(while)i(a)e(little)=0A=
h(simplistic)i(in)e(sp)q(ots,)f(and)h(missing)g(some)f(imp)q(ortan)o(t)g=0A=
(ideas,)264 920 =
y(is)i(a)g(fairly)g(clear)g(exp)q(osition)i(of)d(what)g(it)h=0A=
(tak)o(es)g(to)f(write)h(an)f(op)q(erating)i(system.)24 b(Half)264=0A=
984 y(the)12 =
b(b)q(o)q(ok)h(is)g(tak)o(en)f(up)h(with)f(the)h(source)g(co)q=0A=
(de)g(to)e(a)i Fn(un)p FB(?)p Fn(x)e =
FH(clone)j(called)g(Minix,)g(whic)o(h)f=0A=
(is)264 1048 y(based)j(on)g(a)f(microk)o(ernel,)i(unlik)o(e)h(Lin)o(ux,)f=0A=
(whic)o(h)g(sp)q(orts)e(a)h(monolithic)h(design.)23 b(It)16=0A=
b(has)264 1113 =
y(b)q(een)i(said)g(that)f(Minix)h(sho)o(ws)f(that)g(it)h(is)f=0A=
(p)q(ossible)j(to)c(to)h(write)h(a)f(microk)o(ernel-based)264=0A=
1177 y Fn(un)p FB(?)p Fn(x)p FH(,)d(but)h(do)q(es)h(not)e(adequately)i=0A=
(explain)h FC(why)f FH(one)f(w)o(ould)h(do)f(so.)332 1241 =
y(Lin)o(ux)e(w)o=0A=
(as)e(originally)j(in)o(tended)f(to)e(b)q(e)i(a)e(free)h(Minix)h(replacem=
en)o=0A=
(t:)1530 1225 y Fm(1)1569 1241 y FH(In)f(fact,)g(it)g(w)o(as)264=0A=
1306 y(originally)k(to)f(b)q(e)h(binary-compatible)h(with)e(Minix-386.)20=0A=
b(Minix-386)c(w)o(as)e(the)h(dev)o(elop-)264 1370 =
y(men)o(t)i(en)o(vironmen)o=0A=
(t)h(under)g(whic)o(h)h(Lin)o(ux)g(w)o(as)d(b)q(o)q(otstrapp)q(ed.)28=0A=
b(No)17 b(Minix)i(co)q(de)f(is)g(in)264 1434 y(Lin)o(ux,)13=0A=
b(but)g(v)o(esitiges)f(of)g(this)h(heritage)f(liv)o(e)i(on)e(in)h(suc)o(h=
)f=0A=
(things)h(as)f(the)g(minix)i(\014lesystem)264 1499 y(in)k(Lin)o(ux.)27=0A=
b(Early)17 b(in)h(Lin)o(ux's)g(existence,)h(Andrew)e(T)l(anen)o(baum)h=0A=
(started)e(a)h(\015ame)g(w)o(ar)264 1563 =
y(with)e(Lin)o(us)i(ab)q(out)e(OS)g=0A=
(design,)h(whic)o(h)g(w)o(as)f(in)o(teresting,)g(if)h(not)e(enligh)o(teni=
ng)p=0A=
FB(:)8 b(:)g(:)332 1627 y FH(Ho)o(w)o(ev)o(er,)14 =
b(this)i(b)q(o)q(ok)f(migh)=0A=
o(t)g(still)i(pro)o(v)o(e)e(w)o(orth)o(while)g(for)g(those)g(who)g(w)o(an=
)o=0A=
(t)g(a)g(basic)264 1692 =
y(explanation)g(of)f(OS)g(concepts,)h(as)f(T)l(anen)o=0A=
(baum's)g(explanations)h(of)f(the)g(basic)h(concepts)264 1756=0A=
y(remain)e(some)g(of)g(the)g(clearer)h(\(and)f(more)g(en)o(tertaining,)h(=
if)f=0A=
(y)o(ou)g(lik)o(e)i(to)d(b)q(e)i(en)o(tertained\))264 1821=0A=
y(a)o(v)m(ailable.)34 b(Unfortunately)l(,)21 =
b(basic)f(is)g(the)g(k)o(ey)f(w)=0A=
o(ork)g(here,)i(as)e(man)o(y)g(things)h(suc)o(h)g(as)264 1885=0A=
y(virtual)15 b(memory)g(are)g(not)g(co)o(v)o(ered)g(at)f(all.)150=0A=
2064 y FD(Title:)238 b FH(Mo)q(dern)15 b(Op)q(erating)h(Systems)150=0A=
2140 y FD(Author:)182 b FH(Andrew)16 b(S.)f(T)l(anen)o(baum)150=0A=
2216 y FD(Publisher:)129 b FH(Pren)o(tice)16 b(Hall,)g(1992)150=0A=
2292 y FD(ISBN:)219 b FH(0-13-588187-0)150 2368 y FD(Appr.)19=0A=
b(Price:)77 b FH($51.75)p 150 2407 720 2 v 207 2440 a FA(1)225=0A=
2455 y Fl(Li)q(n)r(u)r(s)r(')18 =
b(M)q(i)r(n)s(i)r(x)r(,)g(Li)q(n)r(u)r(s)h=0A=
(te)q(l)r(l)q(s)g(us)r(.)p eop=0A=
%%Page: 121 132=0A=
121 131 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(121)264 88 y(The)12 =
b(\014rst)f(half)i(of)e(this)=0A=
h(b)q(o)q(ok)g(is)h(a)e(rewrite)h(of)g(T)l(anen)o(baum's)f(earlier)i=0A=
FC(Op)n(er)n(ating)g(Systems)p FH(,)264 153 =
y(but)i(this)g(b)q(o)q(ok)g(co)o=0A=
(v)o(ers)f(sev)o(eral)h(things)g(that)f(the)h(earlier)g(b)q(o)q(ok)g(miss=
ed,)=0A=
g(includin)q(g)i(suc)o(h)264 217 y(things)d(as)f(virtual)i(memory)l(.)k=0A=
(Minix)c(is)f(not)g(included,)i(but)e(o)o(v)o(erviews)g(of)f(MS-DOS)h(and=
)264=0A=
281 y(sev)o(eral)i(distributed)h(systems)f(are.)21 =
b(This)c(b)q(o)q(ok)f(is)g=0A=
(probably)h(more)e(useful)i(to)e(someone)264 346 =
y(who)g(w)o(an)o(ts)f(to)g=0A=
(do)h(something)h(with)g(his)g(or)e(her)i(kno)o(wlege)f(than)g(T)l(anen)o=0A=
(baum's)g(earlier)264 410 y FC(Op)n(er)n(ating)k(Systems:)29=0A=
b(Design)19 b(and)i(Implementation.)34 b FH(Some)19 =
b(clue)i(as)f(to)f(the)h=0A=
(reason)264 475 y(ma)o(y)14 b(b)q(e)h(found)g(in)h(the)f(title)p=0A=
FB(:)8 b(:)g(:)21 b FH(Ho)o(w)o(ev)o(er,)14 =
b(what)g(DOS)h(is)g(doing)h(in)f=0A=
(a)g(b)q(o)q(ok)g(on)f FC(mo)n(dern)264 539 y =
FH(op)q(erating)h(systems,)f=0A=
(man)o(y)h(ha)o(v)o(e)g(failed)h(to)f(disco)o(v)o(er.)150 717=0A=
y FD(Title:)238 b FH(Op)q(erating)16 b(Systems)150 794 y FD(Author:)182=0A=
b FH(William)17 b(Stallings)150 870 y FD(Publisher:)129 b =
FH(Macmillan,)16=0A=
b(1992)e(\(800-548-9939\))150 946 y FD(ISBN:)219 b FH(0-02-415481-4)150=0A=
1022 y FD(Appr.)19 b(Price:)77 b FH($??.??)264 1177 y(A)15=0A=
b(v)o(ery)f(thorough)h(text)f(on)h(op)q(erating)g(systems,)g(this)g(b)q(o=
)q=0A=
(ok)g(giv)o(es)g(more)g(in-depth)i(co)o(v-)264 1241 y(erage)d(of)h(the)g=0A=
(topics)g(co)o(v)o(ered)g(in)g(T)l(annebaum's)g(b)q(o)q(oks,)g(and)g(co)o=
(v)o=0A=
(ers)f(more)h(topics,)g(in)h(a)264 1306 y(m)o(uc)o(h)c(brisk)o(er)g(st)o=0A=
(yle.)19 b(This)12 b(b)q(o)q(ok)h(co)o(v)o(ers)e(all)i(the)f(ma)s(jor)e=0A=
(topics)j(that)e(y)o(ou)h(w)o(ould)g(need)h(to)264 1370 y(kno)o(w)g(to)g=0A=
(build)j(an)d(op)q(erating)h(system,)f(and)h(do)q(es)g(so)f(in)i(a)e(clea=
r)h=0A=
(w)o(a)o(y)l(.)19 b(The)14 b(author)f(uses)264 1434 y(examples)19=0A=
b(from)g(three)g(ma)s(jor)e(systems,)i(comparing)g(and)h(con)o(trasting)e=0A=
(them:)27 b Fn(un)p FB(?)p Fn(x)p FH(,)264 1499 y(OS/2,)17=0A=
b(and)h(MVS.)f(With)h(eac)o(h)g(topic)g(co)o(v)o(ered,)f(these)h(example)=
h=0A=
(systems)e(are)g(used)h(to)264 1563 =
y(clarify)e(the)f(p)q(oin)o(ts)h(and)f=0A=
(pro)o(vide)h(an)f(example)h(of)f(an)g(implemen)o(tation.)332=0A=
1627 y(T)l(opics)d(co)o(v)o(ered)f(in)h FC(Op)n(er)n(ating)g(Systems)i=0A=
FH(include)f(threads,)f(real-time)g(systems,)f(m)o(ul-)264=0A=
1692 y(tipro)q(cessor)16 =
b(sc)o(heduling,)i(distributed)g(systems,)e(pro)q=0A=
(cess)g(migration,)g(and)h(securit)o(y)l(,)g(as)264 1756 y(w)o(ell)f(as)f=0A=
(the)h(standard)f(topics)h(lik)o(e)h(memory)e(managemen)o(t)g(and)h(sc)o=0A=
(heduling.)23 b(The)16 b(sec-)264 1821 y(tion)k(on)h(distributed)h(pro)q=0A=
(cessing)g(app)q(ears)e(to)g(b)q(e)i(up-to-date,)f(and)g(I)g(found)g(it)g=
(v)o=0A=
(ery)264 1885 y(helpful.)150 2064 y FD(Title:)238 b FH(UNIX)16=0A=
b(Net)o(w)o(ork)e(Programming)150 2140 y FD(Author:)182 b FH(W.)14=0A=
b(Ric)o(hard)j(Stev)o(ens)150 2216 y FD(Publisher:)129 b =
FH(Pren)o(tice)16=0A=
b(Hall,)g(1990)150 2292 y FD(ISBN:)219 b FH(0-13-949876-1)150=0A=
2368 y FD(Appr.)19 b(Price:)77 b FH($48.75)264 2523 y(This)20=0A=
b(b)q(o)q(ok)g(co)o(v)o(ers)f(sev)o(eral)g(kinds)i(of)e(net)o(w)o(orking)=
h=0A=
(under)g Fn(un)p FB(?)p Fn(x)p FH(,)g(and)g(pro)o(vides)g(v)o(ery)p=0A=
eop=0A=
%%Page: 122 133=0A=
122 132 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(122)264 88 y(thorough)16 =
b(references)h(to)g(the)=0A=
g(forms)f(of)g(net)o(w)o(orking)h(that)f(it)h(do)q(es)g(not)g(co)o(v)o(er=
)f=0A=
(directly)l(.)264 153 =
y(It)e(co)o(v)o(ers)g(TCP/IP)g(and)h(XNS)g(most)f(hea)o=0A=
(vily)l(,)h(and)g(fairly)g(exhaustiv)o(ely)h(describ)q(es)g(ho)o(w)264=0A=
217 y(all)h(the)g(calls)h(w)o(ork.)23 b(It)16 =
b(also)h(has)f(a)h(description)=0A=
h(and)f(sample)g(co)q(de)g(using)g(System)g(V's)264 281 =
y(TLI,)f(and)h(prett)=0A=
o(y)e(complete)i(co)o(v)o(erage)f(of)g(System)g(V)g(IPC.)g(This)h(b)q(o)q=
(ok)=0A=
g(con)o(tains)f(a)g(lot)264 346 y(of)f(source)h(co)q(de)g(examples)g(to)f=0A=
(get)h(y)o(ou)f(started,)f(and)i(man)o(y)f(useful)i(pro)q(ceedures.)23=0A=
b(One)264 410 y(example)18 b(is)g(co)q(de)g(to)f(pro)o(vide)h(useable)h=0A=
(semaphores,)f(based)g(on)f(the)h(partially)g(brok)o(en)264=0A=
475 y(implemen)o(tation)e(that)f(System)g(V)g(pro)o(vides.)150=0A=
653 y FD(Title:)238 b FH(Programming)14 =
b(in)i(the)g(UNIX)f(en)o(vironmen)o=0A=
(t)150 729 y FD(Author:)182 b FH(Brian)16 =
b(W.)e(Kernighan)j(and)e(Rob)q(ert)=0A=
h(Pik)o(e)150 805 y FD(Publisher:)129 b FH(Pren)o(tice)16 =
b(Hall,)g(1984)150=0A=
881 y FD(ISBN:)219 b FH(0-13-937699)13 =
b(\(hardco)o(v)o(er\))h(0-13-937681-X)=0A=
f(\(pap)q(erbac)o(k\))150 958 y FD(Appr.)19 b(Price:)77 b FH($??.??)332=0A=
1113 y FC(no)16 b(abstr)n(act)150 1291 y FD(Title:)238 b FH(W)l(riting)16=0A=
b(UNIX)g(Device)g(Driv)o(ers)150 1367 y FD(Author:)182 b FH(George)14=0A=
b(P)o(a)s(jari)150 1443 y FD(Publisher:)129 b FH(Addison)16=0A=
b(W)l(esley)l(,)g(1992)150 1520 y FD(ISBN:)219 b FH(0-201-52374-4)150=0A=
1596 y FD(Appr.)19 b(Price:)77 b FH($32.95)332 1751 y(This)19=0A=
b(b)q(o)q(ok)f(is)h(written)g(b)o(y)f(the)g(Presiden)o(t)h(and)g(founder)=
g=0A=
(of)e(Driv)o(er)i(Design)f(Labs,)264 1815 =
y(a)f(compan)o(y)g(whic)o(h)i(sp)q=0A=
(ecializes)h(in)f(the)f(dev)o(elopmen)o(t)g(of)f Fn(un)p FB(?)p=0A=
Fn(x)g FH(device)i(driv)o(ers.)28 b(This)264 1879 y(b)q(o)q(ok)14=0A=
b(is)g(an)g(excellen)o(t)h(in)o(tro)q(duction)g(to)e(the)h(sometimes)g(w)=
o=0A=
(ac)o(ky)f(w)o(orld)g(of)h(device)h(driv)o(er)264 1944 y(design.)27=0A=
b(The)18 =
b(four)f(basic)h(t)o(yp)q(es)g(of)f(driv)o(ers)h(\(c)o(haracter,)f=0A=
(blo)q(c)o(k,)h(tt)o(y)l(,)f(STREAMS\))h(are)264 2008 =
y(\014rst)j(discussed)i=0A=
(brie\015y)l(.)40 b(Man)o(y)21 =
b(full)i(examples)f(of)g(device)h(driv)o(ers)e=0A=
(of)h(all)g(t)o(yp)q(es)g(are)264 2072 =
y(giv)o(en,)c(starting)g(with)g(the)g=0A=
(simplest)h(and)f(progressing)g(in)g(complexit)o(y)l(.)29 b(All)20=0A=
b(examples)264 2137 y(are)e(of)h(driv)o(ers)g(whic)o(h)h(deal)g(with)f=0A=
Fn(un)p FB(?)p Fn(x)g FH(on)g(PC-compatible)h(hardw)o(are.)31=0A=
b FD(Chapters)264 2201 y(include:)i FH(Character)20 =
b(Driv)o(ers)h(I:)g(A)g=0A=
(T)l(est)g(Data)f(Generator)g(Character)g(Driv)o(ers)h(I)q(I:)264=0A=
2266 =
y(An)f(A/D)g(Con)o(v)o(erter)f(Character)g(Driv)o(ers)h(I)q(I)q(I:)h(A)f=0A=
(Line)i(Prin)o(ter)e(Blo)q(c)o(k)g(Driv)o(ers)g(I:)g(A)264=0A=
2330 y(T)l(est)13 =
b(Data)f(Generator)h(Blo)q(c)o(k)h(Driv)o(ers)f(I)q(I:)i(A)=0A=
e(RAM)h(Disk)g(Driv)o(er)f(Blo)q(c)o(k)h(Driv)o(ers)f(I)q(I)q(I:)i(A)264=0A=
2394 =
y(SCSI)f(Disk)g(Driv)o(er)g(Character)e(Driv)o(ers)i(IV:)g(The)g(Ra)o(w)=0A=
f(Disk)h(Driv)o(er)g(T)l(erminal)h(Driv)o(ers)264 2459 =
y(I:)j(The)h(COM1)f(P)=0A=
o(ort)f(Character)g(Driv)o(ers)i(V:)f(A)g(T)l(ap)q(e)h(Driv)o(e)f(STREAMS=
)h=0A=
(Driv)o(ers)f(I:)264 2523 =
y(A)c(Lo)q(op-Bac)o(k)g(Driv)o(er)g(STREAMS)h(Driv)=0A=
o(ers)f(I)q(I:)h(The)f(COM1)g(P)o(ort)f(\(Revisited\))i(Driv)o(er)p=0A=
eop=0A=
%%Page: 123 134=0A=
123 133 bop 150 -84 1800 3 v 150 -100 a FD(A.2.)42 b(Annotated)20=0A=
b(Bibliograph)o(y)1045 b FH(123)264 88 y(Installation)16 =
b(Zen)f(and)h(the)f=0A=
(Art)g(of)g(Device)h(Driv)o(er)f(W)l(riting)332 178 =
y(Although)h(man)o(y)f=0A=
(of)h(the)g(calls)h(used)f(in)g(the)g(b)q(o)q(ok)g(are)g(not)f(Lin)o=0A=
(ux-compatible,)j(the)264 242 =
y(general)d(idea)h(is)g(there,)f(and)g(man)o(y)=0A=
g(of)g(the)g(ideas)h(map)f(directly)i(in)o(to)e(Lin)o(ux.)150=0A=
421 y FD(Title:)238 b FH(title)150 497 y FD(Author:)182 b FH(author)150=0A=
573 y FD(Publisher:)129 b FH(pub,yr)150 649 y FD(ISBN:)219=0A=
b FH(isbn)150 725 y FD(Appr.)19 b(Price:)77 b FH($??.??)332=0A=
880 y FC(no)16 b(abstr)n(act)p eop=0A=
%%Page: 124 135=0A=
124 134 bop 150 438 a Fv(App)s(endix)34 b(B)150 686 y Fx(T)-10=0A=
b(our)40 b(of)g(the)g(Lin)m(ux)g(k)m(ernel)h(source)150 940=0A=
y =
FD([This)g(is)f(an)g(alpha)h(release)f(of)g(a)g(c)o(hapter)h(written)g(b)=
o=0A=
(y)e(Alessandro)i(Rubini,)150 1004 y FE(rubini AT ipvvis DOT unipv DOT it)p=0A=
FD(.)e(I'm)23 =
b(including)j(it)e(here)g(as)g(it)g(gets)f(w)o(ork)o(ed)g(on)h=0A=
(for)g(com-)150 1069 y(men)o(ts.])221 1157 y FH(This)14 =
b(c)o(hapter)f(tries)=0A=
g(to)g(explain)i(the)f(Lin)o(ux)g(source)g(co)q(de)g(in)g(an)f(orderly)h=0A=
(manner,)f(trying)h(to)f(help)150 1221 y(the)20 =
b(reader)f(to)g(ac)o(hiev)o=0A=
(e)h(a)g(go)q(o)q(d)f(understanding)i(of)e(ho)o(w)g(the)h(source)f(co)q(d=
e)i=0A=
(is)f(laid)g(out)g(and)f(ho)o(w)150 1285 y(the)h(most)e(relev)m(an)o(t)i=0A=
(unix)h(features)e(are)g(implemen)o(ted.)35 b(The)20 b(target)e(is)i(to)f=0A=
(help)i(the)f(exp)q(erienced)150 1350 y(C)d(programmer)e(who)i(is)h(not)e=0A=
(accustomed)h(to)g(Lin)o(ux)h(in)g(getting)e(familiar)i(with)g(the)f(o)o(=
v)o=0A=
(erall)g(Lin)o(ux)150 1414 y(design.)j(That's)13 =
b(wh)o(y)g(the)h(c)o(hosen)f=0A=
(en)o(try)g(p)q(oin)o(t)h(for)f(the)h(k)o(ernel)g(tour)f(is)h(the)g(k)o=0A=
(ernel)g(o)o(wn)f(en)o(try)g(p)q(oin)o(t:)150 1478 =
y(system)i(b)q(o)q(ot.)221=0A=
1566 =
y(A)f(go)q(o)q(d)h(understanding)h(of)f(C)f(language)h(is)h(required)f=0A=
(to)g(understand)g(this)g(material,)g(as)g(w)o(ell)g(as)150=0A=
1631 y(some)i(familiarit)o(y)i(with)f(b)q(oth)f Fn(un)p FB(?)p=0A=
Fn(x)g FH(concepts)h(and)g(the)g(PC)f(arc)o(hitecture.)28 b(Ho)o(w)o(ev)o=0A=
(er,)16 b(no)i(C)f(co)q(de)150 1695 y(will)c(app)q(ear)f(in)h(this)f(c)o=0A=
(hapter,)g(but)f(rather)h(p)q(oin)o(ters)g(to)f(the)g(actual)h(co)q(de.)2=
0=0A=
b(The)11 b(\014nest)h(issues)h(of)e(k)o(ernel)150 1759 y(design)17=0A=
b(are)e(explained)j(in)e(other)g(c)o(hapters)f(of)g(this)i(guide,)f(while=
)h=0A=
(this)f(c)o(hapter)g(tends)g(to)f(remain)h(an)150 1824 =
y(informal)g(o)o(v)o=0A=
(erview.)221 1912 y(An)o(y)k(pathname)f(for)h(\014les)h(referenced)g(in)f=0A=
(this)h(c)o(hapter)f(is)g(referred)g(to)f(the)h(main)h(source-tree)150=0A=
1976 y(directory)l(,)15 b(usually)i FE(/usr/src/linux)p FH(.)221=0A=
2054 y Fj(Most)10 b(of)g(the)h(information)c(rep)q(orted)12=0A=
b(here)f(is)f(tak)o(en)h(from)d(the)j(source)h(co)q(de)221=0A=
2095 y(of)j(Lin)o(ux)h(release)h(1.0.)25 b(Nonetheless,)18=0A=
b(references)h(to)d(later)g(v)o(ersions)h(are)221 2136 y(pro)o(vided)12=0A=
b(at)h(times.)k(An)o(y)c(paragraph)f(within)g(the)i(tour)f(shap)q(ed)g(li=
k)o=0A=
(e)f(this)221 2177 =
y(one)j(is)h(mean)o(t)e(to)i(underline)g(c)o(hanges)g(the)=0A=
g(k)o(ernel)g(has)g(undergone)g(after)221 2218 y(the)g(1.0)g(release.)26=0A=
b(If)15 b(no)h(suc)o(h)h(paragraph)f(is)g(presen)o(t,)i(then)f(no)f(c)o=0A=
(hanges)221 2259 =
y(o)q(ccurred)f(up)f(to)g(release)h(1.0.9)d({)i(1.1.76.)221=0A=
2348 =
y(Sometimes)d(a)j(paragraph)g(lik)o(e)f(this)h(o)q(ccurs)h(in)f(the)g=0A=
(text.)19 b(It)14 b(is)g(a)f(p)q(oin)o(ter)221 2389 =
y(to)k(the)i(righ)o(t)e=0A=
(sources)j(to)d(get)h(more)f(information)e(on)j(the)g(sub)r(ject)h(just)2=
21=0A=
2430 y(co)o(v)o(ered.)g(Needless)c(to)f(sa)o(y)m(,)f =
Fa(the)i(sour)n(c)n(e)e=0A=
Fj(is)h(the)h(primary)d(source.)1016 2678 y FH(124)p eop=0A=
%%Page: 125 136=0A=
125 135 bop 150 -84 1800 3 v 150 -100 a FD(B.1.)42 b(Bo)q(oting)19=0A=
b(the)f(system)1152 b FH(125)150 88 y Ft(B.1)69 b(Bo)r(oting)23=0A=
b(the)f(system)150 221 y =
FH(When)e(the)f(PC)g(is)h(p)q(o)o(w)o(ered)g(up,)g=0A=
(the)g(80x86)e(pro)q(cessor)h(\014nds)h(itself)g(in)g(real)g(mo)q(de)g(an=
d)f=0A=
(executes)150 286 y(the)c(co)q(de)h(at)f(address)g(0xFFFF0,)e(whic)o(h)j=0A=
(corresp)q(onds)f(to)g(a)g(R)o(OM-BIOS)i(address.)i(The)d(PC)f(BIOS)150=0A=
350 =
y(p)q(erforms)i(some)f(tests)g(on)h(the)g(system)f(and)h(initialize)q(s)i=0A=
(the)e(in)o(terrupt)g(v)o(ector)g(at)f(ph)o(ysical)i(address)150=0A=
414 =
y(0.)h(After)c(that)f(it)h(loads)h(the)f(\014rst)f(sector)h(of)f(a)h(b)q=0A=
(o)q(otable)g(device)i(to)d(0x7C00,)f(and)i(jumps)g(to)g(it.)20=0A=
b(The)150 479 y(device)14 b(is)e(usually)i(the)e(\015opp)o(y)g(or)g(the)g=0A=
(hard)g(driv)o(e.)20 b(The)12 =
b(preceding)h(description)h(is)f(quite)g(a)e=0A=
(simpli\014ed)150 543 y(one,)k(but)g(it's)g(all)h(that's)e(needed)j(to)e=0A=
(understand)g(the)h(k)o(ernel)g(initial)h(w)o(orkings.)221=0A=
631 y(The)32 =
b(v)o(ery)g(\014rst)f(part)h(of)g(the)g(Lin)o(ux)h(k)o(ernel)g=0A=
(is)f(written)h(in)f(8086)f(assem)o(bly)i(language)150 695=0A=
y(\()p FE(boot/bootsect.S)p FH(\).)11 b(When)k(run,)g(it)g(mo)o(v)o(es)e=0A=
(itself)j(to)e(absolute)g(address)h(0x90000,)e(loads)h(the)h(next)150=0A=
760 y(2)j(kBytes)h(of)f(co)q(de)h(from)f(the)h(b)q(o)q(ot)f(device)i(to)e=0A=
(address)h(0x90200,)f(and)g(the)h(rest)f(of)g(the)h(k)o(ernel)h(to)150=0A=
824 y(address)c(0x10000.)22 b(The)17 b(message)f(\\)p FE(Loading...)p=0A=
FH(")22 b(is)17 b(displa)o(y)o(ed)h(during)f(system)f(load.)24=0A=
b(Con)o(trol)15 b(is)150 888 y(then)h(passed)f(to)g(the)g(co)q(de)h(in)g=0A=
FE(boot/Setup.S)p =
FH(,)d(another)i(real-mo)q(de)h(assem)o(bly)f(source.)221=0A=
976 y(The)e(setup)g(p)q(ortion)g(iden)o(ti\014es)i(some)d(features)h(of)f=0A=
(the)h(host)g(system)f(and)i(the)f(t)o(yp)q(e)g(of)f(vga)g(b)q(oard.)150=0A=
1041 =
y(If)i(requested)g(to,)f(it)g(asks)g(the)h(user)g(to)e(c)o(ho)q(ose)i=0A=
(the)f(video)i(mo)q(de)e(for)g(the)h(console.)20 b(It)13 =
b(then)h(mo)o(v)o=0A=
(es)f(the)150 1105 y(whole)18 b(system)f(from)f(address)i(0x10000)d(to)i=0A=
(address)g(0x1000,)f(en)o(ters)h(protected)h(mo)q(de)f(and)h(jumps)150=0A=
1169 y(to)d(the)g(rest)g(of)f(the)i(system)e(\(at)h(0x1000\).)221=0A=
1257 y(The)g(next)h(step)f(is)h(k)o(ernel)h(decompression.)22=0A=
b(The)15 b(co)q(de)h(at)f(0x1000)f(comes)i(from)f FE(zBoot/head.S)150=0A=
1321 y FH(whic)o(h)i(initializes)i(registers)e(and)f(in)o(v)o(ok)o(es)g=0A=
FE(decompress)p 1157 1321 15 2 v 16 w(kernel\(\))p FH(,)f(whic)o(h)i(in)g=0A=
(turn)g(is)f(made)h(up)f(of)150 1386 y FE(zBoot/inflate.c)p=0A=
FH(,)k FE(zBoot/unzip.c)f FH(and)i FE(zBoot/misc.c)p FH(.)35=0A=
b(The)21 b(decompressed)h(data)e(go)q(es)h(to)150 1450 y(address)15=0A=
b(0x100000)e(\(1)h(Meg\),)g(and)h(this)h(is)f(the)g(main)h(reason)e(wh)o(=
y)h=0A=
(Lin)o(ux)h(can't)f(run)g(with)g(less)h(than)150 1515 =
y(2)f(megs)g(ram.)221=0A=
1615 y Fj(Encapsulation)24 =
b(of)h(the)g(k)o(ernel)h(in)e(a)h(gzip)g(\014le)g=0A=
(is)g(accomplished)f(b)o(y)221 1656 y Fs(Makefile)10 b =
Fj(and)h(utilities)g=0A=
(in)g(the)i Fs(zBoot)d Fj(directory)m(.)18 b(They)12 =
b(are)g(in)o(teresting)=0A=
221 1697 y(\014les)i(to)g(lo)q(ok)e(at.)221 1778 =
y(Kernel)e(release)h(1.1.75)=0A=
d(mo)o(v)o(ed)g(the)i Fs(boot)f Fj(and)h Fs(zBoot)e =
Fj(directories)j(do)o(wn)=0A=
f(to)221 1811 y Fs(arch/i386/boot)p =
Fj(.)k(This)f(c)o(hange)g(is)f(mean)o(t)f=0A=
(to)i(allo)o(w)e(true)i(k)o(ernel)g(builds)221 1852 y(for)18=0A=
b(di\013eren)o(t)h(arc)o(hitectures.)34 b(Nonetheless,)21 =
b(I'll)c(stic)o(k)h=0A=
(to)g(i386-sp)q(eci\014c)221 1893 y(information.)221 1968 y=0A=
FH(Decompressed)11 b(co)q(de)h(is)g(executed)h(at)e(address)g(0x1010000)e=0A=
FD([Ma)o(yb)q(e)k(I'v)o(e)g(lost)h(trac)o(k)g(of)f(ph)o(ys-)150=0A=
2032 =
y(ical)i(addresses,)g(here,)g(as)e(I)g(don't)i(kno)o(w)d(v)o(ery)h(w)o=0A=
(ell)h(gas)f(source)h(co)q(de])p FH(,)f(where)f(all)h(the)f(32-bit)150=0A=
2096 y(setup)k(is)g(accomplished:)23 b(IDT,)15 b(GDT)g(and)h(LDT)f(are)h=0A=
(loaded,)g(the)g(pro)q(cessor)f(and)h(copro)q(cessor)f(are)150=0A=
2161 =
y(iden)o(ti\014ed,)g(and)e(paging)f(is)h(setup;)h(ev)o(en)o(tually)l(,)g=0A=
(the)e(routine)i FE(start)p 1341 2161 V 16 w(kernel)e =
FH(is)h(in)o(v)o(ok)o=0A=
(ed.)19 b(The)13 b(source)150 2225 y(for)j(the)h(ab)q(o)o(v)o(e)g(op)q=0A=
(erations)g(is)g(in)h FE(boot/head.S)p FH(.)c(It)j(is)h(probably)f(the)g=0A=
(tric)o(kiest)g(co)q(de)h(in)f(the)g(whole)150 2289 y(k)o(ernel.)221=0A=
2377 y(Note)12 =
b(that)g(if)h(an)g(error)f(o)q(ccurs)h(during)h(an)o(y)e(of)g=0A=
(the)h(preceding)i(steps,)d(the)h(computer)g(will)h(lo)q(c)o(kup.)150=0A=
2442 =
y(The)h(OS)h(can't)f(deal)h(with)f(errors)g(when)g(it)h(isn't)f(y)o(et)g=0A=
(fully)h(op)q(erativ)o(e.)221 2529 y FE(start)p 344 2529 V=0A=
16 w(kernel\(\))f FH(resides)j(in)f FE(init/main.c)p =
FH(,)d(and)j(nev)o(er)g=0A=
(returns.)23 b(An)o(ything)17 b(from)e(no)o(w)h(on)g(is)p eop=0A=
%%Page: 126 137=0A=
126 136 bop 150 -84 1800 3 v 150 -100 a FD(B.2.)42 b(Spinning)19=0A=
b(the)f(wheel)1161 b FH(126)150 88 y(co)q(ded)20 =
b(in)g(C)f(language,)h(left)=0A=
g(aside)f(in)o(terrupt)h(managemen)o(t)e(and)i(system)e(call)j(en)o(ter/l=
ea)o=0A=
(v)o(e)e(\(w)o(ell,)150 153 y(most)14 b(of)h(the)g(macros)g(em)o(b)q(ed)h=0A=
(assem)o(bly)f(co)q(de,)h(to)q(o\).)150 330 y Ft(B.2)69 b(Spinning)23=0A=
b(the)f(wheel)150 463 y FH(After)16 =
b(dealing)i(with)g(all)f(the)g(tric)o(ky)=0A=
g(questions,)g FE(start)p 1146 463 15 2 v 17 w(kernel\(\))e=0A=
FH(initializes)20 b(all)e(the)e(parts)h(of)f(the)150 527 =
y(k)o(ernel,)g(sp)q=0A=
(eci\014cally:)218 652 y FG(\017)23 b FH(Sets)15 =
b(the)g(memory)g(b)q(ounds)h=0A=
(and)f(calls)h FE(paging)p 1108 652 V 17 w(init\(\))p FH(.)218=0A=
754 y FG(\017)23 b FH(Initializes)18 =
b(the)d(traps,)f(IR)o(Q)i(c)o(hannels)h=0A=
(and)e(sc)o(heduling.)218 856 y FG(\017)23 b FH(P)o(arses)14=0A=
b(the)h(command)g(line.)218 957 y FG(\017)23 b FH(If)15 =
b(requested)h(to,)e=0A=
(allo)q(cates)i(a)f(pro\014ling)h(bu\013er.)218 1059 y FG(\017)23=0A=
b FH(Initializes)18 b(all)e(the)f(device)i(driv)o(ers)e(and)h(disk)g=0A=
(bu\013ering,)g(as)f(w)o(ell)h(as)f(other)g(minor)g(parts.)218=0A=
1161 y FG(\017)23 b FH(Calibrates)15 =
b(the)g(dela)o(y)h(lo)q(op)g(\(computes)=0A=
f(the)g(\\BogoMips")g(n)o(um)o(b)q(er\).)218 1263 y FG(\017)23=0A=
b FH(Chec)o(ks)15 =
b(if)h(in)o(terrupt)f(16)g(w)o(orks)f(with)h(the)h(copro)q=0A=
(cessor.)221 1388 y(Finally)l(,)g(the)f(k)o(ernel)h(is)g(ready)f(to)g=0A=
FE(move)p 922 1388 V 16 w(to)p 986 1388 V 17 w(user)p 1099=0A=
1388 V 17 w(mode\(\))p FH(,)f(in)i(order)f(to)g(fork)f(the)h=0A=
FE(init)g FH(pro)q(cess,)150 1452 =
y(whose)f(co)q(de)i(is)f(in)g(the)g(same)f=0A=
(source)h(\014le.)21 b(Pro)q(cess)14 =
b(n)o(um)o(b)q(er)h(0)f(then,)h(the)g=0A=
(so-called)h(idle)g(task,)e(k)o(eeps)150 1517 y(running)i(in)g(an)f=0A=
(in\014nite)j(idle)e(lo)q(op.)221 1604 y(The)f FE(init)g FH(pro)q(cess)g=0A=
(tries)g(to)g(execute)h FE(/etc/init)p FH(,)d(or)i FE(/bin/init)p=0A=
FH(,)f(or)g FE(/sbin/init)p FH(.)221 1692 y(If)k(none)g(of)f(them)h=0A=
(succeeds,)h(co)q(de)f(is)g(pro)o(vided)h(to)e(execute)h(\\)p=0A=
FE(/bin/sh)23 b(/etc/rc)p FH(")16 b(and)i(fork)f(a)150 1757=0A=
y(ro)q(ot)c(shell)i(on)e(the)g(\014rst)g(terminal.)20 b(This)14=0A=
b(co)q(de)g(dates)f(bac)o(k)h(to)e(Lin)o(ux)j(0.01,)d(when)i(the)f(OS)h(w=
)o=0A=
(as)f(made)150 1821 y(b)o(y)i(the)g(k)o(ernel)h(alone,)g(and)f(no)g=0A=
FE(login)g FH(pro)q(cess)g(w)o(as)g(a)o(v)m(ailable.)221 1934=0A=
y(After)j FE(exec\(\))p FH(ing)i(the)f FE(init)g =
FH(program)f(from)g(one)i=0A=
(of)f(the)g(standard)g(places)h(\(let's)f(assume)g(w)o(e)150=0A=
1998 y(ha)o(v)o(e)14 b(one)g(of)g(them\),)g(the)g(k)o(ernel)h(has)f(no)g=0A=
(direct)h(con)o(trol)f(on)g(the)g(program)f(\015o)o(w.)19 b(Its)c(role,)f=0A=
(from)f(no)o(w)150 2062 =
y(on)i(is)g(to)f(pro)o(vide)h(pro)q(cesses)g(with)g=0A=
(system)f(calls,)i(as)e(w)o(ell)i(as)e(servicing)i(async)o(hronous)f(ev)o=
(en)=0A=
o(ts)f(\(suc)o(h)150 2127 y(as)19 b(hardw)o(are)f(in)o(terrupts\).)31=0A=
b(Multitasking)20 b(has)f(b)q(een)h(setup,)g(and)f(it)g(is)h(no)o(w)e=0A=
FE(init)h FH(who)g(manages)150 2191 y(m)o(ultiuser)d(access)f(b)o(y)h=0A=
FE(fork\(\))p FH(ing)f(system)f(daemons)h(and)h FE(login)e=0A=
FH(pro)q(cesses.)221 2279 =
y(Being)e(the)g(k)o(ernel)g(in)h(c)o(harge)e(of)h=0A=
(pro)o(viding)g(services,)h(the)f(tour)f(will)i(pro)q(ceed)g(b)o(y)f(lo)q=0A=
(oking)g(at)f(those)150 2343 =
y(services)h(\(the)f(\\system)g(calls"\),)h(as)f=0A=
(w)o(ell)i(as)e(b)o(y)g(pro)o(viding)i(general)e(ideas)i(ab)q(out)e(the)g=0A=
(underlying)j(data)150 2408 =
y(structures)h(and)g(co)q(de)h(organization.)p=0A=
eop=0A=
%%Page: 127 138=0A=
127 137 bop 150 -84 1800 3 v 150 -100 a FD(B.3.)42 b(Ho)o(w)17=0A=
b(the)h(k)o(ernel)f(sees)g(a)h(pro)q(cess)915 b FH(127)150=0A=
88 y Ft(B.3)69 b(Ho)n(w)23 b(the)f(k)n(ernel)g(sees)g(a)i(pro)r(cess)150=0A=
221 y FH(>F)l(rom)15 =
b(the)g(k)o(ernel)h(p)q(oin)o(t)g(of)f(view,)g(a)g(pro)q=0A=
(cess)g(is)h(an)f(en)o(try)g(in)h(the)f(pro)q(cess)h(table.)k(Nothing)c=0A=
(more.)221 309 =
y(The)i(pro)q(cess)g(table,)g(then,)h(is)f(one)g(of)g(the)g=0A=
(most)f(imp)q(ortan)o(t)g(data)g(structures)h(within)h(the)f(sys-)150=0A=
373 =
y(tem,)k(together)e(with)i(the)f(memory-managemen)o(t)f(tables)h(and)h=0A=
(the)f(bu\013er)h(cac)o(he.)38 b(The)21 b(individ-)150 438=0A=
y(ual)f(item)g(in)g(the)f(pro)q(cess)h(table)g(is)f(the)h FE(task)p=0A=
989 438 15 2 v 16 w(struct)f FH(structure,)h(quite)g(a)f(h)o(uge)g(one,)h=0A=
(de\014ned)h(in)150 502 y FE(include/linux/sched.h)p =
FH(.)e(Within)e(the)f=0A=
FE(task)p 1020 502 V 17 w(struct)f FH(b)q(oth)h(lo)o(w-lev)o(el)i(and)e=0A=
(high-lev)o(el)i(informa-)150 567 =
y(tion)c(is)g(k)o(ept|)f(ranging)h(from)e=0A=
(the)i(cop)o(y)f(of)g(some)g(hardw)o(are)g(registers)g(to)g(the)g(ino)q(d=
e)i=0A=
(of)e(the)g(w)o(orking)150 631 y(directory)i(for)g(the)g(pro)q(cess.)221=0A=
719 y(The)21 =
b(pro)q(cess)g(table)g(is)h(b)q(oth)f(an)g(arra)o(y)e(and)j(a)e=0A=
(double-link)o(ed)k(list,)f(as)e(w)o(ell)h(as)e(a)h(tree.)37=0A=
b(The)150 783 y(ph)o(ysical)16 =
b(implemen)o(tation)h(is)e(a)g(static)g(arra)o=0A=
(y)f(of)h(p)q(oin)o(ters,)g(whose)g(length)h(is)f FE(NR)p 1583=0A=
783 V 17 w(TASKS)p FH(,)f(a)h(constan)o(t)150 847 y(de\014ned)g(in)f=0A=
FE(include/linux/tasks.h)p =
FH(,)d(and)i(eac)o(h)h(structure)f(resides)i(in)f=0A=
(a)f(reserv)o(ed)h(memory)e(page.)150 912 y(The)20 =
b(list)g(structure)f(is)h=0A=
(ac)o(hiev)o(ed)h(through)e(the)g(p)q(oin)o(ters)h FE(next)p=0A=
1301 912 V 17 w(task)f FH(and)h FE(prev)p 1622 912 V 16 w(task)p=0A=
FH(,)g(while)h(the)150 976 =
y(tree)d(structure)g(is)h(quite)g(complex)h(and)e=0A=
(will)i(not)e(b)q(e)h(describ)q(ed)i(here.)30 b(Y)l(ou)18 =
b(ma)o(y)g(wish)h=0A=
(to)f(c)o(hange)150 1041 y FE(NR)p 201 1041 V 17 w(TASKS)13=0A=
b =
FH(from)f(the)i(default)g(v)m(aue)g(of)f(128,)g(but)h(b)q(e)g(sure)f(to)g=0A=
(ha)o(v)o(e)g(prop)q(er)h(dep)q(endency)i(\014les)e(to)f(force)150=0A=
1105 y(recompilation)j(of)f(all)h(the)g(source)f(\014les)h(in)o(v)o(olv)o=0A=
(ed.)221 1193 =
y(After)c(b)q(o)q(oting)i(is)f(o)o(v)o(er,)f(the)i(k)o(ernel)f=0A=
(is)h(alw)o(a)o(ys)e(w)o(orking)h(on)g(b)q(ehalf)h(of)e(one)i(of)e(the)h(=
pro)=0A=
q(cesses,)h(and)150 1257 y(the)f(global)h(v)m(ariable)h FE(current)p=0A=
FH(,)d(a)h(p)q(oin)o(ter)g(to)g(a)g FE(task)p 1099 1257 V 17=0A=
w(struct)f FH(item,)h(is)h(used)g(to)e(record)i(the)f(running)150=0A=
1321 y(one.)28 b FE(current)16 b =
FH(is)j(only)f(c)o(hanged)g(b)o(y)g(the)g=0A=
(sc)o(heduler,)h(in)g FE(kernel/sched.c)p FH(.)25 b(When,)19=0A=
b(ho)o(w)o(ev)o(er,)e(all)150 1386 =
y(pro)q(cecces)d(m)o(ust)f(b)q(e)h(lo)q=0A=
(ok)o(ed)g(at,)f(the)h(macro)e FE(for)p 1014 1386 V 17 w(each)p=0A=
1127 1386 V 17 w(task)h FH(is)h(used.)20 b(It)13 =
b(is)h(conderably)g(faster)f=0A=
(than)150 1450 =
y(a)i(sequen)o(tial)h(scan)g(of)e(the)i(arra)o(y)l(,)d(when)j=0A=
(the)f(system)g(is)h(ligh)o(tly)g(loaded.)221 1538 =
y(A)h(pro)q(cess)g(is)h=0A=
(alw)o(a)o(ys)f(running)h(in)g(either)g(\\user)f(mo)q(de")h(or)e(\\k)o(er=
nel)=0A=
i(mo)q(de".)26 b(The)18 b(main)f(b)q(o)q(dy)150 1602 y(of)f(a)g(user)g=0A=
(program)f(is)h(executed)h(in)g(user)g(mo)q(de)f(and)g(system)g(calls)h(a=
re)f=0A=
(executed)h(in)g(k)o(ernel)g(mo)q(de.)150 1667 =
y(The)c(stac)o(k)f(used)i(b)o=0A=
(y)f(the)g(pro)q(cess)g(in)h(the)f(t)o(w)o(o)e(execution)j(mo)q(des)g(is)=
f=0A=
(di\013eren)o(t|a)h(con)o(v)o(en)o(tional)g(stac)o(k)150 1731=0A=
y(segmen)o(t)k(is)g(used)g(for)g(user)g(mo)q(de,)g(while)i(a)d(\014xed-si=
ze)j=0A=
(stac)o(k)d(\(one)h(page,)g(o)o(wned)g(b)o(y)g(the)g(pro)q(cess\))150=0A=
1795 y(is)h(used)g(in)g(k)o(ernel)g(mo)q(de.)29 b(The)18 =
b(k)o(ernel)h(stac)o=0A=
(k)f(page)g(is)h(nev)o(er)f(sw)o(app)q(ed)h(out,)f(b)q(ecause)h(it)g(m)o(=
ust)=0A=
e(b)q(e)150 1860 =
y(a)o(v)m(ailable)g(whenev)o(er)e(a)g(system)g(call)h(is)g=0A=
(en)o(tered.)221 1948 =
y(System)d(calls,)h(within)g(the)g(k)o(ernel,)g(exist)f=0A=
(as)g(C)g(language)h(functions,)g(their)f(`o\016cial')g(name)h(b)q(eing)1=
50=0A=
2012 y(pre\014xed)j(b)o(y)f(`)p FE(sys)p 476 2012 V 16 w FH('.)22=0A=
b(A)16 b(system)g(call)h(named,)f(for)g(example,)g FC(burnout)h=0A=
FH(in)o(v)o(ok)o(es)f(the)g(k)o(ernel)h(function)150 2076 y=0A=
FE(sys)p 225 2076 V 17 w FC(burnout)t FE(\(\))p FH(.)221 2177=0A=
y Fj(The)36 b(system)f(call)g(mec)o(hanism)f(is)h(describ)q(ed)j(in)d(c)o=0A=
(hapter)i(3)e(of)221 2218 y(this)d(guide.)73 b(Lo)q(oking)31=0A=
b(at)i Fs(for)p 819 2218 14 2 v 15 w(each)p 922 2218 V 14 w(task)f=0A=
Fj(and)g Fs(SET)p 1221 2218 V 15 w(LINKS)p Fj(,)f(in)221 2259=0A=
y Fs(include/linux/s)o(ched.)o(h)11 b =
Fj(can)j(help)g(understanding)g(the)g=0A=
(list)g(and)f(tree)221 2300 =
y(structures)j(in)d(the)i(pro)q(cess)h(table.)p=0A=
eop=0A=
%%Page: 128 139=0A=
128 138 bop 150 -84 1800 3 v 150 -100 a FD(B.4.)42 b(Creating)19=0A=
b(and)f(destro)o(ying)g(pro)q(cesses)816 b FH(128)150 88 y=0A=
Ft(B.4)69 b(Creating)22 b(and)i(destro)n(ying)f(pro)r(cesses)150=0A=
221 y FH(A)14 b(unix)i(system)d(creates)h(a)g(pro)q(cess)h(though)f(the)g=0A=
FE(fork\(\))g FH(system)g(call,)h(and)f(pro)q(cess)h(termination)f(is)150=0A=
286 y(p)q(erformed)j(either)g(b)o(y)f FE(exit\(\))g FH(or)g(b)o(y)h=0A=
(receiving)h(a)e(signal.)25 b(The)16 =
b(Lin)o(ux)i(implemen)o(tation)g(for)e=0A=
(them)150 350 y(resides)g(in)g FE(kernel/fork.c)e FH(and)h=0A=
FE(kernel/exit.c)p FH(.)221 438 y(F)l(orking)h(is)g(easy)l(,)g(and)h=0A=
FE(fork.c)e FH(is)h(short)g(and)g(ready)g(understandable.)24=0A=
b(Its)16 b(main)h(task)e(is)i(\014lling)150 502 =
y(the)e(data)g(structure)g=0A=
(for)f(the)i(new)f(pro)q(cess.)20 =
b(Relev)m(an)o(t)d(steps,)d(apart)h(from)f=0A=
(\014lling)k(\014elds,)e(are)218 627 y FG(\017)23 b FH(getting)15=0A=
b(a)g(free)g(page)g(to)f(hold)i(the)g FE(task)p 983 627 15=0A=
2 v 16 w(struct)218 729 y FG(\017)23 b FH(\014nding)16 =
b(an)f(empt)o(y)g(pro)=0A=
q(cess)h(slot)f(\()p FE(find)p 979 729 V 16 w(empty)p 1115=0A=
729 V 17 w(process\(\))p FH(\))218 831 y FG(\017)23 b FH(getting)15=0A=
b(another)f(free)i(page)f(for)f(the)i FE(kernel)p 1073 831=0A=
V 16 w(stack)p 1209 831 V 16 w(page)218 933 y FG(\017)23 b=0A=
FH(cop)o(ying)15 b(the)h(father's)e(LDT)h(to)g(the)g(c)o(hild)218=0A=
1034 y FG(\017)23 b FH(duplicating)17 b FE(mmap)e =
FH(information)g(of)g(the)g=0A=
(father)150 1159 y FE(sys)p 225 1159 V 17 w(fork\(\))f =
FH(also)h(manages)g=0A=
(\014le)h(descriptors)g(and)f(ino)q(des.)221 1238 y =
Fj(The)g(1.0)e(k)o(ernel)=0A=
j(o\013ers)f(some)f(v)o(estigial)g(supp)q(ort)h(to)g(threading,)f(and)h(t=
he)=0A=
221 1280 y Fs(fork\(\))h =
Fj(system)i(call)f(sho)o(ws)i(some)e(hin)o(ts)h(to)f=0A=
(that.)31 b(Kernel)19 b(threads)g(is)221 1321 y(w)o(ork-in-progress)14=0A=
b(outside)g(the)g(mainstream)e(k)o(ernel.)221 1413 y =
FH(Exiting)h(from)f(a)g=0A=
(pro)q(cess)g(is)h(tric)o(kier,)h(b)q(ecause)f(the)g(paren)o(t)f(pro)q(ce=
ss)h=0A=
(m)o(ust)e(b)q(e)j(noti\014ed)f(ab)q(out)f(an)o(y)150 1477=0A=
y(c)o(hild)k(who)e(exits.)20 b(Moreo)o(v)o(er,)13 =
b(a)h(pro)q(cess)h(can)g=0A=
(exit)g(b)o(y)f(b)q(eing)i FE(kill\(\))p FH(ed)e(b)o(y)g(another)g(pro)q=0A=
(cess)h(\(these)150 1541 y(are)h Fn(un)p FB(?)p Fn(x)f FH(features\).)23=0A=
b(The)16 b(\014le)i FE(exit.c)d FH(is)i(therefore)f(the)g(home)g(of)g=0A=
FE(sys)p 1455 1541 V 17 w(kill\(\))f FH(and)i(the)f(v)m(airious)150=0A=
1606 y(\015a)o(v)o(ours)e(of)h FE(sys)p 445 1606 V 17 w(wait\(\))p=0A=
FH(,)f(in)i(addition)g(to)f FE(sys)p 993 1606 V 16 w(exit\(\))p=0A=
FH(.)221 1694 y(The)g(co)q(de)g(b)q(elonging)h(to)f FE(exit.c)f=0A=
FH(is)h(not)f(describ)q(ed)j(here|it)f(is)f(not)g(that)f(in)o(teresting.)=
20=0A=
b(It)15 b(deals)150 1758 =
y(with)e(a)f(lot)h(of)f(details)h(in)h(order)e(to)g=0A=
(lea)o(v)o(e)g(the)h(system)f(in)h(a)g(consisten)o(t)f(state.)18=0A=
b(The)13 b(POSIX)h(standard,)150 1822 =
y(then,)h(is)h(quite)g(demanding)g(ab)q=0A=
(out)f(signals,)h(and)f(it)h(m)o(ust)e(b)q(e)i(dealt)g(with.)150=0A=
2000 y Ft(B.5)69 b(Executing)22 b(programs)150 2132 y FH(After)12=0A=
b FE(fork\(\))p =
FH(ing,)g(t)o(w)o(o)f(copies)i(of)f(the)g(same)g(program)f=0A=
(are)h(running.)20 b(One)12 b(of)g(them)g(usually)i FE(exec\(\))p=0A=
FH(s)150 2197 y(another)i(program.)21 b(The)16 b FE(exec\(\))f=0A=
FH(system)g(call)j(m)o(ust)d(lo)q(cate)h(the)g(binary)h(image)f(of)g(the)=
g=0A=
(executable)150 2261 y(\014le,)f(load)f(and)g(run)g(it.)20=0A=
b(The)14 =
b(w)o(ord)f(`load')h(do)q(esn't)g(necessarily)h(mean)f(\\cop)o(y)f=0A=
(in)i(memory)e(the)h(binary)150 2325 =
y(image",)h(as)f(Lin)o(ux)j(supp)q(orts)=0A=
e(demand)h(loading.)221 2413 y(The)e(Lin)o(ux)i(implemen)o(tation)g(of)d=0A=
FE(exec\(\))h =
FH(supp)q(orts)g(di\013eren)o(t)i(binary)f(formats.)j(This)d=0A=
(is)g(accom-)150 2478 y(plished)h(through)e(the)h FE(linux)p=0A=
675 2478 V 16 w(binfmt)e =
FH(structure,)h(whic)o(h)h(em)o(b)q(eds)g(t)o(w)o(o)=0A=
e(p)q(oin)o(ters)i(to)f(functions|one)150 2542 y(to)j(load)h(the)g=0A=
(executable)h(and)e(the)h(other)f(to)g(load)h(the)g(library)l(,)h(eac)o(h=
)f=0A=
(binary)g(format)e(represen)o(ting)p eop=0A=
%%Page: 129 140=0A=
129 139 bop 150 -84 1800 3 v 150 -100 a FD(B.6.)42 b(Accessing)18=0A=
b(\014lesystems)1115 b FH(129)150 88 y(b)q(oth)13 =
b(the)g(executable)i(and)e=0A=
(the)g(library)l(.)20 b(Loading)14 =
b(of)f(shared)g(libraries)i(is)e(implemen)=0A=
o(ted)i(in)f(the)f(same)150 153 y(source)i(\014le)i(as)d FE(exec\(\))h=0A=
FH(is,)g(but)g(let's)h(stic)o(k)f(to)f FE(exec\(\))h FH(itself.)221=0A=
241 y(The)d Fn(un)p FB(?)p Fn(x)f =
FH(systems)h(pro)o(vide)h(the)f(programmer)=0A=
f(with)i(six)f(\015a)o(v)o(ours)g(of)f(the)i FE(exec\(\))e=0A=
FH(function.)20 b(All)150 305 y(but)15 b(one)g(of)g(them)g(can)g(b)q(e)h=0A=
(implemen)o(ted)g(as)f(library)h(functions,)f(and)h(theLin)o(ux)g(k)o(ern=
el)g=0A=
(implemen)o(ts)150 369 y FE(sys)p 225 369 15 2 v 17 w(execve\(\))f=0A=
FH(alone.)25 b(It)17 =
b(p)q(erforms)f(quite)h(a)g(simple)h(task:)k(loading)17=0A=
b(the)g(head)g(of)f(the)h(executable,)150 434 =
y(and)e(trying)f(to)g(execute)h=0A=
(it.)20 b(If)15 b(the)g(\014rst)f(t)o(w)o(o)f(b)o(ytes)h(are)g(\\)p=0A=
FE(#!)p FH(",)g(then)h(the)f(\014rst)g(line)j(is)e(parsed)f(and)h(an)150=0A=
498 =
y(in)o(terpreter)g(is)h(in)o(v)o(ok)o(ed,)f(otherwise)h(the)f(registered)=0A=
g(binary)h(formats)e(are)h(sequen)o(tially)i(tried.)221 586=0A=
y(The)c(nativ)o(e)g(Lin)o(ux)h(format)e(is)i(supp)q(orted)f(directly)i=0A=
(within)f FE(fs/exec.c)p FH(,)e(and)h(the)h(relev)m(an)o(t)f(func-)150=0A=
650 y(tions)f(are)f FE(load)p 429 650 V 17 w(aout)p 542 650=0A=
V 16 w(binary)g FH(and)h FE(load)p 894 650 V 17 w(aout)p 1007=0A=
650 V 16 w(library)p FH(.)18 b(As)11 b(for)g(the)h(binaries,)h(the)f=0A=
(function)h(load-)150 715 y(ing)h(an)f FC(a.out)18 b =
FH(executable)c(ends)g=0A=
(up)f(either)h(in)g FE(mmap\(\))p =
FH(ing)e(the)i(disk)f(\014le,)h(or)f(in)h=0A=
(calling)h FE(read)p 1781 715 V 16 w(exec\(\))p FH(.)150 779=0A=
y(The)e(former)g(w)o(a)o(y)f(uses)i(the)f(Lin)o(ux)i(demand)e(loading)h(m=
ec)o=0A=
(hanism)g(to)f(fault-in)h(program)e(pages)h(when)150 843 y(they're)j=0A=
(accessed,)i(while)g(the)f(latter)g(w)o(a)o(y)e(is)j(used)f(when)g(memory=
)f=0A=
(mapping)i(is)f(not)g(supp)q(orted)g(b)o(y)150 908 y(the)e(host)g=0A=
(\014lesystem)h(\(for)e(example)i(the)f(\\msdos")g(\014lesystem\).)221=0A=
988 y Fj(Late)e(1.1)f(k)o(ernels)h(em)o(b)q(ed)g(a)f(revised)i(msdos)e=0A=
(\014lesystem,)h(whic)o(h)f(supp)q(orts)221 1029 y Fs(mmap\(\))p=0A=
Fj(.)j(Moreo)o(v)o(er,)c(the)g Fs(struct)20 b(linux)p 904 1029=0A=
14 2 v 15 w(binfmt)9 b Fj(is)h(a)g(link)o(ed)f(list)h(rather)221=0A=
1071 y(than)17 b(an)h(arra)o(y)m(,)f(to)h(allo)o(w)e(loading)g(a)h(new)h=0A=
(binary)f(format)f(as)i(a)f(k)o(ernel)221 1112 y(mo)q(dule.)24=0A=
b(Finally)m(,)15 =
b(the)i(structure)i(itself)d(has)h(b)q(een)g(extended)h(to)f=0A=
(access)221 1153 y(format-related)12 b(core-dump)h(routines.)150=0A=
1311 y Ft(B.6)69 b(Accessing)21 b(\014lesystems)150 1444 y=0A=
FH(It)c(is)g(w)o(ell)h(kno)o(wn)e(that)g(the)h(\014lesystem)g(is)h(the)e=0A=
(most)g(basic)i(resource)f(in)g(a)g Fn(un)p FB(?)p Fn(x)f =
FH(system,)g(so)g=0A=
(basic)150 1509 =
y(and)i(ubiquitous)h(that)e(it)h(needs)h(a)e(more)h(handy)g=0A=
(name)g(|)g(I'll)h(stic)o(k)f(to)f(the)h(standard)f(practice)h(of)150=0A=
1573 y(calling)f(it)e(simply)i(\\fs".)221 1661 y(I'll)22 b(assume)f(the)g=0A=
(reader)g(already)h(kno)o(ws)e(the)h(basic)h Fn(un)p FB(?)p=0A=
Fn(x)e FH(fs)h(ideas)h(|)g(access)f(p)q(ermissions,)150 1725=0A=
y(ino)q(des,)i(the)d(sup)q(erblo)q(c)o(k,)j FE(mount)p FH(ing)d(and)h=0A=
FE(umount)p FH(ing.)35 b(Those)20 =
b(concepts)h(are)f(w)o(ell)i(explained)g(b)=0A=
o(y)150 1790 y(smarter)17 =
b(authors)h(than)g(me)h(within)h(the)e(standard)g=0A=
Fn(un)p FB(?)p Fn(x)g =
FH(literature,)h(so)f(I)h(w)o(on't)e(duplicate)j(their)=0A=
150 1854 y(e\013orts)15 b(and)g(I'll)i(stic)o(k)e(to)g(Lin)o(ux)h(sp)q=0A=
(eci\014c)h(issues.)221 1942 =
y(While)e(the)g(\014rst)f(Unices)h(used)g(to)f=0A=
(supp)q(ort)h(a)f(single)i(fs)e(t)o(yp)q(e,)g(whose)g(structure)g(w)o(as)=
g=0A=
(widespread)150 2006 y(in)j(the)g(whole)g(k)o(ernel,)h(to)q(da)o(y's)d=0A=
(practice)j(is)f(to)f(use)h(a)f(standardized)i(in)o(terface)f(b)q(et)o(w)=
o=0A=
(een)f(the)h(k)o(ernel)150 2071 =
y(and)k(the)f(fs,)h(in)g(order)f(to)g(ease)g=0A=
(data)g(in)o(terc)o(hange)h(across)e(arc)o(hitectures.)36 b(Lin)o(ux)21=0A=
b(itself)g(pro)o(vides)150 2135 =
y(a)g(standardized)h(la)o(y)o(er)f(to)g(pass)=0A=
g(information)g(b)q(et)o(w)o(een)h(the)f(k)o(ernel)h(and)g(eac)o(h)f(fs)g=
(mo)=0A=
q(dule.)39 b(This)150 2199 y(in)o(terface)15 =
b(la)o(y)o(er)g(is)h(called)h=0A=
(VFS,)e(for)f(\\virtual)i(\014lesystem".)221 2287 =
y(Filesystem)f(co)q(de)g=0A=
(is)h(therefore)e(split)i(in)o(to)f(t)o(w)o(o)e(la)o(y)o(ers:)20=0A=
b(the)14 b(upp)q(er)i(la)o(y)o(er)f(is)g(concerned)h(with)f(the)150=0A=
2351 =
y(managemen)o(t)h(of)h(k)o(ernel)g(tables)g(and)g(data)g(structures,)f=0A=
(while)j(the)e(lo)o(w)o(er)f(la)o(y)o(er)h(is)g(made)g(up)g(of)g(the)150=0A=
2416 =
y(set)e(of)g(fs-dep)q(enden)o(t)h(functions,)g(and)f(is)h(in)o(v)o(ok)o=0A=
(ed)f(through)g(the)h(VFS)f(data)f(structures.)221 2504 y(All)j(the)f=0A=
(fs-indep)q(enden)o(t)j(material)d(resides)h(in)g(the)f FE(fs/*.c)f=0A=
FH(\014les.)24 b(They)16 b(address)g(the)g(follo)o(wing)p eop=0A=
%%Page: 130 141=0A=
130 140 bop 150 -84 1800 3 v 150 -100 a FD(B.7.)42 b(Quic)o(k)18=0A=
b(Anatom)o(y)f(of)h(a)g(Filesystem)f(T)o(yp)q(e)742 b FH(130)150=0A=
88 y(issues:)218 214 y FG(\017)23 b FH(Managing)14 b(the)i(bu\013er)g(c)o=0A=
(hac)o(he)f(\()p FE(buffer.c)p FH(\);)218 315 y FG(\017)23=0A=
b FH(Resp)q(onding)17 b(to)d(the)i FE(fcntl\(\))e FH(and)h=0A=
FE(ioctl\(\))f FH(system)h(calls)h(\()p FE(fcntl.c)e FH(and)i=0A=
FE(ioctl.c)p FH(\);)218 417 y FG(\017)23 b FH(Mapping)15 =
b(pip)q(es)i(and)e=0A=
(\014fos)g(on)g(ino)q(des)i(and)e(bu\013ers)h(\()p FE(fifo.c)p=0A=
FH(,)e FE(pipe.c)p FH(\);)218 519 y FG(\017)23 b FH(Managing)14=0A=
b(\014le-)j(and)e(ino)q(de-tables)i(\()p FE(file)p 1022 519=0A=
15 2 v 17 w(table.c)p FH(,)c FE(inode.c)p FH(\);)218 620 y=0A=
FG(\017)23 b FH(Lo)q(c)o(king)16 =
b(and)f(unlo)q(c)o(king)i(\014les)f(and)f=0A=
(records)h(\()p FE(locks.c)p FH(\);)218 722 y FG(\017)23 b=0A=
FH(Mapping)15 b(names)g(to)g(ino)q(des)h(\()p FE(namei.c)p=0A=
FH(,)e FE(open.c)p FH(\);)218 824 y FG(\017)23 b FH(Implemen)o(ting)17=0A=
b(the)e(tric)o(ky)g FE(select\(\))f FH(function)i(\()p FE(select.c)p=0A=
FH(\);)218 926 y FG(\017)23 b FH(Pro)o(viding)15 b(information)h(\()p=0A=
FE(stat.c)p FH(\);)218 1027 y FG(\017)23 b FE(mount)p FH(ing)15=0A=
b(and)g FE(umount)p FH(ing)g(\014lesystems)h(\()p FE(super.c)p=0A=
FH(\);)218 1129 y FG(\017)23 b FE(exec\(\))p FH(ing)15 =
b(executables)h(and)f=0A=
(dumping)i(cores)e(\()p FE(exec.c)p FH(\);)218 1231 y FG(\017)23=0A=
b FH(Loading)16 b(the)f(v)m(arious)g(binary)h(formats)e(\()p=0A=
FE(bin)p 1074 1231 V 17 w(fmt*.c)p =
FH(,)f(as)i(outlined)i(ab)q(o)o(v)o(e\).)=0A=
221 1356 y(The)12 =
b(VFS)g(in)o(terface,)g(then,)h(consists)f(of)f(a)h(set)g=0A=
(of)f(relativ)o(ely)i(high-lev)o(el)h(op)q(erations)f(whic)o(h)f(are)g(in=
-)=0A=
150 1420 =
y(v)o(ok)o(ed)f(from)f(the)h(fs-indep)q(enden)o(t)j(co)q(de)d(and)g=0A=
(are)g(actually)h(p)q(erformed)f(b)o(y)g(eac)o(h)g(\014lesystem)h(t)o(yp)=
q=0A=
(e.)19 b(The)150 1485 y(most)14 b(relev)m(an)o(t)i(structures)e(are)h=0A=
FE(inode)p 844 1485 V 16 w(operations)f FH(and)h FE(file)p=0A=
1298 1485 V 17 w(operations)p FH(,)e(though)i(they're)f(not)150=0A=
1549 y(alone:)20 b(other)15 b(structures)g(exist)h(as)e(w)o(ell.)21=0A=
b(All)c(of)e(them)g(are)g(de\014ned)h(within)h FE(include/linux/fs.h)p=0A=
FH(.)221 1637 =
y(The)k(k)o(ernel)h(en)o(try)e(p)q(oin)o(t)i(to)e(the)h(actual)=0A=
h(\014le)g(system)e(is)i(the)f(structure)g FE(file)p 1668 1637=0A=
V 17 w(system)p 1829 1637 V 16 w(type)p FH(.)150 1701 =
y(An)i(arra)o(y)e(of)h=0A=
FE(file)p 516 1701 V 16 w(system)p 676 1701 V 17 w(type)p =
FH(s)f(is)i(em)o(b)=0A=
q(o)q(died)h(within)g FE(fs/filesystems.c)c FH(and)i(it)h(is)g(refer-)150=0A=
1766 y(enced)f(whenev)o(er)f(a)f FE(mount)g FH(is)h(issued.)37=0A=
b(The)21 b(function)g FE(read)p 1270 1766 V 17 w(super)f FH(for)g(the)g=0A=
(relev)m(an)o(t)h(fs)g(t)o(yp)q(e)f(is)150 1830 =
y(then)j(in)h(c)o(harge)f(of)=0A=
f(\014lling)j(a)e FE(struct)g(super)p 1002 1830 V 17 w(block)f=0A=
FH(item,)j(whic)o(h)f(in)g(turn)e(em)o(b)q(eds)i(a)f FE(struct)150=0A=
1894 y(super)p 273 1894 V 16 w(operations)13 b FH(and)h(a)g=0A=
FE(struct)23 b FC(typ)n(e)p 915 1894 V 21 w FE(sb)p 981 1894=0A=
V 17 w(info)p FH(.)18 =
b(The)d(former)e(pro)o(vides)h(p)q(oin)o(ters)h(to)e=0A=
(generic)i(fs)150 1959 =
y(op)q(erations)g(for)g(the)g(curren)o(t)g(fs-t)o(yp)q=0A=
(e,)g(the)g(latter)g(em)o(b)q(eds)h(sp)q(eci\014c)h(information)f(for)e(t=
he)h=0A=
(fs-t)o(yp)q(e.)221 2036 y =
Fj(The)h(arra)o(y)g(of)g(\014lesystem)g(t)o(yp)q=0A=
(es)h(has)g(b)q(een)g(turned)g(in)f(a)g(link)o(ed)g(list,)g(to)221=0A=
2080 =
y(allo)o(w)f(loading)g(new)i(fs)g(t)o(yp)q(es)h(as)f(k)o(ernel)g(mo)q=0A=
(dules.)26 b(The)17 b(function)g(\()p Fs(un)p Fj(-)221 2125=0A=
y(\))p Fs(register)p 416 2125 14 2 v 14 w(filesystem)12 b =
Fj(is)h(co)q(ded)i=0A=
(within)e Fs(fs/super.c)p Fj(.)150 2286 y Ft(B.7)69 b(Quic)n(k)22=0A=
b(Anatom)n(y)h(of)g(a)h(Filesystem)c(T)n(yp)r(e)150 2419 y=0A=
FH(The)e(role)g(of)g(a)f(\014lesystem)i(t)o(yp)q(e)f(is)g(to)f(p)q(erform=
)h=0A=
(the)g(lo)o(w-lev)o(el)h(tasks)e(used)i(to)e(map)h(the)g(relativ)o(ely)15=
0=0A=
2483 y(high)g(lev)o(el)h(VFS)f(op)q(erations)f(on)h(the)g(ph)o(ysical)g=0A=
(media)h(\(disks,)f(net)o(w)o(ork)e(or)h(whatev)o(er\).)26=0A=
b(The)18 b(VFS)p eop=0A=
%%Page: 131 142=0A=
131 141 bop 150 -84 1800 3 v 150 -100 a FD(B.7.)42 b(Quic)o(k)18=0A=
b(Anatom)o(y)f(of)h(a)g(Filesystem)f(T)o(yp)q(e)742 b FH(131)150=0A=
88 y(in)o(terface)20 =
b(is)g(\015exible)i(enough)f(to)e(allo)o(w)h(supp)q(ort)=0A=
g(for)f(b)q(oth)h(con)o(v)o(en)o(tional)g Fn(un)p FB(?)p Fn(x)f=0A=
FH(\014lesystems)i(and)150 153 y(exotic)16 =
b(situations)f(suc)o(h)h(as)e(the)=0A=
i FE(msdos)e FH(and)i FE(umsdos)e FH(t)o(yp)q(es.)221 241 =
y(Eac)o(h)h(fs-t)o=0A=
(yp)q(e)g(is)h(made)f(up)g(of)g(the)g(follo)o(wing)h(items,)f(in)h(additi=
on)h=0A=
(to)d(its)i(o)o(wn)e(directory:)218 366 y FG(\017)23 b FH(An)15=0A=
b(en)o(try)g(in)h(the)f FE(file)p 687 366 15 2 v 17 w(systems[])f=0A=
FH(arra)o(y)g(\()p FE(fs/filesystems.c)p FH(\);)218 468 y FG(\017)23=0A=
b FH(The)15 b(sup)q(erblo)q(c)o(k)i(include)g(\014le)g(\()p=0A=
FE(include/linux/)p FC(typ)n(e)p 1254 468 V 18 w FE(fs)p 1317=0A=
468 V 17 w(sb.h)p FH(\);)218 569 y FG(\017)23 b FH(The)15 b(ino)q(de)i=0A=
(include)g(\014le)f(\()p FE(include/linux/)p FC(typ)n(e)p 1148=0A=
569 V 19 w FE(fs)p 1212 569 V 17 w(i.h)p FH(\);)218 671 y FG(\017)23=0A=
b FH(The)15 b(generic)h(o)o(wn)f(include)j(\014le)e(\()p =
FE(include/linux/)p=0A=
FC(typ)n(e)p 1275 671 V 18 w FE(fs.h)p FH(\);)218 773 y FG(\017)23=0A=
b FH(Tw)o(o)c FE(#include)f FH(lines)k(within)f FE(include/linux/fs.h)p=0A=
FH(,)d(as)h(w)o(ell)i(as)e(the)h(en)o(tries)g(in)h FE(struct)264=0A=
837 y(super)p 387 837 V 16 w(block)15 b FH(and)g FE(struct)23=0A=
b(inode)p FH(.)221 962 y(The)18 =
b(o)o(wn)f(directory)i(for)e(the)h(fs)g(t)o=0A=
(yp)q(e)g(con)o(tains)g(all)h(the)f(real)h(co)q(de,)g(resp)q(onsible)h(of=
)d=0A=
(ino)q(de)j(and)150 1027 y(data)15 b(managemen)o(t.)221 1127=0A=
y Fj(The)j(c)o(hapter)i(ab)q(out)e Fs(procfs)f =
Fj(in)h(this)h(guide)f(unco)o=0A=
(v)o(ers)h(all)f(the)h(details)221 1169 =
y(ab)q(out)e(lo)o(w-lev)o(el)f(co)q=0A=
(de)j(and)f(VFS)f(in)o(terface)i(for)e(that)h(fs)g(t)o(yp)q(e.)30=0A=
b(Source)221 1210 y(co)q(de)13 b(in)g Fs(fs/procfs)e Fj(is)i(quite)g=0A=
(understandable)i(after)e(reading)g(the)h(c)o(hap-)221 1249=0A=
y(ter.)221 1321 y =
FH(W)l(e'll)e(no)o(w)g(lo)q(ok)g(at)f(the)h(in)o(ternal)g=0A=
(w)o(orkings)g(of)f(the)h(VFS)g(mec)o(hanism,)g(and)g(the)g=0A=
FE(minix)f FH(\014lesystem)150 1385 y(source)g(is)h(used)f(as)g(a)g(w)o=0A=
(orking)f(example.)20 b(I)11 b(c)o(hose)g(the)g FE(minix)g=0A=
FH(t)o(yp)q(e)g(b)q(ecause)h(it)f(is)h(small)f(but)h(complete;)150=0A=
1449 =
y(moreo)o(v)o(er,)e(an)o(y)g(other)g(fs)g(t)o(yp)q(e)g(in)h(Lin)o(ux)h=0A=
(deriv)o(es)f(from)e(the)i FE(minix)e FH(one.)19 b(The)10 b=0A=
FE(ext2)g FH(t)o(yp)q(e,)h(the)f(de-facto)150 1514 =
y(standard)k(in)h(recen)o=0A=
(t)f(Lin)o(ux)h(installations,)g(is)g(m)o(uc)o(h)f(more)g(complex)h(than)=
e=0A=
(that)h(and)g(its)g(exploration)150 1578 =
y(is)i(left)f(as)g(an)g(exercise)i=0A=
(for)d(the)h(smart)g(reader.)221 1666 y(When)k(a)f(minix-fs)j(is)e(moun)o=0A=
(ted,)h FE(minix)p 955 1666 V 16 w(read)p 1067 1666 V 17 w(super)e=0A=
FH(\014lls)i(the)f FE(super)p 1511 1666 V 17 w(block)f =
FH(structure)h(with)=0A=
150 1730 y(data)10 b(read)g(from)f(the)i(moun)o(ted)f(device.)20=0A=
b(The)10 b FE(s)p 973 1730 V 17 w(op)g =
FH(\014eld)i(of)e(the)g(structure)g=0A=
(will)i(then)f(hold)g(a)f(p)q(oin)o(ter)h(to)150 1795 y FE(minix)p=0A=
273 1795 V 16 w(sops)p =
FH(,)i(whic)o(h)g(is)g(used)g(b)o(y)g(the)f(generic)i=0A=
(\014lesystem)f(co)q(de)g(to)f(dispatc)o(h)h(sup)q(erblo)q(c)o(k)h(op)q=0A=
(erations.)221 1883 y(Chaining)19 =
b(the)g(newly)g(moun)o(ted)g(fs)f(in)h(the)=0A=
g(global)g(system)f(tree)g(relies)i(on)f(the)f(follo)o(wing)i(data)150=0A=
1947 y(items)g(\(assuming)g FE(sb)g FH(is)h(the)f FE(super)p=0A=
821 1947 V 17 w(block)f FH(structure)h(and)g FE(dir)p 1342=0A=
1947 V 17 w(i)g FH(p)q(oin)o(ts)g(to)g(the)g(ino)q(de)h(for)f(the)150=0A=
2011 y(moun)o(t)15 b(p)q(oin)o(t\):)218 2149 y FG(\017)23 b=0A=
FE(sb->s)p 387 2149 V 16 w(mounted)47 b FH(p)q(oin)o(ts)h(to)g(the)g(ro)q=0A=
(ot-dir)g(ino)q(de)h(of)e(the)h(moun)o(ted)g(\014lesystem)264=0A=
2213 y(\()p FE(MINIX)p 405 2213 V 16 w(ROOT)p 517 2213 V 16=0A=
w(INO)p FH(\);)218 2315 y FG(\017)23 b FE(dir)p 339 2315 V=0A=
16 w(i->i)p 451 2315 V 17 w(mount)15 b FH(holds)g FE(sb->s)p=0A=
841 2315 V 17 w(mounted)p FH(;)218 2417 y FG(\017)23 b FE(sb->s)p=0A=
387 2417 V 16 w(covered)14 b FH(holds)i FE(dir)p 776 2417 V=0A=
17 w(i)p eop=0A=
%%Page: 132 143=0A=
132 142 bop 150 -84 1800 3 v 150 -100 a FD(B.8.)42 b(The)18=0A=
b(console)g(driv)o(er)1175 b FH(132)221 88 y(Umoun)o(ting)33=0A=
b(will)i(ev)o(en)o(tually)f(b)q(e)f(p)q(erformed)h(b)o(y)f=0A=
FE(do)p 1262 88 15 2 v 17 w(umount)p =
FH(,)j(whic)o(h)e(in)g(turn)f(in)o(v)o=0A=
(ok)o(es)150 153 y FE(minix)p 273 153 V 16 w(put)p 361 153=0A=
V 17 w(super)p FH(.)221 241 y(Whenev)o(er)15 =
b(a)f(\014le)i(is)g(accessed,)f=0A=
FE(minix)p 905 241 V 16 w(read)p 1017 241 V 17 w(inode)f =
FH(comes)h(in)o(to)g=0A=
(pla)o(y;)g(it)g(\014lls)h(the)f(system-wide)150 305 y FE(inode)22=0A=
b FH(structure)g(with)h(\014elds)g(coming)g(form)f FE(minix)p=0A=
1130 305 V 16 w(inode)p FH(.)41 b(The)22 b FE(inode->i)p 1612=0A=
305 V 16 w(op)g FH(\014eld)i(is)f(\014lled)150 369 y(according)15=0A=
b(to)e FE(inode->i)p 603 369 V 16 w(mode)h =
FH(and)g(it)g(is)h(resp)q(onsible)=0A=
h(for)d(an)o(y)h(further)g(op)q(eration)g(on)g(the)g(\014le.)21=0A=
b(The)150 434 y(source)15 =
b(for)g(the)g(minix)i(functions)f(just)f(describ)q=0A=
(ed)i(are)e(to)f(b)q(e)i(found)f(in)i FE(fs/minix/inode.c)p=0A=
FH(.)221 522 y(The)e FE(inode)p 437 522 V 17 w(operations)f=0A=
FH(structure)i(is)g(used)g(to)f(dispatc)o(h)h(ino)q(de)h(op)q(erations)f(=
\(y)=0A=
o(ou)f(guessed)h(it\))150 586 =
y(to)j(the)i(fs-t)o(yp)q(e)f(sp)q(eci\014c)i(k)=0A=
o(ernel)f(functions;)h(the)f(\014rst)e(en)o(try)h(in)h(the)f(structure)g(=
is)h=0A=
(a)e(p)q(oin)o(ter)i(to)e(a)150 650 y FE(file)p 249 650 V 17=0A=
w(operations)d =
FH(item,)j(whic)o(h)g(is)f(the)g(data-managemen)o(t)f(equiv)m=0A=
(alen)o(t)i(of)f FE(i)p 1574 650 V 17 w(op)p FH(.)28 b(The)18=0A=
b(minix)h(fs-)150 715 y(t)o(yp)q(e)13 =
b(allo)o(ws)g(three)g(instances)h(of)f=0A=
(ino)q(de-op)q(eration)i(sets)d(\(for)h(direcotries,)h(for)e(\014les)i(an=
d)f=0A=
(for)g(sym)o(b)q(olic)150 779 =
y(links\))j(and)g(t)o(w)o(o)d(instances)j(of)f=0A=
(\014le-op)q(eration)i(sets)e(\(symlinks)h(don't)e(need)j(one\).)221=0A=
867 y(Directory)11 b(op)q(erations)g(\()p FE(minix)p 778 867=0A=
V 17 w(readdir)f FH(alone\))i(are)f(to)g(b)q(e)h(found)g(in)g=0A=
FE(fs/minix/dir.c)p FH(;)e(\014le)j(op-)150 931 =
y(erations)g(\(read)g(and)g=0A=
(write\))g(app)q(ear)g(within)h FE(fs/minix/file.c)d =
FH(and)i(symlink)i(op)q=0A=
(erations)e(\(reading)150 996 y(and)i(follo)o(wing)h(the)g(link\))g(in)g=0A=
FE(fs/minix/symlink.c)p FH(.)221 1083 y(The)f(rest)g(of)g(the)g(minix)h=0A=
(directory)g(implemen)o(ts)g(the)f(follo)o(wing)h(tasks:)218=0A=
1221 y FG(\017)23 b FE(bitmap.c)11 b FH(manages)h(allo)q(cation)h(and)g=0A=
(freeing)g(of)f(ino)q(des)h(and)g(blo)q(c)o(ks)g(\(the)f FE(ext2)g=0A=
FH(fs,)g(otherwise,)264 1285 =
y(has)j(t)o(w)o(o)f(di\013eren)o(t)i(source)f=0A=
(\014les\);)218 1387 y FG(\017)23 b FE(fsynk.c)11 b =
FH(is)j(resp)q(onsible)h=0A=
(for)d(the)h FE(fsync\(\))f =
FH(system)g(calls)i(|)f(it)g(manages)g(direct,)g=0A=
(indirect)i(and)264 1451 =
y(double)d(indirect)h(blo)q(c)o(ks)e(\(I)h(assume)e=0A=
(y)o(ou)h(kno)o(w)g(ab)q(out)g(them,)g(it's)g(common)g Fn(un)p=0A=
FB(?)p Fn(x)f FH(kno)o(wledge\);)218 1553 y FG(\017)23 b FE(namei.c)9=0A=
b =
FH(em)o(b)q(eds)i(all)g(the)f(name-related)h(ino)q(de)g(op)q(erations,)g=0A=
(suc)o(h)g(as)e(creating)i(and)f(destro)o(ying)264 1618 y(no)q(des,)15=0A=
b(renaming)h(and)f(linking;)218 1719 y FG(\017)23 b FE(truncate.c)13=0A=
b FH(p)q(erforms)i(truncation)h(of)e(\014les.)150 1896 y Ft(B.8)69=0A=
b(The)23 b(console)f(driv)n(er)150 2029 y FH(Being)13 =
b(the)g(main)f(I/O)h=0A=
(device)h(on)e(most)f(Lin)o(ux)j(b)q(o)o(xes,)e(the)h(console)g(driv)o(er=
)f=0A=
(deserv)o(es)h(some)f(atten)o(tion.)150 2094 y(The)i(source)f(co)q(de)h=0A=
(related)g(to)f(the)g(console,)h(as)f(w)o(ell)i(as)e(the)g(other)g(c)o=0A=
(haracter)g(driv)o(ers,)h(is)g(to)f(b)q(e)h(found)150 2158=0A=
y(in)20 b FE(drivers/char)p =
FH(,)d(and)i(w)o(e'll)h(use)f(this)g(v)o(ery)f=0A=
(directory)h(as)g(our)f(referenece)i(p)q(oin)o(t)f(when)h(naming)150=0A=
2222 y(\014les.)221 2310 y(Console)13 =
b(initialization)j(is)e(p)q(erformed)f=0A=
(b)o(y)g(the)g(function)h FE(tty)p 1298 2310 V 17 w(init\(\))p=0A=
FH(,)e(in)i FE(tty)p 1607 2310 V 17 w(io.c)p FH(.)19 b(This)13=0A=
b(func-)150 2375 =
y(tion)g(is)g(only)g(concerned)g(in)h(getting)e(ma)s(jor)f=0A=
(device)j(n)o(um)o(b)q(ers)f(and)f(calling)j(the)d(init)i(function)f(for)=
f=0A=
(eac)o(h)150 2439 y(device)17 b(set.)i FE(con)p 451 2439 V=0A=
17 w(init\(\))p FH(,)14 b(then)i(is)f(the)h(one)f(related)g(to)g(the)g=0A=
(console,)h(and)f(resides)h(in)g FE(console.c)p FH(.)p eop=0A=
%%Page: 133 144=0A=
133 143 bop 150 -84 1800 3 v 150 -100 a FD(B.8.)42 b(The)18=0A=
b(console)g(driv)o(er)1175 b FH(133)221 72 y Fj(Initialization)10=0A=
b(of)i(the)h(console)f(has)h(c)o(hanged)g(quite)f(a)g(lot)g(during)g(1.1)=
g=0A=
(ev)o(o-)221 113 y(lution.)k Fs(console)p 513 113 14 2 v 14=0A=
w(init\(\))11 b Fj(has)g(b)q(een)i(detatc)o(hed)g(from)d Fs(tty)p=0A=
1187 113 V 15 w(init\(\))p Fj(,)h(and)221 155 =
y(is)k(called)g(directly)h(b)o=0A=
(y)f Fs(../../main.c)p Fj(.)21 b(The)16 =
b(virtual)f(consoles)h(are)g(no)o(w)=0A=
221 196 y(dynamically)10 b(allo)q(cated,)i(and)i(quite)f(a)g(go)q(o)q(d)g=0A=
(deal)g(of)g(co)q(de)h(has)g(c)o(hanged.)221 237 =
y(So,)f(I'll)f(skip)i(the)g=0A=
(details)g(of)f(initialization,)e(allo)q(cation)h(and)i(suc)o(h.)150=0A=
381 y Fq(B.8.1)55 b(Ho)n(w)19 =
b(\014le)f(op)r(erations)g(are)h(dispatc)n(hed)=0A=
f(to)h(the)f(console)150 499 y =
FH(This)e(paragraph)e(is)i(quite)g(lo)o(w-lev)=0A=
o(el,)g(and)f(can)h(b)q(e)g(happily)h(skipp)q(ed)f(o)o(v)o(er.)221=0A=
587 y(Needless)j(to)e(sa)o(y)l(,)h(a)f Fn(un)p FB(?)p Fn(x)g=0A=
FH(device)i(is)g(accessed)f(though)g(the)g(\014lesystem.)28=0A=
b(This)18 b(paragraph)f(de-)150 651 y(tails)g(all)g(steps)g(from)e(the)i=0A=
(device)h(\014le)f(to)f(the)g(actual)h(console)g(functions.)24=0A=
b(Moreo)o(v)o(er,)15 b(the)h(follo)o(wing)150 715 y(information)g(is)g=0A=
(extracted)g(from)f(the)g(1.1.73)f(source)i(co)q(de,)g(and)g(it)g(ma)o(y)=
f(b)=0A=
q(e)i(sligh)o(tly)g(di\013eren)o(t)g(from)150 780 =
y(the)e(1.0)g(source.)221=0A=
867 y(When)27 =
b(a)g(device)h(ino)q(de)g(is)g(op)q(ened,)i(the)d(function)h=0A=
FE(chrdev)p 1365 867 15 2 v 17 w(open\(\))e FH(\(or)g FE(blkdev)p=0A=
1781 867 V 16 w(open\(\))p FH(,)150 932 =
y(but)e(w)o(e'll)h(stic)o(h)g(to)f(c)=0A=
o(haracter)f(devices\))j(in)f(../../fs/devices.c)e(gets)h(executed.)48=0A=
b(This)25 b(function)150 996 =
y(is)j(reac)o(hed)g(b)o(y)g(means)g(of)f(the)h=0A=
(structure)g FE(def)p 1052 996 V 16 w(chr)p 1140 996 V 17 w(fops)p=0A=
FH(,)i(whic)o(h)f(in)f(turn)g(is)g(referenced)h(b)o(y)150 1061=0A=
y FE(chrdev)p 297 1061 V 16 w(inode)p 433 1061 V 17 w(operations)p=0A=
FH(,)12 b(used)i(b)o(y)g(all)g(the)g(\014lesystem)g(t)o(yp)q(es)g(\(see)f=0A=
(the)h(previous)g(section)g(ab)q(out)150 1125 y(\014lesystems\).)221=0A=
1213 y FE(chrdev)p 368 1213 V 16 w(open)j FH(tak)o(es)g(care)h(of)f(sp)q=0A=
(ecifying)j(the)e(device)h(op)q(erations)f(b)o(y)g(substituting)h(the)f=0A=
(device)150 1277 y(sp)q(eci\014c)h FE(file)p 409 1277 V 17=0A=
w(operations)c FH(table)j(in)g(the)f(curren)o(t)g FE(filp)g=0A=
FH(and)g(calls)i(the)e(sp)q(eci\014c)i FE(open\(\))p FH(.)25=0A=
b(Device)150 1341 y(sp)q(eci\014c)16 =
b(tables)e(are)g(k)o(ept)g(in)h(the)f=0A=
(arra)o(y)f FE(chrdevs[])p =
FH(,)f(indexed)k(b)o(y)e(the)g(ma)s(jour)f(device)=0A=
j(n)o(um)o(b)q(er,)e(and)150 1406 y(\014lled)j(b)o(y)e(the)h(same)e=0A=
FE(../../fs/devices.c)p FH(.)221 1494 =
y(If)g(the)g(device)i(is)f(a)f(tt)o(y)f=0A=
(one)i(\(aren't)e(w)o(e)h(aiming)h(at)e(the)i(console?\),)g(w)o(e)f(come)=
g=0A=
(to)f(the)i(tt)o(y)e(driv)o(ers,)150 1558 =
y(whose)e(functions)h(are)f(in)h=0A=
FE(tty)p 668 1558 V 17 w(io.c)p FH(,)f(indexed)i(b)o(y)e FE(tty)p=0A=
1100 1558 V 17 w(fops)p FH(.)17 b(Th)o(us,)12 b FE(tty)p 1440=0A=
1558 V 17 w(open\(\))e FH(calls)i FE(init)p 1804 1558 V 17=0A=
w(dev\(\))p FH(,)150 1622 y(whic)o(h)h(allo)q(cates)g(an)o(y)e(data)h=0A=
(structure)g(needed)h(b)o(y)f(the)g(device,)i(based)e(on)g(the)g(minor)h=0A=
(device)g(n)o(um)o(b)q(er.)221 1710 y(The)18 =
b(minor)f(n)o(um)o(b)q(er)h(is)h=0A=
(also)e(used)i(to)e(retriev)o(e)h(the)f(actual)h(driv)o(er)g(for)f(the)h=0A=
(device,)i(whic)o(h)e(has)150 1775 y(b)q(een)g(registered)g(through)e=0A=
FE(tty)p 717 1775 V 17 w(register)p 926 1775 V 16 w(driver\(\))p=0A=
FH(.)25 b(The)17 b(driv)o(er,)h(then,)f(is)h(still)g(another)f(struc-)150=0A=
1839 y(ture)j(used)g(to)f(dispatc)o(h)i(computation,)f(just)g(lik)o(e)h=0A=
FE(file)p 1170 1839 V 17 w(ops)p =
FH(;)g(it)f(is)g(concerned)h(with)f(writing)=0A=
h(and)150 1903 y(con)o(trolling)15 b(the)f(device.)20 b(The)15=0A=
b(last)e(data)g(structure)h(used)g(in)h(managing)f(a)f(tt)o(y)g(is)h(the)=
g=0A=
(line)i(discipline,)150 1968 y(describ)q(ed)22 b(later.)36=0A=
b(The)20 b(line)i(disciplin)q(e)h(for)d(the)g(console)h(\(and)f(an)o(y)g=0A=
(other)g(tt)o(y)g(device\))h(is)g(set)f(b)o(y)150 2032 y FE(initialize)p=0A=
393 2032 V 16 w(tty)p 481 2032 V 17 w(struct\(\))p FH(,)13=0A=
b(in)o(v)o(ok)o(ed)j(b)o(y)f FE(init)p 1041 2032 V 16 w(dev)p=0A=
FH(.)221 2120 y(Ev)o(erything)22 b(w)o(e)h(touc)o(hed)g(in)g(this)g=0A=
(paragraph)f(is)i(device-indep)q(en)q(den)o(t.)45 b(The)23=0A=
b(only)g(console-)150 2184 y(sp)q(eci\014c)15 b(particular)f(is)g(that)f=0A=
FE(console.c)p =
FH(,)f(has)h(registered)h(its)g(o)o(wn)f(driv)o(er)g(during)i=0A=
FE(con)p 1683 2184 V 16 w(init\(\))p FH(.)k(The)150 2249 y(line)e=0A=
(discipline,)h(on)d(the)h(con)o(trary)l(,)e(in)i(indep)q(enden)o(t)h(of)e=0A=
(the)g(device.)221 2348 y Fj(The)60 b Fs(tty)p 421 2348 14=0A=
2 v 15 w(driver)e Fj(structure)j(is)f(fully)e(explained)h(within)221=0A=
2390 y Fs(<linux/tty)p 444 2390 V 13 w(driver.h>)1421 2348=0A=
y FH(.)221 2479 y Fj(The)11 =
b(ab)q(o)o(v)o(e)h(information)c(has)k(b)q(een)g=0A=
(extracted)h(from)d(1.1.73)f(source)k(co)q(de.)221 2514 y(It)18=0A=
b(isn't)g(unlik)o(ely)f(for)h(y)o(our)g(k)o(ernel)g(to)g(b)q(e)h(somewhat=
)f=0A=
(di\013eren)o(t)h(\(\\This)221 2560 y(information)11 =
b(is)i(sub)r(ject)j(to)d=0A=
(c)o(hange)i(without)e(notice"\).)p eop=0A=
%%Page: 134 145=0A=
134 144 bop 150 -84 1800 3 v 150 -100 a FD(B.8.)42 b(The)18=0A=
b(console)g(driv)o(er)1175 b FH(134)150 88 y Fq(B.8.2)55 b(W)-5=0A=
b(riting)18 b(to)g(the)h(console)150 206 y =
FH(When)f(a)g(console)g(device)h=0A=
(is)f(written)g(to,)g(the)f(function)i FE(con)p 1243 206 15=0A=
2 v 17 w(write)e FH(gets)g(in)o(v)o(ok)o(ed.)28 b(This)18 b(function)150=0A=
270 =
y(manages)d(all)i(the)e(con)o(trol)h(c)o(haracters)e(and)i(escap)q(e)g=0A=
(sequences)h(used)f(to)f(pro)o(vide)h(applications)i(with)150=0A=
334 y(complete)11 b(screen)g(managemen)o(t.)18 b(The)10 b(escap)q(e)h=0A=
(sequences)h(implemen)o(ted)g(are)e(those)g(of)g(the)h FE(vt102)e=0A=
FH(ter-)150 399 y(minal;)15 =
b(This)e(means)g(that)g(y)o(our)f(en)o(vironmen)o=0A=
(t)i(should)g(sa)o(y)f FE(TERM=3Dvt102)e FH(when)j(y)o(ou)f(are)g=0A=
FE(telnet)p FH(ting)150 463 =
y(to)h(a)h(non-Lin)o(ux)h(host;)f(the)f(b)q(est)i=0A=
(c)o(hoice)f(for)g(lo)q(cal)h(activities,)g(ho)o(w)o(ev)o(er,)d(is)j=0A=
FE(TERM=3Dconsole)d FH(b)q(ecause)150 527 y(the)i(Lin)o(ux)i(console)f=0A=
(o\013ers)f(a)g(sup)q(erset)g(of)g FE(vt102)g FH(functionalit)o(y)l(.)221=0A=
615 y FE(con)p 296 615 V 16 w(write\(\))p FH(,)k(th)o(us,)g(is)g(mostly)f=0A=
(made)h(up)g(of)g(nested)g(switc)o(h)g(statemen)o(ts,)f(used)h(to)f(handl=
e)i=0A=
(a)150 680 y(\014nite)i(state)e(automaton)f(in)o(terpreting)i(escap)q(e)h=0A=
(sequences)g(one)f(c)o(haracter)f(at)g(a)g(time.)37 b(When)21=0A=
b(in)150 744 y(normal)d(mo)q(de,)h(the)f(c)o(haracter)g(b)q(eing)h(prin)o=0A=
(ted)g(is)g(written)f(directly)i(to)e(the)g(video)h(memory)l(,)f(using)15=
0=0A=
808 y(the)d(curren)o(t)f FE(attr)p FH(-ibute.)21 b(Within)16=0A=
b FE(console.c)p FH(,)d(all)i(the)g(\014elds)h(of)e FE(struct)24=0A=
b(vc)14 b FH(are)g(made)h(accessible)150 873 =
y(through)h(macros,)f(so)h(an)o=0A=
(y)g(reference)h(to)e(\(for)h(example\))h FE(attr)p FH(,)e(do)q(es)i=0A=
(actually)g(refer)f(to)f(the)i(\014eld)g(in)150 937 y(the)e(structure)g=0A=
FE(vc)p 474 937 V 17 w(cons[currcons])p FH(,)e(as)i(long)g(as)g=0A=
FE(currcons)f =
FH(is)i(the)f(n)o(um)o(b)q(er)h(of)f(the)g(console)h(b)q(eing)=0A=
150 1001 y(referred)f(to.)221 1070 y Fj(Actually)m(,)28 b Fs(vc)p=0A=
460 1070 14 2 v 16 w(cons)e =
Fj(in)g(new)o(er)i(k)o(ernels)g(is)e(no)h(longer)=0A=
g(an)f(arra)o(y)h(of)221 1111 y(structures)d(,)g(it)e(no)o(w)g(is)h(an)f=0A=
(arra)o(y)g(of)g(p)q(oin)o(ters)h(whose)g(con)o(ten)o(ts)g(are)221=0A=
1152 y Fs(kmalloc\(\))p Fj(ed.)i(The)17 b(use)h(of)e(macros)g(greatly)g=0A=
(simpli\014ed)f(c)o(hanging)h(the)221 1193 =
y(approac)o(h,)d(b)q(ecause)j(m)o=0A=
(uc)o(h)c(of)i(the)g(co)q(de)h(didn't)e(need)i(to)f(b)q(e)g(rewritten.)22=
1=0A=
1273 y =
FH(Actual)j(mapping)h(and)f(unmapping)i(of)d(the)h(console)h(memory)f=0A=
(to)f(screen)i(is)f(p)q(erformed)h(b)o(y)f(the)150 1338 y(functions)g=0A=
FE(set)p 422 1338 15 2 v 16 w(scrmem\(\))e =
FH(\(whic)o(h)i(copies)g(data)e=0A=
(from)g(the)h(console)h(bu\013er)g(to)e(video)i(memory\))e(and)150=0A=
1402 y FE(get)p 225 1402 V 17 w(scrmem)c =
FH(\(whic)o(h)h(copies)h(bac)o(k)f=0A=
(data)f(to)g(the)h(console)h(bu\013er\).)19 b(The)12 =
b(priv)m(ate)h(bu\013er)=0A=
g(of)e(the)h(curren)o(t)150 1466 =
y(console)i(is)g(ph)o(ysically)i(mapp)q(ed)e=0A=
(on)g(the)g(actual)f(video)i(RAM,)e(in)i(order)e(to)g(minimize)j(the)d(n)=
o=0A=
(um)o(b)q(er)h(of)150 1531 y(data)j(transfers.)25 b(This)18=0A=
b(means)f(that)g FE(get)p FH(-)g(and)g FE(set)p FH(-)g(-)p=0A=
1130 1531 14 2 v 17 w(scrmem\(\))g(are)g FE(static)f FH(to)h=0A=
FE(console.c)f FH(and)150 1595 =
y(are)f(called)i(only)e(during)h(a)f(console)h=0A=
(switc)o(h.)150 1748 y Fq(B.8.3)55 b(Reading)18 b(the)g(console)150=0A=
1866 y FH(Reading)f(the)f(console)g(is)h(accomplished)g(through)f(the)g=0A=
(line-discipl)q(i)q(ne.)25 b(The)16 b(default)g(\(and)g(unique\))150=0A=
1930 y(line)j(disciplin)q(e)h(in)f(Lin)o(ux)f(is)g(called)i=0A=
FE(tty)p 882 1930 15 2 v 16 w(ldisc)p 1018 1930 V 17 w(N)p=0A=
1059 1930 V 17 w(TTY)p FH(.)d(The)g(line)j(discipline)h(is)d(what)f=0A=
(\\disciplines)150 1994 y(input)22 b(through)e(a)h(line".)38=0A=
b(It)21 =
b(is)g(another)g(function)g(table)h(\(w)o(e're)e(used)h(to)f(the)h=0A=
(approac)o(h,)h(aren't)150 2059 y(w)o(e?\),)15 =
b(whic)o(h)h(is)g(concerned)g=0A=
(with)f(reading)h(the)g(device.)21 b(With)16 b(the)f(help)h(of)f=0A=
FE(termios)f FH(\015ags,)h(the)g(line)150 2123 y(discipline)22=0A=
b(is)d(what)f(con)o(trols)g(input)i(from)e(the)g(tt)o(y:)26=0A=
b(ra)o(w,)18 b(cbreak)h(and)g(co)q(ok)o(ed)f(mo)q(de;)i FE(select\(\))p=0A=
FH(;)150 2187 y FE(ioctl\(\))14 b FH(and)i(so)e(on.)221 2275=0A=
y(The)f(read)f(function)i(in)f(the)g(line)i(discipline)h(is)d(called)i=0A=
FE(read)p 1262 2275 V 16 w(chan\(\))p =
FH(,)d(whic)o(h)i(reads)e(the)h(tt)o(y)=0A=
f(bu\013er)150 2340 y(indep)q(enden)o(tly)19 b(of)d(whence)i(it)e(came)h=0A=
(from.)23 b(The)16 b(reason)g(is)h(that)f(c)o(haracter)g(arriv)m(al)h=0A=
(through)f(a)g(tt)o(y)150 2404 y(is)g(managed)f(b)o(y)g(async)o(hronous)g=0A=
(hardw)o(are)f(in)o(terrupts.)221 2504 y Fj(The)20 b(line)g(discipline)f=0A=
Fs(N)p 610 2504 14 2 v 16 w(TTY)g Fj(is)h(to)g(b)q(e)h(found)e(in)h(the)h=0A=
(same)e Fs(tty)p 1310 2504 V 15 w(io.c)p Fj(,)221 2546 y(though)13=0A=
b(later)h(k)o(ernels)h(use)g(a)e(di\013eren)o(t)i Fs(n)p 892=0A=
2546 V 16 w(tty.c)d Fj(source)k(\014le.)p eop=0A=
%%Page: 135 146=0A=
135 145 bop 150 -84 1800 3 v 150 -100 a FD(B.8.)42 b(The)18=0A=
b(console)g(driv)o(er)1175 b FH(135)221 88 y(The)12 =
b(lo)o(w)o(est)g(lev)o=0A=
(el)i(of)d(console)i(input)h(is)f(part)e(of)h(k)o(eyb)q(oard)h(managemen)=
o=0A=
(t,)e(and)i(th)o(us)f(it)h(is)f(handled)150 153 y(within)k=0A=
FE(keyboard.c)p FH(,)e(in)i(the)f(function)h FE(keyboard)p=0A=
1062 153 15 2 v 16 w(interrupt\(\))p FH(.)150 306 y Fq(B.8.4)55=0A=
b(Keyb)r(oard)18 b(managemen)n(t)150 423 y =
FH(Keyb)q(oard)g(managemen)o(t)e=0A=
(is)i(quite)f(a)g(nigh)o(tmare.)26 b(It)17 b(is)g(con\014ned)i(to)d(the)h=0A=
(\014le)h FE(keyboard.c)p FH(,)e(whic)o(h)150 488 y(is)f(full)h(of)e=0A=
(hexadecimal)i(n)o(um)o(b)q(ers)e(to)g(represen)o(t)h(the)f(v)m(arious)h(=
k)o=0A=
(eyco)q(des)g(app)q(earing)g(in)g(k)o(eyb)q(oards)f(of)150=0A=
552 y(di\013eren)o(t)i(manifacturers.)221 640 =
y(I)e(w)o(on't)e(dig)j(in)501=0A=
628 y FB(\177)500 640 y =
FH(keyb)q(oard.c,)f(b)q(ecause)h(no)f(relev)m(an)o(t)=0A=
g(information)g(is)g(there)g(to)f(the)h(k)o(ernel)h(hac)o(k)o(er.)221=0A=
740 y =
Fj(F)m(or)e(those)h(readers)h(who)e(are)h(really)f(in)o(terested)i(in)e=0A=
(the)h(Lin)o(ux)f(k)o(eyb)q(oard,)221 781 y(the)20 =
b(b)q(est)i(approac)o(h)e=0A=
(to)g Fs(keyboard.c)f =
Fj(is)h(from)e(the)j(last)f(line)g(up)o(w)o(ard.)221=0A=
823 y(Lo)o(w)o(est)14 =
b(lev)o(el)f(details)h(o)q(ccur)h(mainly)c(in)j(the)g=0A=
(\014rst)h(half)e(of)g(the)h(\014le.)150 970 y Fq(B.8.5)55=0A=
b(Switc)n(hing)19 b(the)f(curren)n(t)h(console)150 1087 y =
FH(The)k(curren)o=0A=
(t)f(console)h(is)g(switc)o(hed)g(through)f(in)o(v)o(o)q(cation)h(of)f(th=
e)h=0A=
(function)g FE(change)p 1709 1087 V 17 w(console\(\))p FH(,)150=0A=
1151 y(whic)o(h)12 b(resides)g(in)g FE(tty)p 543 1151 V 17=0A=
w(io.c)e FH(and)i(is)f(in)o(v)o(ok)o(ed)h(b)o(y)f(b)q(oth)g=0A=
FE(keyboard.c)f FH(and)h FE(vt.c)f FH(\(the)h(former)g(switc)o(hes)150=0A=
1216 y(console)20 =
b(in)h(resp)q(onse)f(to)f(k)o(eypresses,)i(the)e(latter)h=0A=
(when)g(a)f(program)g(requests)g(it)h(b)o(y)g(in)o(v)o(oking)g(an)150=0A=
1280 y FE(ioctl\(\))14 b FH(call\).)221 1368 y(The)40 b(actual)g(switc)o=0A=
(hing)i(pro)q(cess)e(is)h(p)q(erformed)f(in)h(t)o(w)o(o)e(steps,)46=0A=
b(and)41 b(the)f(function)150 1432 y FE(complete)p 345 1432=0A=
V 16 w(change)p 505 1432 V 16 w(console\(\))19 b =
FH(tak)o(es)g(care)g(of)h=0A=
(the)f(second)i(part)e(of)g(it.)33 b(Splitting)22 =
b(the)e(switc)o(h)f(is)150=0A=
1497 y(mean)o(t)h(to)g(complete)h(the)g(task)f(after)g(a)g(p)q(ossible)j=0A=
(handshak)o(e)e(with)g(the)f(pro)q(cess)h(con)o(trolling)h(the)150=0A=
1561 y(tt)o(y)f(w)o(e're)h(lea)o(ving.)42 b(If)23 =
b(the)f(console)h(is)g(not)=0A=
f(under)h(pro)q(cess)f(con)o(trol,)i FE(change)p 1614 1561=0A=
V 16 w(console\(\))d FH(calls)150 1625 y FE(complete)p 345=0A=
1625 V 16 w(change)p 505 1625 V 16 w(console\(\))12 b =
FH(b)o(y)g(itself.)20=0A=
b(Pro)q(cess)13 b(in)o(terv)o(ertion)g(is)g(needed)h(to)e(successfully)j=0A=
(switc)o(h)150 1690 =
y(from)h(a)h(graphic)g(console)h(to)e(a)h(text)f(one)i=0A=
(and)f(vicev)o(ersa,)g(and)g(the)g(X)g(serv)o(er)g(\(for)f(example\))h(is=
)h=0A=
(the)150 1754 =
y(con)o(trolling)e(pro)q(cess)g(of)e(its)i(o)o(wn)e(graphic)i=0A=
(console.)150 1907 y Fq(B.8.6)55 b(The)18 b(selection)f(mec)n(hanism)150=0A=
2025 y FH(\\)p FE(selection)p =
FH(")f(is)i(the)g(cut)g(and)g(paste)g(facilit)o=0A=
(y)h(for)e(the)h(Lin)o(ux)h(text)e(consoles.)29 b(The)18 =
b(mec)o(hanism)g(is)=0A=
150 2089 =
y(mainly)g(handled)g(b)o(y)e(a)g(user-lev)o(el)i(pro)q(cess,)f(whic)=0A=
o(h)g(can)g(b)q(e)g(instan)o(tiated)g(b)o(y)f(either)h FE(selection)e=0A=
FH(or)150 2153 y FE(gpm)p FH(.)24 b(The)18 =
b(user-lev)o(el)g(program)e(uses)h=0A=
FE(ioctl\(\))f FH(on)h(the)g(console)g(to)f(tell)i(the)f(k)o(ernel)h(to)e=0A=
(highligh)o(t)i(a)150 2218 y(region)d(of)f(the)g(screen.)20=0A=
b(The)15 b(selected)h(text,)d(then,)i(is)g(copied)g(to)f(a)g(selection)i=0A=
(bu\013er.)k(The)15 b(bu\013er)g(is)g(a)150 2282 =
y(static)h(en)o(tit)o(y)f=0A=
(in)i FE(console.c)p FH(.)j(P)o(asting)15 =
b(text)g(is)i(accomplished)g(b)o(y)=0A=
f(`man)o(ually')g(pushing)h(c)o(haracters)150 2346 y(in)e(the)e(tt)o(y)g=0A=
(input)i(queue.)20 b(The)14 b(whole)g(selection)h(mec)o(hanism)g(is)f=0A=
(protected)f(b)o(y)h FE(#ifdef)f FH(so)g(users)h(can)150 2411=0A=
y(disable)j(it)e(during)h(k)o(ernel)g(con\014guration)g(to)e(sa)o(v)o(e)h=
(a)g=0A=
(few)g(kilob)o(ytes)h(of)e(ram.)221 2499 =
y(Selection)j(is)g(a)f(v)o(ery-lo)o=0A=
(w-lev)o(el)h(facilit)o(y)l(,)g(and)g(its)f(w)o(orkings)g(are)f(hidden)j=0A=
(from)e(an)o(y)f(other)h(k)o(ernel)p eop=0A=
%%Page: 136 147=0A=
136 146 bop 150 -84 1800 3 v 150 -100 a FD(B.8.)42 b(The)18=0A=
b(console)g(driv)o(er)1175 b FH(136)150 88 y(activit)o(y)l(.)26=0A=
b(This)18 b(means)g(that)e(most)g FE(#ifdef)p =
FH('s)g(simply)j(deals)f(with)f=0A=
(remo)o(ving)h(the)f(highligh)o(t)i(b)q(efore)150 153 =
y(the)c(screen)h(is)g=0A=
(mo)q(di\014ed)g(in)g(an)o(y)f(w)o(a)o(y)l(.)221 231 y Fj(New)o(er)g(k)o=0A=
(ernels)h(feature)g(impro)o(v)o(ed)d(co)q(de)i(for)g(selection,)g(and)g(t=
he)g=0A=
(mouse)221 272 y(p)q(oin)o(ter)25 =
b(can)h(b)q(e)g(highligh)o(ted)f(indep)q=0A=
(enden)o(tly)h(of)f(the)h(selected)i(text)221 315 y(\(1.1.32)10=0A=
b(and)j(later\).)18 b(Moreo)o(v)o(er,)13 =
b(from)d(1.1.73)h(on)o(w)o(ard)h(a)h=0A=
(dynamic)e(bu\013er)221 358 =
y(is)g(used)i(for)e(selected)j(text)e(rather)h=0A=
(than)f(a)f(static)h(one,)g(making)e(the)i(k)o(ernel)221 399=0A=
y(4kB)h(smaller.)150 538 y Fq(B.8.7)55 b Fp(ioctl\(\))p Fq(ling)15=0A=
b(the)k(device)150 655 y FH(The)13 b FE(ioctl\(\))e =
FH(system)h(call)i(is)f=0A=
(the)f(en)o(try)g(p)q(oin)o(t)h(for)f(user)h(pro)q(cesses)g(to)e(con)o(tr=
ol)i=0A=
(the)f(b)q(eha)o(viour)h(of)f(de-)150 719 y(vice)h(\014les.)20=0A=
b(Io)q(ctl)13 b(managemen)o(t)f(is)h(spa)o(wned)f(b)o(y)g FE=0A=
(../../fs/ioctl.c)p FH(,)f(where)h(the)h(real)f FE(sys)p 1769=0A=
719 15 2 v 17 w(ioctl\(\))150 784 y FH(resides.)22 b(The)16=0A=
b(standard)f FE(ioctl)g =
FH(requests)g(are)g(p)q(erformed)h(righ)o(t)f(there,)=0A=
h(other)f(\014le-related)i(requests)150 848 =
y(are)e(pro)q(cessed)h(b)o(y)f=0A=
FE(file)p 592 848 V 17 w(ioctl\(\))f =
FH(\(same)h(source)g(\014le\),)h(while)h=0A=
(an)o(y)e(other)f(request)i(is)g(dispatc)o(hes)g(to)150 912=0A=
y(the)f(device-sp)q(eci\014)q(c)j FE(ioctl\(\))c FH(function.)221=0A=
1000 y(The)i FE(ioctl)f =
FH(material)h(for)g(console)g(devices)i(resides)f(in)=0A=
g FE(vt.c)p FH(,)e(b)q(ecause)i(the)f(console)h(driv)o(er)f(dis-)150=0A=
1064 y(patc)o(hes)f(io)q(ctl)h(requests)g(to)e FE(vt)p 698=0A=
1064 V 17 w(ioctl\(\))p FH(.)221 1142 y =
Fj(The)f(information)c(ab)q(o)o(v)o=0A=
(e)j(refer)i(to)e(1.1.7x.)k(The)d(1.0)f(k)o(ernel)h(do)q(esn't)g(ha)o(v)o=
(e)=0A=
221 1175 y(the)18 b(\\driv)o(er")f(table,)h(and)f Fs(vt)p 712=0A=
1175 14 2 v 15 w(ioctl\(\))f =
Fj(is)h(p)q(oin)o(ted)h(to)f(directly)h(b)o(y)f=0A=
(the)221 1216 y Fs(file)p 312 1216 V 14 w(operations\(\))12=0A=
b Fj(table.)221 1297 y FH(Io)q(ctl)18 =
b(material)g(is)h(quite)f(confused,)h=0A=
(indeed.)30 b(Some)17 =
b(requests)h(are)g(related)g(to)f(the)h(device,)i(and)=0A=
150 1361 y(some)12 b(are)g(related)h(to)e(the)i(line)h(discipline.)22=0A=
b(I'll)14 b(try)d(to)h(summarize)h(things)f(for)g(the)g(1.0)g(and)g(the)h=0A=
(1.1.7x)150 1426 y(k)o(ernels.)21 b(An)o(ything)15 =
b(happ)q(ened)i(in)f(b)q=0A=
(et)o(w)o(een.)221 1514 =
y(The)j(1.1.7x)f(series)h(features)g(the)h(follo)o=0A=
(wing)g(approac)o(h:)27 b FE(tty)p 1330 1514 15 2 v 17 w(ioctl.c)18=0A=
b FH(implemen)o(ts)j(only)e(line)150 1578 y(discipline)26 b(requests)d=0A=
(\(namely)g FE(n)p 751 1578 V 17 w(tty)p 840 1578 V 17 w(ioctl\(\))p=0A=
FH(,)g(whic)o(h)g(is)g(the)g(only)g(n)p 1469 1578 14 2 v 17=0A=
w(tt)o(y)f(function)h(outside)g(of)150 1642 y FE(n)p 177 1642=0A=
15 2 v 17 w(tty.c)p FH(\),)f(while)i(the)e FE(file)p 674 1642=0A=
V 17 w(operations)e FH(\014eld)k(p)q(oin)o(ts)e(to)f FE(tty)p=0A=
1334 1642 V 17 w(ioctl\(\))g FH(in)i FE(tty)p 1672 1642 V 17=0A=
w(io.c)p FH(.)40 b(If)22 b(the)150 1707 y(request)16 =
b(n)o(um)o(b)q(er)g(is)h=0A=
(not)f(resolv)o(ed)g(b)o(y)g FE(tty)p 918 1707 V 17 w(ioctl\(\))p=0A=
FH(,)f(it)h(is)h(passed)f(along)g(to)f FE(tty->driver.ioctl)150=0A=
1771 y FH(or,)i(if)h(it)g(fails,)g(to)f FE(tty->ldisc.ioctl)p=0A=
FH(.)24 b(Driv)o(er-related)18 =
b(stu\013)g(for)e(the)i(console)g(it)g(to)e(b)=0A=
q(e)i(found)g(in)150 1835 y FE(vt.c)p FH(,)c(while)j(line)g(discipline)i=0A=
(material)c(is)h(in)g FE(tty)p 1031 1835 V 16 w(ioctl.c)p FH(.)221=0A=
1923 y(In)23 b(the)f(1.0)g(k)o(ernel,)j FE(tty)p 682 1923 V=0A=
16 w(ioctl\(\))d FH(is)h(in)g FE(tty)p 1073 1923 V 17 w(ioctl.c)f=0A=
FH(and)g(is)i(p)q(oin)o(ted)f(to)f(b)o(y)g(generic)i(tt)o(y)150=0A=
1988 y FE(file)p 249 1988 V 17 w(operations)p FH(.)18 b(Unresolv)o(ed)e=0A=
(requests)e(are)h(passed)g(along)g(to)f(the)h(sp)q(eci\014c)i(io)q(ctl)f=0A=
(function)f(or)g(to)150 2052 =
y(the)g(line-disci)q(pl)q(in)q(e)j(co)q(de,)d=0A=
(in)h(a)f(w)o(a)o(y)f(similar)j(to)d(1.1.7x.)221 2140 =
y(Note)f(that)g(in)i(b)=0A=
q(oth)f(cases,)g(the)g FE(TIOCLINUX)e FH(request)i(is)h(in)f(the)g=0A=
(device-indep)r(end)q(en)o(t)i(co)q(de.)k(This)150 2204 y(implies)15=0A=
b(that)d(the)g(console)i(selection)g(can)f(b)q(e)g(set)f(b)o(y)h=0A=
FE(ioctl)p FH(ling)g(an)o(y)f(tt)o(y)g(\()p FE(set)p 1531 2204=0A=
V 17 w(selection\(\))f FH(alw)o(a)o(ys)150 2269 y(op)q(erates)18=0A=
b(on)g(the)h(foreground)e(console\),)i(and)g(this)g(is)f(a)g(securit)o(y)=
h=0A=
(hole.)30 b(It)18 b(is)h(also)f(a)g(go)q(o)q(d)g(reason)150=0A=
2333 y(to)e(switc)o(h)h(to)g(a)f(new)o(er)h(k)o(ernel,)h(where)f(the)g=0A=
(problem)h(is)f(\014xed)h(b)o(y)f(only)g(allo)o(wing)h(the)f(sup)q(eruser=
)h=0A=
(to)150 2397 y(handle)e(the)g(selection.)221 2485 =
y(A)j(v)m(ariet)o(y)g(of)g=0A=
(requests)g(can)h(b)q(e)g(issued)g(to)f(the)g(console)h(device,)h(and)f(t=
he)f=0A=
(b)q(est)h(w)o(a)o(y)e(to)g(kno)o(w)150 2549 =
y(ab)q(out)d(them)g(is)h(to)e=0A=
(bro)o(wse)h(the)g(source)h(\014le)g FE(vt.c)p FH(.)p eop=0A=
%%Page: 137 148=0A=
137 147 bop 150 438 a Fv(App)s(endix)34 b(C)150 686 y Fx(The)40=0A=
b(GNU)g(General)h(Public)h(License)150 940 y FH(Prin)o(ted)13=0A=
b(b)q(elo)o(w)g(is)g(the)g(GNU)f(General)i(Public)g(License)g(\(the)f=0A=
FC(GPL)g FH(or)f FC(c)n(opyleft)p =
FH(\),)g(under)h(whic)o(h)h(Lin)o(ux)150=0A=
1004 y(is)h(licensed.)22 b(It)14 =
b(is)h(repro)q(duced)g(here)g(to)e(clear)i=0A=
(up)g(some)f(of)g(the)g(confusion)h(ab)q(out)f(Lin)o(ux's)h(cop)o(yrigh)o=
(t)=0A=
150 1069 y(status)e(|)h(Lin)o(ux)h(is)f FC(not)j =
FH(sharew)o(are,)c(and)h(it)=0A=
g(is)g FC(not)k FH(in)c(the)g(public)i(domain.)j(The)14 =
b(bulk)h(of)e(the)h=0A=
(Lin)o(ux)150 1133 y(k)o(ernel)f(is)g(cop)o(yrigh)o(t)534 1132=0A=
y(c)522 1133 y FG(\015)f =
FH(1993)g(b)o(y)g(Lin)o(us)h(T)l(orv)m(alds,)g(and)g=0A=
(other)f(soft)o(w)o(are)e(and)i(parts)g(of)g(the)g(k)o(ernel)h(are)150=0A=
1198 y(cop)o(yrigh)o(ted)h(b)o(y)g(their)g(authors.)19 b(Th)o(us,)13=0A=
b(Lin)o(ux)i FC(is)i =
FH(cop)o(yrigh)o(ted,)d(ho)o(w)o(ev)o(er,)f(y)o(ou)h(ma)=0A=
o(y)f(redistribute)i(it)150 1262 y(under)h(the)f(terms)g(of)g(the)g(GPL)g=0A=
(prin)o(ted)h(b)q(elo)o(w.)617 1363 y =
FD(GNU)i(GENERAL)h(PUBLIC)f(LICENSE)844=0A=
1427 y FH(V)l(ersion)e(2,)e(June)i(1991)150 1515 =
y(Cop)o(yrigh)o(t)g(\(C\))g=0A=
(1989,)f(1991)h(F)l(ree)h(Soft)o(w)o(are)e(F)l(oundation,)i(Inc.)25=0A=
b(675)16 b(Mass)g(Av)o(e,)h(Cam)o(bridge,)f(MA)150 1580 =
y(02139,)d(USA.)150=0A=
1644 =
y(Ev)o(ery)o(one)h(is)g(p)q(ermitted)h(to)f(cop)o(y)g(and)g(distribute)i=0A=
(v)o(erbatim)e(copies)h(of)f(this)g(license)i(do)q(cumen)o(t,)f(but)150=0A=
1708 y(c)o(hanging)h(it)f(is)h(not)f(allo)o(w)o(ed.)150 1882=0A=
y Ft(C.1)69 b(Pream)n(ble)150 2015 y FH(The)14 b(licenses)i(for)e(most)f=0A=
(soft)o(w)o(are)f(are)i(designed)h(to)e(tak)o(e)h(a)o(w)o(a)o(y)e(y)o(our=
)i=0A=
(freedom)f(to)h(share)g(and)g(c)o(hange)150 2080 y(it.)30 b(By)19=0A=
b(con)o(trast,)f(the)g(GNU)h(General)g(Public)h(License)g(is)f(in)o(tende=
d)h=0A=
(to)e(guaran)o(tee)g(y)o(our)g(freedom)150 2144 y(to)f(share)g(and)g(c)o=0A=
(hange)g(free)h(soft)o(w)o(are{to)c(mak)o(e)j(sure)g(the)h(soft)o(w)o(are=
)d=0A=
(is)j(free)f(for)g(all)h(its)f(users.)26 b(This)150 2208 y(General)17=0A=
b(Public)h(License)g(applies)g(to)e(most)g(of)g(the)g(F)l(ree)h(Soft)o(w)=
o=0A=
(are)e(F)l(oundation's)h(soft)o(w)o(are)f(and)i(to)150 2273=0A=
y(an)o(y)10 =
b(other)h(program)e(whose)i(authors)f(commit)h(to)f(using)h(it.)=0A=
19 b(\(Some)10 b(other)h(F)l(ree)f(Soft)o(w)o(are)g(F)l(oundation)150=0A=
2337 =
y(soft)o(w)o(are)j(is)i(co)o(v)o(ered)g(b)o(y)f(the)h(GNU)f(Library)i=0A=
(General)f(Public)h(License)h(instead.\))j(Y)l(ou)14 =
b(can)h(apply)h(it)150=0A=
2401 y(to)f(y)o(our)f(programs,)g(to)q(o.)221 2489 =
y(When)k(w)o(e)g(sp)q(eak)=0A=
g(of)g(free)g(soft)o(w)o(are,)f(w)o(e)h(are)f(referring)i(to)e(freedom,)i=0A=
(not)e(price.)30 b(Our)19 b(General)150 2554 y(Public)g(Licenses)g(are)e=0A=
(designed)h(to)e(mak)o(e)h(sure)g(that)g(y)o(ou)f(ha)o(v)o(e)h(the)g(free=
dom)=0A=
g(to)g(distribute)h(copies)1016 2678 y(137)p eop=0A=
%%Page: 138 149=0A=
138 148 bop 150 -84 1800 3 v 150 -100 a FD(C.2.)42 b(T)l(erms)17=0A=
b(and)h(Conditions)1092 b FH(138)150 88 y(of)18 b(free)g(soft)o(w)o(are)e=0A=
(\(and)i(c)o(harge)g(for)f(this)i(service)g(if)g(y)o(ou)e(wish\),)i(that)=
f(y)=0A=
o(ou)f(receiv)o(e)j(source)e(co)q(de)g(or)150 153 =
y(can)f(get)g(it)h(if)g(y)o=0A=
(ou)f(w)o(an)o(t)f(it,)h(that)g(y)o(ou)g(can)g(c)o(hange)h(the)f(soft)o(w=
)o=0A=
(are)f(or)h(use)g(pieces)i(of)e(it)g(in)h(new)g(free)150 217=0A=
y(programs;)c(and)h(that)f(y)o(ou)h(kno)o(w)g(y)o(ou)g(can)g(do)g(these)h=0A=
(things.)221 305 =
y(T)l(o)j(protect)g(y)o(our)f(righ)o(ts,)i(w)o(e)f(need)i=0A=
(to)d(mak)o(e)h(restrictions)h(that)f(forbid)h(an)o(y)o(one)f(to)f(den)o(=
y)i=0A=
(y)o(ou)150 369 y(these)e(righ)o(ts)g(or)g(to)f(ask)h(y)o(ou)g(to)g=0A=
(surrender)g(the)h(righ)o(ts.)28 b(These)19 =
b(restrictions)f(translate)g(to)g=0A=
(certain)150 434 y(resp)q(onsibilitie)q(s)g(for)c(y)o(ou)h(if)h(y)o(ou)f=0A=
(distribute)h(copies)g(of)f(the)g(soft)o(w)o(are,)e(or)i(if)h(y)o(ou)e(mo=
)q=0A=
(dify)i(it.)221 522 =
y(F)l(or)d(example,)i(if)g(y)o(ou)e(distribute)j(copies)f=0A=
(of)f(suc)o(h)g(a)g(program,)f(whether)h(gratis)g(or)g(for)f(a)h(fee,)g(y=
)o=0A=
(ou)150 586 =
y(m)o(ust)i(giv)o(e)h(the)g(recipien)o(ts)h(all)g(the)f(righ)o=0A=
(ts)f(that)g(y)o(ou)h(ha)o(v)o(e.)24 b(Y)l(ou)17 =
b(m)o(ust)f(mak)o(e)g(sure)h=0A=
(that)f(they)l(,)h(to)q(o,)150 650 y(receiv)o(e)j(or)e(can)h(get)f(the)h=0A=
(source)g(co)q(de.)31 b(And)19 =
b(y)o(ou)g(m)o(ust)f(sho)o(w)g(them)h(these)g=0A=
(terms)f(so)h(they)f(kno)o(w)150 715 y(their)e(righ)o(ts.)221=0A=
802 =
y(W)l(e)d(protect)g(y)o(our)g(righ)o(ts)g(with)h(t)o(w)o(o)e(steps:)19=0A=
b(\(1\))12 =
b(cop)o(yrigh)o(t)i(the)f(soft)o(w)o(are,)f(and)h(\(2\))g(o\013er)=0A=
g(y)o(ou)h(this)150 867 =
y(license)j(whic)o(h)f(giv)o(es)g(y)o(ou)e(legal)j(p)=0A=
q(ermission)f(to)f(cop)o(y)l(,)g(distribute)h(and/or)f(mo)q(dify)g(the)h=0A=
(soft)o(w)o(are.)221 955 y(Also,)22 =
b(for)e(eac)o(h)g(author's)g(protection)h=0A=
(and)g(ours,)g(w)o(e)f(w)o(an)o(t)g(to)g(mak)o(e)g(certain)h(that)f(ev)o(=
ery)=0A=
o(one)150 1019 =
y(understands)c(that)f(there)g(is)h(no)g(w)o(arran)o(t)o(y)d=0A=
(for)i(this)h(free)g(soft)o(w)o(are.)j(If)d(the)f(soft)o(w)o(are)f(is)i(m=
o)q=0A=
(di\014ed)h(b)o(y)150 1083 =
y(someone)e(else)h(and)f(passed)g(on,)f(w)o(e)h(w)=0A=
o(an)o(t)f(its)h(recipien)o(ts)h(to)f(kno)o(w)f(that)g(what)g(they)h(ha)o=
(v)o=0A=
(e)g(is)g(not)g(the)150 1148 =
y(original,)g(so)f(that)g(an)o(y)g(problems)h=0A=
(in)o(tro)q(duced)h(b)o(y)e(others)h(will)h(not)e(re\015ect)g(on)h(the)f=0A=
(original)i(authors')150 1212 y(reputations.)221 1300 =
y(Finally)l(,)d(an)o(y)=0A=
e(free)h(program)e(is)i(threatened)g(constan)o(tly)f(b)o(y)h(soft)o(w)o(a=
re)e=0A=
(paten)o(ts.)18 b(W)l(e)11 b(wish)h(to)f(a)o(v)o(oid)150 1364=0A=
y(the)k(danger)g(that)g(redistributors)g(of)g(a)g(free)g(program)f(will)j=0A=
(individually)i(obtain)c(paten)o(t)f(licenses,)j(in)150 1429=0A=
y(e\013ect)j(making)f(the)f(program)g(proprietary)l(.)31 b(T)l(o)19=0A=
b(prev)o(en)o(t)f(this,)i(w)o(e)e(ha)o(v)o(e)h(made)g(it)g(clear)g(that)f=
(an)=0A=
o(y)150 1493 y(paten)o(t)d(m)o(ust)f(b)q(e)i(licensed)i(for)c(ev)o(ery)o=0A=
(one's)h(free)g(use)h(or)e(not)h(licensed)i(at)e(all.)221 1581=0A=
y(The)g(precise)h(terms)f(and)g(conditions)i(for)d(cop)o(ying,)i=0A=
(distribution)h(and)e(mo)q(di\014cation)h(follo)o(w.)150 1758=0A=
y Ft(C.2)69 b(T)-6 b(erms)25 b(and)j(Conditions)d(for)i(Cop)n(ying,)g=0A=
(Distribution,)e(and)322 1843 y(Mo)r(di\014cation)206 1971=0A=
y =
FH(0.)d(This)e(License)h(applies)g(to)e(an)o(y)g(program)f(or)h(other)g(w=
)o=0A=
(ork)g(whic)o(h)h(con)o(tains)g(a)f(notice)h(placed)264 2036=0A=
y(b)o(y)15 =
b(the)g(cop)o(yrigh)o(t)g(holder)h(sa)o(ying)f(it)g(ma)o(y)f(b)q=0A=
(e)i(distributed)h(under)f(the)f(terms)f(of)h(this)h(General)264=0A=
2100 y(Public)k(License.)30 b(The)18 =
b(\\Program",)f(b)q(elo)o(w,)i(refers)f=0A=
(to)g(an)o(y)f(suc)o(h)i(program)e(or)g(w)o(ork,)h(and)g(a)264=0A=
2164 y(\\w)o(ork)11 =
b(based)i(on)f(the)h(Program")e(means)h(either)h(the)g=0A=
(Program)e(or)h(an)o(y)g(deriv)m(ativ)o(e)i(w)o(ork)d(under)264=0A=
2229 y(cop)o(yrigh)o(t)j(la)o(w:)19 b(that)13 =
b(is)i(to)e(sa)o(y)l(,)h(a)g(w)=0A=
o(ork)f(con)o(taining)i(the)f(Program)f(or)h(a)g(p)q(ortion)g(of)g(it,)g=0A=
(either)264 2293 =
y(v)o(erbatim)d(or)g(with)h(mo)q(di\014cations)h(and/or)e=0A=
(translated)g(in)o(to)h(another)f(language.)19 b(\(Hereinafter,)264=0A=
2357 =
y(translation)c(is)h(included)j(without)c(limitation)i(in)g(the)f(term)f=0A=
(\\mo)q(di\014cation".\))21 b(Eac)o(h)16 b(licensee)264 2422=0A=
y(is)f(addressed)h(as)f(\\y)o(ou".)264 2505 y(Activities)k(other)d(than)i=0A=
(cop)o(ying,)f(distribution)i(and)f(mo)q(di\014cation)g(are)f(not)g(co)o(=
v)o=0A=
(ered)g(b)o(y)h(this)p eop=0A=
%%Page: 139 150=0A=
139 149 bop 150 -84 1800 3 v 150 -100 a FD(C.2.)42 b(T)l(erms)17=0A=
b(and)h(Conditions)1092 b FH(139)264 88 y(License;)16 =
b(they)f(are)f(outside)=0A=
h(its)g(scop)q(e.)20 b(The)15 b(act)f(of)g(running)i(the)f(Program)e(is)i=0A=
(not)f(restricted,)264 153 y(and)19 =
b(the)h(output)f(from)f(the)i(Program)e=0A=
(is)h(co)o(v)o(ered)h(only)f(if)h(its)g(con)o(ten)o(ts)e(constitute)i(a)f=
(w)o=0A=
(ork)264 217 =
y(based)d(on)h(the)f(Program)f(\(indep)q(enden)o(t)k(of)d(ha)o=0A=
(ving)h(b)q(een)g(made)g(b)o(y)f(running)i(the)e(Program\).)264=0A=
281 =
y(Whether)f(that)f(is)i(true)f(dep)q(ends)i(on)e(what)g(the)g(Program)f=0A=
(do)q(es.)206 383 y(1.)22 =
b(Y)l(ou)d(ma)o(y)f(cop)o(y)h(and)g(distribute)h(v)=0A=
o(erbatim)e(copies)i(of)f(the)g(Program's)d(source)j(co)q(de)h(as)e(y)o(o=
u)=0A=
264 448 =
y(receiv)o(e)c(it,)g(in)g(an)o(y)f(medium,)h(pro)o(vided)g(that)f(y)o=0A=
(ou)g(conspicuously)i(and)f(appropriately)g(publish)264 512=0A=
y(on)g(eac)o(h)h(cop)o(y)f(an)h(appropriate)g(cop)o(yrigh)o(t)f(notice)h(=
and)=0A=
g(disclaimer)i(of)d(w)o(arran)o(t)o(y;)e(k)o(eep)j(in)o(tact)264=0A=
576 =
y(all)g(the)f(notices)h(that)f(refer)g(to)g(this)h(License)h(and)f(to)e=0A=
(the)i(absence)g(of)f(an)o(y)g(w)o(arran)o(t)o(y;)e(and)j(giv)o(e)264=0A=
641 =
y(an)o(y)f(other)h(recipien)o(ts)i(of)e(the)g(Program)f(a)h(cop)o(y)g(of)=0A=
f(this)i(License)h(along)e(with)h(the)f(Program.)264 724 =
y(Y)l(ou)f(ma)o(y)f=0A=
(c)o(harge)g(a)h(fee)g(for)f(the)h(ph)o(ysical)i(act)d(of)g(transferring)=
h(a)=0A=
g(cop)o(y)l(,)f(and)i(y)o(ou)e(ma)o(y)g(at)g(y)o(our)264 788=0A=
y(option)i(o\013er)g(w)o(arran)o(t)o(y)f(protection)h(in)h(exc)o(hange)f(=
for)=0A=
g(a)g(fee.)206 890 y(2.)22 b(Y)l(ou)13 =
b(ma)o(y)e(mo)q(dify)j(y)o(our)e(cop)o=0A=
(y)g(or)g(copies)i(of)e(the)h(Program)e(or)h(an)o(y)g(p)q(ortion)h(of)g(i=
t,)g=0A=
(th)o(us)f(forming)264 954 y(a)18 =
b(w)o(ork)g(based)g(on)h(the)g(Program,)e=0A=
(and)i(cop)o(y)g(and)f(distribute)i(suc)o(h)f(mo)q(di\014cations)h(or)e(w=
)o=0A=
(ork)264 1018 y(under)12 =
b(the)f(terms)g(of)g(Section)h(1)f(ab)q(o)o(v)o(e,)g=0A=
(pro)o(vided)h(that)f(y)o(ou)g(also)g(meet)g(all)i(of)e(these)g(condition=
s:)=0A=
306 1133 y(a.)22 =
b(Y)l(ou)c(m)o(ust)g(cause)h(the)g(mo)q(di\014ed)g(\014les)h=0A=
(to)e(carry)g(prominen)o(t)g(notices)h(stating)g(that)e(y)o(ou)364=0A=
1197 y(c)o(hanged)e(the)g(\014les)i(and)e(the)g(date)g(of)g(an)o(y)g(c)o=0A=
(hange.)303 1278 y(b.)23 b(Y)l(ou)13 =
b(m)o(ust)g(cause)g(an)o(y)g(w)o(ork)f=0A=
(that)h(y)o(ou)f(distribute)j(or)d(publish,)k(that)c(in)i(whole)g(or)f(in=
)h=0A=
(part)364 1342 =
y(con)o(tains)h(or)g(is)h(deriv)o(ed)g(from)f(the)g(Program)f=0A=
(or)h(an)o(y)g(part)g(thereof,)g(to)g(b)q(e)h(licensed)h(as)e(a)364=0A=
1407 y(whole)g(at)g(no)g(c)o(harge)g(to)f(all)j(third)e(parties)h(under)g=0A=
(the)f(terms)g(of)f(this)i(License.)308 1488 y(c.)23 b(If)16=0A=
b(the)h(mo)q(di\014ed)h(program)e(normally)h(reads)f(commands)h(in)o=0A=
(teractiv)o(ely)g(when)g(run,)g(y)o(ou)364 1552 y(m)o(ust)12=0A=
b(cause)h(it,)g(when)g(started)e(running)j(for)e(suc)o(h)h(in)o(teractiv)=
o(e)=0A=
g(use)g(in)g(the)g(most)f(ordinary)364 1616 y(w)o(a)o(y)l(,)20=0A=
b(to)f(prin)o(t)i(or)f(displa)o(y)h(an)f(announcemen)o(t)h(including)i(an=
)d=0A=
(appropriate)g(cop)o(yrigh)o(t)364 1681 y(notice)15 b(and)g(a)g(notice)h=0A=
(that)e(there)h(is)g(no)g(w)o(arran)o(t)o(y)e(\(or)h(else,)i(sa)o(ying)f=0A=
(that)f(y)o(ou)h(pro)o(vide)g(a)364 1745 =
y(w)o(arran)o(t)o(y\))f(and)i(that)g=0A=
(users)g(ma)o(y)g(redistribute)h(the)f(program)g(under)h(these)f(conditio=
ns,)=0A=
364 1809 y(and)22 =
b(telling)h(the)f(user)g(ho)o(w)g(to)f(view)h(a)g(cop)o(y)f=0A=
(of)h(this)g(License.)42 b(\(Exception:)34 b(if)22 b(the)364=0A=
1874 y(Program)12 =
b(itself)j(is)f(in)o(teractiv)o(e)g(but)g(do)q(es)g(not)g=0A=
(normally)g(prin)o(t)g(suc)o(h)g(an)g(announcemen)o(t,)364=0A=
1938 =
y(y)o(our)g(w)o(ork)h(based)g(on)g(the)g(Program)f(is)i(not)f(required)h=0A=
(to)f(prin)o(t)g(an)g(announcemen)o(t.\))264 2052 =
y(These)k(requiremen)o(ts)h=0A=
(apply)g(to)e(the)h(mo)q(di\014ed)i(w)o(ork)d(as)h(a)f(whole.)33=0A=
b(If)19 b(iden)o(ti\014able)i(sections)264 2117 =
y(of)e(that)f(w)o(ork)h(are)g=0A=
(not)g(deriv)o(ed)h(from)f(the)g(Program,)g(and)g(can)h(b)q(e)g(reasonabl=
y)g=0A=
(considered)264 2181 =
y(indep)q(enden)o(t)g(and)e(separate)f(w)o(orks)g(in)i=0A=
(themselv)o(es,)g(then)f(this)g(License,)i(and)e(its)g(terms,)g(do)264=0A=
2245 y(not)f(apply)h(to)e(those)h(sections)h(when)g(y)o(ou)f(distribute)i=0A=
(them)e(as)g(separate)g(w)o(orks.)25 b(But)17 b(when)264 2310=0A=
y(y)o(ou)j(distribute)h(the)f(same)g(sections)h(as)f(part)g(of)f(a)h(whol=
e)h=0A=
(whic)o(h)g(is)g(a)f(w)o(ork)f(based)i(on)f(the)264 2374 y(Program,)15=0A=
b(the)i(distribution)i(of)e(the)g(whole)g(m)o(ust)g(b)q(e)h(on)f(the)g(te=
rms)=0A=
f(of)h(this)g(License,)i(whose)264 2438 y(p)q(ermissions)c(for)e(other)g=0A=
(licensees)j(extend)f(to)e(the)h(en)o(tire)g(whole,)g(and)g(th)o(us)g(to)=
f=0A=
(eac)o(h)h(and)g(ev)o(ery)264 2503 =
y(part)g(regardless)i(of)e(who)h(wrote)g=0A=
(it.)p eop=0A=
%%Page: 140 151=0A=
140 150 bop 150 -84 1800 3 v 150 -100 a FD(C.2.)42 b(T)l(erms)17=0A=
b(and)h(Conditions)1092 b FH(140)264 88 y(Th)o(us,)22 =
b(it)f(is)h(not)f(the)g=0A=
(in)o(ten)o(t)g(of)g(this)h(section)f(to)g(claim)h(righ)o(ts)f(or)g(con)o=0A=
(test)f(y)o(our)h(righ)o(ts)g(to)264 153 y(w)o(ork)14 b(written)h(en)o=0A=
(tirely)i(b)o(y)e(y)o(ou;)g(rather,)f(the)h(in)o(ten)o(t)h(is)g(to)e=0A=
(exercise)j(the)e(righ)o(t)g(to)g(con)o(trol)g(the)264 217=0A=
y(distribution)h(of)f(deriv)m(ativ)o(e)i(or)d(collectiv)o(e)j(w)o(orks)e=0A=
(based)g(on)g(the)g(Program.)264 300 =
y(In)d(addition,)g(mere)g(aggregation)e=0A=
(of)h(another)g(w)o(ork)f(not)h(based)h(on)f(the)g(Program)f(with)i(the)f=0A=
(Pro-)264 365 y(gram)i(\(or)g(with)h(a)f(w)o(ork)g(based)h(on)g(the)g=0A=
(Program\))e(on)i(a)f(v)o(olume)h(of)g(a)f(storage)g(or)g(distribution)26=
4=0A=
429 =
y(medium)j(do)q(es)f(not)g(bring)h(the)f(other)g(w)o(ork)f(under)i(the)g=0A=
(scop)q(e)f(of)g(this)h(License.)206 531 y(3.)22 b(Y)l(ou)17=0A=
b(ma)o(y)f(cop)o(y)h(and)g(distribute)i(the)e(Program)e(\(or)h(a)h(w)o(or=
k)f=0A=
(based)i(on)f(it,)g(under)h(Section)g(2\))264 595 =
y(in)c(ob)s(ject)f(co)q(de)=0A=
h(or)g(executable)h(form)d(under)j(the)f(terms)f(of)g(Sections)h(1)g(and)=
g(2)=0A=
f(ab)q(o)o(v)o(e)g(pro)o(vided)264 659 =
y(that)h(y)o(ou)h(also)g(do)g(one)h=0A=
(of)e(the)i(follo)o(wing:)306 773 y(a.)22 =
b(Accompan)o(y)c(it)h(with)g(the)g=0A=
(complete)g(corresp)q(onding)h(mac)o(hine-readable)g(source)f(co)q(de,)36=
4=0A=
838 y(whic)o(h)11 =
b(m)o(ust)f(b)q(e)i(distributed)g(under)g(the)e(terms)h(of)=0A=
f(Sections)i(1)e(and)h(2)f(ab)q(o)o(v)o(e)h(on)f(a)h(medium)364=0A=
902 =
y(customarily)k(used)h(for)f(soft)o(w)o(are)e(in)o(terc)o(hange;)i(or,)=0A=
303 983 y(b.)23 b(Accompan)o(y)12 =
b(it)h(with)f(a)g(written)h(o\013er,)g(v)m=0A=
(alid)h(for)d(at)h(least)h(three)f(y)o(ears,)g(to)g(giv)o(e)g(an)o(y)g(th=
ird)=0A=
364 1048 =
y(part)o(y)l(,)g(for)g(a)h(c)o(harge)g(no)g(more)f(than)h(y)o(our)g=0A=
(cost)f(of)h(ph)o(ysically)h(p)q(erforming)g(source)f(distri-)364=0A=
1112 =
y(bution,)f(a)e(complete)i(mac)o(hine-readable)g(cop)o(y)f(of)f(the)h=0A=
(corresp)q(onding)h(source)e(co)q(de,)i(to)e(b)q(e)364 1176=0A=
y(distributed)16 =
b(under)f(the)g(terms)f(of)g(Sections)h(1)f(and)h(2)f(ab)q=0A=
(o)o(v)o(e)g(on)h(a)f(medium)i(customarily)364 1241 =
y(used)f(for)g(soft)o(w)o=0A=
(are)e(in)o(terc)o(hange;)j(or,)308 1322 y(c.)23 =
b(Accompan)o(y)d(it)h(with)g=0A=
(the)g(information)g(y)o(ou)g(receiv)o(ed)g(as)g(to)f(the)h(o\013er)g(to)=
f=0A=
(distribute)364 1386 y(corresp)q(onding)d(source)f(co)q(de.)23=0A=
b(\(This)16 b(alternativ)o(e)g(is)h(allo)o(w)o(ed)f(only)h(for)e=0A=
(noncommercial)364 1450 =
y(distribution)k(and)f(only)g(if)g(y)o(ou)f(receiv)o=0A=
(ed)i(the)f(program)e(in)i(ob)s(ject)f(co)q(de)i(or)e(executable)364=0A=
1515 y(form)d(with)i(suc)o(h)f(an)g(o\013er,)g(in)h(accord)f(with)h=0A=
(Subsection)g(b)g(ab)q(o)o(v)o(e.\))264 1629 =
y(The)i(source)f(co)q(de)i(for)e=0A=
(a)g(w)o(ork)g(means)h(the)g(preferred)g(form)f(of)g(the)h(w)o(ork)f(for)=
g=0A=
(making)h(mo)q(d-)264 1693 y(i\014cations)h(to)e(it.)29 b(F)l(or)17=0A=
b(an)h(executable)h(w)o(ork,)f(complete)g(source)g(co)q(de)h(means)f(all)=
h=0A=
(the)f(source)264 1758 y(co)q(de)j(for)e(all)j(mo)q(dules)f(it)g(con)o=0A=
(tains,)g(plus)g(an)o(y)f(asso)q(ciated)h(in)o(terface)g(de\014nition)h=0A=
(\014les,)g(plus)264 1822 y(the)17 b(scripts)g(used)h(to)f(con)o(trol)g=0A=
(compilation)h(and)g(installation)g(of)f(the)g(executable.)27=0A=
b(Ho)o(w)o(ev)o(er,)264 1886 y(as)15 =
b(a)h(sp)q(ecial)i(exception,)f(the)f=0A=
(source)g(co)q(de)h(distributed)h(need)f(not)e(include)k(an)o(ything)d(th=
at)f=0A=
(is)264 1951 y(normally)20 b(distributed)h(\(in)g(either)f(source)g(or)f=0A=
(binary)i(form\))e(with)h(the)g(ma)s(jor)e(comp)q(onen)o(ts)264=0A=
2015 =
y(\(compiler,)f(k)o(ernel,)h(and)f(so)g(on\))f(of)g(the)h(op)q(erating)g=0A=
(system)g(on)f(whic)o(h)i(the)f(executable)h(runs,)264 2079=0A=
y(unless)e(that)e(comp)q(onen)o(t)i(itself)g(accompanies)g(the)f(executab=
le.)=0A=
264 2162 =
y(If)j(distribution)h(of)f(executable)h(or)f(ob)s(ject)f(co)q(de)h=0A=
(is)h(made)f(b)o(y)g(o\013ering)h(access)f(to)f(cop)o(y)h(from)264=0A=
2227 y(a)e(designated)i(place,)g(then)f(o\013ering)h(equiv)m(alen)o(t)h=0A=
(access)e(to)f(cop)o(y)h(the)g(source)g(co)q(de)h(from)e(the)264=0A=
2291 =
y(same)i(place)h(coun)o(ts)f(as)g(distribution)i(of)e(the)g(source)h(co)=0A=
q(de,)g(ev)o(en)g(though)f(third)h(parties)f(are)264 2355 y(not)c(comp)q=0A=
(elled)k(to)c(cop)o(y)h(the)h(source)f(along)g(with)h(the)f(ob)s(ject)g(c=
o)q=0A=
(de.)206 2457 y(4.)22 b(Y)l(ou)15 =
b(ma)o(y)g(not)g(cop)o(y)l(,)h(mo)q(dify)l=0A=
(,)g(sublicense,)h(or)e(distribute)i(the)f(Program)e(except)i(as)f(expres=
sly)=0A=
264 2522 y(pro)o(vided)k(under)g(this)g(License.)32 b(An)o(y)18=0A=
b(attempt)g(otherwise)h(to)f(cop)o(y)l(,)h(mo)q(dify)l(,)h(sublicense)g(o=
r)p=0A=
eop=0A=
%%Page: 141 152=0A=
141 151 bop 150 -84 1800 3 v 150 -100 a FD(C.2.)42 b(T)l(erms)17=0A=
b(and)h(Conditions)1092 b FH(141)264 88 y(distribute)20 =
b(the)f(Program)f(is)=0A=
h(v)o(oid,)h(and)f(will)i(automatically)e(terminate)g(y)o(our)g(righ)o(ts=
)f=0A=
(under)264 153 y(this)h(License.)31 b(Ho)o(w)o(ev)o(er,)18=0A=
b(parties)h(who)g(ha)o(v)o(e)f(receiv)o(ed)h(copies,)h(or)e(righ)o(ts,)h=0A=
(from)f(y)o(ou)g(under)264 217 =
y(this)e(License)i(will)g(not)d(ha)o(v)o(e)h=0A=
(their)g(licenses)i(terminated)f(so)e(long)h(as)g(suc)o(h)g(parties)h(rem=
ain)=0A=
f(in)264 281 y(full)g(compliance.)206 383 y(5.)22 b(Y)l(ou)17=0A=
b(are)g(not)g(required)h(to)f(accept)h(this)f(License,)i(since)g(y)o(ou)e=
(ha)=0A=
o(v)o(e)g(not)g(signed)h(it.)26 b(Ho)o(w)o(ev)o(er,)264 448=0A=
y(nothing)15 =
b(else)g(gran)o(ts)e(y)o(ou)i(p)q(ermission)h(to)d(mo)q(dify)j=0A=
(or)e(distribute)h(the)g(Program)e(or)h(its)h(deriv)m(a-)264=0A=
512 y(tiv)o(e)k(w)o(orks.)31 b(These)20 =
b(actions)f(are)g(prohibited)i(b)o(y)=0A=
e(la)o(w)h(if)f(y)o(ou)g(do)g(not)g(accept)h(this)g(License.)264=0A=
576 y(Therefore,)14 b(b)o(y)h(mo)q(difying)h(or)f(distributing)h(the)f=0A=
(Program)f(\(or)g(an)o(y)g(w)o(ork)g(based)i(on)e(the)h(Pro-)264=0A=
641 y(gram\),)i(y)o(ou)h(indicate)i(y)o(our)d(acceptance)i(of)f(this)g=0A=
(License)i(to)e(do)g(so,)g(and)h(all)g(its)f(terms)g(and)264=0A=
705 y(conditions)e(for)f(cop)o(ying,)g(distributing)i(or)d(mo)q(difying)j=0A=
(the)e(Program)f(or)h(w)o(orks)f(based)h(on)g(it.)206 807 y(6.)22=0A=
b(Eac)o(h)d(time)g(y)o(ou)g(redistribute)h(the)g(Program)d(\(or)i(an)o(y)=
g(w)=0A=
o(ork)f(based)h(on)h(the)f(Program\),)f(the)264 871 y(recipien)o(t)d=0A=
(automatically)g(receiv)o(es)g(a)e(license)j(from)e(the)g(original)h=0A=
(licensor)g(to)f(cop)o(y)l(,)g(distribute)264 935 =
y(or)i(mo)q(dify)h(the)g=0A=
(Program)e(sub)s(ject)h(to)g(these)h(terms)f(and)h(conditions.)25=0A=
b(Y)l(ou)17 b(ma)o(y)f(not)g(imp)q(ose)264 1000 y(an)o(y)h(further)g=0A=
(restrictions)h(on)f(the)g(recipien)o(ts')i(exercise)f(of)f(the)g(righ)o(=
ts)g=0A=
(gran)o(ted)g(herein.)28 b(Y)l(ou)264 1064 y(are)15 =
b(not)f(resp)q(onsible)k=0A=
(for)c(enforcing)i(compliance)h(b)o(y)e(third)h(parties)f(to)g(this)g=0A=
(License.)206 1166 y(7.)22 b(If,)12 =
b(as)f(a)h(consequence)h(of)e(a)h(court)f=0A=
(judgmen)o(t)h(or)f(allegation)i(of)e(paten)o(t)g(infringemen)o(t)i(or)e(=
for)=0A=
g(an)o(y)264 1230 y(other)16 =
b(reason)h(\(not)f(limited)i(to)f(paten)o(t)f=0A=
(issues\),)h(conditions)h(are)f(imp)q(osed)h(on)f(y)o(ou)f(\(whether)264=0A=
1295 =
y(b)o(y)c(court)h(order,)f(agreemen)o(t)g(or)g(otherwise\))h(that)f(con)=0A=
o(tradict)g(the)h(conditions)h(of)e(this)i(License,)264 1359=0A=
y(they)i(do)g(not)g(excuse)h(y)o(ou)f(from)g(the)g(conditions)i(of)d(this=
)i=0A=
(License.)25 b(If)17 b(y)o(ou)f(cannot)g(distribute)264 1423=0A=
y(so)21 b(as)h(to)f(satisfy)g(sim)o(ultaneously)i(y)o(our)f(obligations)g=0A=
(under)h(this)f(License)i(and)e(an)o(y)f(other)264 1488 =
y(p)q(ertinen)o(t)c=0A=
(obligations,)g(then)g(as)f(a)g(consequence)h(y)o(ou)f(ma)o(y)g(not)g=0A=
(distribute)h(the)g(Program)e(at)264 1552 y(all.)30 b(F)l(or)17=0A=
b(example,)j(if)e(a)g(paten)o(t)g(license)i(w)o(ould)f(not)e(p)q(ermit)i(=
ro)o=0A=
(y)o(alt)o(y-free)f(redistribution)h(of)264 1616 =
y(the)d(Program)f(b)o(y)h=0A=
(all)h(those)f(who)g(receiv)o(e)h(copies)g(directly)g(or)f(indirectly)i=0A=
(through)e(y)o(ou,)g(then)264 1681 =
y(the)h(only)h(w)o(a)o(y)e(y)o(ou)h(could)=0A=
i(satisfy)e(b)q(oth)g(it)h(and)g(this)g(License)h(w)o(ould)e(b)q(e)h(to)f=0A=
(refrain)h(en)o(tirely)264 1745 =
y(from)c(distribution)j(of)e(the)g(Program.)=0A=
264 1828 y(If)20 =
b(an)o(y)f(p)q(ortion)h(of)g(this)g(section)g(is)h(held)g=0A=
(in)o(v)m(alid)h(or)d(unenforceable)i(under)g(an)o(y)e(particular)264=0A=
1892 =
y(circumstance,)i(the)f(balance)h(of)f(the)g(section)g(is)h(in)o(tended)=0A=
g(to)e(apply)i(and)f(the)g(section)h(as)e(a)264 1957 y(whole)c(is)h(in)o=0A=
(tended)h(to)d(apply)i(in)g(other)f(circumstances.)264 2040=0A=
y(It)j(is)i(not)e(the)h(purp)q(ose)g(of)g(this)g(section)g(to)f(induce)j(=
y)o=0A=
(ou)d(to)g(infringe)i(an)o(y)f(paten)o(ts)f(or)g(other)264=0A=
2104 y(prop)q(ert)o(y)g(righ)o(t)g(claims)h(or)f(to)f(con)o(test)h(v)m=0A=
(alidit)o(y)i(of)e(an)o(y)g(suc)o(h)h(claims;)h(this)f(section)g(has)f(th=
e)=0A=
264 2169 y(sole)13 =
b(purp)q(ose)h(of)e(protecting)i(the)f(in)o(tegrit)o(y)g=0A=
(of)f(the)h(free)h(soft)o(w)o(are)d(distribution)j(system,)f(whic)o(h)264=0A=
2233 =
y(is)j(implemen)o(ted)h(b)o(y)f(public)i(license)g(practices.)k(Man)o(y)=0A=
15 b(p)q(eople)i(ha)o(v)o(e)e(made)h(generous)g(con)o(tri-)264=0A=
2297 =
y(butions)g(to)f(the)h(wide)h(range)f(of)f(soft)o(w)o(are)f(distributed)=0A=
k(through)d(that)g(system)h(in)h(reliance)g(on)264 2362 y(consisten)o(t)f=0A=
(application)i(of)e(that)f(system;)h(it)g(is)h(up)g(to)e(the)i(author/don=
or)e=0A=
(to)g(decide)j(if)f(he)f(or)264 2426 =
y(she)h(is)g(willing)j(to)c(distribute)i=0A=
(soft)o(w)o(are)d(through)i(an)o(y)f(other)h(system)f(and)h(a)g(licensee)=
i=0A=
(cannot)264 2490 y(imp)q(ose)d(that)e(c)o(hoice.)p eop=0A=
%%Page: 142 153=0A=
142 152 bop 150 -84 1800 3 v 150 -100 a FD(C.2.)42 b(T)l(erms)17=0A=
b(and)h(Conditions)1092 b FH(142)264 88 y(This)12 b(section)h(is)f(in)o=0A=
(tended)h(to)f(mak)o(e)f(thoroughly)h(clear)g(what)g(is)g(b)q(eliev)o(ed)=
i=0A=
(to)d(b)q(e)i(a)f(consequence)264 153 y(of)i(the)i(rest)e(of)h(this)h=0A=
(License.)206 254 y(8.)22 b(If)16 =
b(the)f(distribution)j(and/or)d(use)h(of)f=0A=
(the)h(Program)e(is)i(restricted)g(in)h(certain)f(coun)o(tries)g(either)2=
64=0A=
319 =
y(b)o(y)f(paten)o(ts)g(or)h(b)o(y)f(cop)o(yrigh)o(ted)h(in)o(terfaces,)g=0A=
(the)g(original)h(cop)o(yrigh)o(t)e(holder)i(who)e(places)i(the)264=0A=
383 y(Program)d(under)i(this)h(License)g(ma)o(y)e(add)h(an)g(explicit)i=0A=
(geographical)e(distribution)i(limitation)264 448 =
y(excluding)c(those)e(coun)=0A=
o(tries,)h(so)f(that)f(distribution)j(is)f(p)q(ermitted)g(only)g(in)g(or)=
f=0A=
(among)g(coun)o(tries)264 512 y(not)i(th)o(us)g(excluded.)22=0A=
b(In)15 b(suc)o(h)h(case,)e(this)h(License)i(incorp)q(orates)d(the)h=0A=
(limitation)h(as)f(if)g(written)264 576 =
y(in)h(the)f(b)q(o)q(dy)h(of)f(this)g=0A=
(License.)206 678 y(9.)22 b(The)11 b(F)l(ree)h(Soft)o(w)o(are)e(F)l=0A=
(oundation)h(ma)o(y)g(publish)j(revised)e(and/or)f(new)g(v)o(ersions)h(of=
)f=0A=
(the)h(General)264 742 y(Public)19 =
b(License)g(from)d(time)h(to)g(time.)26=0A=
b(Suc)o(h)18 =
b(new)f(v)o(ersions)g(will)i(b)q(e)f(similar)g(in)g(spirit)g(to)=0A=
f(the)264 807 y(presen)o(t)e(v)o(ersion,)g(but)g(ma)o(y)g(di\013er)h(in)g=0A=
(detail)h(to)d(address)h(new)h(problems)g(or)e(concerns.)264=0A=
890 y(Eac)o(h)20 b(v)o(ersion)h(is)g(giv)o(en)h(a)e(distinguishing)k(v)o=0A=
(ersion)d(n)o(um)o(b)q(er.)37 b(If)21 =
b(the)f(Program)g(sp)q(eci\014es)i(a)=0A=
264 954 y(v)o(ersion)16 =
b(n)o(um)o(b)q(er)h(of)e(this)i(License)h(whic)o(h)f=0A=
(applies)h(to)e(it)g(and)h(\\an)o(y)e(later)h(v)o(ersion",)g(y)o(ou)g(ha)=
o(v)=0A=
o(e)264 1018 y(the)f(option)g(of)f(follo)o(wing)i(the)e(terms)h(and)g=0A=
(conditions)h(either)f(of)g(that)f(v)o(ersion)h(or)f(of)g(an)o(y)h(later)=
264=0A=
1083 =
y(v)o(ersion)h(published)j(b)o(y)d(the)g(F)l(ree)g(Soft)o(w)o(are)f(F)l=0A=
(oundation.)22 b(If)17 b(the)f(Program)f(do)q(es)h(not)g(sp)q(ecify)264=0A=
1147 =
y(a)g(v)o(ersion)h(n)o(um)o(b)q(er)g(of)f(this)h(License,)h(y)o(ou)e(ma)=0A=
o(y)g(c)o(ho)q(ose)h(an)o(y)f(v)o(ersion)h(ev)o(er)f(published)j(b)o(y)e(=
the)=0A=
264 1212 y(F)l(ree)e(Soft)o(w)o(are)f(F)l(oundation.)183 1313=0A=
y(10.)22 b(If)16 =
b(y)o(ou)g(wish)h(to)f(incorp)q(orate)h(parts)e(of)h(the)h=0A=
(Program)e(in)o(to)h(other)g(free)h(programs)e(whose)h(dis-)264=0A=
1378 y(tribution)22 =
b(conditions)i(are)d(di\013eren)o(t,)k(write)d(to)f(the)h=0A=
(author)g(to)f(ask)h(for)f(p)q(ermission.)42 b(F)l(or)264 1442=0A=
y(soft)o(w)o(are)19 =
b(whic)o(h)j(is)f(cop)o(yrigh)o(ted)h(b)o(y)f(the)g(F)l=0A=
(ree)g(Soft)o(w)o(are)f(F)l(oundation,)i(write)f(to)g(the)g(F)l(ree)264=0A=
1506 y(Soft)o(w)o(are)c(F)l(oundation;)j(w)o(e)e(sometimes)h(mak)o(e)f=0A=
(exceptions)i(for)e(this.)31 b(Our)19 b(decision)h(will)g(b)q(e)264=0A=
1571 y(guided)i(b)o(y)e(the)h(t)o(w)o(o)e(goals)i(of)f(preserving)h(the)g=0A=
(free)g(status)f(of)g(all)h(deriv)m(ativ)o(es)h(of)e(our)h(free)264=0A=
1635 y(soft)o(w)o(are)13 b(and)i(of)g(promoting)g(the)g(sharing)h(and)f=0A=
(reuse)h(of)e(soft)o(w)o(are)g(generally)l(.)853 1749 y Fn(NO)k(W)-5=0A=
b(ARRANTY)183 1851 y FH(11.)22 b(BECA)o(USE)17 b(THE)h(PR)o(OGRAM)f(IS)i=0A=
(LICENSED)f(FREE)f(OF)h(CHAR)o(GE,)f(THERE)g(IS)i(NO)264 1915=0A=
y(W)-5 b(ARRANTY)19 b(F)o(OR)f(THE)g(PR)o(OGRAM,)h(TO)f(THE)g(EXTENT)g=0A=
(PERMITTED)g(BY)h(AP-)264 1980 y(PLICABLE)j(LA)-5 b(W.)21 =
b(EX)o(CEPT)g(WHEN)=0A=
g(OTHER)-5 b(WISE)22 b(ST)l(A)l(TED)f(IN)h(WRITING)g(THE)264=0A=
2044 y(COPYRIGHT)28 b(HOLDERS)i(AND/OR)e(OTHER)h(P)l(AR)l(TIES)g(PR)o(O)o=0A=
(VIDE)f(THE)g(PR)o(O-)264 2108 y(GRAM)14 b(\\AS)g(IS")h(WITHOUT)g(W)-5=0A=
b(ARRANTY)15 b(OF)f(ANY)h(KIND,)f(EITHER)h(EXPRESSED)264 2173=0A=
y(OR)25 =
b(IMPLIED,)g(INCLUDING,)g(BUT)f(NOT)h(LIMITED)g(TO,)f(THE)h(IMPLIED)g=0A=
(W)-5 b(AR-)264 2237 y(RANTIES)14 b(OF)f(MER)o(CHANT)l(ABILITY)i(AND)e=0A=
(FITNESS)g(F)o(OR)h(A)f(P)l(AR)l(TICULAR)i(PUR-)264 2301 y(POSE.)k(THE)f=0A=
(ENTIRE)i(RISK)h(AS)e(TO)g(THE)g(QUALITY)h(AND)f(PERF)o(ORMANCE)g(OF)264=0A=
2366 =
y(THE)h(PR)o(OGRAM)i(IS)f(WITH)g(YOU.)g(SHOULD)h(THE)e(PR)o(OGRAM)i(PR)o=0A=
(O)o(VE)f(DEFEC-)264 2430 =
y(TIVE,)d(YOU)h(ASSUME)f(THE)h(COST)f(OF)h(ALL)g=0A=
(NECESSAR)l(Y)g(SER)-5 b(VICING,)19 b(REP)l(AIR)264 2495 =
y(OR)d(CORRECTION.)p=0A=
eop=0A=
%%Page: 143 154=0A=
143 153 bop 150 -84 1800 3 v 150 -100 a FD(C.3.)42 b(Ho)o(w)16=0A=
b(to)i(Apply)g(These)g(T)l(erms)963 b FH(143)183 88 y(12.)22=0A=
b(IN)11 b(NO)g(EVENT)g(UNLESS)h(REQUIRED)h(BY)e(APPLICABLE)h(LA)-5=0A=
b(W)11 b(OR)h(A)o(GREED)e(TO)h(IN)264 153 y(WRITING)16 b(WILL)h(ANY)f=0A=
(COPYRIGHT)g(HOLDER,)g(OR)h(ANY)f(OTHER)g(P)l(AR)l(TY)h(WHO)264=0A=
217 y(MA)l(Y)22 =
b(MODIFY)g(AND/OR)h(REDISTRIBUTE)g(THE)f(PR)o(OGRAM)h(AS)f=0A=
(PERMITTED)264 281 y(ABO)o(VE,)16 b(BE)h(LIABLE)h(TO)f(YOU)g(F)o(OR)g(D)o=0A=
(AMA)o(GES,)e(INCLUDING)j(ANY)f(GENERAL,)264 346 =
y(SPECIAL,)f(INCIDENT)l(AL)i=0A=
(OR)f(CONSEQUENTIAL)h(D)o(AMA)o(GES)d(ARISING)i(OUT)g(OF)264=0A=
410 =
y(THE)i(USE)i(OR)f(INABILITY)i(TO)e(USE)g(THE)g(PR)o(OGRAM)g(\(INCLUDING)=0A=
h(BUT)f(NOT)264 475 y(LIMITED)12 =
b(TO)h(LOSS)g(OF)g(D)o(A)l(T)l(A)f(OR)h(D)o=0A=
(A)l(T)l(A)f(BEING)h(RENDERED)f(INA)o(CCURA)l(TE)h(OR)264 539=0A=
y(LOSSES)19 =
b(SUST)l(AINED)g(BY)f(YOU)h(OR)f(THIRD)h(P)l(AR)l(TIES)g(OR)g(A)f=0A=
(F)-5 b(AILURE)19 b(OF)f(THE)264 603 =
y(PR)o(OGRAM)f(TO)f(OPERA)l(TE)i(WITH)f=0A=
(ANY)f(OTHER)i(PR)o(OGRAMS\),)e(EVEN)h(IF)g(SUCH)264 668 y(HOLDER)e(OR)g=0A=
(OTHER)g(P)l(AR)l(TY)h(HAS)e(BEEN)h(AD)o(VISED)f(OF)h(THE)f(POSSIBILITY)j=
(OF)=0A=
264 732 y(SUCH)e(D)o(AMA)o(GES.)619 846 y Fn(END)h(OF)i(TERMS)f(AND)g=0A=
(CONDITIONS)150 1023 y Ft(C.3)69 b(App)r(endix:)39 b(Ho)n(w)27=0A=
b(to)g(Apply)g(These)f(T)-6 b(erms)27 b(to)g(Y)-6 b(our)28=0A=
b(New)322 1108 y(Programs)150 1241 y FH(If)11 b(y)o(ou)f(dev)o(elop)h(a)f=0A=
(new)h(program,)f(and)h(y)o(ou)f(w)o(an)o(t)f(it)i(to)f(b)q(e)h(of)f(the)=
g=0A=
(greatest)g(p)q(ossible)i(use)f(to)f(the)g(public,)150 1306=0A=
y(the)k(b)q(est)g(w)o(a)o(y)f(to)g(ac)o(hiev)o(e)i(this)f(is)h(to)e(mak)o=
(e)h=0A=
(it)g(free)g(soft)o(w)o(are)e(whic)o(h)j(ev)o(ery)o(one)e(can)i(redistrib=
ute)=0A=
g(and)150 1370 y(c)o(hange)g(under)h(these)g(terms.)221 1458=0A=
y(T)l(o)e(do)g(so,)f(attac)o(h)g(the)i(follo)o(wing)g(notices)g(to)e(the)=
h=0A=
(program.)19 b(It)14 b(is)h(safest)e(to)h(attac)o(h)f(them)h(to)g(the)150=0A=
1522 =
y(start)h(of)h(eac)o(h)g(source)h(\014le)g(to)f(most)f(e\013ectiv)o(ely)=0A=
j(con)o(v)o(ey)e(the)h(exclusion)h(of)e(w)o(arran)o(t)o(y;)e(and)j(eac)o(=
h)f=0A=
(\014le)150 1587 =
y(should)g(ha)o(v)o(e)f(at)g(least)g(the)g(\\cop)o(yrigh)o=0A=
(t")f(line)j(and)f(a)f(p)q(oin)o(ter)g(to)g(where)g(the)h(full)g(notice)g=
(is)=0A=
g(found.)264 1724 y FG(h)p =
Fw(one)c(line)i(to)d(giv)o(e)i(the)f(program's)f=0A=
(name)h(and)g(a)g(brief)h(idea)g(of)f(what)g(it)g(do)q(es.)p=0A=
FG(i)g FH(Cop)o(yrigh)o(t)276 1788 y(c)264 1789 y FG(\015)j=0A=
FH(19yy)g FG(h)p Fw(name)g(of)f(author)p FG(i)264 1872 y FH(This)19=0A=
b(program)e(is)i(free)f(soft)o(w)o(are;)g(y)o(ou)g(can)g(redistribute)i(i=
t)e=0A=
(and/or)g(mo)q(dify)h(it)g(under)264 1936 y(the)13 =
b(terms)g(of)g(the)g(GNU)g=0A=
(General)h(Public)h(License)g(as)e(published)j(b)o(y)d(the)g(F)l(ree)h(So=
ft)o=0A=
(w)o(are)264 2000 y(F)l(oundation;)f(either)f(v)o(ersion)h(2)e(of)h(the)g=0A=
(License,)i(or)d(\(at)g(y)o(our)h(option\))g(an)o(y)f(later)h(v)o(ersion.=
)264=0A=
2083 y(This)17 =
b(program)e(is)i(distributed)h(in)f(the)g(hop)q(e)g(that)f(it)=0A=
h(will)h(b)q(e)f(useful,)g(but)g(WITHOUT)264 2148 y(ANY)e(W)-5=0A=
b(ARRANTY;)15 b(without)g(ev)o(en)g(the)g(implied)j(w)o(arran)o(t)o(y)13=0A=
b(of)h(MER)o(CHANT)l(ABIL-)264 2212 y(ITY)20 =
b(or)f(FITNESS)i(F)o(OR)f(A)g(P)=0A=
l(AR)l(TICULAR)i(PURPOSE.)e(See)h(the)f(GNU)g(General)264 2277=0A=
y(Public)d(License)g(for)d(more)h(details.)264 2360 =
y(Y)l(ou)f(should)g(ha)o=0A=
(v)o(e)g(receiv)o(ed)h(a)e(cop)o(y)h(of)f(the)h(GNU)g(General)g(Public)i=0A=
(License)f(along)f(with)264 2424 =
y(this)f(program;)g(if)g(not,)g(write)g(to)g=0A=
(the)g(F)l(ree)g(Soft)o(w)o(are)f(F)l(oundation,)h(Inc.,)h(675)e(Mass)h(A=
v)o=0A=
(e,)264 2488 y(Cam)o(bridge,)h(MA)h(02139,)f(USA.)p eop=0A=
%%Page: 144 155=0A=
144 154 bop 150 -84 1800 3 v 150 -100 a FD(C.3.)42 b(Ho)o(w)16=0A=
b(to)i(Apply)g(These)g(T)l(erms)963 b FH(144)221 88 y(Also)15=0A=
b(add)g(information)h(on)f(ho)o(w)g(to)f(con)o(tact)h(y)o(ou)f(b)o(y)i=0A=
(electronic)g(and)g(pap)q(er)f(mail.)221 176 =
y(If)f(the)f(program)g(is)h(in)o=0A=
(teractiv)o(e,)h(mak)o(e)e(it)h(output)f(a)h(short)f(notice)h(lik)o(e)h(t=
his)=0A=
g(when)f(it)g(starts)e(in)j(an)150 241 y(in)o(teractiv)o(e)h(mo)q(de:)264=0A=
378 y =
Fs(Gnomovision)j(version)h(69,)i(Copyright)e(\(C\))h(19yy)g(name)g(of)g=0A=
(author)g(Gnomovision)264 443 =
y(comes)f(with)h(ABSOLUTELY)f(NO)h(WARRANTY;)f=0A=
(for)i(details)e(type)h(`show)g(w'.)43 b(This)21 b(is)264 507=0A=
y(free)g(software,)f(and)h(you)g(are)g(welcome)f(to)i(redistribute)d(it)i=0A=
(under)g(certain)264 571 =
y(conditions;)e(type)i(`show)g(c')g(for)g(details.)=0A=
221 709 y FH(The)c(h)o(yp)q(othetical)h(commands)e(`sho)o(w)g(w')h(and)g=0A=
(`sho)o(w)f(c')g(should)i(sho)o(w)f(the)g(appropriate)g(parts)150=0A=
773 y(of)e(the)h(General)g(Public)h(License.)23 b(Of)15 b(course,)h(the)f=0A=
(commands)h(y)o(ou)f(use)h(ma)o(y)e(b)q(e)j(called)g(something)150=0A=
838 y(other)10 =
b(than)g(`sho)o(w)g(w')g(and)g(`sho)o(w)g(c';)h(they)g(could)g=0A=
(ev)o(en)g(b)q(e)g(mouse-clic)o(ks)h(or)e(men)o(u)h(items)g(|)g(whatev)o(=
er)=0A=
150 902 y(suits)16 b(y)o(our)e(program.)221 990 =
y(Y)l(ou)f(should)i(also)e=0A=
(get)g(y)o(our)g(emplo)o(y)o(er)h(\(if)f(y)o(ou)g(w)o(ork)g(as)g(a)g=0A=
(programmer\))f(or)h(y)o(our)g(sc)o(ho)q(ol,)h(if)f(an)o(y)l(,)150=0A=
1054 y(to)j(sign)h(a)g(\\cop)o(yrigh)o(t)f(disclaimer")i(for)e(the)h=0A=
(program,)f(if)h(necessary)l(.)25 b(Here)17 =
b(is)g(a)f(sample;)i(alter)f(the)=0A=
150 1119 y(names:)264 1256 y(Y)l(o)o(y)o(o)q(dyne,)d(Inc.,)h(hereb)o(y)g=0A=
(disclaims)i(all)e(cop)o(yrigh)o(t)g(in)o(terest)f(in)i(the)f(program)e=0A=
(`Gnomo-)264 1321 y(vision')j(\(whic)o(h)f(mak)o(es)g(passes)g(at)g=0A=
(compilers\))h(written)f(b)o(y)g(James)g(Hac)o(k)o(er.)264=0A=
1404 y FG(h)p Fw(signature)g(of)f(T)o(y)h(Co)q(on)p FG(i)p=0A=
FH(,)f(1)h(April)i(1989)d(T)o(y)h(Co)q(on,)f(Presiden)o(t)i(of)f(Vice)221=0A=
1541 y(This)j(General)g(Public)h(License)h(do)q(es)e(not)f(p)q(ermit)h=0A=
(incorp)q(orating)g(y)o(our)f(program)g(in)o(to)g(propri-)150=0A=
1606 y(etary)g(programs.)24 b(If)18 b(y)o(our)e(program)g(is)i(a)f=0A=
(subroutine)h(library)l(,)g(y)o(ou)f(ma)o(y)g(consider)h(it)f(more)g(usef=
ul)=0A=
150 1670 y(to)e(p)q(ermit)h(linking)h(proprietary)f(applications)h(with)f=0A=
(the)f(library)l(.)22 b(If)15 =
b(this)h(is)g(what)f(y)o(ou)g(w)o(an)o(t)g(to)f=0A=
(do,)150 1734 y(use)i(the)f(GNU)g(Library)h(General)f(Public)i(License)g=0A=
(instead)f(of)f(this)g(License.)p eop=0A=
%%Trailer=0A=
end=0A=
userdict /end-hook known{end-hook}if=0A=
%%EOF=0A=
------=_NextPart_000_01BC769C.AFE18720--
- Raw text -