Message-Id: <199706110915.FAA18652@delorie.com> From: "Warp" To: "OpenDOS Devel" , "Mr M S Aitchison" Subject: Here is the Linux Kernel hackers guide Date: Wed, 11 Jun 1997 19:21:39 +1000 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_01BC769C.AFE18720" Precedence: bulk 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 = D86 = 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 = D117 = DII<0FF0FE03C03801C03001= C020=0A= 01C06001C04001E08000E08000E10000E10000E200007200007400007C000078000070000= 03000=0A= 002000002000004000004000708000F10000F10000E60000780000171A809116>121=0A= D E /Fh 4 117 = df<1FF0303C701EF81FF81FF81F703E007C00F000C001800180030003000300=0A= 0300000000000000000007800FC00FC00FC00FC00780101A7E9915>63 = D110 = 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 = DI<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>II<001F808000E0618001801980070007800E= 0003=0A= 801C0003801C00018038000180780000807800008070000080F0000000F0000000F000000= 0F000=0A= 0000F0000000F0000000F0000000F0000000700000807800008078000080380000801C000= 1001C=0A= 0001000E000200070004000180080000E03000001FC000191E7E9C1E>IIII<001F808000E0618001801980070007800E00= 0380=0A= 1C0003801C00018038000180780000807800008070000080F0000000F0000000F0000000F= 00000=0A= 00F0000000F0000000F000FFF0F0000F80700007807800078078000780380007801C00078= 01C00=0A= 07800E00078007000B800180118000E06080001F80001C1E7E9C21>I73 = D75 = DIII80=0A= D82 = D<07E0801C1980300580700380600180E00180E00080E00080E00080F00000F8=0A= 00007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C08001C0800= 1C080=0A= 01C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F= 00C0=0A= 400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F0000000F00000= 00F00=0A= 00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000= 0000F=0A= 0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>III89 = D91 = D<08081010202040404040808080808080B0B0F8F878783030=0A= 0D0C7A9C15>II<1FC000307000783800781C00301C00001C00001C00= 01FC=0A= 000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115>= 97=0A= DI<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= >II<18003C003C0018000000000000000000000000= 0000=0A= 00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8= 0091D=0A= 7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000E0= 00E0=0A= 00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C06= 1803E=0A= 000B25839C0D>IIIII<03F0000E1C00180600300300700380600180E001C0E001C0= E001=0A= C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>II<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700E0= 0700=0A= 600700700700300F00180F000C370007C7000007000007000007000007000007000007000= 00700=0A= 003FE0131A7E9116>II<1F9030704030C010C010E010F8007F803FE00FF000F880= 3880=0A= 18C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE01C= 001C=0A= 001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910>= IIII<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000F8= 0000=0A= 9C00010E00020E000607000403801E07C0FF0FF81512809116>II<7FFC70= 3860=0A= 38407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>= II E /Fk 33 121 = df<00C001C0030006000C001C0038003000700070006000=0A= E000E000E000E000E000E000E000600070007000300038001C000C000600030001C000C00= A1D7A=0A= 9914>40 = D<8000C0006000300018001C000E000600070007000300038003800380038003800380=0A= 038003000700070006000E001C00180030006000C0008000091D7C9914>I<70F8FCFC7C0C= 1830=0A= E0C0060A798414>44 = DI<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>I76 = D<7FFEFFFEE01CE01CE038E038007000E000E001C001C00380070007000E000E001C0038=0A= 0E380E700E700EFFFEFFFE0F177E9614>90 = D<1FC0007FF000707800201800001C00001C0007FC=0A= 001FFC003C1C00701C00E01C00E01C00E01C00707C003FFF800F8F8011107E8F14>97=0A= D= 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=0A= I<030007800780030000000000000000007F807F800380038003800380038003800380038= 00380=0A= 038003800380FFFCFFFC0E187D9714>I107 = DIII<07C01FF03C78701C701CE00EE0= 0EE0=0A= 0EE00EE00EE00E701C783C3C781FF007C00F107E8F14>II<03CE000FFE001C3E00301E00= 700E=0A= 00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E001C3E000FEE0007CE00000E0= 0000E=0A= 00000E00000E00000E00000E00007FC0007FC012187F8F14>II<0FD83FF86038C038C038F0007F803FF007F8001C6006E006F006F81CFFF8CFE00F10= 7E8F=0A= 14>I<030007000700070007007FFCFFFC07000700070007000700070007000700070E070E= 070E=0A= 070C03FC00F00F157F9414>III<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 = DI<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>I61=0A= D<1FC020604030C038E038E0380038007000E001800100030002000200020002000200020= 00000=0A= 00000000000006000F000F0006000D1A7E9912>63 = D<000C0000000C0000000C0000001E000000=0A= 1E0000002F000000270000002700000043800000438000004380000081C0000081C000018= 1E000=0A= 0100E0000100E00003FFF000020070000200700004003800040038000400380008001C000= 8001C=0A= 003C001E00FF00FFC01A1A7F991D>65 = DI<003F0201C0C603002E0E001E1C= 000E=0A= 1C0006380006780002700002700002F00000F00000F00000F00000F00000F000007000027= 00002=0A= 7800023800041C00041C00080E000803003001C0C0003F00171A7E991C>IIII<=0A= 003F020001C0C60003002E000E001E001C000E001C0006003800060078000200700002007= 00002=0A= 00F0000000F0000000F0000000F0000000F0000000F001FFC070000E0070000E0078000E0= 03800=0A= 0E001C000E001C000E000E000E000300160001C06600003F82001A1A7E991E>III76 = DI<007F000001C1C000070070000E0038001C001C003C001E0038000E= 0078=0A= 000F0070000700F0000780F0000780F0000780F0000780F0000780F0000780F0000780F00= 00780=0A= 78000F0078000F0038000E003C001E001C001C000E0038000700700001C1C000007F00001= 91A7E=0A= 991E>79 = DI82 = D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF803FC007E000E=0A= 00070003800380038003C002C006E004D81887E0101A7E9915>I<7FFFFF00701C0700401C= 0100=0A= 401C0100C01C0180801C0080801C0080801C0080001C0000001C0000001C0000001C00000= 01C00=0A= 00001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C000= 0001C=0A= 0000001C0000001C000003FFE000191A7F991C>II88 = D<2040204040804080810081008100E1C0F1E0F1E060C00B0B7A9913>92=0A= D<1FC000387000383800101C00001C00001C0003FC001E1C00381C00701C00E01C00E01C8= 0E01C=0A= 80E03C80705F801F8F0011107F8F13>97 = DI<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>II<183C3C18000000000000FC1C1C1C1C1C= 1C1C=0A= 1C1C1C1C1C1C1CFF081A80990A>I<018003C003C001800000000000000000000000000FC0= 01C0=0A= 01C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C041C0E= 180E3=0A= 007E000A2182990C>III<= FC7C=0A= 1F001D8E63801E0781C01E0781C01C0701C01C0701C01C0701C01C0701C01C0701C01C070= 1C01C=0A= 0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F81D107F8F20>II<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C38= 07E0=0A= 10107F8F13>II<03E1000C1300180B00300F00700700E00700E00700E00700E00700E00700E007= 0070=0A= 0700700700380F001C370007C700000700000700000700000700000700000700003FE0131= 77F8F=0A= 14>II<1F2060E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C10= 7F8F=0A= 0F>I<0800080008000800180018003800FFC0380038003800380038003800380038003820= 3820=0A= 3820382018201C4007800B177F960F>IIIIII123 = D=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 = DII<=0A= FFFFFF800F800780078001800780018007800080078000C00780004007800040078000400= 78000=0A= 40078040000780400007804000078040000780C00007FFC0000780C000078040000780400= 00780=0A= 4000078040000780000007800000078000000780000007800000078000000780000007800= 0000F=0A= C00000FFFE00001A1F7D9E20>I73 = D77 = DI<001FE0000070380001C0= 0E00=0A= 03800700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000F878000078F= 80000=0A= 7CF800007CF800007CF800007CF800007CF800007CF800007CF800007CF800007C7800007= 87C00=0A= 00F87C0000F83C0000F03E0001F01E0001E00F0003C0070003800380070001E01E0000703= 80000=0A= 1FE0001E217C9F26>I82 = D<03F0200C0C601803E030=0A= 00E06000E0600060E00060E00020E00020E00020F00000F800007C00007F80003FFC001FF= F0007=0A= FF8001FFC0000FE00003E00001F00000F0000070800070800070800070800070C00060C00= 0E0E0=0A= 00C0F80180C6030081FC0014217C9F1C>I<7FFFFFF8780780786007801840078008400780= 08C0=0A= 07800C8007800480078004800780048007800400078000000780000007800000078000000= 78000=0A= 0007800000078000000780000007800000078000000780000007800000078000000780000= 00780=0A= 0000078000000780000007800000078000000FC00003FFFF001E1F7D9E24>I87=0A= D89 = D110 = D117 = D120 D E /Fo 4 121 = df105=0A= D110=0A= D117=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 = D72 = D<03F1C00FFDC03FFFC07C=0A= 0FC07003C0E003C0E001C0E001C0E001C0E000007000007800003F00001FF00007FE0000F= F0000=0A= 0F800003C00001C00000E00000E06000E0E000E0E000E0E001C0F001C0FC0780FFFF80EFF= E00E3=0A= F800131E7D9D1A>83 = D<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF=0A= 803F8380780380700380E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157= D941A=0A= >97 = DI<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 = D108 = D<7CE0E000FFFBF8007F=0A= FFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1= C1C00=0A= 1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F001= 91580=0A= 941A>II<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>I45 = 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 = DI<0003FE= 0080=0A= 001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F800007803F0= 00003=0A= 803F000003807F000001807E000001807E00000180FE00000000FE00000000FE00000000F= E0000=0A= 0000FE00000000FE00000000FE00000000FE000000007E000000007E000001807F0000018= 03F00=0A= 0001803F000003801F800003000F8000030007C000060003F0000C0001F800380000FF00F= 00000=0A= 1FFFC0000003FE000021227DA128>II<= FFFF=0A= FFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607F01= 80607=0A= F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F= 01800=0A= 07F0180007F0180307F0180307F0000307F0000607F0000607F0000607F0000E07F0000E0= 7F000=0A= 1E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>II<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000FC007= C000=0A= 07C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E000000C= 0FE00=0A= 000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000FF= FFC7E=0A= 000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007E00= 01FC0=0A= 03F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>III75 = DIII80=0A= D<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001= F8000=0A= 3F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE= 0FE00=0A= 000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000= FC07F=0A= 00001FC07F00001FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC0003F60= 7F800=0A= 00FF07E000003FFF80000007FF80200000038020000001C020000001E0E0000001FFE0000= 001FF=0A= C0000000FFC0000000FFC00000007F800000007F000000001E00232C7DA12A>II<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8= 000C=0A= F8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0= 003FF=0A= 00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE08= 0FF80=0A= 18227DA11F>I<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180= E003=0A= F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F80= 00000=0A= 03F800000003F800000003F800000003F800000003F800000003F800000003F800000003F= 80000=0A= 0003F800000003F800000003F800000003F800000003F800000003F800000003F80000000= 3F800=0A= 000003F800000003F8000003FFFFF80003FFFFF80022227EA127>IIII89 = D<07FC001FFF803F07C03F03E03F01=0A= E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F= 0FC01=0A= F07E02F07E0CF81FF87F07E03F18167E951B>97 = DI<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>II<1C003E007F007F007F003E001C000000000000000000000000000000FF00= FF00=0A= 1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00F= FE0FF=0A= E00B247EA310>I= 107=0A= DI<=0A= FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F001= F001F=0A= 001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F0= 01F00=0A= 1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001= F001F=0A= 001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>II<=0A= 00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EF= C007E=0A= FC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>II114 = D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8=0A= 003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00= 01116=0A= 7E9516>I<0180000180000180000180000380000380000780000780000F80003F8000FFFF= 00FF=0A= FF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8= 1800F=0A= 81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>IIIIII<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 = DI<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>II<01C00001C00001C00001= C000=0A= 71C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C0000= 1C000=0A= 01C00011127E9516>I<01C00001C00001C00001C00001C00001C00001C00001C000FFFF80= FFFF=0A= 80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00011137E9516>I<387C= 7E7E=0A= 3E0E1E3C7CF860070B798416>II<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>II<= 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>II<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>II<03E30007FF001FFF003E1F003C0F00780F007807007007= 00F0=0A= 0000E00000E00000E00000E00000E03F80E07FC0E03F80F00700700700780F00780F003C0= F003E=0A= 1F001FFF0007FF0003E70012197E9816>I<7F1FC0FFBFE07F1FC01C07001C07001C07001C= 0700=0A= 1C07001C07001C07001FFF001FFF001FFF001C07001C07001C07001C07001C07001C07001= C0700=0A= 1C07001C07007F1FC0FFBFE07F1FC013197F9816>I=0A= I<07FE07FF07FE00380038003800380038003800380038003800380038003800380038003= 80038=0A= 6038F038F0707FF07FE01F8010197D9816>I<7F0FE0FF8FF07F0FE01C07801C0F001C0E00= 1C1C=0A= 001C3C001C78001CF0001CE0001DF0001FF0001FF8001F38001E1C001C1C001C0E001C0E0= 01C07=0A= 001C07001C03807F07E0FF8FF07F07E01419809816>III<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>III<7F1F807F3F807F1F800E1E000E1C00073C0007380003B80003F0= 0001=0A= F00001E00000E00001E00001F00003F00003B80007B800071C00071C000E0E000E0E001C0= 7007F=0A= 1FC0FF1FE07F1FC013197F9816>II<7FFF80FFFF80FFFF80E00700E00F00E01E00= E01C=0A= 00003C0000780000700000F00001E00001C00003C0000780000700000F00001E03801C038= 03C03=0A= 80780380700380FFFF80FFFF80FFFF8011197E9816>IIII95 = 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=0A= II<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>II<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>= II<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>III<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 = DI<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=0A= I<00003FF001800003FFFE0380000FFFFF8780003FF007DF8000FF8001FF8001FE00007F8= 003FC=0A= 00003F8007F000001F800FF000000F801FE0000007801FE0000007803FC0000007803FC00= 00003=0A= 807FC0000003807F80000003807F8000000000FF8000000000FF8000000000FF800000000= 0FF80=0A= 00000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000007F800= 00000=0A= 007F80000000007FC0000003803FC0000003803FC0000003801FE0000003801FE00000070= 00FF0=0A= 0000070007F000000E0003FC00001E0001FE00003C0000FF8000F800003FF007E000000FF= FFFC0=0A= 000003FFFF000000003FF8000029297CA832>II<=0A= FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F003F= C0000=0A= F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C0380= 3FC03=0A= C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00= 003FC=0A= 03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC000= 01C03=0A= FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFF= FFFF0=0A= FFFFFFFFF0FFFFFFFFF027297DA82D>II72 = DI76 = DII<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC00= 07F0=0A= 0003F80003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F8= 03FC0=0A= 00007F807FC000007FC07F8000003FC07F8000003FC07F8000003FC0FF8000003FE0FF800= 0003F=0A= E0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE= 0FF80=0A= 00003FE0FF8000003FE07F8000003FC07FC000007FC07FC000007FC03FC000007F803FC00= 0007F=0A= 801FE00000FF001FE00000FF000FF00001FE0007F00001FC0003F80003F80001FC0007F00= 000FF=0A= 001FE000003FC07F8000000FFFFE00000000FFE000002B297CA834>II<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>II87 = D89 = D<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F8= 0=0A= 00003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80F= E003F=0A= 80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9= A21>=0A= 97 = DI<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>II<07000F801FC03FE03FE03FE01FC00F8007000000000000= 0000=0A= 00000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE= 00FE0=0A= 0FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I107 = DIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F00= 07E0=0A= 7F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8F= F0007=0A= F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC0= 0003F=0A= E0001D1B7E9A22>II<001FC0380000FFF0780003F838F80007E00DF8000F= C007=0A= F8001FC007F8003F8003F8007F8003F8007F8003F8007F0003F800FF0003F800FF0003F80= 0FF00=0A= 03F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F8003F= 8003F=0A= 8003F8001F8007F8000FC007F80007E01FF80003F07BF80000FFF3F800003FC3F80000000= 3F800=0A= 000003F800000003F800000003F800000003F800000003F800000003F800000003F800000= 003F8=0A= 0000003FFF8000003FFF8000003FFF8021277E9A24>II<03FE300F= FFF0=0A= 1E03F03800F0700070F00070F00070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF00= 7FFF8=0A= 00FFF80003FC0000FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF001= 61B7E=0A= 9A1B>I<00700000700000700000700000F00000F00000F00001F00003F00003F00007F000= 1FFF=0A= F0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00= 007F0=0A= 0007F00007F00007F03807F03807F03807F03807F03807F03803F03803F87001F86000FFC= 0001F=0A= 8015267FA51B>IIIIII<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 = DI<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 = D120 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>I86 = 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>III<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 = D66 = 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>II<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 = DI76 = DII80 = 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>II87=0A= D89 = 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>= III<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 = D73 = 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>I119 = D121 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>I77 = D<7FFF8060C18040C080C0C0C080C04080C04000C00000C00000C00000C00000C00000C00= 0=0A= 00C00000C00000C00000C0000FFC0012117F9016>84 D E /FB 4 128 = df<70F8F8F87005057C=0A= 840D>58 = D= 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>II<= 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>II<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>I123 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>II<387CFEFFFF7F3B030306060E0C18702008107D860E>44=0A= DI<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 = DI<0007FC02003FFF0E00FE03DE03= F000=0A= FE07E0003E0FC0001E1F80001E3F00000E3F00000E7F0000067E0000067E000006FE00000= 0FE00=0A= 0000FE000000FE000000FE000000FE000000FE0000007E0000007E0000067F0000063F000= 0063F=0A= 00000C1F80000C0FC0001807E0003803F0007000FE01C0003FFF800007FC001F1F7D9E26>= IIII<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>II<03= FFFC=0A= 03FFFC000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00= 00FC0=0A= 000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0100FC07C0FC0FE0FC0FE0FC0F= E0F80=0A= FC1F80783F003FFE000FF000161F7F9E1B>III<=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>II<001FF80000= FFFF=0A= 0001F81F8007E007E00FC003F01F8001F81F8001F83F0000FC7F0000FE7F0000FE7E00007= EFE00=0A= 007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007F7E000= 07E7E=0A= 00007E7F0000FE3F0000FC3F87C1FC1F8FE1F80FD833F007F81FE001F81F8000FFFF00001= FFE03=0A= 00000E0300000F0700000FFF000007FF000007FE000007FE000003FC000001F8000000F02= 0287D=0A= 9E27>II<03FC080FFF381E03F83800F8700078700038F00038F00018F00018= F800=0A= 00FC00007FC0007FFE003FFF801FFFC00FFFF007FFF000FFF80007F80000FC00007C00003= CC000=0A= 3CC0003CC0003CE00038E00078F80070FE01E0E7FFC081FF00161F7D9E1D>I<7FFFFFFC7F= FFFF=0A= FC7C07E07C7007E01C6007E00C6007E00CE007E00EC007E006C007E006C007E006C007E00= 60007=0A= E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E= 00000=0A= 07E0000007E0000007E0000007E0000007E0000007E0000007E00003FFFFC003FFFFC01F1= E7E9D=0A= 24>IIII89 = D91 = D93=0A= D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007FFE01F03E03E03E= 07C03=0A= E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F9319>97 = DI<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>II<1C003E007F007F007F003E001C00000000000000000000000000FF= 00FF=0A= 001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE= 00B21=0A= 7EA00E>I<0038007C00FE00FE00FE007C003800000000000000000000000001FE01FE003E= 003E=0A= 003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E3= 03E78=0A= 3EFC3CFC7C78783FF01FC00F2A83A010>IIIII<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC= 007E=0A= FC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF001= 7147F=0A= 931A>II<01F81807FE381F87783F01F83E01F87E00= F87C=0A= 00F8FC00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87E00F87E00F83F01F81F87F80FF= EF803=0A= F8F80000F80000F80000F80000F80000F80000F80000F80007FF0007FF181D7E931C>II<0FE63FFE701E600EE006E006= F800=0A= FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>I<01800180= 0180=0A= 03800380038007800F803F80FFFCFFFC0F800F800F800F800F800F800F800F800F800F800= F860F=0A= 860F860F860F8607CC03F801F00F1D7F9C14>IIIIII<3FFFE03FFFE03C07C0380F80701F= 8060=0A= 3F00603E00607C0000F80001F80003F00003E06007C0600F80601F80E03F00C03E01C07C0= 3C0FF=0A= FFC0FFFFC013147F9317>III 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>II<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>II<00F8E003FEE007FFE00F07E01E03E03C01E03800E07000E07000E0700000E00000E0= 0000=0A= E00000E00000E00000E00000E00000E000007000007000E07000E03800E03C00E01E01C00= F07C0=0A= 07FF8003FE0000F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03C01C03C01C01E0= 1C00=0A= E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00701C00701C00F01C00E= 01C00=0A= E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B18>III<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>II<7E07F0FF0FF87F07= F01D=0A= 81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C3= 1C01C=0A= 39C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151= C7F9B=0A= 18>I<0FF8003FFE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E0= 0380=0A= E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380F007807007007= 80F00=0A= 7FFF003FFE000FF800111C7D9B18>II<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>IIII<7F8FE07F9FE07F8FE00E07000F070007= 0E00=0A= 078E00039C0003DC0001F80001F80000F00000F00000700000F00000F80001F80001DC000= 39E00=0A= 038E00070F000707000E07800E03801E03C07F07F0FF0FF87F07F0151C7F9B18>II<3FFFE07FFFE07FFFE07001C07003C0700780700700000F00001E00001C= 0000=0A= 3C0000780000700000F00001E00001C00003C0000780000700000F00001E00E01C00E03C0= 0E078=0A= 00E07000E0FFFFE0FFFFE0FFFFE0131C7E9B18>II<600000F00000F00000F80000780000= 7C00=0A= 003C00003C00003E00001E00001F00000F00000F00000F800007800007C00003C00003C00= 003E0=0A= 0001E00001F00000F00000F800007800007800007C00003C00003E00001E00001E00001F0= 0000F=0A= 00000F8000078000078000030011247D9F18>II<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>II<= 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 = DII58=0A= D<001F0000001F0000003F8000003B8000003B8000007BC0000073C0000071C00000F1E00= 000E1=0A= E00000E0E00001E0F00001E0F00001C0F00003C0780003C078000380780007803C0007803= C0007=0A= 003C000FFFFE000FFFFE000FFFFE001E000F001E000F003C000F803C0007803C000780780= 007C0=0A= 780003C0780003C0F00003E01B207F9F1E>65 = D69 = D72=0A= D=0A= I<003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003= C003C=0A= 003C003C003C003C003C003C003C003C003CC078E078FFF07FE00FC00E217E9F15>IIII<003F000000FFC00003FFF000= 07E1=0A= F8000F807C001F003E001E001E003C000F003C000F00780007807800078078000780F0000= 3C0F0=0A= 0003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F80007C0780= 00780=0A= 78000780780007803C000F003C000F001E001E001F003E000F807C0007E1F80003FFF0000= 0FFC0=0A= 00003F00001A227DA021>79 = D= I<01=0A= FC0007FF800FFFC01F03C03C00C03C00007800007800007800007800007800007C00003C0= 0003F=0A= 00001FE0000FFC0007FE0001FF00003F800007C00003C00003E00001E00001E00001E0000= 1E000=0A= 01E00001C0C003C0F007C0FC0F807FFF001FFE0003F80013227EA019>83=0A= DI<07E03FF87FFC701E401F000F000F000F003F= 07FF=0A= 1FFF7E0FF80FF00FF00FF00FF83F7FFF3FEF1F8F10147E9316>97 = DI<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>II=0A= I107 = DII<= F1F8=0A= F3FCF7FEFC1FF80FF80FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF= 00F10=0A= 147D9317>I<01F80007FE001FFF803F0FC03C03C07801E07801E0F000F0F000F0F000F0F0= 00F0=0A= F000F0F000F07801E07801E03C03C03F0FC01FFF8007FE0001F80014147F9317>II<03C7800FF7801FFF803E1F807C0F80780780780780F00780F007= 80F0=0A= 0780F00780F00780F00780F807807807807C0F803E1F801FFF800FF78007C780000780000= 78000=0A= 0780000780000780000780000780000780000780111D7E9317>II<07F0= 1FFC=0A= 3FFC780C7800780078007C003FC01FF00FF803F8007C003C003CC03CF07CFFF87FF00FC00= E147F=0A= 9311>I<1E001E001E001E001E001E00FFF0FFF0FFF01E001E001E001E001E001E001E001E= 001E=0A= 001E001E001E001E001E201FF00FF007C00C1A7F9910>IIII<7801E07C03C03E= 0780=0A= 1E0F000F0F00079E0003FC0003F80001F80000F00001F00001F80003FC00079E000F0F000= E0F00=0A= 1E07803C03C07801E0F801F01414809315>II=0A= E /FG 9 122 df0 = 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= D21=0A= D<00000C00000C0000180000180000300000300000600000600000C00000C000018000018= 00001=0A= 80000300000300000600000600000C00000C0000180000180000300000300000600000600= 000C0=0A= 0000C0000180000180000300000300000600000600000600000C00000C000018000018000= 03000=0A= 00300000600000600000C00000400000162C7AA000>54 = D<004000C00180018001800300030003=0A= 000600060006000C000C00180018001800300030003000600060006000C000C0006000600= 06000=0A= 3000300030001800180018000C000C0006000600060003000300030001800180018000C00= 0400A=0A= 2E7CA112>104 = DI<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=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>II<000FC040007030C001C009C0038005C0070003C0= 0E00=0A= 01C01E0000C01C0000C03C0000C07C0000407C00004078000040F8000000F8000000F8000= 000F8=0A= 000000F8000000F8000000F8000000F8000000F8000000780000007C0000407C0000403C0= 00040=0A= 1C0000401E0000800E000080070001000380020001C0040000703800000FC0001A217D9F2= 1>I<=0A= FFFFE0000F803C0007801E000780070007800380078003C0078001E0078001E0078001F00= 78000=0A= F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F= 80780=0A= 00F8078000F0078000F0078000F0078001E0078001E0078003C0078003800780070007800= E000F=0A= 803C00FFFFE0001D1F7E9E23>III<000FE0200078186000E004E0038002E0070001E00F0000E01E0000601E0000603C00= 0060=0A= 3C0000207C00002078000020F8000000F8000000F8000000F8000000F8000000F8000000F= 80000=0A= 00F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E0001E01E0001E00F0001E= 00700=0A= 01E0038002E000E0046000781820000FE0001E217D9F24>II<=0A= FFFC0FC007800780078007800780078007800780078007800780078007800780078007800= 78007=0A= 800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>I<0FFF80007C0000= 3C00=0A= 003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C000= 03C00=0A= 003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C00F83C00F038004= 07800=0A= 40700030E0000F800011207E9E17>IIIII<001F8000= 00F0=0A= F00001C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E078000= 1E078=0A= 0001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80= 001F0=0A= 780001E07C0003E07C0003E03C0003C03C0003C01E0007800E0007000F000F0007801E000= 1C038=0A= 0000F0F000001F80001C217D9F23>II<001F800000F0F0= 0001=0A= C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E07C0003E0780= 001E0=0A= F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F07= 80001=0A= E0780001E07C0003E03C0003C03C0F03C01E1087800E2047000F204F0007A03E0001E0380= 000F0=0A= F010001FB01000003010000038300000387000003FF000001FE000001FE000000FC000000= 7801C=0A= 297D9F23>II<07E0800C198010078030038060= 0180=0A= 600180E00180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE000= 3FF00=0A= 001F800007800003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F= 00600=0A= CE0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030= 800F=0A= 0010800F0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F0= 00000=0A= 0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000= F0000=0A= 000F0000000F0000000F0000001F800007FFFE001C1F7E9E21>IIII<7FF81FF80FE00FC007= C007=0A= 0003C0020001E0040001F00C0000F0080000781000007C1000003C2000003E4000001E400= 0000F=0A= 8000000F8000000780000003C0000007E0000005E0000009F0000018F8000010780000207= C0000=0A= 603C0000401E0000801F0001800F0001000780020007C0070003C01F8007E0FFE01FFE1F1= F7F9E=0A= 22>II<7FFFF87C00F87000F06001E04001E0C003C0C003= C080=0A= 0780800F80800F00001E00001E00003C00003C0000780000F80000F00001E00001E00003C= 00403=0A= C0040780040F80040F000C1E000C1E00083C00183C0018780038F801F8FFFFF8161F7D9E1= C>I<=0A= FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C= 0C0C0=0A= C0C0C0C0FEFE072D7CA10D>I<080410082010201040204020804080408040B85CFC7EFC7E= 7C3E=0A= 381C0F0E7B9F17>II<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>II<=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>III E /FI 19 121 df39=0A= D<0001FF00000FFFE0003FFFFC007FFFFE00FE01FE01F8003E03F0000C07C000000FC0000= 01F80=0A= 00001F0000003F0000003E0000007E0000007C0000007C0000007C000000F8000000F8000= 000F8=0A= 000000F8000000F8000000F8000000F8000000F8001FFEF8001FFEF8001FFE7C001FFE7C0= 0003E=0A= 7C00003E7E00003E3E00003E3F00003E1F00003E1F80003E0FC0003E07C0003E03F0003E0= 1F800=0A= 3E00FE00FE007FFFFE003FFFFC000FFFE00001FF001F2C7CAA28>71 = DI75=0A= DI84=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>I104 = D= I107 = DI11= 0=0A= D114 = D<03FC001FFF803FFFC07FFFC07C07=0A= C0F80080F80000F80000F80000FC00007F80007FF8003FFE001FFF0007FF8000FFC0000FE= 00007=0A= E00003E00003E04003E0E007E0FC0FC0FFFFC07FFF801FFE0003F800131B7E9A17>I117 = 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()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()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()=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()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()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()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()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= ()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()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= ()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()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()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()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()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()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()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= ()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()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()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()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()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()450 558 y(#include)g()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()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()450=0A= 2174 y(#include)g()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()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()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()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()450 1284 y(#include)g=0A= ()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()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= ()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()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= ()364 1840 y(#include)g()364=0A= 1897 y(#include)g()364 1954 = y(#include)g()=0A= 364 2011 y(#include)g()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()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()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()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()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--