  The Linux Kernel
  David A Rusling david.rusling@arm.com
  v0.8-3 January 25, 1999
  JF Project
  v0.8-3 December 2000

  *t[\* {́ALinux J[l̎dg݂m肽 Linux DƂ
  ߂̂̂łB͓\̃}jAł͂܂Bނ Linux
  ŎgpĂ錴⃁JjŶłALinux ̓쌴
  Ƃ͂ǂ̂ŁAȂꂪ̗pĂ̂̂łB
  Linux ƂΏۂ͏ɕωĂ܂B{x[XɂĂ݂̂͌
  łł 2.0.33 ̃J[l\[XłA͌l@l̑啔
  gpĂ̂̃o[WłB܂A{͎Rɔzz
  Ă܂Ȃ̂ŁȀ̂Ƃɂł͂܂AĔzz
  \łBڍׂ́A``쌠Ɣzz''QƂĉB (: 
  pɍۂāA``{ɂ''ǂ݂B)
  ______________________________________________________________________

  ڎ

  1. ͂߂
     1.1 z肷ǎ
     1.2 {̍\
     1.3 ̕ł̕\LK
     1.4 Wɂ
     1.5 ҂ɂ
     1.6 ӎ

  2. n[hEFÅ{
     2.1 CPU
     2.2 
     2.3 oX
     2.4 Rg[ƎӋ@
     2.5 AhX
     2.6 ^C}[

  3. \tgEFÅ{
     3.1 Rs[^
        3.1.1 AZu
        3.1.2 C ƃRpC
        3.1.3 J
     3.2 Iy[eBOVXeƂ͉H
        3.2.1 Ǘ
        3.2.2 vZX
        3.2.3 foCXhCo
        3.2.4 t@CVXe
     3.3 J[l̃f[^\
        3.3.1 AXg
        3.3.2 nbVe[u
        3.3.3 ۃC^[tFCX

  4. Ǘ
     4.1 z̒ۃf
        4.1.1 f}hy[WO
        4.1.2 XbsO
        4.1.3 Lz
        4.1.4 AhX[hƉzAhX[h
        4.1.5 ANZX
     4.2 LbV
     4.3 Linux ̃y[We[u
     4.4 y[W̊蓖Ăƃy[W̉
        4.4.1 y[W̊蓖
        4.4.2 y[W̉
     4.5 }bsO
     4.6 f}hy[WO
     4.7 Linux ̃y[WLbV
     4.8 XbvAEgƃy[W̔j
        4.8.1 y[WLbVƃobt@LbṼTCY̏k
        4.8.2 System V Ly[W̃XbvAEg
        4.8.3 XbvAEgꂽjꂽy[W
     4.9 XbvLbV
     4.10 Xbṽy[WC

  5. vZX
     5.1 Linux ̃vZX
     5.2 ʎq(identifiers)
     5.3 XPW[O
        5.3.1 }`vZbTVXeł̃XPW[O
     5.4 t@C
     5.5 z
     5.6 vZX̐
     5.7 Ԃƃ^C}[
     5.8 vO̎s
        5.8.1 ELF
           5.8.1.1 ELF LCu
        5.8.2 XNvgt@C
  6. vZXԒʐM̎dg
     6.1 VOi
     6.2 pCv
     6.3 \Pbg
        6.3.1 System V IPC ̃JjY
        6.3.2 bZ[WL[
        6.3.3 Z}tH
        6.3.4 L

  7. PCI
     7.1 PCI AhX
     7.2 PCI RtBO[Vwb_
     7.3 PCI I/O  PCI AhX
     7.4 PCI-ISA ubW
     7.5 PCI-PCI ubW
        7.5.1 PCI-PCI ubW: PCI I/O  PCI EBhE
        7.5.2 PCI-PCI ubW: PCI RtBO[VTCN PCI oX̔ԍt
     7.6 Linux  PCI @
        7.6.1 Linux J[l PCI f[^\
        7.6.2 PCI foCXhCo
           7.6.2.1 PCI-PCI ubW̐ݒ - PCI oXԍ̊蓖
        7.6.3 PCI BIOS ֐
        7.6.4 PCI tBbNXAbv(fixup)
           7.6.4.1 foCXKvƂ PCI I/O  PCI Ԃ̗eʂ𒲂ׂ
           7.6.4.2 PCI-PCI ubWƃfoCXɑ΂ PCI I/O  PCI 蓖Ă

  8. 荞݂Ɗ荞ݏ
     8.1 vO\Ȋ荞݃Rg[
     8.2 荞ݏ̃f[^\̏
     8.3 荞ݏ

  9. foCXhCo
     9.1 |[OƊ荞
     9.2 _CNgANZX(Direct Memory Access, DMA)
     9.3 
     9.4 foCXhCoƃJ[lƂ̃C^[tFCX
        9.4.1 LN^foCX
        9.4.2 ubNfoCX
     9.5 n[hfBXN
        9.5.1 IDE fBXN
        9.5.2 IDE TuVXȅ
        9.5.3 SCSI fBXN
        9.5.4 SCSI TuVXȅ
        9.5.5 ubNfoCX̃NGXg`B
     9.6 lbg[NfoCX
        9.6.1 lbg[NfoCX̏

  10. t@CVXe
     10.1 Second Extended File System (EXT2)
        10.1.1 EXT2 Inode
        10.1.2 EXT2 X[p[ubN(Superblock)
        10.1.3 EXT2 O[vfBXNv^
        10.1.4 EXT2 fBNg
        10.1.5 EXT2 t@CVXẽt@Č
        10.1.6 EXT2 t@CVXẽt@CTCY̕ύX
     10.2 zt@CVXe (Virtual File System, VFS)
        10.2.1 VFS X[p[ubN
        10.2.2 VFS inode
        10.2.3 t@CVXe̓o^
        10.2.4 t@CVXẽ}Eg
        10.2.5 zt@CVXeł̃t@Č
        10.2.6 zt@CVXeł̃t@C̍쐬
        10.2.7 t@CVXẽ}Eg
        10.2.8 VFS inode LbV
        10.2.9 fBNgLbV
     10.3 obt@LbV
        10.3.1 bdflush J[lf[
        10.3.2 update vZX
     10.4 /proc t@CVXe
     10.5 foCXXyVt@C

  11. lbg[N
     11.1 TCP/IP lbg[LO̊Tv
     11.2 Linux  TCP/IP lbg[Nw
     11.3 BSD \PbgC^[tFCX
     11.4 INET \Pbgw
        11.4.1 BSD \Pbg̍쐬
        11.4.2 AhX INET BSD \Pbg bind 
        11.4.3 INET BSD \PbgŃRlNVm
        11.4.4 INET BSD \Pbgł̑ҋ@(listen)
        11.4.5 RlNVv󂯓(accept)
     11.5 IP w
        11.5.1 \Pbgobt@(socket buffer)
        11.5.2 IP pPbg̎M
        11.5.3 IP pPbg̑M
        11.5.4 f[^̍ו(fragmentation)
     11.6 Address Resolution Protocol (ARP)
     11.7 IP [eBO
        11.7.1 [gLbV
        11.7.2 tH[fBOf[^x[X(Forwarding Information Database)

  12. J[lJjY
     12.1 {gn[tnh
     12.2 ^XNL[(task queue)
     12.3 ^C}[(timer)
     12.4 ҂s(wait queue)
     12.5 oYbN (Buzz Locks)
     12.6 Z}tH(semaphore)

  13. W[
     13.1 W[̃[fBO
     13.2 W[̃A[h

  14. vZbT
     14.1 x86
     14.2 ARM
     14.3 Alpha AXP vZbT

  15. Linux J[l\[X
     15.1 Linux J[l\[X̓ꏊ
     15.2 J[l\[X̍\
     15.3 ǂ猩ׂ
        15.3.1 VXe̋NƏ
        15.3.2 Ǘ
        15.3.3 J[l
        15.3.4 PCI
        15.3.5 vZXԒʐM
        15.3.6 荞ݏ
        15.3.7 foCXhCo
        15.3.8 t@CVXe
        15.3.9 lbg[N
        15.3.10 W[

  16. Linux f[^\
     16.1 arp_table()
     16.2 blk_dev_struct
     16.3 buffer_head
     16.4 device
     16.5 device_struct
     16.6 dma_chan()
     16.7 ext2_inode()
     16.8 ext2_inode_info()
     16.9 fib_info()
     16.10 fib_node()
     16.11 fib_zone()
     16.12 file
     16.13 files_struct
     16.14 file_system_type()
     16.15 free_area()
     16.16 fs_struct
     16.17 gendisk
     16.18 hh_cache()
     16.19 ide_drive_t()
     16.20 ide_hwif_t()
     16.21 inode
     16.22 ipc_perm
     16.23 ipfrag()
     16.24 ipq()
     16.25 irqaction
     16.26 irq_action
     16.27 kdev_t()
     16.28 linux_binfmt
     16.29 mem_map_t
     16.30 mm_struct
     16.31 module()
     16.32 msg()
     16.33 msqid_ds()
     16.34 packet_type()
     16.35 pci_bus
     16.36 pci_dev
     16.37 pipe_inode_info()
     16.38 proto_ops()
     16.39 request
     16.40 rtable
     16.41 Scsi_Cmnd()
     16.42 Scsi_Device()
     16.43 Scsi_Device_Template
     16.44 Scsi_Disk()
     16.45 Scsi_Host()
     16.46 Scsi_Host_Template()
     16.47 sem()
     16.48 semaphore
     16.49 semid_ds()
     16.50 sem_queue()
     16.51 sem_undo()
     16.52 shmid_ds()
     16.53 sigaction()
     16.54 signal_struct()
     16.55 sk_buff
     16.56 sk_buff_head()
     16.57 sock
     16.58 sockaddr()
     16.59 socket
     16.60 super_block()
     16.61 swap_control()
     16.62 swap_info_struct()
     16.63 task_struct
     16.64 timer_list
     16.65 timer_struct()
     16.66 tq_struct
     16.67 vfsmount()
     16.68 vm_area_struct
     16.69 vm_operations_struct()
     16.70 wait_queue()

  17. LvȃEFu FTP TCg
  18. LDP 錾(LDP Manifesto)
     18.1 Tv
     18.2 ݂̃vWFNgƂ̎Q@
     18.3 LDP EFuTCg
     18.4 쐬̕@
     18.5 CZX̕Kv
     18.6 CZX̒^
     18.7 LDP ̏o

  19. The GNU General Public License
  20. pW
  21. 쌠Ɣzz
  22. Bibliography
  23. {ɂ
     23.1 Ql
     23.2 ӎ

  ______________________________________________________________________

  1.  ͂߂

  Linux ́AC^[lbg̎YłBЂƂ̊w̎̃vWFNg
  oAt[ɓł鑼̂ǂȃIy[eBOVXe
  |s[Ȃ̂ɐBÂЂƂɂƂ Linux ͓ł
  Bt[Ȃ̂ɉlȂǂƂƂ蓾̂H ꈬ̋
  \tgEFAƂɎxzꂽEɂāAunbJ[vA
  ̂őłł̂H E̗lXȍ̑lȐlԂւ
  čꂽ\tgEFAɁA萫ƌ҂ł邾낤HA
  ͈ƌ̂̂łAɎs̐iƋĂB̑wL
  Ȍ@ւɂāALinux ͓Ƃ̌vZ̗v𖞂߂Ɏgp
  ĂBXl PC ő点Ă邵A炭啔̉
  łAȂ炸ӎĂ킯ł͂ȂȂAgp
  邾낤B Linux ̎gpړÍAEFủ{AEFuTCg̃zXeB
  OÃEFuRec̍쐬Adq[̑MAăRs[^
  ̏ƂāAQ[ŗVԂƂȂǗlX낤BALinux ́AfĂ
  ł͂ȂB{̃vtFbViɂďASEɔMSȃ
  [UASɐnIy[eBOVXełB

  Linux ̃[ćAUnix ̋Nɂ܂őkB1969 NAx̌O
  [v̈ł Ken Thompson ́ANgĂȂ PDP-7 
  Ń}`[UA}`^XÑIy[eBOVXe̎n߂B
  ܂Ȃ Dennis Richie ɉAӂ́AO[v̑̃
  o[̋͂ Unix ̏o[W𐶂ݏoBRichie ́A
  ȑO MULTICS vWFNg傫ȉe󂯂Ă̂ŁA
  Unix Ƃ̎̂ MULTICS ƂÔłB̃o
  [W̓AZuR[hŋLqĂAOxڂ̃[Xł C
  ŏĂBC ́AIy[eBOVXeLq邽߂
  vO~OƂ Richie ʂɍ쐬̂łB̏
  ɂāA Unix ́Apt PDP-11/45  11/70 Ƃ
  DIGITAL(DEC) ŐYꂽ΂̃Rs[^ɈڐA邱Ƃ\
  ȂBނ玩gqׂĂ邱ƂA͗jIɂ܂ŔWB
  Unix ͌ɗ܂炸ARs[^̃CXg[ƂȂAԂ
  ȂW[ȃRs[^[J̑啔Ѓo[W𐻑悤
  ɂȂB

  Linux ́AKv̎YłBLinux ̍҂łďC҂ł Linus
  Torvalds ɂƂāA\ȗB̃\tgEFA Minix 
  BMinix Ƃ́A ()ړIōLgpĂAVv Unix
  CNȃIy[eBOVXêƂłB Linus  Minix ̋@\
  ͂Ȃ߁Ag̃\tgEFAƂŉ悤
  Bނ́AwƂĂ̓X̐ŎgꂽIy[eBOVXe
  ł Unix fɑI񂾁BāAIntel 386 x[X PC gāA
  R[hn߂Bi͂߂܂Aɐ𓾂 Linus ́A
  n߂EK͂̃lbg[NAɌ҂̃R~jeB[Ŏgp
  Ălbg[NoRŁA̐ʂ𑼂̊wɒ񋟂Bނ́A
  ̃\tgEFAāÃvWFNgɊւn߂Bނ
  񋟂V\tgEFȂ́A񋟎Ҏgʂւ̉
  łBĂ܂ȂALinux ͂ЂƂ̃Iy[eBOVXe
  ȂɓBӂׂȂ̂́ALinux  Unix ̃R[h܂łȂƂ
  ƂłBLinux ͏ołꂽ POSIX KiƂɏꂽ̂
  炾B܂ALinux ́AGNU(GNU's Not Unix ̗)̑̃\tgEFA
  ɂč\zĂA𐔑ĂBGNU \tgEFÁA
  }T`[Zbc̃{Xgɂ Free Software Fundation 쐬
  ̂łB

  啔̐lɂƂāALinux ͒PȂ铹łBǂo CD-ROM x[X
  ̃fBXgr[V͑̂ŁÂЂƂCXg[邾
  ŁAĂɗpłB Linux [ÚAŃAvP
  [VAlAvP[VsB
  [UAHOWTO ``(r1)'' MSɓǂŁAVXëꕔ𐳂ݒ
  łƂɂ͂̐сA܂ȂƂ͎sł肷B
  ̐ĺA_ɂfoCXhCoAJ[lpb`
  肵ăJ[l쐬҂łǗ҂ł Linus ɑ肷B Linus
  ́Aǂ̒NłJ[l\[Xւ̒ǉύX󂯕tĂB
  悤ȕ@́A𐶂ݏô悤Ɏv邩ȂB
  ALinus ͌iȕiǗsĂAJ[lւ̐VR[h̒ǉ
  ͔ގgsĂBƂ͂AǂȂƂALinux J[l\[Xɍv
  lX͏݂B

  Linux [Ȗ唼́AIy[eBOVXe̎dg݂ł̑ݍ
  p𒲂ׂ悤Ƃ͂ȂB͎cOȂƂBLinux 𒲂ׂ邱Ƃ́AIy
  [eBOVXe̎dg݂ɂđwԔɂ悢@ł
  BLinux ͂悭ꂽIy[eBOVXeł邾łȂA
  ׂẴ\[XR[hRɓ肵Ēׂ邱Ƃ\ɂȂĂB
  ̓\tgEFAɑ΂钘쌠ێĂ邪AFree Software Foundation
   ``GNU General Public License'' ̂ƂŃ\[X̎RȔzzĂ
  邩łBA߂ă\[X𒭂߂Ƃɂ͍邩
  Bkernel, mm, net Ȃǂ̃fBNĝ͂킩邪Aɉ
  ܂̂Aǂ̃R[hǂʂĂ̂ȂB
  KvȂ̂́ALinux Ŝ̍\ƖړIՂāA邱ƂłB
  Aꂪ{̖ړIłBȂ킿ALinux ƂIy[eBOVX
  e̎dg݂ɂĂ͂Ƃ𑣐i邱ƂłBt@C
  ꏊʂ̏ꏊɃRs[Adq[ǂ񂾂肷ƂɁA
  NĂ̂v`悤ȐSۂ񋟂邱ƂłBIy[
  eBOVXe̎ۂ̓ɂď߂ėłƂɊ
  킽͍NɊoĂB킽{̓ǎ҂ɓ`̂́Â
  ̋łB

  킽 Linux Ɋւn߂̂́A1994 N̏I荠A Alpha AXP
  x[X̃VXeւ Linux ̈ڐAƂĂ Jim Paradis K˂
  B̍A킽 1984 Nȗ Digital Equipment Co.Limited 
  lbg[NƃR~jP[VɊւdĂāA1992 Nɂ́A
  Vݗꂽdq̕œn߂ĂB̖̕ړÍAp
  `bvsɊSɎQāA Alpha AXP V[Ỹ}CNvZb
  T𒆐SɁAAlpha AXP VXe{[h𑼎Ђɂ̔ƂƂł
  BLinux ̘b߂ĕƂA킽͂ɖʔƂł
  ƎvBJim ̔MS`āA킽ڐA̎`͂߂B
  ̍Ƃ邤ɁA킽͂̃Iy[eBOVXełȂA
  oGWjÃR~jeB[[h悤ɂȂ
  ĂB

  AAlpha AXP ́ALinux 鑽̃n[hEFAvbgtH[
  ЂƂłȂB啔 Linux J[ĺAIntel vZbTx[X
  VXeœĂ邪AIntel ȊO Linux VXe̐񂾂Ƒ
  ĂāA₷ȂĂĂB̒ɂ́AAlpha AXP,
  ARM, MIPS, Sparc,  PowerPC ȂǂB̂ЂƂIł
  ̕Ƃł̂A킽̃obNOEhƋZpIo
  ́AAlpha AXP  Linux ̂̂łA菭x͒Ⴂ ARM 
  ̂̂łB{ŁAdvȓ_ɂĉƂ Intel ȊÕn[
  hEFAɋ̂́Â߂łBALinux J[l̃\[X
  ̖ 95% ͂ǂ̂悤ȃn[hEFAvbgtH[ɂĂ͂܂̂
  ȂĂBlɁA{̖ 95 % A}VɈˑȂ Linux
  J[l̉ƂȂĂB

  1.1.  z肷ǎ

  ́̕Aǎ҂̒moOƂĂȂB̎ɋ
  AKvȂ͎̂wԂ悤ɂȂƐMĂ邩łBAR
  s[^Ał PC ɂĒmĂƁA{ۂɓ̂
  邾낤AC ̒mƖ𗧂낤B

  1.2.  {̍\

  {ł́ALinux ̍ƃ}jAƂĎgp邱ƂӐ}Ă
  BނAIy[eBOVXeʂ̓发łÂȂœ
  Linux グĂBe͂́A킽̃[łuʂʂցv
  Ƃɏ]č\ĂB܂AۂɃJ[l̓œ
  R[h̏ڍׂɂĂȂn߂̂ł͂ȂA܂̏͂ň
  J[lTuVXe̊TvmF邱Ƃn߂ĂB

  J[l̃ASYɂĂ̏q͈Ӑ}IɏȂĂB routine_X()
   routine_Y() ĂяoAꂪ foo f[^\ bar tB[h
  CNgƂ@͏qׂĂȂBƂ́AR[
  hǂ߂΂킩邩炾BR[ḧꕔ𗝉ANɐ
  肷KvƂA킽͂悭zCg{[hɃf[^\`
  n߂BāA킽́A֌ŴJ[l̃f[^\Ƃ
  ̑݊֌WɂĂ͂ȂڍׂɏqׂĂB

  e͂͊SɓƗĂB́Ae͂ŏqׂ Linux ̃J[lTuV
  XeƗĂ̂ƓłBAƂɂ͊֘A鎖
  BƂ΁Az̎dg݂𗝉ȂƁAvZXłȂ
  ƂƂłB

  ``un[hEFÅ{v''̏͂́A PC ɊւȒPȓƂȂ
  BIy[eBOVXéAn[hEFAƖڂɊ֘Aē삵
  An[hEFA̓Iy[eBOVXe̊bƂēBIy[
  eBOVXéAn[hEFAł񋟂łȂT[rXKvƂ
  BLinux Iy[eBOVXeSɗɂ́ÅbƂȂ
  Ăn[hEFÅ{𗝉KvB

  ``u\tgEFÅ{v''̏͂ł́A\tgEFÅ{IȌ
  AAZu C TςBLinux ̃Iy[eBOVXe
  \z邽߂Ɏgpc[ɂďqׁAIy[eBOVXe
  ̖ړIƋ@\ɂĊTB

  ``uǗv''̏͂ł́AVXe̕Ɖz Linux
  ǂĂ̂ɂďqׂB

  ``uvZXv''̏͂ł́AvZXƂ͂ȂɂA Linux ̓VXeŃv
  ZXǂ̂悤ɐAǗA폜̂B

  vZX́A݂ɋē߁ÃvZXJ[lƒʐMĂ
  B Linux ́A̃vZXԒʐM(IPC)̃JjYT|[g
  BVOiƃpCv͂̂̂ӂALinux  System V IPC 
  T|[gĂB̖̂́A߂Ă̎dg݂oꂵ̂ Unix ̓
  Y[X̎łBvZXԒʐM̃JjY
  ́A``uvZXԒʐM̎dg݁v''̏͂ŐB

  PCI(Peripheral Component Interconnect) KíAPC ̒ቿiE\
  f[^oXƂčł̗͂mĂB``u PCI v''̏͂
  ́ALinux AVXeŁAPCI oXƂ̃foCXĎgp
  @B

  ``u荞݂Ɗ荞ݏv''̏͂ł́ALinux ̊荞ݏ̕@ɂ
  ĐBJ[l͊荞ݏɂĂ̔ėpJjYƃC^[
  tFCXĂ邪A荞ݏ̏ڍׂ̒ɂ́An[hEFAA[
  LeN`Ɉˑ̂B

  Linux ̒̂ЂƂ́A PC ̑̃n[hEFAfoCXT
  |[gĂ邱ƂB``ufoCXhCov''̏͂ł́AVXe̕
  foCX Linux ǂ̂悤ɊǗĂ̂B

  ``ut@CVXev''̏͂ł́ALinux ŃT|[gĂt@C
  VXeJ[lǂ̂悤ɈێǗĂ̂ĂBz
  t@CVXe(Virtual File System)ɂďqׁA Linux J[l
  (real)t@CVXeǂ̂悤ɃT|[gĂ̂Ă
  B

  lbg[N Linux Ƃ́Aقړ`łB{̈ӖŁALinux ̓C
  ^[lbgEFu(WWW)̎YȂ̂łBJ҂ƃ[ÚAEFu
  gďACfAR[hĂ邵ALinux ̂A΂Αg
  D̃lbg[Nւ̗v𖞂߂ɎgpĂB``ulbg[
  Nv''̏͂ł́ALinux ATCP/IP Ƒ̂Ălbg[NvgR
  ǂ̂悤ɃT|[gĂ邩ɂĉB

  ``uJ[lJjYv''̏͂ł́AJ[l̈ꕔ̕Ƌ
  悭@\邽߂ɁALinux J[l񋟂Ȃ΂ȂȂʓI
  ^XNƃJjYɂĉB

  ``uW[v''̏͂ł́AJ[lAƂ΃t@CVXẽT|
  [gȂǂ̋@\AKvȂƂɓIɃ[hdg݂ɂĐB

  ``uvZbTv''̏͂ł́ALinux ڐAĂ邢̃vZbT
  ɂĂ̊TvB

  ``uLinux J[l\[Xv''̏͂ł́ÃJ[l֐TƂ\[
  X̂ǂTn߂ׂɂĐB

  1.3.  ̕ł̕\LK

  ̕ł́Â悤ȕ\LK̗pĂB

   serif font   R}hA[UǂɃ^CvׂeLXg̏ꍇ

   type font    f[^\т̃f[^\̒̃tB[hꍇ

  (: 󕶂ł́AǂtHgŎĂ܂B)

  ̂̕ƂɁALinux J[l̃\[Xc[̃R[ḧꕔ
  ւ̎QƂtĂB(Ƃ΁A͂̂΂ɂAlpň͂
  LqȂǁB) (: ł HTML ňȊO PS łȂǂɕtĂ
  B󕶂ł́A[ ] ň͂āAɋLq܂B) ́Aǎ҂
  Ƀ\[X̂̂ꍇlĕt̂łAׂĂ̎Qƃt@
  ĆA/usr/src/linux ̑ΈʒuɂBƂ΁A/foo/bar.c 
  ɂƂƁAt@C̃tl[ /usr/src/linux/foo/bar.c ł
  BLinux gĂȂ(łė~̂)AR[h邱
  ͉l̂ołA{R[hւ̗ƃf[^\ւ̎Ƃ
  ėp邱ƂłB

  1.4.  Wɂ

  (: ȉ́Â܂܂łB)

  ARM ́AARM Holdings PLC ̓o^WłB

  Caldera, OpenLinux,  C ̃ŚACaldera, Inc ̓o^WłB

  Caldera OpenDOS 1997 Caldera, Inc.

  DEC ́ADigital Equipment Corporation ̓o^WłB

  DIGITAL ́ADigital Equipment Corporation ̓o^WłB

  Linux ́ALinus Torvalds ̓o^WłB

  Motif ́AThe Open System Fundation, Inc ̓o^WłB

  MSDOS ́AMicrosoft Corporation ̓o^WłB

  Red Hat, glint  Red Hat ŚARed Hat Software, Inc ̓o^W
  łB

  UNIX ́AX/Open ̓o^WłB

  XFree86 ́AXFree86 Project, Inc ̓o^WłB

  X Window System ́AX Consortium  Massachusetts Institute of
  Technology ̓o^WłB

  1.5.  ҂ɂ

  킽́AXv[gjNłグ鐔TԑO 1957 NɁACMXk
  ɐ܂ꂽBUnix Ə߂ďốAwゾBu`ŃJ[l
  XPW[Ȏ̃Iy[eBOVXe̋@\ɂĂ̊T
  OƂɁAutނƂĎg炾B킽ƂÑv
  WFNgƂ PDP-11 ꂽ̂A̐Vĩ}VgĂ
  Ƃ̂Ƃ͂ƂĂۂɎcĂBƌ(1982 NARs[^TC
  GXwȂ First Class Honours ̊wʂ𓾂)APrime Computer
  (Primos) ɏAEA̐N DEC (VMS, Ultrix) œn߂BDEC 
  ́A낢ȂƂɏ]AŌ 5 NԂ́A̕ Alpha 
  Strong ARM ̕]ψœB 1998 Nɂ́AARM ɈڐЂA
  ́A჌xt@[EFAIy[eBOVXeڐA
  肷GWjÃO[v𑩂˂ĂB킽̎q(Esther 
  Stephen)́A킽Rs[^(geek)ƌĂԁB

  Eƒ Linux ɂĐq˂邱Ƃ΂΂邪AȂƂ
  킽͊ŷ܂AĂȂƂ܂œĂ܂Bd
  łlIɂ Linux gΎgقǁA킽 Linux ̔MSȈD
  ɂȂĂ䂭Bǎ҂͋CtĂ邩ȂA킽́AMƂł͂
  ADƂƂtgBLinux DƂƂ́AɂIy[eBOV
  Xe邱Ƃ𗝉Ă邪AgƂD܂ȂMIȐl
  Ԃ̂ƂƂ킽͍lĂBWindows 95 gĂȂ Gill ́A
  ƂBuIy[eBOVXeɂȂĒm
  ȂBv GWjAł킽ɂƂāALinux ͎̗vɊ
  ɓĂ̂łB́A킽EłłgpA
  _ŉp͈͂̍Lɏo̗ǂłBt[ŎɓقƂ
  ǂ̃\tgEFÁA Linux ŊȒPɃrhłA΂΂炩߃r
  hꂽst@C_E[h邱ƂłA CD-ROM 
  CXg[邱ƂłB C++  Perl ł̃vOwԂ
  ɁA邢 Java ɂĒm̂ɁALinux ȊOɂRɎg
  Ƃ̂낤B

  1.6.  ӎ

  {ɂẴRg[őĂꂽ̐e؂ȂЂƂɊ
  ƎvB̃Rg͐Vo[WoтɊ܂߂悤
  ɂĂBRg炤Ƃ́A킽ɂ͖{ɊƂȂ̂ŁA
  킽̐V[AhXڂɗ߂ĂقB

  ̍utA킽Ɏ𑗂ARs[^ɂċ邽߂ɂ
  ̖{̈ꕔgĂ悢ǂq˂ĂBɂ͓RB
  ͂킽ɈӐ}Ă{̗p@炾B̃NXɖ
  Linus Torvalds ĂȂƒNfł邾낤B

  ̖{Ŝɏڍׂɔ]Ăꂽ John Rigby  Michael Bauer 
  ͓ɊӂĂBςȎdƎvBAlan Cox  Stephen
  Tweedie ͂킽̎ɐhĂꂽBǂ肪ƂBe͂
  邭邽߂ Larry Ewing ̃yMBŌɁA
  { Linux Documentation Project ɉ邱ƂɓӂAEFuTCg
  ڂĂꂽ Greg Hankins ɊӂB

  (-- (r1)HOWTO Ƃ́A̖̒ʂA@(how to)qׂ
  łBLinux ɑĂAɖɗB--)

  2.  n[hEFÅ{

  Iy[eBOVXéÅbłn[hEFAVXeƖڂ
  Ȃ瓮삵Ȃ΂ȂȂBāAIy[eBOVXe
  n[hEFAł񋟂łȂ̃T[rXKvƂĂBIy[
  eBOVXeSɗɂ́ÅbƂȂn[hEFÅ{
  𗝉Ȃ΂ȂȂB̏͂ł́An[hEFAAȂ킿
   PC ɂĊȒPɏЉB

  1975 N 1 AuPopular Electricsv̕\ Altair 8080 ̃CX
  gڂƂAvn܂BAltair 8080 ́ÃX^[gbN
  Gs\[h̖ړInɂȂŖtĂ̂AƒdqḦD
  Ƃ킸 397 hőgݗĂƂ̂BIntel 8080 v
  ZbT 256 oCg̃AXN[L[{[hȂƂ̃}
  V́Å炷ΐnł͂B̔ Ed Roberts
  ́A̔iĂԂ߂Ɂup[\iRs[^(PC)vƂt
  oBł͂ PC Ƃt́Aڂ̑OɂقƂǂ
  Rs[^ɑ΂ēÔ悤ɎgĂĂB̒`
  炷ƁAɃpt Alpha AXP ̃VXêł PC 
  ƂɂȂB

  MSȃnbJ[́AAltair ̐ݔ\͂𗝉Â߂̃\tgEF
  AAn[hEFAn߂B̃pCIjAɂƂ
  āA͎ȐےłB̎RƂ́AG[gEҊKɂ
  ĉғĂAȃob`vZX̃Ct[VXe
  ̎RłBɂĕxƂȂuڂvw
  ̂AہAȂ킿̃Lb`e[uɒuƂł
  Rs[^ƂYɖĂ̂ƂB̃n[hEFAo
  A͏ĂA\tgEFAnbJ[͂
  }Ṽ\tgŏĂBtIȂ̂́A PC ̋łȒ
  ^̂́AIBM łƂBނ 1981 N IBM PC 
  āA1982 N͂߂ɂ͌ڋqɏoׂn߂BIntel 8088 vZbTA64k 
  (256k ܂Ŋg\)Aӂ̃tbs[fBXNA25 s 80 
  J[OtBbNA_v^ (CGA)ƂXybŃÅ炷
  ăptƂ͌ȂAs͍DłB1983 Nɂ IBM
  PC-XT oꂵAɂґɂ 10M oCg̃n[hhCutĂ
  B܂ȂACompaq Ȃǂ̑̉Ђɂ IBM PC N[
  ͂߁APC A[LeN`͎̕WƂȂB̎̕W
  oƂŁAsŖ̉ЂA҂ɂƂĂ͍K^
  ƂɁAi͒Ⴍ}ꂽB PC ̃VXe̍\̑
  ̓A PC ɂ󂯌pĂBƂ΁Ał͂ Intel
  Pentium Pro x[X̃}VłAN Intel 8086 ̃AhbVO
  [hŎsĂB Linus Torvalds  Linux ƂȂ͂̃R[h
  n߂ƂAłyĂđÓȒlĩn[hEFAƂĔނI
  񂾂̂AIntel 80386 PC łB

  +--------------------------------------------------------------------+
  |   +-------+ +-------+                                              |
  |   | power | | power |                                              |
  |   +-------+ +-------+   +-------------------+                      |
  |  +----------------+     |                   |                      |
  |  | p|[g |     |-------------------|                      |
  |  +----------------+     |                   |                      |
  | +-------+  +-------+    |-------------------|                      |
  | | COM 1 |  | COM 2 |    |      C P U        |                      |
  | +-------+  +-------+    |-------------------|                      |
  |                         |                   |                      |
  |                         |-------------------|                      |
  |                         |                   |                      |
  |                         +-------------------+                      |
  |                  _______________________   _____________________   |
  |                  |                      |  |                    |  |
  |                  +----------------------+  +--------------------+  |
  |                  _______________________   ______________________  |
  |                  |                      |  |                    |  |
  |                  +----------------------+  +--------------------+  |
  |                                 SIMM [Xbg              |
  |       +-------------------------------+                            |
  |       |                               |                            |
  |       +-------------------------------+  PCI Xbg              |
  |       +-------------------------------+                            |
  |       |                               |                            |
  |       +-------------------------------+                            |
  | +----------------------------------------------------+             |
  | |                                                    |             |
  | +----------------------------------------------------+             |
  | +----------------------------------------------------+             |
  | |                                                    |ISA Xbg |
  | +----------------------------------------------------+             |
  | +----------------------------------------------------+             |
  | |                                                    |             |
  | +----------------------------------------------------+             |
  +--------------------------------------------------------------------+

  (}\1.1) T^I PC }U[{[h

  Oς炷ƁAPC \镔iƂčłڗ̂́AVXe̖{
  łAL[{[hA}EXAj^[łB{̂̑Oʂɂ́A
  {^A\鏬ȃvAɃtbs[hCuB
  ߂̃VXeł CD-ROM Af[^ی̕KvĂȂobN
  Abvp̃e[vhCu邾낤B̃foCX̑̂́AӋ@
  łB

  CPU VXeŜRg[Ă̂A񏈗@\fo
  CX͂ꂾł͂ȂBƂ΁AIDE Rg[̂悤ȎӋ@̃R
  g[ׂ͂Ă郌x̏񏈗\͂ĂBPC ̓
  (}\(1.1)Q) }U[{[hA CPU ̓}CNvZb
  TAAISA  PCI ̎Ӌ@Rg[p̂̃Xbg
  ǂBIDE fBXNRg[̂悤ȃRg[̒ɂ́AVXe
  {[hɒڑgݍ܂Ă̂B

  2.1.  CPU

  CPU ̓}CNvZbT́ARs[^VXe̐S
  łB}CNvZbT́AvZA_ZsA疽߂
  ǂݏoĂs邱ƂŃf[^t[ǗBRs[^
  tɂ́A}CNvZbT̉Z͓Ɨ(Ȃ
  )jbgłBZu(CPU)Ƃtꂽ
  ̂łB̃}CNvZbT́A炷ׂĂ̕i
  gݍ킹ďWωHAɏȃVR`bvɃGb`O
  ĂBCPU, }CNvZbTAvZbTƂṕA{
  ׂ͂ēӖŎgpB

  }CNvZbT́AoCif[^BoCif[^Ƃ́A1
   0 琬f[^łB 1  0 Ƃ́AdqXCb`̃I
  ItɑΉĂBP 42 ƂƁA\i " 10  4  2 " 
  Ӗ邪AoCiio[(i) ł́AA̓il̕тƂ
  Aꂼꂪ 2 ̃xL\B

  ŃxLƂ́A鐔悷񐔂̂ƂłB10  1 ́A10
  łB 10  2 ́A10x10 łA10  3 ́A10x10x10 ɂȂB
  i 0001 ́A\i 1 łAi 0010 ́A\i 2 ł
  Ai 0011 ́A3 ŁAi 0100 ́A4 łB\i 42 ́A
  i 101010 ́A (2 + 8 + 32 ́A2 + 2x2x2 + 2x2x2x2x2 )
  ƂȂB

  ARs[^vO̒Ő\ꍇɂ́Ai
  ނA̊łA\Zîقgp̂ʏłB

  16 ił́Aꂼ̐ 16 ̃xLɂȂĂB10 ił 0 
   9 ܂łȂA16 ił 10  16 ܂ł A, B, C, D, E, F 
  ŕ\BƂ΁A16 i E ́A10 ił 14 ł
  A16 i 2A ́A10 ił 42 ( 16x2 + 10 ) łBC vO
  ̕\L@ł({ł͂̕\L@ɏ])A16 i@́A擪 " 0x " 
  tBāA16 i 2A ́A0x2A ƕ\LB

  }CNvZbT́AZAZAZȂǂ̎ZpZAuX  Y 
  傫HvƂ_ZłB

  vZbT̏́AONbNŊǗĂB̃NbŃAVX
  eNbNłAvZbTɈԊuŃNbNpX𑗂ÃN
  bNpXƂɃvZbT炩̏BƂ΁AvZbT
  ̓NbNpXƂɖ߂s肷BvZbT̑x́AVXe
  NbN̔UxŋLqB100MHz ̃vZbT́AbԂ
  100,000,000 ̃NbNpX󂯂Ă킯łBmɁAvZb
  TႦ΃NbNƂɎsĂ鏈̗ʂႤ̂ŁACPU ̃p[
  NbNxōl̂͌łBÂׂĂ̏ł
  ΁ANbNxقǃvZbTptȂ̂ɂȂBvZb
  Tŏ閽߂͒PłBƂ΁Au X Ƃꏊ
  eǂŃWX^ Y ɏ߁vƂ̂łBWX^
  ́A}CNvZbT̋LuŁAf[^~Ãf[^g
  ďs邽߂ɗpBs鏈ɂẮAs̏
  ~āÂǂႤꏊɑ݂ʂ̖ߏɈڂ悤v
  ZbTɖ̂B̂悤ɏ̑ΏۂƂ
  āÃ}CNvZbT́AbS␔\Ƃ߂̏
  łAƂ͂ɓꂽ̂łB

  ߂́AsɃoȂ΂ȂȂB߂͂ꎩ̂
  ̎Qƃf[^łÃf[^̓oȂ
  ΂Ȃ炸AK؂ȎɃɕۑȂ΂ȂȂB

  }CNvZbT̃WX^̃TCYAA^Cv́ASɃvZbT
  ̃^CvɈˑĂBIntel 4086 (:80486H)vZbT́AAlpha
  AXP vZbTƂ͈WX^̃ZbgĂBƂ΁AIntel
  ̂̂ 32 rbgAAlpha ́A64 rbgł邱Ƃ炷łɈ
  ȂĂBAʓIɂ́Aǂ̂悤ȃvZbTłA̔ėp
  WX^ƁAȂ̓ʂȃWX^ĂB啔̃v
  ZbTɂ́Â悤ȓ̖ړIɓWX^B

     Program Counter (PC)
        ̃WX^́AɎs閽߂̃AhXێ̂ł
        B̃JE^ (PC) ̓éA߂]邽
        ɁAIɃCNgB

     Stack Pointer (SP)
        vZbT́A(Random Access Memory, RAM)ɃANZXł
        ΂ȂȂB́A(WX^Ɣrꍇ)eʂ́ACPU
        Oɂǂݏ\ȋLułAꎞ(temporary)f[^
        ۑeՂɂ̂łBX^bŃAOɈꎞIɒl
        ۑo肷邽߂̊ȒPȕ@łBʏAvZb
        T́AʂȖ߂gāAX^bNɒlς(push)AƂł
        o(pop)BX^bŃAo(Last In First
        Out, LIFO) ̌œBƁAx  y ̂ӂ̒l
        X^bNɐςłЂƂ̒loƁAl y o
        B

        vZbTł́AX^bN̓̏ɌĐςݏグ
        ÃvZbTł́Ả邢͍ŏɌĐςݏ
        B邢́A ARM ̂悤ɗT|[gĂvZb
        TB

     Processor Status (PS)
        ߂sƌʂBƂ΁AuWX^ X ̓e
        ́AWX^ Y ̓e傫rvƂ߂ɂ́A召
        Ƃ^ǓʂB PS WX^́Aʂێ
        ƂƂɁAvZbŤ݂̏ԂɂĂ̏ێB
        Ƃ΁A啔̃vZbT́AJ[l[h(邢́AX[po
        CU[[h)ƃ[U[hƂȂƂӂ̃[h
        ĂB PS WX^́Ã݂[hʂێB

  2.2.  

  ׂẴVXeɂ́ALKw(memory hierarchy)BĂ̊Kw
  ̈ʒuɂāÃXs[hTCYقȂBő̃̓Lb
  V(cache memory)ƌĂ΂A̖O̒ʂ胁C̓e
  Iɕێ邢̓LbV邽߂ɎgpB͔̎̃
  ɍȂ̂ŁA啔̃vZbTł̓`bvɏʂgݍ
  ꂸA}U[{[hɂ菭LbVu邾łB
  vZbTɂẮA߂ƃf[^̗ЂƂ̃LbVɕێ
  ̂邪A߂ƃf[^ʁX̃LbVɕۑ̂
  BAlpha AXP vZbT͂ӂ̓LbVAЂƂ̓f[^
  p(D-Cache)AЂƂ͖ߗp(I-Cache)ƂĎgpBāAO
  LbV(B-Cache)́A҂𓯎ɕێBŌɃC
  B͊OLbVɔׂƔɑxxBCPU ̃LbV
  ƔrƁAC̓Cقǂ̑xłȂB

  LbVƃCƂ݂͑ĂȂ΂ȂȂ(ѐ,
  coherent)BƁAĈ郏[h(word)ЂƂȏ
  ̃LbVɕێĂꍇA(VXe)LbVƃ̓e
  mɈvȂ΂ȂȂBLbV̈ѐۂ̂́AɃn
  [hEFA̎dłAIy[eBOVXeIɂɊ֗^
  B̂Ƃ͑̏dvȃVXe^XNɂĂ͂܂Bn[hEFA
  \tgEFAٖɋ邱ƂŖړIBȂ΂ȂȂ^XN
  B

  2.3.  oX

  VXe{[ȟʂ̕íAoXƑ̂鑽lȐڑ@Ō݂
  тĂBVXeoX́A_Iȋ@\玟 3 ɕނ
  BAhXoXAf[^oXAăRg[oXłBAhX
  oX́Af[^]̂߂Ƀ̈ʒu(AhX)w肷̂ł
  Af[^oX̓f[^ێē]邷邽߂̂̂łBf[^o
  X͑oŁACPU ɓǂݍ܂f[^ƁACPU 珑܂f[^
  ̓]󂯎BRg[oX͑̐M܂łāANbN
  pX␧VOiȂǂ(oX)VXeŜɔz邽߂Ɏgp
  BȊOɂlXȌ`Ԃ̃oX݂BƂ ISA  PCI o
  X́AVXeɎӋ@ڑۂ̈ʓIȕ@łB

  2.4.  Rg[ƎӋ@

  Ӌ@́AOtBbNJ[hfBXNƂ(real)foCXł
  ÁAVXe{[h̃`bv{[hɍJ[h̃R
  g[ɂĐ䂳BIDE fBXŃAIDE Rg[`bvŐ
  䂳ASCSI fBXN SCSI fBXÑRg[`bvŐ䂳
  B̃Rg[ CPU ɐڑĂāAlȃoXɂ葊
  ɂڑĂB啔̃VXeł́APCI  ISA o
  XɂăCVXe̕iɑݐڑĂBRg[
  ́ACPU ̂ƓvZbT[łACPU 񏈗uƍl
  ƂłBCPU ̓VXeŜ𓝊Ă_łƖق
  B

  Rg[̎dl݂͑ɈقȂĂ邪Aʏ̓WX^A
  ăRg[̐䂪ȂBCPU Ŏs\tgEFÁA
  Rg[̐䃌WX^ǂݏłȂ΂ȂȂB
  WX^̓G[Xe[^XێĂ邩ꂸÃW
  X^́ARg[̃[hύX̂߂̐ړIŎgpĂ邩
  ȂBoXɂX̃Rg[́ACPU ŌʂɃAhXǗ
  Ă̂ŁAɂāA\tgEFAłfoCXhCóARg
  [̃WX^ɏ݂āA𐧌䂷邱ƂłBIDE |
  [g(IDE ribbon)̓T^łAgp邱ƂŁAoX̃foC
  Xɑ΂ʂ̃ANZX\ɂȂB̓T^́APCI oXłA
  ɂĂʂ̃foCX(Ƃ΁AOtBbNJ[h)ɓƗăAN
  ZX\ƂȂĂB

  2.5.  AhX

  VXeoX́ACPU Cɐڑ̂łACPU VXe
  ̎Ӌ@ɐڑoXƂ͋ʂĂBӋ@킪߂郁
  ́A I/O (I/O space)Ƒ̂BI/O Ԃ͂ꎩ̂ɍׂ
  ̂A_ł͂܂CɂȂƂƂBCPU ̓VXe
   I/O ԃ̗ɃANZX\Ȃ̂ARg[
  ̓VXeɊԐړIɃANZXł邾łA̍ۂɂ CPU 
  ؂Ȃ΂ȂȂBtbs[fBXNRg[̂悤ȃfo
  CX̑炱ƁAfoCX̓foCX̃Rg[WX^
  ߂AhXԂ邱Ƃ͂ł (ISA ̏ꍇ)AVXe
  邱Ƃ͂łȂB CPU ́AVXeɃANZXꍇ I/O 
  ԂɃANZXꍇƂł͕ʁX̖߂Ă̂ʓIłB
  ΁AuI/O Ԃ̃AhX 0x3f0  1 oCgǂݏoāAWX^ X
  ɓvƂ߂ƂB CPU VXe̎Ӌ@
  䂷@̂̂łAI/O ԂɂӋ@Rg[̃WX
  ^̓ǂݏ܂ɂɂB PC A[LeN`̂悤ɔW
  ĂAI/O Ԃ̂ǂɁA悭pӋ@( IDE  VA|[
  gtbs[̃Rg[)̃WX^邩́AN̊Kɂ
  ܂ĂBL I/O Ԃ̃AhX 0x3f0 ́AVA|[
  g(COM1)̃Rg[WX^̂ЂƂAhXƂȂĂB

  ɂ́ARg[AVXeɑ΂Ēڑʂ̃f[^ǂݏ
  KvꍇBƂ΁A[Uf[^n[hfBXN
  ܂悤ȎłB̏ꍇADMA(Direct Memory Aceesss)Rg
  [pAӋ@킪ڃVXeɃANZXł悤
  ȂĂBDMA ɂVXeւ̃ANZX́ACPU ̌ǗE
  ē̂ƂōsB

  2.6.  ^C}[

  Ԃm邱Ƃׂ͂ẴIy[eBOVXeɂƂĕKvȂƂȂ
  ŁA PC ɂ̓A^CNbN(Real Time Clock, RTC) ƌĂ΂
  ʂ̎Ӌ@킪gݍ܂ĂBꂪ񋟂̂́A̓̐m
  ԂƐȃ^C~OC^[o(timing interval)̂ӂłBRTC
  ɂ͓obe[̂ŁAPC ɓdĂȂłs
  邱ƂłB䂦 PC ͂mȓtƎԂƂmĂ킯
  łBC^[o^C}[ɂāAIy[eBOVXe͏dv
  𐳊mɃXPW[O邱Ƃ\ƂȂB

  3.  \tgEFÅ{

  vOƂ́Ã^XNsRs[^߂̃ZbgłB
  vÓAᐅRs[^łAZułLqłAC 
  悤ȃ}VɈˑȂ̃vOłLqłBIy[
  eBOVXéAʂȃvOłA[UɂXvbhV[
  g⃏[hvZbTƂAvP[V̎s\ɂ̂ł
  B̏͂ł́A{IȃvO~ǑЉAIy[eBO
  VXe̖ړI@\̊TςqׂB

  3.1.  Rs[^

  3.1.1.  AZu

  CPU oĎs閽߂́AlԂĂSӖsł
  B̖߂̓}VłARs[^ɉsׂ𐳊m
  ɓ`BBႦ΁A16 i 0x89E5 ́AIntel 80486 ̏ꍇAESP WX
  ^̓e EBP WX^ɃRs[Ƃ߂ɊYBt̃R
  s[^̂߂ɍŏɔꂽ\tgEFÂЂƂɃAZu
  B́AlԂǂňӖ̂킩\[X}VɕϊvO
  łBAZu͒ڃWX^𑀍삵Aɂf[^
  邱Ƃł邪A̕@̓}CNvZbTɌŗL̂̂Ƃ
  BIntel X86 vZbT̃AZúAAlpha AXP }CNvZb
  T̃AZuƂ͂ȂقȂĂB Alpha AXP AZuR
  [h́AvOs鏈̈ĂB

       ldr r16, (r15)    ; Line 1
       ldr r17, 4(r15)   ; Line 2
       beq r16,r17,100   ; Line 3
       str r17, (r15)    ; Line 4
       100:              ; Line 5

  ꕶ(Line1)́AWX^ 16 ɑ΂āAWX^ 15 ɕێꂽAh
  Xɂ()e[hB̖߂́AWX^ 17 ɑ΂āA
  ̃AhX (WX^ 15 + 4)̃e[hBLine 3 ́A
  WX^ 16 ƃWX^ 17 ̓erAȂ Label 100 ɕ
  B̃WX^ełȂꍇAvO 4 sڂɈڍsA
  WX^ 17 ̓eɕۑBȅꍇ́Af[^ۑ
  Kv͂ȂBAZux̃vÓA璷łAgbL[
  ȏKvŁAG[₷B Linux J[l̓AZu
  ŏꂽ͂قƂǂȂA̕グړÎ߂
  ɏꂽ̂łÃ͓vZbTɌŗL̂̂ƂȂĂ
  B

  3.1.2.  C ƃRpC

  AZuŃvOƂ́AŎԂ̂dłB
  G[𐶂₷AovÕ͓vZbTt@~[ɑ
  ̂ňڐAȂB}VɈˑȂ C ̂悤Ȍg
  Ƃ悢B C g΁AC ŗp\Ș_ASYƃf[^\
  găvOƂłBRpCƌĂ΂ʂȃvO
  ́AC vOǂݍŁAAZuɕϊAɂă}
  V𐶐B悭oRpĆADGȃAZuvO}
  ̂ƂقƂǓ炢IȃAZu߂𐶐邱Ƃł
  BLinux J[l̑啔́AC ŏĂB C vO
  ̈ꕔB

       if (x != y)
               x = y ;

  ́Aقǂ̃AZuR[h̗Ƃ܂̂ł
  Bϐ x ̓eϐ y ̓eƓłȂꍇAy ̓e x ɃRs
  [B C R[h́Ã^XN郋[`ƂĂ܂Ƃ߂邱
  ƂłB[` C ŃT|[gĂ邷ׂĂ̒lf[^^
  ƂłBLinux J[l̂悤ȋȃvÓA̓Ɨ
   C \[XW[\ĂāAꂼꂪƎ̃[`ƃf
  [^\ĂB C ̃\[XR[hW[́At@C
  VXeR[h̃O[v̂悤ɁA_Iȋ@\ʂɃO[v
  B

  C ł́AX̕ϐ^T|[gĂ邪AϐƂ́AV{ŎQ
  \ȃ̈ʒûƂłBL C ̃vOł́Ax  y
  ́ÄʒuQƂĂBvO}́Aɕϐu
  ʒumKv͂ȂAɔzKv̂̓J(linker)(
  LQ)łBϐɂ́A܂܂Ȏނ̃f[^AA_
  i[邽߂̂̂ƃ|C^ (pointer)ƂB

  |C^́AAhXeƂϐłBȂ킿Ãf[^̃
  ł̈ʒu\Bx ƂϐƂāAꂪ̃AhX
  0x80010000 ɑ݂ƂB̏ꍇAx |C^AƂ px
  邱ƂłB px ́AAhX 0x80010030 ɂƂB
  ƂƁA px ̒ĺAϐ x ̃AhXł 0x80010000 eƂ
  B

  C g΁A֘Âϐf[^\̂ƂĂ܂Ƃ߂邱ƂłB
  Ƃ΁Â悤ȃf[^\̂ƂB

       struct {
               int i ;
               char b ;
       } my_struct ;

  L my_struct Ƃf[^\́Aӂ̗vf܂łBi Ƃ
   (32 rbg̃f[^L̈)ƁAb Ƃ(8 rbg̃f[^)
  vfłB

  3.1.3.  J

  JƂ́A̃IuWFNgW[⃉CuNA
  ЂƂ̐̂vO쐬邽߂̃vOłB
  IuWFNgW[Ƃ́AAZuRpCo͂}VR[
  hłAɂ́As\ȃ}VR[hƃf[^܂܂ƓɁA
  JW[ĂЂƂ̃vO邽߂̏܂܂
  ĂBƂ΁A郂W[ɂ́AvÕf[^x[X֐
  ׂ̂Ă܂܂Ă邩ꂸAق̃W[ɂ̓R}hC
  邽߂̊֐܂܂Ă邩ȂBJ͂
  W[Ԃł̎QƊ֌ŴŁAɂāA郂W[ŎQ
  ƂĂ郋[`f[^\Aʂ̃W[Ŏۂɑ݂ł
  ɂȂBLinux J[lƂP̋ȃvÓA̍\vf
  łIuWFNgW[𑊌݂ɃN邱ƂɂčĂ
  B

  3.2.  Iy[eBOVXeƂ͉H

  \tgEFAȂ΁ARs[^͒PɔModqǐł܂
  ɂȂBn[hEFARs[^̐SƂƁA\tgEFA
  ̍łBIy[eBOVXéAVXevȌŴ
  Aꂪ[UɂAvP[VvO̎s\ɂĂ
  BIy[eBOVXéAVXe̎(real)n[hEFA𒊏
  āAVXẽ[UAvP[Vɉz}V񋟂BIy
  [eBOVXéA{̈Ӗł́uVXev񋟂Ă̂ł
  B啔 PC ł́ÃIy[eBOVXȇs\ł
  A͂ꂼɈOςƑ쐫ĂBLinux ́A@\I
  ɂ͕ʌ̕̕琬藧ĂāA炪ЂƂɂȂăIy[
  eBOVXe\ĂBLinux ̓Iȕ̂ЂƂAJ[l
  łBAꂳCuVFȂΖɗȂB

  Iy[eBOVXeǂ̂邽߂ɁAɒPȃR
  }hłƂɉN̂lĂ݂悤B

       $ ls
       Mail            c               images          perl
       docs            tcl
       $

  $ ́AOCVF(ł́Abash)o͂vvgłBv
  vgƂ́A[ŨR}h͂VF҂ĂƂƂӖ
  Bls ƑłނƁAL[{[hhCóAł܂ꂽƂF
  ÃR}hVFɓnBVF́A邽߂ɁA
  O̎sC[W邩ǂTBVF /bin/ls ɂ̃C[
  W邱Ƃ𔭌ƁAJ[lT[rXĂяoBĂяoꂽJ[
  lT[rX ls ̎sC[WzɒuāA̎sn
  Bsꂽ ls ̃C[ẂAJ[l̃t@CTuVXeĂяo
  āAǂ̂悤ȃt@ĈTo悤Bt@CVXe
  ́ALbVĂt@CVXȅ𗘗p邩AfBXN
  foCXhCogăfBXN炻̏ǂݏoB邢
  ́A(Network File System(NFS)oRŃt@CVXe[g}Eg
  Ăꍇ)lbg[NhCogpă[g}VƏ
  A[JVXeANZXĂ郊[gt@C̏ڍׂɂď
  To邩ȂB̏񂪂ɂꍇłAls ͂
  o͂ArfIhCoXN[ɕ\B

  L̐͂╡GɎv邩ȂBA̔ɒPȃR}
  h̎sł炩Ȃ悤ɁAIy[eBOVXeƂ́AہA
  ēÅ֐̃ZbgłA炪̂ƂȂ邱ƂŁA[U
  ɐ̂VXe̊Tς񋟂Ă̂łB

  3.2.1.  Ǘ

  ̃\[XɂȂAIy[eBOVXeʂ
  ̑́A]vȂ̂ƂȂ邩ȂBǂȃIy[eBOV
  Xeɂ{IȃgbN̂ЂƂɁAȂۈȏ
  \͂B̈ꌩȃ́AzƌĂ΂B̃A
  CfÁAVXeŎsĂ\tgEFAxāAʂ̃
  悤Ɏv܂Ƃ̂łBȂ킿AVXe̓
  y[WƂ₷PʂɕāAVXesɁAy[W
  n[hfBXNɃXbv(swap) B\tgEFAɋCt
  ̂́AЂƂ̃gbNł}`vZX@\̂łB

  3.2.2.  vZX

  vZXƂ́As̃vOłƍl邱ƂłBX̃v
  ZX͌ʂ̎̂łAꂼꂪ̃vOsĂ
  BLinux VXẽvZXꍇAȂ葽̃vZX݂
  邱ƂɋCt낤BƂ΁Aps ƃ^CvƁAM҂̃VXe
  ͎̃vZX\B

       $ ps
         PID TTY STAT  TIME COMMAND
         158 pRe 1     0:00 -bash
         174 pRe 1     0:00 sh /usr/X11R6/bin/startx
         175 pRe 1     0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc --
         178 pRe 1 N   0:00 bowman
         182 pRe 1 N   0:01 rxvt -geometry 120x35 -fg white -bg black
         184 pRe 1 <   0:00 xclock -bg grey -geometry -1500-1500 -padding 0
         185 pRe 1 <   0:00 xload -bg grey -geometry -0-0 -label xload
         187 pp6 1     9:26 /bin/bash
         202 pRe 1 N   0:00 rxvt -geometry 120x35 -fg white -bg black
         203 ppc 2     0:00 /bin/bash
        1796 pRe 1 N   0:00 rxvt -geometry 120x35 -fg white -bg black
        1797 v06 1     0:00 /bin/bash
        3056 pp6 3 <   0:02 emacs intro/introduction.tex
        3270 pp6 3     0:00 ps
       $

  M҂̃VXeɕ CPU ΁Aꂼ̃vZXA(ȂƂ
  _Iɂ)Ⴄ CPU Ŏs邱Ƃ\łBcOȂЂ
  Ȃ߁AIy[eBOVXe͂łgbNgāAZ
  ԂŃvZXԂɎsB̎ԊԊu̓^CXC
  X(time-slice)ƌĂ΂ÃgbŃA}`vZbV
  O(multi-processing)̓XPW[O(scheduling)ƌĂ΂B
  Ȃ킿́AX̃vZXxāAB̃vZXłƎv
  ܂悤ɂ̂łBX̃vZX͑̃vZXی삳
  Ԃɂ̂ŁAЂƂ̃vZXNbV肨ȓ
  ÃvZXɉe^邱Ƃ͂ȂBIy[eBOVXe͂
  ̂Ƃ邽߂ɁAX̃vZXɎANZXłʂ
  AhXԂt^ĂB

  3.2.3.  foCXhCo

  foCXhCóALinux J[l̏dvȕ`ĂBIy[
  eBOVXȇ̕ƓlɁAfoCXhCo͔ɓIȊ
  Ŏs邽߁A炪肭Ȃꍇ͍ԂɂȂ邱Ƃ
  BfoCXhCóAfoCX𐧌䂷ƓɁAIy[eBOV
  Xeƃn[hEFAԂł̑ݍp䂷BƂ΁At@CVXe
  ́AIDE fBXNɃubNPʂ݂̏sƂAėp̃ubNf
  oCXC^[tFCX𗘗pBhCo͂ IDE fBXN̏ڍׂ
  CzÃfBXNŗL̏K؂Ɏs悤ɂBfoCX
  hCóAΏۂłRg[`bvɌŗL̂̂ł邽߁A
  Ƃ΁AVXe NCR810 SCSI Rg[gpĂꍇANCR810
  SCSI hCo[KvɂȂB

  3.2.4.  t@CVXe

  Linux ł́AUnix ƓlɁAVXeŌʂ̃t@CVXegp
  ꍇÃANZXiƂāA(hCuԍhCuȂǂ)foC
  Xʎq͗pȂB̂At@CVXéAP̊KwIȃc
  [\ɑgݍ܂AɂĒP̎̂Ƃĕ\BLinux
  ́AVX̃t@CVXe̒P̃t@CVXeɕt
  ہAƂ /mnt/cdrom Ƃ}EgfBNgɃ}Eg
  Ƃ@BLinux ̍łdvȓ̂ЂƂ́ÄقȂt@C
  VXẽT|[głBɂāALinux ́Aɏ_ŁA
  Iy[eBOVXeƂ肭ł̂ɂȂĂBLinux 
  łʓIȃt@CVXéA EXT2 t@CVXełÃt@
  CVXéAقƂǂ Linux fBXgr[VŃT|[g
  ĂB

  t@CVXéAVXẽn[hfBXNɕۑĂt@C
  fBNgɊւ镪ՂW][Uɗ^B̍ہAt@C
  VXẽ^CvAbƂȂ镨foCX̐̈Ⴂ͎̏ۂ
  BLinux ͑̈قȂt@CVXe(Ƃ MS-DOS  EXT2)
  ߓIɃT|[gA}Egꂽt@Ct@CVXeЂƂɓ
  ꂽzt@CVXeƂĒ񋟂BāAʓIɁA[
  UvZX́Ãt@Cǂ̂悤Ȏނ̃t@CVXeɑ
  Ă̂mKvȂɁAgpłB

  ubNfoCXhCóAIȃubNfoCX̃^Cv(Ƃ
  ΁AIDE  SCSI)̈ႢBƂoB䂦At@CVXe
  ւAfoCX́Af[^ubN̐`IȏWɂȂBu
  bNTCÝAfoCXɂĈقȂAƂ΁Atbs[fBXN
  512 oCgʓIłAIDE n[hfBXNł 1024 oCgʓI
  BAɂĂAVXẽ[U͉BĂBEXT2
  t@CVXéÃt@CVXeuꂽfoCXǂ̂悤
  ̂łĂAOςB

  3.3.  J[l̃f[^\

  Iy[eBOVXéAVXě݂̏Ԃɂđ̏
  KvBVXeŉNAɊւf[^\
  ݂͌̏Ԃ𔽉f悤ɏȂ΂ȂȂBƂ΁A
  [UVXeɃOIƁAVvZXBJ[l
  ́AVvZX\f[^\̂쐬āAȊÕVXe
  ̑SvZX\Ăf[^\̂ɂNȂ΂Ȃ
  ȂB

  ̂悤ȃf[^\̂̑啔́Aɑ݂AJ[lƂ
  TuVXe炵ANZXłȂ悤ɂȂĂBf[^\̂
  ́Af[^ƃ|C^AȂ킿̃f[^\̃AhX⃋[`̃Ah
  X܂܂ĂB炷ׂĂxɌ悤ƂꍇALinux J[l
  ɂėpĂf[^\̂́Aɕ킵ɂ
  ̂Ɏv邩ȂBAׂẴf[^\̂ɂ͖ړIA
  ̃J[lTuVXe痘p(G)\̂邪AʓI
  ́A͍ŏɈꌩ̈ۂƃVvłB

  Linux J[ĺ̗Ãf[^\ƁALinux J[l̎X̊֐
  gp@Ƃ𗝉ł邩ǂɂĂB{́A
  Linux J[l̐ɍۂÃf[^\̉ɏd_uBX̃J
  [l̃TuVXeƂ́ÃASYA@Ɠ
  ɁA炪gpĂJ[l̃f[^\Ƃϓ_dB

  3.3.1.  AXg

  Linux ́Ã\tgEFAHw̃eNjbNgāAf[^\
  ݂ɃNĂB̏ꍇALinux ł͘A邢͘Af[^\
  gpĂBAX̃f[^\̂AP̃vZXlbg
  [NfoCXƂʂ̌ۂ⎖Lq邾ȂAJ[lɂ͂
  ̌ʃf[^ׂĒTo\͂KvɂȂBAXgł́A[
  g|C^Xg̍ŏ̃f[^\̂͗vf̃AhX܂
  āAꂼ̃f[^\̂Xg̗̎vfւ̃|C^܂ł
  BŌ̗vfɊ܂܂鎟̗vfւ̃|C^(Xg̏I
  ) 0  NULL ̂ǂ炩łBdAXgł́AX̗vf
  AXg̗̎vfւ̃|C^ƂЂƂO̗vfւ̃|C^̗
  ܂łBdAXgg΁AXg̐^񒆂ŗvf̒ǉ폜
  邱ƂeՂɂȂ邪AAւ̃ANZXpx͑B
  ́AANZX CPU TCN̂ǂD悷邩ƂAIy[
  eBOVXeɓT^Iȓґ̖łB

  3.3.2.  nbVe[u

  AXǵAf[^\̂тɂ͎yȕ@AAXg
  Ĥ͔ȏꍇB̗vfȂAXgŜȒP
  ɒ߂āȀŕKvȗvf悤ɂׂ낤BLinux ́A
  nbVO(hashing) Ƃʂ̃eNjbNgāAAXǧE
  ĂBnbVe[u(hash table)́A|C^̔z(array)
  ̓xNg(vector) łBz̓xNgƂ́APɃ
  AA̗vf̂ƂłBƂ΁A{ÍA{̔z(array)ł
  ƌBz̓CfbNXŃANZX\łBCfbNXƂ
  zւ̃ItZbg(offset)łBēx{I̗ސōlƁAꂼ
  {́A{Ïʒuŕ\ƂłB5  (offset)̖{Ƃ
  łwłB

  nbVe[úAf[^\̂ɑ΂|C^̔złÃC
  fbNX́Ãf[^\̓̏񂩂璊oB鑺̐l
  \f[^\̂ƂƁȀZl̔NCfbNXƂĎg
  ƂłB̏Zl̃f[^ꍇANCfbNXƂ
  ĎgpāȂ̐lɂẴnbVe[uAY|
  C^H΁A|Cg̍\̂ɂ̏Zl̏ڍׂ܂܂ĂBcO
  ȂAɂ́AN̏Zl吨ꍇ̂ŁAnbVe[u
  ̃|C^́AN̏ZlLqf[^\̘̂AXgɑ΂
  |C^ɂȂ邾낤BAZA邱Ƃ́Af[^
  \ׂ̂ĂƍłB

  nbVe[ugƁA悭pf[^\̂ւ̃ANZX
  ł̂ŁALinux ́A΂΃nbVe[uALb
  V(cache)̎̂߂ɎgpĂBLbV͂΂₢ANZX
  Kvȍۂ̎yȏ񌹂łAʏAɓ̃tZbgɑ΂T
  uZbgƂȂĂBJ[lf[^\̂ɑ΂pɂɃANZX
  ꍇÃf[^\̂̓LbVɓĕۑBLbV
  ̌_́APȘAXgnbVe[ugpƊǗGɂ
  邱ƂłBf[^\̂LbVŌ(́A
  LbVqbg(cache hit)ƌ)ÂȂǂʂB
  AȂꍇA֘A邷ׂẴf[^\̂A
  Yf[^\݂̂ۂɂ́ALbVɒǉȂ
  ȂȂBf[^\̂LbVɒǉƁAÂLbVGg
  jKvBLinux ͂ǂj邩肵Ȃ΂ȂȂ
  ̂ÁAjꂽf[^\̂́ALinux ɕKvƂf[^
  ̂̂łꍇ邱ƂłB

  3.3.3.  ۃC^[tFCX

  Linux ͂΂΂̃C^[tFCX𒊏ۉBC^[tFCX
  ́A̕@ő삳郋[`ƃf[^\̂̏WłBƂ
  ΁AׂẴlbg[NfoCXhCóÃ[`񋟂Ȃ
  ΂ȂȂBāÃhCõ[`AfoCXŗL̃f[^\
  ̂B̕@gƁAėpR[h琬郌C[݂̑
  \ɂȂBȂ킿AėpC[̃R[h́AwC[ɂfoCX
  ŗL̃R[h񋟂T[rX(邢́AC^[tFCX)gp
  łBlbg[NC[͔ėpR[h琬A̔ėpR[hA
  WC^[tFCXɏAfoCXŗL̃R[hɂăT|[g
  ĂB

  ΂΂wC[́ANɏwC[Ɣɓo^B
  ̓o^̍ۂɂ́AʏAf[^\̂AXgɒǉ鏈Ȃ
  BƂ΁At@CVXeJ[lɑgݍ܂ĂꍇA
  ̌X̃t@CVXe͋NɃJ[lɓo^B邢́A
  W[ɂȂĂꍇ́At@CVXeŏɌĂтꂽƂ
  ɁAo^ȂB/proc/filesystems Ƃt@C΁Aǂ̃t@
  CVXeo^Ă邩BJ[lւ̓o^Ɏgpf
  [^\̂ɂ́A΂΁Å֐ւ̃|C^܂܂ĂB
  ́Ã^XNs֐̃AhXłBēxAt@CVXe
  ̓o^ɂƂƁAX̃t@CVXeo^̍ۂɃJ[lɓnf
  [^\̂ɂ́Ãt@CVXeɌŗL̃[`̃AhX܂܂
  ĂBāÃ[`̃AhXgpēY[`Ăяo
  ƂŁAYt@CVXe}Egdg݂ɂȂĂB

  4.  Ǘ

  ǗTuVXéAIy[eBOVXe̍łdvȕ̂
  ƂłBRs[^tȗAVXeɂ镨
  ͑Ȃ󋵂ƑĂB̌E邽߂ɗlXȐ헪
  ĂꂽÂōł̂Az(virtual
  memory)łBzƂ́AVXeɎۈȏ̃邩̂
  Ɍdg݂łAD֌WɂvZXԂŁAKvɉ
  Ďgp邱ƂɂĂB

  źARs[^̃傫邱ƈȊOɂlXȋ@\
  񋟂ĂBǗTuVXe񋟂@\ɂ́Â悤Ȃ
  ̂B

     ȃAhX
        Iy[eBOVXéAVXeɎۈȏ̃邩
        ̂悤ɐU镑Bz̓VXe̕A{
        eʂɂłB

     f[^ی
        VXẽvZX́AeXƎ̉zAhXԂĂ
        B̉zAhXԂ́A݂ɊSɓƗĂ̂ŁA
        AvP[VsĂvZX́ÃvZXɉe
        ^ȂBɁAGA̓n[hEFẢz@
        \ɂāA݂ی삳ĂBɂāAR[hf
        [^AöAvP[Vɂ㏑ی삵ĂB

     }bsO
        }bsO(memory mapping)́AC[Wf[^t@Cv
        ZX̃AhXԂɃ}bv(map)邽߂ɎgpB
        }bsOɂāAt@C̓éAvZX̉zAhX
        ɒڃNB

     ȕ̊蓖
        ǗTuVXeɂāAVXeŎsĂX
        vZX́AVXe̕ɌȎ邱Ƃ
        łB

     Lz
        z̓vZXʂ(z)AhXԂ悤ɂĂ
        邪ÃvZXŃL(share)Ȃ΂ȂȂꍇ
        BƂ΁Abash ̃R}hVFsĂvZX
        VXeɕ݂邱ƂB̏ꍇAɕ
         bash ̃Rs[݂āAX̃vZXʂ̉zAhX
        ԂAЂƂ̃Rs[݂Abash s邷
        ẴvZXł̉zAhXԂLق悢B
        ICu(dynamic library)́ÃvZXԂŎsR[h
        LЂƂ̓T^łB

        L(shared memory)́AvZXԒʐM(Inter Process
        Communication, IPC)̃JjYłgpB́Aӂ
        ̃vZXA炷ׂĂɋʂ̃oRāA
        dg݂łBLinux ́AUnix System V ̋L IPC T
        |[gĂB

  4.1.  z̒ۃf

                                                               vZX Y
                                               vZX Y      +--------+
  vZX X                                  y[We[u +-| VPFN 7 |
  +--------+                                    ________     | |--------|
  | VPFN 7 |-+   vZX X                   +-|_______|<-+ | | VPFN 6 |
  |--------| |  y[We[u                | |_______|  | | |--------|
  | VPFN 6 | |   ________                   +-+-|_______|<-+-+ | VPFN 5 |
  |--------| +->|_______|-+      +-------+  | | |_______|  |   |--------|
  | VPFN 5 |    |_______| |   +->| PFN 4 |<-+-+ |_______|  |   | VPFN 4 |
  |--------| +->|_______|-+-+ |  |       |  |   |_______|  |   |--------|
  | VPFN 4 | |  |_______| | | |  |-------+  |              |   | VPFN 3 |
  |--------| |  |_______| | | |  | PFN 3 |  |              |   |--------|
  | VPFN 3 |-+->|_______|-+-+-+  |       |  |              |   | VPFN 2 |
  |--------| |            | |    |-------|  |              |   |--------|
  | VPFN 2 | |            | |    | PFN 2 |<-+              +---| VPFN 1 |
  |--------| |            | |    |       |                     |--------|
  | VPFN 1 | |            | |    |-------|                     | VPFN 0 |
  |--------| |            | +--->| PFN 1 |                     +--------+
  | VPFN 0 |-+            |      |       |
  +--------+              |      |-------|
                          +----->| PFN 0 |
                                 |       |
                                 +-------+
  z                                         z

  }\(3.1) zAhX畨AhXւ̃}bsOɊւ钊ۃf

  Linux zT|[g@lOɁAȏڍׂȂ
  ۃf邱Ƃ͗LvłB

  vZbTvOsƂAvZbT̓疽߂ǂ
  oāAfR[h(decode)B߂fR[hہAvZbT́A
  n_̃̓eǂݏo(fetch)A񂾂(store)邱Ƃ
  KvɂȂꍇBāAvZbT̖͂߂sAvO
  ̖̎߂ɈڂB̂悤ɁAvZbT͂ɃANZXȂ
  A߂ǂݏoA邢́Af[^ǂݏ肵ĂB

  zVXeł́AɎgpAhXׂ͂ĉzAhX
  łAAhXł͂ȂB̉zAhX̓vZbTɂ
  AhXɕϊ̂A̕ΐAIy[eBOVXe
  Ǘϊe[uɕێꂽɂčsB

  ̕ϊeՂɂ邽߁Azƕ́Ay[W(page)ƌĂ
  鈵ՂPʂɕĂB̃y[Wׂ͂ēTCYł
  By[W̃TCY͕KłKv͂Ȃ̂ATCYł
  ꍇAVXeɂǗɍȂ̂ɂȂ邽߂ɂĂ
  BAlpha AXP VXe Linux ł́A8 k oCg̃y[Wgp
  AIntel x86 VXeł́A4 k oCg̃y[WgpĂBy[W
  ꂼɂ́AƏdȂl̃y[Wt[ԍ(Page Frame
  Number, PFN)UĂB

  ̂悤Ƀy[WꂽVXȅꍇAzAhX́AItZb
  g(offset) Ɖzy[Wt[ԍ(PFN)̂ӂ̕\B
  y[WTCY 4 k oCgȂ΁AzAhX bit 11  0 ɃIt
  Zbg܂܂ĂāA bit 12 ȍ~zy[Wt[ԍƂȂĂ
  BvZbT͉zAhXɏoтɁAItZbgԍƉzy[W
  t[ԍ𒊏oBvZbT́Azy[Wt[ԍ𕨗y[
  Wt[ԍɕϊȀŁAY镨y[W̐ItZbg
  ԍ̈ʒuɃANZXB̕ϊ̂߂ɁAvZbT̓y[We[u
  (page table)gpB

  ``}\(3.1)''́AvZX X ƃvZX Y Ƃӂ̃vZX̉z
  AhXԂ̂ŁAǂvZXg̃y[We[u
  B̃y[We[úAvZX̉zy[W̕y[
  WɃ}bv̂łB̐}\ł́AvZX X ̉zy[Wt[
  ԍ 0 y[Wt[ԍ 1 Ƀ}bvAvZX Y ̉zy
  [Wt[ԍ 1 y[Wt[ԍ 4 Ƀ}bvĂB_
  Iɂ́Ay[We[ûꂼ̃Gg[ɂ́Ȁ񂪊܂܂
  B

     LtO(valid flag)
        y[We[ũGgLǂB

     y[Wt[ԍ(physical page frame number)
        ̃GgLqĂ镨y[Wt[ԍB

     ANZX(access control information)
        ̃y[Wp@LqĂB݉\AsR
        [h܂ނƂƂɊ֌WB

  y[We[uɃANZXꍇAzy[Wt[ԍ(y[We[
  uւ)ItZbgƂĎgpBzy[Wt[ԍ 5 ́Ay
  [We[u 6 Ԗڂ̗vfɊYB(0 ŏ̗vfɊY邽߂
  B)

  zAhX𕨗AhXɕϊꍇAvZbT͂܂zAhX
  y[Wt[ԍƂ̉zy[W̃ItZbglTȂ΂Ȃ
  By[WTCY 2  n Ƃ邱ƂŁA}XN(masking)ƃVtg
  (shifting)ɂ肻͊ȒPɎsłBx``}\(3.1)''
  ĂقBy[WTCY 0x2000 oCg(\iȂ 8192)ŁAvZX Y
  ̉zAhXԂł̃AhX 0x2194 ƂƁAvZbT̃A
  hXϊʂ́AItZbgl 0x194 zy[Wԍ 1 Ƃ
  B

  vZbT́Azy[Wt[ԍvZX̃y[We[uւ̃C
  fbNXƂĎgp邱ƂŁÃy[We[uGgmB
  ̃ItZbgʒuɂy[We[uGgL(valid)Ȃ΁Av
  ZbT͂̃Gg畨y[Wt[ԍ擾BGg
  ȂAvZX͕ɑ݂Ȃz̈ɃANZX
  ƂɂȂB̏ꍇAvZbT̓AhXłȂ̂ŁAIy[
  eBOVXeɐnƂŁẢ˗B

  ݂̃vZXLȕϊ̂ȂzAhXɃANZX悤Ƃ
  ƂvZbTIy[eBOVXeɓ`@́AvZbT̎
  ނɂĈقȂBvZbT̓`B@ǂ̂悤Ȃ̂łA
  ̌ۂ̓y[WtHg(page fault)ƌĂ΂ĂāAIy[eBOVX
  eɂ́AtHgƂȂzAhXƃtHgƂʒm
  B

  y[We[ũGgLłꍇAvZbT́Ay[Wt
  [ԍ擾AɃy[WTCY|ZāÃy[
  W̃x[XAhX(base address)擾BŌɁAvZbT́A(
  ̃x[XAhXN_)擾ׂ߂f[^܂ł̃ItZbgA
  ̃x[XAhXɉ (ƂŁASȕAhX𓾂)B

  L̗ĂюグƁAvZX Y ̉zy[Wt[ԍ 1 ́A
  y[Wt[ԍ 4 Ƀ}bvB̕y[Wt[́AA
  hX 0x8000(4 x 0x2000)N_(x[XAhX)ƂĂB̃Ah
  X 0x194 oCg̃ItZbglƁAŌ 0x8194 ƂA
  hXB

  zAhX畨AhXւ̃}bsOɂ@gp邱
  ŁAzVXe̕ւ̃}bsOA̔ԍƖ
  Wɉ\ƂȂBƂ΁A``}\(3.1)''ɂāAvZX X ̉zy[
  Wt[ԍ 0 ́Ay[Wt[ԍ 1 Ƀ}bv邪Azy
  [Wt[ԍ 7 ́Azy[Wt[ 0 傫Ȕԍłɂ
  炸Ay[Wt[ 0 Ƀ}bvB̂Ƃ́Az@
  \[YƂӖBȂ킿Az̃y[W
  ́Aœ̏ԒʂɕłKvȂƂƂł
  B

  4.1.1.  f}hy[WO

  zɔׂĕ͔ɗʂȂ̂ŁAIy[eBOV
  Xe͕IɎg悤CzȂ΂ȂȂB
  ߖ񂷂ЂƂ̕@́As̃vOݎgpĂ鉼zy
  [W[h邱ƂłBƂ΁Af[^x[XvOf[
  ^x[Xɖ₢킹sƂB̏ꍇAf[^x[XŜ
  Ƀ[hKv͂ȂAׂKv̂f[^R[h[h
  ΂悢Bf[^x[Xւ̖₢킹łꍇAVKR[h
  ǉ̏f[^x[XvÕR[h[hĂӖ
  BANZXꂽzy[WɃ[hƂ̃eNjb
  ŃAf}hy[WO(demand paging) ƌĂ΂B

  vZXɂȂzAhXɃANZX悤ƂꍇAv
  ZbT́AQƂꂽzy[W̃y[We[uGg邱
  łȂBƂ΁A``}\(3.1)'' ł́AvZX X ̃y[We[u
  ɂ́Azt[ԍ 2 ̃GgȂ̂ŁAvZX X zy[W
  t[ԍ 2 ̒ɂAhXǂƂĂAvZbT́A
  AhX𕨗̃AhXɕϊłȂB̎_ŁAvZbT
  ́Ay[WtHgƂIy[eBOVXeɒʒmB

  tHgƂȂzAhXȂ̂łꍇA̓vZX
  ݂ȂzAhXɃANZX悤ƂƂӖB炭AA
  vP[VɕsNāAƂ΃̃_ȃAhX
  ֏݂悤Ƃ̂ȂB̏ꍇAIy[eBOVX
  e͂̃vZXIāA\̃vZXVXȇ
  ̃vZXی삷B

  AtHgƂȂzAhXLȂ̂łAQƂꂽy[
  W͂̂ƂɂȂłꍇAIy[eBOVXe
  ́AfBXÑC[WK؂ȃy[WɎĂȂ΂
  ȂBfBXNANZX́AΓIɎԂ̊|鏈Ȃ̂ŁAvZX
  ́Ay[W܂ł̊ԑ҂ĂKvB̍ۂɎs\ȃvZ
  X΁AIy[eBOVXe͂̂IŎsB
  āAĂy[W󂢂y[Wt[ɏŁAzy[
  Wt[ԍp̃Gg[vZX̃y[We[uɒǉB
  ɂāAvZX̓tHg߂ꏊĂю
  sBx́Azւ̃ANZXɐAvZbTzAh
  X畨AhXւ̕ϊł̂ŁAvZX̎s͌pB

  Linux ́Af}hy[WOgpāAsC[WvZX̉z
  Ƀ[hBR}hsۂ͂ÃR}h܂
  t@CI[vAt@C̓evZX̉zɃ}bv
  B̏́ÃvZX̃}bvLqĂf[^\
  C邱ƂɂŝŁA}bsO(memory mapping)ƌ
  ΂BAۂɕɒû̓C[W̍ŏ̕
  łAc̓fBXNɕۑꂽ܂܂ƂȂBāAC[W
  sƃy[WtHgNALinux ́AvZX̃}bv
  pāAC[Ŵǂ̕ɎĂΎsł̂
  fB

  4.1.2.  XbsO

  vZXzy[W𕨗ɎĂȂ΂ȂȂ̂A
  p\ȕ̋󂫂ȂꍇAIy[eBOVXéAʂ
  y[W𕨗菜Ƃł̃y[Ŵ߂̋ԂmۂȂ
  ΂ȂȂB

  菜ׂy[WC[Wf[^t@C̃Rs[ł
  A㏑Ă͂ȂꍇÃy[W͕ۑKv͂ȂBj
  āAvZXēx̃y[WKvƂƂɁAYC[W
  f[^t@C烁ɖ߂΂ł悢B

  Ay[WύXĂꍇɂ́AIy[eBOVXéA
  ̃y[WێāAł̃y[WɃANZXł悤ɂȂ΂Ȃ
  ȂB̎̃y[ẂA_[eBy[W(dirty page)ƌĂ΂A
  폜ƂɃXbvt@CƌĂ΂ʂȃt@CɕۑB
  Xbvt@Cւ̃ANZXɂ́AvZbTƃƂ̊Ԃ̃Xs[h
  ׂĔɒԂ|̂ŁAIy[eBOVXéAy[W
  fBXNɏޕKvꍇłAĎgpɔďo邾
  ɕێKvB

  jXbvy[W߂邽߂ɎgpASY(Xbv
  ASY)̌ꍇAXbVO(thrashing)ƌĂ΂Ԃ
  ׂB̏ꍇAy[W͊ԒfȂfBXNɏ܂ꂽǂݏoꂽ
  ̂ŁAIy[eBOVXe͂ɎԂĖ{̎do
  ȂȂBƂ΁Ay[Wt[ԍ 1 (``}\(3.1)'') 
  IɃANZXȂÃy[W̓n[hfBXNɃXbv
  ׂł͂ȂBvZXݎgpĂy[WZbǵA[LOZb
  g(working set)ƌĂ΂B̗ǂXbvXL[Ƃ́AׂẴv
  ZX̃[LOZbg𕨗Ɏ悤zXL[
  B

  Linux ́Ałgppx̏Ȃ(ŒԖgp(Least Recently Used,
  LRU)) y[W̎k߂(GCWO(aging))ƂeNjbNg
  āAVXe폜ׂy[WɑIĂB̃XL[
  ́AVXêׂẴy[W(age)ĂāAꂪy[WA
  NZXƁAύXdg݂ɂȂĂBy[Wւ̃ANZX
  ΁Ãy[W̎͒ȂBANZXȂΎk݁AKv
  Bsy[ẂAXbsO̗L͂ȌƂȂB
  4.1.3.  Lz

  z@\́ÃvZXł̃̋L₷B
  ւ̃ANZXׂ͂ăy[We[uoRōsAvZX͂ꂼ
  ̓Ɨy[We[uĂBӂ̃vZX
  y[WLɂ́A̕y[W̃t[ԍA҂̃y[W
  e[ũGgɑ݂KvB

  }\ 3.1 ł́Aӂ̃vZXy[Wt[ԍ 4 LĂ
  lqĂBvZX X ɂƂāA͉zy[Wt[
   4 łAvZX Y ɂƂāA͉zy[Wԍ 6 łB
  ̓y[WL̋[_ĂBLꂽy[ẂA
  LvZXɂƂĉz̓ʒuɑ݂ȂĂ悢Ƃ
  ƂłB

  4.1.4.  AhX[hƉzAhX[h

  Iy[eBOVXêzŎsƂ̂͂قƂ
  ǃiZXłBIy[eBOVXẽy[We[u
  Ȃ΂ȂȂƂÂ悤ȏ󋵂ɂȂ邾낤B啔̔
  pvZbT́AzAhX[hƓɕAhX[hƂTO
  T|[gĂBAhX[hł́Ay[We[u͕svł
  AvZbT͂̃[ĥƂ̓AhXϊ悤ƂȂBLinux
  J[ĺA̕AhX[hŎs悤ɃNĂB

  Alpha AXP vZbT́AɕAhX[hƂ͎̂ĂȂB
  ̂AԂ̃GAɕĂāÂ̂ӂ
  𕨗IɃ}bsOꂽAhXԂƂĎgpB̃J[lA
  hXԂ́AKSEG AhXԂƌĂ΂ĂāA0xfffffx0000000000 ȏ
  ׂ̂ẴAhX܂ĂBKSEG ̈ɃNĂR[h(J
  [lR[hƒ`R[h)sÄ̗̃f[^ɃANZ
  X肷邽߂ɂ́ÃR[h̓J[l[hŎsKv
  BAlpha  Linux J[ĺAAhX 0xfffffc0000310000 s
  悤ɃNĂB

  4.1.5.  ANZX

  y[We[ũGgɂ́AANZX܂܂ĂBvZb
  T́AvZX̉zAhX𕨗AhXɃ}bv邽߂ɂy[
  We[ugp̂ŁAɊ܂܂ꂽANZX𗘗pāAv
  ZXĂȂ@ŃɃANZXĂȂǂȒP
  `FbNłB

  ̓̃GAւ̃ANZX𐧌ׂR͐BsR[
  h܂ނ悤ȃ́AʏǂݏopłBIy[eBOVXe
  ́AvZX̂悤ȎsR[ḧʒuɃf[^㏑̂
  ׂł͂ȂB΂ɁAf[^܂ރy[W͏㏑Ă悢킯ł
  Ã̓es悤Ƃ閽߂ꍇAsȂ
  ΂ȂȂB啔̃vZbTɂ́AsɊւăJ[l[hƃ[U
  [hƂȂƂӂ̃[hBJ[lR[h[U
  ɎsłȂ悤ɂ邽߂łAvZbTJ[l[hœ
  ĂƂȊÓAJ[l̃f[^\ւ̃ANZXȂ悤ɂ
  ߂łB

                                     15 13 11
  31                                   14 12 10 9 8 7 6 5 4 3 2 1 0
  +----------------------------------------------------------------+
  |                 | | | |          |  | | |   | | | |  | | | | | |
  |                 | | | |          |  |U|K|   |U|K| | G|A|F|F|F|V|
  |                 | | | |          |  |W|W|   |R|R| | H|S|O|O|O| |
  |                 | | | |          |  |E|E|   |E|E| |  |M|E|W|R| |
  |                 | | | |          |  | | |   | | | |  | | | | | |
  +----------------------------------------------------------------+
                     ^   ^
                     |   +------- _PAGE_DIRTY
                     |
                     +----------- _PAGE_ACCESSED
  63                                                               32
  +----------------------------------------------------------------+
  |                                                                |
  |                                                                |
  |                              P F N                             |
  |                                                                |
  |                                                                |
  +----------------------------------------------------------------+

  }\(3.2) Alpha AXP ̃y[We[uGg(PTE)

  ANZX́APTE ɕێĂA̓vZbTɌŗL̂
  łB}\(3.2)́AAlpha AXP  PTE \ĂB̃rbgtB[
  h́Â悤ȈӖB

  V     uL(Valid)vBꂪݒ肳ƁAPTE LƂȂB
  FOE   ustH[g(Fault On Execute)vB̃y[WŖ߂s悤Ƃ
        ۂ́AvZbTy[WtHg񍐂AIy[eBOVXe
        ɓnB
  FOW   u݃tH[g(Fault on Write)vBLƓlÃy[W֏
        Ƃꍇ̃y[WtHgłB
  FOR   uǂݍ݃tH[g(Fault On Read)vBLƓlÃy[W̓ǂݍ
        Ƃꍇ̃y[WtHgłB
  ASM   uAhXԍv(Address Space Match)vBꂪgp̂́AIy[
         eBOVXeϊe[v琔̃Gg폜ƂłB
  KRE    J[l[hŎsĂR[h́Ãy[WǂނƂłB
  URE    [U[hŎsĂR[h́Ãy[WǂނƂłB
  GH     Granularity hint(xqg). ЂƂ̃ubNŜ𕪊ɒP̕ϊ
         obt@Ƀ}bsOƂɗpB
  KWE    J[l[hŎsĂR[h͂̃y[Wɏ݉\B
  UWE    [U[hŎsĂR[h́Ãy[Wɏ݉\B
  PFN(page frame number)
         V rbgݒ肳ꂽ PTE ł́ÃtB[hɂ́AY PTE ւ̕t[
         ԍ(y[Wt[ԍ)ĂBV rbgݒ肳Ă炸A
         ̃tB[h[łȂꍇAXbvt@Cł̃y[W̏ꏊɊւ
         񂪏ĂB

  ̂ӂ̃rbǵALinux Œ`AgpĂ̂łB

  _PAGE_DIRTY
        ꂪݒ肳ꂽꍇÃy[W̓XbvɏoKvB
  _PAGE_ACCESSED
        y[WANZXꂽƂL߂ɎgpB

  4.2.  LbV

  L̗_fgăVXeꍇAmɋ@\͂ł
  Aقǌ̂悢̂ɂ͂ȂȂBIy[eBOVXeƃv
  ZbT̐݌v҂͂ǂVXe悢ptH[}Xo
  ƌɓw͂Ă邩łB葬vZbT⃁𐻑
  ƂƂʂɂƁAxグŗǂ̕@́ApɂɎgp
  f[^̃LbVێǗ邱ƂłBLinux ł́ALb
  VɊւ邢̃Ǘ@\pĂB

     obt@LbV
        obt@LbV(buffer cache)ɂ́AubNfoCXhCo
        gpf[^obt@܂܂ĂB
        [see: fs/buffer.c]
        ̃obt@͌ŒTCY(Ƃ΁A512 oCg)ŁAubNf
        oCXǂݏoꂽAɏ܂ꂽ̃ubN
        ĂBubNfoCXƂ́Af[^ANZX̍ۂɁAŒTCY
        ubNPʂł̂ݓǂݏłfoCXwBׂẴn[h
        fBXN̓ubNfoCXłB

        obt@LbV́AfoCXʎqƕKvȃubNԍƂŃC
        fbNXtĂāAf[^ubN΂₭߂
        gp̂łBubNfoCX́Aobt@LbVo
        RȂ΃ANZXłȂBf[^obt@LbVɌ
        ΁AƂ΃n[hfBXN̂悤ȕubNfoCXǂ
        oKvȂȂ̂ŁAANZXƍɂȂB

     y[WLbV

        y[WLbV(page cache)́AfBXÑC[Wf[^ւ
        ANZX邽߂ɎgpB
        [see: mm/filemap.c]
        ́Ay[WPʂŃt@C̘_IȓeLbVAt@C
        Ƃ̃t@C̃ItZbggăANZXBy[W
        fBXN烁ɓǂݏoƁA̓y[WLbV
        LbVB

     XbvLbV

        ύXꂽ(邢́Adirty )y[WAXbvt@Cɕ
        B
        [see: swap.h, mm/swap_state.c, mm/swapfile.c]
        Yy[WXbvt@Cɏ܂ĂύXĂȂ
        ́AēxXbvAEgꂽƂĂAy[WłɃXb
        vt@Cɂ킯AXbvt@CɏޕKv͂
        B̃y[W͒PɔjBVXeXbvpɂɎgp
        ꍇAɂĎԂ̊|sKvȃfBXN啝ɏȗ
        łB

     n[hEFALbV

        n[hEFALbV(hardware cache)̎ƂĈʓIȂ̂A
        vZbT̃n[hEFALbVłAy[We[uGg
        ̃LbVłB̏ꍇAvZbT͂ڃy[We[
        uǂݏôł͂ȂAϊKvłƂɂ̃y[Wϊ
        LbVĂBvZbTɂ́AAhXϊob
        t@(Translation Look-aside Buffer, TLB)Aɂ́AVXe
        ̃̕vZXɊւy[We[uGg̃Rs[
        LbVĂB

        zAhXւ̎QƂsƂAvZbT͍v TLB G
        gTƂBꂪ΁AzAhX𒼐ڕA
        hXɕϊāAf[^ɑ΂ēK؂ȏsBvZbT
        v TLB GgoȂꍇ́AIy[eBO
        VXeɏ߂BȂ킿AvZbT́AIy[eBO
        VXeɑ΂āATLB s(TLB miss)NƂVOiœ`
        BVXeŗL̃JjYgpāA̗O(exception)
        Iy[eBOVXe̗OR[hɓnBIy[eBO
        VXéÃVOi󂯂āAAhX}bsÔ߂̐V
         TLB Gg𐶐BONAƁAvZbT͍
        xzAhX̕ϊ݂B́A TLB ɕKvȃAhX
        ւLȃGĝŁAȂϊB

  n[hEFALbV₻̑̃LbVgꍇ̌_́A菇
  邽߂ɁA܂ňȏ̎ԂƃԂgĂLb
  VێȂ΂ȂȂƂƂłALbV
  ƁAVXeNbVƂƂłB

  4.3.  Linux ̃y[We[u

                           zAhX
  +-------+--------------+-------------+-----------+----------------+
  |       |              |             |           |                |
  |       |   Level 1    |  Level 2    |  Level 3  |Byte within page|
  |       |      |       |     |       |     |     |         |      |
  +-------+------+-------+-----+-------+-----+-----+---------+------+
                 |             |             |               |
                 |             |             |               |
      Level 1    |  Level 2    |  Level 3    |               |
      Page Table |  Page Table |  Page Table | Physical Page |
      +-------+  |  +-------+  |  +-------+  |  +---------+  |
      |       |  |  |       |  |  |       |  |  |         |  |
      |       |  |  |       |  |  |       |  |  |         |  |
      |---+---|  |  |---+---|  |  |---+---+  |  |---------|  |
      |PFN|   |<-+  |PFN|   |<-+  |PFN|   |<-+  |         |<-+
      |-+-+---|     |-+-+---|     |-+-+---|     |---------|
      | |     |     |  |    |     | |     |     |         |
  PGD | |     |     |  |    |     | |     |     |         |
  --->+-+-----+  +->+--+----+  +->+-+-----+  +->+---------+
        |        |     |       |    |        |
        +--------+     +-------+    +--------+

  }\(3.3) 3 ̃x̃y[We[u

  Linux ł́A3 ̃x̃y[We[ȗ݂OɂȂĂBAN
  ZXX̃y[We[uɂ́A̒iK̃y[We[uɂy
  [Wt[ԍ܂܂ĂB}\(3.3)ł́AzAhX
  ̃tB[hɕĂlqĂB}̉zAhX̌
  X̃tB[h񋟂̂́Ãy[We[uւ̃ItZbgł
  BvZbT́AzAhX𕨗AhXɕϊ邽߁A܂X
  x̃tB[h̓e擾āA̓e𓖊Yx̃y[We[u
  ܂ޕy[Wł̃ItZbgւƕϊAɂĎ̃x
  y[We[ũy[Wt[ԍǂݎB̏OxJԂ
  ƁẢzAhX܂񂾕y[W̃y[Wt[ԍB
  zAhX̍Ō̃tB[h́AoCgItZbg(byte offset)ƂȂ
  āAgpēYy[WŕKvȃf[^oB

  Linux svbgtH[񋟂Ȃ΂ȂȂ̂Aϊ}N
  łB́AJ[l̃vZX̂߂Ƀy[We[u𑖍
  邱Ƃ\ɂ̂łB邱ƂŁAJ[l̓y[We[u
  Gg̃tH[}bgA̎dg݂mKvȂȂB
  [see: include/asm/pgtable.h]
  ̕@͔ɐĂ̂ŁALinux ́Ay[We[ũR[h
  Ƃ Alpha vZbTɂ Intel x86 vZbTɂ̂gp
  BA Alpha vZbT́A3 ̃x̃y[We[u
  AIntel x86 ́A 2 ̃x̃y[We[uƂႢ
  B

  4.4.  y[W̊蓖Ăƃy[W̉

  VXe̕ɑ΂v͑傫BƂ΁AC[W
  Ƀ[hƂAIy[eBOVXéAɕy[W
  ĂBC[WsI菜ꂽÃy[W͉B
  ͑ɂAy[We[û̂悤ȃJ[lŗL̃f[^\
  ێprɎgpBy[W蓖ĂƉɎgp郁JjY
  ƃf[^\́AzTuVXěێł炭ł
  dvȂ̂łB

  VXêׂĂ̕y[W ``mem_map'' Ƃf[^\ɂ
  LqĂB́A``mem_map_t'' \(``r 1 '')̃Xgł
  A͋NɏB
  [see: include/linux/mm.h]
  X mem_map_t ́AVXe̒P̕y[WLqB(
  Ɋւ)̍\̂̏dvȃtB[hɂ́Â悤Ȃ̂
  B

  count   ́Ãy[W̃[ŨJE^[łBy[W̃vZ
          XŋLĂ鎞ÃJEg 1 葽ȂB
  age     ̃tB[h́Ay[W (age)Lq̂ŁÃy[Wj
          Xbv̌ł邩𔻒f̂ɎgB
  map_nr  ́Amem_map_t Lq镨y[W̃t[ԍłB

  ``free_area'' ƂzAy[W蓖ẴR[hɂAy[W̌
  Ɖ̂߂ɎgpBׂẴobt@ǗXL[͂̃JjY
  ɂăT|[gĂÃR[hɊւAvZbT̕y
  [WOJjYƃy[WTCYƂ̊Ԃɂ́A֘AȂB

  ``free_area'' ̌X̗vf́AubNPʂ̃y[WɊւ܂
  BȂ킿Az̍ŏ̗vf͂ЂƂ̃y[WA 2 ̃y[W
  琬ubNAɎ 4 ̃y[W琬ubNƂӂ 2
   n ŃubÑy[WB\̗̂vf ``list'' ̓L[
  擪ƂĎgpA``mem_map'' z ``page'' f[^\̂ւ̃|C
  ^ƂȂĂB (: list ́Av2.0.12 ȍ~́Anext  prev ɂ
  dAXgɂȂĂ܂B) ̃y[WubN͂̃L[ɕׂ
  B``map'' ͌X̃TCỸy[WO[v̊蓖ďԂǗĂ
  rbg}bv(bitmap)ɑ΂|C^łBbitmap  N rbgڂ́A
  y[W N Ԗڂ̃ubNłꍇɃZbgB

  ``}\(3.4)''ł́Afree_area \̂ĂBvf 0 ͂ЂƂ̋
  y[W(y[Wt[ԍ 0 )ĂAvf 2  4 ̃y[W
   2 ̋ubNĂBŏ̋ubŃAy[Wt[
  ԍ 4 n܂A̋ubN̓y[Wt[ԍ 56 n܂
  B

  4.4.1.  y[W̊蓖

  Linux ́A_ASY (``Buddy algorithm'') ``(r 2)'' gp
  邱ƂŁAy[WubNIɊ蓖Ă肵ĂB
  [see: __get_free_page(), in mm/linux/page_alloc.c]
  y[W蓖ẴR[h́AЂƂ͕̃y[W琬ubN
  蓖Ă悤ƂBy[W̊蓖ẮA傫Ƃ 2  n ̃ub
  NPʂƂȂĂBȂ킿AЂƂ̃ubN 1 ̃y[WA2 
  y[WA4 ̃y[W蓖ĂBVXeɗv(nr_free_pages
  > min_free_pages)ɉ邾̋󂫋Ԃ΁A蓖ăR[h
  ́AvꂽTCỸy[WŃubN쐬邽߂ ``free_area''
  𒲂ׂB free_area ̂ꂼ̗vf́AYTCỸubNɊ
  }bvĂāA蓖čς݂͋󂢂Ăy[WubN
  QƂł悤ɂȂĂBƂ΁Az̗vf 2 }bv
  ł́A4 ̃y[W琬邻ꂼ̃ubN̂ǂꂪ蓖čς݂ł
  AǂꂪȂ̂L^ĂB

  蓖ăASÝA܂vꂽTCỸy[WubNTB
  ́A ``free_area'' f[^\̂̃L[ɂA ``list'' vfォ
  Ãy[W̘A𒲂ׂBvꂽTCỸy[WubNł
  󂫂ȂꍇÃTCY(͗vꂽTCY 2 {ł)̃u
  bNȂB̉ߒ́Afree_area ׂ̂Ăׂ邩A
  y[WubN邩܂őBy[WubN
  ̗v傫ꍇAK؂ȃTCYɂȂ܂ŕBub
  N 2  n ̃y[W琬藧̂ŁA̕vZX͔Ɋ邾
  ̊ȒPȂ̂łBubN͓KȃL[ɕׂA蓖Ă
  y[WubNAĂяovZXɕԂB

                        free_area                 
                         +-----+                 +-----------+
                         |     |                 |           |
                         |  5  |                 |           |
                         |-----|                 |-----------|
                         |     |                 |           |8
                         |  4  |      map        |           |
                         |-----|    +------+     |-----------|
                         |     |--->+------+     | / / / /   |7
  mem_map_t  mem_map_t   |  3  |      map        |  / / / /  |
   +----+     +----+     |-----|    +------+     |-----------|
   |    |<----|    |<----|     |--->|      |     | / / / /   |6
   |    |---->|    |---->|  2  |    +------+     |  / / / /  |
   | 56 |     |  4 |     |-----|      map        |-----------|
   +----+     +----+     |     |--->+------+     | / / / /   |5
             mem_map_t   |  1  |    |      |     |  / / / /  |
              +----+     |-----|    |      |     |-----------|
              |    |<----|     |    +------+     | / / / /   |4
              |    |---->|  0  |-+    map        |  / / / /  |
              |  0 |     +-----+ |  +------+     |-----------|
              +----+             +->|      |     |           |3
                                    |      |     |           |
                                    |      |     |-----------|
                                    |      |     |           |2
                                    |      |     |           |
                                    +------+     |-----------|   *
                                                 |           |1 /|
                                                 |           |   |
                                                 |-----------|   |
                              / / / /            | / / / /   |0 PFN
                               / / / / Free PFN  |  / / / /  |
                                                 +-----------+

  }\(3.4) free_area ̃f[^\

  Ƃ΁A}\(3.4)ł́A2 ̃y[W琬ubNvꂽ
  A (y[Wt[ԍ 4 n܂Ă) 4 ̃y[W琬ŏ
  ̃ubNA2 ̃y[W琬ӂ̃ubNɕBy[W
  t[ԍ 4 n܂ŏ̃ubŃA蓖Ăꂽy[WƂ
  ĂяovZXɖ߂Ay[Wt[ԍ 6 n܂Ԗڂ̃u
  bŃA``free_area'' z̗vf 1 ɂ 2 ̃y[W琬u
  bNƂăL[ɒuB

  4.4.2.  y[W̉

  y[WubN̊t́A傫ȋy[ŴŁAfЉ
  (framgment memory)𐶂₷B
  [see: free_pages(), in mm/page_alloc.c]
  y[WR[h(page deallocation code)́A\ȂƂ͂
  Ãy[W傫ȃubNɘABہAubN܂Ƃ߂
  傫ȃubNȒPɍ邱ƂlƁA(2  n Ƃ
  )y[WubNTCYɂ͏dvȈӖB

  y[WubNƁATCY̋ߐڃubN͑
  _(buddy) ubN󂩂ǂ`FbNBȂAV
  ꂽy[WubNƌāAiK傫TCY̐VubN
  쐬Bӂ̃y[WubNĂ傫ȋ̃y[Wub
  N`邽тɁAy[WR[h́ÃubNɑ傫Ȃ
  ̂ɂ悤ƂB̂悤ɂāÃy[WubŃA̎gp
  @Ƃċ傫ȃubNɂȂĂB

  Ƃ΁A``}\(3.4)''ł́Ay[Wt[ԍ 1 ƁA
  ɉĂy[Wt[ԍ 0 ƌBāA 2 ̃y[
  W琬ubNƂ ``free_area'' ̗vf 1 ̃L[ɒu
  B

  4.5.  }bsO

  C[WsƂA̎sC[W̓éAvZX̉zAh
  XԂɒuȂ΂ȂȂB̂Ƃ́AsC[WŎgp邽
  ߂ɃNꂽLCȕꍇłłBst@C͎
  ɕɒu킯ł͂ȂAvZX̉zɃN
  łBāAs̃AvP[V炻̃vÖꕔ
  QƂƁAsC[Ŵ̃̕C[W̒ɒu
  BC[WAvZX̉zAhXԂɃN邱̎dg
  ́A}bsO (memory mapping)ƌĂ΂B

                                                +--------------+
                                                |              |
                                                |              |
                                                |              |
                                        +------>|--------------|
                                        |       |              |
                                        |       |              |
                                        |       |              |
                                        |       | Virtual Area |
  vm_area_struct                        |       |              |
  +------------+                        |       |              |
  |  vm_end    |------------------------+       |              |
  |------------|                                |              |
  |  vm_start  |------------------------------->|--------------|
  |------------|                                |              |
  |  vm_flags  |                                |              |
  |----------  |                                |              |
  |  vm_inode  |                                |              |
  |------------|            z          |              |
  |  vm_ops    |----------> 샋[`        |              |
  |------------|                                |              |
  |            |              open()            |              |
  |            |              close()           |              |
  |------------|              unmap()           |              |
  |  vm_next   |              protect()         |              |
  +------------+              advise()          |              |
                              nopage()          |              |
                              wppage()          |              |
                              swapout()         |              |
                              swapin()          |              |
                                                +--------------+

  }\3.5 z̃GA

  ׂẴvZXźA``mm_struct''f[^\̂ŕ\B
  ɂ́Aݎs̃C[W(Ƃ΁A bash)Ɋւ񂪊܂܂
  ƓɁA ``vm_area_struct'' f[^\̂ւ̃|C^܂
  B vm_area_struct f[^\̂ɂ́Ảz̈̎n_ƏI
  _Ãւ̃vZX̃ANZXAт̃ɑ΂A
  샋[`܂܂ĂB̑샋[`́ALinux ̉z
  ̗̈𑀍삷ۂɎgȂ΂ȂȂÃ[`łB
  ΁AẑЂƂɒA̓vZXz
  ɃANZX悤ƂA (y[WtHgɂ)̉z
  ۂɂ͕ɂȂƂɂȂB̑
  ́A``nopage'' łB nopage 삪p̂́ALinux ̃f}
  hy[WOɂsC[W̃y[WɃy[W蓖
  ĂƂłB

  sC[WvZXzAhXɃ}bv
  A``vm_area_struct'' f[^\gB vm_area_struct f
  [^\̂͂ꂼsC[Ẅꕔ\ĂBsR[hA
  ꂽf[^(ϐ)AȂf[^ɂAЂƂÂ̍\̂
  BLinux ͂̕WIȉzT|[gĂ
  ̂ŁAvm_area_struct f[^\̂ƁAz̓K
  ȃZbgƌтB

  4.6.  f}hy[WO

  sC[W񃁃Ƀ}bvăvZXzɓƁA
  C[W̎sJn\ƂȂBÃC[W̍ŏ̕
  ɓĂȂ̂ŁAɕɂȂz̈
  ւƃANZXBvZXALȃy[We[uGgȂ
  zAhXɃANZXƂAvZbT Linux Ƀy[WtHg
  񍐂B
  [see: handle_mm_fault, in mm/memory.c]
  y[WtHǵÃy[WtHgzAhXƁǍ
  ƂȂANZX̃^CvƂ̏܂łB

  Linux ́Ay[WtHgN̈Ă
  ``vm_area_struct'' \̂TB vm_area_struct f[^\ł̌
  y[WtHǧ肷ŔɏdvȂ̂ŁA
  ́AAVL(Adelson-Velskii and Landis)؍\ɃNĂBA
  tHgNzAhXɊւ vm_area_struct f[^\̂
  ݂ȂꍇÃvZX́AȉzAhXɃANZXƂɂ
  BLinux ́ÃvZX SIGSEGV VOi𑗂ÃvZX
  YVOiȂꍇ́ÃvZXIB

  ɁALinux ́Ảz̈̃ANZXɈᔽċNy[
  WtHg̃^Cv`FbNBvZXAƂΓǂݏo
  Ȃ̈ɏ݂悤Ƃꍇ̂悤ɁAȕ@ŃɃA
  NZXĂꍇÃvZXɂ̓G[(memory error)̃VOi
  B

  Linux y[WtHgȂ̂ƔfꍇAy[WtHgɑΏ
  Ȃ΂ȂȂB
  [see: do_no_page(), in mm/memory.c]
  Linux ́AXbvt@C̃y[WƃfBXN̑̏ꏊɂsC
  [ẄꕔƂʂȂ΂ȂȂB邽߂ɂ́AtHgN
  zAhX̃y[We[uGggpB

  tHgy[W̃y[We[uGgłȂꍇÃy[
  WtHǵA݃Xbvt@CɕۑĂy[Ŵ̂ł
  BAlpha AXP ̃y[We[uGg̏ꍇALrbg͐ݒ肳Ă
  Ȃ ``PFN'' tB[h 0 łȂlݒ肳ĂGgB
  ̏ꍇAPFN tB[hɂ́AXbv̂ǂ(Ăǂ̃Xbvt@
  C)Yy[WۑĂ̂Ɋւ񂪋LĂBX
  bvt@C̃y[W𑀍삷@́Ȁ͂̌̕ŏЉ
  B

  ``vm_area_struct'' f[^\ׂ̂̂ĂAz̃Zbg
  Ă킯ł͂ȂAnopage 삷ĂȂꍇB
  ́AftHgł Linux AANZX̖邽߂ɁAV
  y[WtÂ߂̗Lȃy[We[uGg쐬
  ɂȂĂ邩łB(vm_area_struct )̉z̈ɑ΂
   nopage 삪݂ꍇALinux ͂̃[`gpB

  ėpI Linux  nopege 샋[`́AɃ}bvꂽsC
  [Wɑ΂Ďgp̂Ȃ̂ŁA nopage 샋[`́Ay[W
  LbV𗘗pāAKvȃC[Wy[W𕨗ɎĂB
  [see: filemap_nopage(), in mm/filemap.c]

  @͂ǂAKvȃy[Wɒuꂽꍇ́AvZXy[
  We[u̓Abvf[gB̃GgAbvf[g邽
  ɂ̓n[hEFAŗL̏KvɂȂ邩ȂBɁAvZbT
  AhXobt@(Translation Look-aside Buffer, TLB)𗘗pĂ
  ꍇ͂łBł悤₭y[WtHg͏ꂽ̂ŁAtH
  g͉AvZX́AzANZXŃtHgN߂
  _ăX^[gB

  4.7.  Linux ̃y[WLbV

  page_hash_table
  +--------------+
  |              |         mem_map_t                mem_map_t
  |--------------|       +-----------+            +-----------+
  |              |------>| inode     |12      +-->| inode     |12
  |--------------|       |-----------|        |   |-----------|
  |              |       | offset    |0x8000  |   | offset    |0x2000
  |--------------|       |-----------|        |   |-----------|
  |              |       |           |        |   |           |
  |--------------|       |           |        |   |           |
  |              |       |           |        |   |           |
  |--------------|       |-----------|        |   |-----------|
  |              |       | next_hash |--------+   | next_hash |
  |              |       |-----------|            |-----------|
  |              |       | prev_hash |            | prev_hash |
  |              |       |-----------|            |-----------|
  |              |       |           |            |           |
  |              |       +-----------+            +-----------+
  |              |
  |--------------|
  |              |
  |--------------|
  |              |
  +--------------+

  }\3.6 Linux ̃y[WLbV

  Linux ̃y[WLbV̖́AfBXÑt@Cւ̃ANZXx
  グ邱ƂłBɃ}bvꂽt@C̓y[WPʂœǂݏo
  Ãy[W̓y[WLbVɕۑB}\(3.6)ł́Ay[
  WLbV ``page_hash_table'' \ĂAꂪ
  ``mem_map_t'' f[^\ւ̃|C^̔zƂȂĂ邱ƂĂ
  B
  [see: include/linux/pagemap.h]

  Linux ̃t@C͂ꂼ VFS inode f[^\Ŏʂ(ڍׂ́A
  ``ut@CVXev''̏͂ŏqׂ)BVFS inode ̓VXeテj[N
  łA̒P̃t@CɊւ銮SȎʎqƂȂBy[We[u
  ւ̃CfbNX́At@C VFS inode Ƃ̃t@Cւ̃ItZbg
  瓱oB

  Ƀ}bvꂽt@Cy[WǂݏoƂAƂ΃f}
  hy[WOŃy[Wɖ߂ƂȂǂɂ́Ay[W̓y[W
  LbVǂݏoBy[WLbVɂꍇ́A
  LbṼy[W\ ``mem_map_t'' f[^\̂ւ̃|C^A
  y[WtHgR[hɕԂBłȂꍇ́Ay[ẂÃC
  [WۑĂt@CVXe烁ւƎoKv
  B̏ꍇALinux ͕y[WtāAfBXÑt@C
  ̃y[WǂݏoB

  vȂĂALinux ̑Ńt@C̎̃y[WǂݏoĂ
  \łB̒Py[W̐ǂ݂́AvZXt@C̃y[
  WɘAăANZXĂꍇ́ÃvZX̂߂Ɏ̃y[W
  ɑҋ@邱ƂӖB

  C[WǂݏoĎsĂƁAy[WLbV͂񂾂Ƒ
  ȂBKv̂ȂȂy[WAƂ΂ǂ̃vZXANZX
  ȂȂC[ẂALbV폜B̎gpʂ
  ƁAy[WsĂ邱ƂB̏ꍇA Linux ̓y[W
  LbṼTCYB

  4.8.  XbvAEgƃy[W̔j

  ȂȂƁALinux ̃ǗTuVXéAy[W
  悤w͂Ȃ΂ȂȂB̃^XŃAJ[lXbvf
  [ (kernel swap daemon)(kswapd)̎dłBJ[lXbvf[
  ́AJ[lXbh(kernel thread)ƂʂȃvZXłBJ
  [lXbh͉zÂ蕨AhXԓɂ
  ăJ[l[hŎsB̃J[lXbvf[́A̖
  PɃy[WVXẽXbvt@CɏołȂƂ炷
  ƁA▽ɓƂB̖́AVXeŏ[ȋy[
  WmۂāAǗVXȇێ邱ƂłB

  J[lXbvf[(kswapd)́ANɃJ[lvZXɂ
  NAJ[lXbv^C}[IɎԐ؂ɂȂ̂҂
  B
  [see: kswapd(), in mm/vmscan.c]
  ^C}[Ԑ؂ɂȂƁAXbvf[̓VXe̋y[W̐
  肷ĂȂǂmFBkswapd́A``free_pages_high'' 
  free_pages_low ̂ӂ̕ϐgăy[W邩ǂ𔻒f
  BVXe̋y[W̐ free_pages_high AJ[l
  Xbvf[͉ȂB^C}[؂܂ōĂыxeB
  `FbNɍۂāAJ[lXbvf[́AXbvt@CɌݏ
  oĂy[WlɓBJ[lXbvf[́A
  Anr_async_pages ɕێĂB̐́AXbvt@Cɏ
  o邽߂Ƀy[WL[ɓꂽƂɑAXbvfoCX
  ւ݂̏ƂɌBfree_pages_high  free_page_low
  Ƃ́AVXeNɃZbgAVXe̕y[W̐Ɗ֘At
  BVXe̋y[W̐ free_page_high ȉɂȂ
  Afree_pages_low ȉɂ܂ŗł܂ꍇɂ́AJ[lX
  bvf[́A3 ̕@găVXeŎgpĂ镨y[W
  ̐炻ƂB

  o  obt@ƃy[WLbṼTCY炷B

  o  System V Ly[WXbvAEgB

  o  y[WXbvAEgāAjB

  VXe̋y[W̐ free_pages_low ȉɂȂĂꍇAJ[l
  Xbvf[́A̎s܂ł 6 ̃y[WBłȂ
  ΁A3 ̃y[WBL̕@́A[ȃy[W܂
  ԂɌJԂBJ[lXbvf[́A
  ŌɎg@oĂBs̍ۂ͂AO̍Ōɐ
  @gpăy[W悤Ƃn߂B

  [ȋy[WoAXbvf[́A^C}[؂܂ōĂ
  xeɓBJ[lXbvf[y[WRAVXe
  ̋y[W̐ free_pages_low łꍇ́A̋x
  eԂ́Aʏ̔ɒZkBy[W̐ free_pages_low ̐
  Ă܂΁AJ[lXbvf[͒ʏ̃^C}[Ԋuł̋xe
  ߂B

  4.8.1.  y[WLbVƃobt@LbṼTCY̏k

  y[WLbVƃobt@LbVɕۑĂy[ẂA
  ``free_area'' zɓׂL͂Ȍ҂łBy[WLbV
  ́AɃ}bvꂽt@C̃y[W܂܂Ă̂ŁA
  tɂĂsvȃy[W܂܂ĂꍇBlɁAobt@
  LbVɂ́AfoCXɑ΂ǂݏ̌ʂƂẴobt@
  ܂Ă̂ŁAɂKv̂Ȃobt@܂܂ĂꍇBV
  Xe̕y[Wsn߂ƁÃLbVy[W
  邱Ƃ͑ΓIɗeՂɂȂBy[WXbvAEg
  ꍇƈقȂÁAfoCXւ݂̏KvƂȂł
  BLbVsvȃy[WjƂĂAfoCX
  ⃁Ƀ}bvꂽt@Cւ̃ANZXxȂȊOɂ́Aڗ
  LQȕp͂ȂBÃLbVy[WׂĔj
  ƂASvZXe󂯂B

  J[lXbvf[́ÃLbVk悤Ƃ邽
  ɁA page ̔z ``mem_map'' ̃y[WubN𒲂ׂāA
  폜ł̂ȂǂmFB
  [see: shrink_mmap(), in mm/filemap.c]
  J[lXbvf[MSɃXbvĂꍇAȂ킿V
  Xe̋y[W̐댯ȂقǒቺĂꍇɂ́A傫ȃTCY
  ̃y[WubNBy[WubN̒͏zIȕ@łȂ
  BȂ킿A}bvk悤Ƃ邽тƂɈႤTCỸy
  [WubNB̕@́Av̕jɎĂ邱ƂN
  bNASY (clock algorithm)ƌĂ΂Apage ̔z ``mem_map''
  ŜAxɐy[WPʂŒB

  X̃y[W𒲍ۂ́Ãy[Wy[WLbVobt@
  LbVɃLbVĂ邩ǂmFBӂׂȂ̂́A
  ̎_ł͋Ly[W͔jȂƁAѓɗ̃LbV
  ɓĂy[W݂͑ȂƂłBYy[Wǂ̃Lb
  VɂĂȂꍇApage ̔z mem_map ̎̃y[W
  B

  y[Wobt@LbVɃLbV̂(邢́Aobt@
  y[WLbVɃLbV̂)Aobt@̊tƉƂ
  Iɍs߂łBkR[h͒Iy[W
  obt@A悤ƂB
  [see: try_to_free_buffer, in fs/buffer.c] 炷ׂẴobt@
  ƁA܂ރy[WBꂽy[W Linux 
  y[WLbVɓĂꍇA̓y[WLbV폜
  B

  ̍Ƃɂď[ȃy[WꂽAJ[lXbvf[
  ́A̒IĂяo܂ŋxeBꂽy[W͂ǂ̃vZX̉
  z̈ꕔɂȂĂȂ̂(̓LbVꂽy[W
  ł̂)Aǂ̃y[We[uAbvf[gKvȂB
  LbVꂽy[W[ɉȂꍇAXbvf[͋L
  y[ŴXbvAEg悤ƂB

  4.8.2.  System V Ly[W̃XbvAEg

  System V LƂ́AvZXԒʐM̃JjYłAӂȏ
  ̃vZX݂ɏ邽߂ɉzL邱Ƃ
  dg݂łB̕@łǂ̂悤ɃvZXL邩ɂ
  ́A ``uvZXԒʐM̎dg݁v''̏͂ŏڍׂɉB̂Ƃ
  ASystem V L̂ꂼ̃GÁA``shmid_ds'' f[^\
  ɂLqĂƂqׂĂBɂ́A``vm_area_struct'' f
  [^\̂̃Xgւ̃|C^܂܂ĂB̌X
  vm_area_struct f[^\̂́Az̓ŸLvZX
  ̂̂łAꂼ̃vZX̉ẑǂ System V L
  ̗̈悪̂Lq̂łBSystem V L̂߂
  vm_area_struct f[^\̂͂ꂼA``vm_next_shared'' 
  vm_prev_shared |C^gĂ݂ɃNĂBX
  shmid_ds f[^\̂ɂ́Ay[We[uGg̃Xg܂܂Ă
  āAꂼꋤLzy[W}bvĂ镨y[WLqĂB

  J[lXbvf[́ASystem V Ly[WXbvAEg
  鎞ɂNbNASYgpBꂪsۂ͂A
  ǂ̋LzGÂǂ̃y[WŌɃXbvAEgAJ[
  lXbvf[͊oĂB邽߂ɁAXbvf[
  ͂ӂ̃CfbNXgpBЂƂ́A``shmid_ds'' f[^\
  ̂̃Zbgւ̃CfbNXłAЂƂ́ASystem V L
  YGAɊւy[We[uGg̃Xgւ̃CfbNXł
  BɂāA System V Lɑ΂ČȕSۂ悤
  ɂȂĂB

  System VL̉zy[Wɑ΂镨y[Wt[ԍ́AY
  鉼zGAL邷ׂẴvZX̃y[We[uɊ܂܂
  Ă̂ŁAJ[lXbvf[͂炷ׂẴy[We[u
  āAYy[W͂͂⃁ɂ͂ȂAXbvt@Cɕۑ
  ĂƂƂȂ΂ȂȂBLy[W͂ЂƂXb
  vAEĝŁAJ[lXbvf[́AX̋LvZX̃y
  [We[ũy[We[uGgTB(́AX
  ``vm_area_struct'' f[^\̂̃|C^ǐՂ邱Ƃɂs
  B) A System V LGAɑ΂vZX̃y[WG
  g[e[uLȂ΁AXbvf[́A𖳌Xbv
  AEgꂽy[We[uGgł|ɏāA(L)y[
  W̃[UJEgЂƂBXbvAEgꂽ System V
  Ly[W̃e[uGg̃tH[}bgɂ́A``shmid_ds'' f[^\
  ̂̃Zbgւ̃CfbNX  System V LGAɑ΂
  y[We[uGgւ̃CfbNXƂ܂܂B

  LvZX̃y[We[uSɏăy[WJEg[
  ɂȂƁALy[WXbvt@CɏoƂ\ɂȂB
  System V LGAɑ΂y[We[uGĝȂ
  ŁAshmid_ds f[^\̂ɂĎwꂽXgɑ݂̂́A
  XbvAEgꂽy[We[ũGg(swapped out page table
  entry)ɂĒuBXbvAEgꂽy[We[ũG
  g͖AXbvt@CI[v邽߂̃Zbgւ̃Cfb
  NXƁÃt@CŃXbvAEgꂽy[WT߂̃ItZb
  gƂ܂܂ĂB̏񂪎gp̂́Ãy[W
  ɍēx߂ƂłB

  4.8.3.  XbvAEgꂽjꂽy[W

  Xbvf[̓VXẽvZXԂɒׂāAXbvׂL
  ͌₪ȂǂTB
  [see: swap_out(), in mm/vmscan.c]
  ҂Ƃ́AXbv\(s\ȃvZX)AXb
  vj邱Ƃ\ȂЂƂȏ̃y[WĂvZXłB
  y[WXbvAEgăVXẽXbvt@C
  ̂́Ay[W̃f[^XbvȊO̕@ł͌ɖ߂Ȃ
  łB

  sC[W̓ȇ͂̃C[W̃t@C烁ɒu
  ̂ŁA̓e̍ēǂݏo͊ȒPɎsłBƂ΁AC[
  W̎s߂́ÃC[WɂďC邱Ƃ͂Ȃ̂ŁAꂪX
  bvt@Cɏ܂邱Ƃ͌ĂȂB̃y[W͒Pɔj
  邾łBvZXēxQƂ鎞́AsC[W烁
  ɖ߂΂łB

  XbvׂvZXAXbvf[͂̃vZX
  z̈𑖍ċLꂽ胍bN(lock)ꂽ肵ĂȂG
  ATB Linux ́AIvZX̃Xbv\ȂׂẴy[W
  Xbv킯ł͂ȂBނÃy[W폜B
  ŃbNĂꍇAy[W̓XbvjłȂB
  (: ̑́AYvZX ``mm_struct'' ŃL[COꂽ
  vm_area_struct \̂̃Xgɂ mv_next |C^Ɍ邱
  ŎsB)

  Linux ̃XbvASÝAy[WGCWO(page aging)gĂ
  B
  [see: swap_out_vma(), in mm/vmscan.c]
  y[W͂ꂼ(``mem_map_t'' \̂̒) JE^ĂāA
  ɂăJ[lXbvf[Ƀy[WXbvׂǂ
  `ĂBy[WgpȂANZXɂĎԂȂꍇ
  ɁAy[W͍΂BXbvf[͍̃y[WXbvAE
  gBy[WŏɊtƂ̃ftHg̑ł́Aŏ 3
  ̎^BANZX邽тɁAN 3 ő 20 ܂ŏオ
  BJ[lXbvf[sƁÂтɃy[WA
  ̔NЂƂĂBftHg͕̑ύX\ł
  A䂦Aݒl(ƁȂ̃XbvɊ֌W
  )́A``swap_control'' f[^\̂ɕۑĂB

  y[W̎s(age=0)AXbvf[͂ɂ̏i
  BCĂy[W(dirty page)́AXbvAEg邱Ƃł
  BLinux ́A PTE ̃A[LeN`ɌŗL̃rbggĂ
  B (``}\(3.2)'' Q) Adirty page ׂăXbvt@C
  ɏoKv͂ȂBvZX̉z̈́Aꎩ
  gɕKvȃXbv삪w肳Ă邩ꂸ(
  ́A``vm_area_struct''  vm_ops |C^Ŏ)Ał̕@
  p邩łBłȂꍇAXbvf[́Ay[WX
  bvt@CɊtAXbvfoCXɏoB

  XbvAEgꂽy[W̃y[We[uGǵAƃ}[N
  GgɂĒu邪ÃGgɂ́Ay[W̃Xbv
  t@C̈ʒuɊւ񂪊܂܂ĂB̏́AXbvt@C
  ̂ǂɃy[WۑĂ邩\ItZbglƁAǂ̃Xbv
  t@Cgpꂽwq琬Bǂ̂悤ȃXbv\bh
  gpꂽꍇłAƂ̕y[W͉A ``free_area'' ̒
  ɓBe̕ύXĂȂ(邢́ACĂȂ(not
  dirty))y[ẂAjāAėp̂߂ free_area ɓB

  Xbv\ȃvZX̃y[WA[ȐXbvAEg邩j
  ꂽꍇAXbvf[͍ēxX[vBɋNƂ́AV
  Xe̎̃vZXΏۂƂčlB̕@ɂāAXbv
  f[̓VXeoX߂܂ŁAvZX̕y[W
  ĂB̕@́AvZXŜXbvAEg
  ƌłB

  4.9.  XbvLbV

  y[WXbvt@CɈڂہALinux ͕KvȂ΃y[W
  ܂ȂBy[WXbvt@Cƕ̗ɑ݂Ƃ
  B̂悤ȂƂN̂́AXbvă폜Ă
  y[WvZXɍēxANZXꂽƂŃɖ߂ꍇłB
  ɂy[W݂󂯂ĂȂAXbvt@Cɂ
  y[W̃Rs[͗LȂ܂܂łB

  Linux ͂̂悤ȃy[WĎ邽߂ɃXbvLbVgBX
  bvLbV̓y[We[uGg̃XgłAGg̓VX
  e̕y[WƂɑ݂B́AXbvAEgy[W̃y
  [We[uGgłÃy[Wǂ̃Xbvt@Cɕۑ
  Ă邩ƂƂƁÃXbvt@Cł̈ʒuƂLĂ
  ̂łBXbvLbVGg[łȂꍇÁÃy[
  WXbvt@CɂAꂪύXĂȂƂƂ
  \ĂBy[W̒̌ (݂)ύXꂽꍇA
  ̃Gg̓XbvLbV폜B

  Linux y[WXbvt@CɃXbvAEgKv
  AXbvLbV܂ׂBXbvLbVɂ̃y[Wp
  LȃGgȂÃy[WXbvt@CɏoKv
  ȂBȂȂẪy[ẂAXbvt@CŌɓǂ
  oĈȗύXĂȂłB

  XbvLbṼGg̓XbvAEgꂽy[WɊւy[W
  e[ũGgłB͖ƃ}[NĂ邪Aǂ̃Xb
  vt@Ĉǂł̃y[W邩 Linux ɒm点܂
  łB

  4.10.  Xbṽy[WC

  ݂ăXbvt@Cɕۑꂽy[WēxKvƂȂ邱
  BƂ΁AAvP[Vẑ̈ɏ݂
  ̂A̓ey[WXbvAEgĂꍇȂǂ
  BɂȂz̃y[WɃANZXꍇAy[
  WtHgNBy[WtHgƂ́AvZbTIy[eBOV
  XeɃVOi𑗂āAzAhX𕨗AhXɕϊłȂ
  `邱ƂłB̏ꍇÁAz̊Yy[W̏L
  Ăy[We[ũGgAy[WXbvAEgۂɖ
  ƃ}[N邩łBvZbT͂̉zAhX𕨗AhX
  ɕϊłȂ̂ŁAIy[eBOVXeɎnāAzAh
  XtHgNƂƂ̃tHg̗RƂ`B̏
  tH[}bgƃvZbTIy[eBOVXeɐn@
  ́AvZbTŗL̂̂łB
  [see: do_page_fault(), in arch/i386/mm/fault.c]

  vZbTŗL̃y[WtHgR[h́A܂Kv
  ``vm_area_struct'' f[^\TȂ΂ȂȂB
  vm_area_struct́Az̃GALq̂łÃtHg
  NzAhX܂ł邩łBtHgR[h
  ́A̍\̂AtHgNzAhX܂ނ̂
  B́AĒԊ|Ă͂Ȃ(time critical) R
  [h⏈ł̂ŁAvm_area_struct \̂́AԂŒZɂȂ
  ɕׂĂB

  vZbTŗL̓K؂ɏAtHgNzAhXL
  ȉz̈ɂ邱ƂꍇǍ̃y[WtHg
  ́ALinux ғǂ̃vZbTɂėpIœKp\Ȃ̂ƂȂB
  [see: do_no_page(), in mm/memory.c]
  ėp̃y[WtHgR[h́AtHgNzAhX̃y[
  We[uGgTBToy[We[uGgXbvA
  Egꂽy[Ŵ̂łꍇALinux ̓y[W𕨗ɖ߂
  ΂ȂȂBXbvAEgꂽy[Wɑ΂y[We[ũG
  g̓vZbTŗL̂̂AׂẴvZbT͂̃y[W
  ƃ}[NĂÃy[We[uGgɂ̓Xbvt@C
  Yy[WۂɕKvȏ񂪏܂ĂBLinux ͂̏
  gāÃy[W𕨗ɌĂі߂B
  [see: do_swap_page(), in mm/memory.c]

  ̎_ŁALinux ́AtHgNzAhXmĂAY
  y[WǂɃXbvAEgĂ邩Ɋւ܂ރy[We[u
  GgĂB``vm_area_struct'' \̂ɂ͂``[`
  ''ւ̃|C^܂܂ĂꍇÃ[`́A
  vm_area_struct \̂ŋLqĂ鉼z̈̔Cӂ̃y[W𕨗
  ւƖ߂B́AXbvC(swapin)ƌĂ΂B
  [see: shm_swap_in(), in ipc/shm.c]
  ̉zGAɃXbvC[`݂ꍇALinux 
  ̃[`gpB͎ہAXbvAEgꂽ System V L
  y[W@łBXbvAEgꂽ System V 
  Ly[W̃tH[}bg͒ʏ̃XbvAEgꂽy[W̃tH[}bg
  Ƃ͏قȂ̂ŁAɂ͓ʂȏ@KvƂ邩łB
  AXbvC[`݂Ȃꍇ̂ŁA
  ۂɂ́ALinux ́Ãy[WʂȏKvƂȂʏ̃y[Wł
  Ɛ肷B
  [see: swap_in(), in mm/page_alloc.c]
  āA̕y[W蓖āAXbvt@CXbvAEg
  ꂽy[WǂݏoBy[WXbvt@Ĉǂ(тǂ̃X
  bvt@C)邩́Aƃ}[Nꂽ̃y[We[
  uGg擾B

  y[WtHg𔭐ANZX݃ANZXłȂꍇAy[W
  ̓XbvLbVɂ̂܂܎cÃy[We[uGg
  ݉\Ƃ̓}[NȂB̌Ãy[Wւ̏݃ANZX
  ƁA̎_ŕʂȃy[WtHgAYy[W dirty 
  }[NÃGg̓XbvLbV폜B̃y[W
  ݂ꂸɁAēxXbvAEgKvꍇÃy[
  W͊ɃXbvt@Cɑ݂̂ŁALinux ̓y[W炽߂ăX
  bvt@Cɏ݂ɍς܂邱ƂłB

  y[WXbvt@CĂ邫ANZX
  ݑłꍇÃy[W̓XbvLbV폜A
  ̃y[We[uGǵAdirty ݉\łƃ}[N
  B

  (-- (r1)킵ƂɁA̍\̂́Ay[W\̂ƂĂ΂Ă
  B
  (r2)ɎQluƁB--)

  5.  vZX

  ̏͂ł̓vZXƂ͉ALinux VXeŃvZXǂ
  悤ɐAǗA폜Ă̂ɂĉB

  vZX̓Iy[eBOVXeŃ^XNsBvO
  ́AsC[WƂăfBXNɕۑꂽ}V̖߂ƃf[^Ƃ
  ZbgłBāAvOƂ͎󓮓IȎ̂łB΂ɁAv
  ZXƂ͎s̃Rs[^vOłƍl邱ƂłBv
  ZX̓_Ci~bNȎ̂łA}V̖߂vZbTɂs
  ɂďɕωĂ䂭BvOƂTO߂ƃf[^
  ނ̂ł悤ɁAvZXAvOJE^(program counter)
   CPU ̑SWX^vZXX^bN܂ފTOłA炪
  ꎞf[^ł郋[`p[^߂AhXAۑꂽϐ
  Ȃǂ܂TOłBݎs̃vO̓JgvZ
  X(current process)Ƃ́A}CNvZbTłׂ݂̌̊Ă܂
  TOłB

  Linux ̓}`vZX̃Iy[eBOVXełBvZXƂ͌
  ʂ̃^XNłAꂼꂪƎ̌ƐӔCBЂƂ̃vZX
  NbVꍇłAꂪ̃vZXNbV邱Ƃ͂
  BX̓ƗvZXƎ̉zAhXԂŎsĂāAJ
  [lǗSȎdg݂gꍇẮÃvZXƑ݂
  e^Ƃ͂ȂB

  vZX́ÃCtTCN̒ŁÃVXe\[X(system
  resources)gpB߂sƂɂ̓VXe CPU gpA
  gƂ̃f[^ێɂ̓VXe̕gpBt@
  CVXeŃt@CI[vĎgpAVXe̕foCX
  ځEԐڂɗpꍇBLinux ́AvZX̂ƂꂪVX
  e\[XɊĎ邱ƂŁAVXe̓YvZXƂ̑̃v
  ZXɊǗȂ΂ȂȂBЂƂ̃vZXVXe̕
   CPU Ɛ肵ƂA̓VXȇ̃vZXɑ΂
  Ƃ͌ȂB

  VXe̍łMdȃ\[X́ACPU łB͒ʏЂƂȂB
  Linux ̓}`vZX(multiprocessing)̃Iy[eBOVXeł
  A̖ڕẂAЂƂ̃vZXVXěʂ CPU ŏ펞点
  āACPU ̎gpőɏグ邱ƂłBvZX̐ CPU
  ̐ꍇ(ʏ͂ł)Ac̃vZX́AvZX̎s
  I CPU 󂭂܂ő҂Ȃ΂ȂȂB}`vZbVÕA
  CfA͒PłBvZXsƁAʏ퉽炩̃VXe\[
  X̂߂ɑ҂ԂƂȂA\[XƎsĊJB DOS 
  悤ȒPvZX(uniprocessing)̃VXeł́ACPU ͂̊ԁAP
  ҂Ă邾ŁA҂Ԃ͖ʂɂȂB}`vZbVOVXe
  ́ÃvZXɃɕێĂBvZXɑ҂Ԃ
  ƂAIy[eBOVXe͂̃vZX CPU グ
  āAD悷ׂ̃vZXɂ^BɎsvZXƂ
  ĂǂꂪłK؂肷̂XPW[(scheduler)łALinux
  ́A߂ɂ̃XPW[O̐헪gĂB

  Linux ́A̎st@CtH[}bgT|[gĂBELF ͂
  ЂƂłAJava łBvZXVXe̋LCu
  ߓIɈ悤ɂȂ΂ȂȂ̂ƓlɁÃt@CtH
  [}bgߓIɈ悤ǗȂ΂ȂȂB

  5.1.  Linux ̃vZX

  Linux VXẽvZXǗł悤ɂ邽߁AX̃vZX
  ́A ``task_struct'' Ƃf[^\̂ŕ\B(task  process
  ƂṕALinux ł͓`ƂĎgĂB)
  [see: include/linux/sched.h]
   ``task'' źAVXêׂĂ task_struct f[^\ɑ
  |C^̔złB̂ƂӖ̂́AVXẽvZX
  ̍ő吔 task z̃TCYɂĐƂƂłBf
  tHgł́A 512 ̃GgBvZXƁAV
   task_struct VXeɊ蓖ĂAtask zɒǉ
  BeՂɂ邽߂ɁAݎs̃vZX́A``current'' |C
  ^ɂă|CgĂB

  ʏ^CṽvZXłȂALinux ł̓A^CvZX(real
  time process)T|[gĂBvZX͊OECxgɑ
  ɔȂ΂ȂȂ(āAuA^CvƂpꂪg
  )̂ŁAXPW[͒ʏ̃[UvZXƂ͈قȂ鈵
  B ``task_struct'' ̃f[^\̂͋ɂ߂ċŕGÃtB[
  h͂̋@\ʃGAɕ邱ƂłB

     (State)
        vZX́AsɁAɉďԂωBLinux ̃v
        ZX͎̂悤ȏ(state)B(``r1'')

        s(Running)
           ̏Ԃ̃vZX́As(VXeŌݑs̃vZ
           X)Aɑsł(VXe CPU ̊蓖Ă҂Ă
           )̂ꂩłB

        ҋ@(Waiting)
           ̏Ԃ̃vZX́ACxg\[X҂ĂԂł
           BLinux ́Aҋ@Ԃ̃vZX荞݉
           \(interruptible)荞ݕs (uninterruptible)ǂŋ
           ʂB荞݉\ȑҋ@̃vZXƂ̓VOiɂĊ
           荞݂|̂łA荞ݕsȑҋ@̃vZX
           ́Aڃn[hEFȀԂɈˑ邩őҋ@Ă
           ŁAǂ̂悤ȏ󋵂ł荞݂|Ȃ̂B

        ~(Stopped)
           ̏Ԃ̃vZX́Aʏ̓VOiMƂŒ~
           ɂBfobÕvZX́A~ԂɒuƂ\ł
           B
        ]r(Zombie)
           ͏IvZXA炩̗RŁA``task'' z
           ``task_struct'' \̂܂Ă̂łB́A
           ̖̒ʂAɎłvZXłB

     XPW[O(Scheduling Information)
        XPW[(scheduler)́Aǂ̃vZXVXeōłDI
        Ɏsׂɔf邽߂ɁȀKvƂB

     ʎq(Identifiers)
        VXêׂẴvZX̓vZXʎqBvZX
        q́Atask zւ̃CfbNXł͂ȂAPȂԍłB܂
        X̃vZX̓[U ID уO[v ID A̎
        q̓VXẽt@CfoCXɑ΂邱̃vZX̃ANZX
        ̂߂ɎgpB

     vZXԒʐM(Inter-Process Communication, IPC)
        Linux ́AVOiApCvAZ}tHƂÓTI Unix IPC J
        jYT|[gƓɁALAZ}tHAbZ[W
        L[Ƃ System V IPC JjYT|[gĂBLinux
        ŃT|[gĂ IPC ̃JjYɂẮA``uvZX
        ʐM̎dg݁v''̏͂ŉB

     N(Links)
        Linux VXeł́ÃvZX犮SɓƗvZX͑
        ȂBVXêׂẴvZX́AvZXāA
        evZX(parent process)BVvZX͑n̂
        ͂ȂARs[̂łAނȑÕvZX̃N[Ƃ
        Đ܂̂łBvZX\ ``task_struct'' \̂
        ׂāA̎qvZX (child process)ւ̃|C^ێ
        ɁA̐evZXƌZvZX (siblings)(evZX
        vZX)ւ̃|C^ێĂB pstree R}hg
        ΁ALinux VXeŎs̃vZXԂ̉Ƒ֌W邱Ƃ
        B

        init(1)-+-crond(98)
                |-emacs(387)
                |-gpm(146)
                |-inetd(110)
                |-kerneld(18)
                |-kflushd(2)
                |-klogd(87)
                |-kswapd(3)
                |-login(160)---bash(192)---emacs(225)
                |-lpd(121)
                |-mingetty(161)
                |-mingetty(162)
                |-mingetty(163)
                |-mingetty(164)
                |-login(403)---bash(404)---pstree(594)
                |-sendmail(134)
                |-syslogd(78)
                `-update(166)

     ɁAVXêvZX́AdAXg̒ɕێ
     ĂāÃXg̃[ǵAinit vZX task_struct \
     ƂȂĂB̃Xg邱ƂŁALinux J[l̓VXe
     ׂẴvZX邱ƂłBps  kill ƂR}hT
     |[g邽߂ɁAJ[lɂ͂̋@\KvłB

     Ԃƃ^C}[
        J[ĺAvZXꂽԂƁAvZX̐ԓł
        CPU gpԂƂĎĂBNbNeBbN(``clock tick'')
        ƂɁAJ[ĺAs̃vZX̃VXe[hу[U
        [hł̌oߎԂϐ ``jiffies'' ̒lgčXVB
        ALinux ̓vZXŗL̃C^[o^C}[(interval timer)
        T|[gĂ̂ŁAvZX̓VXeR[𗘗pă^C}[
        ZbgA莞Ԃo߂ƎgɃVOi𑗂悤ɐ
        肷邱ƂłB^C}[́A񂾂gƂI
        Ɏgp邱ƂłB

     t@CVXe (File system)
        vZX́ADȂƂɃt@C̃I[vN[YłBv
        ZX ``task_struct'' \̂ɂ́AI[vꂽꂼ
        t@C̃fBXNv^ɑ΂|C^ƁAӂ VFS inode
        ɑ΂|C^܂܂ĂBX VFS inode ̓t@CVX
        ẽt@CfBNgj[NɋLq̂ŁAՂ
        Ȃt@CVXeɑ΂铝IȃC^[tFCX񋟂
        ̂łB Linux Ńt@CVXeǂ̂悤ɃT|[g
        邩́A ``ut@CVXev''̏͂ŏqׂĂBŏ
        VFS inode ̓vZX̃[g(̃z[fBNg)ɑ΂
        łAԖڂ VFS inode ̓Jg( pwd ) fBNg
        ɑ΂̂łB pwd ƂĂѕ́AUnix ̃R}h
        pwd (print working directory)ɗR̂łBӂ
         VFS inode ́Aꂼ ``count''tB[h𑝉āA
        Ƃȏ̃vZX̃fBNgQƒł邱ƂB
        䂦AvZX pwd fBNgƂăZbgĂfB
        Ng͍폜łAlɂ̃TufBNg폜łȂ
        ƂNB

     z (Virtual memory)
        啔̃vZX́A炩̉zĂB(J[lX
        bh (kernel threads)ƃf[(daemons)͂ł͂ȂB) 
        āALinux J[ĺAzǂ̂悤ɃVXe̕
        Ƀ}bvĂ̂ɊĎȂ΂ȂȂB

     vZbTŗL̃ReLXg (Processor Specific Context)
        vZXƂ́Ã݂VXe(system state)̑̂łƍl
        邱ƂłBvZX̑sɂ́AvZbT̃WX^X
        ^bNgpĂB̓vZX̃ReLX
        g(context)łAvZXTXyhꂽƂɂ́A CPU
        ŗL̑SReLXgA vZX ``task_struct'' \̂ɕۑ
        BvZXXPW[ɂĎnꂽƂ́ÃR
        eLXg task_struct f[^\̂񕜂B

  5.2.  ʎq(identifiers)

  Linux ́ÂׂĂ Unix ƓlɁA[U ID ƃO[v ID gp
  ăVXẽt@CC[Wւ̃ANZX`FbNBLinux V
  XêׂẴt@ĆAL҂ƃp[~bVƂĂāA
  ̃p[~bVɂăVXẽ[UYt@CfBN
  gɑ΂Ăǂ̂悤ȃANZX̂LqĂB{Iȃp[
  ~bVɂ́Aǂݏo (read)A(write)As(execute)
  A炪[U 3 ̃NXAȂ킿t@CLҁÃO
  [v̑vZXAуVXêׂẴvZXƂNX
  ƂɊ蓖ĂĂBꂼ̃[ŨNXقȂp[~bV
  ƂƂ\łBƂ΁AL҂ɂ͏݂Ɠǂݏo
  \ȃt@CłÃt@C̃O[vɂ͓ǂݏô݂\ł
  AVXȇׂ̂ẴvZXł͂܂ANZXłȂƂ
  ݒ肪\łB

  REVIEW NOTE: ̕ڂāArbg蓖ĂɂĐ邱
  ƁB(777)

  l[UVXêׂẴvZXɑ΂āAt@CfBNg
  ւ̃ANZX^̂ł͂ȂA[UO[vPʂł̌
  蓖Ă̂ Linux ̗VłBƂ΁A\tgEFAv
  WFNgɎQ[US̃O[v쐬ÃvWFNg̃\[
  XR[hɑ΂ẴO[vǂݏł悤Ɍ蓖Ă
  ƂłBЂƂ̃vZX̃O[vɑ邱Ƃ\ł
  (ftHgōő 32 O[v )Ȁ́AvZXƂ
  ``task_struct'' \̂ groups zɕێBvZX
  O[vɑĂāÂЂƂ̃O[vt@Cւ̃ANZX
  ĂꍇÃvZX͓Yt@Cւ̓K؂ȃO[vANZX
  ƂɂȂB

  vZX ``task_struct'' \̂ɂ́AvZXƃO[v̎ʎqɊ
   4 g̏񂪂B

     uid  gid
        s̃vZX\郆[Uʎq(User ID)ƃO[v
        q(Group ID)B

     (effective) uid  gid
        vÔȂɂ́AsvZX uid  gid vO
         uid  gid ɕύX̂B(sC[Ŵ uid 
        gid ́AVFS inode ̑lƂĕێĂB) vO
        ́Asetuid vOƌĂ΂ĂāAANZXAɌ
        ̃[UɎslbg[Nf[̂悤ȃT[rX
        ւ̃ANZX𐧌ЂƂ̕@ƂėLvȂ̂łB
        uid  gid Ƃ́Asetuid vO uid  gid gpA
        (real) uid  gid ̂܂܎cBJ[l̃`FbN
        Ƃ͂A uid  gid `FbNB

     t@CVXe uid  gid
        ͒ʏA uid  gid ƓłAt@CVXeւ
        ANZX`FbNۂɎgpB́ANFS Ń}E
        gꂽt@CVXeɂƂĕKvȂ̂łB[U[h
        NFS T[óAꎩg̃vZXł邩̂悤
        Ƀt@CɃANZXKv邩łB̏ꍇA(
        uid  gid ł͂Ȃ)t@CVXe uid  gid ύX
        B́Aӂ̂郆[U NFS T[o kill VOi𑗂
        ƂłƂԂ邽߂łB䂦Akill VOi
        ́A̎ uid  gid vZXɔzMB

     ۑꂽ uid  gid
        ́APOSIX Kiŋ`tĂAVXeR[oRŃv
        ZX uid  gid ύXvOɂėpB
        ́A uid  gid ύXĂԁÃIWi uid 
        gid ۑ邽߂ɎgpB

  5.3.  XPW[O

  ׂẴvZX́A鎞̓[U[hŁA鎞̓VXe[hő
  sBbɂȂn[hEFÃ[hT|[g@̓n[
  hEFAɂĈقȂ邪AʓIɂ́A[U[hVXe[h
  ̈ڍsт̋tɈڍsꍇ̈SȃJjYƂ݂̂
  B[U[h̓VXe[hƌꂽȂB
  vZX̓VXeR[s邽тɁA[U[hVXe[
  hɈڍsĎspB̂ƂAJ[l͂̃vZX\
  ssB Linux ł́AvZX́Aݑs̃vZX
  (preempt)ȂBs邽߂ɑs̃vZX~߂邱
  ͂łȂBvZX́A炩̃VXeCxg҂Ȃ΂
  ȂƂAgp CPU 邩ǂ߂BƂ΁Av
  ZX́At@Cꕶǂݏo܂ő҂Ȃ΂ȂȂ
  ȂB̑ҋ@Ԃ́AVXe[hɂVXeR[ɂċN
  BȂ킿AvZX́At@C open  read ̂߂ɃCu
  ֐gpAɂ̃Cu֐VXeR[𔭂 open 
  t@CoCg read B̏ꍇAҋ@̃vZX̓TXy
  hÅԂɑ̂Dx̍vZXI΂ĎsB

  vZX͏InVXeR[ŝŁA΂Αҋ@Kv
  B̏ꍇłAvZXҋ@ԂɂȂ܂ŎsꑱƂ
  ƁÃvZX͂͂s CPU ԂĂ邱ƂɂȂA
   Linux ͉\(pre-emptive)ȃXPW[Og킴
  ȂȂ邾낤Bۂ̎dg݂ł́AX̃vZX 200ms ̒Z
  sA̎Ԃo߂Ǝ̃vZXI΂ĎsA
  ̃vZX͍ēxs\ɂȂ܂ł΂炭҂B̒ZԊ
  úA^CXCX(time-slice)ƌĂ΂B

  VXe̎s\ȂׂẴvZX̒łD悷vZXI
  ŎsŜXPW[(scheduler)łB
  [see: shedule(), in kernel/sched.c]
  s\ȃvZXƂ́ACPU 󂫂Βɑs\ȃvZX
  B Linux ́ADx(priority)x[X̓KxɃVvȃXPW[
  OASYgăVXȇsvZXIĂBV
  vZXIŎsƂALinux ́A܂ݎs̃vZX̏
  (state)AȂ킿vZbTŗL̃WX^eAуvZX
  ``task_struct'' f[^\̂ɕێꂽ̑̃ReLXgۑ
  BāAVvZX̏(vZbTŗL̂̂ł)
  ĎsAVXe̐̃vZXɓnBXPW[VXe
  ̎s\ȃvZXɑ΂Č CPU Ԃ蓖Ă邽
  ɁALinux ͌X̃vZX task_struct \̓̏ێĂ
  B̏Ƃ͎̂悤Ȃ̂łB

     |V[ (policy)
        ́AYvZXɓKpXPW[O|V[ł
        BLinux ̃vZXɂ́Am[}ƃA^Ĉӂ̃^Cv
        BA^CvZX́Âǂ̃vZXDx
        Bs\ȃA^CvZXꍇA܂ꂪ
        sBA^CvZX́AEhr (round
        robin)Ɛo(first in first out)Ƃӂ̃^Cṽ|
        V[BEhrXPW[Oł́AX̎s
        \ȃA^CvZX͏ԂɎs邪AoXP
        W[Oł́AX̃vZX͎sL[ɒuꂽŎs
        ȀԂ͐΂ɕύXȂB

     Dx (priority)
        ́AYvZXɑ΂ăXPW[^Dxł
        B́AsꂽɁÃvZXs\
        (``jiffies'' lŕ\ꂽ)ԊԊułBVXeR[
        renice R}hgp΁AvZX̗DxύX邱Ƃ
        B

     A^CvZX̗D揇 (rt_priority)
        Linux ̓A^CvZXT|[gĂA̓VXe
        ̑̂ǂ̔񃊃A^CvZXD揇ʂŃXPW[
        OB̃tB[h́AXPW[ɂX̃A^
        CvZXɑ΂鑊ΓIȗD揇ʂ̕t^\ɂ̂ł
        BA^CvZX̗D揇ʂ́AVXeR[gp
        ύXłB

     JE^ (counter)
        ́AYvZXs (``jiffies'' lŕ\
        )ԊԊułB̓vZX߂Ďs鎞 priority
        ɑ΂Đݒ肳ANbNeBbNƂɌĂB

  XPW[́AJ[l̂낢ȏꏊsB͌ݑ
  s̃vZX҂sɓꂽƂɎsA܂VXeR[I
  ăvZXVXe[hvZX[hɖ߂钼Oɂs
  ƂBXPW[̎sKvƂ闝ŔAVXe^C}[
  JgvZX̃JE^[(counter)̎Ƀ[ɃZbg邩
  łB
  [see: schedule(), in kernle/sched.c]
  XPW[sƁÂ͎悤ȂƂB

     J[l[N(kernel work)
        XPW[́A{gn[tnh(bottom half handlers)s
        AXPW[̃^XNL[B̃CgEFCg
        J[lXbh (lightweight kernel threads)̏ڍׂ́A``uJ[
        lJjYv''̏͂ŉB

     JgvZX (Current process)
        ̃vZXIŎsOɁAݑs̃vZX(current
        process)Ȃ΂ȂȂB

        s̃vZX̃XPW[O|V[EhrȂA
        ̃vZX͎sL[̍ŌɒuB

        ^XN荞݉\(INTERRUPTIBLE)ŁAŌɃXPW[O
        ĂvZXVOi󂯎ĂꍇÃvZX
        ``task_struct''  stateAs (RUNNING)ƂȂB

        ݑs̃vZXԐ؂ɂȂꍇA state ͑s
        (RUNNING)ƂȂB

        ݑs̃vZX state s(RUNNING)̏ꍇA state
        ̂܂܈ێB

        s(RUNNING)ł荞݉\(INTERRUPTIBLE)łȂvZX
        sL[폜BȂ킿AXPW[sׂł
        Dx̍vZXTĂƂA͎s̑ΏۂƂ͌
        ȂƂƂӖB

     vZXI (process selection)
        XPW[́AsL[̃vZXnāAsɍłl
        vZXTBA^CvZX(̓A
        ^CXPW[O|V[)A͒ʏ̃vZX
        dBʏ̃vZX̏dv͂ counter Ō܂
        AA^CvZXɊւĂ͂ counter l 1000 t
        BȂ킿AVXeɎs\ȃA^CvZX
        ꍇAʏ̎s\ȂǂȃvZXKɎs
        ƂłBݑs̃vZX́A^CXCẌꕔ
        Ă܂Ă(vZX counter lĂ)̂ŁAV
        Xe̓DxvZXsȗɗB
        RȂׂłB̃vZX̗D揇ʂ
        AsL[̐擪ɍł߂̂IB݂̃vZX
        sL[̍Ōɖ߂B̗D揇ʂɂ鑽̃vZX
        ŃVXẽoXۂ߁AX̃vZX͏ԂɎs
        B̓EhrXPW[OƌĂ΂BAv
        ZX̓\[X̎擾҂ꍇ̂ŁAs̏Ԃ͑OシX
        B

     XbvvZX (swap process)
        ŗDŎsׂvZX݂̃vZXƂ͈قȂꍇA
        ݂̃vZX͒~ԂɂAVvZXsBvZ
        X͎s CPU VXẽWX^╨gpĂ
        B[`R[邽тɁAvZX̓WX^̈[
        `ɓnĂ邵AĂяo[`߂AhX̕
        ׂlX^bNɐςޏꍇB䂦AXPW[
        sĂہAXPW[̓JgvZX̃ReLX
        g(``context'')ŎsBXPW[͓[hłJ[
        l[hœ삵Ă̂AłsĂ̂́AJ
        gvZXłB̃vZX~ׂƂ́AvO
        JE^₷ׂẴvZbT̃WX^܂ނ̃}V̏
        (machine state)ŜAvZX ``task_struct'' f[^\
        ɕۑȂ΂ȂȂB̌ŁAVvZX̃}V̏
        ԂׂĂ[hB̓VXeɈˑ鑀łA܂
        @œ삷 CPU ͂Ȃ̂Ȁɑ΂Ă͒ʏ
        Ȃ炩̃n[hEFAɂ鉇ȂB

        (VvZXԂł)vZXReLXg̓
        (swapping)́AXPW[̏̈ԍŌŎsBO
        vZX̂߂ɕۑꂽReLXǵAXPW[̏I
        _ł̂̃vZXAVXẽn[hEFAReLX
        gɊւXibvVbgłBlɁAVvZX̃Re
        LXg[h鎞A܂XPW[̍Ō̎_ɂ
        邻̃vZX̃XibvVbgłAɂ́AvZX̃v
        OJE^⃌WX^̓eȂǂ܂܂ĂB

        ÕvZXVvZXzgpꍇAVXe
        ̃y[We[uGg̓Abvf[gKvB
        ܂A[LeN`ŗL̏łBAlpha AXP ̂悤ȃvZbT
        ̏ꍇAAhXϊobt@LbVꂽy[We[uG
        ggp̂ŁAÕvZXɑ邻̃LbVe[
        ũGg𖳌ɂKvB

  5.3.1.  }`vZbTVXeł̃XPW[O

   CPU VXe Linux ̐Eł͂قǑ͂Ȃ
  ALinux  SMP(Symmetric Multi-Processing)Ή̃Iy[eBOVX
  eɂ邽߂̎g݂͊ɐȂĂBȂ킿AVXe
   CPU Ԃ̎dʂϓɕSdg݂ȂǂłBXPW[ق
  ̍ƕSɌƂ͂ȂB

  }`vZbT̃VXeł́AׂẴvZbT펞vZX̎s
  ɂĂ邱Ƃ]܂BX CPU ݂̌̃vZX^CX
  CXg؂AVXe\[X҂Ȃ΂ȂȂȂ
  ACPU ͓ƗăXPW[sBSMP VXeɊւĂ܂
  ׂƂ́AVXẽAChԂ̃vZX͂ЂƂł͂ȂƂ
  ƂłBVOvZbT̃VXeȂAAChvZX
  ``task'' z̍ŏ̃^XNł邪ASMP VXeł CPU ƂɃACh
  vZX݂BāAJgvZX CPU Ƃɑ݂
  ŁASMP VXe̓JgvZXƃAChvZXƂ CPU ƂɊ
  Ȃ΂ȂȂB

  SMP VXeł́AX̃vZX ``task_struct''_ \̂́A݃v
  ZXs̃vZbT̔ԍ (``processor'')Aт̃vZXO
  sꂽvZbT̔ԍ(``last_processor'') Ƃ܂ށBv
  ZXI΂邽тɈႤvZbTŎs邱ƂȂƂ
  R͂ȂALinux ́A``processor_mask'' gpāAvZXVX
  e̓̃vZbTgȂ悤邱ƂłBrbg N
  ZbgƁÃvZX̓vZbT N Ŏs\ɂȂBX
  PW[AsׂVvZXIłƂA蓖Ăs
  ƂvZbTԍɓKԍ processor_mask ɃZbgĂ
  vZX͌₩珜OB܂AOsꂽvZbTƂ͈قȂ
  vZbTŃvZXsƂ́A΂΃ptH[}X̃I[
  o[wbĥŁAvZXAꂩ犄tsvZb
  TOgĂꍇ́AXPW[͂̃vZXɑ΂኱̃Ah
  oe[W^B

  5.4.  t@C

                     fs_struct                inode
                    +----------+             +------+
                +-->| count    |      +----->|      |
   task_struct  |   |----------|      |      |      |
                |   | unmask   |0x022 |      |      |
  |           | |   |----------|      |      |      |
  |           | |   | *next    |------+      +------+
  |-----------+ |   |----------|
  | fs        |-+   | *prev    |------+
  |-----------+     +----------+      |       inode
  | files     |-+                     |      +------+
  |-----------+ |                     +----->|      |
  |           | |                            |      |
  |           | |    files_struct            |      |
                |   +---------------+        |      |
                +-->| count         |        +------+
                    |---------------|
                    | close_on_exec |
                    |---------------|
                    | open_fs       |
                    |---------------|                          inode
                    | fd[0]         |     file               +------+
                    |---------------|   +--------------+ +-->|      |
                    | fd[1]         |-->| f_mode       | |   |      |
                    |---------------|   |--------------| |   |      |
                    |               |   | f_ps         | |   |      |
                    |               |   |--------------| |   +------+
                    |               |   | f_flags      | |
                    |               |   |--------------| |
                    |               |   | f_count      | |
                    |               |   |--------------| |
                    |---------------|   | f_owner      | |
                    | fd[255]       |   |--------------| |
                    +---------------+   | f_inode      |-+
                                        |--------------|
                                        | f_op         |--->t@C
                                        |--------------|    
                                        | f_version    |    [`
                                        +--------------+

  }\(4.1) vZX̃t@C

  }\ 4.1 ł́Aӂ̃f[^\AVXěX̃vZX
  ւt@CVXeŗL̏LqĂdg݂ĂB
  [see: include/linux/sched.h]
  ЂƂ߂́A``fs_struct'' ͓YvZX VFS ``inode'' Ƃ umask
  ɑ΂|C^܂łB umask Ƃ͐Vt@C쐬
  ̃ftHg[hłÃ[h̓VXeR[ĕύX\
  B

  ӂ߂̃f[^\ł ``files_struct'' ɂ́ÃvZXݎg
  pĂ邷ׂẴt@CɊւ񂪊܂܂BvO͕W
  (standard input)ǂݍ݂AWo(standard output)ɏo
  BׂẴG[bZ[W͕WG[(standard error)ɑB
  ̓t@CłA^[~iւ̓o͂łAfoCX
  肷邪ÃvOɊւAׂ͂ăt@CƂ
  ĈBׂẴt@C͎g̋Lqq(descriptor)Ă
  Afiles_struct ́A256 ܂ł ``file'' f[^\̂ɑ΂|C^
  ܂ނƂłÅeX̃vZXŎgpĂt@C
  wĂB``file'' \̂ ``f_mode'' tB[h͂̃t@C
  ǂ̃[hō쐬Ă̂BǂݍݐpAǂݏ\A
  ݐpȂǂłB ``f_pos'' ̓t@C̈ʒuێĂ
  āA̓ǂݏt@ĈǂłȂ邩ĂB
  ``f_inode'' ́Ãt@CLq VFS ``inode'' |CgĂ
  Af_ops (: ``f_op''H) ́A[`̃AhX̔zɑ΂|C
  ^łAX̃[`́AƂ΁Af[^݂̂߂̊֐Ȃ
  ́Ãt@Cɑ΂鑀̍ۂɌĂяo֐łB̃C^[
  tFCX̒ۉ͔ɃptłAɂ Linux ͕L
  t@C^CvT|[g邱ƂłBLinux ł́ÃJjY
  ppCvĂ邪AɂĂ͌قǏqׂB

  t@CI[v邽тɁA``file_struct'' ɂgpĂ
   ``file'' ւ̃|C^V file \̂ɑ΂|C^ƂĎgp
  B Linux ̃vZX́Asۂ 3 ̃t@CfBXNv
  ^邱ƂOɂĂB́AẂAWóAWG[
  ƌĂ΂Aʏ퐶Ɋ֗^evZX炻󂯌pBt@C
  ̃ANZXׂ͂ĕWVXeR[oRōsÃVXeR[
  Ƃ̊ԂŃt@CfBXNv^̂肪B̃t@CfB
  XNv^́AvZX ``fd'' zւ̃CfbNXƂȂĂāAW
  ́AWóAWG[͂ꂼ 0, 1, 2 ̃t@CfBXNv^
  Bt@Cւ̃ANZX̂т file f[^\̃t@C샋[
  `ƁAVFS inode ƂgpAړIƂKvȏsB

  5.5.  z

  vZX̉zɊ܂܂sR[hƃf[^́AlXȃ\[X琬
  藧ĂBɁA[hׂvOC[WBƂ
  ΁Als ̂悤ȃR}h́ÂׂĂ̎sC[WlAsR[h
  f[^\ĂB̃C[Wt@Cɂ́AsR[hƃvO
  ̊֘Af[^ƂvZX̉zɃ[ĥɕKvȂׂĂ
  ܂܂ĂBɁAvZX̂AVɉzt
  ꍇB́Aǂݏõt@C̓e̕ێƂȂǂɁA
  ̃vZX̏Ɏgp̂łB̐Vtꂽ
  zg悤ɂɂ́AvZX̎̉zɃN
  Ȃ΂ȂȂBOɁALinux ̃vZX́AƂ΃t@Cnh
  Õ[`ȂǁAʓIɂ悭pR[hł郉Cug
  pBX̃vZXg̃CũRs[̂ł͈Ӗ
  Ȃ̂ŁALinux ͂̎s̃vZX瓯Ɏgp邱Ƃ
  \ȋLCugpĂBLCũR[hf[
  ^ÃvZX̉zAhXԂɃNȂ΂ȂȂB
  ÁACuLĂ鑼̃vZX̉zAhXԂ
  NȂ΂ȂȂB
  ꂽԂ̒PʂŒ߂΁AvZX͉zɊ܂܂R[
  hf[^ׂ̂ĂgĂ킯ł͂ȂB̏󋵂łp
  R[hAƂΏʂȃCxgƂgp
  ȂR[hzɊ܂܂ĂBLCũ[`͂
  gpĂȂȂBR[hf[^ׂ̂Ă𕨗
  Ƀ[hāAg킸ɕĂ͎̖̂ʂłBVXẽv
  ZX̖̐ʂƂƁAVXesŔɌ
  BɑΏ邽߂ɁALinux ́Af}hy[WOƂeN
  jbNgpAvZX̉zgpƂ̉z
  𕨗ɖ߂悤ɂĂBāAR[hf[^𕨗
  ɒڃ[h邩ɁALinux J[l̓vZX̃y[We[u
  ύXAzGA𑶍݂͂邪(: valid )ɂ͑
  ݂ȂԂɂĂBvZXR[hf[^ɃANZX悤Ƃ
  ƁAVXẽn[hEFAy[WtHgNA Linux J[
  lɓnāAJ[l悤ɂȂĂB䂦A
  y[WtHgɑΏ邽߂ɁAvZX̃AhXԂɂ鉼z
  ׂ̂Ă̗̈ɊւāALinux ́Azǂ\[X
  藧̂ŁAǂΕɎĂ̂mĂK
  vB

                                            vZXz
                                               +----------+
  task_struct                                  |          |
  |        |                                   |          |
  |        |                                   |          |
  |        |    mm_struct    vm_area_struct +->|----------|
  |--------|  +----------+    +----------+  |  |          |
  |  mm    |->| count    | +->| vm_end   |--+  |          |
  |--------|  |----------| |  |----------|     |          |
  |        |  | pgd      | |  | vm_start |--+  |   Data   |
  |        |  |----------| |  |----------|  |  |          |
  |        |  |          | |  | vm_flag  |  |  |          |
  |        |  |          | |  |----------|  |  |          |
  |           |          | |  | vm_inode |  |  |          |
              |----------| |  |----------|  +->|----------|0x8059BB8
              | mmap     |-+  | vm_ops   |     |          |
              |----------|    |----------|     |          |
              | mmap_avi |    |          |     |          |
              |----------|    |          |     |          |
              | mmap_sem |    |----------|  +->|----------|
              +----------+    | vm_next  |-+|  |          |
                              +----------+ ||  |          |
                           +---------------+|  |          |
                           | vm_area_struct |  |          |
                           |  +----------+  |  |          |
                           +->| vm_end   |--+  |          |
                              |----------|     |          |
                              | vm_start |---->|----------|0x8048000
                              |----------|     |          |
                              | vm_flag  |     |          |
                              |----------|     |          |
                              | vm_inode |     |          |
                              |----------|     |          |
                              | vm_ops   |     |          |
                              |----------|     |          |
                              |          |     |          |
                              |          |     |          |
                              |----------|     |          |
                              | vm_next  |     |          |
                              +----------+     |          |
                                               +----------+ 0x0000000

  }\(4.2) vZX̉z

  Linux J[l͂z̗̈ŜǗKvAX
  ̃vZX̉z̓éÃvZX``task_struct'' |C
  gꂽ ``mm_struct'' f[^\̂ɂċLqĂBvZX
   mm_struct f[^\̂́A[hꂽsC[WɊւƃv
  ZX̃y[We[uւ̃|C^܂łB܂Amm_struct 
  ́A``vm_area_struct'' f[^\̂̃Xgɑ΂|C^܂܂
  āAX ``vm_area_struct'' \̂́AvZX̉z̗̈
  \ĂB

   ``vm_area_struct'' ̘AXǵAzAhX̏ɕ
  ĂB``}\(4.2)''ł́APȃvZX̉z̃CAE
  gAǗJ[l̃f[^\ƈꏏɎĂBz
  ̗̈͂̃\[X琬Ă̂ŁALinux ͂̃C^[
  tFCX𒊏ۉ邽߂ɁAvm_area_struct g(``vm_ops''oR
  )Az̈Ã[`|CgĂB̕@ɂ
  AvZX̉zׂ͂Ĉт@őł悤ɂȂĂ
  Ȃ@́AzǗbIȃT[rXǂ̂悤Ɉ
  ȂĂĂςȂBƂ΁AvZXzɃANZX悤
  Ƃꂪɑ݂ȂƂɌĂяo郋[`
  By[WtHgꍇɎgp̂Ã[`ł
  B

  vZXA ``vm_area_struct'' f[^\̂́ALinux J[l
  JԂANZXBƂ΁ALinux ÃvZX̂߂ɐV
  z̃GA쐬ƂAVXe̕ɂȂ
  zQƂꂽꍇɂƂȂǂłB䂦A
   vm_area_struct 𔭌̂ɂ鎞Ԃ́AVXẽptH[}X
  ɐ[ȉe^B̃ANZXԂZk邽߂ɁALinux ́AAVL
  (Adelson-Velskii and Landis) c[̂Ȃ vm_area_struct f[^\
  ̂zuĂB̃c[́AX vm_area_struct (邢́Am[
  h) Eׂ vm_area_struct f[^\̂ւ̃|C^悤ɔz
  uĂB̃|C^́AႢzAhXm[h|
  CgĂAẼ|C^͂荂zAhXm[h|
  CgĂBm[h𔭌ہA Linux ̓c[̍(root)
  āAX̃m[h̍Ẽ|C^HA
  vm_area_struct 𔭌dg݂ɂȂĂBA̕@
  Ƃ߂ł͂ȂÃc[ɐV vm_area_struct ǉ
  A(ʏ)̃vZXԂB

  vZXz̊tsƂALinux ͎ۂɂ̃vZX
  ߂̕mۂ킯ł͂ȂB̂ALinux ́AV
  ``vm_area_struct'' f[^\̂쐬邱Ƃł̉zLq
  B̍\̂̓vZX̉z̃XgɃNBvZX
  ̐Vz̗̈ɂ鉼zɏ݂sƂ
  AVXe̓y[WtHgNBvZbT͉zAhX(
  AhX)fR[h悤Ƃ邪ẢzɊւy[We[u
  Gg(PTE)݂Ȃ̂ŁA߂ăy[WtHgO(page fault
  exception)𔭍sALinux J[lɌ̏CBLinux ́AQƂ
  ꂽzAhX݂̃vZX̉zAhXԂɂ邩ǂmF
  BȂALinux ͓K؂ PTE 쐬ÃvZXɃ
  ̕y[WtBt@CVXeXbvfBXNAR[
  hf[^̕y[WւƎėȂ΂ȂȂꍇB
  ɂāAvZX̓y[WtHǧƂȂ߂̎_Ďn
  Â͕݂ŁAspB

  5.6.  vZX̐

  VXéANɁAJ[l[hŎsĂāA̍ۂ́A
  ŁAЂƂ̃vZXł鏉vZX݂ȂB
  vZXÂׂẴvZXƓlɁAX^bN⃌WX^Ȃǂŕ\
  }V(machine state)ĂB̃vZX
  s鎞Ȁ́AvZX ``task_struct'' f[^
  \̂ɕۑBVXȅI_ŁAvZX
  ́A(init ƌĂ΂)J[lXbh(kernel thread)NAACh
  [v(idle loop)ԂɓāAȂȂBɑS邱Ƃ
  Ȃ΁AXPW[́ÃAChvZXsB̃ACh
  vZX task_struct ́ABAIɊtȂvZXł
  A̓J[lrhꂽɐÓIɒ`ĂvZXł
  A╴킵OAinit_task ƌĂ΂ĂB

  init ƂJ[lXbh̓vZX́AVXeōŏ̎v
  ZXȂ̂ŁAvZXʎq 1 ĂB́AVXȅ
  ̂(VXeR\[̃I[v⃋[gt@CVXẽ}
  EgȂ)sǍŃVXȅvOsB
  ̃vÓAVXeɈˑ̂ŁA/etc/init, /bin/init, 
  /sbin/init ̂ꂩƂȂĂBinit vÓAXNvgt@C
  Ƃ /etc/inittab gpāAVXeŐVvZX𐶐
  B̐VvZX͂ꎩ̂łɐVvZX𐶐
  BƂ΁Agetty vZX́A[UOC悤Ƃ
  Alogin vZX𐶐BVXêׂẴvZX́A
  init J[lXbh̎qłB

  VvZX́AÂvZXN[jO邩A݂͌̃v
  ZXN[jO邱ƂŐB
  [see: do_fork(), in kernel/fork.c]
  V^XN̓VXeR[(fork  clone )ɂĐAN
  [jO̓J[lŃJ[l[hɂĎsB̃VXe
  R[IƁAVvZXaAXPW[IȂ
  ɎsłԂőҋ@ĂBV ``task_struct'' f[^\
  ̂ɂ́AN[jOꂽvZX([UуJ[l)X^bN̂
  ߂ɁA̕y[WAVXe̕犄tB
  VvZX̎ʎq쐬邪A̎ʎq́AVXeɂ
  ÃvZXʎq̂ȂŃj[NȂ̂łBAN[jO
  ꂽvZX̐evZX̎ʎqێƂdg݂ɂ́Aʂ
  IRBV task_struct  task zɒǉAÂ
  (݂) vZX task_struct ̓eN[jOꂽvZX
  V task_struct ɃRs[B

  N[jȌ̍ہALinux ́Aӂ̃vZXʂ̃\[X
  ̂łȂA\[XL邱Ƃo悤ɂĂB̂
  ́AvZX̃t@CVOinh[AzɂĂ
  ͂܂B\[X݂ɋĹׂA\[X count tB[
  hCNgALinux ́ÃvZXĝ~߂
  ܂ł̃\[XȂ悤ɂBāAƂ΁AN
  [jOꂽvZXzL悤ƂꍇÃvZX
   ``task_struct'' ɂ́A(e)vZX ``mm_struct'' ւ̃|C^
  ܂߂AevZX mm_struct  ``count'' tB[hZ
  āALvZX̐B

  vZX̉z̃N[jO͂gbL[ł
  B``vm_area_struct'' f[^\̂̐VZbgAL
  ``mm_struct'' f[^\̂ƃN[jOꂽvZX̃y[We[u
  ƂƂɐBvZX̉z͂̒iKł͂܂Ă
  ȂB͖ʓ|ŎԂ̊|^XNłBƂ̂AevZX̉
  ẑA镔͕ɂ邩ȂAvZX
  ݎsĂsC[W̒ɂ̂A炭Xbvt@C
  ̒ɂ̂邩łB䂦ALinux ́AuRs[IC
  g(copy on write)vƌĂ΂eNjbNgpB̈Ӗ́Aӂ
  ̃vZX̂̂ЂƂɏ݂悤ƂƂ̉z
  Rs[Ƃ̂łB݂\ȏꍇłA(
  ݗvȂ߂)܂ĂȂźA̖
  Ȃӂ̃vZXԂŋLBƂΎsR[ĥ悤ȁAǂ
  ݐp̃͏ɋLBuRs[ICgv@\
  ꍇA݉\ȃGÁÃy[We[uGgǂݍݐp
  ƃ}[NÃGALq vm_area_struct f[^\̂uR
  s[ICgvƃ}[NBLvZX̂ЂƂ̉zɏ
  ݂悤ƂƁAy[WtHgNB̎_ŁALinux ̓
  ̃Rs[쐬Aӂ̃vZX̃y[We[uƉz̃f
  [^\B

  5.7.  Ԃƃ^C}[

  J[ĺAvZX鎞ԂĎƓɁAꂪCtT
  CNɂď CPU ԂĎĂBNbNeBb
  N(``clock tick'')ƂɁAJ[ĺÃ݂vZXVXe[h
  у[U[hŏԂ̑ʂ jiffies lgČvEXV
  ĂB

  ԋL^p̃^C}[ɉāALinux ̓vZXŗL̃C^[o
  ^C}[(interval timer)T|[gĂB
  [see: kernel/itimer.c]
  vZX͂̃^C}[gpāA^C}[̏莞Ԃo߂邲ƂɎ
  gɑ΂ėlXȃVOi𑗂ĂBT|[gĂOނ̃C
  ^[o^C}[ɂ́Â悤Ȃ̂B

     real
        ԂŌv^C}`bN(``timer tick'')B̃^C}[̏
        莞Ԃo߂ƁAvZX SIGALRM VOiB

     virtual
        vZX̎sv^C}`bNB莞Ԃo߂
        ƁAvZX SIGVTALRM VOi𑗂B

     profile
        vZX̎sƁAvZX㗝ăVXesĂ鎞
        ̗Ōv^C}`bNB莞Ԍo߂ɂ SIGPROF VO
        i𑗂B

  ЂƂׂ͂ẴC^[o^C}[s邱Ƃ\
  ŁALinux ͂炷ׂĂ̕KvȏvZX ``task_struct'' f[
  ^\̂ɕۑB̃C^[o^C}[̐ݒAnA~
  ь݂̒l̓ǂ݂Ƃ́AVXeR[ɂsB
  [see: do_it_virtual(), in kernel/sched.c]
  [see: do_it_prof(), in kernel/sched.c]
  virtual  profile ^C}[́A@ő삳BNbN
  eBbNƂɑs̃vZX̃C^[o^C}[̒l͌A
  Ԍo߂ɂAK؂ȃVOiB

  A^C(real time)C^[o^C}[͂Ƃ͏قȂALinux
  ́Â߂``uJ[l̎dg݁v''̏͂ŉ^C}[JjY
  gpB
  [see: it_real_fn(), in kernel/itimer.c]
  X̃vZX́A ``timer_list'' f[^\̂AA
  (real)C^[o^C}[sĂƂA̍\̂VXe
  ^C}[Xg̃L[ɓB莞Ԃo߂ƁA^C}[̃{gn
  [tnh[(bottom half handler)L[폜AC^[
  o^C}[nh[(interval timer handler)ĂяoBĂꂪ
  SIGALRM VOi𐶐AC^[o^C}[ĎnAY\
  ēxVXe^C}[̃L[ɖ߂B

  5.8.  vO̎s

  Linux ł́A Unix ƓlɁAvOR}h́AʏR}hC
  ^[v^ɂĎsBR}hC^[v^́ÃvZX
  l[UvZXłAVF(``r 2'')ƌĂ΂BLinux ɂ͑
  ̃VFAłLȂ̂ƂāAsh, bash  tcsh 
  Bcd  pwd Ƃ̑gݍ݃R}h΁AR}hƂ
  s\ȃoCit@ĈƂłBR}h͂ƁAVF
  ́Aϐ PATH ɐݒ肳ꂽvZX̌pX̃fBNgT
  AO̎sC[W悤ƂB̃t@C
  ΁A̓[hsBVF́Afork Ƃdg݂gāA
  قǐ悤ɎgN[jOBāAɐVqv
  ZX́AevZXsĂoCiC[WAȂ킿VFA
  ΂̎sC[W̓eƒuBʏAVF́A
  R}h̊AƎqvZX̏I҂BVFēx点
  Ƃ́Acontrol-Z ƃ^CvāAqvZXobNOEhɉ
  ΂悢B́AqvZX SIGSTOP VOi𑗂āA~
  鑀łBɁAVFR}h bg gĎqvZXobNO
  Ehɉ邱ƂłB́AVFqvZXɑ΂
  SIGCONT VOi𑗂čĎn̂ŁAqvZX͎sI
  A^[~ił̓o͂KvɂȂ܂łɗ܂B

  st@C͑̃tH[}bg邱ƂłB́AXNvg
  t@CłĂ悢BXNvgt@C͉߉\Ȃ̂łȂ΂
  炸AK؂ȃC^[v^sĂȂ΂ȂȂB
  ΁A/bin/sh ́AVFXNvg߂C^[v^łBs
  \ȃIuWFNgt@Cɂ́AsR[hƃf[^AуIy[eB
  OVXeɃ[hĎs邱Ƃł邾̏[
  񂪊܂܂ĂBLinux ōłʓIɗpĂIuWFNg
  t@C̃tH[}bǵAELF ł邪A_́ALinux ́AقƂǂ
  ׂẴIuWFNgt@C̃tH[}bg邾̏_Ă
  B

  formats   linux_binfmt          linux_binfmt           linux_binfmt
          +----------------+    +----------------+    +----------------+
  ------->| next           |--->| next           |--->| next           |
          |----------------|    |----------------|    |----------------|
          | use_count      |    | use_count      |    | use_count      |
          |----------------|    |----------------|    |----------------|
          | *load_binary() |    | *load_binary() |    | *load_binary() |
          |----------------|    |----------------|    |----------------|
          | *load_shlib()  |    | *load_shlib()  |    | *load_shlib()  |
          |----------------|    |----------------|    |----------------|
          | *core_dump()   |    | *core_dump()   |    | *core_dump()   |
          +----------------+    +----------------+    +----------------+

  }\(4.3) o^ꂽoCitH[}bg

  t@CVXȅꍇƓlɁALinux ŃT|[gĂoCitH
  [}bǵAJ[lrhۂɃJ[lɑgݍ܂邩A[_u
  W[Ƃėp\̂ꂩłBJ[l̓T|[go
  CitH[}bg̃XgێĂ(}\(4.3)Q)At@C
  sƂ́A̎sɐ܂ŁAX̃oCitH[}bg
  ԂɎB
  [see: do_execve(), in fs/exec.c]
  LT|[gĂ Linux ̃oCitH[}bǵAa.out  ELF 
  Bst@ĆASɃɓǂݍ܂Kv͂ȂAf}h
  [fBOƌĂ΂eNjbNgpBsC[ẄꕔvZ
  XɂĎgp邽тɁA̕Ɏ荞܂B̃C
  [W̎gpȂ́AjĂ悢B

  5.8.1.  ELF

  ELF (Executable and Linkable Format) ƂIuWFNgt@C̃tH
  [}bǵAUnix System Ő݌vꂽ̂ŁAł Linux 
  łLpĂtH[}bgƂĂ̒nʂmĂBECOFF
   a.out ̂悤ȑ̃IuWFNgt@C̃tH[}bgƔrƃp
  tH[}XI[o[wbĥAELF ͂ނ낻ȏ
  _ł_]ĂB ELF ̎st@Cɂ́Aɂ̓eLX
  g(text)ƂĂ΂sR[hAуf[^܂܂Bst@C
  ̃e[uł́ÃvOvZbT̉zɒuۂ̕
  @ĂBÓIɃNꂽC[ẂAJ(ld)A̓
  NGfB^ɂāÃC[W̎sɕKvȂׂẴR[hƃf[^
  ܂ޒP̃C[WɃrhB̃C[ẂAg̃
  ł̃CAEgAC[W̍ŏ̎sR[h̃AhXɂĂw
  ĂB

               ELF sC[W
              +---------------+
              |  e_ident      |'E' 'L' 'F'
              |  e_entry      | 0x8048090
              |  e_phoff      | 52
              |  e_phentsize  | 32
              |  e_phnum      | 2
              |---------------|
              |               |
              |---------------|
              |  p_type       | PT_LOAD
              |  p_offset     | 0
  wb_  |  p_vaddr      | 0x8048000
              |  p_filesz     | 68532
              |  p_memsz      | 68532
              |  p_flags      | PF_R, PF_X
              |---------------|
              |  p_type       | PT_LOAD
              |  p_offset     | 68536
              |  p_vaddr      | 0x8059BB8
  wb_  |  p_filesz     | 2200
              |  p_memsz      | 4248
              |  p_flags      | PF_R, PF_W
              |---------------|
              ~               ~
              ~               ~
              |               |
              |    Code       |
              |               |
              |---------------|
              |               |
              |    Data       |
              |               |
              |               |
              +---------------+

  }\(4.4) ELF st@CtH[}bg

  }\(4.4) ́AÓIɃNꂽ ELF sC[W̃CAEg
  B
  [see: include/linux/elf.h]
  ́AȒP C vOłA"hello world" \āAI
  ̂łBwb_́At@C ELF C[Wł邱Ǝ̂ɁA2 
  ̕wb_gĂ(e_phnum  2 ł)A̓C[Wt@C
  ̐擪 52 oCg(e_phoff)n܂ĂBŏ̕wb_
  ́AC[W̎sR[hɂċLqĂBsR[h́AzAh
  X 0x8048000 ɒuA̗eʂ 65532 oCgł邱ƂĂ
  B̗eʂ́AꂪÓIɃNꂽC[WłA"hello
  world" o͂邽߂ printf() ĂяõCuR[ĥׂĂ
  ܂ނłBC[W̃Gg[|CgAȂ킿vO̍ŏ
  ̖߂ꏊ́AC[W̐擪ł͂ȂAzAhX 0x8048090
  (e_entry) łB̃R[h́Aڂ̕wb_̂납n܂
  ĂBڂ̕wb_́AvÕf[^LqĂāAz
  ̃AhX 0x8059BB8 Ƀ[h悤ɂȂĂB̃f[^
  ͓ǂݏ\łBt@C̃f[^TCY 2200 oCg (p_filesz)
  ƂȂĂAł̂̃TCY 4248 oCgł邱ƂɋCt
  ƎvB́Aŏ 2200 oCgɂ͂炩ߏꂽf[^
  ܂ĂāA 2048 oCgɂ͎sR[hɂďf[^
  ܂܂Ă邩łB

  Linux  ELF sC[WvZX̉zAhXԂɃ[h
  A Linux ͎ۂɂ̃C[W[h킯ł͂ȂB
  [see: do_load_elf_binary(), in fs/binfmt_elf.c]
  z̃f[^\ƃvZX ``vm_area_struct'' c[Aт
  ̃y[We[uݒ肷邾łBvOsƁAy[W
  tHgɂvÕR[hƃf[^ɎoBv
  O̎gpĂȂ͌ăɃ[hȂB ELF o
  CitH[}bg[_(loader)́A[hׂC[WL ELF
  sC[Wł邱ƂmFƁÃvZX݂̌̎sC[W
  ̉zB̃vZX̓N[jOꂽC[W
  ̂ (ׂẴvZXł)ǍÂC[ẂAevZX
  sĂvOAƂ΃R}hC^[v^VFł
  bash ̃vOɂȂłBÂsC[Ŵ悤
  邱ƂŁAÂz̃f[^\jAvZX̃y[W
  e[uZbgB[_͂܂Aݒ肳ꂽׂẴVOin
  hNAAI[vĂׂẴt@CB̏
  IƁAqvZX͐VsC[W󂯓\ɂȂBs
  C[W̃tH[}bgłA񂪃vZX ``mm_struct''
  ɐݒ肳Bmm_struct \̂ɂ̓C[W̃R[hƃf[^̎n_ƏI_
  ɂẴ|C^݂B̒l̂́AELF sC
  [W̕wb_ǂݍ܂āÃwb_LqvO
  ZNVvZX̉zAhXԂɃ}bvꂽƂłB
  ́A vm_area_struct f[^\̂ݒ肳AvZX̃y[We[
  uύXƂłBmm_struct f[^\̂ɂ́ÃvO
  ɓnp[^ƃvZX̊ϐɑ΂|C^܂܂Ă
  B

  5.8.1.1.  ELF LCu

  ΂ɁAIɃNꂽC[ẂAsɕKvȂׂẴR[hƃf[
  ^܂ނ킯ł͂ȂB̊́ALCuɕێĂA
  sɃC[WɃNBELF LCũe[úALC
  usɃC[WɃNƂɁA_Ci~bN
  J(dynamic linker)ɂĂgpB Linux ́Ald.so.1, libc.so.1,
  ld-linux.so.1 Ȃǂ̃_Ci~bNJgpĂA
  /lib ɒuĂBCuɂ́ÃTu[`Ȃǂ̂悭gp
  R[h܂܂ĂB_Ci~bNJȂƁAׂẴvO
  ͂̃CũRs[ŏLȂ΂Ȃ炸A
  Ȃ葽̃fBXNeʂƉzv邱ƂɂȂĂ܂B_Ci
  ~bNNgpꍇAQƂ邷ׂẴCu[`Ɋ
   ELF ̃C[We[uɊ܂܂ĂB̏́A_Ci
  ~bNJɑ΂āACu[`TׂꏊƃvÕA
  hXԂɂN@ƎŵłB

  REVIEW NOTE: s̓ȂǂAƏڂׂ낤H

  5.8.2.  XNvgt@C

  XNvgt@ĆA̎sɃC^[v^KvƂst@C
  łBLinux œ\ȃC^[v^͔ɑނBƂ
  ΁Awish, perl,  bash ̂悤ȃR}hVFłBLinux ł́A
  WI Unix ̊Kɏ]āAXNvgt@C̍ŏ̈sɃC^[
  v^̖O悤ɂȂĂBT^IȃXNvgt@C͎ɂ
  Ɏn܂B

  #!/usr/bin/wish

  XNvg̃oCi[[_́ÃXNvg̃C^[v^T
  ƂB
  [see: do_load_script(), in fs/binfmt_script.c]
  ̂߂Ƀ[_́AXNvg̍ŏ̍sŎwĂst@C
  I[vĂ݂BI[vłȂÃC^[v^́AI[v
  t@C VFS inode ɑ΂|C^Aɐǂݍ
  ŁAXNvgt@C߂BXNvgt@C̖ÓA 0
  (ŏ̈)ƂȂÂׂĂ̈̔ԍЂƂオ(Ȃ
  AƂƍŏɂ͐VɑƂȂAȉɑ)B
  C^[v^̃[h́A Linux ̎st@C[h@
  łBLinux ́Asɐ܂ŁAX̃oCitH[}bg
  ԂɎB܂A_Iɂ́A̃C^[v^ƃoCitH
  [}bgpӂĂāALinux ̃oCitH[}bgnh
  _ȃ\tgEFAɂ邱Ƃ\Ȃ̂łB

  (-- (r1)REVIEW NOTE: XbsO(SWAPPING)Ԃ͂킴ƏȂBg
  ĂƂ͎vȂ炾B
  (r2)؂̎ɗႦƁAJ[l͒S̐Hׂ镔łAVF
  ̎͂ŁAC^[tFCX񋟂ĂB--)

  6.  vZXԒʐM̎dg

  vZX́ÃvZXJ[lƑ݂ɒʐM邱ƂŁA̍Ƃ
  }ĂBLinux ł́A̃vZXԒʐM(Inter-Process
  Communication, IPC)̃JjYT|[gĂBVOiƃpCv
  ͂̓T^ł邪ALinux  System V IPC JjYT|[gĂ
  BSystem V IPC Ƃ̂́AUnix ̓Y[Xŏ߂ēoꂵ
  炻̖tĂB

  6.1.  VOi

  VOíAUnix VXeŎgpłÂvZXԒʐM̕@ł
  BVOíAЂƂȏ̃vZXɑ΂Ĕ񓯊Cx
  g(asynchronous events)`B邽߂ɎgpBVOi
  ̂́AL[{[h荞݂AvZXzɑ݂
  ꏊɃANZX悤ƂăG[NƂȂǂłBVOíA
  VFqvZXɑ΂ăWu̐M`BƂɂp
  B

  A̒`ς݃VOiA̓J[lɂĐ邪A
  ^ĂȂAVXẽJ[lȊÕvZXł
  \łBkill R}h (kill -l) gp΁AVXeŗp
  \ȃVOĩXg𓾂邱ƂłB킽 Intel  Linux {b
  NXł͎̂悤Ȍʂ\ꂽB

   1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
   5) SIGTRAP      6) SIGIOT       7) SIGBUS       8) SIGFPE
   9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
  13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
  18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
  22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
  26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
  30) SIGPWR

  VOi̔ԍ́AAlpha AXP  Linux {bNXł͈قȂ̂ɂȂB
  vZX́AꂽVOȋ啔𖳎邱Ƃł邪Aӂ
  LȗOBvZX̎s~ SIGSTOP VOiƁA
  vZXI SIGKILL VOiłA͖łȂB
  ȊOɂẮAvZXlXȃVOiǂ邩őI
  łBvZX̓VOiubN邱Ƃł邪AubNȂ
  ꍇ́Agŏ邩A邢̓J[lɏĂ炤Ƃ
  BJ[lVOiꍇÃVOivftH
  g̍sׂsBƂ΁AvZX SIGFPE (floatin point
  exception)VOi󂯎ۂ̃ftHg̍śׂAcore dump s
  ďI邱ƂłBVOiɂ́AݓIȑΓID揇ʂƂ
  ͂ȂBЂƂ̃vZXɑ΂Ăӂ̃VOiɐꂽ
  A炪vZXɓn鏇ԂAvZXׂԂ܂
  ĂȂB܂Aނ̏dVOi郁JjYƂ
  ݂ȂBvZX́A SIGCOUNT ЂƂ󂯎̂A
   42 󂯎̂ƂƂ`ׂ@ȂB

  Linux ̃VOi̎ł́AvZX ``task_struct'' \̂ɕۑ
  ꂽ񂪗pBT|[gVOi̐́AvZbT̃[
  h(``word'')TCYɐĂB 32 rbg̃[hTCYv
  ZbT́A32 ̃VOiƂo邪AAlpha AXP ̂悤 64
  rbgvZbTł 64 ܂łłB܂̍ςłȂVOi
  ́Atask_struct  ``signal'' tB[hɕۑA``blockd'' tB[
  hɃubNꂽVOĩVOi}XN(``signal mask'')ێ
  B SIGSTOP  SIGKILL āAׂẴVOi̓ubN邱
  łBubNꂽVOiƁA̓ubN
  ܂ŖԂɗ܂B܂ALinux ́AX̃vZX󂯎邩
  ȂVOiǂ̂ɊւێĂ
  ̂Ȁ ``sigaction'' f[^\̂̔zɕۑAX
  vZX task_struct f[^\̂ɂă|CgĂB
  OɂAtask_struct ɂ́AVOi郋[`̃AhXA
  ̓tÔꂩ܂܂ĂBtOgꍇAvZX́AY
  VOi𖳎邩ÃVOȉJ[lɑs邩
  tOɂ Linux ɓ`BvZX́AVXeR[găVO
  iɑ΂ftHgύX邱ƂłÃVXeR[
  ēK؂ȃVOiɊւ sigaction \̂ύXAblockd }X
  Nω肷B

  VXȇSvZX̂ǂ̃vZXɂVOi𑗂Ƃ킯
  ł͂ȂAJ[lƃX[p[[Uɂ͂ꂪ\łBʏ̃vZ
  X́A uid  gid vZXAvZXO[vɑv
  ZXɂ̂݃VOi𑗂B``(r1)'' VOi̐
  ́A``task_struct''  signal tB[hɂK؂ȃrbgZbg
  ƂɂׂBvZXVOiubNĂ炸Aҋ@
  荞݉\(INTERRUPTIBLE )ԂɂꍇÃvZX́Aڂo
  ܂Ďs(RUNNING)ԂɒuAsL[֓o^āA̓o^
  mFBɂāAXPW[́AVXe̎̃XPW[
  āÃvZXš҂ƌȂBftHg̏Kvȏ
  A Linux ͂̃VOȉœKłBƂ΁AVOi
  SIGWINCH (X Window ̃tH[JXύX)Aɑ΂ăftHg
  ̃nhgpꍇ́ÃnhɂēK؂ȏȂ
  ̂ŁAȊO̓ʂȏ͂ȂȂB
  VOi͐ĂɃvZXɓn킯ł͂ȂB̓v
  ZXĂюs܂ő҂Ȃ΂ȂȂBvZXVXeR[
  ɂďIƂ͂łA``signal''  ``blocked'' tB[h
  `FbNAvZX\߃ubNĂȂVOi݂
  ́A̎_ł悤₭vZXɃVOinƂłB͔
  ɐM̒Ⴂ@Ɏv邩ȂAVXêׂẴv
  ZX́AnIVXeR[𔭂āAƂ΁A[ɕ񂾂
  Ă̂ŁAdg݂͂ނ𓾂Ȃ̂łBAvZX
  ́A]ޏꍇ́AVOi҂̏ԂɂȂ邱ƂłB̏
  AVOi܂ŁA荞݉\ȃTXyhԂƂȂB
  ہALinux ̃VOĩR[h́A݃ubNĂȂVOi
  󂯎邽тɁA``sigaction'' \̂𒲂ׂB

  vZX̃VOinhftHgɃZbgĂꍇAJ[l
  ̃VOiBSIGSTOP VOĩftHg̃nh́A
  ݂̃vZX̏Ԃ~(STOPPED)ƂAXPW[NĐV
  vZXsBSIGFPE VOĩftHg̏́ÃvZ
  X core dump AIB΂ɁAvZXg̃V
  Oinhw肷邱ƂłB́ÃVOi
  ƕKĂяo郋[`ƂȂA``sigaction'' \̂̃[`
  AhXێB̏ꍇAJ[l̓vZX̃VOi[`
  ĂяoȂ΂Ȃ炸ǍĂяo@̓vZbTɌŗL̂̂ł
  邪AׂĂ CPU ΏȂ΂ȂȂƂāAJ[l[h
  ŎsĂJgvZX́AJ[lVXe[`Ăяo
  ̃[U[h̃vZXւƖ߂낤ƂĂƂƂłB
  ̖邽߂ɁAvZX̃X^bNƃWX^삳Bv
  ZX̃vOJE^ɂ́ÃVOi[`̃AhXݒ
  Ã[`ւ̃p[^R[t[ɕt邩AWX
  ^ɓnBvZXĂюsJnƂAVOi[`
  ʏʂĂяoꂽ̂悤ɌB

  Linux  POSIX ɏĂ̂ŁAvZX́ÃVOi[
  `ĂяoꂽƂÃVOiubN邩ǂw肪ł
  B́AvZX̃VOi[`̌ĂяoȂĂԂ
  ubN}XNύX邱ƂӖBVOi[`I
  ÃubN}XN̒l͌ɖ߂Ȃ΂ȂȂB
  āALinux ́AЂÂp̃[`(tidy up routine)ւ̃R[ǉ
  āÃ[`VOi󂯎vZX̃R[X^bÑu
  bN}XNɖ߂B܂ALinux ́ÃVOi[`̌
  яoKvȏꍇAX^bNɐςłāAЂƂ̏[`
  I玟̃[`ĂяoJԂāAŌɕЂÂ[
  `ĂяoƂ@łœKĂB

  6.2.  pCv

  ʓI Linux VF́Aׂă_CNV(redirection)T|[g
  ĂBƂ΁Â悤ȃ_CNVB

       $ ls | pr | lpr

  L̗ł́AfBNg̃t@C\ ls R}h̏o͂p
  CvāApr R}h̕W͂ɐUāApr Ƀy[W
  BāÃR}ho͂pCvāAlpr R}h̕W
  ɐUāAftHgv^ł̌ʂvgĂB
  킿ApCvƂ́AvZX̕Wo͂ʂ̃vZX̕W͂ւƌq
  AЕoCgXg[łB̏ꍇAǂ̃vZX
  _CNVӎAʏʂɐU镑BvZXԂɂ
  ꎞIȃpCvݒ肷̂̓VF̖ڂłB

   vZX 1                             vZX 2

      file                                  file
  +-----------+                         +-----------+
  | f_mode    |                         | f_mode    |
  |-----------|                         |-----------|
  | f_pos     |                         | f_pos     |
  |-----------|                         |-----------|
  | f_flags   |                         | f_flags   |
  |-----------|                         |-----------|
  | f_count   |                         | f_count   |
  |-----------|                         |-----------|
  | f_owner   |      +---------------+  | f_owner   |
  |-----------|      |               |  |-----------|
  | f_inode   |---+  |    inode      |  | f_inode   |-----+
  |-----------|   |  |  +---------+  |  |-----------|     |
  | f_op      |-+ |  +->|         |  |  | f_op      |--+  |
  |-----------| | +---->|         |  |  |-----------|  |  |
  | f_version | |       |         |  |  | f_version |  |  |
  +-----------+ |       |         |  |  +-----------+  |  |
                |       |         |  |                 |  |
                |/      +---------+  +-----------------+--+
                *               |                      |
              pCv            |       f[^y[W   |
                        |       +-----------+  |
              샋[`      |       |           |  |/
                                +------>|           |  *
                                        |           | pCv
                                        |           | ǂݏo
                                        |           | 샋[`
                                        |           |
                                        |           |
                                        |           |
                                        +-----------+

  }\(5.1) pCv

  Linux ɂāApCv̎ɂ́Aӂ ``file'' f[^\̂gp
  B̂镨y[W|Cg VFS inode ꎞIɍ
  āAӂ̍\̂œɃ|CĝłB}\(5.1)
  ́Aꂼ file f[^\̂At@C샋[`̔z̈قȂ
  vf|CgĂlqĂBЂƂ́ApCvւ̏
  łAЂƂ́ApCv̓ǂݏołB
  [see: include/linux/inode_fs_i.h](}}) (: pipe_fs_i.h H)
  ̕@ł́Aʏt@Cւ̏ݏƓǂݏoėpVX
  eR[ԂɂbIȈႢ͉BB݃vZXpCv
  ނƂAoCg͋Lf[^y[WɃRs[AǂݏovZX
  pCvǂݏoƂ́AoCg񂪂̋Lf[^y[WRs[
  BLinux ́ÃpCvւ̃ANZX𓯊Ȃ΂Ȃ
  BLinux ́ApCv̓ǂݏoƁAւ݂̏Ƃmɕ
  킹悤ɂȂ΂Ȃ炸Â߂ Linux ́Ab
  N(``lock'')҂s(``wait queue'')VOi(signal)Ƃdg
  𗘗pĂB

  ݃vZXpCvɏƂƂ́AW̏݃Cu
  ֐gpB̊Ԃł肳t@CfBXNv^
  ׂāA݃vZXA ``file'' f[^\̂ւ̃Cfb
  NXƂȂĂāAX̍\̂I[vꂽt@CȀꍇ
  ɂ̓I[vꂽpCv\ĂB Linux ̃VXeR[gp
  鏑݃[`́ÃpCvLq file f[^\̂ɂă|
  Cgꂽ[`łB݃[`ݗv
  ɗṕÃpCv\ VFS ``inode'' ɕێꂽł
  B
  [see: pipe_write(), in fs/pipe.c]
  pCv֏ƂSoCgʂێ邾̋󂫂Ly[W
  ݂ApCvǂݏovZXɂăbNĂȂꍇALinux
  ͏݃vZX̂߂ɂ̃pCvbNāA܂ׂoC
  g݃vZX̃AhXԂ狤Lf[^y[WɃRs[B
  pCvǂݏovZXɂăbNĂ邩Af[^ێ[
  ȋ󂫃Xy[X݂Ȃꍇ́Ã݂vZXpCv inode 
  ҂sŃX[vԂɂAXPW[ĂяoāÃvZ
  XsB݃vZX͊荞݉\ł̂ŁAVOi̎
  M\łB݃vZX́Af[^݂̂߂̏[ȃXy[
  Xmۂ邩pCṽbNꂽƂɁAǂݍ݃vZX
  ăX[vԂNBf[^܂ƂApCv
  VFS inode ̃bN͉A inode ̑҂sŃX[vԂ
  ȂĂǂݏovZX΁AǂݏovZXɂĖڂ
  o܂B

  pCṽf[^̓ǂݏóA݃vZXƔɂ悭ĂB
  [see: pipe_read(), in fs/pipe.c]
  vZX́AubLOȂǂݏo(non-blocking read)邱Ƃ
  B(́AvZXt@CpCvI[vƂ̃[
  hɈˑB)āȀꍇAǂݏoׂf[^ȂApCv
  bNĂꍇ́AG[ԂB́ÃvZXs
  pł邱ƂӖBȊO̕@ƂāApCv inode ̑҂
  sŋx~āA݃vZX̏I҂Ƃ\łB
  vZXpCvIƁApCv inode Ƃ̋Lf[^y[
  WƂ͔jB

  Linux ́AOtpCvT|[gĂBpCv͐o(First
  In, First Out)̌ŏŝŁAOtpCv FIFO ƂĂ΂
  BpCvɏ܂ꂽŏ̃f[^́ApCvǂݏoŏ̃f
  [^ƂȂBʏ̃pCvƂ͈قȂAFIFO ͈ꎞIȃIuWFNgł͂
  At@CVXe̎̂łAmkfifo R}hɂč쐬\
  łBvZX́Aɑ΂K؂ȃANZXAR
  FIFO 𗘗p邱ƂłBFIFO I[v@́Aʏ̃pCv
  Ƃ͏قȂBʏ̃pCv(ӂ file f[^\́AVFS inode
  Ƃ̋Lf[^y[W̃Zbg)͕KvɉĈꎞIɍ쐬邾
  AFIFO ͂łɑ݂̂łA[UɂăI[vAN
  [YBLinux ́A݃vZX FIFO I[vOɓǂݏo
  vZXɂI[vA݃vZXɏł
  OɓǂݏovZXǂ߂Ԃɂ悤A𑀍삵Ȃ
  ΂ȂȂBAƂƁAFIFO ̏́Aʏ̃pC
  v̏@ƂقƂǑSłA҂͓f[^\ƏJj
  YgĂB

  6.3.  \Pbg

  REVIEW NOTE: Add when networking chapter written.

  6.3.1.  System V IPC ̃JjY

  Linux ́AUnix System V (1983) ŏ߂ēoꂵvZXԒʐM(IPC)̎d
  g݂ 3 ރT|[gĂB́AbZ[WL[(message
  queue)AZ}tH (semaphore)AċL(shared memory)łB
   System V IPC ̎dgׂ݂͂ċʂ̔Fؕ@𗘗pĂBv
  ZXL\[XɃANZXł̂́AVXeR[oRŃJ[l
  ɑ΂ăj[NȎQƎʎq (reference identifier)nꍇ
  B System V IPC IuWFNgւ̃ANZX`FbNꍇ
  ɂ́AANZXp[~bVgp邪A̓t@Cւ̃ANZX
  `FbNɗގ̂łBSystem V IPC IuWFNgւ̃ANZX
  ́ÃIuWFNg̍쐬҂ɂăVXeR[oRŐݒ肳B
  X IPC JjÝAIuWFNg̎QƎʎqA\[Xe[u
  ւ̃CfbNXƂėpĂBA͒PȃCfbNX
  ͂ȂÃCfbNX쐬ɂ͑̑KvƂB

  Linux VXe System V IPC IuWFNg\ׂẴf[^\
  ́A ``ipc_perm'' \̂܂܂ĂBāA̍\̂ɂ́ÃI
  uWFNg̏LvZXэ쐬vZX̃[U ID ƃO[v ID 
  ܂܂B
  [see: include/linux/ipc.h]
  ܂Aipc_perm ɂ́ÃIuWFNgւ̃ANZX[h(LҁAO[
  vȂ) IPC IuWFNgL[(``key'')܂܂ĂBL[
  ́ASystem V IPC IuWFNg̎QƎʎqTiƂĎgpB
  T|[gĂL[ɂ́AvCx[g(private)ƃpub
  N(public)̓ނBL[pubN̏ꍇAǂ̂悤ȃvZX
  AANZX`FbNꂽA System V IPC IuWFNg̎Q
  ʎq邱ƂłB System V IPC IuWFNǵAL[ł͎Q
  ƂłȂ悤ɂȂĂāA̎QƎʎqł̂ݎQƂ\ƂȂĂ
  B

  6.3.2.  bZ[WL[

  bZ[WL[(message queue)Ƃ́AЂƂȏ̃vZXbZ[W
  ŁAЂƂȏ̓ǂݏovZXɂēǂݏoƂ
  \ɂdg݂łBLinux ́AbZ[WL[̃Xg ``msque''
  zɂĊǗĂB̔žX̗vf́A ``msqid_ds'' f[^
  \̂|CgĂāA̍\̂X̃bZ[WL[SɋL
  qĂBbZ[WL[쐬ƂAV msqid_ds f[^\
  ̂VXe犄蓖ĂAẑȂɑ}B
  [see: include/linux/msg.h]

     msqid_ds
  +--------------+
  |              |
  |  ipc         |
  |              |
  |--------------|
  |              |
  |--------------|
  |  *msg_last   |                msg                      msg
  |--------------|            +------------+            +-----------+
  |  *msg_first  |----------->| *msg_next  |----------->| *msg_next |
  |--------------|            |------------|            |-----------|
  |              |            | msg_type   |            | msg_type  |
  |  times       |            |------------|            |-----------|
  |              |            | *msg_spot  |            | *msg_spot |
  |--------------|            |------------|            |-----------|
  |  *wwait      |            | msg_stime  |            | msg_stime |
  |--------------|            |------------|            |-----------|
  |  *rwait      |            | msg_ts     |            | msg_ts    |
  |--------------|       *    |------------|       *    |-----------|
  |              |      /|    |            |      /|    |           |
  |--------------|       |    |            |       |    |           |
  |  msg_qnum    |       |    |            |       |    |           |
  |--------------|     msg_ts |  message   |     msg_ts |  message  |
  |              |       |    |            |       |    |           |
  +--------------+       |    |            |       |    |           |
                         |/   |            |       |/   |           |
                         *    +------------+       *    +-----------+

                              <---------------- msg_qnum ----------->

  }\(5.2)System V IPC bZ[WL[

  X ``msqid_ds'' \̂ɂ́A``ipc_perm'' f[^\̂Ƃ̃L[
  ɓꂽbZ[Wւ̃|C^܂܂ĂBɁALinux ́A
  L[̕ύXԂL^ĂAƂ΂̃L[ɏ݂Ȃꂽ
  Ō̎ԂƂێĂBmsqid_ds ɂ́Aӂ̑҂s
  ܂܂ĂāAꂼꃁbZ[WL[ւ̏݃vZXɑ΂
  ̂ƓǂݏovZXɑ΂̂ƂȂĂB

  vZX݃L[ɃbZ[WƂƂ͂A
  ̎[U ID ƎO[v ID ƂÃL[ ipc_perm f[^\
  ̂ɂ郂[hƔrBvZX̃L[ɏ݉\ȏ
  AbZ[ẂÃvZX̃AhXԂ ``msg'' f[^\
  ւƃRs[ÃbZ[WL[̍ŌɒuBX̃bZ[W
  ɂ́AvZXԂōӂꂽAvP[VŗL̃^C
  v(type)^OtBALinux ́A݉\ȃbZ[W
  ƒ𐧌Ă̂ŁAbZ[W݂̏̍ۂɗeʂȂ
  B̏ꍇÃvZXYbZ[WL[̏
  L[ɉAXPW[ĂяoāAVvZXs
  BāA̃bZ[W̃bZ[WL[ǂݏoꂽ
  ƂɁAقǂ̃vZXNB

  L[̓ǂݏol̉ߒHBēxA݃L[ɑ΂v
  ZX̃ANZX`FbNBǂݏovZX́AbZ[W̃^
  CvɊ֌WȂL[̍ŏ̃bZ[W擾邩Ã^Cṽb
  Z[WI邩̂ꂩI邱ƂłBIɍv
  bZ[WȂꍇAǂݏovZX̓bZ[WL[̓ǂݏo҂
  sɉāAXPW[sBVbZ[WL[
  ܂ƁÃvZX͋NčĂюsB

  6.3.3.  Z}tH

  łPȌ`ōlƁAZ}tHƂ́ÃvZXɂAl
  eXg (test)Zbg(set)肷邱Ƃ\ȁȀꏊ
  BeXgƃZbg̑́AX̃vZXɊւA荞݂
  ȂA͑̃vZX犱󂯂Ȃ(atomic)łB
  킿AvZXn߂Ƒ̃vZX~߂邱Ƃ
  łȂBeXgƃZbg̑̌ʂ́ÃZ}tȞ݂̒lƃZbg
  lƂ̘aƂȂBZbgĺȀꍇ̏ꍇBeXg
  ƃZbg̑̌ʂɂẮAvZXÃvZXɂăZ
  }tH̒lύX܂ŁAx~Ȃ΂ȂȂꍇNBZ}
  tH́Aɏdvȃ̈쐬Ƃɗp邱ƂłA
  xɒP̃vZXsׂɏdvȃR[ḧ̗o
  ƂłB

  Ƃ΁Aē̃vZXA͒P̃t@C
  ݍ񂾂Aɏ񂾂肵ĂƂBāÃt@Cւ
  ANZXƎvĂƂB̏ꍇAZ}tHg
  Al 1 ɐݒ肵At@CR[h̒ɁAӂ̃Z}tH
  R[hBЂƂ́AZ}tH̒leXgāA̒l 1 
  ́AЂƂ́AZ}tHleXgĒl 1 𑫂̂ł
  Bt@CɃANZXŏ̃vZX́AZ}tH̒l 1 
  ƂAɐ΃Z}tH̒l 0 ɂȂB̃vZX͏
  āAf[^t@Cgp邪ÃvZXg
  văZ}tH̒l 1 ƂĂǍʂ -1 ɂȂĂ
  ̂ŎsB̃vZX́Aŏ̃vZXf[^t@C̎gp
  I܂ŁA~ԂɂȂBŏ̃vZXf[^t@C̎gpI
  AZ}tH̒l 1 𑫂āA1 ɖ߂B̎_ŁAҋ@Ăv
  ZXNāA̓Z}tHl 1 𑫂(: -1 H)Ƃɐ
  B

                                   +-------+
                          +------->|       |  Z}tHz
                          |        |-------|
       semid_ds           |        |       |
  +------------------+    |        |-------|
  |                  |    |        |       |
  | ipc              |    |        |-------|
  |                  |    |        |       |
  |------------------|    |        |-------|
  |                  |    |        |       |
  | times            |    |        |-------|
  |                  |    |        |       |
  |------------------|    |        +-------+
  | sem_base         |----+                       sem_queue
  |------------------|                           +---------+
  | sem_pending      |-------------------------->| next    |
  |------------------|                           |---------|
  | sem_pending_last |     sem_undo              | prev    |
  |------------------|  +-----------+            |---------|
  | undo             |->| proc_next |            | sleeper |
  |------------------|  |-----------|            |---------|
  | sem_nsems        |  | id_next   |            | undo    |
  +------------------+  |-----------|            |---------|
                        | semid     |            | pid     |
                        |-----------|  +------+  |---------|
                        | semadj    |->|      |  | status  |
                        +-----------+  |      |  |---------|
                                       |      |  | sma     |
                                       |      |  |---------|  +------+
                                       |      |  | sops    |->|      |
                                       |      |  |---------|  |      |
                                       |      |  | nsops   |  |      |
                                       +------+  +---------+  |      |
                                                              |      |
                                                              |      |
                                                              |      |
                                                              +------+

  }\(5.3)System V IPC Z}tH

  System V IPC Z}tHIuWFNǵAꂼꂪZ}tHzLq
  A Linux ́A``semid_ds'' f[^\̂gpĂ\B
  [see include/linux/sem.h]
  VXêׂĂ semid_ds f[^\̂́A ``semary'' Ƃ|C
  ^̔zɂă|CgĂBX̃Z}tHz
  ́A``sem_nsems'' ̗vfAeX̃Z}tHz̗vf́A``sem''
  f[^\̂ɂLqĂāAsem \̂ ``sem_base'' ɂă|
  CgĂB System V IPC Z}tHIuWFNg琬Z}tHz
  ̑Ă邷ׂẴvZX́AVXeR[𐶐āA
  𑀍삷BVXeR[͑̑w肷邱Ƃł邪A
  X̑́AZ}tHCfbNX(semaphore index)AIy[V
  l(operation value)AшÃtO(a set of flag)Ƃ 3 ̓
  ͍ڂɂċLqBZ}tHCfbNXƂ́AZ}tHzւ̃C
  fbNXłAIy[VlƂ́AZ}tȞ݂̒lɉׂ
  lłB Linux ͂܂AׂĂ̑삪ǂeXg
  B삪̂́AZ}tȞ݂̒lɃIy[Vll
  [傫A̓Iy[VlƃZ}tȞ݂̒l̗
  [̏ꍇ̂ꂩłBZ}tH삪ЂƂłsꍇŁA
  ̃vZXubNȂ (non-blocking)VXeR[Iy[
  VtOvȂꍇALinux ́AvZXTXyhBv
  ZXTXyhԂɂȂƁALinux ͎sׂZ}tH̏
  (state)ۑāÃ݂vZX҂s(wait queue)ɒuȂ
  ΂ȂȂB̏́AX^bN ``sem_queue'' f[^\̂쐬
  āAKvȏނƂɂĂȂBV sem_queue f[^
  \̂́ÃZ}tHIuWFNg̑҂s̍ŌɒuB(̍
  ́A``sem_pending''  ``sem_pending_last'' |C^gpB) 
  ݂̃vZX́Asem_queue f[^\̂̑҂s(x~Ԃ)u
  AXPW[ĂяoāÃvZXsB

  Z}tH삪ׂĐÃ݂vZX~KvȂ
  ΁A Linux ͏pAZ}tHz̓K؂ȃo[ɂ̑K
  pB̎_ŁALinux ́A҂Ԃ~ԂɂvZXꂼ
  ̃Z}tHKpł邩ǂ`FbNBLinux ́A샋[
  `̃yfBOL[(pending queue)(``sem_pending'')̃o[
  ԂɌāA͂̃Z}tH삪邩ǂeXg
  BꍇALinux ́AyfBOXg炻 sem_queue f[
  ^\̂폜āAZ}tHzɂ̃Z}tHKpB Linux
  ́Ax̃vZXNāAɃXPW[sƂɍĎn
  悤ɂBLinux ́AyfBOXgŏ珇ɒׂ
  āAKpłZ}tH삪ȂAȏvZXNȂ
  Ȃ܂ł𑱂B

  Z}tHɂ́AfbhbNƂ肪BꂪN̂́Av
  ZXAdvȃ̈ɓƂ̂ɁANbV邩 kill 
  ĂoȂȂAZ}tHlύXꂽ܂܂ɂȂꍇł
  BLinux ͂h~邽߂ɁAZ}tHzɑ΂钲
  (adjustment)XgǗĂB̃ACfÁAZ}tHzɒ
  KpƁAZ}tHANvZX̑삪KpO
  ̏(state)ɖ߂ƂƂłB̒́A``sem_undo''
  f[^\̂ɕۑĂāA ``semid_ds'' f[^\̏̃L
  [Ƃ̃Z}tHzgvZX ``task_struct'' f[^\
  ̃L[ƂɒuB

  X̃Z}tH́Â߂̃f[^ǗȂ邳邱Ƃ
  ɗvꍇBLinux ́AX̃Z}tHzɂāAvZX
  őЂƂ ``sem_undo'' f[^\̂ǗȂBv
  vZXЂƂĂȂꍇ́AKvȂƂɂЂƂ̃f[
  ^\̂쐬BV ``sem_undo'' f[^\̂́ÃvZX
   ``task_struct'' f[^\̏̃L[ƁAZ}tHz
  ``semid_ds'' f[^\̏̃L[ƂɓBZ}tH삪Z}
  tHz̃Z}tHɑ΂ēKpƂAIy[Vl𐳕tɂ
  lÃvZX sem_undo f[^\̒ (adjustment)z̒
  ɂZ}tHGg[ɉB䂦AIy[Vl 2
  ̏ꍇA-2 ̃Z}tH̒GgɉB

  vZXIč폜ƂALinux ́ÃvZX
  ``sem_undo'' f[^\̂̃Zbg𒲍āAZ}tHzɑ΂钲
  KpBZ}tHZbg폜ꂽꍇAsem_undo f[^\̂́A
  vZX ``task_struct'' ̃L[Ɏc܂܂ɂȂ邪AZ}tHz
  ̎ʎq͖ɂȂB̏ꍇAZ}tHЂÂ(clean up)R[hA
  Pɂ sem_undo \̂jB

  6.3.4.  L

  L(shared memory)́AvZX̉zAhXԂ̔Cӂ̏ꏊ
  oRāÃvZXʐM邱Ƃ\ɂdg݂łBL
  鉼z̃y[ẂAX̋LvZX̃y[We[uɂy
  [We[uGgɂĎQƂBLy[ẂAׂẴv
  ZX̉z̓AhXɂȂĂ悢BSystem V IPC ̃Iu
  WFNggꍇׂ͂āALGAւ̃ANZX́AL[ƃAN
  ZX̃`FbNɂĐ䂳ĂB(ȃANZXɂ)
  񃁃LꂽȂAvZXgp@̓`FbN
  Bւ̃ANZX̓ƂƂ́A̎dg݁AƂ
  ΁A System V ̃Z}tHȂǂ̎dg݂ɈˑȂ΂ȂȂB

    shmid_ds
  +------------+
  |            |
  | ipc        |
  |            |
  |------------|
  | shm_segsz  |    +------+
  |------------| +->| pte  |
  |            | |  |------+
  |            | |  | pte  |
  | times      | |  |------|
  |            | |  |      |
  |            | |  |      |
  |------------| |  |      |
  | shm_npages | |  |------|
  |------------| |  | pte  |
  | shm_pages  |-+  +------+   vm_area_struct         vm_area_struct
  |------------|             +----------------+     +----------------+
  | attaches   |------------>|                | +-->|                |
  +------------+             |                | |   |                |
                             |                | |   |                |
                             |----------------| |   |----------------|
                             | vm_next_shared |-+   | vm_next_shared |
                             |----------------|     |----------------|
                             |                |     |                |
                             |                |     |                |
                             |                |     |                |
                             +----------------+     +----------------+

  }\(5.4) System V IPC L

  V쐬ꂽX̋LGÁA``shmid_ds'' f[^\̂
  ĕ\B́A``shm_segs'' zɕۑB
  [see: include/linux/sem.h](: include/linux/shm.hH)
  shmid_ds f[^\̂́A̋L̃GȂ傫Agp
  vZX̐Aт̋LvZX̃AhXԂɃ}bv
  ĂlqɊւLqĂB̃ւ̃ANZXA
  L[pubNL[vCx[gL[Ǘ̂́A̋L
  ̍쐬҂łBvZXK؂ȃANZXĂȂAL
  𕨗 ``bN''邱ƂłB

  L悤ƂX̃vZXAȂ̉zɋL̈
  t(attach)ꍇ́AVXeR[𗘗pȂ΂ȂȂB
  āÃVXeR[ɂ ``vm_area_struct'' f[^\̂쐬
  AꂪvZX̋LLqBvZX́AL
  ̉zAhXԓ̂ǂɒu邩I邱Ƃł邪A[
  L̋̈̊mۂ Linux ɔC邱ƂłBV vm_area_struct
  \̂́Avm_area_struct ̃Xgɑ}A``shmid_ds'' ɂă|C
  gB ``vm_next_shared''  ``vm_prev_shared'' |C^A
  N邽߂ɎgpBL̈́Azɒt
  ꂽ(attach)Ŏۂɕɍ쐬킯ł͂ȂBvZ
  XŏɂɃANZX悤ƂƂA߂č쐬B

  ߂ăvZXL̃y[ŴЂƂɃANZXƂ́Ay[W
  tHgBLinux ̃y[WtHgƂAvZX
  ́ALLq ``vm_area_struct'' f[^\̂𔭌B
  ̍\̂ɂ́A̋L̃^Cvɍ킹[`ւ̃|C^
  ܂܂ĂBLy[WtHgR[h́A
  ``shmid_ds'' ɑ΂y[We[uGg̃XgTāALz
  ̊Yy[WɊւGg邩ǂmFB݂
  ȂȂAy[W蓖ĂāÂ߂̃y[We[uGg
  BJgvZX̃y[We[uɂ̃GgtƓ
  ɁAshmid_ds ɂꂪۑBȂ킿AĂ΁Ã
  ɃANZX悤Ƃ鎟̃vZXy[WtHgNƂA
  LR[h͂̐V쐬ꂽy[W̃vZX̂
  ߂Ɏgpł킯łB䂦ALɃANZXŏ̃v
  ZXɂ蓖ĂƂŁÃvZXɂ邻Ȍ
  ̃ANZX́A̕y[W̃vZX̉zAhXԂɕt
  邾ōςނ悤ɂȂB

  vZX͂≼z̋LKvƂȂȂƂAvZX͎
  Ȃ̉z炻̗̈O(detach)B̃vZX܂̃
  gpĂAO(detach)̓JgvZXɂe
  ȂB ``vm_area_struct'' ́A``shmid_ds'' f[^\̂폜
  ABJgvZX̃y[We[uAbvf[gA
  LĂz̃GA͖ɂBLĂŌ
  ̃vZXL̈O(detach)ƂAɂ鋤L
  ̃y[W͉A̋LɊւ shmid_ds f[^\̂
  B

  LzɃbNȂƂ́AɕGȂƂN
  B̏ꍇAL̃y[ẂȀԂ́AV
  XẽXbvfBXNɃXbvAEgBL
  XbvAEgXbvC@́A``uǗv''̏͂
  ĂB

  (-- (r1)vZXO[vɂāA邱ƁB(: ̂܂܂
  B)--)

  7.  PCI

  PCI (Peripheral Component Interconnect)Ƃ́A̖O番悤
  ɁAӋ@(peripheral)ƃVXe̐ڑ@ɂāA\Ɛ@
  KiłB̋Ki(``[3, PCI Local Bus Specification]'') 
  ́AVXe̋@dCIɐڑ@ƁA炪U镑ׂ@
  ƂqׂĂB̏͂ł́ALinux J[lVXe PCI oX
  foCX@ɂĐB

                              +-------------+
                              |             |
                              |     CPU     |
                              |             |
                              +------+------+
                                     |                     PCI Bus 0
  ---------+----------------+--------+--------+-----------------------
           |                |                 |
           |                |                 |          *
     +-----+-----+     +----+----+      +-----+-----+   /| Upstream
     |           |     |         |      |           |    |
     |  PCI-ISA  |     |         |      |  PCI-PCI  |    |
     |  Bridge   |     |         |      |  Bridge   |
     |           |     +---------+      |           |    | Downstream
     +-----+-----+        Video         +-----+-----+    |
           |                                  |          |/
           |                                  |          *
           | ISA Bus                          |            PCI Bus 1
   ------+-+------------   ----------+--------+---------+-------------
         |                           |                  |
         |                           |                  |
    +----+----+                 +----+----+        +----+----+
    |         |                 |         |        |         |
    |         |                 |         |        |         |
    |         |                 |         |        |         |
    |         |                 |         |        |         |
    +---------+                 +---------+        +---------+
   Super I/O Controller            SCSI              Ethernet

  }\(6.1) PCI oXVXe̗

  }\(6.1) ł́APCI x[X̃VXe_Iȃ_CAOŎĂ
  B PCI oX PCI-PCI ubWƂ́AVXe@𑊌݂ɐڑdg
  (glue)łB CPU ́ArfIfoCXƈꏏɃvC} PCI oXł
   PCI Bus 0 ɐڑĂBʂ PCI foCXł PCI-PCI u
  bWAvC}oXZJ_ PCI oXł PCI Bus 1 ɐڑ
  ĂBPCI Ki̐pł́A PCI bus 1 ́APCI-PCI ubW̉
  (downstream)łAPCI Bus 0  PCI-PCI ubW̏㗬(up-stream)
  BZJ_ PCI oXɂ́AVXe SCSI ƃC[TlbgfoCX
  ڑĂBIɂ́AubWƃZJ_ PCI oXƂӂ
  foCX́A炪gݍ킳A PCI J[hɂׂĊ܂܂Ă
  BVXe PCI-ISA ubẂAȈ╨ ISA foCXT|[
  ĝłB܂̃_CAOł́ASuper I/O `bvRg[
  Ă邪A̓L[{[h}EXAtbs[𐧌䂷R
  g[łB ``(r1)''

  7.1.  PCI AhX

  CPU  PCI foCXƂ́A҂ŋLꂽɃANZXKv
  B̃́AfoCXhCo PCI foCX𐧌䂵A
  ̊Ԃŏ肷邽߂ɎgpBʏ킻̋Lɂ́Afo
  CX̃Rg[WX^Xe[^XWX^̏񂪊܂܂B
  ̃WX^́AfoCX𐧌䂵ȀԂǂ݂Ƃ邽߂ɗp
  BƂ΁APCI  SCSI foCX (Rg[) p̃foCXhC
  óÃXe[^XWX^ǂŁASCSI foCX SCSI fBXN
  ubNޏoĂ邩𒲂ׂB邢́AfoCX
  dAfoCXhCóAfoCXN邽߂ɃRg[
  WX^ɏ݂肷B

  CPU ̃VXe̋L̑Ɏgp邱Ƃł邪A
  ƂȂƁAPCI foCXɃANZX邽
  ɁACPU ͈ꎞ~APCI foCX̎gpI܂ő҂Ȃ
  ΂ȂȂȂBւ̃ANZXAʏAxɂЂƂ̃VXe@
  ɌBāȀꍇAVXȅxxȂB
  AK؂ȊǗ@̂Ȃ܂܃VXe̎Ӌ@ɃCւ̃ANZ
  XƂ́A悢lƂ͂ȂB͔Ɋ댯ȏꍇB
  ȃfoCXVXesɂ邩łB

  Ӌ@͓Ǝ̃ԂĂāACPU ͂̋ԂփANZX
  BAfoCX̃VXeւ̃ANZX́ADMA(Direct
  Memory Access) `lgpČ䂳BISA foCX
  ́AISA I/O(Input/Output)Ԃ ISA Ԃ̂ӂ̃AhXԂ
  ANZXłBPCI ɂ͎OAPCI I/O Ԃ PCI ԁAPCI
  RtBO[V(configuration space) փANZXłB
  ׂẴAhXԂ CPU ANZX\łB̍ہACPU ́A
  foCXhCog PCI I/O Ԃ PCI ԂփANZX
  ALinux J[l PCI R[hg PCI RtBO[V
  ԂփANZXB

  Alpha AXP vZbT́A{AVXeAhXԈȊÕAhXԂ
  ̓ANZXłȂB䂦AAlpha AXP vZbT́AT|[g`bv
  gpāA PCI RtBO[Vԓ̑̃AhXԂɃANZX
  ĂBT|[g`bv́AXp[XAhX}bsOXL[
  (``sparse address mapping scheme'')gpāAȉzAhX
  Ԃ̈ꕔgA PCI AhXԂɃ}bvĂB

  7.2.  PCI RtBO[Vwb_

  31            16 15            0
  +---------------+--------------+
  |  foCX ID  |  x_ ID   |00h
  |---------------+--------------|
  |  Xe[^X   |   R}h   |04h
  |---------------+------+-------|
  |   NXR[h       |       |08h
  |-------+-------+------+-------|
  |       |       |      |       |10h
  |-------+-------+------+-------|
  |                              |
  |                              |
  |                              |
  |   x[XAhXWX^     |
  |                              |
  |                              |
  |                              |24h
  |------------------------------|
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |                              |
  |---------------+------+-------|
  |               | Line |  Pin  |3Ch
  +---------------+------+-------+

  }\(6.2) PCI RtBO[Vwb_

  PCI-PCI ubW܂ރVXêׂĂ PCI foCX́APCI R
  tBO[VAhXԓɐݒp̃f[^\ێĂBVX
  éAPCI RtBO[Vwb_(PCI configuration header)gp
  邱ƂŁAfoCXʂ䂵ĂB PCI RtBO[VA
  hXԓɂwb_̐mȈʒúÃfoCX PCI g|W
  [̂ǂɈʒu邩ɈˑBƂ΁APC ̃}U[{[ĥ
  PCI Xbgɍꂽ PCI rfIJ[h́ÃXbgԍ̈ʒuɃR
  tBO[Vwb_ƂɂȂAႤXbgɍĂ
  ΁Ãwb_́APCI RtBO[VAhXԂ̈Ⴄʒu
  ɂ邱ƂɂȂBAʒu͖ł͂ȂBƂ̂APCI
  foCXubWǂɂꍇłAVXéÃRtBO
  [Vwb_̃Xe[^XWX^ƃRtBO[VWX
  ^(configuration register)gpāAfoCXoAݒ肷邩
  B

  ʓIɌāAVXéAׂĂ PCI XbgA{[h̃Xb
  g̏ꏊɊ֘AItZbgʒu PCI RtBO[Vwb_
  悤ɐ݌vĂBāAƂ΁A{[h̍ŏ̃Xbg
  PCI RtBO[VAhXԂItZbg 0 ̈ʒuɎA
  ڂ̃Xbg̓ItZbg 256 ̈ʒuɎB(wb_́A256 oCg̃R
  tBO[VԂ̂ȂŁA擪 64 oCg߂ĂB) Ă
  ȍ~̃XbgɂĂlɂꂼ̏ꏊ߂ĂBVXe
  ŗL̃n[hEFÃJjY݌vꍇAPCI ݒR[hAׂ
   PCI oXɂ邷ׂĂ PCI RtBO[Vwb_𒲂ׂ邱
  łA̍ۂɁAwb_̃tB[h(ʏ̓x_ʃtB[h)ǂ
  ނƂŃG[擾邩ǂɂāAfoCX̃oXɂ
  ̂ǂmFł悤ɐ݌vȂ΂ȂȂBKi(``Ql
   3'')ł́A PCI Xbg̃x_ ID ƃfoCX ID ǂݎ낤
  ƂƂ́A0xFFFFFFFF ƂG[bZ[WԂĂ͂
  ƂLqĂB

  ``}\(6.2)''ł́A256 oCg PCI RtBO[Vwb_̃C
  AEgĂBɂ́Â悤ȃtB[h܂܂B
  [see: include/linux/pic.h]

     x_ ID (Vendor Identification)
         PCI foCX̐ЂŗL̐łBDEC  PCI x
        _ ID ́A 0x1011 łAIntel ́A0x8086 łB

     foCX ID (device Identification)
        foCX̂̂ŗL̐BƂ΁ADEC  21141 t@X
        gC[TlbgfoCX́AfoCX ID Ƃ 0x0009 Ă
        B

     Xe[^X (Status)
        ̃tB[h́AKi߂ꂽӖrbgɂāAfo
        CX̏ (status)\̂łB(``Ql 3'')

     R}h (Command)
        ̃tB[hɏނƂŁAVXe̓foCX𐧌䂷B
        Ƃ΁AfoCX PCI I/O ւ̃ANZXȂǁB

     NXR[h (Class Code)
        ́ÃfoCX̃^Cv肷̂łBrfIASCSI
        ȂǁAׂĂ̎ނ̃foCXɂ́AKĩNXBSCSI 
        NXR[h 0x0100 łB

     x[XAhXWX^ (Base Address Register)
        ̃WX^́AfoCXgpł PC I/O Ԃ PCI 
        Ԃ̃^CvƗeʂƈʒuƂ肵蓖Ă邽߂ɎgpB

     荞݃s (Interrupt Pin)
        PCI J[h 4 ̕sAJ[h PCI oXւ̊荞
        M`ĂBKił́A A, B, C, D ƃxt
        B荞݃stB[h́APCI foCX̂ǂ̃s
        gLqĂBʓIɂ́Ã͓foCXƂ
        n[hEFAIɌŒ肳ĂBȂ킿AVXeN̂тɁA
        foCX͓荞݃sgp킯łB̏ɂA
        荞ݏTuVXe͂̃foCX̊荞݂Ǘł
        B

     荞݃C (Interrupt Line)
        foCX PCI RtBO[Vwb_̊荞݃C
        tB[h́A PCI R[hfoCXhCoA Linux
        ̊荞ݏTuVXe̊ԂŊ荞݃nh肷邽
        ߂ɎgpB̃tB[hɏꂽԍ́AfoCXhCo
        ɂƂĂ͖ӖłBALinux Iy[eBOVXe
        ŁA荞ݏ[`A PCI foCX甭ꂽ荞
        VOi𐳂foCXhCo̊荞ݏR[hւƎn
        ߂ɕKvłB Linux ̊荞ݏ̕@ɂĂ̏ڍ
        ́A``u荞݂Ɗ荞ݏv''̏͂QlɂĂقB

  7.3.  PCI I/O  PCI AhX

  PCI I/O Ԃ PCI Ԃ̂ӂ̃AhXԂ́AfoCXA
  CPU ŎsĂ Linux J[l̃foCXhCoƒʐM
  ߂ɎgpBƂ΁ADEC `bv 21141 t@[XgC[Tlbgf
  oCX́AWX^ PCI I/O ԂɃ}bvBfoCXhC
  óÃWX^ǂݏȂÃfoCX𐧌䂷Brf
  IhCóAʂɋ PCI ԂgpāArfIێ
  B

  PCI VXe̐ݒ肪sA PCI RtBO[Vwb_
  R}htB[hgpāAfoCX PCI I/O  PCI AhX
  Ԃւ̃ANZXLƐݒ肳āA߂ẴAhXԂւ̃AN
  ZX\ɂȂBӂׂȂ̂́APCI ݒR[h PCI RtB
  O[VAhXԂɑ΂ǂݏłƂƂł
  BLinux foCXhCóAPCI I/O  PCI AhXԂɑ΂
  ĂǂݏłȂB

  7.4.  PCI-ISA ubW

  PCI-ISA ubẂAPCI I/O Ԃ PCI Ԃւ̃ANZX ISA
  I/O Ԃ ISA Ԃւ̃ANZXɕϊ邱ƂŁAÂ ISA foC
  XT|[gĂBݔ̔Ă鑽̃VXeɂ ISA Xb
  g PCI Xbg̗tĂB΂炭΁Ả
  ʌ݊̕Kv͌āAPCI ݂̂̃VXe̔邾낤BVXe
   ISA foCX ISA AhX(I/O Ԃƃ)ŃWX^
  ێĂꏊ́Ał͉̂ƂȂĂ鏉 Intel 8088 x[X
   PC ォ炸ƌŒ肳ꂽ܂܂łB5000 h Alpha AXP x[X
  ̃Rs[^VXełAISA tbs[Rg[u ISA
  I/O ԓ̈ʒúA IBM PC ƓłBPCI ̎dlł́A
  Ώ邽߂ɁAPCI I/O  PCI AhXԂ̉ʃAhẌ
  VXe ISA Ӌ@pɗ\񂵁AP PCI-ISA ubWgpĂ
  ̗̈ɂ PCI Ԃւ̃ANZX ISA Ԃւ̃ANZ
  XɕϊĂB

  7.5.  PCI-PCI ubW

  PCI-PCI ubẂAVXeɂ镡 PCI oX邽߂̓
  ʂ PCI foCXłBVvȃVXéAP PCI oX
  ȂAP PCI oXŃT|[gł PCI foCX̐ɂ͓dCIȐ
  BPCI-PCI ubWgpđ PCI oX΁AVXe
  ́A葽 PCI foCXT|[głB́AptH[}
  XvT[ȍꍇɏdvłBALinux ́APCI-
  PCI ubWSɃT|[gĂB

  7.5.1.  PCI-PCI ubW: PCI I/O  PCI EBhE

  PCI-PCI ubẂAPCI I/O Ԃ PCI Ԃɑ΂ǂݏ̃
  NGXg̃TuZbg̈(downstream)̃oXɓnłB
  ΁A``}\(6.1)''ł́A PCI-PCI ubẂAǂݏoƏ݂̃Ah
  XASCSI C[TlbgL PCI I/O AhXԂ PCI 
  AhXԂւ̂̂łȂ΁ÃAhX PCI oX 0 
  APCI oX 1 ɓnłBȊO PCI I/O AhXԂ PCI
  AhXԂɊւAhXׂ͂ĖB̃tB^
  OɂāAAhXsKvɃVXeŜɗ̂hłB
  邽߂ɂ́APCI-PCI ubẂAvC}oXZJ_o
  XɓnKv̂ PCI I/O Ԃ PCI Ԃ̃x[XAhXƂ
  ̃AhXƂvOĂȂ΂ȂȂBVXe
  PCI-PCI ubW̐ݒ肪ƁALinux foCXhCo PCI I/O
  Ԃ PCI ԂɏL͈͓̔ŃANZXAfoCXhC
  óAPCI-PCI ubWȂȂB́ALinux  PCI foC
  XhCo̍҂ɂƂẮAhCo̍쐬yɂȂƂ_Ŕ
  ɏdvȋ@\łBÁALinux 炷ƁAɏqׂ悤
  PCI-PCI ubW̐ݒgbL[ɂ@\łB

  7.5.2.  PCI-PCI ubW: PCI RtBO[VTCN PCI oX
  ̔ԍt

  31                                    11 10    8 7        2   1   0
  +---------------------------------------+-------+----------+---+---+
  |                                       |       |          |   |   |
  |     Device Select                     | Func  | Register | 0 | 0 |
  |                                       |       |          |   |   |
  +---------------------------------------+-------+----------+---+---+

  }\(6.3) Type 0 PCI RtBO[VTCN

  31           24 23       16 15        11 10    8 7        2   1   0
  +--------------+-----------+------------+-------+----------+---+---+
  |              |           |            |       |          |   |   |
  |   Reserved   |     Bus   |    Device  | Func  | Register | 0 | 1 |
  |              |           |            |       |          |   |   |
  +--------------+-----------+------------+-------+----------+---+---+

  }\(6.4) Type 1 PCI RtBO[VTCN

  CPU  PCI R[hC PCI oXɂȂfoCXł
  悤ɂɂ́ARtBO[VTCN(Configuration cycle)
  PCI ̃vC}C^[tFCXZJ_C^[tFCXւƓn
  ۂubWł悤Ȏdg݂݂Ȃ΂ȂȂBR
  tBO[VTCŃAPCI oXł͒PȂAhXƂĕ\
  B PCI ̋Kił́APCI RtBO[VAhXԐݒ̂
  ɁAType 0  Type 1 ̂ӂ̃tH[}bg`ĂāA
  }\(6.3)Ɛ}\(6.4)ƂɂꂼꎦĂB Type 0  PCI RtB
  O[VTCNɂ̓oXԍ܂܂ȂBāA Type 0  PCI
  RtBO[VTCŃAׂẴfoCXɂāA PCI o
  X PCI RtBO[VAhXłƉ߂B Type 0 
  RtBO[VTCÑrbg 31  11 ܂ł́AfoCXI
  tB[hƂĈBVXe݌vۂ̂ЂƂ̕@ƂāA
  X̃rbgႤfoCXI悤ɂ@B̏ꍇArb
  g 11 ́AXbg 0 ɂ PCI foCXIArbg 12 ́AXb
  g 1 ɂ PCI foCXI铙ƂƂɂȂBЂƂ̕@
  ́AfoCX̃Xbgԍ𒼐ڃrbg 31  11 ̗̈ɏނ
  łBǂ̕@p邩́AVXe PCI Ԃ̃R
  g[ɈˑB

  Type 1  PCI RtBO[VTCNɂ́APCI oXԍ܂܂
  BāAType 1 ̃RtBO[VTCŃAPCI-PCI ubW
  ȊÔׂĂ PCI foCX疳B Type 1 ̃RtBO[
  VTCNׂĂ PCI-PCI ubẂAẢ
  (downstream)ɓnǂIBPCI-PCI ubW Type 1 R
  tBO[VTCN𖳎邩AƂ PCI oXɓn
  ́APCI-PCI ubW̐ݒ莟łB PCI-PCI ubWׂ͂āAv
  C}oXC^[tFCXԍƃZJ_oXC^[tFCXԍ
  ĂBX PCI-PCI ubWɂƂāAvC}oXC^[
  tFCX́ACPU ɍł߂̃C^[tFCXłAZJ_oXC
  ^[tFCX CPU ɍłɂȂC^[tFCXłB܂A
  ꂼ PCI-PCI ubẂATuI[fBlCgoXԍ(subordinate
  bus number)ĂB́ÃZJ_oXC^[tFCX
  zăubWĂ邷ׂĂ PCI oX̒ōő̃oXԍɊY
  BƃTuI[fBlCgoXԍ́A PCI-PCI ubW
  Ɉʒu PCI oXԍ̂Ȃōł傫oXԍłBPCI-PCI
  ubW Type 1  PCI RtBO[VTCNƂAPCI-
  PCI ubŴ͎悤ȏB

  o  w肳ꂽoXԍubW̃ZJ_oXԍƃTuI[fBlC
     goXԍ̊ԂɂȂꍇ(̔ԍ܂)AType 1 ̃RtBO[
     VTCN𖳎B

  o  w肳ꂽoXԍ̃ubW̃ZJ_oXԍƈv
     A Type 1 RtBO[VTCN Type 0 ̐ݒR}h
     ϊB

  o  w肳ꂽoXԍ̃ubW̃ZJ_oXԍ傫A
     TuI[eBlCgoXԍȉłꍇÂ܂܃ZJ
     _oXɓnB

  āA``}\(6.9)''̃g|W[ Bus 3 ̃foCX 1
  (D1)ƒʐMꍇ́AType 1 RtBO[VR}h CPU 
  oȂ΂ȂȂBubW 1 ́AύX Bus 1 ɓn
  BubW 2 ́A𖳎邪AubW 3 ́A Type 0 R
  tBO[VR}hɕϊAoX 3 ɑM̂ŁAɂ
  foCX 1 ɉB

  PCI ̏̉ߒŃoXԍ蓖Ă邱Ƃ͌X̃Iy[eBOV
  Xe̐ӔCł邪Aǂ̂悤Ȕԍ蓖ĕ@ꂽꍇłA
  ̐̓VXêׂĂ PCI-PCI ubWɓĂ͂܂Ȃ΂Ȃ
  B

       uPCI-PCI ubW̉ɂ邷ׂĂ PCI oX́AZJ_
       oX̃oXԍƃTuI[eBlCgoXԍƂ̊(̔ԍ
       ܂)̃oXԍȂ΂ȂȂBv

  ̃[jꂽꍇAPCI-PCI ubẂAType 1 RtBO[
  VTCN𐳂nϊłȂ̂ŁAVXe̓VXe
   PCI foCXď邱ƂɎs邱ƂɂȂB
  ԍ蓖ĕ@邽߂ɁA Linux ́A̓ȃfoCX
   PCI-PCI ubW錈܂ԂŐݒ肷B``uPCI oXԍ
  蓖āv'' ̃ZNVł́ALinux  PCI ubWƃoXԍĂ̕
  @ɂāA̎ۂ̗ďډĂB

  7.6.  Linux  PCI @

  Linux  PCI R[h́A_I 3 ̕ɕB

     PCI foCXhCo
        ̉zfoCXhCóABus 0  PCI VXěn
        āAVXêׂĂ PCI foCXƃubW݂̏o
        B̃hCóAVXẽg|W[f[^\̘̂A
        Xg쐬BɁAubWׂĂɔԍt
        B
        [see: drivers/pci/pci.c, include/linux/pci.h]

     PCI BIOS
        ̃\tgEFAw(layer)́A``uPCI BIOS ̋@\v''ŏqׂT[
        rX񋟂BAlpha AXP  BIOS T[rXȂAl̋@
        \񋟂R[h Linux J[l̒ɂB
        [see: arch/*/kernel/bios32.c](i386, alpha)

     PCI tBbNXAbv(fixup)
        VXeŗL̃tBbNXAbvR[h(fixup code)́APCI ̏
        ɂVXeŗL̐ݒ̌Ԃ𖄂߂ʂB
        [see: arch/*/kernel/bios32.c](i386, alpha)

  7.6.1.  Linux J[l PCI f[^\

                  pci_bus
  pci_root      +----------+
  ------------->| parent   |
                | children |--------+
                | next     |        |
                | self     |        |
                | devices  |--+     |
                | bus = 0  |  |     |
                +----------+  |     |
          +-------------------+-----+
          |                   |
          |    +--------------+
          |    |
          |    |     pci_dev          pci_dev           pci_dev
          |    |   +---------+      +---------+       +---------+
          |    +-->| bus     |  +-->| bus     |  +--->| bus     |
          |        | sibling |  |   | sibling |  | +->| sibling |
          |        | next    |--+   | next    |--+ |  | next    |
          |        |         |      |         |    |  |         |
          |        |         |      |         |    |  |         |
          |        +---------+      +---------+    |  +---------+
          |      PCI-ISA Bridge        Video       | PCI-PCI Bridge
          |                                        |
          |      pci_bus                           |
          |     +----------+                       |
          +---->| parent   |                       |
                | children |                       |
                | next     |                       |
                | self     |-----------------------+
                | devices  |--+
                | bus = 1  |  |       pci_dev           pci_dev
                +----------+  |     +---------+       +---------+
                              +---->| bus     |  +--->| bus     |
                                    | sibling |  |    | sibling |
                                    | next    |--+    | next    |
                                    |         |       |         |
                                    |         |       |         |
                                    +---------+       +---------+
                                       SCSI             Ethernet

  }\(6.5) Linux J[l PCI f[^\

  Linux J[l PCI VXeہAJ[ĺAVXe̎
  ۏ PCI g|W[𒉎ɔf邽 PCI f[^\̂쐬B
  L}\(6.5) ́A``}\(6.1)'' PCI VXe̗ɑ΂č쐬f
  [^\̂̑݊֌W\̂łB

  X PCI foCX(PCI-PCI ubW܂)́A``pci_dev'' f[^\
  ̂ɂċLqBX PCI oX́A``pci_bus'' f[^\̂ŋL
  qB̌ʁAPCI oX̃c[\AX PCI oX
  ̎q PCI foCXq\łBPCI oXɂ́A (vC
  } PCI oXł Bus 0 ) PCI-PCI ubWgĂ̂ݓB
  \Ȃ̂ŁAX pci_bus \̂ɂ́ÃoXփANZX邽߂
  PCI foCX(Ȃ킿 PCI-PCI ubW)ւ̃|C^܂܂ĂB
  (pci_bus \̂ł)PCI ubẂAƂ̃oX̐eɓ PCI oX
  猩ĎqɊYB

  ``}\(6.5)''ł͕\ĂȂAVXêׂĂ PCI foCX
  ɑ΂|C^Ƃ ``pci_devices'' BVXêׂĂ
  PCI foCX́ÃL[̏ pci_dev f[^\̂o^B
  L[́ALinux J[lVXêׂĂ PCI foCX΂₭
  T߂ɎgpB

  7.6.2.  PCI foCXhCo

  PCI foCXhCóAۂɂ̓foCXhCoł͂ȂAVXȅ
  ̍ۂɃR[Iy[eBOVXe̊֐łBPCI 
  R[h́AVXê PCI oXXLāAׂĂ PCI f
  oCX{(ɂ́APCI-PCI ubWfoCX܂܂)B
  [see: Scan_bus(), in drivers/pci/pci/c]

  PCI R[h́APCI BIOS ̃R[hgpāA݃XL PCI
  oXɑ݂XbgLĂ邩ǂׂĒׂBPCI X
  bgLĂꍇAPCI R[h́A``pci_dev'' \̂
  ẴfoCXLqA̍\̂(``pci_devices'' ɂă|C
  gꂽ)m PCI foCX̃XgɃNB

  PCI R[h́APCI oX Bus 0 XL邱Ƃn߂B
  ́A݂S PCI Xbg̑S PCI foCXɑ΂āÃx_ ID
  ƃfoCX ID ǂݏoƂBLꂽXbg
  A``pci_dev'' f[^\̂쐬AfoCXށBPCI 
  R[hɂč쐬ꂽ pci_dev f[^\ׂ͂(ׂĂ PCI-PCI
  ubW܂߂)APȘAXgł pci_devices ɃNB

  ꂽ PCI foCX PCI-PCI ubWłꍇ́A``pci_bus''
  f[^\̂쐬Apci_bus  ``pci_dev'' f[^\̂琬c
  [ɃNB̃c[́A ``pci_root'' ɂĎQƂ
  BPCI-PCI ubẂANXR[h``(class code)'' 0x060400 
  ̂ŁAPCI R[h́APCI foCX PCI-PCI ubWł邩
  ǂ𔻕ʂłBɁALinux J[ĺAꂽ PCI-PCI ub
  W̔Α()ɂ PCI oXݒ肷B̃oXł PCI-
  PCI ubWꂽꍇAɂݒ肪ȂB̃vZX
  ́AfvXCYASY(depthwise algorithm)ƌĂ΂BVXe
   PCI g|W[́A܂ЂƂ̊Kwԉ܂Ń}bvĂA
  񂷂镔̌osB``}\(6.1)''ł́ALinux ́A܂ PCI Bus
  1 ɂC[Tlbg SCSI foCXݒ肵ĂAPCI Bus 0 ɂr
  fIfoCXݒ肷B

  Linux  PCI oXoۂ́A݂ PCI-PCI ubW̃ZJ
  _oXԍƃTuI[fBlCgoXԍݒ肵Ȃ΂ȂȂB
  ɂẮAȉ``uPCI-PCI ubW̐ݒ: PCI oXԍ̊蓖
  āv''ŏڂB

  7.6.2.1.  PCI-PCI ubW̐ݒ - PCI oXԍ̊蓖

                            +-----------+
                            |           |
                            |           |
           +-------+        |    CPU    |        +-------+
           |       |        |           |        |       |
           |  D 1  |        |           |        |  D 2  |
           |       |        |           |        |       |
           +---+---+        +-----+-----+        +---+---+
    Bus 0      |                  |                  |
    -----------+------------------+------------------+------------------
                                  |
                                  |
  +-------+  +-------+       +----+----+
  |       |  |       |       |         |Primary Bus  =  0
  |  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
  |       |  |       |       |    1    |Subordinate = 0xFF
  +---+---+  +---+---+       +----+----+
       |         |                |                              Bus 1
   ----+---------+-+--------------+-------------+---------------------
                   |                            |
                   |                            |
  +-------+  +-----+---+                   +----+----+
  |       |  |         |                   |         |
  |  D 1  |  | Bridge  |                   | Bridge  |
  |       |  |    3    |                   |    2    |
  +---+---+  +----+----+                   +----+----+
      |           |       Bus ?                 |                 Bus ?
  ----+-------+---+------------     ------------+----------------------
              |
              |
         +----+----+                   +-------+  +-------+
         |         |                   |       |  |       |
         | Bridge  |                   |  D 1  |  |  D 2  |
         |    4    |                   |       |  |       |
         +----+----+                   +---+---+  +---+---+
              |                            |          |           Bus ?
   -----------+----------------------------+----------+----------------

  }\(6.6) PCI VXe̐ݒ: Part 1

  PCI-PCI ubW PCI I/O AhXԁAPCI AhX
  ԁA܂ PCI RtBO[VAhXԂւ̓ǂݏs
  ɂ́Ae PCI-PCI ubWɂĈȉ̏񂪕KvłB

     vC}oXԍ
        PCI-PCI ubW̒̃oXԍ

     ZJ_oXԍ
        PCI-PCI ubW̒̃oXԍ

     TuI[fBlCgoXԍ(subordinate bus number)
        ubW̉Ɉʒu铞B\ȃoX̒ŁAł傫ȃoXԍ

     PCI I/O  PCI EBhE
        PCI-PCI ubW̉ɂAPCI I/O AhXԂ PCI 
        AhXԂׂ̂ẴAhXɑ΂EBhẼx[XAhX
        Ƃ̃TCY

  ́A PCI-PCI ubWݒ肵悤ƂƂÃubWɊ
  TuI[fBlCgoXԍ̎_ł͒m蓾ȂƂƂł
  Bɉ PCI-PCI ubW邩ǂ炸AƂ
  ĂɊ蓖Ăԍ͕ȂB́AfvXCYċAIA
  SY(depthwise recursive algorithm)gp PCI-PCI ubW
  X̃oXXLāAꂽ_Ŕԍ𓖂ĂĂƂłB
  X PCI-PCI ubWāÃZJ_oXԍ蓖
  ꂽAɈꎞIȃTuI[fBlCgoXԍƂ 0xFF 蓖
  ĂĂāẢɂ邷ׂĂ PCI-PCI ubWXLĔԍ
  蓖ĂBŜ͕GɎv邩ȂAL̎
  ̗΁ÃvZX₷Ȃ邾낤B

     PCI-PCI ubWԍ蓖: Step 1
        ``}\(6.6)''̃g|W[gƁAXLɂāAŏ̃u
        bWƂ Bridge 1 BBridge 1 ̉Ɉʒu
        PCI oX́AoX 1 ƔԍtABridge 1 ́AZJ_oX
        Ƃ 1 AꎞIȃTuI[fBlCgoXԍƂ OxFF 
        蓖ĂB́APCI oXԍƂ 1 ȏw肷
        Type 1  PCI RtBO[VAhXABridge 1 ʂ
         PCI oX 1 ɓn邱ƂӖB́AoXԍ 1 
        ꍇ Type 0 ̃RtBO[VTCNɕϊ邪A
        ȊO̔ԍ̏ꍇ͕ϊȂB̂Ƃ́APCI oX 1 ɍ~
        ăXL邽߂ɁALinux PCI R[hȂ΂Ȃ
        Ƃ̂̂łB

                            +-----------+
                            |           |
                            |           |
           +-------+        |    CPU    |        +-------+
           |       |        |           |        |       |
           |  D 1  |        |           |        |  D 2  |
           |       |        |           |        |       |
           +---+---+        +-----+-----+        +---+---+
    Bus 0      |                  |                  |
    -----------+------------------+------------------+------------------
                                  |
                                  |
  +-------+  +-------+       +----+----+
  |       |  |       |       |         |Primary Bus  =  0
  |  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
  |       |  |       |       |    1    |Subordinate = 0xFF
  +---+---+  +---+---+       +----+----+
       |         |                |                              Bus 1
   ----+---------+-+--------------+-------------+---------------------
                   |                            |
                   |                            |
  +-------+  +-----+---+                   +----+----+
  |       |  |         |                   |         |Primary Bus  =  1
  |  D 1  |  | Bridge  |                   | Bridge  |Secondary Bus = 2
  |       |  |    3    |                   |    2    |Subordinate  =  2
  +---+---+  +----+----+                   +----+----+
      |           |       Bus ?                 |                 Bus 2
  ----+-------+---+------------     ------------+----------------------
              |
              |
         +----+----+                   +-------+  +-------+
         |         |                   |       |  |       |
         | Bridge  |                   |  D 1  |  |  D 2  |
         |    4    |                   |       |  |       |
         +----+----+                   +---+---+  +---+---+
              |                            |          |           Bus ?
   -----------+----------------------------+----------+----------------

  }\(6.7) PCI VXe̐ݒ: Part 2

     PCI-PCI ubW̔ԍ蓖: Part 2
        Linux ́AfvXCYASY(depthwise algorithm)g
        ŁAR[h PCI oX 1 ւƐiŃXLBŁA
        R[h́APCI-PCI Bridge 2 𔭌BPCI-PCI ubW 2 
        ɂ PCI-PCI ubW݂͑Ȃ̂ŁAɂ̓TuI[fBl
        CgoXԍ 2 蓖ĂA͂̃ZJ_C^[tF
        CXɊ蓖ĂꂽԍƍvB ``}\(6.7)''ł́AoX
        PCI-PCI ubWƂ̎_ŔԍtꂽƂĂB

                            +-----------+
                            |           |
                            |           |
           +-------+        |    CPU    |        +-------+
           |       |        |           |        |       |
           |  D 1  |        |           |        |  D 2  |
           |       |        |           |        |       |
           +---+---+        +-----+-----+        +---+---+
    Bus 0      |                  |                  |
    -----------+------------------+------------------+------------------
                                  |
                                  |
  +-------+  +-------+       +----+----+
  |       |  |       |       |         |Primary Bus  =  0
  |  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
  |       |  |       |       |    1    |Subordinate = 0xFF
  +---+---+  +---+---+       +----+----+
       |         |                |                              Bus 1
   ----+---------+-+--------------+-------------+---------------------
                   |                            |
                   |                            |
  +-------+  +-----+---+                   +----+----+
  |       |  |         |Primary Bus  =  1  |         |Primary Bus  =  1
  |  D 1  |  | Bridge  |Secondary Bus = 3  | Bridge  |Secondary Bus = 2
  |       |  |    3    |Subordinate = 0xFF |    2    |Subordinate  =  2
  +---+---+  +----+----+                   +----+----+
      |           |       Bus 3                 |                 Bus 2
  ----+-------+---+------------     ------------+----------------------
              |
              |
         +----+----+                   +-------+  +-------+
         |         |                   |       |  |       |
         | Bridge  |                   |  D 1  |  |  D 2  |
         |    4    |                   |       |  |       |
         +----+----+                   +---+---+  +---+---+
              |                            |          |           Bus ?
   -----------+----------------------------+----------+----------------

  }\(6.8) PCI VXeݒ: Part 3

     PCI-PCI ubW̔ԍ蓖: Step 3
        PCI R[h́APCI oX 1 ̃XLjOɖ߂AЂƂ
         PCI-PCI ubWł Bridge 3 𔭌B́Ãv
        C}oXC^[tFCXƂ 1 蓖ĂAZJ_C
        ^[tFCX̔ԍƂ 3 ATuI[fBlCgoXԍƂ
         0xFF 蓖ĂB ``}\(6.8)''ł́AVXe݂ǂ
        悤ɐݒ肳ꂽ̂ĂBoXԍ 1, 2, 3 ɂĂ
        Type 1  PCI RtBO[VTCŃAK؂ PCI oX
        ΂Đ`BB

                            +-----------+
                            |           |
                            |           |
           +-------+        |    CPU    |        +-------+
           |       |        |           |        |       |
           |  D 1  |        |           |        |  D 2  |
           |       |        |           |        |       |
           +---+---+        +-----+-----+        +---+---+
    Bus 0      |                  |                  |
    -----------+------------------+------------------+------------------
                                  |
                                  |
  +-------+  +-------+       +----+----+
  |       |  |       |       |         |Primary Bus  =  0
  |  D 1  |  |  D 2  |       | Bridge  |Secondary Bus = 1
  |       |  |       |       |    1    |Subordinate  =  4
  +---+---+  +---+---+       +----+----+
       |         |                |                              Bus 1
   ----+---------+-+--------------+-------------+---------------------
                   |                            |
                   |                            |
  +-------+  +-----+---+                   +----+----+
  |       |  |         |Primary Bus  =  1  |         |Primary Bus  =  1
  |  D 1  |  | Bridge  |Secondary Bus = 3  | Bridge  |Secondary Bus = 2
  |       |  |    3    |Subordinate  =  4  |    2    |Subordinate  =  2
  +---+---+  +----+----+                   +----+----+
      |           |       Bus 3                 |                 Bus 2
  ----+-------+---+------------     ------------+----------------------
              |
              |
         +----+----+                   +-------+  +-------+
         |         |Primary Bus  =  3  |       |  |       |
         | Bridge  |Secondary Bus = 4  |  D 1  |  |  D 2  |
         |    4    |Subordinate  =  4  |       |  |       |
         +----+----+                   +---+---+  +---+---+
              |                            |          |           Bus 4
   -----------+----------------------------+----------+----------------

  }\(6.9) PCI VXe̐ݒ: Part4

     PCI-PCI ubW̔ԍ: Step 4
        Linux ́APCI-PCI ubW Bridge 3 ̉ɂ PCI oX 3 ̃X
        LjOn߂BPCI oX 3 ́A PCI-PCI ubW(Bridge
        4)oXɎĂ̂ŁÁAvC}oXԍƂ 3
        AZJ_oXԍƂ 4 蓖ĂB͂̃oX
        ̍Ō̃ubWȂ̂ŁAubWɂ̓TuI[fBlCgoXC
        ^[tFCXԍ 4 蓖ĂBR[h́APCI-PCI
        Bridge 3 ɖ߂AɃTuI[fBlCgoXԍ 4 蓖
        BŌɁAPCI R[h́APCI-PCI Bridge 1 ɃTuI[fB
        lCgoXԍ 4 蓖Ă邱ƂłB``}\(6.9)''ł́A
        ̃oXԍĂB

  7.6.3.  PCI BIOS ֐

  PCI BIOS ֐́ASvbgtH[ɋʂȁAA̕W[`ł
  BƂ΁ÁAIntel  Alpah AXP x[X̃VXe̗œ
  łB PCI BIOS ֐́APCI AhXԂւ CPU Ő䂳ꂽAN
  ZX\ɂB
  [see: arch/*/kernel/bios32.c]( i386, alpha )
  gpł̂́ALinux J[lR[hƃfoCXhCoł
  B

  7.6.4.  PCI tBbNXAbv(fixup)

  Alpah AXP  PCI tBbNXAbv(fixup)R[h́AIntel ̂(Intel
  ł̃R[h͊{IɉȂ)ȏ̖ʂB
  [see: arch/*/kernel/bios32.c]( i386, alpha )
  Intel x[X̃VXeł́Au[gɎsVXe BIOS APCI
  VXeSɐݒ肷B̂߂ɁALinux ́Ał̐ݒ}bv
  ȊO͂قƂǂ邱ƂȂBIntel x[XłȂVXȅꍇA
  悤ȂȂݒƂȂKvB

  o  X̃foCX PCI I/O  PCI Ԃ蓖Ă邱ƁB

  o  VXe PCI-PCI ubWꂼɁAPCI I/O AhX PCI 
     AhX̃EBhEݒ肷邱ƁB

  o  foCX̊荞ݏ𐧌䂷A荞݃Cl𐶐邱ƁB

  ̃TuZNVł́ÃR[h̓B

  7.6.4.1.  foCXKvƂ PCI I/O  PCI Ԃ̗eʂ𒲂ׂ

  oꂽ PCI foCX́A PCI I/O  PCI AhXԂ
  ǂ̒xKvƂׂ̂邽߂ɁAB̌̂߂ɁAX
  ̃x[XAhXWX^ɂ́Aׂ 1 ܂Ǎœǂݏo
  BfoCX́AgpȂAhX̃rbgɊւĂ 0 Ԃ̂ŁA
  KvƂAhXԂIɊm肷邱ƂłB

  31                                                4  3  2  1  0
  +--------------------------------------------------+--+-----+--+
  |                                                  |  |     |  |
  |                   Base Address                   |  |     | 0|
  |                                                  |  |     |  |
  +--------------------------------------------------+--+-----+--+
                                                       |   |
                                      prefetchable-----+  Type

                  PCI Ԃ̃x[XAhX

  31                                                       2  1  0
  +---------------------------------------------------------+--+--+
  |                                                         |  |  |
  |                   Base Address                          |  |  |
  |                                                         |  |  |
  +---------------------------------------------------------+--+--+
                                                              |
                                                            Reserved

                  PCI I/O Ԃ̃x[XAhX

  }\(6.10) PCI RtBO[Vwb_: x[XAhXWX^

  x[XAhXWX^ɂ́A{Iɂӂ̃^CvBЂƂ́Af
  oCXWX^APCI I/O  PCI Ԃ̂ǂ͈̔͂ɂȂ
  ȂȂB́AWX^̃rbg 0 ɂĎB ``}
  \(6.10)''ł́APCI  PCI I/O ɂĂ̓ނ̃tH[̃x[
  XAhXWX^ĂB

  ̃x[XAhXWX^ǂ̒x̃AhXԂvĂ̂
  mɒm邽߂ɁÃWX^ɂׂ 1 ŁÂƂł
  ǂݏoBfoCX́AgpȂAhXԂł̓rbgl 0 Ԃ
  ŁAʓIɕKvȃAhXԂmłB݌v@ɂāA
  pAhXԑŜ 2  n ƂȂARȋEɐʒu
  ɒu邱ƂɂȂB

  Ƃ΁ADEC `bv 21142 PCI t@[XgC[TlbgfoCX
  ƂAfoCX́APCI I/O  PCI ̂ꂩ̃Xy[XƂ
  0x100 oCgKvłƍƂBR[h́AfoCXɂ
  Ԃ蓖ĂBԂ蓖ĂuԁA21142 ̃Rg[WX^
  Xe[^XWX^ÃAhXɑ݂̂킩悤ɂ
  B

  7.6.4.2.  PCI-PCI ubWƃfoCXɑ΂ PCI I/O  PCI 
  蓖Ă

  ׂẴƓlɁAPCI I/O  PCI Ԃ͗LłAƂ
  s邱ƂBIntel ȊÕVXeɂ PCI tBbNX
  AbvR[h (fixup code)(сAIntel VXeɂ BIOS R[
  h)́AX̃foCXɑ΂āAꂪvʂ̃IɊ
  ĂȂ΂ȂȂBAPCI I/O  PCI Ԃ̃AhX́A
  RȋEɐ悤ȕ@ŊefoCXɊ蓖ĂȂ΂Ȃ
  BƂ΁AfoCX PCI I/O Ԃ 0xB0 oCg̗eʂv
  A 0xB0 ̔{ƂȂAhXɊ蓖ĂKvB
  ɉāAeubWɊւ PCI I/O  PCI ̃x[XAhX́A
  ꂼ 4 k  1 M oCg̋EɐȂ΂ȂȂBɈʒu
  foCX̃AhXԂ́A㗬ɂ邷ׂẴubWfoCXp
  ƂĊmۂ郁̈ɂȂ΂ȂȂBāAԂI
  Ɋ蓖Ă̂́AłB

  Linux gĂASYł́APCI foCXhCoɂč쐬
  ꂽoXƃfoCXƂ̃c[\ɂċLqX̃foCXɑ΂
  āAPCI I/O Ԃ PCI ԂɂꂼꂪgAhX
  蓖ĂƂ@ł̖ɑΏĂB̏ꍇAċAIAS
  YgpAPCI R[hɂč쐬ꂽ ``pci_bus'' 
  ``pci_dev'' f[^\̂ԂɒׂB[g PCI oX(
  ́A``pci_root'' ɂă|CgĂ)璲n߂āABIOS 
  tBbNXAbvR[ĥ͎悤ȂƂB

  o  O[o PCI I/O  PCI ̃Jg(current)x[XAhX
      4 k  1 M oCg̋Eɍ킹Ăꂼݒ肷B

  o  JgoXׂ̂ẴfoCXɑ΂āA(vꂽ PCI I/O 
      PCI ԏ̃AhXɂĂ͏)ÂƂB

     o  foCXɁAPCI I/O  PCI ̗̋Ԃ蓖
        B

     o  K؂ȗeʕAO[o PCI I/O  PCI ̃x[XAh
        XړB
     o  foCX PCI I/O  PCI gpł悤ɂB

  o  JgoX̉ɂ邷ׂẴoXɑ΂āAċAIɋԂ蓖
     ĂBɂ́AO[o PCI I/O  PCI ̃x[XAhX
     ύXƂɒӁB

  o  O[o PCI I/O  PCI ̃Jgx[XAhXꂼ
      4 k  1 M oCg̋Eɍ킹Đݒ肵A̍ۂɁA݂ PCI-
     PCI ubWKvƂ PCI I/O  PCI ̃EBhẼTCY
     ƃx[XAhXƂ𒲂ׂB

  o  ̃oXɌqĂ PCI-PCI ubWA PCI I/O  PCI 
     ̃x[XAhXƏAhXƂgāAvOB

  o  PCI-PCI ubWɃvOꂽ PCI I/O  PCI ւ̃ANZ
     Xꍇɂʉ߂@\ALɂB̂Ƃ́ATC
     Yƃx[XAhXɂĎw肳ꂽ̃ubW̃AhXԃEB
     hEɂ PCI I/O ܂ PCI AhXubW̃vC
     }oXɌꂽꍇAZJ_ PCI oXɒʉ߂ (bridge
     ) ƂӖB

  ``}\(6.1)''ɂ PCI VXeɎƁA PCI tBbNXAbvR
  [h́Â悤ȕ@ŃVXeݒ肷邱ƂɂȂB

     PCI x[XAhX̏ݒ
        x[XAhXɂāAPCI I/O  0x4000 ƂAPCI 
        0x100000 ƂBɂāAPCI-ISA ubẂA艺
        ̃AhX ISA AhXTCNɕϊł悤ɂȂB

     rfIfoCX
        ̃foCX́APCI ̗eʂƂ 0x200000 vĂB
        āAvꂽTCỸAIɊ蓖ĂKv
        ̂ŁA̗eʂ݂ PCI ̃x[XAhXł
        0x200000 n܂̈Ɋ蓖ĂBɂāAPCI 
        x[XAhX 0x400000 ɈړAPCI I/O ̃x[XAhX
        0x4000 ̂܂܂łB

     PCI-PCI ubW
        ̎_ŁAPCI-PCI ubWʉ߂āẢɂfoCX
        PCI 蓖ĂB: x[XAhX͊ɐݒ肳
        ĂAōĐݒ肷Kv͂ȂB

        C[TlbgfoCX
           ̃foCX́APCI I/O  PCI ԗ 0xB0 oCg
           vĂBāA0x4000  PCI I/O A0x400000 
           PCI 蓖ĂB PCI ̃x[XAhX
           ́A0x4000B0 ɈړAPCI I/O x[XAhX 0x40B0 Ɉړ
           B

        SCSI foCX
           ̃foCX́APCI  0x1000 vĂ̂ŁA
           RȋEɉĔzu悤ɁA0x401000 ɕKvȋԂ
           蓖ĂB PCI I/O x[XAhX́Â܂ 0x40B0 
           APCI ̃x[XAhX́A0x402000 ɈړB

     PCI-PCI ubW PCI I/O  PCI ̃EBhE
        ŁAubWɖ߂āAPCI I/O EBhE 0x4000  0x40B0
        ̊Ԃɐݒ肵āA PCI EBhE 0x400000  0x402000
        Ƃ̊Ԃɐݒ肷B́APCI-PCI ubWrfIfoCX̂
         PCI ANZX𖳎āA炪C[Tlbg SCSI f
        oCX̂߂̂̂ȂʂƂƂӖB

  (-- (r1)Ƃ΁H--)

  8.  荞݂Ɗ荞ݏ

  ̏͂ł́A荞݂ Linux ɂĂǂ̂悤ɏ邩BJ
  [ĺA荞ݏ̂߂̔ėpIȎdg݂ƃC^[tFCX
  邪A荞ݏ̏ڍׂ̑啔̓A[LeN`ɌŗL̂̂łB

                                                     +---------------+
                                                     |       *  /    |
                                                     |       | /     |
                                                     |       |/      |
                                                     |.      +      .|
  +-----------------+                 Real Time Clock|               |
  |                 |<-------------------------------|               |
  |                 |        +---------+             |       .       |
  |                 |<-------|         |0            +---------------+
  |     C P U       |        |         |1<-------------L[{[h
  |                 |    +-->|    P    |2
  |                 |    |   |    I    |
  |                 |    |   |    C    |4<----------VA|[g
  +-----------------+    |   |         |5<----------TEh
                         |   |    1    |6<----------tbs[hCu
                         |   |         |7
                         |   +---------+
                         |
                         |   +---------+
                         |   |         |0
                         +---|         |
                             |    P    |
                             |    I    |3<-------------SCSI
                             |    C    |
                             |         |
                             |    2    |6<-------------ide0
                             |         |7<-------------ide1
                             +---------+

  }\(7.1) 荞݂̃[eBOɊւ_Iȃ_CAO

  Linux ́A푽lȃn[hEFAgpđ̈قȂ^XNs
  BrfIfoCX̓j^hCuAIDE foCX̓fBXNh
  Cu铙łB̃̕foCX𓯊Ďgp邱Ƃ\
  łA̍ۂ́A鑀ɂẴNGXg𑗂(Ƃ΁A郁
  ubNfBXNɏo)Å҂ƂɂȂB
  @́AɎs͂̂AɌAIy[eBO
  VXe͌X̑삪܂ő҂ԂɂȂ邽߁AuȂrW
  [vԂő̎Ԃ邱ƂɂȂBƌ̂悢@́AN
  GXg𑗂ALvȑ̎dȂANGXg
  _ŃfoCX犄荞݂󂯂Ƃ@łB̕@Ȃ΁Afo
  CXɑ΂鑽̃NGXg𖢏̏ԂœɃVXeɕ
  邱Ƃ\ɂȂB

  CPU ̎ɂǂ̂悤ȏsĂ悤ƂfoCX荞݂
  邱Ƃł邽߂ɂ́AȂ炩̃n[hEFAɂT|[gKvł
  BׂĂł͂ȂƂĂAAlpha AXP ̂悤ȑ啔̔ėpvZbT
  ́Â߂ɗގ@gĂB CPU ̕ŝ́A
  ̃sɓd̕ω(Ƃ΁A+5V  -5V ւ̕ω)ƁACPU
  ݂̌̏fA荞݂ʂȃR[hł銄荞
  R[h(interrupt handling code)̎sJn悤ɐ݌v
  B̃ŝЂƂ̓C^[o^C}[ɐڑA番̈b
  ƂɊ荞݂󂯂悤ɂȂĂāAȊÕs SCSI R
  g[̂悤ȃVXȇ̃foCXɐڑĂB

  ΂΃VXéA荞݃Rg[(interrupt controller)gp
  āAfoCX̊̕荞݂O[vȀ CPU ̒P̊
  荞݃sɃVOi𑗂ĂB CPU ̊荞݃s̐ߖ
  AVXefUCۂɏ_炷B荞݃Rg[
  ́A}XNWX^(mask register)ƃXe[^XWX^(status
  register)ƂŊ荞݂𐧌䂵ĂB}XNWX^́Arbg
  ̐ݒɂĊ荞݂̉s肷̂łAXe[^XWX^
  ̓VXě݃ANeBuȊ荞݂̂łB

  VXe̊荞݂̂́AIɔzŒ肳Ăꍇ
  BƂ΁AA^CNbÑC^[o^C}[́A荞݃R
  g[̃s 3 ɌŒIɐڑĂ邱ƂBAs
  ɐڑĂ邩́A PCI  ISA Xbgɂǂ̂悤ȃRg
  [J[hĂ邩ɂČ܂ꍇBƂ΁A荞
  Rg[̃s 4 ́APCI Xbg 0 ԂɐڑĂ邩
  ÃXbgɂ́AƂ̓C[TlbgĂāAʂ̂Ƃ
  SCSI Rg[Ă邩ȂBǁA{IɁA荞
  `Bdg݂̓VXeƂɈقȂ̂ŁAIy[eBOVXe
  ͂ɑΏ邾̏_Ȃ΂ȂȂB

  ݂̔ėp}CNvZbT̑啔́A@Ŋ荞݂Ă
  Bn[hEFA荞݂ƁACPU ́Aݎs̖߂̎s
  ~A荞ݏR[ĥ̂A邢͊荞ݏR[hւƕ
  򂷂閽߂̂ǂ炩܂񂾃̂ꏊւƃWvBʏ킱
  ̃R[h́A荞݃[hƌ CPU ̓ʂȃ[hŎs
  ŁAʂɁÃ[hɂƂ́Å荞݂͋NȂB
  OA CPU ł͊荞݂ɗD揇ʂtĂ̂ŗD揇ʂ̍
  荞݂͋NꍇBȂ킿Aō̗Dx荞ݏ
  R[h͔ɓOɏĂȂ΂Ȃ炸A΂ΓƎ̃X^bN
  Ă邽߁Å荞ݏR[h́ANĊ荞݂
  OɁÃX^bNg CPU ̎s(CPU ̒ʏ̃WX^ƃRe
  LXĝׂ)ۑB CPU ̂Ȃɂ́A荞݃[hp̓ʂ
  WX^ZbgĂ̂邽߁A荞ݏR[h́A
  ̃WX^gĕKvȃReLXgۑ̑啔sB

  荞ݏIƁACPU ̏Ԃ͌ɖ߂A荞݂͉
  B CPU ́A荞݂NOɎsĂpBdvȂ
  ́A荞ݏR[h͏o̗ǂ̂ł邱ƂłAIy
  [eBOVXepɂɁA邢͒ԁÅ荞݂ubN
  邱ƂȂ悤ɂ邱ƂłB

  8.1.  vO\Ȋ荞݃Rg[

  VXe݌v҂́A̍DȊ荞݂̎dg݂RɎgƂł
  A IBM PC ł́AIntel 82C59A-2 Ƃ CMOS vO\Ȋ荞
  Rg[ (Programable Interrupt Controller)A̔hRg[
  gpĂB̃Rg[́APC t炠̂ŁAISA
  AhXԂ̌܂ꏊ (well known location)ɑ݂郌WX^
  găvO邱ƂłBŐV̕⏕WbN`bvłAl
  ̃WX^ ISA ̓ꏊɒuĂBAlpha AXP ̂悤Ȕ
  Intel x[X PC ł́An[hEFA̐񂩂Ă
  AĂ̏ꍇAƂ͈قȂ銄荞݃Rg[gpĂB

  ``}\(7.1)''ł́Aӂ 8 rbg̃vO\Ȋ荞݃Rg
  [(Programable Interrupt Controller, PIC)ɌqĂāAPIC 1
   PIC 2 ̌X̃Rg[Aꂼ}XNWX^(mask
  register)Ɗ荞݃Xe[^XWX^(interrupt status register)
  ĂlqĂB}XNWX^́AAhX 0x21  0xA1 ɂ
  AXe[^XWX^́AAhX 0x20  0xA0 ɂB}XNWX^
  ̓̃rbg 1 ނƊ荞݂\ɂȂA0 ނƕs
  ɂȂBāArbg 3  1 ނƁA荞 3 gp\
  ȂA 0 ނƕsƂȂBcOȂƂ(āAƂ)A
  荞݃}XNWX^͏ݐpłA񂾒lǂݏo
  ͂łȂBȂ킿A Linux ́A}XNWX^ɐݒ肵l̃Rs[
  ŕۑȂ΂ȂȂƂӖBLinux ͂A荞݂
  sݒ肷郋[`ɕۑÃ}XNlCĂA
  WX^Ƀ}XNlS㏑ĂB

  荞݂ƂA荞ݏR[h́Aӂ̊荞݃Xe[^
  XWX^(Interrupt status register, ISR)̒lǂݏoB荞ݏ
  R[h́A16 rbg銄荞݃Xe[^XWX^̂A0x20 ɂ
  ISR  8 rbgƂĈA0xA0 ɂ ISR  8 rbgƂĈ
  B䂦A0xA0 ɂ ISR ̃rbg 1 ́AVXe荞 9 Ƃ
  BvO\Ȋ荞݃Rg[ PIC 1 ̃rbg 2 ͗p
  łȂÁAPIC 2 ̊荞݂q邽߂ɎgpĂ邩
  łAPIC 2 ̊荞݂́APIC 1 ̃rbg 2 ƂăZbgB

  8.2.  荞ݏ̃f[^\̏

  J[l̊荞ݏ̂߂̃f[^\̂́AfoCXhCoVXe
  ̊荞݂̐vۂɁAfoCXhCoɂĐݒ肳B
  ̏ꍇAfoCXhCóALinux J[l̈ÃT[rXgp
  āAɂāA荞݂vA邢͊荞݂̉sݒ
  肷B
  [see: request_irq(), enable_irq(), disable_irq(), in
  arch/*/kernel/irq.c] (i386, alpha)
  ʂ̃foCXhCóA[`ĂяoāAꂼ̊
  ݏ[`̃AhXo^B

  荞݂̂Ȃɂ́APC A[LeN`̊KɂČŒ肳Ă
  ̂ŁȀꍇAhCóAہAPɂ̊荞݂v
  邾ł悢B́Atbs[fBXNhCo̓삻̂̂ł
  Atbs[fBXNhCóA IRQ 6 vBfoCXh
  CóÃfoCXǂ̊荞݂gmȂꍇB PCI
  foCXhCȍꍇ́A荞ݔԍ͏ɖ炩Ȃ̂ŁA
  ͋NȂBcOȂAISA foCXhCo荞ݔԍm낤Ƃ
  ꍇ́AȒPȕ@Ƃ̂͂ȂBLinux ́A̖邽
  ɁAfoCXhCoɊ荞݂oB

  ܂AfoCXhCóA炩̌`ŃfoCXɓāAfoCX
  荞݂𔭐BɁAVXeł܂蓖ĂĂȂׂ
  ̊荞݂LɂBɂāÃfoCX`Błɕۗ
  Ă荞݂AvO\Ȋ荞݃Rg[oRœ`B
  B Linux ́A荞݃Xe[^XWX^ǂݏoAfoCXhCo
  ɂ̓eԂB0 łȂlԂꍇÁAЂƂA͂
  ȏ̊荞݂A荞݌oɔƂӖB̎_ŁA
  hCóAoIA蓖ĂĂȂ荞݂́AׂĖ
  B
  [see: irq_problem_*(), in arch/*/kernel/irq.c](i386, alpha)
  ISA foCXhCoAIRQ ԍ̌oɐꍇAhCóAʏ
  ʂ肻 IRQ ԍ̐vB

  PCI x[X̃VXeł́AISA x[X̃VXeƓIłB
  ISA foCXgp銄荞݃s(IRQ)́A΂΃n[hEFAfoC
  X̃WpgĐݒ肳̂ŁAfoCXhCoŌŒ肳Ă
  B΂ɁAPCI foCX́AVXẽu[g PCI 
  ہA PCI BIOS  PCI TuVXeɂĊ荞݂蓖ĂB
  X PCI foCX́AA, B, C, D  4 ̊荞݂̂AЂƂgp
  B (: KíAЂƂ 4 ܂Ŏgpł邻łB) 
  ̓foCX̍쐬ɌŒ肳ĂA啔̃foCX͕WIȃs A
  荞݂ɎgpBX PCI Xbg A, B, C, D ̊荞݃
  C(interrupt line)́A荞݃Rg[ɔzĂB
  APCI Xbg 4 ̃s A ́A荞݃Rg[̃s 6 ɔz
  ĂāAPCI Xbg 4 ̃s B ́A荞݃Rg[̃s 7 
  zĂ铙XƂȂĂB

  荞݂ǂ̂悤ɓ`B邩́ASɃVXeŗL̂̂ł
  ŁÃVXe PCI 荞݂`Bg|W[𗝉ĂȂ
  炩̐ݒR[h݂KvB Intel x[X PC ł́A
  ́ANɎsVXe BIOS ł邪A BIOS ̂ȂVXe(
  Ƃ΁AAlpha AXP x[X̃VXe)ł́ALinux J[l̃Zbg
  AbvsB
  [see: arch/alpha/kernel/bios32.c]
  PCI ݒR[h́A荞݃Rg[̃sԍfoCXƂ ``PCI
  RtBO[Vwb_''ɏށB PCI ݒR[h́AAPCI ̊
  荞ݓ`Bg|W[foCX PCI XbgԍAтꂪ݂
   PCI 荞݃sgĂ邩Ƃm𗘗pāA荞݃s(
   IRQ)肷BfoCXgp銄荞݃s͌Œ肳Ă
  āÃfoCX PCI RtBO[Vwb_̃tB[hɕۑ
  ĂB PCI ݒR[h́A荞݃C(Interrupt Line)tB[
  hɁȀށB荞݃CtB[h͂̂߂ɗ\񂳂
  tB[hłBfoCXhCo̎sɂ́AhCo͂̏
  ǂݏoAg Linux J[lɊ荞ݐn悤v
  B

  Ƃ΁APCI-PCI ubWgpĂVXeȂǂł́APCI 
  ݂KvƂ\[X񑶍݂ꍇB荞݃\[X̐
  AVXẽvO\Ȋ荞݃Rg[ɂs̐
  ꍇB̏ꍇAPCI foCX͊荞݂LA荞݃R
  g[̂ЂƂ̃sŁA PCI foCX̊荞݂󂯂
  ƂB Linux T|[gꍇA荞݃\[X̒ł
  荞݃sŏɗvfoCXAL邩ǂł
  悤ɂƂ@ĂB荞݂LƂ́A
   ``irqaction'' f[^\̂쐬Ãf[^\̂A
  ``irq_action'' z̔zɂeGgɂă|CgB
  L荞݂NƁALinux ́Ã\[Xɑ΂邷ׂĂ̊荞݃n
  hĂяoB荞݂̋L\ȂׂẴfoCXhCo(
  ׂ͂ PCI foCXhCołȂ΂ȂȂ)́A荞݂T[rX
  ĂȂƂ́ÃhCo̊荞݃nh[Ăяo
  悤ɏĂȂ΂ȂȂB

  8.3.  荞ݏ

      irq_action
    +----------------+               irqaction
    |                |              +---------+
    |----------------|        +---->| handler |-----> ̃foCX
    |                |        |     | flags   |       荞ݏ
    |----------------|        |     | name    |       [`
    |                |--------+     | next    |
    |----------------|              |         |
    |                |              +---------+
    |----------------|
    |                |
    |----------------|
    |                |
    |----------------|                irqaction       irqaction
  3 |                |               +---------+     +---------+
    |----------------|         +---->| handler |---->| handler |
  2 |                |         |     | flags   |     | flags   |
    |----------------|         |     | name    |     | name    |
  1 |                |---------+     | next    |     | next    |
    |----------------|               |         |     |         |
  0 |                |               +---------+     +---------+
    +----------------+

  }\(7.2) Linux 荞ݏ̃f[^\

  Linux ̊荞ݏTuVXe̎vȃ^XN̂ЂƂA荞ݗv
  𐳂荞ݏR[hւƓ`邱ƂłB̃R[h́AVXe
  ̊荞݃g|W[𗝉ĂȂ΂ȂȂBƂ΁Atbs[
  Rg[荞݃Rg[̃s 6 Ŋ荞ޏꍇÁA
  ̊荞݂tbs[̂̂ł邱ƂFāAtbs[fo
  CX̊荞ݏR[hɂ`Ȃ΂ȂȂBLinux ́AQ
  |C^gāAVXe̊荞ݏ[`̃AhXef[
  ^\̂QƂB̃[`́AVXẽfoCXp̃foC
  XhCoɑĂAhCoƂAKvȊ荞݂v
  ̂͌X̃foCXhCo̐ӔCłB}\(7.2)
  ́A``irq_action'' ́A ``irqaction'' f[^\̂ւ̃|C^̔z
  邱ƂĂBX irqaction f[^\̂́A荞ݏ
  [`̃AhXĂƓɁÅ荞݂ɑ΂鏈[`
  Ɋւ񂪊܂܂ĂB荞݂̐Ƃ̏@́AA[LeN
  `Aɂ̓VXeɂĈقȂ̂ŁALinux ̊荞ݏR[h
  ́AA[LeN`ŗL̂̂łB́Airq_action z̔z񂪁A
  ݂銄荞݃\[X̐ɂĈقȂ邱ƂӖĂB

  荞݂NƁALinux ́A܂AVXẽvO\Ȋ荞
  Rg[̊荞݃Xe[^XWX^ǂݏoāÅ荞݃\[
  X𔻒fBāÃ\[X ``irq_action'' z̔zɑ΂I
  tZbglɕϊB䂦AƂ΁Atbs[Rg[
  荞݃Rg[̃s 6 ̊荞݂́A荞ݏ[`̔z
  ł 7 Ԗڂ̃|C^ւƕϊB荞݂ɑ΂銄
  ݏnhȂꍇALinux J[l̓G[OɋL^邩A
  邢́Å荞݃\[X̑S ``irqaction'' f[^\̂ɑ΂(f
  tHg) 荞ݏ[`ĂяoB

  foCXhCo̊荞ݏ[` Linux J[lɂČĂяo
  ꂽƂA[`́A荞݂ĂɑΏ邱ƂɂȂ
  RIɒׂȂ΂ȂȂB荞݂̌邽߁AfoC
  XhCóA荞݂̔foCX̃Xe[^XWX^ǂݏo
  BfoCX́AG[񍐂Ă邩ȂAvꂽ
  Ƃ񍐂Ă邩ȂBƂ΁Atbs[Rg[
  Atbs[fBXN̐ZN^̏ւ̓ǂ݂Ƃwbḧʒuړ
  Ƃ񍐂Ă̂ȂB荞݂̌ƁA
  foCXhCóAɎ̎dKvꍇB̏
  ALinux J[ĺA̎d񂵂ɂ邱Ƃłdg݂
  BȂ킿AɂāACPU A荞݃[hɒԓ܂
  ɂȂ̂h~BɂĂ̏ڍׂ́A``ufoCXhCov''̏
  ĂقB

  REVIEW NOTE: 荞݂ƒᑬ荞݂Ƃ̂́AIntel nł̎
  ̂H

  (-- (r 1): ہAtbs[fBXNRg[́AKAPC VX
  eɂČ܂荞݂gfoCX̂ЂƂłBtbs[
  fBXNRg[́A荞 6 ɐڑĂB--)

  9.  foCXhCo

  Iy[eBOVXe̖ړÎЂƂ́A[UVXẽn[h
  EFA̓ꐫBƂłBƂΉzt@CVXéAy
  Ȃ镨foCXƂ͖֌WɁA}Egꂽt@CVXeɓI
  񋟂B̏͂ł́ALinux J[lVXe̕foCX
  ǂ̂悤ɊǗĂ̂B

  CPU VXeŗB̏񏈗foCXł͂ȂAׂĂ̕foC
  XƎ̃n[hEFA䑕uĂBL[{[hA}EXAVA
  |[g Super I/O `bvŐ䂳ĂAIDE fBXN IDE Rg
  [ŁASCSI fBXN SCSI Rg[Ő䂳ĂBX̃n
  [hEFARg[͓Ǝ̃Rg[WX^(control
  registers)ƃXe[^XWX^(status registers)(킹 CSRs)
  ĂB烌WX^̎dl̓foCXƂɈقȂĂAAdaptec 2940
  SCSI Rg[ CSRs  NCR 810 SCSI Rg[̂Ƃ͕ʕ
  BCRSs ̓foCX̎nƒ~AAĖff (diagnose)
  ߂ɗpBVXẽn[hEFARg[ǗR[h
  ́AX̃AvP[VɎ̂ł͂ȂALinux J[l̒
  ێĂBn[hEFARg[𑀍삠邢͊Ǘ\tg
  EFA̓foCXhCo (device driver)ƌĂ΂ĂBLinux J[l
  ̃foCXhCóA{Iɓ^Aɏ풓A჌x
  n[hEFȀ[`琬鋤LCułBSfo
  CX̓ꐫɑΏ̂ALinux ̃foCXhCo̖łB

  Un*x ̊{ÎЂƂ́AfoCX̑𒊏ۉĂ邱Ƃł
  BׂẴn[hEFAfoCX́Aʏt@Ĉ悤̂悤ɌB
  ́At@CŎgp̂ƓWIȃVXeR[𗘗p
  āAI[vAN[YA݁Aǂݏo\łBVXe
  foCX́AfoCXXyVt@Cɂĕ\ĂāA
  Ƃ΁AVXe̍ŏ IDE fBXN /dev/hda ƕ\B

  ubN(fBXN)foCXƃLN^foCXɊւẮÃfo
  CXXyVt@C mknod R}hɂč쐬AfoCXL
  q邽߂ɃW[ԍ(``major number'')ƃ}Ci[ԍ(minor
  number)Ƃ̃foCXԍgpBlbg[NfoCXfoCXX
  yVt@Cɂĕ\邪A Linux VXe
  lbg[NRg[ďƂ Linux ɂč쐬
  B̃foCXhCoɂĐ䂳邷ׂẴfoCXRg
  [́Aʂ̃W[ԍB}Ci[foCXԍgp
  ́AfoCXhCoقȂfoCX₻̃foCX̃Rg[
  邽߂łBƂ΁AvC} IDE fBXŇX̃p[eB
  V͈قȂ}Ci[ԍB䂦AvC} IDE fBXN
  p[eBV /dev/hda2 ́AW[ԍ 3 ƃ}Ci[ԍ 2 
  B Linux ́AVXeR[(Ƃ΃ubNfoCX̃t@CV
  Xe}EgȂǂ)nꂽfoCXXyVt@C
  foCX̃foCXhCoɃ}bvB̍ۂ́AfoCX̃W[
  Ƃ̃VXee[uAƂ ``chrdevs'' ƂLN^
  foCXe[uȂǂgpB
  [see: fs/devices.c]

  Linux  3 ނ̃n[hEFAfoCXT|[gĂBLN^f
  oCX (character device)AubNfoCX(block device)Albg[
  NfoCX( network device)łBLN^foCX́Aobt@Ȃ
  ŒړǂݏfoCXłAƂ΃VXẽVA|[g
  /dev/cua0  /dev/cua1 ȂǂłBubNfoCXƂ́Aub
  NTCY̔{AT^Iɂ 512  1024 oCgł̂ݓǂݏfoC
  XłBubNfoCX̓obt@LbVoRŃANZXA
  _ȃANZXAȂ킿foCX̂ǂɂubNłǂݏł
  ANZX@p邱ƂBubNfoCXւ̃ANZX́A
  ꂼɑΉfoCXXyVt@CoRĂ\ł邪A
  t@CVXeoRŃANZXقʓIłB}Eg
  t@CVXeT|[gł̂̓ubNfoCXłBlb
  g[NfoCXւ̃ANZX́A ``ulbg[Nv''̏͂ŉ
  BSD \PbgC^[tFCX܂̓lbg[NTuVXeoRōs
  B

  Linux J[lɂ͑푽l̃foCXhCo(́ALinux 
  ̂ЂƂł)A炷ׂĂȉ̈ʓIȑLĂ
  B

     J[lR[h (kernel code)
        foCXhCo̓J[l̈ꕔȂ̂ŁAJ[l̑̃R[h
        lɁA肭ȂƃVXeɐ[ȉe^Bo
        hCo̓VXeNbVꍇ炠Ǎ
        t@CVXej󂳂f[^r邱Ƃ蓾B

     J[lC^[tFCX (kernel interfaces)
        foCXhCóALinux J[l₻ꂪTuVXe
        ΂ĕWC^[tFCX񋟂Ȃ΂ȂȂBƂΒ[
        hCo Linux J[lɃt@Cւ I/O C^[tFCX
        ASCSI foCXhCo SCSI TuVXeɑ΂ăC^[
        tFCX񋟂ÃTuVXe Linux J[lɑ΂
        t@C I/O ƃobt@LbVC^[tFCX񋟂B

     J[lJjYƃT[rX
        foCXhCóA蓖Ă⊄荞݂̓`BA҂sȂ
        ̕WIȃJ[lT[rX𗘗pB

     I[h\(loadable)
        Linux ̃foCXhCȏ啔͕KvȂƂɃIf}hŃJ[
        lW[Ƃă[h\łAKvȂ΃A[
        hłBɂāAJ[l̓Kp\͂ȂAVXe
        \[X̗pオB

     ݒ̏_
        Linux ̃foCXhCo̓J[lɑgݍނƂ\łB
        ǂ̃foCXgݍނ́AJ[l̃RpCɐݒłB

     IȐݒ(dynamic)
        VXeNČX̃foCXhCoƁAhC
        o͐䂷ׂn[hEFAfoCX{B̃foCXhCo
        ɂ萧䂳͂̃foCX݂ȂƂĂ͂
        B̏ꍇAfoCXhCóAPɗ]ȂłAʂ̃V
        XeL邱ƂĔ@Ȃ鈫eyڂȂB

  9.1.  |[OƊ荞

  Ƃ΁uǂݎwb_tbs[fBXÑZN^ 42 ֓v
  R}hfoCX󂯎ƁAfoCXhCô͎ꂩ
  @A܂foCX|[O(polling)邩A邢͊荞
  (interrupt)gƂɂāÃR}hǂmF
  B

  ʏAfoCX̃|[OƂ́AfoCX̃Xe[^XWX^ω
  āANGXg̎sƂ܂ŁAfoCX̃Xe[^X
  WX^pɂɓǂݏoӖĂBfoCXhCo̓J[l
  ̈ꕔł̂ŁAAhCo|[OƂƁAVXe
  Ɉe^BƂ̂ȀꍇAfoCXNGXg
  ܂ŁAJ[lł͉sȂȂ邩łBAۂɃ|[
  OsfoCXhCóAVXe^C}[gpāA莞Ԍo
  ߌɁAJ[lɃfoCXhCõ[`ĂяoĂ炤悤
  ĂB̃VXe^C}[̃[`́AR}h̃Xe[^X
  `FbNBLinux ̃tbs[hCóA܂ɂ̎dg݂gĂ
  BA^C}[g|[Oł́AX傴ςȐ䂵ł
  Bƌ̗ǂ@́A荞(interrupt)gƂłB

  荞݂ɂċ쓮foCXhCoƂ́An[hEFAfoCX
  T[rXvƂAn[hEFAfoCXn[hEFA荞݂
  邱ƂŁA䂳Ă̂łBƂ΃C[TlbghCóA
  C[Tlbglbg[NpPbgMƂɊ荞݂
  BLinux J[ĺAn[hEFAfoCX琳foCXhCo
  Ƃ̊荞݂`BłȂ΂ȂȂB邽߂ɁAfoC
  XhCóA荞݂̏@J[lɓo^BfoCXhCo
  o^̂́A荞ݏ[`̃AhXƐL荞ݔԍ
  łBǂ̊荞݂foCXhCoɎgpĂ邩A荞݂̃^
  Cv(``type of interrupts'')ꂼꂢ邩mF
  ́A/proc/interrupts ΂悢B

   0:     727432   timer
   1:      20534   keyboard
   2:          0   cascade
   3:      79691 + serial
   4:      28258 + serial
   5:          1   sound blaster
  11:      20868 + aic7xxx
  13:          1   math error
  14:        247 + ide0
  15:        170 + ide1

  荞݃\[XɊւv́AhCȍ̍ۂɏBVX
  e̊荞݂̂͌Œ肳Ă邪A IBM PC A[LeN
  `̈YłBāAƂ΃tbs[fBXNRg[
  Ɋ荞 6 gpBȊO̊荞݁AƂ PCI foCX
  ̊荞݂́ANɓIɊ蓖ĂB̏ꍇAfoCXhC
  óA܂A䂵ĂfoCX̊荞ݔԍ(IRQ)oŁA
  ̔ԍL|vȂ΂ȂȂBPCI foCX̊荞݂Ɋւ
  āALinux ́AWI ``PCI BIOS'' ̃R[obNT|[g邱
  ŁAVXẽfoCXɊւAIRQ ԍ̏𔻒fĂB

  荞݂ CPU ̂ɓ`B@̓A[LeN`ɂĈقȂ邪A
  啔̃A[LeN`ł́A荞݂̓`B́AVXeő̊荞
  ̔~ʂȃ[hōsBāAfoCXhCo
  ́A荞ݏ[`łłȌȏׂłB
  ΁ALinux J[l͊荞ݏɏIāA荞݂NO
  ɎsĂƂɖ߂邱ƂłB荞݂Mʑ̏
  Ȃ΂ȂȂȂꍇAfoCXhCóAJ[l̃{gn
  [tnh(``bottom half handler'')^XNL[(``task queue'') 
  gpă[`L[COAŌĂяoƂ@邱Ƃ
  B

  9.2.  _CNgANZX(Direct Memory Access, DMA)

  荞݋쓮^̃foCXhCogăn[hEFAfoCXƏ
  肷邱ƂLȂ̂́Af[^ʂrIȂƂłBƂ
  9600 baud ̃f̓~b(1/1000 b)肨悻ꕶ𑗐M\ł
  B荞ݒx (interrupt latency)AȂ킿n[hEFAfoCX
  荞݂𔭐MĂfoCXhCo̊荞ݏ[`Ăяo
  ܂ł̎ԂZꍇ (Ƃ 2 ~b)Af[^]ɗvVXe
  Ŝւ̃CpNg͔ɏB9600 baud ̃f̃f[^]
  ́A0.002%  CPU ԂȂBAn[hfBXNRg
  [C[Tlbĝ悤ȍȃfoCX̏ꍇAf[^][g
  ƍȂBSCSI foCX́AőŖb 40 M oCg̏]
  B

  _CNgANZX(``DMA'')̖͂邽߂ɔ
  BDMA Rg[ɂāAfoCX̓vZbT݂̉ȂŃVXe
  Ƃ̃f[^̂肪\ɂȂBISA  DMA Rg[ 8 
   DMA `lĂāÂ 7 ̓foCXhCoɂ
  gp邱ƂłBX DMA `ĺA16 rbg̃AhXW
  X^(address register) 16 rbg̃JEgWX^(count register)
  pāAfoCXƃԂł̓]sĂBf[^]n߂
  ہAfoCXhCo DMA `l̃AhXWX^ƃJEgW
  X^ݒ肵Aɓǂݏõ݂f[^]̕ݒ肷B
  ăfoCXhCóAfoCXɑ΂āAfoCX̏
  DMA f[^]n߂邱ƂB]ƂAfoCX PC
  Ɋ荞݂B]sĂԁACPU ͎Ȓ̂Ƃo
  B

  foCXhCo DMA gpۂɒӂȂ΂ȂȂƂ
  B悸ADMA Rg[͉zɂĂ͉m炸AV
  Xe̕ɂANZXłȂƂłB
  āADMA ]ŏ܂ꂽǂݏoꂽ肷郁́A
  AubNłȂ΂ȂȂB́ADMA găvZX̉z
  AhXԂ֒ڃANZXłȂƂӖBÃv
  ZX̕y[WbNāADMA ̊Ԃɂ炪XbvfoCX
  ɃXbvAEgȂ悤ɂ邱ƂłBɁADMA Rg[
  ͕̑SɃANZXł킯ł͂ȂƂƂłBDMA
  `l̃AhXWX^́ADMA AhX̍ŏ 16 rbg\A
   8 rbg DMA ̃y[WWX^(page register)痈ĂB
  ́ADMA NGXǵẢ 16 M oCgɐĂ邱Ƃ
  B

  DMA `l 7 {Ȃ󏭎łAfoCXhCoԂŋL
  łȂB荞݂̏ꍇ̂悤ɁAfoCXhCóAǂ DMA `
  lgłȂ΂ȂȂB荞݂̏ꍇƓlAfoCX
  ̂Ȃɂ͌Œ肳ꂽ DMA `l̂BƂ΃tbs
  [fBXN͏ DMA `l 2 gpBfoCXɂẮA DMA
  `lWpɂĐݒ肷邱ƂłB̃C[Tlbgf
  oCX͂̃eNjbNgpB_ȃfoCXł́A(CSRs oR
  )ǂ DMA `lg`悤ɂȂĂāȀꍇA
  foCXhCo͒Pɋ DMA `lIŎgp邱Ƃł
  B

  Linux  DMA `l̗p󋵂Ď邽߂ɁADMA `l
  ɂЂƂ ``dma_chan'' f[^\̂́AzgpB dma_chan f
  [^\̂ɂ̓tB[hӂADMA `lgpĂ
  foCXLqւ̃|C^ƁA DMA `lłɊ
  蓖ĂĂ邩ǂ\tO܂܂ĂB /proc/dma  cat
  ۂɃvĝ́A dma_chan f[^\̂̔złB

  9.3.  

  foCXhCo͒Ӑ[gpȂ΂ȂȂBfoCXh
  Co Linux J[l̈ꕔł̂ŁAz͎gpłȂB
  ݂̎M{gn[tnh^XNL[nh̎sɂāA
  foCXhCoN邽тɁAJgvZXωBfoC
  XhCóAsłvZXɑďꍇł
  A̎s̃vZXɈˑłȂBJ[l̑̕ƓlɁA
  foCXhCo̓f[^\̂gpāAݐ䂵ĂfoCX
  B̃f[^\̂̓foCXhCöꕔƂĐÓIɊt
  邱Ƃ\A̓J[lKvȏɑ傫邾Ń\
  [X̖ʎgɂȂB啔̃foCXhCóAy[WPʂɕ
  ĂȂJ[l蓖ĂāAf[^ێĂB

  Linux ̓J[l̊蓖ĂƉ̂߂̃[`񋟂Ă
  ŁAfoCXhCo͂̃[`gpBJ[l 2  n
  悲Ƃ͈̔͂Ŋ蓖ĂBƂ΁AfoCXhCoʂ̃
  vȂꍇł 128  512 oCg蓖ĂBfoCXhCo
  voCǵÃubNTCY̒lɂ܂Ő؂グB
  ɂāAȋ󂫃̃ubN傫ȃubNɍČ₷
  Ȃ̂ŁAJ[l̉ƓeՂɂȂB

  J[lNGXgꂽہALinux J[l͔ɑ̗]v
  dȂ΂ȂȂꍇB󂫃̗ʂsꍇA
  y[W͔j邩XbvfoCXɏ܂KvB
  ALinux ́AvvZX҂sɓāA[ȃmۂ
  ܂łTXyhԂɂBAfoCXhCo(邢
  Linux J[lR[h)̂Ȃɂ̓TXyhłȂvZX̂ŁA
  ꍇAɃmۂłȂƂ́AJ[l蓖
  [`́ANGXg̏Ɏs邱ƂBfoCXhCo
  DMA gpĊ蓖Ăꂽɑ΂ď݂ǂݏo
  AhCóÃJ[l DMA ]\łƎw肷邱
  ƂłB̏ꍇAVXe DMA ]\ȃ̍\ǂ
  ȂĂ̂Ȃ΂ȂȂ̂́AfoCXhCoł͂
  ALinux J[lłB

  9.4.  foCXhCoƃJ[lƂ̃C^[tFCX

  Linux J[lƃfoCXhCo[Ƃ̑ݒʐḾAWIȕ@ōs
  Ȃ΂ȂȂBLN^foCXAubNfoCXAlbg[Nf
  oCXȂǌX̃foCXhCõNX(class)́ANXʂ̃C^
  [tFCX񋟂ĂāAJ[lɃT[rXNGXg
  ͌X̃NX̃C^[tFCXgpBeNX̃foCXfoC
  XhCo͂΂΂Ȃ萫̈قȂ邱Ƃ邪Aʂ̃C^[tF
  CX邱ƂŁAŜƂĈƂłBƂ
  ΁ASCSI  IDE fBXNƂ͔ɈقȂ邪ALinux J[l
  ͂痼ɑ΂ēC^[tFCXgp邱ƂłB

  Linux ͓IȐݒɂ_ɑΉBLinux ́AN̂тɈقȂ
  foCXo邩Ȃ̂ŁÂ߂ɗlXȃfoCXhCo
  KvƂB Linux ł́AJ[lrh̍ۂ̐ݒɂāAfoCX
  hCoJ[lɑgݍނƂłBANɏ
  ہAgݍ܂ꂽfoCXhCóA䂷ׂn[hEFA
  ȂƂB܂AJ[lɑgݍ܂ȂꍇłAhCoKv
  ȂƂ́AJ[lW[ƂĂ[h邱ƂłB̂
  ȓIȃfoCXhCo̐ɑΏ邽߂ɁAfoCXhCo͏
  ۂɃJ[lɑ΂Ď̏o^BLinux ́A
  ̃C^[tFCẌꕔƂāAo^ꂽfoCXhCõe[u
  ǗĂB̃e[uɂ́ÃNX̃foCXւ̃C^[
  tFCXT|[g郋[`яւ̃|C^܂܂ĂB

  9.4.1.  LN^foCX

     chrdevs
  +---------------+
  |  name         |
  |  fops         |---------->    file operations
  |---------------|
  |               |                lseek
  |               |                read
  |               |                write
  |               |                readdir
  |               |                select
  |               |                ioctl
  |               |                mmap
  |               |                open
  |               |                release
  |               |                fsync
  |               |                fasync
  |               |                check_media_change
  +---------------+                revalidate

  }\(8.1) LN^foCX

  LN^foCX(character device)́ALinux ̒ōłVvȃfo
  CXłB̓t@CƂăANZXł̂ŁA܂ł̃foC
  Xt@CƑSł邩̂悤ɁAAvP[V́AWVXe
  R[gpĂI[vAǂݏo⏑݂AN[Y
  B́AfoCXƂăfgAPPP f[ Linux VXe
  lbg[NɐڑꍇłłBLN^foCX
  ƂÃfoCXhCóAg Linux J[lɓo^
  ̂A̍ۂ́A``device_struct'' f[^\̂ɂz
  ``chrdevs'' ɃGgǉBfoCX̃W[ԍ(Ƃ΁A4
   tty foCX)́A̔zւ̃CfbNXƂĎgpBfoCX
  ``W[ԍ''́A\ߌ߂ĂB
  [see: include/linux/major.h]

  ``chrdevs'' žX̃Ggł ``device_struct'' f[^\
  ɂ́Aӂ̗vfBo^ꂽfoCXhCo̖Oւ̃|C^
  ƁAt@C샋[`Qւ̃|C^łB̃t@C샋[`
  Q́Aꎩ̂YfoCX̃LN^foCXhCoɂ郋[`
  ̃AhXłǍX̃[`Aopen, read, write, close 
  ǃt@Cւ̓̑BLN^foCXɊւ
  /proc/devices ̓éAchrdevs z񂩂擾B

  LN^foCX\LN^^XyVt@C(Ƃ
  /dev/cua0)I[vƂAJ[l͓K؂ȐݒsAL
  N^foCXhCõt@C샋[`Ăяo悤ɂȂ
  ΂ȂȂBʏ̃t@CfBNg̏ꍇƓlɁAX̃foC
  XXyVt@C VFS ``inode'' ɂĕ\BLN^^X
  yVt@C VFS inode ɂ́AׂẴXyVt@CƓl
  ɁAfoCXɊւ郁W[ԍƃ}Ci[ԍ܂܂ĂB VFS
  inode ́AfoCXXyVt@C̖O₢킹ۂɁA
  t@CVXȅɂāAEXT2 Ȃǂ̊{t@CVXe
  č쐬B
  [see: ext2_read_inode(), in fs/ext2/inode.c]

  X VFS inode ͈Ãt@C샋[`Ɗ֘At̂ŁA
   VFS inode ̐́A inode \Ăt@CVXeIu
  WFNg̎ނɂĈقȂ̂ƂȂBLN^^XyVt@C
  \ VFS inode 쐬ۂ͂AftHg̃LN^fo
  CX샋[`̃t@C̑샋[`ƂĐݒ肳B
  [see: def_chr_fops, in fs/devices.c]
  [see: chrdev_open(), in fs/devices.c]
  ̃ftHg̃[`́At@C̃I[vƂЂƂ̃t@C
  ܂ނ̂łBAvP[VɂăLN^t@CI
  [vꂽƂA̔ėp̃t@CI[v샋[`́AfoCX
  W[ԍ ``chrdevs'' zւ̃CfbNXƂĎgpāA̓
  ̃foCXp̃t@C샋[`QĂB܂́AY
  LN^XyVt@CLq ``file'' f[^\̂ݒ肵A
  ̃t@C샋[`ւ̃|C^YfoCXhCõt@C
  ֐Q悤ɂBāAAvP[Ṽt@C샋[
  `ׂ͂ă}bvÃLN^foCXɑ΂Ãt@C
  샋[`̌ĂяoɔB

  9.4.2.  ubNfoCX

  ubNfoCX̏ꍇAt@CɃANZXƂ̂悤ɃANZX
  dg݂T|[gĂBI[vꂽubN^XyVt@
  C𑀍삷邽߂ɓK؂ȈÃt@C샋[`񋟂ہA
  ߂Ɏgp郁JjÝALN^foCX̏ꍇƑSł
  BLinux ́A``blkdevs'' zɂāAo^ꂽÃubNfoC
  XǗĂB
  [see: fs/devices.c]
  ́A``chrdevs'' zƓlɁAfoCX̃W[ԍgčt
  ĂB̃Gg ``device_struct'' f[^\̂łB
  LN^foCXƈႤ_́AubNfoCXɂ̓NX邱Ƃł
  B SCSI foCXłAIDE foCXłBLinux Ɏ
  go^̂AJ[lɃt@C샋[`񋟂̂A
  NXłBubNfoCX̃NXɑ΂foCXhCóA
  ̃NXɃNXŗL̃C^[tFCX񋟂B䂦AƂ
  SCSI foCXhCóASCSI TuVXeɑ΂ăNXŗL̃C^[
  tFCX񋟂Ȃ΂Ȃ炸A SCSI TuVXe͂gẴf
  oCXɑ΂t@CJ[lɒ񋟂B

  ׂẴubNfoCXhCóAʏ̃t@CC^[tFCX
  ɉāAobt@LbVւ̃C^[tFCX񋟂Ȃ΂Ȃ
  BX̃ubNfoCXhCóA``blk_dev_struct'' f[^\
  ̔zł ``blk_dev'' Ɏ̃Gg쐬B
  [see: drivers/block/ll_rw_blk.c]
  [see: include/linux/blkdev.h]
  ̔zւ̃CfbNX܂foCX̃W[ԍł
  Bblk_dev_struct f[^\̂́ANGXg[`̃AhX
  ``request'' f[^\̂̃Xgւ̃|C^ɂč\BX
  request \̂́AfoCXhCoɃf[^ubNǂݏ悤
  Aobt@LbṼNGXg\ĂB

       blk_dev
  +---------------+
  |               |
  |               |     request          request
  |---------------|   +---------+    +---------+
  |request_fn()   |-->|rq_status| +->|rq_status|
  |current_request|   |---------| |  |---------|
  |               |   | rq_dev  | |  | rq_dev  |
  |---------------|   |---------| |  |---------|
  |               |   | mcd     | |  | mcd     |
  |  :            |   |---------| |  |---------|
  |               |   |         | |  |         |
  |  :            |   |         | |  |         |
  |               |   |---------| |  |---------|
  |               |   | sem     | |  | sem     |   buffer_head
  |               |   |---------| |  |---------|   +---------+
  |               |   | bh      | |  | bh      |-->| b_dev   |0x0301
  |---------------|   |---------| |  |---------|   |---------|
  |               |   | tail    | |  | tail    |   |b_blocknr|39
  |               |   |---------| |  |---------|   |---------|
  |---------------|   | next    |-+  | next    |   | b_state |
  |               |   +---------+    +---------+   |---------|
  |               |                                | b_count |
  +---------------+                                |---------|
                                                   | b_size  |1024
  blk_dev_struct z                              |---------|
                                                   |         |
                                                   |         |
                                                   |---------|
                                                   | b_next  |
                                                   |---------|
                                                   | b_prev  |
                                                   |---------|
                                                   |         |
                                                   |         |
                                                   |---------|
                                                   | b_data  |
                                                   +---------+

  }\(8.2) obt@LbVubNfoCXNGXg

  obt@LbVo^ς݃foCXɑ΂ăf[^ubNǂݏ
  悤ƂxɁAobt@LbV͂ ``blk_dev_struct'' ɑ΂
  ``request'' f[^\̂tB}\(8.2)ł́AX̃NGXg
  ЂƂ̈ȏ ``buffer_head'' f[^\̂ւ̃|C^Ă
  āAꂼꂪf[^ubN̓ǂݏ̃NGXgƂȂĂ邱Ƃ
  ĂB buffer_head f[^\̂́A(obt@LbVɂ
  )bN̂ŁÃobt@ւ̃ubN̊҂Ăv
  ZX݂邱ƂBX request \̂́A``all_requests''
  XgƂX^eBbNȃXg犄蓖ĂBNGXg̃
  NGXgXgɕtꂽꍇAhCõNGXg֐Ă
  oANGXgL[̏n߂BłȂꍇAhCo͒P
  NGXgXgɂ邷ׂĂ request B

  foCXhCo郊NGXg̏ƁAhCo
  ́A``request'' \̂X ``buffer_head'' \̂폜A
  炪XVꂽƂ}[NāAbNȂ΂Ȃ
  Bbuffer_head ̃bN̓ubN̊҂Ă邷ׂẴv
  ZXڊo߂BƂ΁At@C邽߂ɁAEXT2 t@
  CVXéÃt@CVXeێubNfoCX玟
  EXT2 fBNgGg[܂񂾃f[^ubNǂݏoȂ΂
  ȂƂB̃vZX́AǂݏoƂfBNgGg
   buffer_head ŃX[vԂɂ邪AfoCXhCõvZ
  Xڊo߂B(삪) request f[^\̂͗p\
  }[N̂ŁÃubNNGXg̍ۂɎgpB

  9.5.  n[hfBXN

  fBXNhCúAf[^]fBXNvb^(platter)ɕێ
  ƂŁAf[^𒷊Iɕۑdg݂񋟂Bf[^
  ݂ɂ͏ȃwbhvb^̕\ʂɂׂȗqBf
  [^̓wbhɂēǂݏoÃwbhׂ̔ȗq̗̎L
  oĂB

  fBXNhCu͈ꖇȏ̃vb^\BX̃vb^͒O
  OɖꂽKXZ~bN琬A_S̔ɔwŃR[
  gĂBvb^̓Z^[Xsh(central spindle)Ɏt
  AfɂĈႢ邪A3000  10,000 ̊Ԃ̈̑x
  ]BƔrꍇAtbs[ 360 RPM ł]ȂB
  fBXN̓ǂݏwbh̓f[^̓ǂݏSAvb^ꖇɈ
  gA̗ʂɑĂBǂݏwbh̓vb^\ʂɕIɐ
  G邱ƂȂAɔ(1/1疜 C`)C̑wNbVɕ
  Bǂݏwbh̓AN`G[^ɂăvb^̕\ʂړB
  ׂĂ̓ǂݏwbĥ͈ƂȂĂāAvb^\ʏׂĂ
  ɓB (: RPM, Revolutions Per Minute, ̉])

  vb^̌X̕\ʂ́AgbN(track)Ƃ΂ׂS~ɕ
  ĂBgbN 0 ԊÕgbNłAł傫Ȕԍ̃gb
  NZ^[Xshɍł߂ʒuɂBV_[(cylinder)Ƃ́A
  ԍ̃gbNׂĈgɂTOłB䂦AfBXN
  ׂẴvb^̗ʂɂ 5 ԃgbNŜAV_[ 5 ƌĂ΂
  BV_̓gbNƓȂ̂ŁAfBXNWIǵAV_
  ̕gċLqBX̃gbN̓ZN^(sector)ɕBZ
  N^̓n[hfBXNœǂݏ\ȍłȃf[^PʂłAfBX
  NubNTCYłBʓIȃZN^TCY 512 oCgłAZ
  N^TCY̓fBXÑtH[}bgAʏ̓fBXNꂽɐ
  肳B

  fBXN͒ʏAV_(cylinder)Awbh(head)AZN^(sector)Ƃ
  WIgɂċLqBƂ΋NɁALinux  IDE fBXN
  ̂悤ɋLqB

  hdb: Conner Peripherals 540MB - CFS540A, 516MB w/64kB Cache, CHS=1050/16/63

  ĹAfBXN 1050 V_(gbN)A16 wbh(8 vb^)A
  ăgbNƂ 63 ZN^ƂӖBZN^̓ub
  NTCY 512 oCg̏ꍇAfBXN 529200 LoCg (1 LoC
  g = 1024 oCgƂ) ̋LeʂƂɂȂB̓fBXN
  Ƃĕ\TCYł 516 KoCgƈꌩقȂĂ悤Ɍ
  邪A529200 / 1024 ͖ 516.8 ƂȂA͍ĂB (: 
  ݂ 540MB Ƃ̂ 1MB = 1000 x 1000 oCgŌvZꍇ̐lł
  B) fBXN̂Ȃɂ́AIɕsǃZN^oāÃZN^̎
  ӂɂZN^K؂ɗp邽߂ɁAfBXÑCfbNXt
  ̂B

  n[hfBXN͂Ƀp[eBVɕłBp[eBV͓
  ȖړÎ߂Ɋ蓖ĂꂽZN^̑K͂ȃO[vłBfBXN
  p[eBVɕ邱ƂŁÃfBXNlXȃIy[eBOV
  XelXȖړIɗp邱Ƃ\ɂȂB Linux VXe
  ́APfBXN 3 ̃p[eBVBЂƂ DOS t@C
  VXeAӂڂ EXT2 t@CVXeA3 ڂXbvp[
  eBVBn[hfBXÑp[eBV́Ap[eBVe[
  uɂċLqĂB̌X̃GǵAp[eBV̍ŏ
  ƍŌ̈ʒuwbhAZN^AV_ԍɂċLqĂBfdisk
  ŃtH[}bgꂽADOS tH[}bg̃fBXN̏ꍇA4 ̃vC}
  fBXNp[eBV݂邪A4 S̃Ggp[eBV
  e[uŎgpKv͂ȂBfdisk ɂăT|[gĂp[
  eBV^Cvɂ́AvC}Ag(extended)A_(logical) 3 
  ނBgp[eBV͎ۂ̃p[eBVł͂ȂA͔C
  ӂ̘̐_p[eBV܂ށBgp[eBVƘ_p[eBV
  Ƃ́A4 ̃vC}p[eBVƂE邽߂ɔ
  ꂽBɎ̂́Aӂ̃vC}p[eBV܂ރfBXNɑ
   fdisk ̏o͂łB

  Disk /dev/sda: 64 heads, 32 sectors, 510 cylinders
  Units = cylinders of 2048 * 512 bytes

     Device Boot   Begin    Start      End   Blocks   Id  System
  /dev/sda1            1        1      478   489456   83  Linux native
  /dev/sda2          479      479      510    32768   82  Linux swap

  Expert command (m for help): p

  Disk /dev/sda: 64 heads, 32 sectors, 510 cylinders

  Nr AF  Hd Sec  Cyl  Hd Sec  Cyl   Start    Size ID
   1 00   1   1    0  63  32  477      32  978912 83
   2 00   0   1  478  63  32  509  978944   65536 82
   3 00   0   0    0   0   0    0       0       0 00
   4 00   0   0    0   0   0    0       0       0 00

  Lł́Ap[eBV́AV_̓gbN 0 Awbh 1
  AăZN^ 1 n܂AV_ 477 AZN^ 32 Aăwbh
  63 ܂ł̗̈ɂȂĂBgbN 32 ZN^ŁA 64 wbh
  ̂ŁÃp[eBV́AV_ɍveʂBfdisk ́A
  ftHgŃV_̋Eŋ؂āAp[eBV蓖ĂB
  fdisḱAŊÕV_(0)oāAɍLĂA]
  Ɍ 478 V_\̈蓖ĂĂBp[
  eBV̓Xbvp[eBVłÃV_(478)X^[
  găfBXN̍œ̃V_ɋyłB

  gendisk_head    gendisk             gendisk
              +-----------+        +-----------+
  ----------->| major     |8    +->| major     |3
              |-----------|     |  |-----------|
              |major_name |"sd" |  |major_name |"ide0"
              |-----------|     |  |-----------|
              |minor_shift|     |  |minor_shift|
              |-----------|     |  |-----------|
              | max_p     |     |  | max_p     |
              |-----------|     |  |-----------|
              | max_nr    |     |  | max_nr    |
              |-----------|     |  |-----------|
              | init()    |     |  | init()    |   hd_struct[]
              |-----------|     |  |-----------|   +----------+  *
              | part      |     |  | part      |-->|start_sect| /|
              |-----------|     |  |-----------|   | nr_sects |  |
              | sizes     |     |  | sizes     |   |----------|  |
              |-----------|     |  |-----------|   |          |  |
              | nr_real   |     |  | nr_real   |   |  :       |  |
              |-----------|     |  |-----------|   |          |
              |real_device|     |  |real_device|   |  :       | max_p
              |-----------|     |  |-----------|   |          |
              | next      |-----+  | next      |   |  :       |  |
              +-----------+        +-----------+   |          |  |
                                                   |----------|  |
                                                   |start_sect|  |
                                                   | nr_sects |  |/
                                                   +----------+  *

  }\(8.3) fBXN̘AXg

  ̉ߒ Linux ̓VXẽn[hfBXÑg|W[}bv
  B܂An[hfBXN̐ƁÃ^Cv𒲂ׂBɁALinux 
  ʂ̃fBXNǂ̂悤Ƀp[eBVĂ邩𔭌B
  ׂ͂āA``gendisk'' f[^\̂̃Xgɂĕ\Aꂪ
  ``gendisk_head'' Xg|C^ɂă|CgBX̃fBXN
  TuVXeAƂ IDE fBXNTuVXéA
  ہAgendisk f[^\̂𐶐āAofBXNLqB
  ɁAfBXNTuVXéÃt@C샋[`o^A
  Gg ``blk_dev'' f[^\ɕtBX gendisk f[^\
  ̂́Aj[NȃfoCXW[ԍA̔ԍ́AubNXy
  VfoCX̃W[ԍƈvBƂ΁ASCSI fBXNTuV
  XéAP gendisk Gg("sd")쐬A SCSI fBXN
  foCXŜ̃W[ԍłAW[ԍ 8 tB}\(8.3)
  ́Aӂ gendisk GgAŏׂ͂Ă SCSI TuVXe
  ̂̂łAӂ߂ IDE fBXNRg[̂̂ƂȂĂB
  ҂́AvC} IDE Rg[ł ide0 łB

  fBXNTuVXe͏̉ߒ ``gendisk'' Gg쐬
  A Linux ɂăp[eBV`FbN̍ۂɎgp邾
  łBƂ͕ʂɁAX̃fBXNTuVXéAꂼƎ̃f[
  ^\̂Ǘ邱ƂŁAfoCX̃W[ԍƃ}Ci[ԍ𕨗
  fBXÑp[eBVɃ}bvĂBubNfoCXobt@
  LbVt@C샋[`oRœǂݏƂ͂AJ[
  ĺAubNXyVfoCXt@C(Ƃ /dev/sda2)ɏ
  W[ԍgāȂK؂ȃfoCXւƓBāAfo
  CX̃}Ci[ԍ(real)foCXɃ}bvĂ̂Aʂ̃f
  oCXhCofoCXTuVXełB

  9.5.1.  IDE fBXN

   Linux VXeŗpłʓIȃfBXŃAIDE
  (Integrated Disk Electronics)fBXNłBIDE Ƃ́ASCSI ̂悤
  I/O ƂAނfBXNC^[tFCXłBX IDE R
  g[͂ӂ܂ł̃fBXNT|[głB}X^[fBX
  N(master disk)łAXCufBXN(slave disk)łB}X
  ^[ƃXCű@\͒ʏAfBXÑWpsŐݒ肳BVXe
  ̍ŏ IDE Rg[̓vC}Rg[ƌĂ΂ÃR
  g[̓ZJ_Rg[ƌĂ΂BIDE ̓fBXNƂ̊Ԃ
  b 3.3 M oCg̃f[^]\͂ĂAIDE ̍őfBXNTC
  Y 528 M oCgłBg IDE A EIDE(Extended IDE) ́A
  fBXNTCY 8.4 G oCgɊg債Af[^]\͂b 16.6 M
  oCgɏグ̂łBIDE  EIDE fBXN SCSI fBXN
  ł̂ŁA݂ PC ɂ͂ЂƂȏ̃I{[h IDE Rg[
  ܂܂ĂB

  Linux ̓Rg[Ԃ IDE fBXNɖOtBv
  C}Rg[̃}X^[fBXN /dev/hda łAXCufBX
  N /dev/hdb łB/dev/hdc ̓ZJ_ IDE Rg[̃}X^[
  fBXNƂȂBIDE TuVXe Linux J[l IDE Rg[
  o^AfBXNo^ȂBvC} IDE Rg[̃W[
  ́A 3 łAZJ_ IDE Rg[̃W[ԍ 22 ł
  B́AVXeɂӂ IDE Rg[
  A``blk_devs''  ``blkdevs'' zɂ 3  22 ̃CfbNX
   IDE TuVXẽGg݂邱ƂӖBIDE fBXN
  ubNXyVt@C͂̔ԍ̊蓖Ă𔽉fĂ̂ŁAv
  C} IDE Rg[ɐڑꂽfBXNł /dev/hda  /dev/hdb
  ́AǂW[ԍ 3 BJ[l̓W[ԍCfbN
  XƂĎgpĂ邽߁ÃubNXyVt@C IDE
  TuVXe샋[`gt@Cobt@LbV
  ́A܂AIDE TuVXeւƓBNGXgׂꂽ
  ANGXgǂ IDE fBXNɑ΂̂Ȃ̂𔻕ʂ̂́AIDE
  TuVXe̖ڂłB̂߂ɁAIDE TuVXéAfoCX̓
  ʂȎʎqƂă}Ci[ԍgpB̎ʎqɂ́ANGXg
  fBXN̐p[eBVɑ邽߂̏񂪊܂܂ĂBv
  C} IDE Rg[̃XCu IDE fBXNł /dev/hdb ̃fo
  CXʎq́A``(3,64)''(W[ԍ 3 A}Ci[ԍ 64)łB
  fBXN̍ŏ̃p[eBV(/dev/hdb1)̃foCXʎq́A (3,65)
  łB

  9.5.2.  IDE TuVXȅ

  IDE fBXŃAIBM PC ̗jƐ[ւĂB̎ʂ
  IDE foCXɑ΂C^[tFCX͉xύXꂽBɂāA
  IDE TuVXȅ́AꂪoꂵGȂ̂ɂȂ
  B

  Linux T|[gł IDE Rg[̍ő吔 4 łBX̃R
  g[́A``ide_hwifs'' zɂ ``ide_hwif_t'' f[^\̂
  ĕ\BX ide_hwif_t f[^\̂͂ӂ
  ``ide_drive_t'' \̂܂łAeX}X^[ƃXCu IDE h
  CũT|[gɔ̂ƂȂĂBIDE TuVXȅ̉
  ŁA Linux ͂܂AVXe CMOS ɃfBXNɊւ񂪂
  邩ǂmFB́APC ̓d؂ꂽƂobe쓮
  obNAbvɂĂ̓eȂ悤ɂȂĂB
  CMOS ͎ۂɂ̓VXẽA^CNbN̒ɂÃN
  bN PC ̓dĂ邩ǂɊւ炸AsĂB
  CMOS ̏ꏊ BIOS gĐݒ肪\łAꂪ Linux ɑ΂
  Ăǂ̂悤 IDE Rg[hCuoꂽBLinux
  ͌oꂽfBXÑWIg BIOS ĂāȀ𗘗p
  ēYfoCX ide_hwif_t f[^\̂ݒ肷B茻I PC
  ł́APCI (E)IDE Rg[Ɋ܂܂ Intel  82430 VX ̂悤 PCI
  `bvZbggpBāAVXeɂ邻`bvZbgp
   PCI ŗĽo[`R[B

  X IDE C^[tFCXRg[ꂽA
  ``ide_hvif_t'' \̂ÃRg[₻ɐڑꂽfBXN
  Ԃ𔽉f邽߂ɐݒ肳Bݒ̉ߒŁAIDE hCóAI/O 
  Ԃɑ݂ IDE R}hWX^ɃR}hށBvC}
  IDE Rg[̃Rg[WX^ƃXe[^XWX^̃ftH
  g I/O AhX́A0x1F0  0x1F7 łB̃AhX̐ݒ
  ́A IBM PC ̊KɂČ܂ĂB IDE hCóAX
  Rg[ Linux ̃ubNobt@LbV VFS ɓo^A
   ``blk_dev''  ``blkdevs'' zɂꂼtBIDE hCu
  K؂Ȋ荞ݐvBł܂Å荞ݔԍ͊KI
  ܂ĂAvC} IDE Rg[ 14 ŁAZJ_Rg
  [ 15 łBÁÂׂĂ IDE ̏ڍׂƓlɁA
  J[lւ̃R}hCIvVɂď㏑ύX\łB
   IDE hCóANɔꂽX IDE Rg[ɂ
  āA``gendisk'' ̃Xg gendisk ̃GgtB̃Xg
  ͌ŁANɌׂẴn[hfBXÑp[eBVe[u
  𔭌邽߂ɎgpB

  9.5.3.  SCSI fBXN

  SCSI (Small Computer System Interface)oX́AIȈΈ(peer-to-
  peer) ̃f[^oXłAЂƂȏ̃zXg܂ 8 ̃foCX
  Ƃ̃oXŃT|[gBX̃foCX͌ŗL̎ʎqKv
  Aʏ킻̓fBXÑWpsŐݒ肳BoXɂCӂ
  ӂ̃foCXԂœ邢͔񓯊̃f[^]\łA32
  rbg̃f[^]ɂő喈b 40 M oCg̓]x
  BSCSI oX́AfoCXԂŃf[^ƃXe[g ()̗̏]
  BCjVG[^(initiater)ƃ^[Qbg(target)Ԃ̈̓]ɍ
   8 ̈قȂtFCY(phase)邱ƂB݂ SCSI oX̃tF
  CY 5 {̐AmFłB8 ̃tFCYƂ͎̂悤Ȃ
  łB

     BUS FREE
        oX𐧌䂵ĂfoCX݂͑AgUNV͌ݍs
        ĂȂB

     ARBITRATION
        SCSI foCX SCSI oX𐧌䂵悤ƂĂāASCSI ʎqɑ
        sLɂĂBSCSI ʎq̍ōlD悳B

     SELECTION
        ARBITRATION ʂăfoCX SCSI oX̐ɐƂA
        ̃foCX SCSI ̃^[Qbgɑ΂āAR}h𑗂|̃NG
        Xg SCSI oX̐œ`Ȃ΂ȂȂB邽
        ɁA^[Qbg SCSI ʎqɑΉsLɂB

     RESELECTION
        SCSI foCX́ANGXgɐڑ𒆎~邩ȂB
        ̏ꍇA^[QbǵACjVG[^ɍĐڑłBׂĂ
        SCSI foCX̃tF[YT|[gĂ킯ł͂ȂB

     COMMAND
        6,10,  12 oCg̖߂ACjVG[^^[Qbgɑ
        邱ƂłB

     DATA IN, DATA OUT
        ̃tF[YɂāAf[^̓CjVG[^ƃ^[QbgԂœ]
        B

     STATUS
        ̃tF[Yɓ̂́AR}hׂĎsA^[QbgC
        jVG[^ɑ΂ĐsXe[^XoCg𑗂邱Ƃ
        ꍇłB

     MESSAGE IN, MESSAGE OUT
        CjVG[^ƃ^[QbgԂł̒ǉ̓]B

  Linux SCSI TuVXéAӂ̊{vf琬Aꂼꂪf[^
  \̂ɂĕ\B

     host
        SCSI zXg(host)Ƃ͕Iȃn[hEFAł SCSI Rg[
        wB NCR810 PCI SCSI Rg[ SCSI zXg̓T^ł
        BLinux VXe SCSI Rg[𕡐ꍇAX
        ̃Rg[́Aʂ SCSI zXgƂĕ\B
        ́ASCSI foCXhCõ͓Rg[𕡐ł邱
        ƂӖBSCSI zXǵAقƂǂ SCSI R}h̃Cj
        VG[^łB

     Device
        SCSI foCX̒ōłʓIȂ̂ SCSI fBXNł邪ASCSI
        Ki͂Ƒނ̃foCXT|[gĂBe[vACD-ROM
        ɔėp SCSI foCXȂǂłBSCSI foCX͂قƂǂ
         SCSI R}h̃^[QbgłB̃foCX͈قȂ
        舵KvłAƂ CD-ROM e[vȂǂ̃[o
        fBȀꍇALinux ͂̃fBAoꂽǂmFł
        Ȃ΂ȂȂBقȂfBXN^Cvɂ͈قȂ郁W[ԍ^
        Aɂ Linux ̓ubNfoCXւ̃NGXgK
        ؂ SCSI ^Cvɓ`B邱ƂłB

  9.5.4.  SCSI TuVXȅ

  SCSI TuVXȅ́ASCSI oXfoCX̓IȐ𔽉f
  āAɕGȂ̂ɂȂĂBLinux  SCSI TuVXeu[g
  ɏBVXe SCSI Rg[(SCSI zXgƌĂ΂)
  oARg[Ƃ SCSI oXāAoX̃foCX
  ČoB̏ŁÃfoCXāALinux J[l̎c
  ̕Aʏt@C̑샋[`obt@LbVubNfo
  CX̑샋[`oRāAfoCX𗘗p邱Ƃo悤ɂ
  B̏ɂ 4 ̃tFCYB

  ܂ Linux ́AJ[l\zɃJ[lɑgݍ܂ꂽ SCSI zXgA_
  v^̓Rg[̂A䂷ׂn[hEFA̂͂ǂ
  ̂BJ[lɑgݍ܂ꂽX̃zXg
  ́A``builtin_scsi_host'' z ``Scsi_Host_Template'' Gg
  B Scsi_Host_Template f[^\̂ɂ̓[`ւ̃|C^܂܂
  āAɂ SCSI zXgɐڑꂽ SCSI foCX̌oƂ
   SCSI zXgŗL̏sB̃[`́ASCSI Tu
  VXeɂĂĂяoāA̐ݒsB́A
  ̃zXg^CvT|[g SCSI foCXhCöꕔłBo
  ꂽX SCSI zXĝAۂ SCSI foCXڑĂ
  ́A Scsi_Host_Template f[^\̂AANeBu SCSI zXg
  ̃Xgł ``scsi_hosts'' XgɕtBoꂽzXg^C
  v̌X SCSI Rg[́A``scsi_hostlist'' Xgɂ
  ``Scsi_Host'' f[^\̂ɂĕ\BƂ΁ANCR810 PCI
  SCSI Rg[VXéAXgɁARg[ƂɂЂ
  Avӂ Scsi_Host GgBX Scsi_Host \̂́A
  ̃foCXhCo\Ă Scsi_Host_Template |CgĂ
  B

                                    Scsi_Host_Template
  scsi_hosts                         +--------------+
  ---------------------------------->| next         |
                                     |--------------|
                          +--------->| name         |
                          |          |--------------|
                          |          |              |
                          |          | Device       |
                          |          | Driver       |
                          |          | Routines     |
                          |          |              |
                          |          +--------------+
                          +--------------------------------+
                                                           |
  scsi_hostlist                         Scsi_Host          |
  ----------------------------------->+-------------+      |
                          +---------->| next        |      |
                          |           |-------------|      |
                          |           |             |      |
                          |           |-------------|      |
                          |           | this_id     |      |
                          |           |-------------|      |
                          |           | max_id      |      |
                          |           |-------------|      |
                          |           |             |      |
                          |           |-------------|      |
                          |           | host        |<-----+
                          |           |-------------|
                          |           |             |
                          |           +-------------+
                          +--------------------------------+
                                                           |
                   Scsi_Device            Scsi_Device      |
  scsi_device    +-------------+        +-------------+    |
  -------------->| next        |------->| next        |    |
                 |-------------|        |-------------|    |
                 |             |        |             |    |
                 |-------------|        |-------------|    |
                 | id          |        | id          |    |
                 |-------------|        |-------------|    |
                 | type        |        | type        |    |
                 |-------------|        |-------------|    |
                 |             |        |             |    |
                 |-------------|        |-------------|    |
                 | host        |        | host        |<---+
                 |-------------|        |-------------|
                 |             |        |             |
                 |             |        |             |
                 +-------------+        +-------------+

  }\(8.4) SCSI f[^\

  SCSI zXgׂČA SCSI TuVXéAX SCSI
  zXgɂǂ SCSI foCXqĂ̂oȂ΂
  ȂBSCSI foCXɂ 0  7 ܂ł̔ԍUAX̃foCX
  ԍ SCSI ʎq͂ꂪqꂽ SCSI oXɂăj[N
  Ȃ΂ȂȂBʏASCSI ʎq̓foCX̃WpsŐݒ肳
  BSCSI R[h́A SCSI oX̌X SCSI foCXo
  ƂA TEST_UNIT_READY R}h𑗐MBfoCX
  ƁAENQUIRY R}hMāÃfoCX̎ʎqǂݏo
  Bɂ Linux ́Ãx_AfoCXfArW
  擾B SCSI R}h ``Scsi_Cmnd'' f[^\̂ɂĕ\
  A炪 SCSI zXgɑ΂foCXhCoɓnƂ́A
   ``Scsi_Host_Template'' f[^\̓ɂfoCXhCo[`
  ĂяoBꂽׂĂ SCSI foCX ``Scsi_Device''
  f[^\̂ɂĕ\ǍX̍\̂̐eł
  ``Scsi_Host'' |CgĂBׂĂ Scsi_Device f[^\̂
  ``scsi_devices'' XgɕtB}\(8.4) ł́Avȃf[^
  \̂ǂ̂悤ȑ݊֌Wɂ̂ĂB

  SCSI foCXɂ́AfBXNAe[vACD Aėp 4 ނ̃^Cv
  B SCSI ^Cv̊eXقȂ郁W[ubNfoCX^Cv
  ăJ[lɓƗēo^BÁA̎ SCSI fo
  CX^CvЂƂȏ㌩ꍇ̂ݓo^ȂBSCSI fBXN
  ̂悤ȌX SCSI ^Cv͓Ǝ̃foCXe[uǗĂB
  Ẵe[u𗘗păJ[l(t@Cobt@LbV
  ΂)ubN샋[`𐳂foCXhCo SCSI zXgɓ
  BX SCSI ^Cv ``Scsi_Device_Template'' f[^\̂ɂ
  \Bɂ́A SCSI foCX̃^CvƗlXȃ^XNs
  郋[`̃AhXɊւ񂪊܂܂BSCSI TuVXe͂
  ̃ev[ggpČX SCSI ^CṽfoCXɑ΂ SCSI ^C
  v[`ĂяoBƁA SCSI TuVXe SCSI fB
  XNfoCXǉꍇA SCSI fBXN^Cv̒ǉp[`
  ĂяoBЂƂȏ̂̃^Cv SCSI foCX
  AScsi_Type_Template f[^\(:
  ``Scsi_Device_Template''H) ``scsi_devicelist'' Xgɕt
  B

  SCSI TuVXȅɂŌ̃tF[ÝAo^ꂽ
  ``Scsi_Device_Template'' ̌Xɑ΂Ip֐ĂяoƂł
  BSCSI fBXN^CvƂɁÅ֐Aoꂽ SCSI fBXN
  ׂĂ܂Ƃ߂āÃfBXNWIgL^B܂ÁA
  ׂĂ SCSI fBXN\Ă ``gendisk'' f[^\̂``}
  \(8.3)''ŎfBXN̘AXgɕtB

  9.5.5.  ubNfoCX̃NGXg`B

  Linux  SCSI TuVXȅƁASCSI foCXp
  \ɂȂBX̃ANeBu SCSI foCX̃^Cv́ALinux ubN
  foCXNGXgɓ悤ɁAJ[lɓo^B
  NGXgɂ ``blk_dev'' oRobt@LbVNGXg
  ``blkdevs'' oRt@C샊NGXgȂǂBł́AЂƂ
  ̐ EXT2 t@CVXẽp[eBV SCSI fBXN
  ɎƁA EXT2 p[eBV}EgĂƂAJ[l
  obt@NGXg͂ǂ̂悤ɂēK؂ SCSI fBXNɓn̂
  H

  SCSI fBXNp[eBVɑ΂f[^ubN̓ǂݏNGXg
  ׂƁA``request'' \̂ ``blk_dev'' zɂ邻 SCSI
  fBXN ``current_request'' XgɕtB request Xg
  ĂꍇAobt@LbV͉KvȂ̂A
  łȂꍇ́A SCSI TuVXe𑣂ẴNGXgL[
  Ȃ΂ȂȂBVXěX SCSI fBXN ``Scsi_Disk''
  f[^\̂ɂĕ\ĂB̍\̂ ``rscsi_disks'' z
  ɕۑĂāA̔z SCSI fBXNp[eBṼ}Ci[ԍ
  ̈ꕔgpăCfbNXtĂBƂ΁A/dev/sdb1 ̓
  W[ԍ 8 ƃ}Ci[ԍ 17 Ă邪A̓CfbNX 1 
  BX Scsi_Disk f[^\̂ɂ́ÃfoCX\
  ``Scsi_Device'' f[^\̂ւ̃|C^܂܂ĂB̍\̂
   ``Scsi_Host'' \̂|CgĂAꂪ̃foCX́uI[
  i[vłBobt@LbV request f[^\̂́ASCSI f
  oCXɑMׂ SCSI R}hLqĂ ``Scsi_Cmnd'' \
  ̂ɕϊAꂪ̃foCX\ Scsi_Host f[^\̏̃L
  [ɒuBK؂ȃf[^ubN܂ꂽǂݏoꂽ
  肷ƁAƂʂ SCSI foCXhCoɂď
  B

  9.6.  lbg[NfoCX

  Linux ̃lbg[NTuVXeɊւAlbg[NfoCX
  ́Af[^pPbg𑗎M̂̂ƂłBʏ킱̓C[Tlbg
  J[hȂǂ̕foCXłBAf[^ɑM邽߂Ɏg
  p郋[vobNfoCX(loopback device)Ƃ\tgEFA
  lbg[NfoCXBX̃lbg[NfoCX ``device'' f
  [^\̂ɂĕ\B
  [see: include/linux/netdevice.h]
  lbg[NfoCXRg[́AJ[lÑlbg[N
  ߒŁA Linux ɐ䂵悤ƂfoCXo^Bdevice f[^\
  ̂ɂ́AfoCXɊւƁAT|[g鑽lȃvgRfoC
  X̃T[rX𗘗pۂɎg֐̃AhXƂ܂܂B̊֐
  ͑啔lbg[NfoCXgpf[^]Ɋւ̂łB
  foCX́AMf[^K؂ȃvgRwɓn߂ɕWIȃlb
  g[NT|[g@\gpBMꂽׂẴf[^(pPb
  g)́A``sk_buff'' f[^\̂ɂĕ\邪A͏_ȍ\
  ̂Ȃ̂ŁAlbg[NvgR̃wb_̊ȒPȒǉ폜\ɂ
  Blbg[NvgRwlbg[NfoCXgp@A
  炪 sk_buff f[^\̂gpăf[^󂯓n@ɂ
  ́A ``ulbg[Nv''̏͂ŏڂB{͂ł́A device f[
  ^\̂ƃlbg[NfoCXoꏉ@ƂɏWB

  ``device'' f[^\̂ɂ̓lbg[NfoCXɊւ鎟̂悤ȏ
  ܂܂ĂB

     O (name)
        mknod R}hgăfoCXXyVt@C쐬ub
        NfoCXLN^foCXƂ͈قȂAlbg[NfoCX
        XyVt@ĆAVXẽlbg[NfoCXoꏉ
        ۂɎIɏoB̖O͕WIȂ̂ŁAX
        O͂̃foCX̃^Cv\ĂB^CṽfoCX
        ꍇ́A0 珇ɔԍtBāÃC[T
        lbgfoCX́A/dev/eht0, /dev/eth1, /dev/eth2 ƂȂB
        Iȃlbg[NfoCXB

        /dev/ethN  C[TlbgfoCX

        /dev/slN   SLIP foCX

        /dev/pppN  PPP foCX

        /dev/lo    [vobNfoCX

     oX (bus information)
        ́AfoCXhCofoCX𐧌䂷邽߂ɕKvȏł
        B``irq'' ԍ͂̃foCXgp銄荞ݔԍłB
        ``base_addr''  I/O ɂRg[WX^ƃXe[
        ^XWX^̃AhXłB ``dma'' ͂̃lbg[NfoC
        Xgp DMA `l̔ԍłB炷ׂĂ̏̓u
        [g̃foCXۂɐݒ肳B

     C^[tFCXtO(interface flag)
        ́Albg[NfoCX̓Ɣ\͂ƂĂB

        IFF_UP           C^[tFCXNsłB

        IFF_BROADCAST    foCX̃u[hLXgAhXLłB

        IFF_DEBUG        foCX̃fobMOLłB

        IFF_LOOPBACK     ́A[vobNfoCXłB

        IFF_POINTTOPOINT ́AΈ(point to point)̃NłB(SLIP  PPP)

        IFF_NOTRAILER    lbg[NgC[(network trailer)ȂB(: pW)

        IFF_RUNNING      \[X蓖ĂꂽB

        IFF_NOARP        ARP vgRT|[gȂB

        IFF_PROMISC      v~XNM[h̃foCX́ApPbg̑MAhX
                         Ƃ͖֌WɂׂẴpPbgMB

        IFF_ALLMULTI     IP }`LXgt[MB

        IFF_MULTICAST    IP }`LXgt[̎M\B

     vgR
        X̃foCX́Albg[NvgRwɂĂǂ̂悤ɗp
        ̂ĂB

        ő]P (mtu)
           ̃lbg[NőM\ȍőpPbg̃TCYBA
           ɕt郊Nw̃wb_͊܂܂ȂB̍ől
           ́AIP Ȃǂ̃vgRwMpPbg̓KTCYI
           ۂɗpB

        t@~[ (family)
           t@~[Ƃ́ÃfoCXT|[głvgRt@~
           [wBׂĂ Linux lbg[NfoCXŃT|[g
           t@~[́AAF_INETAȂ킿C^[lbgAhXt@~
           [łB

        ^Cv (type)
           n[hEFAC^[tFCX^CvƂ́Albg[NfoCX
           tꂽfBA\ĂBLinux ̃lbg[Nf
           oCXT|[g郁fBÃ^Cv͑ɓnBɂ́A
           C[TlbgAX.25Ag[NOASLIPAPPPAAbv[J
           g[NȂǂ܂܂B

        AhX (Address)
           device f[^\̂́AIP AhX܂߂āÃlbg[N
           foCXɊ֌W邢̃AhXێB

     pPbgL[ (Packet Queue)
        ́Albg[NfoCXœ]҂Ă ``sk_buff'' p
        Pbg̃L[łB

     T|[g֐ (Support Functions)
        X̃foCX́ÃfoCX̃Nwɑ΂C^[tFCX
        ̈ꕔƂāAvgRwR[ł郋[`̕WZbg
        Bɂ́Aݒ胋[`t[M[`ȊOɂAW
        t[wb_tⓝvW̃[`܂܂B
        v ifconfig R}hgČ邱ƂłB

  9.6.1.  lbg[NfoCX̏

  lbg[NfoCXhCóA Linux foCXhColALinux
  J[lɑgݍނƂłBgݍ܂ꂽX̃lbg[NfoCX
  ́A ``device'' f[^\̂ɂĕ\A̍\̂́A|C^̃
  Xgł ``dev_base'' ɂă|Cgꂽlbg[NfoCX̃
  XgɒuBlbg[NẃAfoCXŗL̎dKvȏꍇA
  lbg[NfoCXɊւ鑽̃T[rX[`̂ЂƂĂяo
  A[`̃AhX device f[^\̓ɕێĂ
  BAK؂ȏςނ܂ł́A device f[^\̂́A
  ͌o[`̃AhXێĂȂB

  lbg[NfoCXhCoɊւĉׂ͂ӂB܂A
  Linux J[lɑgݍ܂ꂽlbg[NfoCXhCôׂĂ
  ׂfoCXĂ킯ł͂ȂƂłBЂƂ́AVXe
  ̃C[TlbgfoCX́ÅbɂȂfoCXhCoƂ͖
  ֌WɁA /dev/eth0A/dev/eth1 ƌĂ΂邱ƂłBlbg[Nfo
  CX݂ȂƂ́AȒPɉłBX̃lbg[Nfo
  CX̏[`ĂяoꂽۂɁÃ[`́A쓮ׂ
  ۂ̃Rg[łǂ񍐂Xe[^XԂB
  hCofoCXȂꍇA``dev_base'' ɂă|C
  g ``device'' \̂̃Xg̃foCX̃Gg͍폜
  BhCofoCXołꍇAdevice f[^\̖̂ݒ蕔
  ɁÃfoCXƃlbg[NfoCXhCõT|[g֐
  AhXƂށB

  ЂƂ̖łAC[TlbgfoCXɕWI /dev/ethN fo
  CXXyVt@C𓮓IɊ蓖ĂĂ܂Ƃ_ɂẮA
  ۂ悭BfoCXXgɂ 8 ̕WGgA
   eth0, eth1  eth7 ܂ŕłB[`͑Sɋ
  łAJ[lɑgݍ܂ꂽC[TlbghCoAvfoCX
  ܂ŏԂɎĂBhCoYC[TlbgfoCX
  ƂAhCoL邱ƂɂȂ ethN ``device'' f[^
  \̂ɏށBāA̎ɁAlbg[NfoCXh
  CóA䂷镨foCXAgp IRQ (KvȂ)
  DMA `l肷BhCóA䂷ׂ̃lbg[Nf
  oCXo邱ƂȀꍇ́A /dev/ethN device f[^
  \̂擾邱ƂɂȂB8 ׂĂ /dev/ethN devicd 蓖Ă
  ƁAȏ̃C[TlbgfoCX̌o͍sȂB

  10.  t@CVXe

  ̏͂ł́ALinux J[lT|[gt@CVXeł̃t@C
  Ǘ̕@Azt@CVXe̎dg݂ɂĉB
  ALinux J[l̎(real)t@CVXeǂ̂悤ɃT|[g
  ̂ɂĂB

  Linux ̍łdvȓ̂ЂƂɁAT|[gt@CVXe̖Lx
  B̂ƂALinux ɏ_Ȃ̂ɂȂ̃Iy[
  eBOVXeƂ̋\ɂĂB݂ɊւāALinux 
  15 ̃t@CVXeT|[gĂB́Aext, ext2, xia,
  minix, umsdos, msdos, vfat, proc, smb, ncp, iso9660, sysv, hpfs, affs,
   ufs łA炭Ƒ̃t@CVXeǉ
  邾낤B

  Linux ł́AUnix ̏ꍇƓlɁAVXeŎgpʂ̃t@C
  VXeɃANZXہA(hCuԍhCuƂ)foCX
  ʎq͎gȂB̃t@CVXéAP̊KwIȃc[\
  ɓAɂăt@CVXe͑ŜłЂƂ̎̂Ƃĕ\
  BVt@CVXe}EgꍇALinux ͌X̃t@C
  VXe̒P̃c[\ɕtBׂẴt@CVXe
  ́Ã^CvɊւ炸ACӂ̃fBNgɃ}EgA}Eg
  ꂽt@CVXẽt@C̃fBNgɌe݉B
  BfBNǵA}EgfBNg̓}Eg|C
  gƌĂ΂Bt@CVXe}EgƁÃ}Eg
  fBNgɑ݂t@CēxoB

  fBXN(Ƃ΁Afdisk gp)ƂAfBXNɃp
  [eBV\ݒ肳AfBXN̘_p[eBV
  ɕBX̃p[eBV́AEXT2 t@CVXeƂP
  ̃t@CVXeێBt@CVXe̓t@CgDA
  foCX̃ubNɕێꂽfBNg\tgN(V{
  bNN)Ȃǂɂ_IȊKw\`Bt@CVXe
  foCX̓ubNfoCXƌĂ΂B IDE fBXÑp[
  eBV /dev/hda1 ́AVXe̍ŏ IDE fBXN̍ŏ̃p[
  eBVł邪A̓ubNfoCXłBLinux t@CVXe
  ́AubNfoCXubNPɐ`ɕ񂾂̂ƌłĂA
  ʂɂ镨fBXÑWIgɊւĂ͒mȂ͊֐S
  ȂBfoCX̓ubN̓ǂݏoNGXgÃfoCX
  ƂĈӖ̂錾tɒu邱ƁAȂ킿AubNۑĂ
  邻̃n[hfBXN̓̃gbNAZN^AV_Ȃǂɒu
  ̂́AX̃ubNfoCXhCo̎dłBt@CVXe
  ́AێĂ̂ǂ̂悤ȃfoCXłĂA@ł
  āAFABɁALinux ̃t@CVXegp
  ΁AقȂt@CVXeقȂn[hEFARg[ɐ
  䂳ꂽقȂ镨fBAɂƂƂ́A(ȂƂVXe
  [UɂƂĂ)ł͂ȂȂBt@CVXe̓[JVXe
  ɂȂƂ\łAlbg[NNzɉuŃ}Eg
  ꂽfBXNłĂ悢BLinux VXe SCSI fBXNɃ[g
  t@CVXeĂ鎟̗ōlĂقB

  A         E         boot      etc       lib       opt       tmp       usr
  C         F         cdrom     fd        proc      root      var       sbin
  D         bin       dev       home      mnt       lost+found

  [U͂At@ĈɑvOłAL /C
  ̓}Egꂽ VFAT t@CVXełAVXȇ IDE
  fBXNɂ邱ƂmKv͂ȂBL̗ł(͎ۂɂ킽
  ŎgpĂ Linux VXê̂Ȃ̂)A/E ͑ IDE R
  g[̃}X^[ IDE fBXNłBvC} IDE Rg[
   PCI Rg[ŁÃRg[ IDE CD-ROM 𐧌䂷 ISA
  Rg[łƂƂ(t@CVXeł)ǂ
  ͂ȂB܂AfƂ̃fɂ PPP lbg[NvgRg
  pāAdbŐẼlbg[NɐڑȀꍇAɂ킽
  Alpha AXP Linux VXẽt@CVXe /mnt/remote ɉu
  Ń}Eg邱ƂłB

  t@CVXẽt@C̓f[^̏ŴłB̏͂̕(:
  ̂)̃\[Xt@C filesystems.tex Ƃt@C
   ASCII t@CłBt@CVXéÃt@CVXe
  ̃t@CɊ܂܂f[^ێ邾łȂAt@CVXe̍\
  ێĂBLinux ̃[UvZXAt@CAfBNg
  A\tgN(V{bNN)At@Cی񓙁XƂČĂ
  ׂ͂āAt@CVXeɂĕێĂBɁAt@C
  VXe͂SAmɕێȂ΂ȂȂBIy[
  eBOVXe̊{Iȓꐫ́At@CVXeɈˑĂ邩
  łBf[^t@C̑r˔IɋNIy[eBOVXe
  gƂl͂Ȃ낤(``r1'')B

  Linux ŏɍ̗pĂ minix t@CVXéA␧A
  ptH[}XɂĂBt@C 14 ȏɂȂĂ͂Ȃ
  (łA8  + 3 Ƃt@C͂܂ł)Aő
  t@CTCY 64M oCgłB64 M oCgƂƈꌩ[ȃTC
  Ŷ悤Ɏv邪AƂf[^x[X낤ƂƑ傫ȃt@
  CTCY͕KvłBLinux pɃfUCꂽŏ̃t@CVXe
  ł Extended File System (EXT) ́A1992 N 4 ɔ\A
  肪PꂽAł܂ptH[}X̌@ꂽB
  䂦A1993 NASecond Extended File System (EXT2) oꂵB̏͂
  قǏڍׂɏqׂ̂́Ãt@CVXeɂĂłB

  EXT t@CVXeہAdvȔWB(real)t@C
  VXeIy[eBOVXeVXẽT[rX番A
  ̃C^[tFCXwƂĉzt@CVXe(Virtual File System,
  VFS) tꂽƂłBVFS ɂāALinux ́ÁA΂
  ɐ̈قȂt@CVXẽT|[g\ɂȂB
  X̃t@CVXe VFS ɑ΂ʂ̃\tgEFAC^[tFCX
  񋟂BLinux ̃t@CVXȅڍׂׂ̂Ă\tgEFAŕϊ
  ̂ŁALinux J[l̎c̕VXeŎsĂv
  OɂƂāAt@CVXe͑SɌBLinux ̉
  zt@CVXeɂāAɑ̈قȂt@CVXe𓧉ߓI
  Ƀ}Eg邱Ƃ\ɂȂĂB

  Linux ̉zt@CVXéAt@Cւ̃ANZXo邾
  IȂ̂ɂ邽߂ɎĂB̓t@Cf[^̐mȕ
  mɍsȂ΂ȂȂBӂ̗v͗̂
  Bt@CVXe}EgėpہALinux  VFS ͂
  X̏ɃLbVBt@CfBNgɑ΂
  쐬⏑݁A폜ȂẴLbṼf[^ύXꂽ
  At@CVXe𐳂XVɂׂ͍ȔzKvɂȂBs
  ̃J[lɂt@CVXẽf[^\邱ƂłƂ
  ΁At@CVXeɂăf[^ubN̓ǂݏȂlq
  @ł邾낤BANZXĂt@CfBNgLqf[
  ^\̂̍쐬jȂA܂InfoCXhCo삵ĂāA
  f[^̎荞݂ۑsĂB̃LbVōłdvȂ
  Aobt@LbV(buffer cache)łÁAʂ̃t@CVX
  e̊błubNfoCXɃANZXdĝ݂Ȃɑgݍ
  ܂ĂBubNANZXƁA̓obt@LbVɓ
  ȀԂɉėlXȃL[ɕێBobt@Lb
  V́Af[^obt@LbV邾ł͂ȂA񓯊C^[tF
  CXǗ邱ƂŁAubNfoCXhCo̎菕ĂB

  10.1.  Second Extended File System (EXT2)

           +---------------------------------------------+
           |  | Block   |          | Block     | Block   |
           |  | Group 0 |          | Group N-1 | Group N |
           +---------------------------------------------+
                                   |           |
                             +-----+           +-----+
                             |                       |
  <--------------------------+                       +-------------->

  +------------------------------------------------------------------+
  | Super | Group       | Block  | Inode  | Inode |       Data       |
  | Block | Descriptors | Bitmap | Bitmap | Table |       Block      |
  |       |             |        |        |       |                  |
  +------------------------------------------------------------------+

  }\(9.1) EXT2 t@CVXe̕ICAEg

  EXT2 t@CVXe(Second Extended File System) ́ARemy Card 
  člĂꂽ Linux p̊gɕxރptȃt@CVXeł
  B Linux R~jeB[ɂĂ܂łōłt@C
  VXełAݏoׂĂ邷ׂĂ Linux fBXgr[V
  ̊ՂłB
  [see: fs/ext2/*]

  EXT2 t@CVXéÃt@CVXelAt@Cɕێ
  ꂽf[^̓f[^ubNɕۑƂÔƂɍ\zĂ
  B̃f[^ubNׂ͂ēTCYłÃTCY͈قȂ
  EXT2 t@CVXeԂŕω邱Ƃ邪A EXT2 t@CV
  XeɂubNTCY(mke2fs R}hgp)t@CVX
  e쐬ɐݒ肳Bt@CTCYׂ͂āAubNTCY̐{
  ɐ؂グBubNTCY 1024 oCg̏ꍇA1025 oCg
  t@C 1024 oCg̃ubNӂLBcOȂƂɁA
  ςƃt@CƂɔubÑfBXNXy[XQ邱Ƃ
  ӖB( CPU ΋LuƂґ̌炷)Rs[^
  ł͒ʏACPU ]ɂăƃfBXNXy[XLpB
  ̏ꍇALinux ́A啔̃Iy[eBOVXeƓlACPU
  ׂ̕炷߂ɁArÏfBXN̎gB

  t@CVXêׂẴubNf[^ێĂ̂ł͂ȂB
  ubN̈ꕔ́At@CVXe̍\Lqێ邽߂
  gpĂB EXT2 ̓t@CVXẽg|W[`邽߂ɁA
  VXěX̃t@C ``inode'' f[^\̂ŋLqĂB
  inode Lq鎖ɂ́At@C̃f[^ێꂽubN̈ʒu
  At@Cւ̃ANZXAt@C̕ύXԁAt@C^CvȂǂ
  B EXT2 t@CVXêׂẴt@ĆAP inode ŋLq
  AX inode ͎ʂ̂߂̒PŃj[NȔԍBt@C
  VXe inode ́Ainode e[uɕۑB EXT2 ̃fBN
  gƂ(ꎩ̂ inode ɂċLqĂ)ȃt@Cɂ
  Ãt@CɊ܂܂̂́ÃfBNg(ێ) Gg
   inode ւ̃|C^łB

  ``}\(9.1)''́AEXT2 t@CVXẽCAEĝł邪A
  ́AubN\foCXŘAubNLĂ
  BX̃t@CVXe炷ƁAubNfoCXƂ͓ǂݏ\
  ȈÃubNɂȂBt@CVXe͕fBÂǂɃu
  bNuׂCɂKvȂB̓foCXhCo̎d
  Bt@CVXeubNfoCX̎f[^ǂݍޕK
  vƂ́ÃfoCXT|[gfoCXhCoɑ΂āA
  鐮{̐̃ubNǂݍނ悤NGXgB EXT2 t@CV
  XéAfBXN̘_p[eBVÃubNO[
  v(Block Group)ɕBX̃ubNO[v́A(real)t@C
  fBNg̏f[^ubNƂĕێƓɁAt@C
  VXe̐(integrity)ۂ߂ɕK{̏dĕێ
  BdKvȂ̂́Asăt@CVXe𕜋Ȃ
  ȂȂꍇ邩łBubNO[vꂼ̓eɂ
  ́ATuZNVłɏڂB

  10.1.1.  EXT2 Inode

    ext2_inode
  +-----------------+                                  +-------+
  | Mode            |                      +---------->| Data  |
  |-----------------|                      |           +-------+
  | Owner info      |                      |
  |-----------------|                      |           +-------+
  | Size            |                      |   +------>| Data  |
  |-----------------|                      |   |       +-------+
  | Timestamps      |                      |   |       +-------+
  |-----------------|                      |   |       | Data  |
  |                 |----------------------+   |       +-------+
  | Direct Blocks   |                          |
  |                 |--------------------------+       +-------+
  |                 |                               +->| Data  |
  |                 |                 +---+         |  +-------+
  |                 |         +------>|   |---------+  +-------+
  |-----------------|         |       |   |----------->| Data  |
  | Indirect blocks |---------+       |   |            +-------+
  |-----------------|           +---+ +---+  +---+     +-------+
  | Double Indirect |---------->|   |------->|   |---->| Data  |
  |-----------------|           |   |-+      |   |     +-------+
  | Triple Indirect |           |   | |      |   |-+   +-------+
  +-----------------+           +---+ |      +---+ +-->| Data  |
                                      |      +---+     +-------+
                                      +----->|   |     +-------+
                                             |   |---->| Data  |
                                             |   |     +-------+
                                             +---+

  }\(9.2) EXT2 Inode

  EXT2 t@CVXeł́A``inode'' {IȌzޗ(building
  block)łBt@CVXêׂẴt@CƃfBNǵA
  ƈΈ̊֌Wɗ inode ɂċLqBubNO[v
  Ƃ EXT2 inode ́Ainode e[uɕۑAɁAVXe蓖
  Ăs inode ̏ԂĎ邽߂̃rbg}bv(bitmap)
  ̃e[uɕۑB}\(9.2)ł́AEXT2 inode ̃tH[}bg
  ĂāA̎X̏̒ɂ́Â悤ȃtB[h܂܂ĂB
  [see: include/linux/ext2_fs_i.h]

     [h (mode)
        ̃tB[h 2 ނ̏ێĂB inode L
        qĂ邩ƂƂƁA[Uɑ΂Ďp[~bV
        łB EXT2 ̏ꍇAinode Lqł̂́At@CAfBN
        gAV{bNNAubNfoCXALN^foC
        XAFIFO ̂̂ЂƂłB

     Lҏ
        ̃t@CfBNg̏L(owner)Ɋւ郆[Uʎq
        O[vʎqBɂāAt@CVXe͐ANZX
        K؂ɔfłB

     TCY
        oCgPʂŕ\t@CTCY

     ^CX^v(timestamps)
        ``inode'' 쐬ꂽԂƂꂪŌɏCꂽ

     f[^ubN
        ``inode'' Lqf[^܂񂾃ubNɑ΂|C^Bŏ
         12 ́A inode Lqf[^܂񂾕ubNւ
        |C^łAŌ 3 ͂ 2 iKԐړIȃ|C^
        ȂĂBƂ΁A̓dԐڃubN|C^(double
        indirect block pointer)́Af[^ubNւ̃|C^Qɑ
        |C^Q|CgĂB́A12 ̃f[^ubN
        ȉ̃TCYȂt@ĆA傫t@C
        ɃANZX邱ƂӖB

  ӂׂȂ̂́AEXT2 inode ̓XyVt@C\Ƃł邱
  ƂłB͎(real)t@Cł͂ȂAvOg
  foCXɃANZXł悤ɂ邽߂̂̂łB/dev fBNg
  ɂׂẴfoCXt@C݂邱ƂɂāAvO Linux
  ̃foCXɃANZXłBƂ΁Amount vÓA}Eg
  悤ƂfoCXt@CɎB

  10.1.2.  EXT2 X[p[ubN(Superblock)

  X[p[ubN(superblock)ɂ́Ãt@CVXe̊{IȃTCY
  ƍ\(shape)ƂLq񂪊܂܂BɂɂāAt@
  CVXe}l[ẂAt@CVXe̎gpƊǗ\ƂȂB
  At@CVXe}Eg鎞AubNO[v 0 ̃X[p
  [ubNǂݍ܂̂AX̃ubNO[vɂ̓VXe
  ̔jɔ܂܂ĂBlXȏ̂Ȃɂ͎̂悤Ȃ̂
  B
  [see: include/linux/ext2_fs_sb.h]
  [:ext2_super_block, in include/linux/ext2_fs.h]

     }WbNio[(``magic number'')
        ́A}Egs\tgEFAÃX[p[ubN
        { EXT2 t@CVXê̂ł邩`FbN邱Ƃ\
        ɂ邽߂ɂBEXT2 ̌so[Wł́A̔ԍ 0xEF53
        łB

     rWx(revision level)
        W[ƃ}Ci[̃rWxɂāA}Egs
        R[h́Ãt@CVXe̓̃rWłpł
        @\(feature)T|[gׂǂ𔻒fB܂A@\
        tB[h(feature compatibility field)Ƃ݂̂A
        ̏́A}EgR[hÃt@CVXeŐV@
        \SɎgp邱Ƃł邩ǂ𔻒fۂ̎菕
        B

     }EgJEgƍő}EgJEg(mount count and maximum
        mount
        count)" ӂ́At@CVXe̐SɃ`FbN
        ׂǂVXefł悤ɂ邽߂ɑ݂B}
        EgJEǵAt@CVXe}Eg邽тɉZ
        Aő}EgJEgɒBƁAuő}EgJEgɒB
        ̂ŁAe2fsck s邱ƂE߂܂vƂxbZ[W
        \B

     ubNO[vԍ(block group number)
        ̃X[p[ubÑRs[ێubNO[vԍB

     ubNTCY(block size)
        oCgŕ\邻̃t@CVXẽubNTCYBƂ
        ΁A1024 oCgƕ\B

     O[vƂ̃ubN
        ЂƂ̃O[ṽubNB́AubNTCYlAt@C
        VXe쐬Ɋm肳B

     t[ubN
        t@CVXẽt[ubN̐B

     t[ inode
        t@CVXẽt[ inode ̐B

     ŏ inode (first inode)
        t@CVXe̍ŏ inode  inode ԍBEXT2 [gt@
        CVXeł̍ŏ inode ́A"/" fBNg̃fBNg
        GgłB

  10.1.3.  EXT2 O[vfBXNv^

  X̃ubNO[v́ALqf[^\̂ĂBX[
  p[ubNƓlɁASubNO[vɑ΂O[vfBXNv^
  ׂ͂āAt@CVXȅQɔāAX̃ubNO[vœ
  dĂB
  [see: ext2_group_desc, in include/linux/ext2_fs.h]

  X̃O[vfBXNv^ɂ́Â悤ȏ񂪊܂܂ĂB

     ubNrbg}bv(Block Bitmap)
        ̃ubNO[vɊւubN蓖ărbg}bv(block
        allocation bitmap)̃ubNԍB́AubN̊蓖ĂƉ
        ̍ۂɎgpB
     inode rbg}bv (Inode Bitmap)
        ̃ubNO[vɑ΂ inode 蓖ărbg}bṽub
        NԍB́Ainode ̊蓖ĂƉ̍ۂɎgpB

     inode e[u(Inode Table)
        ̃ubNO[v̑΂ inode e[ůJnubÑu
        bNԍBX inode ́ALŏqׂ EXT2 inode f[^\
        ̂ɂĕ\ĂB

     Free block count, Free Inodes count, Used directory count
        (󒍁F̍ڂ̐͌ȗĂ܂B)

  O[vfBXNv^͘AIɔzuĂ̂ŁAŜŃO[vfB
  XNv^e[u`ĂBX̃ubNO[vɂ́ÃX[
  p[ubÑRs[̌ɁAO[vfBXNv^̃e[uŜ܂
  ĂB EXT2 t@CVXeɂĎۂɎgp̂́A(ub
  NO[v 0 ɂ) ŏ̃Rs[łB̑̃Rs[́AXp[
  ubÑRs[̏ꍇƓlɁACRs[ꂽꍇɔĂ̂
  łB

  10.1.4.  EXT2 fBNg

   0                   15                        55
  +---+---+---+------+---+---+---+--------------+--------------------+
  | il| 15|  5|  file| i2| 40| 14|very_long_name|                    |
  +---+---+---+------+---+---+---+--------------+--------------------+
    |    |           * |    |                   *
    |    |          /| |    |                  /|
    |    |           | |    |                   |
    |    +-----------+ |    +-------------------+
    |                  |
    |                  |      inode table
    |                  |     +--------------------+
    |                  |     |                    |
    |                  |     |--------------------|
    |                  |     |                    |
    |                  |     |--------------------|
    |                  +---->|                    |
    |                        |--------------------|
    |                        |                    |
    |                        |--------------------|
    +----------------------->|                    |
                             +--------------------+

  }\(9.3) EXT2 fBNg

  EXT2 t@CVXeɂāAfBNgƂ́At@CVXe
  t@Cɑ΂ANZXpX(access path)̍쐬ƕێ̂߂Ɏgp
  XyVt@CłB}\(9.3)ł́Ał̃fBNgG
  g̃CAEgĂBfBNgt@ĆAfBNg
  Gg̃XgłAX̃Ggɂ͎̂悤ȏ񂪊܂܂Ă
  B
  [see: ext2_dir_entry, in include/linux/ext2_fs.h]

     inode
        ̃fBNgGgɑ΂ inode B́AubNO[
        v inode e[uɕێĂ inode zւ̃CfbNX
        ȂĂB}\(9.3) ł́Afile ƂÕt@Cɑ΂
        fBNgGg inode ԍ i1 QƂĂB

     ÕTCY (name length)
        oCgŎ邻̃fBNgGg̃TCY

     O (name)
        ̃fBNgGg̖O

  ׂẴfBNgɂŏ̂ӂ̃Gg͂AWƂȂ
  Ă "."  ".." GgłA͂ꂼ "݂̃fBNg
  "  "efBNg(parent directory)" ӖĂB

  10.1.5.  EXT2 t@CVXẽt@Č

  Linux ̃t@ĆAUnix ̃t@CƓtH[}bgɂȂĂ
  B́AXbV("/")ŋ؂ꂽÃfBNgƂ̍Ō
  ɂt@C̖O琬Bt@C̈
  ́A/home/rusling/.cshrcłAł /home  /rusling ̓fBN
  głAt@C .cshrc łBׂ̂Ă Unix VXe
  lɁA Linux ̓t@Ĉ̂̃tH[}bgɂ͓ʂȗlv
  ȂB͔Cӂ̒ŁA\\ȔCӂ̕łĂ悢BEXT2
  t@CVXȅLt@C\ inode 𔭌邽߁AVXe
  ́Ãt@Ĉ̖OɓB܂Ńt@CfBNgPʂ
  Ȃ΂ȂȂB

  KvƂŏ inode ́At@CVXẽ[gfBNg
  inode ł̂ŁAt@CVXẽX[p[ubNł̔ԍ
  BEXT2 inode ǂނ߂ɂ́AK؂ȃubNO[v inode e[
  ułTȂ΂ȂȂBƂ΁A[g inode ԍ 42
  łꍇAubNO[v 0  inode e[uɂ 42 Ԗڂ inode
  KvƂB[g inode  EXT2 fBNĝ̂łA
  ƁA[g inode ̃[h(mode)ɂ̓fBNgƋLqĂ
  ŁÃf[^ubNɂ EXT2 fBNg̃Gg܂܂ĂB

  home ͑̃fBNgGĝЂƂɂÃfBNgG
  ǵA/home fBNgLq inode ̔ԍB
  rusling ̃Ggɂ͂̃fBNgǂݍ܂Ȃ΂Ȃ
  ȂB(܂Aŏɂ inode ǂݍŁAɂ inode ɂċL
  qꂽf[^ubNfBNgGgǂݍށB)āA
  ̒ rusling GgA /home/rusling fB
  NgLq inode ̔ԍBŌɁA/home/rusling fBN
  gLq inode ɂă|CgꂽfBNgGgǂ
  ŁA.cshrc t@C inode ԍ𔭌A̔ԍɂẴt@C
  ̏܂łf[^ubN擾B

  10.1.6.  EXT2 t@CVXẽt@CTCY̕ύX

  t@CVXeɋʂ̖̂ЂƂɁAt@C̒fЉ(fragment)X
  Bt@C̃f[^ێubN̓t@CVXeŜɕU
  Ă܂Â߁Af[^ubNԂ̋ȂɂāAt@C
  ̃f[^ubNɑ΂AANZXɂȂANZX
  Ă܂B EXT2 t@CVXe̖͂邽߂ɁAt@C
  ɐVf[^ubN蓖ĂہAꂪݑ݂f[^ubN
  ɑ΂IɋߐڂʒuɊ蓖Ă邩AȂƂ̃f[^ubN
  ƓubNO[vɊ蓖Ă悤ƂBĂꂪoȂꍇ
  ̂݁Af[^ubNʂ̃ubNO[vɊ蓖ĂB

  vZXf[^t@CɏƂƂALinux t@CVXe
  ́A(f[^݂̓r)̃t@Cɑ΂čŌɊ蓖Ăꂽ
  ubN̏I[zǂ`FbNBI[zꍇAt@C
  VXe͂̃t@CɐVf[^ubN蓖Ă鏈B
  蓖ĂI܂ŁAvZX͎s𒆒fBt@CVXeV
  f[^ubN蓖ĂāAɎc̃f[^ނ܂ő҂Ă
  AvZX͎sĊJȂ΂ȂȂB EXT2 ubN蓖ă[
  `ŏɎs邱Ƃ́Ãt@CVXeɑ΂ EXT2 X[p[
  ubNbN(lock)邱ƂłB蓖ĂƉ̓X[p[ubN
  ̃tB[h̒lύX̂ŁALinux t@CVXe͓ɕ
  vZX邱ƂȂB̃vZXɃf[^ubN
  蓖ĂȂ΂ȂȂꍇ́As̃vZXI܂ő҂K
  vBX[o[ubÑbN҂vZX̓TXyhԂ
  ȂAX[p[ubN̐䂪݂̃[UɂĊJ܂ł͎s
  ȂBX[p[ubNւ̃ANZX͑ҏ̎dg݂ŋ
  ̂ŁAvZXX[p[ubN̐𓾂ꍇȀI
  ł̐ێBX[p[ubNbNAvZX̓t@C
  VXeɏ[ȋ󂫃ubN邩ǂ`FbNB[ȋ
  ubNȂꍇAȏ㊄蓖Ă悤ƂĂŝŁAvZ
  X́Ãt@CVXẽX[p[ubN̐B

  t@CVXeɏ[ȋ󂫃ubNꍇAvZX͂
  Ă悤ƂB
  [see:ext2_new_block(), in fs/ext2/balloc.c]
  EXT2 t@CVXef[^ubN抄蓖(preallocate)悤
  rhĂꍇA̒犄蓖ĂsƂłB̐
  蓖ĂꂽubN͎ۂɂ݂͑A蓖ĂꂽubNrbg
  }bv(``block bitmap'')ŗ\񂳂Ă邾łBt@CɐV
  f[^ubN蓖Ă悤ƂĂꍇÃt@C\ VFS
  ``inode'' ɂ́AEXT2 ɓL ``prealloc_block''  ``prealloc_count''
  ̂ӂ̃tB[hA͂ꂼA抄蓖Ăꂽf[^u
  bN̍ŏ̃ubNԍƁA݂ubN\B抄蓖Ă
  ubN݂ȂubN̐抄蓖ĂȏꍇAEXT2 t@C
  VXe͐VubN蓖ĂȂ΂ȂȂB܂ EXT2 t@C
  VXe̓t@C̍Ō̃f[^ubN̒ɂf[^ubN
  󂩂ǂmFB_Iɂ́ÃubŃAAIȃANZX
  荂ɂł̂ŁA蓖Ă̂ɍłIȃubNłB̃u
  bNłȂꍇA͈͂LAقǂ̗zIȃubN
  64 ubNȓɂubNTB̃ubN͍œKł͂Ȃɂ
  AȂƂɋ߂ɂÃt@Cɑ鑼̃f[^ubN
  ƓubNO[vɂB
  [see: ext2_new_block(), in fs/ext2/balloc.c]

  ̃ubNłȂꍇłĂAvZX͑̃ubNO[v
  ԂɒTāA炩̋ubNBubN蓖ăR[h́A
  ЂƂ̃ubNO[v̂ǂ 8 ̋f[^ubÑNX^
  邩ׂB 8 ꏏɌȂꍇAȉŏs
  BubN̐抄蓖ĂKvLƂĂꍇAYR[h
  prealloc_block  prealloc_count KXXVB

  ubNꏊɊւȂAubN蓖ăR[h̓ubN
  O[ṽubNrbg}bvXVAobt@LbVɃf[^ob
  t@蓖ĂB̃f[^obt@́At@CVXeT|[g
  foCXʎqƊ蓖ĂꂽubÑubNԍƂɂăj[N
  ɎʂBobt@̃f[^ 0 ƂAobt@̓efB
  XNɏ܂ĂȂƂ߂ɂ̃obt@́u_[eB
  [(dirty)vƃ}[NBŌɁAX[p[ubNgAύX
  bNꂽƂ߂Ɂu_[eB[vƃ}[NBX[p
  [ubN̋󂫂҂vZXꍇAL[̍ŏɂvZX
  ēxsAt@Ĉ߂ɃX[p[ubN̔rIȎs䌠
  lBvZX̃f[^Vf[^ubNɏ܂A
  ̃f[^ubNtɂȂƁÃvZXŜJԂĎ̃f[
  ^ubN蓖ĂB

  10.2.  zt@CVXe (Virtual File System, VFS)

            +---------+                    +------------+
            |         |<------------------>|   inode    |
            |   VFS   |<----------+        | LbV |
            |         |           |        |            |
            +--*---*--+           |        +------------+
              /|  /|              |
       +-------+   +------+       |
       |/                 |/      |
  +----*----+        +----*----+  |
  |         |        |         |  |
  |  MINIX  |        |  EXT2   |  |        +------------+
  |         |        |         |  +------->|fBNg|
  +----*----+        +----*----+           | LbV |
      /|                 /|                |            |
       *-------+   +------+                +------------+
               |/  |/
            +--*---*---+
            | obt@ |
            |LbV|
            |          |
            +----*-----+
                /|
                 |/
            +----*-----+
            | fBXN |
            | hCu |
            |          |
            +----------+

  }\(9.4) zt@CVXe̘__CAO

  }\(9.4)ł́ALinux ̉zt@CVXeƎ(real)t@CVXe
  Ƃ̊֌WĂBzt@CVXe͔Cӂ̎ԂɃ}Eg
  قȂt@CVXeׂĂǗȂ΂ȂȂB̂߂ɁA
  zt@CVXéA(z)t@CVXeŚAу}Egꂽ
  (real)t@CVXeLqf[^\̂ǗĂB
  [see: fs/*]
  ⍬邩ȂAVFS ́AEXT2 t@CVXeX[p[u
  bN inode 𗘗p@ƔɎʂ@ŁAVXẽt@C
  X[p[ubN inode gċLqĂB EXT2 ``inode'' 
  ꍇƓlɁAVFS ``inode'' AVXẽt@CfBNgL
  qĂBȂ킿Azt@CVXe̓eg|W[ VFS
  inode gċLqĂ킯łB́A邽
  ɁA(zt@CVXe inode X[p[ubNɊւĂ) VFS
  inode  VFS X[p[ubNƏƂŁAEXT2  inode X[p[u
  bNƋʂB

  X̃t@CVXeƁA VFS ɓo^B
  ́AVXẽu[gAIy[eBOVXeۂɍs
  B(real)t@CVXéAJ[lɑgݍ܂Ă邩A[_
  uW[ƂărhĂ邩̂ꂩłBt@CVXe
  W[́AVXeKvƂƂɃ[ĥŁA
  ΁AVFAT t@CVXeJ[lW[ƂĎĂ
  A VFAT t@CVXe}EgꂽƂɂ̂݃[h
  BubNfoCXx[X̃t@CVXe}EgA[gt@
  CVXeɑgݍ܂ƁAVFS ͂̃t@CVXeX[p[
  ubÑf[^\̂ǂݍ܂Ȃ΂ȂȂBt@CVXe^C
  vƂ̃X[p[ubNǂݍ݃[`́Ãt@CVXẽg|
  W[ǂ݉āȀ VFS X[p[ubÑf[^\̂
  }bvB VFS ́AVFS X[p[ubNێƓɁAVXe
  ̃}Egꂽt@CVXeɊւ郊XgێȂ΂Ȃ
  BX VFS X[p[ubNɂ́A̋@\S郋[`̏
  ƁÃ[`ւ̃|C^܂܂ĂB䂦AƂ΁A}E
  gꂽ EXT2 t@CVXe\X[p[ubNɂ́AEXT2 ŗL
   inode ǂݍ݃[`ւ̃|C^܂܂ĂB EXT2 inode
  ǂݍ݃[`́At@CVXeŗL inode ǂݍ݃[`
  Ăɋʂ邱Ƃł邪AVFS inode ̃tB[hɕKvȏL
  BX VFS X[p[ubNɂ́Ãt@CVXe̍ŏ
  VFS inode ւ̃|C^܂܂ĂB[gt@CVXȅꍇA
   "/" fBNg\ inode łB̃}bsO
  EXT2 t@CVXȅꍇ͔ɌIɍs邪Ãt@CV
  Xeɑ΂Ă͂B

  VXẽvZXfBNgt@CɃANZXہAVXe
  ̃[`̓VXe VFS ``inode'' oRČĂяoB
  [see: fs/inode.c]
  Ƃ΁AfBNg ls ƃ^Cv邩At@Cɑ΂ cat 
  ^CvꍇAzt@CVXéÃt@CVXe\ VFS
  inode QBVXȇSt@CƃfBNg VFS inode
  ɂĕ\Ă̂ŁA inode JԂANZX
  B inode  inode LbVɕۑāAɑ΂AN
  ZXx̌オ}Binode LbV inode ȂꍇAK؂
  inode ǂݍނ߂Ƀt@CVXeŗL̃[`Ăяo
  Binode ǂݍޏɂāAinode  inode LbVɓ
  A inode ւ̍XȂANZXɂăLbVɕۑꂽ܂܂
  ȂBقƂǎgpȂ VFS inode ̓LbV폜B

  ׂĂ Linux t@CVXéAʂ̃obt@LbV𗘗p
  āAbƂȂfoCX̃f[^obt@LbVB́At@C
  VXeÃt@CVXeێ镨foCXɃANZX
  ہAANZXx̌ɖ𗧂B
  [see: fs/buffer.c]
  ̃obt@LbV́At@CVXeƗĂBāA
  ́A Linux J[lf[^obt@̊蓖āAǂݏoA݂
  ߂Ɏgp郁JjY̒ɑgݍ܂ĂBɂ Linux 
  t@CVXéAbƂȂ郁fBA₻T|[gfoCXh
  CoƗł̂ŁA̎dg݂ Linux ̖炩ȒƂȂĂ
  BubN\foCXׂ͂āALinux J[lɓo^Au
  bNx[X́Aʂɔ񓯊ȁAIC^[tFCX񋟂BSCSI
  ̂悤ȔrIGȃfoCXłlłB(real)t@CVXe
  bƂȂ镨foCXf[^ǂݍޏꍇAۂɂ̓ubNfoC
  XhCoɃNGXg𑗂AhCoA̐䂷foCX畨
  ubNǂݍށB̃ubNfoCX̃C^[tFCXɑgݍ܂
  Ă̂Aobt@LbVłBt@CVXeɂăubN
  ǂݍ܂ƁÃubŃAׂẴt@CVXe Linux
  J[lɂċLIȃobt@ɕۑBobt@̌
  X̃ubŃAubNԍƂǂݍ񂾃foCXŗL̎ʎqƂ
  ĎʂBāAf[^΂ΕKvƂꍇA
  ́AԂ̂fBXN̓ǂݏo𗘗p̂ł͂ȂAobt@
  LbVoBfoCX̒ɂ͐ǂ݂T|[ĝ
  邪A̓f[^ubNKvƂꍇɔāA\ߗ\
  f[^ubNǂݍł@\łB

  VFS ́ApɂɎgpfBNg΂₭邽߂ɁA
  fBNg̃LbVێĂB
  [see : fs/dcache.c]
  ƂāAŋߕ\ƂȂfBNg\Ă݂Ƃꂪ
  Bŏɕ\ہA⎞Ԃ|̂ɋCtAxڂɂ̓e
  \鎞́AʂɏoBfBNgLbV̓fBNg
   inode ̂̂ۑ̂ł͂ȂB inode LbV
  Ȃ΂Ȃ炸AfBNgLbV́ASȃfBNgƂ
  inode ԍۑĂB

  10.2.1.  VFS X[p[ubN

  }EgꂽׂẴt@CVXéAVFS X[p[ubNɂ
  \BVFS X[p[ubN͗lXȏ܂ł邪Aɂ̈
  B
  [see: include/linux/fs.h]

     foCX (device)
        ́Ãt@CVXe܂܂ĂubNfoCX̃fo
        CXʎqłBƂ΁AVXe̍ŏ IDE n[hfBX
        Nł /dev/hda1 ̃foCXʎq́A0x301 łB

     inode |C^ (inode pointer)
        inode |C^ ``mounted'' ́Ãt@CVXe̍ŏ
        inode |Cg|C^łBinode |C^ ``covered''
        ́Ãt@CVXe}EgꂽfBNg\ inode
        |Cg|C^łB[gt@CVXe VFS X[
        p[ubNɂ́Acovered |C^͊܂܂ȂB

     ubNTCY (blocksize)
        oCgPʂŕ\邻̃t@CVXẽubNTCYBƂ
        ΁A1024 oCgB

     X[p[ubN샋[` (superblock operations)
        ̃t@CVXeɑ΂ÃX[p[ubN샋[`
        ̃|C^B̒ɂ́AVFS  inode ƃX[p[ubN̓
        ݏɎgp郋[`B

     t@CVXe^Cv (file system type)
        }Egꂽt@CVXe ``file_system_type'' f[^\
        ̂ւ̃|C^B

     t@CVXeŗL̏ (file system specific)
        ̃t@CVXeɂƂĕKvȏւ̃|C^

  10.2.2.  VFS inode

  EXT2 t@CVXeƓlɁAVFS ׂ̂Ẵt@CfBNg
  ̓j[N VFS ``inode'' ɂĕ\B
  [see: include/linux/fs.h]
  X VFS inode ̏́At@CVXeŗL̃[`ɂāA
  ̊bƂȂt@CVXȅ񂩂gݗĂBVFS inode 
  J[lɂ݂AVXeɂƂėLvłԂ VFS
  inode LbVɕۑBVFS inode Ɋ܂܂ɂ͎̂̂
  邪Aɂ̈ꕔB

     foCX (device)
        ́At@CY VFS inode ŵێĂfoC
        X̃foCXʎqłB

     inode ԍ (inode number)
        ́A inode ̔ԍłA͂̃t@CVXe
        j[NȒlłBfoCX inode ԍ̑gݍ킹́A
        VFS ɂďd邱Ƃ͂ȂB

     [h (mode)
        ``EXT2'' ƓlɁÃtB[ĥ́A VFS inode \
        ΏۂƂɑ΂ANZXłB

     [U ID (user ids)
        L҂̎ʎqB

      (times)
        쐬ACA݂NԁB

     ubNTCY (block size)
        oCgPʂŕ\邻̃t@C̃ubNTCYBƂ 1024
        oCgB

     inode  (inode operations)
        [`̃AhXQւ̃|C^B̃[`̓t@CVX
        eɌŗLłAƂ΁A inode wt@C؂k
        ƂAY inode ɑ΂鑀sB

     JEg (count)
        ݂ VFS inode gpĂR|[lg̐BJEg 0
        ́A inode gpĂ炸Aj邩ėpׂ
        ƂӖB

     bN (lock)
        ̃tB[h VFS inode bNۂɎgpBƂ
        ΁At@CVXeǂݏoĂꍇȂǁB

     _[eB[ (dirty)
         VFS inode ݂ꂽǂBł
        ꍇÅbƂȂt@CVXe͓KXCKvB

     t@C (file)
        t@CVXeŗL̏B

  10.2.3.  t@CVXe̓o^

  +---file_systems
  |
  |
  |  file_system_type     file_system_type      file_system_type
  |  +-------------+      +-------------+      +-------------+
  +->|*read_super()|  +-->|*read_super()|  +-->|*read_super()|
     |-------------|  |   |-------------|  |   |-------------|
     | name        |"ext2"| name        |"proc"| name        |"iso9660"
     |-------------|  |   |-------------|  |   |-------------|
     | requires_dev|  |   | requires_dev|  |   | requires_dev|
     |-------------|  |   |-------------|  |   |-------------|
     | next        |--+   | next        |--+   | next        |
     +-------------+      +-------------+      +-------------+

  }\(9.5) t@CVXe̓o^

  Linux J[lrhƂAT|[gĂX̃t@CVXe
  J[lɑgݍނǂ₪ȂBJ[lrh
  ƁAt@CVXeR[hɂ́Agݍ܂ꂽt@CVXe
  ĂɊւ鏉[`ւ̌ĂяoR[h܂߂B
  [see: sys_setup(), in fs/filesystems.c]
  Linux ̃t@CVXéAW[ƂĂrh邱ƂłB
  ̏ꍇA͕KvɉăIf}hŃ[h邩Ainsmod R
  }hgpĎ蓮Ń[hBt@CVXeW[[h
  Ƃ͂AꂪJ[lɓo^A[hƓo^
  BX̃t@CVXȅ[`͉zt@CV
  Xeɓo^A ``file_system_type'' f[^\̂ɂĕ\
  B̍\̂ɂ̓t@CVXe̖O VFS X[p[ubNǂݍ
  ݃[`ւ̃|C^܂܂ĂB ``}\(9.5)''
  ́Afile_system_type f[^\̂A``file_systems'' Xgɓo^
  Ã|C^ɂă|CglqĂBX
  file_system_type f[^\̂ɂ͎̂悤ȏ񂪊܂܂ĂB
  [see: file_system_type, in include/linux/fs.h]

     X[p[ubNǂݍ݃[` (superblock read routine)
        ̃[`́A̓Iȃt@CVXe}EgꂽƂ
        VFS ɂČĂяoB

     t@CVXe (file system name)
        t@CVXe̖OBƂ΁Aext2 ȂǁB

     KvȃfoCX (device needed)
        ̃t@CVXéAT|[gfoCXKvH ׂĂ
        t@CVXeێfoCXKvƂ킯ł͂
        BƂ΁A/proc t@CVXe̓ubNfoCXKvƂ
        ȂB

  ǂ̃t@CVXeo^Ă邩mɂ́A/proc/filesystems `
  ΂悢BƂ΁Â悤ɕ\邾낤B

        ext2
  nodev proc
        iso9660

  10.2.4.  t@CVXẽ}Eg

  X[p[[Ut@CVXe}EgƂALinux ͂܂AVX
  eR[ɓn̑ÓȂ΂ȂȂBmount R}
  h{Iȃ`FbN͍sÃ݂J[lɂǂ̃t@CVXeւ
  T|[ggݍ܂Ă邩A[UɂĎw肳ꂽ}Eg|C
  gۂɑ݂邩ƂƂ͒mȂłB mount R}
  hɂčlĂقB

  $ mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom

   mount R}h̓J[l 3 ̏nBt@CVXeA
  t@CVXe܂ł镨ubNfoCXA 3 ڂɁA
  t@CVXẽg|W[ɂāAVt@CVXe
  Ƀ}EgׂƂƂłB
  [see: do_mount(), in fs/super.c]
  [see: get_fs_type(), in fs/super.c]

  zt@CVXeŏɂׂƂ́Ãt@CVXe
  邱ƂłB̂߂Ɋm̃t@CVXẽXg𑖍̂
  A ``file_systems'' ɂă|CgꂽXg̒ɂ
  ``file_system_type'' f[^\̂ʂɒTƂɂĂȂB
  āAY閼OꍇAɂ̃t@CVXẽ݂J
  [lŃT|[gĂ邱ƁAь݂̃J[lɂ̃t@CVX
  ẽX[p[ubNǂݏo߂̃t@CVXeŗL̃[`
  AhX܂܂Ă邱ƂBvt@CVXe
  ȂꍇłAJ[lIf}hŃJ[lW[[
  h悤rhĂȂ(ڍׂ``uW[v''QƂ̂)A
  ͌pB̏ꍇAJ[l͌̍Ƃ𑱂OɃJ[lf[
  ɑ΂ēK؂ȃt@CVXef}h[fBO悤NGX
  gB

  ɁAmount ɂēnꂽfoCX܂}EgĂȂ
  AVt@CVXẽ}Eg|CgƂȂfBNg VFS
  inode Ȃ΂ȂȂB VFS inode ́Ainode LbV
  邩A}Eg|Cgt@CVXeT|[gubNf
  oCXǂݏoBinode AꂪfBNg
  Ałɑ̃t@CVXeɃ}EgĂȂǂ
  mF邽߂̃`FbNȂB̃t@CVXeɑ΂}E
  g|CgƂẮÃfBNg͎gpłȂłB

  ̎_ŁAVFS ̃}EgR[h VFS X[p[ubN蓖
  āÃt@CVXẽX[p[ubNǂݍ݃[`ɑ΂Ă
  }EgnȂ΂ȂȂBVFS X[p[ubNׂ̂Ă
  ``super_block'' f[^\̂ ``super_blocks'' zɕۑĂ
  ŁÂЂƂAY}Eĝ߂Ɋ蓖ĂȂ΂ȂȂBX
  [p[ubNǂݍ݃[`́AꂪfoCXǂݏo
  ɂ VFS X[p[ubÑtB[hK؂ȏŖ߂Ȃ
  ȂȂB EXT2 t@CVXeɊւẮȀ̃}bsO
  ͕ϊ͔ɊȒPłBAMS-DOS t@CVXê悤Ȃ
  ̃t@CVXeɊւẮAقǊȒPȃ^XNł͂ȂBt@C
  VXełAVFS X[p[ubÑtB[h𖄂߂邱Ƃ́A
  T|[gubNfoCXAꂪׂĂ̏ǂݏo
  Ȃ΂ȂȂƂӖBubNfoCXǂݏołȂ
  ꍇA̓foCX̃^Cṽt@CVXe܂܂Ȃꍇ
  ́Amount R}h͎sɏIB

  +---vfsmntlist
  |
  |
  |    vfsmount
  |  +-----------+
  +->| mnt_dev   | 0x0301
     |-----------|
     |mnt_devname| /dev/hda1
     |-----------|
     |mnt_dirname| /
     |-----------|
     | mnt_flags |
     |-----------|          VFS
     | mnt_sb    |-+    super_block            file_system_type
     |-----------| |  +-------------+          +---------------+
     |           | +->| s_dev       |0x0301 +->| *read_super() |
     |-----------|    |-------------|       |  |---------------|
     | next      |    | s_blocksize |1024   |  | name          |"ext2"
     +-----------+    |-------------|       |  |---------------|
                      | s_type      |-------+  | requires_dev  |
                      |-------------|          |---------------|
                      | s_flags     |          | next          |
                      |-------------|          +---------------+
                      | s_covered   |
                      |-------------|          VFS
                      | s_mounted   |--+      inode
                      |             |  |    +---------+
                      +-------------+  +--->| i_dev   | 0x0301
                                            | i_ino   | 42
                                            |         |
                                            +---------+

  }\(9.6) }Egꂽt@CVXe

  }EgꂽX̃t@CVXéA``vfsmount'' f[^\̂
  ċLqB}\(9.6)ė~B ``vfsmntlist'' 
  ă|CgꂽXgɑ҂sĂB
  [see: add_vfsmnt(), in fs/super.c]
  ʂ̃|C^ł ``vfsmnttail'' ́AXg̍Ō̃Gg|Cg
  ĂA``mru_vfsmnt'' |C^͍łŋߗpꂽt@CVXe
  |CgĂBX vfsmount f[^\̂ɂ́Ãt@CVX
  eێubNfoCX̃foCXԍÃt@CVXe}
  EgĂfBNgAẴt@CVXe}Eg
  Ɋtꂽ VFS X[p[ubNւ̃|C^܂܂ĂB
  ɁAVFS X[p[ubŃAYނ̃t@CVXeɊւ
  ``file_system_type'' f[^\̂Ƃ̃t@CVXẽ[g inode
  |CgĂB inode ́Ãt@CVXe[h
  Ԃ́A VFS inode LbV̂ȂɕۑB

  10.2.5.  zt@CVXeł̃t@Č

  zt@CVXeŃt@C VFS ``inode'' T߂ɂ́AVFS
  ́AOɊ܂܂X̃fBNg\ VFS inode ₢킹Ȃ
  AfBNgƂɂ̖OȂ΂ȂȂBX̃fBN
  g₢킹̍ۂɂ́At@CVXeŗL̖₢킹[`Ă
  oB̃[`̃AhX͂̐efBNg\ VFS inode
  ɕێĂBꂪ肭̂́AX̃t@CVXẽ[
  gfBNg VFS inode ́ÃVXe VFS X[p[ubN
  ă|CgĂ̂ŁAKm邱Ƃł邩łB
  (real)t@CVXeɂ inode ₢킹邽тɁAfB
  Ngp̃fBNgLbV`FbNBfBNgLb
  VɃGgȂꍇAt@CVXe VFS inode bƂȂ
  t@CVXe炩A inode LbV̂ꂩ擾B

  10.2.6.  zt@CVXeł̃t@C̍쐬

  (: ݂̌̕܂B)

  10.2.7.  t@CVXẽ}Eg

  킽̈Ԃł MG ̐}jAɂ͂Ă̏ꍇugݗĂ͕
  ̋tłvƂĂȂA̓t@CVXẽA}
  EgɊւɂx̍͂ꌾ邱Ƃ낤B
  [see: do_unmount(), in fs/super.c]
  VXẽt@CVXeɂt@ĈЂƂ炩̂
  gpĂꍇÃt@CVXe̓A}EgłȂB
  Ƃ΁AvZX /mnt/cdrom ̃fBNg₻̎qfBNg
  gpĂꍇÃfBNg̓A}EgłȂBA}Eg
  ׂt@CVXe炩̂ŎgpĂꍇÃt@C
  VXe VFS inode  VFS inode LbVɂ邩Ȃ̂ŁA
  R[h͂`FbN邽߂ɁAinode Xg𑖍Ãt@CV
  XefoCXɂďLĂ inode TB}Eg
  t@CVXeɊւ VFS X[p[ubN_[eB[(dirty)ȏ
  A͏CĂƂƂȂ̂ŁACꂽ̓efBXN
  ̃t@CVXeɏ܂Ȃ΂ȂȂBfBXNւ݂̏
  IAVFS X[p[ubNɐLẮAJ[l̋
  ̃v[ɖ߂BŌɁÃ}EgɊւ ``vfsmount''
  f[^\̂́A``vfsmntlist'' ̃NOAB
  [see: remove_vfsmnt(), in fs/super.c]

  10.2.8.  VFS inode LbV

  }Egꂽt@CVXe𑀍삷ۂɂ́Ãt@CVXe
  VFS inode xǂݏoꂽAꍇɂ͏܂ꂽ肷Bz
  t@CVXéAinode LbVǗāA}EgꂽׂĂ
  t@CVXeւ̃ANZXĂB VFS inode  inode
  LbVǂݏoꂽƂAVXe͕foCXւ̃ANZX
  ƂłB
  [see: fs/inode.c]

  VFS inode LbV́AnbVe[uƂĎĂāÃG
  ǵAnbVl VFS inode ̃Xgւ̃|C^ƂȂĂ
  Binode ̃nbVĺA inode ԍƁAt@CVXeێ
  鉺ʂ̕foCX̃foCXʎqɂČvZBzt@CV
  Xe inode ɃANZXKvƂ́AVXe͂܂̃nb
  VlvZA inode nbVe[uւ̃CfbNXƂĎg
  pBɂăVXéAnbVl inode ̃Xg
  ̃|C^擾BāAX inode ԂɓǂݏoāAT
   inode Ɠ inode ԍƃfoCXʎq̗ inode 
  B

  LbV inode ꍇA inode ̃JEgl 1 
  A inode ɂ͑ɂ[UāAt@CVXeւ̃ANZX
  pĂ邱ƂBȂꍇAt[ VFS inode 
  āAt@CVXe inode ǂݍ߂悤ɂȂ
  ΂ȂȂB VFS t[ inode 擾@́ABVXe
  葽 VFS inode 蓖ĂĂ悢ꍇ́AVFS ͐VK inode
  蓖ĂBVFS ̓J[ly[W蓖ĂāÃy[WVK̃t
  [ inode ɕA inode XgɓBVXe VFS
  inode ׂ͂āAinode nbVe[uɂƓɁA``first_inode''
  ɂă|Cg郊Xgɂ݂BVXełɎgpł邷
  ׂĂ inode g؂ĂꍇAVXe͍ėp̂ɂӂ킵
   inode ̌TȂ΂ȂȂB́A0 ̗pJEgt
  ꂽ inode łB́AVXe݂ inode gpĂȂ
  ƂĂBƂ΁At@CVXẽ[g inode ̂悤Ȗ{
  ɏdv VFS inode ͏ 0 ȏ̗pJEgĂ̂ŁAė
  pɂ͌ĂȂȂBėp̌₪肳ꂽA͏
  BVFS inode ̓_[eB[(dirty)ɂȂĂ邩Ȃ̂ŁȀ
  ̓t@CVXeɏ߂Kv邪AȊOɂ inode
  bNĂꍇA̍ۂɃVXe͏pOɃb
  N̂҂Ȃ΂ȂȂBVFS inode ̌́Aėp
  OɏȂ΂ȂȂB

  VK VFS inode o@Ɋւ炸At@CVXeŗL̃
  [`ĂяoāAbƂȂt@CVXeǂݏoꂽ
  ł inode ̃tB[h𖄂߂KvB̏񂪏܂Ă
  ԁAV VFS inode ́ApJEg 1 ݒ肳ALȏ
  悤ɂȂ܂łǂANZXȂ悤ɃbNB

  ۂɕKv VFS inode ߂ɁAt@CVXe͑̂
   inode ɃANZXȂ΂ȂȂꍇBꂪN̂
  fBNg̓ǂݍ݂̂ƂłBŌ̃fBNg inode 
  KvȂ̂A̓rɂfBNg inode ǂݍ܂Ȃ΂
  ȂBVFS inode LbVgpAꂪtɂȂƁAقƂǎg
  Ȃ inode ͔jA藘ppx̍ inode LbVɎc
  B

  10.2.9.  fBNgLbV

  悭pfBNgւ̃ANZX邽߂ɁAVFS ̓fB
  NgGg̃LbVǗĂB
  [see: fs/dcache.c]
  t@CVXefBNg̖₢킹ƁȀڍׂ
  fBNgLbVɓBƂ΃fBNg\
  A̒̃t@CI[vƂfBNgւ̖₢
  ꍇÃfBNg̓fBNgLbVŔłBZ
  (15 ܂ł)fBNgGĝ݂LbV̂AZ
  fBNgłpɂɎg邽߁A̕@͍IłB
  ΁A/usr/X11R6/bin ́AX T[o̎sɁAɕpɂɃANZX
  B

  fBNgLbV̓nbVe[u琬ǍX̃Gg
  ́AnbVlfBNgLbVGg̃Xg|C
  gĂBnbV֐́Ãt@CVXeێfoCX̃f
  oCXԍƃfBNgƂ𗘗pāÃnbVe[uւ̃It
  ZbgƃCfbNXƂvZBɂāALbVꂽfB
  Ng͍ɔ邱Ƃ\ɂȂBLbVł̃Gg
  ̖₢킹ɎԂ肷AGgȂ悤
  LbVł͈ӖȂB

  LbVLŐVɕۂ߂ɁAVFS ͍ŒԖgp( Least
  Recently Used, LRU)̃fBNgLbVGg̃Xgێ
  BfBNg₢킹󂯂āÃfBNg̃Gg
  ߂ăLbVɓƂA͑ꃌx LRU Xg̖
  tBLbVt̏ꍇ́A LRU Xg̐擪ɑ
  Gg폜邱ƂŕtBfBNgGgēx
  ANZXƁA͑񃌃x LRU LbV̖ɓ
  Bꂪt̏ꍇlɁA񃌃x LRU LbVXg̐擪
  ɂfBNgGgƓւ`ƂȂBꃌxƑ񃌃x
   LRU Xg̐擪ɂGg𗧂ނƂ@͑Ół
  BXg̐擪ɃGg邱Ƃ̗B̗ŔA炪ŋ߃ANZ
  XĂȂƂƂłBANZX΁AXǧ
  ɈڂB񃌃x LRU LbVXgɂGǵAꃌx
   LRU LbVXgɂGgSłBȂȂA
  񃌃xɂGǵA₢킹󂯂łȂAJԂQƂ
  Ă邩łB

  REVIEW NOTE: Do we need a diagram for this?

  10.3.  obt@LbV

                             buffer_head            buffer_head
  hash_table +---------+    +-----------+          +-----------+
  ---------->|         | +->| b_dev     |0x0301 +->| b_dev     |0x0801
             |         | |  |-----------|       |  |-----------|
             |         | |  | b_blocknr |42   +-+  | b_blocknr |17
             |         | |  |-----------|     |    |-----------|
             |         | |  | b_state   |     |    | b_state   |
             |---------| |  |-----------|     |    |-----------|
             |         |-+  | b_count   |     |    | b_count   |
             |---------|    |-----------|     |    |-----------|
             |         |    | b_size    |1024 |    | b_size    |2048
             |         |    |-----------|     |    |-----------|
             |         |    |           |     |    |           |
             |         |    |           |     |    |           |
             |         |    |-----------|     |    |-----------|
             |         |    | b_next    |-----+    | b_next    |
             |         |    |-----------|          |-----------|
             |         |    | b_prev    |          | b_prev    |
             |         |    |-----------|          |-----------|
             |         |    |           |          |           |
             |         |    |-----------|          |-----------|
             |         |    | b_data    |          | b_data    |
             |         |    +-----------+          +-----------+
             |         |
             |         |     buffer_head
             |         |    +-----------+
             |         | +->| b_dev     |0x0301
             |---------| |  |-----------|
             |         |-+  | b_blocknr |39
             |---------|    |-----------|
             |         |    | b_state   |
             |---------|    |-----------|
             ~         ~    ~           ~
             ~         ~    ~           ~

  }\(9.7) obt@LbV

  }Egꂽt@CVXepꍇAt@CVXe̓f[
  ^ubNǂݏ邽߂ɃubNfoCXɑ΂鑽̃NGXg
  sBf[^ubN̓ǂݏ邽߂̃NGXgׂ͂āAW̃J
  [l[`̌ĂяooRāA``buffer_head'' f[^\̂Œ`
  ꂽfoCXhCoɓnB̍\̂̓ubNfoCXhCo
  ɕKvȂׂĂ̏񋟂BfoCXʎq͌ŗL̃foCX
  AubNԍ̓hCoɂǂ̃ubNǂݏoׂBׂ
  ̃ubNfoCX́ATCỸubN̐`IȏWłƌł
  BubNfoCXւ̃ANZXXs[hAbv邽
  ɁALinux ̓ubNobt@̃LbVǗBVXêׂ
  ̃ubNobt@́AgpĂȂVobt@łÃob
  t@LbV̂ǂɕۑB̃LbVׂ͂Ă̕ub
  NfoCXԂŋLBǂ̂悤Ȏɂ̃LbVɂ͑̃u
  bNobt@B̓VXẽubNfoCX̂ЂƂɑ
  ĂāA΂ΎẌقȂ(``state'')ɂBLȃf[^ob
  t@LbV\ȏꍇAɂăVXefoCX
  ANZXԂȂBubNfoCXɑ΂ǂݍ݂⏑o
  ŎgpꂽubNobt@ׂ͂āAobt@LbVɓB
  Ԃ̌o߂ɂāÁAKv̍obt@ƌシ邽߂
  LbV폜邩ApɂɃANZX邽߃LbVɎc邩
  B

  LbṼubNobt@́AێfoCX̎ʎqƃob
  t@̃ubNԍƂɂăj[NɎʂBobt@LbV
  ӂ̋@\ʕ\Bŏ́̕ÃubNobt@
  XgłBT|[gobt@TCYƂɂЂƂ̃XgA
  VXe̋̃ubNobt@́A߂č쐬ꂽA폜ꂽƂ
  ɁÃXg̑҂sɒuB݃T|[gĂob
  t@TCÝA512, 1024, 2048, 4096,  8192 oCgłB
  ́ALbV̂̂łB̓nbVe[ułA
  nbVe[u͓nbVCfbNXobt@ɑ΂|C
  ^̔złBnbṼCfbNX́AYubNێfoC
  X̎ʎqƃf[^ubÑubNԍ琶B``}
  \(9.7)''ł́AnbVe[u̃GgƂƂɎĂ
  BubNobt@̓t[XĝꂩЂƂɂ邩Aobt@
  LbV̒ɑ݂Bobt@LbVɂƂ́A͍Œ
  Ԗgp(LRU) Xg̃L[ɂuBLRU Xg͌X̃^Cv
  ̃obt@Ƃɑ݂AVXẽ^Cṽobt@ŏ
  ہAƂ΁Aobt@̐Vf[^fBXNɏoۂȂǂɎgp
  Bobt@^CvƂ͂̏ (state)𔽉f̂łALinux
  ł͌ݎ̂悤ȃ^CvT|[gĂB

     N[ (clean)
        gpŐVobt@

     bNς (locked)
        bNA܂̂҂obt@B

     _[eB (dirty)
        _[eBobt@Bɂ͐VLȃf[^܂܂A݂
        \肾ÂƂ돑݂̃XPW[ėĂ
        ́B

     L (shared)
        Lobt@B

     񋤗L (unshared)
        ȑO͋LłA݂͋LĂȂobt@B

  t@CVXéAbƂȂ镨foCXobt@ǂݏoKv
  Ƃɂ́Aobt@LbVubN擾悤ƂBob
  t@LbV擾łȂꍇAK؂ȃTCỸt[Xg疢g
  pobt@擾A̐Vobt@obt@LbVɓBt@
  CVXeKvƂobt@obt@LbVɂꍇAob
  t@͍XV(update)ĂꍇƂĂȂꍇBXVĂ
  ȂAꂪgpubNobt@łꍇ́At@CVXéA
  foCXhCoɂēK؂ȃf[^ubNfBXNǂݏo
  悤NGXgB

  ׂẴLbVƓlɁAobt@LbV́A悭sA
  obt@LbV𗘗pubNfoCXԂŌɃLbVGg
  蓖Ă悤ɊǗȂ΂ȂȂBLinux  bdflush J
  [lf[gpāALbVɊւ鑽ׂ̍ȍƂs
  邪Â́ALbVgpꂽʂƂĎIɎ
  sB

  10.3.1.  bdflush J[lf[

  bdflush J[lf[́AVXe_[eB(dirty, XV҂) ob
  t@𑽂ĂꍇɁAVXeɑ΂ēIɔVv
  ȃJ[lf[łB
  [see: bdflush(), in fs/buffer.c]
  f[^ێobt@́AXfBXNւƏ߂Ȃ΂ȂȂB
  ̃f[́ANɂ̓VXẽJ[lXbhƂċN
  B₱̂A "kflush" ƌĂ΂A̖ÓAVXe
  ̃vZX\ ps R}hgƌ邱ƂłBĂ
  ̃f[̓X[vԂŁAVXẽ_[eBobt@̐
  肷̂҂ĂBobt@蓖Ăꂽjꂽ肷ƁA
  VXẽ_[eBobt@̐`FbNBVXẽobt@
  ̑̃p[Ze[WƂă_[eBobt@Ȃ肷
  ƁAbdflush ͖ڂo܂BftHg̋E 60% AVXe
  obt@̕sōĂꍇ́A bdflush ͋Iɖڊo߂
  B̒ĺAupdate R}hgĊmFύX\łB

  # update -d

  bdflush version 1.4
  0:    60 Max fraction of LRU list to examine for dirty blocks
  1:   500 Max number of dirty blocks to write each time bdflush activated
  2:    64 Num of clean buffers to be loaded onto free list by refill_freelist
  3:   256 Dirty block threshold for activating bdflush in refill_freelist
  4:    15 Percentage of cache to scan for free clusters
  5:  3000 Time for data buffers to age before flushing
  6:   500 Time for non-data (dir, bitmap, etc) buffers to age before flushing
  7:  1884 Time buffer cache load average constant
  8:     2 LAV ratio (used to determine threshold for buffer fratricide).

  f[^܂čXV҂ԂɂȂAbdflush IȐ̃_[eB
  obt@fBXNɏ߂Ƃꍇ͂A_[eBobt@̂
  ׂĂA``BUF_DIRTY'' LRU XgɃNB̐mF\ł
  Aupdate R}hɂĐłBftHgl 500 łB(
  LQ)

  10.3.2.  update vZX

  update R}h͒PȂR}hł͂ȂAf[łB (VXe
  ̍ۂ)X[p[[UŋNƁA͒IɌÂȂ
  _[eBobt@ׂ̂ĂfBXNɏ߂(tbV)Bꂪ
  sۂɂ́Abdflush ƎʂVXeT[rX[`Ăяo
  B
  [see: sys_bdflush(), in fs/buffer.c]
  _[eBobt@(VXeT[rX[`)IɁÃfBXNɏ
  ߂߁AVXeԂ(obt@̍\̂)tBupdate
  R}hsƂ́AAVXẽ_[eBobt@ׂ
  AtbVׂ߂Ă̂TBtbVׂ
  ׂẴobt@́AfBXNɏ߂B

  10.4.  /proc t@CVXe

  /proc t@CVXéALinux ̉zt@CVXe̔\͂@Ɏ
  ̂łB̃t@CVXe͎݂ȂB(ALinux ̖p
  ̂ЂƂłB) /proc fBNgÃTufBNgA̒
  ̃t@C݂ȂBł́Aǂ cat /proc/devices ƂR}
  hsł̂H /proc t@CVXéAt@CVXeƓ
  lɁAzt@CVXeɓo^ĂBAVFS  /proc t@
  CVXeĂяoāÃt@CfBNgI[v邽
   inode NGXgƂɁA /proc t@CVXéAJ[l
  ̏񂩂炻̃t@CfBNg(I)쐬BƂ΁AJ[
  l /proc/devices t@C͂̃foCXLqJ[l̃f[^
  \̂琶ĂB

  /proc t@CVXéAJ[l̎sԂւ̑A[Uǂ
  Ƃ悤Ȍ`Œ񋟂BLinux J[lW[(``uW[
  v''̏͂Ql)̂悤 Linux TuVXê́A/proc t@C
  VXeɃGg쐬ĂB

  10.5.  foCXXyVt@C

  Linux ́AUnix ̂o[WƓlɁAn[hEFAfoCXX
  yVt@Cŕ\ĂBƂ΁A/dev/null ̓k(null)foC
  XłBfoCXt@C̓VXẽf[^ԂgpȂB
  ́APȂfoCXhCoւ̃ANZX|CgłBEXT2 t@CV
  Xe Linux VFS ͂ǂfoCXhCoʂȃ^Cv inode 
  ĎĂBfoCXt@Cɂ́ALN^XyVt@C
  ubNXyVt@C̓ނBJ[l̂̓ŁAfoC
  XhCoɂ邻t@C̃I[vN[YƂAt@C
  ̈Ӗ`ĂBLN^foCXł́ALN^[h
   I/O 삪\łAubNfoCXłׂ͂Ă I/O 삪ob
  t@oRōs悤vBfoCXt@Cɑ΂ I/O NG
  XgȂƁÃNGXg̓VXe̓K؂ȃfoCXhCo
  B͂΂Ύۂ̃hCołȂA SCSI foCXhCow
  ƂTuVXe̋^foCX(pseudo-device) hCoł
  BfoCXt@ĆAfoCX^Cvʂ郁W[ԍƁA
  W[ԍ̒ł̎ۂ̃jbg(unit)̓CX^X
  (instance)ʂ}Ci[ԍƂŎQƂBƂ΁AVXe
  ŏ IDE fBXNRg[ɂ IDE fBXŃAW[ԍ 3
  łAIDE fBXN̍ŏ̃p[eBV̓}Ci[ԍ 1 ƂȂB
  āA/dev/hda1  ls -l ̌ʂ͎̂悤ɂȂB
  [see: Linux ̑SW[ԍɂẮAinclude/linux/major.h]

  $ ls -l /dev/hda1
  brw-rw----   1 root    disk       3,    1  Nov 24  15:09 /dev/hda1

  J[lł́AׂẴfoCX ``kdev_t'' f[^^Cvɂă
  j[NɋLqB̃f[^ 2 oCgłAŏ̃oCgɂ̓f
  oCX̃}Ci[ԍ܂܂AԖڂ̃oCgɂ̓W[ԍێ
  ĂB
  [see: include/linux/kdev_t.h]
  L IDE foCX́AJ[l 0x0301 ɕێĂBubN
  foCXLN^foCX\ EXT2 ``inode'' ́AfoCX̃W
  [ԍƃ}Ci[ԍAubN𒼐ڃ|Cg(z) 擪̃|C
  ^ɕێĂBꂪ VFS ɂēǂݏoƂA\
  VFS ``inode'' f[^\̂́A``i_rdev'' tB[hɐfoCX
  ʎqݒ肷B

  (-- (r 1): Linux ɂ́A吨̊J҂B̃Iy[eB
  OVXeɂ́AƑ吨ٌ̕m炵B--)

  11.  lbg[N

  lbg[LO Linux Ƃ͂قƂǓ`łB{̈ӖŁALinux
  ̓C^[lbg World Wide Web(WWW) ̎YłBJ҂⃆
  [U̓EFugďACfAR[hĂ邵ALinux
  ̂̂gDɂlbg[Nւ̗v𖞂߂ɗpĂ
  B̏͂ł́ATCP/IP Ƒ̂lbg[NvgR Linux 
  ̂悤ɃT|[gĂ邩B

  TCP/IP vgR݌vꂽ̂́AARPANET ɐڑꂽRs[^
  ł̒ʐMT|[g邽߂łBO{ɂĐݗꂽA
  J̌plbg[Nł ARPANET ́Albg[N̊{TO
  opCIjAłA̒ɂ́ApPbgXCb`O(packet
  switching)AvgRʂ̃vgR̃T[rX𗘗pƂ
  vgRw(protocol layer)ƂTOB ARPANET  1988 N
  UꂽǍp(NSF(``r 1'') NET C^[lbg)͂
  ̂̂ɐB World Wide Web ƌĂ΂̂́AARPANET 
  WĂAꎩ̂ TCP/IP vgRɂăT|[gĂ
  BUnix  ARPANET ōL͈͂ɎgpꂪAŏɃ[Xꂽlbg
  [No[W Unix  4.3 BSD łBLinux ɂlbg[
  N̎́A(̊g@\ƂƂ)BSD \Pbg TCP/IP SʂT
  |[gĂ_ŁA4.3 BSD fƂ̂łBBSD \PbgƂ
  vO~OC^[tFCX̗pꂽ̂́A̐lC䂦ł
  ALinux Ƃ̑ Unix vbgtH[Ԃł̃AvP[V̈ڐA
  eՂɂ邽߂łB

  11.1.  TCP/IP lbg[LO̊Tv

  ̏͂ł́ATCP/IP lbg[LOɂ{TB
  A{̃e[}炵āAOꂵLqƂ킯ł͂ȂB IP lbg
  [Nł́AׂẴ}V IP AhX蓖ĂB̓}V
  j[NɎʂ 32 rbg̐łBWWW ͍Lōߒɂ
  Aɐڑꂽ IP lbg[NƂׂẴ}V̓j[N IP A
  hX蓖ĂȂ΂ȂȂB IP AhX́AƂ
  16.42.0.9 ̂悤Ƀhbgŋ؂ꂽ 4 ̐ŕ\B IP
  AhX͎ۂɂ́Albg[NAhXƃzXgAhX̂ӂ̕
  ɕB( IP AhXɂ͂̃NX̂) ̕
  ̃TCY͒܂ĂȂA 16.42.0.9 ɎAlbg[NA
  hX 16.42 ƂAzXgAhX 0.9 łƂBzXgAhX
  ͂ɃTulbgƃzXgAhXƂɍĕłBł 16.42.0.9
  ɎƁATulbgAhX 16.42.0 łAzXgAhX 9
  ƂȂ邾낤B IP AhX̍וɂAgD̓lbg[Nĕ
  BƂ΁A16.42  ACME Rs[^Ђ̃lbg[NAhX
  ƂƁA 16.42.0 ̓Tulbg 0 łA16.42.1 ̓Tulbg 1
  ƂȂB̃TulbǵAقȂ錚̒ɂA炭p
  ͖ɂĐڑĂ邾낤BIP AhX̓lbg[NǗ
  ҂ɂĊ蓖Ă̂ŁAIP TulbgƂ̓lbg[N
  𕪎U悢@łBIP Tulbg̊Ǘ҂́A IP Tulb
  g[NŎR IP AhX蓖Ă邱Ƃł邩łB

  AʓI IP AhX͊ô⍢łBÔق
  ȒPłAlinux.acme.com ̂ق 16.42.0.9 Ɗo₷
  BAlbg[N IP AhXɕϊɂ͑̎dg݂Kv
  ƂȂBÓA/etc/hosts t@CŐÓIɎwł
  ALinux ́A DNS (Domain Name System) T[oɖ₢킹āAO
  IP AhXɕϊ邱ƂłB̏ꍇA[JzXg͂ЂƂ
   DNS T[o IP AhXmKvA /etc/resolv.conf
  Ŏw肳B

  EFuy[WǂގȂǂɑ̃}Vɐڑۂ͂Ã}V
  Ƃ̃f[^ IP AhXgpB̃f[^ IP pPbgɊ
  ܂ĂāAX̃pPbǵAM IP AhXƑM IP Ah
  XA`FbNT̑̏܂ IP wb_ĂB`FbNT
   IP pPbg̃f[^瓱ôŁAɂāA炭
  db̃mCYȂǂŁA] IP pPbgȂǂ
  IP pPbg̎M҂fł悤ɂȂBAvP[Vɂđ
  Mf[^́A₷悤ɁA菬ȃpPbgւƕ
  BIP f[^pPbg̃TCY͐ڑfBAɂĈقȂAC[Tlb
  gpPbg͈ʂ PPP pPbgTCY傫BM̃zXg
  ̃f[^pPbggݗĒāAMׂAvP[V
  nȂ΂ȂȂB̃OtBbNC[W܂ރEFuy[Wɔ
  rIᑬȃVAoRŃANZXꍇÃf[^̕Ɠ
  ߒoIɗ邱ƂłB

   IP TulbgɐڑꂽzXgԂł݂͂ɒ IP pPbg
  M邱Ƃł邪AȊÔׂẴpPbg͓ʂȃzXgł
  Q[gEFC (gateway)ɑMBQ[gEFC(邢̓[
  ^(router))́A IP TulbgɐڑĂāATulbg
  ŎM IP pPbgAʂ̃TulbgłꍇɁA IP p
  Pbg𑗐MɌđȂBƂ΁ATulbg 16.42.1.0 
  16.42.0.0 Q[gEFCɂĐڑĂꍇATulbg 0 
  Tulbg 1 ւƑMpPbǵA[eBO\ȃQ[gEF
  CɑȂ΂ȂȂB[JzXg̓[eBOe[uݒ
  AɂĐ}V IP pPbgoHt邱ƂłB
  ׂĂ IP ̑MɊւāA[eBOe[uɂЂƂ̃Gg
  BLinux ́AQƂ邱ƂŁAǂ̃zXgɑ΂悢𔻒f
  āAIP pPbgɓ͂ĂB̃[eBOe[úA
  ̃AvP[Vlbg[NgpAlbg[Ng|W
  [ύXꂽꍇȂǁAԂ̌o߂ɂēIɕωB

                       C[Tlbgt[
  +----+------------+------------+------+---------//---+----------+
  |PRE |M      |M      |v  |              |t[  |
  |Ȃ|C[Tlbg|C[Tlbg|gR  |    f[^    |`FbN  |
  |    |AhX    |AhX    |    |              |V[PX|
  +----+------------+------------+------+---------//---+----------+
                                        |              |
  +-------------------------------------+              +-----------+
  |/                                                               |/
  *                      IP f[^O                           *
  +-+-+--------+-+-+-+------+--------+--------+--------+-------//--+
  | | |pPbg| | | |vg|`FbN|M  |M  |           |
  | | |      | | | |R  |T    |IP      |IP      |  f[^   |
  | | |        | | | |      |        |AhX|AhX|           |
  +-+-+--------+-+-+-+------+--------+--------+--------+-------//--+
                                                       |           |
            +------------------------------------------+           |
            |/                                                     |/
            *                  TCP ZOg                      *
            +--------+--------+----------+----+-+-+---------//-----+
            |M  |M  |V[PX|ACK | | |                |
            |TCP     |TCP     |ԍ      |ԍ| | |    f[^      |
            |AhX|AhX|          |    | | |                |
            +--------+--------+----------+----+-+-+---------//-----+

  }\(10.1) TCP/IP vgRw

  IP(Internet Protocol) vgŔÃvgRf[^^Ԃ߂
  pA]̂߂̑w(layer)łBTCP (Transmission Control
  Protocol)́AGhVXeԂɂM̂vgRŁAȂ
  pPbg𑗎M邽߂ IP gpB IP Ǝ̃wb_悤
  ɁATCP Ǝ̃wb_BTCP ̓RlNV (connection)ɊÂ
  vgRȂ̂ŁA[̃AvP[V́AԂɑ̃Tulbg[N
  Q[gEFCA[^ꍇłAP̉zIRlNVɂ
  ڑBTCP ͂ӂ̃AvP[VԂŐMăf[^̎
  nŝŁAf[^̑rdȂƂۏ؂BTCP 
  IP 𗘗păpPbg]ƂAIP pPbgɊ܂܂f[^
  TCP pPbĝ̂łBX̒ʐMzXg IP ẃAIP pPbg
  ̑MɊւĐӔCB UDP (User Datagram Protocol) IP wg
  pĎ̃pPbg]邪A TCP ƈقȂAUDP ͐M̂v
  gRł͂ȂAPɃf[^O(datagram) T[rX񋟂邾
  B̂悤ɁAIP ́ÃvgRɂėpĂB
  āAIP pPbg󂯎ہAM IP ẃAǂ̏ʃvgR
  wɑ΂Ă IP pPbgɊ܂܂f[^nׂFłȂ
  ΂ȂȂBȒPɎ邽߂ɁAׂĂ IP wb_ɂ́Avg
  RʎqLqꂽ 1 oCg̏񂪂BTCP  IP w IP pPb
  g̑M˗ƂAIP pPbg̃wb_ɂ́ÃpPbg TCP p
  Pbg܂ނ̂ł邱Ƃ`񂪋LqBM IP ẃA
  ̃vgRʎqgpāAǂ̏ʑw(̏ꍇ́A TCP)ɎM
  f[^nׂ𔻒fB܂AAvP[V TCP/IP oRŒ
  MsƂA͑ IP AhXłȂAAvP[V
  ̃|[gԍw肵Ȃ΂ȂȂB|[gԍ̓AvP[V
  j[Nɓ肷̂łAWIȃlbg[NAvP[V͕W
  ̃|[gԍgpBƂ΁AEFuT[o 80 ԃ|[ggp
  ĂBo^ς݂̃|[gԍ́A/etc/services t@CŊmFł
  B

  ̂悤ȃvgȒw\́ATCP, UDP  IP ɗ܂ȂB
  Ȃ킿AIP vgRglXȈقȂ镨fBAgp IP p
  Pbg𑼂 IP zXgɓ]ĂBāA̕fBA
  ̂Ǝ̃vgRwb_tĂBC[Tlbgẅ
  łAɂ PPP w SLIP wȂǂBC[Tlbg̃lbg[N
  ł́ÃzXg𓯎ɒP̕P[uɐڑ邱Ƃ\ł
  (: 10BASE5 ȂǁB݁AP̕P[ug邱Ƃ͏Ȃ
  Ȃ܂)BMꂽC[Tlbgt[(frame)́ÃP[uɐ
  ꂽׂẴzXg猩邱ƂôŁAX̃C[Tlbgfo
  CX̓j[N(n[hEFA)AhXȂ΂ȂȂB
  (n[hEFA)AhXɑ΂đMꂽC[Tlbgt[͂̃A
  hX̃zXgɎMAlbg[NɐڑꂽȊÔׂẴz
  Xg͖Bj[NȃAhX̓C[TlbgfoCX
  ̐ɃfoCXɑgݍ܂ĂāAʏAC[TlbgJ[h
  SROM(``r2'') ɕۑĂBC[Tlbg̃AhX 6 oCg
  ŁAƂ΁A08-00-2B-00-49-A4 Ƃ̂ɂȂĂBC[Tlbg
  ̃AhXɂ̓}`LXg(``: pW(multicast)'')̖ړIɗ\
  ꂽ̂AMAhXݒ肳đMꂽC[T
  lbgt[́Ãlbg[Nׂ̂ẴzXgŎMBC[
  Tlbgt[́ÃvgR(f[^Ƃ)^ԂƂł
  ŁA IP pPbg̏ꍇƓlɁAC[Tlbgt[̃wb_ɂ̓vg
  Rʎq܂܂ĂBɂāAC[Tlbgw IP pPbg
  mɎMāA IP wɓnƂłB

  C[Tlbĝ悤(P[uɌqׂẴzXgɃt[
  ) }`RlNṼvgRoR IP pPbg𑗐M邽߂
  ́AIP ẃA IP zXg̃C[TlbgAhXmȂ΂ȂȂB
  Ƃ̂AIP AhX͒PɃAhX蓖Ă̊TOɂAC[T
  lbgfoCX̂Ǝ̕AhXĂ邩łBȂ
  AIP AhX̓lbg[NǗ҂̈ӎuɂĊ蓖ĂĊ蓖
  \ł̂Albg[Nn[hEFÁA̕AhXt
  ꂽC[Tlbgt[A邢ׂ͂Ẵ}VŎMׂ
  ȃ}`LXgAhXɂȂłB Linux ́AARP
  (Address Resolution Protocol)gpāA}VAIP AhXC[T
  lbgAhX̂悤Ȏۂ̃n[hEFAAhXɕϊł悤ɂ
  B IP AhXɊ֘Atꂽn[hEFAAhXm낤Ƃ
  zXǵAϊ IP AhX܂߂ ARP NGXgpPbgA
  }`LXgAhXtălbg[Nׂ̂Ẵm[h(node)ɑ
  MB IP AhX^[QbgzXg(target host)́A
  AhX܂߂ ARP vCɂĂɉBARP ̓C[T
  lbgfoCXłpłȂ킯ł͂ȂA``FDDI'' Ȃǂ̂
  ȊO̕fBAɑ΂Ă IP AhX̉\łB ARP 
  płȂlbg[NfoCX͂ꂪoȂ|}[NĂ̂ŁA
  ̏ꍇALinux ARP Ƃ͂ȂBARP ̋t̋@\݂ĂA
  o[X ARP  RARP ́An[hEFAAhX IP AhXɕ
  B̓Q[gEFCɂėp̂ŁAQ[gEFĆA
  [glbg[Nɂ IP AhXꂽ ARP NGXgɉ
  ۂɂgpB

  11.2.  Linux  TCP/IP lbg[Nw

                             lbg[N
                            AvP[V
                                 /|
                                  |                       User
  --------------------------------+----------------------------
                                  |                      Kernel
                                  |/
                            +-----*------+
                            |    BSD     |
                            |  \Pbg  |
                            +-----*------+
  \Pbg                       /|
  C^[tFCX                |/
                            +-----*------+
                            |    INET    |
                            |  \Pbg  |
                            +--*--*--*---+
                              /| /| /|
                          +----+  |  +----+
                          |/      |       |/
                      +---*---+   |   +---*---+
                      |       |   |   |       |
                      |  TCP  |   |   |  UDP  |
                      +---*---+   |   +---*---+
  vgRw           /|       |      /|
                          |       |       |
                          |/      |/      |/
                   +------*-------*-------*-------+
                   |                              |<-+
                   |              IP              |  |
                   +---*----------*----------*----+  |  +-------+
                      /|         /|         /|       +->|       |
                       |          |          |          |  ARP  |
                       |/         |/         |/      +->|       |
                   +---*---+  +---*---+  +---*----+  |  +-------+
  lbg[N     |       |  |       |  |        |<-+
  foCX         |  PPP  |  |  SLIP |  |Ethernet|
                   +-------+  +-------+  +--------+

  }\(10.2) Linux ̃lbg[Nw

  lbg[NvgR̂w\̂ƓlɁA}\(10.2)
  ́ALinux C^[lbgvgRAhXt@~(address family)
  \tgEFȂw\ƂĎĂ邱ƂĂBBSD \Pb
  ǵABSD \PbgɊւėp̃\PbgǗ\tgEFAƂăT|
  [gĂB BSD \PbgT|[ĝ INET \PbgwŁA
  ́AIP x[X TCP  UDP vgR̂߂̃Gh|CgʐM
  B UDP(User Datagram Protocol)̓RlNVǗsȂvg
  Rł邪ATCP(Transmission Control Protocol)͐M̂
  (end to end)̃vgRłBUDP pPbgMƂALinux
  ͂ꂪSɑMɓ͂ǂȂACɂȂBTCP p
  Pbg͔ԍtĂ̂ŁATCP RlNṼ̗Gh(end,
  [)́AMꂽf[^MꂽǂmFłB IP w
  ɂ́AC^[lbgvgR(IP)邽߂̃R[h܂܂Ă
  B̃R[h́AMf[^ IP wb_擾A IP pPbg
   TCP  UDP ̂ǂ炩̏ʑwɈĂ̂𔻒fāAK؂ȏʑw
  Ƀ[eBOBIP w̉ Linux ̃lbg[LOT|[g
  ̂APPP C[TlbgƂlbg[NfoCXłBlbg
  [NfoCXƂ͕KfoCXӖ̂ł͂ȂB[v
  obNfoCX(loopback device)Ȃǂ͏ȃ\tgEFAfoCX
  łB mknod ō쐬 Linux ̕WIȃfoCXt@CƂ͈ق
  Albg[NfoCX͂̊bƂȂ\tgEFAfoCX
  oꍇɂBJ[lɓK؂ȃC[TlbgfoCXh
  Cogݍ񂾏ꍇ̂݁A/dev/eth0 邱ƂłBARP vgR
  ́AIP w n[hEFAAhX̂߂ ARP T|[g鉺
  ̃vgRƂ̊ԂɈʒuĂB

  11.3.  BSD \PbgC^[tFCX

  BSD \PbgC^[tFCX́AėpC^[tFCXłAlbg[
  N̗lXȌ`ԂT|[g邾łȂAvZXԒʐM̎dg݂ł
  B\Pbg͒ʐMN̈̃Gh(end, [)Lq̂ŁAӂ
  ̒ʐMvZXʂɃ\PbgA҂̊Ԃ̒ʐMN̂ꂼ
  ̃GhLqB\Pbg̓pCv̓ȃP[Xłƍl邱Ƃ
  \ApCvƈقȂA\Pbg͕ێłf[^eʂɐ
  BLinux ́A̃\PbgNX (socket class)T|[gĂ
  A̓AhXt@~(address family)ƌĂ΂ĂB́A
  X̃NXƎ̒ʐMĂ邩łB Linux ͎̂悤
  AhXt@~̓hC(domain)T|[gĂB

     UNIX
        Unix hC\PbgB

     INET
        C^[lbgAhXt@~(internet address family)́A
        TCP/IP oR̒ʐMT|[gĂB

     AX25
        A}`A X25B

     IPX
        Novell IPXB

     APPLETALK
        Appletalk DDP

     X25
        X25B

  AhXt@~̓hCɂ́A̃\Pbg^Cv(socket
  type) A̓RlNVT|[gT[rX̃^Cv\
  ĂBׂẴT[rX^CvT|[gĂȂAhXt@~
  B Linux BSD \Pbĝ͎̃\Pbg^CvT|[gĂ
  B

     Stream
        ̃\PbǵAoŏBmF̍sM̂f[^
        Xg[ (data stream)łAʐMrł̃f[^̑rjA
        Ȃ悤ۏ؂ꂽ̂łBStream \PbǵAC
        ^[lbg(INET)AhXt@~ TCP vgRɂăT|[
        gĂB

     Datagram
        ̃\PbǵAoł̃f[^ʐM񋟂邪Astream \Pb
        gƈقȂAbZ[WBۏ؂͂ȂBBꍇłA
        Ԓʂ͂Aɕj͂ȂƂƂ͕ۏ؂
        B̃^Cṽ\PbǵAC^[lbgAhXt@~ UDP
        vgRɂăT|[gĂB
     Raw
        ́AvZXAʑw̃vgRɒ(䂦A
        (raw))ANZX̂łBgƁAƂ΁Araw \
        PbgC[TlbgfoCXɑ΂ăI[vA(raw) IP f
        [^gtBbN邱Ƃ\ɂȂB

     Reliable Delivered Messages
        ́Adatagram \PbgƔɗގĂ邪Af[^̓
        ۏ؂B

     Sequenced Packets
        ́Af[^pPbgTCYŒ肳Ă邱ƂāAstream
        pPbgƓłB

     Packet
        ́AWI BSD \Pbg^Cvł͂ȂBLinux ŗL̊g
        AgƁAvZXfoCXxŒڃpPbgɃAN
        ZXłB

  \Pbg𗘗pĒʐMsvZX́ANCAgT[of
  (client server model)gpBT[o̓T[rX񋟂ANCA
  g̃T[rX𗘗pB̓T^EFuT[ołAT[o
  EFuy[W񋟂ANCAgA̓uEŨy[Wǂ
  oB\PbggT[óA܂\Pbg쐬AɖOт
  (bind)B̖ÕtH[}bg͂̃\Pbg̃AhXt@~Ɉ
  AT[õ[JAhXɂȂB\Pbg̖O̓Ah
  X́A``sockaddr'' f[^\̂gĎw肳B INET \Pbg
  ́AIP |[gԍɌтBo^ς݃|[gԍ́A
  /etc/services t@CŌ邱ƂłBƂ΁AEFuT[õ|[
  gԍ 80 łBAhX\PbgɌтAT[óÃA
  hXw肵RlNVNGXg܂őҋ@(listen)ĂB
  NGXg̔M҂łNCAg̓\Pbg쐬AT[õ^[
  QbgAhXw肵āA\PbgŃRlNVNGXgo
  BINET \Pbg̏ꍇAT[õAhX́A IP AhXƃ|[g
  ԍłBėNGXǵAlXȃvgRw㏸āAT[
  ȏҋ@(listening)̃\Pbg(̂)҂BT[o
  ėNGXgMꍇAT[óA󂯓(accept)
  ₷邩̂ꂩsBNGXg󂯓ꍇAT[o͎
  邽߂̐V\Pbg쐬Ȃ΂ȂȂBėRlN
  VNGXĝ߂ɁAҋ@(listening)ɓ\Pbg
  ́ARlNVT|[g邽߂Ɏgp邱Ƃ͂łȂBRlNV
  mꂽA҂͎RɃf[^̑MłBŌɁAȏ
  RlNVKvȂȂƂARlNV͎Ւf(shutdown)łB
  ̍ہA]̃f[^pPbgĂ悤ӂ𕥂
  KvB

  BSD \Pbgł̑삪ɉӖ邩́ÅbƂȂAhX
  t@~ɂĈقȂBTCP/IP RlNV̐ݒ́AA}`A
  X.25 RlNV̐ݒƂ͔ɈقȂBzt@CVXȅꍇ
  悤ɁALinux ́ABSD \Pbgw(layer)gă\PbgC^[tFC
  X𒊏ۉĂB BSD \PbgẃAAvP[VvO
  ΂ BSD \PbgC^[tFCXƊ֌WtAAvP[V
  ́AAhXt@~ƂɓƗŗL̃\tgEFAɂT|[g
  ĂBJ[lɑgݍ܂ꂽAhXt@~́AJ[l̏
  ɁABSD \PbgC^[tFCXƔɓo^B̌AAvP[
  V BSD \Pbg쐬ĎgpꍇABSD \PbgƂꂪT|
  [gAhXt@~Ƃ̊ԂŊ֘AtȂB̊֘At́Af
  [^\̂ƃAhXt@~ŗL̃T|[g[`ƂNXN
  ƂɂBƂ΁AAhXt@~ŗL̃\Pbg쐬[
  `ꍇAAvP[VVKɃ\Pbg쐬悤Ƃۂ
  ́ABSD \PbgC^[tFCX́Ã[`gpă\Pbg
  B

  ʂɁAJ[lݒ̍ۂɂ́A̃AhXt@~ƃvgR
  rhAprotocols zɑgݍ܂B͂ꂼAINET 
  OƂ̏[`̃AhXƂɂĕ\Bu[g
  Ƀ\PbgC^[tFCXƂAX̃vgR
  [`ĂяoB\PbgAhXt@~ɂƂāÁAg
  vgRo^邱ƂӖB́Ag̃[`łA
  ꂼꂪAhXt@~ŗL̃vgRsBo^ꂽv
  gR샋[`́A``pops'' zɕۑ邪A
  ``proto_ops'' f[^\̂ւ̃|C^̔złB
  [see: include/linux/net.h]
  proto_ops f[^\̂́AAhXt@~^CvƁAAhXt@~
  L̃\Pbg샋[`ɑ΂Ã|C^\ĂB
  pops źAAhXt@~ʎqɂCfbNXtĂ
  āAƂ΁AC^[lbgAhXt@~̎ʎq(AF_INET) 2 ł
  B

  files_struct
  +-------------+
  | count       |
  |-------------|
  |close_on_exec|
  |-------------|
  | open_fs     |
  |-------------|
  | fd[0]       |      file
  |-------------|   +----------+
  | fd[1]       |-->| f_mode   |
  |-------------|   |----------|
  |             |   | f_pos    |
  |             |   |----------|
  |             |   | f_flags  |
  |-------------|   |----------|
  | fd[255]     |   | f_count  |
  +-------------+   |----------|
                    | f_owner  |
                    |----------|                    BSD Socket
                    | f_op     |------------------->File Operations
                    |----------|
                    | f_inode  |-+     inode        lseek,ioctl
                    |----------| |  +---------+     read, close
                    |f_version | +->|         |     write, fasync
                    +----------+    |         |     select
                                +-->| socket  |
                                |   |---------|SOCK_STREAM
                                |   | type    |------->Address Family
                                |   | ops     |----+   Socket
                                |   | data    |    |   Operations
                                |   +---------+    |
                                |    +-------------+
                                +----+-----------------+
                                     |       sock      |
                                     |   +----------+  |
                                     +-->| type     |SOCK_STREAM
                                         |----------|  |
                                         | protocol |  |
                                         |----------|  |
                                         | socket   |--+
                                         |----------|
                                         |          |
                                         |          |
                                         +----------+

  }\(10.3) Linux BSD \Pbgf[^\

  11.4.  INET \Pbgw

  INET \PbgẃATCP/IP ܂ރC^[lbgAhXt@~T|[
  ĝłBLŐ悤ɁÃvgR͑w\
  ȂĂāAЂƂ̃vgRʂ̃vgR̃T[rX𗘗pB
  Linux  TCP/IP ̃R[hƃf[^\͂̑w\𔽉fĂBBSD
  \Pbgwɑ΂ INET \Pbgw̃C^[tFCX́AÃC^[
  lbgAhXt@~̃\Pbg샋[`oR̂ł
  ALinux ́Albg[N̏ɂ̃[` BSD \Pbg
  wƔɓo^B́Ao^ꂽ̃AhXt@~ƈꏏ
  ``pops'' zɕۑBBSD \PbgẃAo^ς݂ INET
  ``proto_ops'' f[^\̂AINET w\PbgT|[g郋[`
  ĂяođsBƂ΁AAhXt@~ INET Ǝw肵
   BSD \Pbg쐬NGXǵÅbɂ INET \Pbg쐬֐
  gpB BSD \PbgẃǍX̑ۂɁABSD \
  Pbg\ ``socket'' f[^\̂ INET wɓnB BSD \Pbg
  TCP/IP ŗL̏łႲɂȂȂ悤ɁAINET \PbgẃA
  ̃f[^\̂ł ``sock'' gpA̍\̂ BSD \Pbgw
   socket f[^\̂ɃNB
  [see: include/net/sock.h]
  ̃N֌ẂA}\(10.3)ŎĂB INET \Pbgw sock f
  [^\̂ BSD socket f[^\̂ɃNہABSD socket 
  data|C^gpB́Aȍ~ INET \PbǧĂяoŁA
  ȒP sock f[^\̂o邱ƂӖB sock f[^\
  ̃vgR샋[`ւ̃|C^́A̍\̍쐬ɐݒ肳
  Aݒ̓e̓NGXgꂽvgRɂĈقȂB TCP/IP 
  NGXgꂽꍇAsock f[^\̂̃vgR샋[`ւ̃|C
  ^́ATCP RlNVɕKv TCP vgR샋[`̃Zbg
  |CgB

  11.4.1.  BSD \Pbg̍쐬

  VXeR[ŐVK\Pbg쐬ۂ́AAhXt@~A\Pbg
  ^CvAvgRɊւ鎯ʎqnB
  [see: sys_socket(), in net/socket.c]
  ܂ANGXgꂽAhXt@~gāA``pops'' zɍv
  AhXt@~邩ǂBƂ΁ÃAhX
  t@~J[lW[ƂĎĂꍇ́Ap
  O kerneld f[ɂĊY郂W[[h邱Ƃɂ
  BVK ``socket'' f[^\̂蓖ĂāA BSD \Pbg\
  BہAsocket f[^\̂́AIɂ VFS ``inode'' f[^
  \̂̈ꕔȂ̂ŁAsocket ̊蓖ẮA VFS inode ̊蓖ĂӖ
  B͊Ɏv邩ȂA\PbǵAʏt@C̑
  Ɠ@ő삳꓾邱ƂlĂقBׂẴt@C VFS
  inode f[^\̂ɂĕ\̂ŁAt@CT|[g
  ́ABSD \Pbg VFS inode f[^\̂ɂĂ\Ȃ΂
  Ȃ̂łB

  VKɍ쐬ꂽ BSD ``socket'' f[^\̂ɂ́AAhXt@~ŗL
  ̃\Pbg[`ւ̃|C^܂܂ĂāÃ[`́A``pops''
  z񂩂oꂽ ``proto_ops'' f[^\̂ɐݒ肳B̃^C
  v́ANGXgꂽ\Pbg^CvAȂ킿 SOCK_STREAM, SOCK_DGRAM
  ɐݒ肳BAhXt@~ŗL̍쐬[`́Aproto_ops f[^
  \̂ɕۑꂽAhXgpČĂяoB

  gp̃t@CLqqAJgvZX ``fd'' z񂩂犄蓖Ă
  āAꂪ|Cg ``file'' f[^\̂B̍ۂ
  Ɉׂ鏈ƂāÃt@C|C^̃|Cg悪A BSD
  \PbgC^[tFCXɂăT|[g BSD \Pbgt@C
  샋[`QւƐݒ肳BȌ̉炩̑́A\PbgC^[
  tFCXւƗUA\PbgC^[tFCXɃAhXt@~
  샋[`ĂяoƂŁAꂪT|[gAhXt@~ւƗU
  B

  11.4.2.  AhX INET BSD \Pbg bind 

  ėC^[lbgRlNVNGXgҋ@(listen)邽߂
  ́AX̃T[o INET BSD \Pbg쐬āAɃAhXт
  (bind) Ȃ΂ȂȂBbind ̑啔́Åbɂ TCP 
  UDP vgRw̃T|[g󂯂 INET \PbgwŏBA
  hXт(bind)ꂽ\PbǵAȊO̒ʐMɂ͎gpł
  B́A\Pbg̏(state) TCP_CLOSE łȂ΂ȂȂƂ
  ӖB``sockaddr'' \̂ bind 샋[`ɓn̒
  ɂ́Aт(bind)ׂ IP AhXƁAIvVƂă|[g
  BʏAbind ꂽ IP AhX́Albg[NfoCXɊ
  Ăꂽ̂łÃfoCX INET AhXt@~T|[g
  ̂ŁÃfoCX̃C^[tFCX͋NĂĎgp\łȂ
  ΂ȂȂB̃C^[tFCX݃ANeBuł邩mF
  ́Aifconfig R}hgp΂悢B IP AhX́AAhX(̃rb
  g)ׂ 1 ɂ邩Aׂ 0 ɂ邩ꂩɂāAIP u[h
  LXgAhX(``:broadcast address'')ɂ邱ƂłB
  ʂȃAhXŁAuSɑMv(``r3'')邱ƂӖB}V
  ߓIȃvLVt@CAEH[łꍇAIP AhX̎wC
  ӂ IP AhXƂĂ\ȂAX[p[[ǓvZ
  XCӂ IP AhXт(bind)łBт(bind)ꂽ
  IP AhX ``sock'' f[^\̂ recv_addr(: ``recv_saddr''?)
   ``saddr'' ɕۑB́AnbVւ̖₢킹̍ۂƁAIP
  AhX݂ɑMꍇɎgpB|[gԍ̓IvVł
  Aw肳ȂꍇAT|[glbg[Nɖgp̔ԍ蓖
  悤vȂBKł́A1024 ̃|[gԍ́AX[p[[
  U̓ȂvZXł͎gpłȂBbƂȂlbg[N|[g
  ԍ蓖ĂꍇA 1024 ȏ̔ԍɊ蓖ĂB

  pPbgbƂȂlbg[NfoCXŎMƁApPbg͐
   INET \Pbg BSD \PbgւƓ`BāAȂ΂Ȃ
  B̂߂ɁAUDP  TCP ́AnbVe[uǗĂāA
  gāA IP pPbgɂAhX₢킹āA
  socket/sock yAւ IP pPbg`BBTCP ̓RlNVw̃v
  gRȂ̂ŁAUDP pPbg̏ꍇ TCP pPbgꍇ
  ق֌WʂB

  UDP ́A蓖Ăꂽ UDP |[g ``udp_hash'' ƂnbVe[u
  ŊǗĂB̃nbVe[úA``sock'' f[^\̂ւ̃|
  C^\ĂāAsock \̂̓|[gԍɊÂănbV
  ɂCfbNXtĂBUDP ̃nbVe[úA
  |[gԍ̐(udp_hash  128 AUDP_HTABLE_SIZE ̐
  GgȂ)̂ŁAe[ũGĝȂɂ́AX sock
  ւ̃|C^ƂŃNꂽ sock f[^\̘̂AXg
  |CgĂ̂B

  TCP ́ÃnbVe[uǗĂ̂ŁAUDP 肸ƕG
  BATCP ́Abind ԁAۂ bind ׂ ``sock''
  f[^\̂̃nbVe[uɕt킯ł͂ȂAvꂽ
  |[gԍݎgpĂȂǂ`FbN邾łB sock
  f[^\̂́Alisten ̊Ԃ TCP ̃nbVe[uɕt
  B

  REVIEW NOTE: What about the route entered?

  11.4.3.  INET BSD \PbgŃRlNVm

  \Pbg쐬ƁÃ\PbǵA葤(inbound)RlN
  VNGXgҋ@(listen)邽߂ɎgpĂȂAȑ
  (outbound) RlNVNGXĝ߂ɎgpłB UDP ̂悤
  RlNVX̃vgȐꍇÃ\Pbg͌肳ꂽӖ
  Ȃ̂ATCP ̂悤ȃRlNVw̃vgȐꍇƁA
  ͂ӂ̃AvP[VԂŉzT[Lbg\z邱ƂӖ
  B

  ȑ(outbound)RlNVNGXg\ƂȂ̂́AINET BSD
  \PbggpAgp INET BSD \PbgK؂ȏ
  (state)ɂꍇłBȂ킿Ã\PbgŊɃRlN
  VmĂȂƁAтꂪ葤(inbound)RlN
  VNGXg̑ҋ@̂߂ɎgpĂȂꍇłB́ABSD
  ``socket'' f[^\̂ SS_UNCONNECTED ̏ԂɂȂ΂ȂȂ
  ӖB UDP vgR̓AvP[VԂŉzRlNVm
  邱Ƃ͂ȂAMꂽbZ[Wׂ͂ăf[^O(datagram)
  ̂ŁAMbZ[WMɓ͂ǂ͊m肵ȂB
  AUDP ɊւĂ BSD \Pbgł connect ̓T|[gĂ
  BUDP INET BSD \Pbgł connect ́APɃ[gAvP[
  ṼAhXƂāA IP AhX IP |[gԍݒ肷B
  ɁA[eBOe[ũGg̃LbVݒ肵āA(Y[
  gƂȂȂ) BSD \Pbg瑗Mꂽ UDP pPbg
  ēx[eBO`FbNKvȂ悤ɂBLbV
  [eBÓAINET ``sock'' f[^\̓
  ``ip_route_cache'' |C^ɂă|CgBAhX񂪎w
  ȂꍇÃLbVꂽ[eBO IP AhX
  A BSD \PbggđM郁bZ[Ŵ߂ɎIɎgp
  BāAUDP  sock ̏(state) TCP_ESTABLISHE ɕύX
  B

  TCP BSD \Pbgł connect ̏ꍇATCP ́ARlNV
  ܂ TCP ZOg(segment)쐬āAw肳ꂽ IP Mɑ
  ΂ȂȂB TCP ZOgɂ́ARlNVAJnZOg
  ̃V[PXԍ(sequence number)AڑJnzXgł
  ZOg̍őTCY(maximum segment size, MSS)AMюM̍
  ̃EBhETCY(window size)A܂܂B TCP ł́AׂẴZO
  gɔԍt̂ŁAV[PXԍ̏lɂ́Aŏ̃ZO
  g̔ԍpBLinux ́Aӂ̂A^bNh߂ɁAÓ
  Ȕ͈̗͂lIĂBTCP RlNV̈瑗MA
  ŖȂMꂽZOgɑ΂Ăׂ͂āAf[^jȂ
  ɓB|̑BmF(acknowledgement)ȂBBmF̂ȂZO
  g͍đBMƎM̃EBhETCYƂ́ABmFM
  Ȃ܂ܑ݂関ZOg̐łBőZOgTCY
  ́ARlNVNGXg𔭐MŎgpĂlbg[Nfo
  CXɈˑBM̃lbg[NfoCXőZO
  gTCYT|[gĂȂꍇÃRlNV͏g
  pBȑ(outbound) TCP RlNVNGXg𔭂Av
  P[V́A葤AvP[VRlNVNGXg󂯓
  (accept)邩( reject)邩ԓĂ܂ő҂Ȃ΂Ȃ
  B̏ꍇATCP \Pbg͑葤̃bZ[W҂Ă̂ŁA
  ̃\Pbg ``tcp_listening_hash'' ɉāAɂāA
   TCP ZOg͂ ``sock'' f[^\̂ւƗUB
  ATCP ̓^C}[X^[gāAM̃AvP[VNGX
  gɑ΂ĉȂꍇAȑ(outbound)RlNVNGXg
  ^CAEgB

  11.4.4.  INET BSD \Pbgł̑ҋ@(listen)

  \PbgɃAhXт(bind)ƁÃ\PbǵAт
  (bind) ꂽAhXw肵ĂRlNVNGXg
  @(listen)Blbg[NAvP[V́A\߃\PbgɃAhX
  т(bind)ȂẴ\Pbgő҂ƂłB̏
  AINET \Pbgw(̃vgRɊւ)gpȃ|[gԍT
  āAIɂ̃\PbgɌт(bind)B\Pbg֐ listen ́A\
  Pbg (state) TCP_LISTEN ԂւƕύXAėڑ
  邽߂ɕKvƂ邻̃lbg[NŗLׂ̂Ă̏sB

  UDP \Pbg̏ꍇA\PbgԂ̕ύXŏ[ATCP ́A̍ہAAN
  eBuƂȂƂŁA\Pbg ``sock'' f[^\̂ӂ̃nb
  Ve[uɕtȂ΂ȂȂB́A``tcp_bound_hash''
  e[u ``tcp_listening_hash'' łBǂAIP |[gԍɊ
  ÂnbV֐oRāACfbNXtB

  ė(incoming) TCP RlNVNGXgANeBuȑҋ@
  (listening)̃\PbgŎMꂽƂ͂ATCP ́A\VK
   ``sock'' f[^\̂쐬B sock f[^\̂́ARlN
  VNGXgŏIIɎ󂯓 (accept)ꂽƂɁATCP RlN
  Ṽ{gn[t(bottom half)ƂȂB܂ TCP ́AėRlN
  VNGXg܂ ``sk_buff'' 𕡐(cloning)āAA
  @(listen)Ԃ sockf[^\̂ ``receive_queue'' L[ɓo^
  Bꂽ sk_buff \̂ɂ́AVKɍ쐬ꂽ sock \̂ւ̃|
  C^܂܂B

  11.4.5.  RlNVv󂯓(accept)

  UDP ̓RlNV̊TOT|[gĂȂ̂ŁAINET \Pbgł
  RlNVNGXg̎󂯓(accept)́ATCP vgRɓKp
  B悸Aҋ@(listen)Ԃ̃\Pbg accept 샋[`́A
  ``socket'' f[^\̂AVK socket f[^\̂𕡐B
   accept 샋[`́Aė(incoming)RlNVNGXg
  󂯓(accept)߂ɁAT|[gvgRw(layer)AȂ킿
  ̏ꍇ INET wɓnB INET vgRẃẢʑw̃vgR
  RlNVT|[gĂȂꍇAƂ UDP łꍇ́A
  󂯓(accept)ɎsBʑwRlNVT|[gĂ
  ꍇAaccept 샋[`́A(real) vgR(̏ꍇATCP)ւƓn
  B accept ́AubN邩Ȃ̂ꂩōsBu
  bNȂꍇŁA󂯓ׂRlNVȂꍇAaccept 
  [`͎sAVKɍ쐬ꂽ socket f[^\͔̂jBu
  bNꍇAaccept 샋[`sĂlbg[NAvP
  [V́A҂sɉATCP RlNVNGXgM
  ܂ŃTXyhBRlNVNGXgMꂽÃNGX
  g܂ ``sk_buff'' ͔jAsock f[^\̂ INET \Pbgw
  ƕԂāAOɐVK쐬ꂽ socket f[^\̂ɃN
  BVK socket ̃t@CLqq(fd)ԍAlbg[NAvP[V
  ɕԂ̂ŁAAvP[V́AVKɍ쐬ꂽ INET BSD \Pb
  gł̃\PbgÃt@CLqqgpčsƂł悤
  ɂȂB

  11.5.  IP w

  11.5.1.  \Pbgobt@(socket buffer)

  X̑ww̃T[rX𗘗pƂAw\̃lbg[Nvg
  RƂ̖_́AX̃vgRAM̍ۂɂ̓wb
  _(header)ƃeC (tail)f[^ɕtAMf[^̏̍ۂɂ͂
  폜Ƃ삪KvɂȂ邱ƂłBX̑w͎̃vg
  Rwb_ƃeCǂɂ̂TKv̂ŁÂƂvg
  RԂł̃f[^obt@̎󂯓nނĂBX̑wŃob
  t@Rs[邱Ƃ͂ЂƂ̉ł邪Ał͔łB
  ŁALinux ́A\Pbgobt@ ``sk_buff'' gpăvg
  RԂlbg[NfoCXƂ̊ԂŃf[^󂯓nĂBsk_buff 
  ́A|C^ƃf[^(length)̃tB[h܂܂Ă̂ŁA
  āAX̃vgRẃAW֐u\bh(methods)voRŃA
  vP[Vf[^𑀍łB

                     sk_buff
                +-----------------+
                | next            |
                |-----------------|
                | prev            |
                |-----------------|
                | dev             |
                |-----------------|
                |                 |
                |                 |
                |-----------------|
                | head            |---+
                |-----------------|   |
                | data            |---+--+
                |-----------------|   |  |
                | tail            |---+--+--+
                |-----------------|   |  |  |
                | end             |---+--+--+---+
     *          |-----------------|<--+  |  |   |
    /|          |                 |      |  |   |
     |          |                 |      |  |   |
     |      *   |-----------------|<-----+  |   |
     |     /|   |                 |         |   |
  truesize  |   | Mׂ  |         |   |
     |     len  | pPbg        |         |   |
     |      |   |                 |         |   |
     |      |/  |                 |         |   |
     |      *   |-----------------|<--------+   |
     |          |                 |             |
     |/         |                 |             |
     *          +-----------------+<------------+

  }\(10.4) \Pbgobt@ (sk_buff)

  }\(10.4)́A``sk_buff'' f[^\̂̂łBX sk_buff
  ɂ́Ag̃f[^֘AtĂB sk_buff ɂ́A4 ̃f[^|
  C^Agă\Pbgobt@̃f[^ƊǗȂ
  B 4 ̃|C^Ƃ́Â̂łB
  [see include/linux/skbuff.h]

     head
        ̃f[^̈̎n_wB́A``sk_buff'' Ɗ֘A
        f[^ubN蓖ĂꂽƂɊm肷B

     data
        vgRf[^݂̌̎n_wB̃|C^́A̎_
        sk_buff LvgRwɈˑ邽߁Al͉ςłB

     tail
        vgRf[^݂̌̏I_wB̃|C^L҂v
        gRwˑȂ̂ŁAl͉ςłB

     end
        ̃f[^̈̏I_wB́Ask_buff 蓖Ă
        ƂɊm肷B

  ``len''  ``truesize'' ̂ӂ̃f[^̃tB[h(length field)
  AꂼÃ݂vgRpPbg̒ƃf[^obt@Ŝ̃T
  CYĂB``sk_buff'' R[h́AAvP[Vf[^ɑ
  vgRwb_ƃvgReC̕tэ폜ɑ΂WI
  dg݂񋟂B́Ask_buff ̃f[^AeCAlen tB[h
  Sɑ삷Bsk_buff R[hɂ́Â̂B

     push
        ́Adata |C^f[^̈̎n_ɈړAlen tB
        [h𑝉(increment)Bꂪgp̂́AM
        f[^̐擪Ƀf[^vgRwb_tƂłB
        [see: skb_push(), in include/linux/skbuff.h]

     pull
        ́Adata |C^n_Ƃ͔ΆAf[^̈̏I_
        ƈړāAlen tB[h(decrement)Bꂪgp
        ̂́AMf[^̐擪f[^vgRwb_폜
        ƂłB
        [see: skb_pull(), in include/linux/skbuff.h]

     put
        ́Atail |C^f[^̈̏I_ɈړAlen tB
        [h𑝉(increment)Bꂪgp̂́AM
        f[^̏I_Ƀf[^vgRtƂłB
        [see: skb_put(), in include/linux/skbuff.h]

     trim
        ́Atail |C^f[^̈̎n_ɈړAlen tB
        [h(decrement)Bꂪgp̂́AMf[
        ^f[^vgReC폜ƂłB
        [see: skb_trim(), in include/linux/skbuff.h]

  sk_buff f[^\̂ɂ́AɃ|C^܂܂ĂB sk_buff ͏
  ̍Œ sk_buff ̓dAzXgɕۑ邪A̍ۂɎgp
  |C^łBsk_buff ̃Xg̐擪I[ɉۂA
  폜ۂɂ́Â߂̔ėpI sk_buff [`pӂĂ
  B

  11.5.2.  IP pPbg̎M

  ``ufoCXhCov''̏͂ł́ALinux ̃lbg[NhCoJ[l
  ɑgݍ܂āA@BɂāAA
  ``device'' f[^\̂ ``dev_base'' XgɃNꂽBX
  device f[^\̂́ÃfoCXLqƂƂɁAlbg[Nw
  lbg[NhCoɏsKvƂɌĂяoƂ
  łR[obN[`̃Zbg񋟂B̊֐̑啔̓f
  [^Mƃlbg[NfoCX̃AhXɊւ̂łBlbg[
  NfoCX̃lbg[NpPbgMƂAMf[^
   ``sk_buff'' f[^\̂ɕϊȂ΂ȂȂBlbg[Nh
  CóAMƁAMpPbg쐬ꂽ sk_buff 
  ``backlog'' L[ɕtB
  [see: netif_rr(), in net/core/dev.c]
   backlog L[傫Ȃ肷ꍇAM sk_buff ͔j
  Blbg[Ñ{gn[t(bottom half)́Adł̂ŁAs
  (ready to run)̃tOB

  lbg[N{gn[tnhXPW[ɂĎsƂA
  ̃nh́A܂M҂ɂȂĂlbg[NpPbgׂď
  ɁAǂ̃vgRwɎMpPbgnf
  āA``sk_buff''  ``backlog'' L[B
  [see: net_bh(), in net/core/dev.c]
  Linux ̃lbg[NwƁAX̃vgRo^
  A``packet_type'' f[^\̂ ``ptype_all'' Xg
  ``ptype_base'' nbVe[uɕtB packet_type f[^\
  ɂ́AvgR^CvAlbg[NfoCXւ̃|C^AvgR
  Mf[^[`ւ̃|C^AŌɂ̃XgnbV̘A
  Xg̎ packet_type f[^\̂ւ̃|C^܂܂Bptype_all
  z̘AXǵAׂẴlbg[NfoCXŎMꂽSpPb
  gT߂ɗp̂ŁAĒʏ͎gp
  Bptype_base nbVe[u̓vgRʎqnbVCfbN
  XƂ̂ŁAǂ̃vgRėlbg[NpPbgM
  ׂ肷邽߂ɗpBlbg[N{gn[t́Aė
   sk_buff ̃vgR^CvALꂩ̃e[uɂЂƂ
   packet_type Ggƍv邩ǂׂBƂ΁AׂĂ
  lbg[NgtBbN𒲍āÃvgRЂƂȏ̃Gg
  Ƀ}b`ꍇA̍ۂɂ sk_buff ͕BāA
  sk_buff ́AvvgȐ[`ւƑB
  [see: ip_recv(), in net/ipv4/ip_input.c]

  11.5.3.  IP pPbg̑M

  pPbǵAf[^悤ƂAvP[VɂđM
  ɁAmꂽRlNVێRlNVm肷
  ɁAlbg[NvgRɂĐBAf[^̐
  @ǂ̂悤Ȃ̂łĂÃf[^ێ邽߂ ``sk_buff''
  쐬AvgRwʉ߂ۂɁAX̃wb_X̃vgR
  wɂĕtB

  ``sk_buff'' Mɂ́Albg[NfoCXɓnKv
  BAɂ͂܂AIP ̃vgRAǂ̃lbg[NfoC
  XgpׂfKvB̔f́ÃpPbgɂƂĉ
  œKȃ[gȂ̂ɂČ܂BƂ΁APPP vgRoRŁA
  fɂĒP̃lbg[NɐڑĂRs[^̏ꍇA[
  g̑I͗eՂłBpPbǵA[vobNfoCXoRŃ[Jz
  Xgɑ邩APPP ɂ郂f̃RlNV̔ΑɂQ[g
  EFCɑ邩̂ꂩłBC[TlbgŐڑꂽRs[
  ^̏ꍇÃlbg[Nɂ͑̃Rs[^ڑĂ̂ŁA
  I͂ȂB

  M邷ׂĂ IP pPbgɂẮAIP [eBOe[u
  gpđM IP AhXɑ΂郋[g̉B[eBOe
  [uł̌X IP M̖₢킹ꍇAgpׂ[
  g ``rtable'' f[^\̂ԂB
  [see: include/net/route.h]
  ɂ́AgpׂM IP AhXÃlbg[N ``device''
  f[^\̂̃AhXA܂ɂ͗\ߑgݍ܂ꂽn[hEFAwb_
  ܂܂B̃n[hEFAwb_̓lbg[NfoCXŗL̂̂ŁA
  ɂ͑MƑM̕AhXƁAȊÕfBAŗL̏񂪊
  ܂ĂBlbg[NfoCXC[TlbgfoCX̏ꍇAn[h
  EFAwb_``}\(10.1)''Ŏ悤Ȃ̂ƂȂAMƑM
  ̃AhX̓C[Tlbg̕AhXƂȂBn[hEFAwb_͂
  [gƂƂɃLbV邪ÁÃ[gőMׂ
  X IP pPbgɂ͂̃n[hEFÃwb_tȂ΂Ȃ
  A̍쐬ɂ͎Ԃ邩łBn[hEFAwb_ɕAh
  X܂܂ꍇÃAhX ARP vgRgpĉȂ
  ΂ȂȂB̏ꍇAočs(outgoing)pPbǵA̕AhX
  ܂őMȂBAhXăn[hEFAwb_
  gݍ܂ꂽAn[hEFAwb_̓LbVAYC^[tFC
  XgpđM邻ȍ~ IP pPbǵAARP gKvȂ
  B

  11.5.4.  f[^̍ו(fragmentation)

  ׂẴlbg[NfoCXɂ͍őpPbgTCY(maximum packet
  size)A傫ȃf[^pPbg͑MMłȂBIP v
  gR͂ɑΏĂAf[^Ȓf(fragment)ɕ邱
  ƂŁAlbg[NfoCXłpPbgTCYɍ킹悤
  ȂĂB IP vgRwb_ɂ̓tOg(fragment)tB[h
  Aɂ̓tO (flag)ƃtOgItZbg(fragment offset)
  ܂܂ĂB

  IP pPbg̑MłƂAIP ͂̃pPbgOɑMlb
  g[NfoCXTB̃foCX IP [eBOe[uŌ
  B
  [see: ip_build_xmit(), in net/ipv4/ip_output.c]
  X ``device'' f[^\̂ɂ́A̍ő]P (Pʂ̓oCg) 
  tB[hA͌ maximum transfer unit 𗪂 mtu
  tB[hƌĂ΂BfoCX mtu AM҂ IP pPbg̃p
  PbgTCYꍇAIP pPbg͂菬(mtu TCY)t
  OgւƕȂ΂ȂȂBX̃tOg
  ``sk_buff'' ɂĕ\B IP wb_́ÃpPbgtO
  gł邱ƁAĂɊ܂܂f[^ǂ̂悤ȃItZbgl
  ߂̃}[NtȂB̍Ō̃pPbǵAŌ IP
  tOgł|}[NBו(fragmentation)̉ߒŁAIP
   sk_buff 蓖ĂȂꍇ́ȂM͎sƂȂB

  IP tOg̎ḾȂMʓ|łBIP tOg
  ́A΂΂ɎM邩ꂸA炷ׂĂMĂg
  ݗĒKv邩łB
  [see: ip_rcv(), in net/ipv4/ip_input.c]
  IP pPbgM邽тɁAꂪ IP tOgۂ̃`FbN
  ȂBŏɃbZ[W̃tOgMꂽہAIP ́AVK
   ``ipq'' f[^\̂쐬A̍\̂ IP tOg
  ``ipqueue'' XgɃNāAč\̂҂B葽 IP
  tOgMƁAK؂ ipq f[^\̂ŁAVK
  ``ipfrag'' f[^\̂쐬āÃtOgLqBX
   ipq f[^\̂́AIP Mt[̃tOgӓIɋLq
  A̍ۂɂ́AMƑM IP AhXAʑwvgR̎
  qA IP t[̎ʎqgpBtOgׂĎM
  ƂA͑gݗĂĒP ``sk_buff'' ƂȂȀʑwv
  gRւƓnABX ipq ɂ̓^C}[܂܂Ă
  āA͗LȃtOgM邽тɍĎnB̃^C}
  [Ԑ؂ɂȂꍇAipq f[^\̂ ipfrag Ƃ͔jAY
  f[^͓]ɑrƂ̐肪ȂB̃bZ[W̍đ́A
  ʑw̃vgR̖łB

  11.6.  Address Resolution Protocol (ARP)

  ARP(Address Resolution Protocol)̖́AIP AhXC[TlbgA
  hX̂悤ȕIȃn[hEFÃAhXւƕϊ邱ƂłBIP
  ̕ϊKvƂ̂́AM̂߂(``sk_buff'' `)f[^f
  oCXhCoɓnOłB
  [see: ip_build_xmit(), in net/ipv4/ip_output.c]
  IP sX`FbN̒ɂ́ÃfoCXn[hEFAwb_
  KvƂ邩AKvƂꍇ̓pPbg̃n[hEFAwb_č\
  (rebuild)Kv邩Ƃڂ݂B Linux ́An[h
  EFAwb_LbV邱ƂŁApɂɍč\Ȃōςނ
  ɂĂBn[hEFAwb_̍č\KvȏꍇALinux ́AfoC
  XŗL̃n[hEFAwb_č\[`ĂяoB
  [see: eth_rebuild_header(), in net/ethernet/eth.c]
  ׂẴC[TlbgfoCX͓̔ėpwb_č\[`gp
  Ã[` ARP T[rX𗘗pđM IP AhX𕨗Ah
  XɕϊB

  ARP vgR͔̂̂ɃVvłAARP NGXg(v
  Arequest)  ARP vC(Areply)̂ӂ̃^CṽbZ[W
  琬ĂB ARP NGXgɂ́AϊɕKv IP AhX܂
  Aɂ(肭)  IP ̕ϊ̃AhXłn[hEF
  AAhX܂܂BARP NGXǵAlbg[Nɐڑꂽׂ
  ̃zXgɃu[hLXĝŁAC[Tlbglbg[Nɂ
  ẮÃC[TlbgɌq邷ׂẴ}V ARP NGXg
  ƂɂȂBvꂽ IP AhXL}V ARP NGX
  gɉA̕AhX܂߂ ARP vCԂB

  Linux  ARP vgRw ``arp_table'' f[^\̂̃e[u
  Sɍ\ĂāAX̍\̂ IP 畨AhXւ̕ϊLq
  ĂB̃GǵAIP AhX̕ϊKvɂȂƂɍ쐬
  A炪Ԃ̌o߂ŖɗȂȂƂɍ폜BX
  arp_table f[^\͎̂̂悤ȃtB[hB

     last used
         ARP GgŌɎgpꂽԁB

     last update
         ARP GgŌɍXVꂽԁB

     flags
        ͂̃Gg̏Ԃ\Bꂪς݂ł܂LȃAh
        XǂAłB

     IP address
        ̃Gg IP AhXB

     hardware address
        ϊꂽn[hEFAAhXB

     hardware header
        ́ALbVꂽn[hEFAwb_ɑ΂|C^ł
        B

     timer
         ``timer_list'' ̃GgłA͉̕ԂȂ ARP
        NGXg^CAEg邽߂ɎgpB

     retries
         ARP NGXggC񐔁B

     sk_buff queue
        IP AhX̉҂ ``sk_buff'' Gg̃XgB

  ARP e[úA|C^e[u(``arp_table'' ̔z)\A
  ̃|C^ arp_table Gg̘AXgwĂBGgւ
  ANZXxグ邽߂ɂ̓LbVBX̃GgT
  ꍇAGǵAIP AhX̖ 2 oCgoăe[u
  CfbNXtĂ̂ŁÃCfbNXgăGg̘A
  XgH΁AړĨGg邱ƂłB Linux ́A\
  쐬ꂽn[hEFAwb_LbVĂA arp_table G
  g̒ ``hh_cache'' f[^\̂̌`œĂB

  IP AhXϊvꂽAK ``arp_table'' Gg݂
  ȂƂAARP  ARP NGXgbZ[W𑗐MȂ΂ȂȂB
  ARP ́AVK arp_table Gge[uɍ쐬AAhXϊ
  vlbg[NpPbg܂ ``sk_buff''  VKGg
  sk_buff L[ɓo^B ARP  ARP NGXg𑗐MAARP Ԑ؂
  ^C}[𑖂点BȂꍇAARP ͉xNGXgđĂ
  邪AłȂꍇ́A arp_table ̃Gg폜B
  Gg̍폜́A IP AhX̕ϊ҂ĂL[ɂ邷
  Ă sk_buff ɒʒmBāAsʃvgRwɑM
   ARP vgRw̖łB UDP ̓pPbgrĂCɂȂ
  ATCP ͊mꂽ TCP Nōđ݂BAIP AhX̏
  L҂n[hEFAAhXtĉԂꍇA arp_table G
  g͊(complete)̃}[NtAL[ɂY
  sk_buff ̓L[폜āAM̉ߒɂ܂킳Bn[hEF
  AAhX́AX sk_buff ̃n[hEFAwb_̒ɏ܂B

  ARP vgRẃAg IP AhXw肵 ARP NGXgɑ΂
  鉞 (respond)Ȃ΂ȂȂBARP ́Aw ARP NGXg
  ̃vgR^Cv(ETH_P_ARP)o^A``packet_type'' f[^\̂
  B́Albg[NfoCXMׂĂ ARP pPbg
   ARP vgRwɓn邱ƂӖB̂Ƃ́AARP v
  C(reply)̏ꍇłȂAARP NGXg(request)𔭂Ƃl
  B ARP  ARP vC𐶐Ƃ́ANGXgMfoC
  X ``device'' \̂ɕۑꂽn[hEFAAhXgpB

  lbg[Ng|W[͎Ԃ̌o߂ɂĕω邱Ƃ̂ŁAIP
  AhXȑOƈقȂn[hEFAAhXɊ蓖Ă邱ƂB
  Ƃ΁A_CAbvT[rX̒ɂ́AX̃RlNVm
  _ IP AhX蓖Ă̂BARP e[uŐV̏
  悤ɂ邽߂ɁA ARP ͒IɎsāA``arp_table'' ̑S
  Gg𑖍ă^CAEgɂȂ̂ȂmFȂB
  ہALbVꂽn[hEFAwb_ЂƂȏ܂ރGg폜
  Ă܂Ȃ悤ӂB̃f[^\̃GgɈˑ
  Ă̂ŁA폜Ă܂Ƃ͊댯łB arp_table
  Gg͉iIŁA炪Ȃ悤A̎|}[NĂ
  BARP e[u͑傫Ȃ肷Ȃ悤ĂBX
  arp_table Gg̓J[l邩łBVKɃGg
  蓖ĂKvA ARP e[uőTCYɒBƂ͂
  AԌÂGgTĂ폜邱ƂŃe[uKxȑ
  ɕۂB

  11.7.  IP [eBO

  IP [eBO(oHÂ)@\́A IP AhX IP pPbg
  ǂɑMׂ肷BIP pPbg𑗐Mۂ͑̑I
  BMɂ͓B\낤H B\ȂAM̂߂ɂǂ̃lb
  g[NfoCXgpׂH MɓB闘p\ȃfoCX
  ꍇA悢foCX͂ǂꂩH IP [eBOf[^x[X
  ́A̋^ɓ邽߂̏ǗBӂ̃f[^x[X
  ݂邪AłdvȂ̂́AtH[fBO f[^x[X(Fowarding
  Information Database)łB͊m IP MƂւ̍ŗǂ̌o
  HRȂ߂XgłB菬K͂ȃf[^x[X
  ă[gLbV(route cache)A IP MɊւ邷
  ₢oH₢킹̂߂ɎgpBׂẴLbVƓlɁA
  ɂ͕pɂɃANZXoH܂܂Ă炸A̓éAtH[
  fBOf[^x[X荞܂ꂽ̂łB

  oH(route)́ABSD \PbgC^[tFCXւ IOCTL NGXgoR
  Ēǉƍ폜ȂB̓vgRɓnāA
  BINET vgRw̏ꍇAIP ̌oH̒ǉƍ폜ł̂́AX[p
  [[UvZXłBoH͌Œ肷邱Ƃ\ł
  A邢́AԂ̌o߂ɂēIɕύX邱Ƃ\łB[
  ^(router)(: [^Ƃ́Albg[N瑼̃lbg[NɁA
  VXeMpPbg𑗂o)łȂA啔̃VXe
  ł͌Œ肳ꂽ[ggpĂB[^̓[eBOvgR
  sāAꂪm̑M̑S IP ɑ΂ă[eBOł悤펞
  `FbNĂB[^łȂVXéAGhVXe(end system)
  Ă΂B[eBOvgŔAƂ GATED ̂悤Ƀf[
  ĎĂ邪A IOCTL BSD \PbgC^[tFCXoR
  ŌoHǉ폜肵ĂB

  11.7.1.  [gLbV

  IP oH̖₢킹Ƃ͂AvoHȂA܂[
  gLbV`FbNB[gLbVɍvoHȂ
  AoHɂătH[fBOf[^x[XBɂ
  oHȂꍇAIP pPbg̑M͎sAAvP[V
  ̎|ʒmȂBtH[fBOf[^x[XɊYoH
  A[gLbVɂ͂ȂꍇAVK̃GgA[g
  LbVɂ̌oHtB

  [gLbV́A``rtable'' f[^\̘̂AXg(chain)ւ̃|C
  ^܂񂾃e[u(``ip_rt_hash_table'') łB[ge[uɑ
  CfbNX́AIP AhX̍ŉʂ 2 oCgƂănb
  V֐ɂ萶B 2 oCǵAĂ̏ꍇM
  ɂĈقȂĂ̂ŁAnbVlU炷ɂ͍ŗǂłBX
  rtable Ggɂ́AoHɊւ񂪊܂܂ĂāAɂ́AM
  IP AhXA IP AhXɓB邽߂Ɏgplbg[Nfo
  CXAgp\ȃbZ[W̍őTCYȂǂB܂́At@
  XJEg(reference count)A[T[WJEg(usage
  count)A(jiffies gĕ\ꂽ)ŏIԂ̃^CX^v(timestamp
  of last time)ƂĂBt@XJEǵǍo
  Hgp邽тɃCNgǍoHgplbg[N
  RlNV̐BāǍoHgpAvP[VI
  邱ƂɂfNgB[T[WJEg͂̌oH₢
  킹󂯂邲ƂɉZAnbVGg̘AXg rtable
  邽߂ɎgpB[gLbVׂ̂ẴGǵA
  uŌɎgpꂽԂ^CX^vvĂāA
  rtable ÂȂ肷ĂȂ̒Iȃ`FbNɎgpB
  [see ip_rt_check_expire(), in net/ipv4/route.c]
  ̌oHŋߎgpĂȂꍇA̓[gLbVj
  BoH[gLbVɕۑĂꍇÁAłppx
  ̂nbVAXg̐擪ɗ悤בւB
  āAoH₢킹ۂɁA̔ɂȂB

  11.7.2.  tH[fBOf[^x[X(Forwarding Information
  Database)

  fib_zones                                  fib_node
  +-------+                                +----------+
  |       |                             +->| fib_next |
  |-------|                             |  |----------|
  |       |                             |  | fib_dst  |
  |-------|                             |  |----------|
  |       |                             |  | fib_use  |    fib_info
  |       |     fib_zone                |  |----------|  +-----------+
  |-------|  +-------------+            |  | fib_info |->| fib_next  |
  |       |->| fz_next     |            |  |----------|  |-----------|
  |-------|  |-------------|  +-------+ |  |fib_metric|  | fib_prev  |
  |       |  |fz_hash_table|->|       | |  |----------|  |-----------|
  |       |  |-------------|  |-------| |  | fib_tos  |  |fib_gateway|
  |       |  | fz_list     |  |       | |  +----------+  |-----------|
  |       |  |-------------|  |-------| |                | fib_dev   |
  |       |  | fz_nent     |  |       | |                |-----------|
  |       |  |-------------|  |       | |                | fib_refcnt|
  |       |  | fz_logmask  |  |-------| |                |-----------|
  |       |  |-------------|  |       |-+                | fib_window|
  |-------|  | fz_mask     |  |-------|                  |-----------|
  |       |  +-------------+  |       |                  | fib_flags |
  |-------|                   |       |      fib_node    |-----------|
  |       |                   |-------|    +----------+  | fib_mtu   |
  +-------+                   |       |--->| fib_next |  |-----------|
                              |-------|    |----------|  | fib_irtt  |
                              |       |    | fib_dst  |  +-----------+
                              |       |    |----------|
                              |       |    | fib_use  |    fib_info
                              |-------|    |----------|  +-----------+
                              |       |    | fib_info |->| fib_next  |
                              |-------|    |----------|  |-----------|
                              |       |    |fib_metric|  | fib_prev  |
                              +-------+    |----------|  |-----------|
                                           | fib_tos  |  |fib_gateway|
                                           +----------+  |-----------|
                                                         | fib_dev   |
                                                         |-----------|
                                                         | fib_refcnt|
                                                         |-----------|
                                                         | fib_window|
                                                         |-----------|
                                                         | fib_flags |
                                                         |-----------|
                                                         | fib_mtu   |
                                                         |-----------|
                                                         | fib_irtt  |
                                                         +-----------+

  }\(10.5) tH[fBOf[^x[X

  tH[fBOf[^x[X(}\(10.5)Q)ɂ́AIP AhX
  A̎_ɂăVXeŗp\ȌoḦꗗ܂܂B
  ͔ɕGȃf[^\ĂāAÓȌ𓾂悤AW
  Ă͂邪AŖ₢킹\ȃf[^x[Xł͂ȂBɁAM
  ׂׂĂ IP pPbgɂđM̃f[^x[Xɖ₢
  킹ƂA͔ɒx̂ɂȂ邾낤B[gLbV
  ݂̂́Â߂łB̓K؂ȌoHg IP pPbg
  ɑM킯łB[gLbV͂̃tH[fBOf[^
  x[XĥŁA悭pGg\̂łB

  X IP Tulbg ``fib_zone'' f[^\̂ɂĕ\B
  ׂ̂Ă fib_zones nbVe[u|C^QƂĂB
  nbṼCfbNX́A IP Tulbg̃}XN琶Ă
  BTulbgɑ΂邷ׂĂ̌oH(route)́A``fib_node'' 
  ``fib_info'' f[^\̂̃yAɂċLqĂāÁAX
   fib_zone f[^\̓ ``fz_list'' L[ɓo^ĂB
  TulbǧoH̐ꍇAnbVe[u
  āAfib_node f[^\̂̔eՂɂB

   IP Tulbgɑ΂Ă̌oHꍇǍo
  H͕̃Q[gEFĈЂƂʉ߂łBIP [eBOẃA
  Tulbgւ̌̕oHQ[gEFCgp邱Ƃ͋ȂB
  ƁATulbgւ̌oHꍇAX̌oH͕Kق
  Q[gEFCgp邱Ƃۏ؂BX̌oHɊ֘At
  gbN(metric)łB́ǍoHǂꂾŒZɋ߂
  wWłBoH̃gbŃA{Iɂ́ÃTulbgɓB
  ܂łɌoRȂ΂ȂȂ IP Tulbg̐łBgbN
  ȂɂāǍoH͍ŒZoH牓ȂB

  (-- (r1) National Science Foundation

  (r2) Serial Read Only Memory

  (r3) ŁÂ߂ɁH

  12.  J[lJjY

  ̏͂ł́ALinux J[l񋟂Ȃ΂ȂȂėpIȃ^XNƃJ
  jŶɂĉB́AJ[l̑̕(Ȃ
  ̏͂ŏqׂ邢̃^XN⃁JjYȊO̕)悭
  삷邽߂ɕKvȂ̂łB

  12.1.  {gn[tnh

            bh_active
  31                            0          bh_base
  +-----------------------------+     +---------------+
  |                             |   0 |               |-->{gn[t
  |                             |     |---------------|   nh
  +-----------------------------+     |               |   (timers)
                                      |---------------|
             bh_mask                  |               |
  31                            0     |               |
  +-----------------------------+     |               |
  |                             |     |               |
  |                             |     |               |
  +-----------------------------+     |               |
                                      |               |
                                      |               |
                                      |---------------|
                                      |               |
                                      |---------------|
                                   31 |               |
                                      +---------------+

  }\(11.1) {gn[tnh̃f[^\

  J[lɃ^XNꍇA̎_ł͏ȂAƂ
  ΂΂B荞݂ꍇ́AɂłB荞
  ݂NƁAvZbT͎s̏~AIy[eBOVXe
  ̊荞݂K؂ȃfoCXhCoɓ`BBAfoCXh
  CoɊ荞݂ꍇA荞ݏɂ́AVXeő
  słȂBāAfoCXhCóA荞݂̏ɂ
  ܂莞Ԃ|Ă͂ȂBȀŒɏƂA̖
  ȂP[X΂Α݂BLinux ̃{gn[tnh
  ̂́AfoCXhCo₻̑̃J[l[`dU
  L[ɒuāAƂŏł悤ɂ邽߂łB}\(11.1)
  ́A{gn[tnhɊւJ[l̃f[^\̂ĂB
  [see: include/linux/interrupt.h]

  32 ܂ł̈قȂ{gn[tnh݂B bh_base ́AJ[l
  ̌X̃{gn[t[`ւ̃|C^̃e[uł
  Bbh_active  bh_mask ͓Ǝ̃rbgZbgĂāA̒l͂
  ̂悤ȃnhCXg[ăANeBuɂȂĂ̂ɂB
  bh_mask Ƀrbg N ZbgꂽꍇAbh_base  N Ԗڂ̗vf̃{
  gn[tnh̃AhX܂łBbh_active Ƀrbg N Zb
  gꂽꍇAXPW[Iƍl N Ԗڂ̃{gn[t
  nh[`ĂяoB̃CfbNX͐ÓIɒ`
  B^C}[(timer){gn[tnh͍ŗDł(index 0)AR
  \[(console){gn[tnh͂ɎDx(index 1)
  łBT^Iɂ́A{gn[tnh͂Ɗ֘A^XÑX
  gĂBƂ΁AC~fBG[g(immediate){gn[tnh
  ̓C~fBG[g^XNL[(tq_immediate) ʂďsA
  ̃L[ɂ͑(immediately)Kv̂^XN܂܂B

  J[l̃{gn[tnĥ́AfoCXŗL̂̂ł
  AȊO͔ėpIłB

     TIMER
        ̃nh́AVXe̒莞Iȃ^C}[荞ނƂɁA
        ANeBuƃ}[NAJ[l̃^C}[L[JjY
        邽߂ɎgpB

     CONSOLE
        ̃nh́AR\[bZ[W邽߂ɎgpB

     TQUEUE
        ̃nh́Atty bZ[W邽߂ɎgpB

     NET
        ̃nh́AʓIȃlbg[NȂB

     IMMEDIATE
        ͔ėpnhłA̃foCXhCoōs
        ƂdL[ɓ邽߂ɎgpB

  foCXhCoJ[l̑̕d񂵂ɂKvƂ
  ͂A̎dAƂ΃^C}[L[̂悤ȁAK؂ȃL[ɒu
  AJ[lɃVOi𑗂āA{gn[t̎sKvł邱
  `Bɂ́Abh_active ̓K؂ȃrbgݒ肷΂悢B
  Ƃ΁Arbg 8 ݒ肳̂́AhCoC~fBG[gL
  [ɒuāA{gn[tnhsď̂]ޏꍇ
  B bh_active ̃rbg}XN`FbN̂́AX̃VXeR
  [̏IłA䂪ĂяovZXɖ߂钼OłB炩
  rbgZbgĂꍇAANeBuȃ{gn[tnhĂяo
  Brbg 0 ܂ŏɃ`FbNāA 1 ւƏiŁA
  31 ܂Ń`FbNB
  [see: do_bottom_half(), in kernel/softirq.c]
  bh_active ̃rbǵAX̃{gn[tnhĂяo邽тɃN
  ABȂ킿Abh_active ͈ꎞIȂ̂ŁAXPW[Ăяo
  ꂽ̎_ł͈ӖǍĂяoȂۂɂ͈Ӗ
  ȂBāA̕@g΁AׂdȂꍇA{gn
  [t[`͌ĂяoȂB

  12.2.  ^XNL[(task queue)

                  tq_struct               tq_struct
  task_quequ   +-------------+         +-------------+
  ------------>| next        |-------->| next        |-------->
               |-------------|         |-------------|
               | sync        |         | sync        |
               |-------------|         |-------------|
               | *routine()  |         | *routine()  |
               |-------------|         |-------------|
               | *data       |         | *data       |
               +-------------+         +-------------+

  }\(11.2) ^XNL[

  ^XNL[́AJ[ld񂵂ɂ@łB
  [see: include/linux/tqueue.h]
  Linux ɂ́AdL[ɒuāAŏėpIȃJjY
  B^XNL[͂΂΃{gn[tnhƈꏏɎgpB^
  C}[^XNL[(timer task queue)́A^C}[L[{gn[tn
  h(timer queue bottom half handler)sƂɏB^
  XNL[̓Vvȃf[^\̂łA}\(11.2)Ɏ悤
  ɁA``tq_struct'' f[^\̂̒PȘAXgłB̌X̍\
  ̂ɂ́A[`̃AhXƃf[^ւ̃|C^܂܂ĂB^XN
  L[̗vfƂA[`ĂяoA̍ہA[`
  ւ̓f[^ւ̃|C^nB

  J[l̉炩̃[`AƂ΃foCXhCóA^XNL[
  쐬p邱Ƃł邪A 3 ̃^XNL[́AJ[l
  č쐬ǗĂB

     timer
        ̃L[́ÃVXeNbNeBbN(clock tick)̏o邾
        ɎsׂdL[CO邽߂ɎgpBN
        bNeBbNƂɂ̃L[`FbNAGg܂܂
        邩ǂmFBGg܂܂ĂꍇA^C}[L
        [{gn[tnhANeBuɂBXPW[Ɏ
        s鎞ɂ́A^C}[L[{gn[tnhȂ
        Ẵ{gn[tnhƔɏB̃L[ƃVXe^
        C}[Ă͂ȂB҂́AƐꂽJjY
        ĂB

     immediate
        ̃L[AXPW[ANeBuȃ{gn[tnh
        ƂɏBC~fBG[g(immediate){gn[tn
        h́A^C}[L[{gn[tnhقǗD揇ʂ͍
        ̂ŁÃ^XN͌ォsB

     scheduler
        ̃^XNL[́AXPW[gɂďB́A
        VXȇ̃^XNL[T|[g邽߂Ɏgp̂ŁA
        ̏ꍇAsׂ^XŃA^XNL[郋[`
        AƂ΁AfoCXhCołB

  ^XNL[ƂAL[̍ŏ̗vfɑ΂|C^L
  [폜āAk|C^(null pointer)ƒuBہA
  ̍폜́ArIȑ(atomic operation)Ȃ̂ŁA荞݂łȂ
  ɂȂĂBɁAL[̌X̗vf̏[`Ԃ
  ĂяoBL[̗vf͂΂ΐÓIɊ蓖Ăꂽf[^łB
  A蓖ĂꂽjŗL̃JjY݂͑ȂB^X
  NL[[`͒PɃXg̗̎vf̏Ɉڂ邾łB
  蓖ĂꂽJ[lmɓKXėp\ɂ邽߂ɂ́A^XN
  ̂̏Ȃ΂ȂȂB

  12.3.  ^C}[(timer)

       timer_table           timer_struct
     +-------------+         +-----------+
   0 |             |-------->| expires   |
     |-------------|         |-----------|
     |             |         | *fn()     |
     |-------------|         +-----------+
     |             |
     |             |         timer_struct
     |-------------|         +-----------+
     |             |-------->| expires   |
     |-------------|         |-----------|
     |             |         | *fn()     |
     |             |         +-----------+
     |-------------|
     |             |     31       timer_active             0
     |-------------|     +----------------------------------+
  31 |             |     |                                  |
     +-------------+     +----------------------------------+

       timer_head              timer_head              timer_head
     +--------------+        +--------------+        +--------------+
     | next         |------->| next         |------->| next         |
     |--------------|        |--------------|        |--------------|
     | prev         |<-------| prev         |<-------| prev         |
     |--------------|        |--------------|        |--------------|
     | expires      |        | expires      |        | expires      |
     |--------------|        |--------------|        |--------------|
     | data         |        | data         |        | data         |
     |--------------|        |--------------|        |--------------|
     | *function()  |        | *function()  |        | *function()  |
     +--------------+        +--------------+        +--------------+

  }\(11.3) VXe^C}[

  Iy[eBOVXeɂ́A̓̎ԂɃ^XNł悤
  ȃXPW[O@\KvłBāAXPW[OɂA^
  XNrImȎԂɎsł悤ȃJjYKvƂB
  _AIy[eBOVXeT|[g悤ƂvZbTɂ́AK
  vO\ȃC^[o^C}[AꂪIɃvZbT
  荞݂|ĂB̒IȊ荞݂́AVXeNbNeBbN
  ƌĂ΂B́Agm[ɎāAVXe̊w
  ĂB Linux ͎Ǘɑ΂ĔɃVvȌĂB
  Linux ́AԂÑNbNeBbN(clock tick)ɂČvB
  ׂẴVXe^C}[͂̌vɂĂǍv@́AL
  pĂϐɂȂ jiffies ƌĂ΂ĂB

  Linux ɂ͓ނ̃VXe^C}[Bǂ̃L[[`A
  VXeԂɌĂяôA͎ɂĂقȂĂ
  B ``}\(11.3)'' ł́ÃJjYĂB
  [see: include/linux/timer.h]
  ЂƂ߂́AÂ^C}[JjYłA``timer_struct'' f[^\
  ̂ւ 32 ̃|C^ɂÓIzƃANeBu^C}[̃}XN
  ``timer_active'' \ĂB^C}[^C}[e[û
  ɒu邩́AÓIɒ`ĂB (́A{gn[tnh
  ̃e[u bh_base ɂ⎗ĂB) Gg̃e[uɕt
  ̂́ȀꍇVXeNłBӂ߂́AV
  JjYłA``timer_list'' f[^\̘̂AXggpB
  Xg̗vf́A^C}[I܂ł̎c莞(expire time)̒̏Ԃ
  ׂĂB

  ǂ̕@̏ꍇłA^C}[̎c莞Ԃvۂ̎wWƂ jiffies
  gpB䂦A5 bԂs^C}[́A܂ 5 bƂ
  Ԃ jiffies ̒PʂɕϊāÃ݂VXeԂɉZ邱
  ƂŁA^C}[Iׂ jiffies `̃VXeԂƂĊl
  BVXeNbNeBbƂɁA^C}[{gn[tnh̓AN
  eBuƃ}[NAɂāAXPW[ɋNƂɁA
  ^C}[L[B^C}[{gn[tnh́Ã^C
  ṽVXe^C}[BÂق̃VXe^C}[̏
  Atimer_active rbg}XN`FbNAݒrbgmFB
  [see: timer_bh(), in kernel/sched.c]
  [see: run_old_timers(), in kernel/sched.c]
  [see: run_timer_list(), in kernel/sched.c]
  ANeBu^C}[̏IԂo߂ꍇ (IԂ̒lVXe
  jiffies ̌ݒlꍇ)Ã^C}[[`ĂяoA
  ANeBurbg̓NABVVXe^C}[̏
  Atimer_list \̘̂AXg̃Gg`FbNBׂĂ
  Iԃ^C}[Xg폜Ã[`ĂяoBV
  ^C}[̃JjYɂ́A^C}[[`ɈnƂ_
  B

  12.4.  ҂s(wait queue)

  vZX́A炩̃VXe\[X҂Ȃ΂ȂȂԂɂȂ邱
  Ƃ悭BƂ΁AvZXt@CVXêfBN
  gLq VFS inode KvƂĂ̂A inode obt@
  LbVɂȂȂǂłB̏ꍇÃvZX́ÃtBAV
  Xeێ镨fBA瓖Y inode Ă܂ő҂
  ApȂ΂ȂȂB
  [see: include/linux/wait.h]

                          wait_queue
                            *task
                            *next

                      }\(11.4) ҂s

  Linux J[l̓Vvȃf[^\̂ł ``wait_queue'' (}
  \(11.4)Q)(: ̐}\͌ɂĂ GIF t@Cł͂
  B)gpĂ邪ÁA``task_struct'' ̃vZXւ̃|C
  ^ƁA҂s̗̎vfւ̃|C^\ĂB

  vZX҂s̏I[ɕtƂÃvZX́A荞
  \荞ݕs\̂̏ꍇ蓾B荞݉\ȃvZX
  ́AƂ΃^C}[̏IƂCxgA҂ső҂Ă
  ɎMVOiɂĊ荞܂邩ȂB҂s̃vZ
  X̏(state)͂𔽉fĂāȀԂ INTERRUPTIBLE(荞
  \)  UNINTERRUPTIBLE(荞ݕs) ̂ꂩłB҂s
  uꂽvZX _ł͓삳ÂꂸAXPW[
  ̃vZXI񂾂ƂɁȂ҂vZX̓TXyhԂƂ
  B(``r 1'')

  ҂s񂪏ƂA҂ŝׂẴvZX̏
  (state)́A RUNNING(s)ɃZbgBvZXsL[
  폜Ăꍇ́AēxsL[ɒuBXPW[Ɏ
  sƂA҂sɂvZX́A͑҂Ԃł͂Ȃ
  ŁAsׂ҂ƂȂĂB҂s̃vZXXPW[
  ɂĎsƂAꂪŏɍsƂ́A҂sォ
  폜邱ƂłB҂s̓VXe\[Xւ̃ANZX𓯊
  ߂ɂgpł̂ŁALinux ͂gāAZ}tHĂ
  B

  12.5.  oYbN (Buzz Locks)

  ́AXsbN(spin locks)ƌĂ΂邱Ƃ̂قdg݂ł
  Af[^\R[hی삷v~eBuȕ@łB́Ax
  ɂЂƂ̃vZXdvȃR[ḧɓȂ悤ɂ̂łB
  Linux ɂẮAf[^\̂̃tB[hւ̃ANZX𐧌邽߂
  p̂A̍ہA̒PxtB[hgpbN
  dg݂񋟂ĂB̗̈ɓ낤ƂX̃vZX́AbN
  l 0  1 ւƕύX悤ƂBݒl 1 ̏ꍇA^Cg[
  v(tight loop)̃R[hŃXsjO (spining)ȂAēx
  B̃bN@\ێ郁̈ւ̃ANZX͔rI(atomic)Ȃ
  ̂łȂ΂Ȃ炸A̒l̓ǂݏoAꂪ 0 ł邱Ƃ̌؁A
  Ă̒l 1 ւ̕ύXƂ́ÃvZX犄荞܂邱
  ȂB啔 CPU A[LeN`ł́AʂȖ߂ɂĂ̎dg
  T|[gĂ邪ALbVĂȂC𗘗păoY
  bN(buzz lock)邱ƂłB

  L̃vZXR[h̏dv̈悩痣ƂAoYbN̒lfN
  gāA̒l 0 ɖ߂BbNŃXsjOĂvZX
  ́A̎ɓǂݏosƁA0 ǂݏoBŏɓǂݏov
  ZXA̒lCNg 1 ɂAdv̈ւƓB

  12.6.  Z}tH(semaphore)

  Z}tH́AR[hf[^\̏dvȗ̈ی삷邽߂ɗpB
  Ƃ΁AfBNgLq VFS inode ̂悤ȏdvȃf[^ւ̌
  X̃ANZX́ÃvZXɑăJ[lR[hɂĎs
  BvZXgpĂdvȃf[^\̂ɑ΂ÃvZX
  ɂύXƂ͔Ɋ댯łBЂƂ̕@́A
  ANZXdvȃf[^̎͂ŃoYbNgp邱ƂA
  PȃAv[`Ȃ̂ŁAǍDȃVXeptH[}X͊҂łȂB
  ɑւāALinux ̓Z}tHgpāAR[hf[^̏dv̈ւ̃A
  NZXxɂЂƂ̃vZXɂȂ悤ɂĂB\[X
  ANZX悤Ƃ邻ȊÕvZX́Ä悪t[ɂȂ܂ő҂
  B҂vZX̓TXyhAVXȇ̃vZX͒ʏʂ
  s𑱂邱Ƃ\łB

  Linux  ``semaphore'' f[^\̂ɂ́Â悤ȏ񂪊܂܂Ă
  B
  [see: include/asm/semaphore.h] (i386, alpha)

     count
        ̃tB[h́Ã\[X𗘗p悤ƂvZX̐
        ̂łB̒ĺA\[Xp\ł邱ƂӖ
        B܂ 0 ̒ĺA҂Ԃ̃vZX邱ƂӖB
        l 1 ́Ã\[X𗘗pł͈̂xɂЂƂ̃v
        ZXł邱ƂӖBvZX̃\[X𗘗p
        ƂAvZX͂̒l(count)fNgÃ\[X
        pIƂAvZX͂̒lCNgB

     waking
        ̃tB[h́Ã\[X҂ĂvZX̂A
        \[XꂽƂɋN邱ƂɂȂĂvZX̐
        ̂łB

     wait queue
        vZX̃\[X҂ĂƂÃvZX͂̑
        sɒuB

     lock
        waking tB[hɃANZXĂƂ́AoYbNp
        B

  Z}tH̏l 1 łƂƁAŏɂėvZX́A
  JEgł邱ƂmFA 1  0 ɂBŃv
  ZX́AR[h\[X̏dvuLvƂɂȂAꂪZ
  }tHɂĕی삳BvZX̏dvȗ̈𗣂ƂAZ}
  tH̃JEgCNgBőP̃P[X́Ȁdv̈
  悤Ƃ鑼̃vZX݂ȂꍇłBLinux ́A̍ł
  IȃP[XŌ悭悤ɃZ}tHĂB

  vZX̐Lɑ̃vZXdv̈ɓ낤ƂꍇÃv
  ZX count fNgB count ͌ (-1)ƂȂ
  ŁÃvZX͏dv̈ɓꂸÂL̃vZXޏo
  ܂ő҂Ȃ΂ȂȂBLinux ͑҂vZXX[vALv
  ZX̏dv̈悩ޏoۂɂ̃vZXڊo߂B҂v
  ZX͎gZ}tH̑҂sɓo^āAwaking tB[h̒l
  `FbNȂ烋[vԂɓAwaking  0 łȂȂɃXP
  W[ĂяoB

  dv̈̐L҂Z}tH count CNgāA̒l
  0 ȉȂ΁Ã\[X҂ȂX[vĂvZX݂
  Bŗǂ̃P[Xł́AZ}tH count ͏lł 1 ɖ߂Ă
  ̂ŁAȏ̎d͕KvȂBLvZX waking tB[h̒l
  CNgāAZ}tH̑҂sŃX[vԂɂvZX
  ڊo߂B҂vZXNƁAwaking tB[h̒l 1 Ȃ
  ŁAdv̈ɓĂ悢Ƃ킩BvZX waking tB[h
  lfNgA̒l 0 ɖ߂As𑱂BZ}tH waking
  tB[hւ̃ANZXׂ͂āAZ}tH̃bNgpoYbN
  ی삳ĂB

  (-- (r 1)REVIEW NOTE: ^XN荞݉\ȏԂŒ~āA
  XPW[sۂɁÃ^XNsƂ͂ǂ
  H ҂sŃX[vԂɂvZX́Aڊo߂܂ŁA
  sȂ͂łB--)

  13.  W[

  ̏͂ł́ALinux J[lAt@CVXeȂǂ̋@\AKvȎ
  IɃ[hdg݂ɂĐB

  Linux ́AmVbNȃJ[l(monolithic kernel)gpĂB
  Ȃ킿́APŋȃvOłAł́AJ[l̂
  @\ʃR|[lgAׂĂ̓f[^\⃋[`ɃANZX
  BƂ͔΂̎dg݂ƂāA}CNJ[l(micro-kernel)\
  B̏ꍇAJ[l̋@\ʕ́Aʂ̃jbgɕA
  jbgԂł̌iȒʐMJjYݒ肳BmVbNJ[l
  ́AVKR|[lgJ[lɒǉɂ́A̐ݒvZXoR
  ̂ŁA⎞ԂBƂ΁ANCR 810 SCSI  SCSI hCo
  ĝA܂J[lɑgݍłȂƂB̍ۂ́A
  VJ[lݒ肵Arh邱ƂŁA͂߂ NCR 810 gpł
  悤ɂȂBAႤI݂BLinux ł́AKvɉāA
  Iy[eBOVXẽR|[lg𓮓IɃ[hAA[
  hłB Linux J[lW[(module)Ƃ́AVXeN
  Ȃ炢łIɃJ[lɃN邱ƂłR[hQłB
  ́AKvȂȂ΃J[lƂ̃Nč폜邱Ƃł
  B啔 Linux J[lW[́AfoCXhCoAlbg
  [NhCoȂǂ̉zhCoA邢̓t@CVXeȂǂłB

  Linux J[lW[́Ainsmod  rmmod R}hgpāAI
  Ƀ[hƃA[h\łB܂AJ[lgAJ[lf[
  (kerneld)ɂāAW[̃[hƃA[hKvɉčs
  ƂłBKvȂƂɓIɃ[hłR[hƂ̂́AJ[l
  ̃TCYŏɗ}Aɏ_^ƂӖŔɖ͓Iȋ@
  \łB킽݂̌ Intel J[l̓W[L͂ɎgĂ
  ̂ŁA 406 K oCgōςłBVFAT t@CVXe͂܂ɂg
  Ȃ߁A VFAT p[eBV}EgꂽɎI VFAT t@C
  VXe[h悤ɁA킽̃J[l̓rhĂ
  BVFAT p[eBVA}EgƂAVXe͂킽
   VFAT t@CVXeW[KvƂĂȂƂoāAV
  Xe炻폜BVJ[lR[hƂłAŝ
  тɃJ[lrhčċNKvȂ̂ŁA̓_ł
  W[͕֗łBǍԂƂāAJ[lW[g
  Ǝ኱̃ptH[}X̒ቺƃ̏NB[_uW
  [ɂ邽߂ɒ񋟂Ȃ΂ȂȂR[hʂÃR[hƕt
  Iȃf[^\Ƃ邽߂ɁȀʂ⑝B܂A
  郌xŊԐڏ̂ŁAW[̏ꍇAJ[l\[
  Xւ̃ANZXɂȂB

  Linux W[́A񃍁[hƁAʏ̃J[lR[hƓl
  ɃJ[l̈ꕔƂȂBȂ킿ÃJ[lR[hƓ̌ƐӔC
  BƁALinux J[lW[́AׂẴJ[lR[
  hfoCXhCoƓlɁAJ[lNbV邱ƂłB

  W[KvȃJ[l\[Xgp邽߂ɂ́A܂̃\
  [XKvBƂ΁AW[ kmalloc() J[l
  蓖ă[`ĂяoKvꍇȂǂlĂقBr
  hꂽ_ł́AW[́Âǂ kmalloc() 
  mȂBāAW[[hꂽƂAJ[ĺA
  W[oOɁAW[ kmalloc() ւ̎QƂׂĉ
  Ȃ΂ȂȂBJ[ĺAJ[l̃V{e[uɃJ[l
  \[Xׂ̂ẴXgێĂ̂ŁAW[̃[hɁA
  W[̂\[Xւ̎QƂ邱ƂłB Linux
  ł́AW[X^bNłBȂ킿A郂W[́Ã
  W[̃T[rXOƂÃT[rX𗘗płBƂ΁AVFAT
  t@CVXeW[́AFAT t@CVXẽW[̃T[r
  XKvƂBVFAT t@CVXéAꏭȂ FAT t@CV
  Xe̊gł邩łB̃W[̃T[rX⃊\[XKv
  Ƃ郂W[Ƃ̂́AW[J[l̂̂̃T[rX⃊
  \[XKvƂ󋵂ƔɗގĂBKvƂT[rXA
  [hꂽ̃W[̒ɂ邩łBX̃W[
  [hƁAJ[ĺAJ[lV{e[uύXāAV
  [hꂽW[GNX|[g\[XV{ׂ̂Ă
  ɕtBꂪӖ̂́ÃW[[hꂽƂA
  ̃W[͊Ƀ[hĂ郂W[̃T[rXɃANZXo
  ƂƂłB

  W[A[h悤ƂƂAJ[l͂̃W[gp
  ĂȂƂmKvAW[ɂꂩA[h
  Ƃm点@KvƂBāA̕@ɂāAW[
  ́AJ[l폜OɁAJ[l⊄荞݂Ȃǂ̊蓖
  ꂽVXe\[X邱ƂoBW[A[h
  ƂAJ[ĺÃW[J[lV{e[uɃGNX
  |[gׂẴV{폜B
  K؂ɏȂ߂ɁA[hꂽW[̓Iy[eBOV
  XeNbV邱ƂoƂƂ̑ɂAW[̎g
  p͕ʂ̊댯炷BݎgpĂJ[lAÂVo
  [W̃J[lpɃrhꂽW[[hꍇAN
  邾낤HꂪN̂́AƂ΃W[J[l[`
  R[āAnꍇłBJ[ĺAIvV
  Ăł͂邪AW[̃[hɂ̃W[iɃo[W
  `FbN邱ƂŁA̖肪NȂ悤ɂĂB

  13.1.  W[̃[fBO

  +----module_list
  |
  |     module                          module
  |  +----------+                    +----------+
  +->| next     |------------------->| next     |
     |----------|                    |----------|
     | ref      |                 +->| ref      |
     |----------|                 |  |----------|
     | symtab   |------+          |  | symtab   |-------+
     |----------|      |          |  |----------|       |
     | name     |"fat" |          |  | name     |"vfat" |
     |----------|      |          |  |----------|       |
     | size     |      |          |  | size     |       |
     |----------|      |          |  |----------|       |
     | addr     | +----+          |  | addr     | +-----+
     |----------| |               |  |----------| |
     | state    | |  symbol_table |  | state    | |  symbol_table
     |----------| |  +----------+ |  |----------| |  +----------+
     |*cleanup()| +->| size     | |  |*cleanup()| +->| size     |
     +----------+    |----------| |  +----------+    |----------|
                     | n_symbols| |                  | n_symbols|
                     |----------| |                  |----------|
                     | n_refs   | |                  | n_refs   |
                     |----------| |                  |----------|
                     |          | |                  |          |
                     | symbols  | |                  | symbols  |
                     |          | |                  |          |
                     |----------| |                  |----------|
                     |references|-+                  |references|
                     |          |                    |          |
                     +----------+                    +----------+

  }\(12.1)J[lW[̃Xg

  J[lW[[h@͂ӂBЂƂ́Ainsmod R}
  hɂĎ蓮ŃJ[lɑgݍޕ@BЂƂ́AƌȂ
  ́AKvɉăW[gݍޕ@łB́Af}h
  [fBO(demand loading)ƌĂ΂B[UJ[lɑ݂Ȃ
  t@CVXe[h鎞ȂǁAW[̕KvJ[lm
  ƂAJ[ĺAJ[lf[(kerneld)ɓK؂ȃW[
  [h悤NGXgB

  J[lf[́Aʂ̃[UvZXȂ̂AX[p[[Ǔ
  ĂBʏ̓VXeNɎsJn邪Aꂪs
  ƁAJ[lf[̓J[lɑ΂vZXԒʐM(IPC)̃`l
  JB̃N̓J[lɂĎgpAkerneld ɑ΂ėlX
  ^XN̎s˗邽߂̃bZ[WMB
  [see: include/linux/kerneld.h]
  kerneld ̎vȋ@\́AJ[lW[̃[hƃA[hA
  ̃^XN̏\łBƂ΁AKvȂƂɃVA PPP
  NJnAKvȂȂ炻ؒfƂƂł
  Bkerneld g^XNŝł͂ȂAinsmod Ȃǂ̕K
  vȃvONĂɎdBkerneld ́AJ[l̑㗝
  l(agent)̂悤ȑ݂łAJ[l㗝Ďd̃XPW[O
  sB

  insmod [eBeB́ANGXgꂽJ[lW[𔭌
  āA[hȂ΂ȂȂBf}h[fBOŃ[hꂽ
  J[lW[͒ʏ /lib/modules/kernel-version ɕۑBJ
  [lW[͑̃vOƓNꂽIuWFNgt@C
  Ȃ̂AP[^u(relocatable)C[WƂăNĂ
  _ňقȂBȂ킿ǍŒIȃAhXs悤ɃN
  ꂽ̂ł͂ȂC[WłƂƂłB a.out  ELF
  ̂ꂩ̃tH[}bgBinsmod ́AIȃVXeR[
  sāAJ[lɂăGNX|[gꂽV{B
  [see: sys_get_kernel_syms(), in kernel/module.c]
  ́AV{ƁÃAhXȂǂ̒lƂ܂񂾃yAƂĕۑ
  BJ[lGNX|[gV{e[úAJ[lǗ
  W[̃Xg̍ŏ ``module'' f[^\̂ɕێA̍\
  ̂́A``module_list'' |C^ɂă|CgB
  [see: include/linux/module.h]
  J[l̃V{e[uɒǉ̂́AIɒǉwꂽV
  {łBV{e[úAJ[l̃RpCƃN
  鎞ɍ쐬̂AׂẴV{W[ɃGNX|[g
  킯ł͂ȂBƂ΁Arequest_irq ƂV{邪A
  ́AhCõVXe荞݂𐧌䂵悤ƂꍇɌĂяo
  J[l[`łB킽݂̌̃J[lł́ÃV{
  0x0010cd30 ƂlĂBGNX|[gꂽJ[lV{
  ̒lȒPɌɂ́A/proc/ksyms 邩Aksyms [eBeBg
  ΂悢B ksyms [eBeBg΁AGNX|[gꂽׂẴJ
  [lV{邱ƂA[_uW[ɂăGNX|[g
  ꂽV{邱ƂłBinsmod R}h́AW[
  zǂݏoāAJ[lGNX|[gĂV{g
  ƂŁAJ[l[`ւ̎QƂ̂Ȃł܂ĂȂQƂKX
  (fixup)B̉́ÃW[C[WɃpb`𓖂
  Ƃ`ĂBinsmod ́AV{̃AhXW[
  ̓K؂ȏꏊɏށB

  insmod ɂāAGNX|[gꂽJ[lV{ɑ΂郂W[
  ̎QƂƁAinsmod ́AēxIȃVXeR[gāA
  VJ[lێ̂ɏ[ȃXy[X悤J[lɈ˗
  BJ[ĺAVK ``module'' f[^\̂ƁAVW[
  ̂ɏ[ȃeʂ蓖ĂāAJ[lW[Xg
  ̍ŌɒuB̐VW[ UNINITIALIZED ƃ}[NB
  [see: sys_create_module(), in kernel/module.c]
  ``}\(12.1)''ł́AVFAT  FAT ̂ӂ̃W[J[lɃ[h
  ꂽ̃J[lW[̃XgĂB}\ł͎Ă
  ȂAXg̐擪̃W[ pseudo-module ƂȂĂāA
  J[l̃GNX|[gꂽV{̃e[uێ邽߂ɂ
  ɒuĂ̂łBlsmod R}hg΁A[hĂ邷
  ẴW[Ƃ̈ˑ֌W\邱ƂłBlsmod ͒P
  /proc/modules č\̂̂ŁA/proc/modules ́̕AJ[l
   module f[^\̂̃Xg쐬ꂽ̂łBW[p
  蓖Ăꂽ́A insmod W[ɃANZXł
  Ainsmod vZX̃AhXԂɃ}bvB insmod ́AW[
  蓖ĂꂽAhXԂɃRs[ăW[̒uꏊύX
  邱ƂŁA蓖Ă󂯂J[lAhXԂ烂W[s
  悤ɂBKvȂ̂́AقȂ Linux VXeł̓
  W[𓯂AhXɃ[h悤vłȂłȂAVX
  ełAhXɓx[h悤v邱Ƃ͂łȂ
  B̃AhX̕ύX̍ۂɂ́AW[C[WK؂ȃAhX
  悤ɏCȂB

  VW[J[lɃV{GNX|[ĝŁAinsmod 
  GNX|[gC[W̃e[u쐬Ȃ΂ȂȂBׂĂ
  J[lW[ɂ́AW[ƍ폜̃[`܂܂Ă
  ΂Ȃ炸ÃV{͂킴ƃGNX|[gȂ̂
  Ainsmod ́AJ[lɂ̃[`̃AhXnȂ΂ȂȂ
  ̂ŁÃAhXmĂȂ΂ȂȂB炷ׂĂ肭
  ꍇAinsmod ̓W[鏀߁AI
  VXeR[𔭍sāAJ[lɑ΂āAW[̏[`
  ƍ폜[`̃AhXnB
  [see: sys_init_module(), in kernel/module.c]
  VW[J[lɑgݍ܂ƂAJ[l̈ÃV{
  XVȂ΂Ȃ炸AVKW[ɂėp邱ƂɂȂ郂
  W[ɑ΂ĂCȂ΂ȂȂB̃W[
  Ă郂W[́ÃV{e[u̖ɂQƃXg
  ǗȂ΂Ȃ炸A̎QƃXg͎Ȃ ``module'' f[^\̂
  ă|CgȂ΂ȂȂB ``}\(12.1)''ł́AVFAT t@C
  VXeW[́AFAT t@CVXeW[ɈˑĂB
  āAFAT W[ɂ́AVFAT W[ւ̎QƂ܂܂ĂȂ
  ΂ȂȂB̎QƂ́AVFAT W[[hꂽƂɕt
  BJ[l̓W[[`ĂяoAꂪ
  AW[̃CXg[sBW[̍폜[`̃AhX
  ́ÃW[ module f[^\̂ɕۑAW[A
  [hƂɁAJ[lɂČĂяoBŌɁAW[̏
  Ԃ RUNNING ɃZbgB

  13.2.  W[̃A[h

  W[ rmmod R}hgč폜邱Ƃ\ł邪AIf
  }hŃ[hꂽW[͎gpȂȂƂ kerneld ɂ
  ĎIɃVXe폜BACh^C}[(idle timer)Ԑ
  ɂȂۂ͂Akerneld ̓VXeR[𔭍sAIf}h
  [hꂽW[̂ȂŎgpȂȂׂ̂ĂVXe
  폜悤NGXgB^C}[̒ĺAkerneld n
  ZbgB킽 kerneld ̃^C}[ݒ 180 bɂĂB
  ΁Aiso9660 CD-ROM }EgāA iso9660 t@CVXe
  [_uW[łꍇACD-ROM A}EgĂ炵΂
  ƁAiso9660 W[̓J[l폜B

  ̃J[l̈ꕔA郂W[ɈˑĂԂ́ÃW[
  ̓A[hłȂBƂ΁AЂƂȏ VFAT t@CVXe}
  EgĂꍇAVFAT W[̓A}EgłȂBlsmod ̏o
  ͂΁AX̃W[ˑ֌WɂĂJEgĂ邱
  ƂB

  Module:        #pages:  Used by:
  msdos              5                  1
  vfat               4                  1 (autoclean)
  fat                6    [vfat msdos]  2 (autoclean)

  JEǵÃW[ɈˑĂJ[l(entity)̐\
  ĂBL̗ł́Avfat  msdos W[͂ǂ fat W[
  ɈˑĂ̂ŁAfat ̃JEg 2 ƂȂĂBvfat  msdos
  W[͗ƂɈˑ 1 ̎̂Ă邪A̎
  Ƃ̓}Egꂽt@CVXełBA킽ЂƂ
  VFAT t@CVXe}EgƂƁA vfat W[̃JE
  g 2 ɂȂ邾낤BW[̃JEǵAC[W̍ŏ̃O
  [h(longword)̒ɕێĂB

  ̃tB[hɂ́AAUTOCLEAN  VISITED tOێ̂ŁA
  ߑƂtB[hɂȂĂBӂ̃tÓAf}
  h[fBOŃ[hꂽW[ɑ΂ĎgpB
  W[ AUTOCLEAN ƃ}[N̂́AVXẽW[
  IɃA[hΏۂƔFł悤ɂ邽߂łB VISITED t
  ÓAЂƂȏ̃VXeR|[lg̃W[gĂ
  ƂĂBVISITED tÓÃR|[lg̃W[
  ƎgƂ͕KZbgBIf}hŃ[hꂽgpȂ
  ȂW[폜邩ǂ kerneld VXeɐq˂Ƃ
  ́AVXe̓VXêׂẴW[񂵂āAgpȂ
  ȂƂɊŶ{BVXe AUTOCLEAN ƃ}[N
  Ă RUNNING Ԃɂ郂W[BY郂W[
  VISITED tONAꍇAVXe͂̃W[폜邪A
  W[tONAȂꍇ́AVXe VISITED tO
  NAāAVXe̎̃W[̒ɈڂB

  W[A[h\ȏꍇÃW[̍폜[`Ăяo
  Ã[`AW[Ɋ蓖ĂꂽJ[l\[X
  B
  [see: sys_delete_module(), in kernel/module.c]
   ``module'' f[^\̂ DELETED ƃ}[NAJ[lW[
  ̃Xg폜B(폜ꂽW[ˑĂ)̃
  W[́A폜W[͂ˑ̂ł͂ȂȂ̂ŁAQ
  XgCȂƂȂB폜W[KvƂĂJ[l
  ׂ͂Ċ蓖ĂB

  14.  vZbT

  Linux ́ÃvZbTŎsĂB̏͂ł́Â
  ɂĊȒPȃAEgCЉB

  14.1.  x86

  TBD

  (: ɉ͂܂B``bibliography  9'' QlɂĂ
  B)

  14.2.  ARM

  ARM ́Aȓd́AnCptH[}X 32 rbg RISC A[LeN`
  vZbTłB́Agѓdb PDA(Personal Data
  Assistants) Ȃǂ̑gݍ݃foCXōLgpĂBARM ́A31 
   32 rbgWX^ĂāÂ 16 ͂ǂ̃[hłgp
  \łB̃vZbT̖(instructions)́AVvȃ[hXgA
  (l[hAsǍʂɖ߂)ł
  B̃vZbTЂƂ̋[́AׂĂ̖߂
  (conditional)ł邱ƂłBƂ΁AWX^̒leXg
  AɓŃeXg܂ŁADȂDȎɁAIɖ߂
  s邱ƂłBȊŐ[ƂẮAl[h
  ɁAZƃVtgƂo邱ƂłB܂̃[h
  s\łÃvZbT̃VXe[h́A[U[h
  SWI(software interrupt)oRœ邱ƂoB

  ARM ́A\(synthasiable)RAgpĂBAARM (
  )̂̃vZbT𐻑Ă킯ł͂ȂBARM ̒g(
  ΁AIntel  LSI Ƃ)AARM ̐݌vA[LeN`V
  RɎĂB̃vZbT́ARvZbT(co-processor)̃C
  ^[tFCXoRő̃vZbTƂٖɘAg邱Ƃł̂ŁA
  Ǘjbg̃oG[VB́AVvȃ
  یXL[畡Gȃy[WKŵ̂܂ŕLJo[ĂB

  14.3.  Alpha AXP vZbT

  Alpha AXP ̃A[LeN`́A64 rbg̃[hEXgA^ RISC A[
  LeN`łAxdŐ݌vĂBׂẴWX^ 64
  rbgłA32 ̐WX^ 32 ̕_WX^
  BWX^ 31 Ԃƕ_WX^ 31 ԂƂ́Ak(null)Iy
  [V̂߂ɎgpBȂ킿ÃWX^̓ǂݏo
  0 𐶐Aւ݂͉̏̌ʂ炳ȂBׂĂ̖߂
  32 rbgłAIy[V͓ǂݏô݂ǂ
  łB̃A[LeN`́AA[LeN`ɏ̂ł
  AقȂĂB

  ɃXgAꂽl𒼐ڑ삷閽߂݂͑ȂBׂẴf[^
  ̓WX^ԂōsB䂦ÃJE^̒lCN
  gꍇA܂WX^ɓǂݏoāACAɏ
  ܂Ȃ΂ȂȂB閽߂WX^̂ǂ̈ʒuɏ
  ݂sAʂ̖߂̃WX^̃ʒuǂݏoꍇ
  ̂݁A݂̖߂Ă܂B Alpha AXP ̋[̂Ђ
  ́AtO𐶐ł閽߂邱ƂłBƂ΁Aӂ̃WX
  ^lł邩eXgǍʂ̓vZbT̃Xe[^XWX^
  ̓XgAȂAɑÕWX^ɌʂXgAƂ
  ̂łB͈ꌩɎv邩ȂAXe[^XWX^ւ
  ˑ菜ƂɂāAX̃TCNƂɑd(multiple
  instruction)𔭂邱Ƃ\ CPU ̐AɗeՂɂB
  Ɋ֌ŴȂWX^ł̖߂́A݂̖߂̌ʂ҂ƂȂAs
  BXe[^XWX^ЂƂȂꍇAɂ͂Ǝ
  邾낤B𒼐ڑ삷閽߂ȂƁAWX^
  ƂAd߂̔seՂɂ̂łB

  Alpha AXP A[LeN`́AÃTu[`gp邪A
  PALcode(privileged architecture library code)ƌĂ΂B PALcode
  ́AAlpha AXP A[LeN` CPU Ȃ̂ŁAIy[eBOVXe
  n[hEFAƂɈقȂ̂ƂȂB̃Tu[`́AIy
  [eBOVXeɃReLXgXCb`O⊄荞݁AO⃁
  Ǘ̃v~eBu񋟂̂łB̃Tu[`́An
  [hEFA CALL_PAL ߂ɂČĂяo\łB PALcode ́AW
  I Alpha AXP AZuƁA̓ɌŗL̊gt
  ďꂽ̂ŁAƂ΁AvZbT̓WX^Ȃǂ̒჌x
  n[hEFA@\ւ̒ړIȃANZXi񋟂ĂB PALcode 
  PALmode Ŏs邪Ã[h͓[hłA̃VXe
  Cxg̔~āAPALcode IȃVXen[hEFA
  Sɐ䂷邱Ƃ̂łB

  15.  Linux J[l\[X

  ̏͂ł́ÃJ[l֐ƂAJ[l\[X̂ǂT
  n߂΂悢̂ɂĐB
  {́AC vO~O̒mOƂ̂ł͂ȂAJ[l
  ̎dg݂𗝉̂ Linux J[l\[XĂ邱Ƃv
  ̂łȂBƂ͂AJ[l\[XāALinux Iy[eB
  OVXeւ̗[߂w͂邱Ƃ͂悢ʂ炷Ƃ
  B̏͂ł́AJ[l\[X̊TςA̍\̃R[
  hT̖ڈƂȂ̂ɂďqׂB

  15.1.  Linux J[l\[X̓ꏊ

  W[ Linux fBXgr[V( Craftworks, Debian,
  Slackware, Red Hat ȂǂȂ)ȂǂłAJ[l\[XĂ
  BʏAVXeɃCXg[ꂽ Linux J[ĺA\[
  XrhĂBނ𓾂ȂÃ\[X͏XÂ
  ̂ɂȂ肪Ȃ̂ŁA ``uEFu FTP TCgv''ŏqׂEFuTCg
  ŐṼ\[X肵ƍl邩ȂB\[XR[h́A
  ftp://ftp.cs.helsinki.fi ŕۑĂāAȊÕEFuTCg͂
  ׂẴ~[łB (: ݂̃vC}TCg
  ́Ahttp://www.kernel.org łB) 䂦AHelsinki ̃EFuTCg
  ŐṼ\[X邱ƂɂȂ邪AMIT  Sunsite łĂЂǂÂ
  ł͂ȂB

  EFuɃANZXłȂꍇłA CD-ROM x_A炪
  ẼW[ȃEFuTCg̃XibvVbgÓȒliŒ񋟂Ă
  BlA邢͖XVwT[rX񋟂Ăx
  _܂łB[J Linux [UO[vA\[XR[h̒񋟌
  B

  Linux J[l\[X́AɃVvȃo[WԍǗĂB
  ̔ԍAx.y.z  y Aԍ̃J[l(Ƃ΁A 2.0.30)́A
  肵A[XŃJ[lŁAԍ̃J[l(Ƃ΁A2.1.42)
  ́AJŃJ[lłB{́A 2.0.30 ̃\[Xc[ɊÂ
  ĂBJŃJ[l͍ŐV@\ׂ̂ĂAŐVfoCXׂăT
  |[gĂB͈肵Ȃꍇ邩ꂸA͂Ȃ
  Linux ɋ߂̂ł͂ȂȂALinux R~jeB[ŐV
  J[lĂƂƂ͏dvłBɂāAŐVł̓R
  ~jeB[ŜŃeXg邩łBłłȂJ[lg
  AVXeŜ̃obNAbv͏ɉl̂ł邱ƂYȂ
  قB

  J[l\[Xւ̕ύX́Apb`t@CŔzzBpb`[eB
  eB́A\[Xt@C̃ZbgɈA̕ҏW邽߂ɎgpB
  Ƃ΁A 2.0.29 ̃J[l\[Xc[ĂāA2.0.30 ̃\[Xc
  [Ɉڍsꍇ́A2.0.30 ̃pb`肵āÃpb`(\[X
  WXNvg)̃J[l\[XɓKp΂悢B

  $ cd /usr/src/linux
  $ patch -p1 < patch-2.0.30

  ΁A\[Xc[ŜA炭ᑬȃVAgăRs
  [ȂĂςށBJ[lpb`(łłȂ̂)֗̕ȓ
  ́A http://www.linuxhq.web.site łB

  15.2.  J[l\[X̍\

  \[Xc[̍ŏfBNgł /usr/src/linux ɂ́A (̂悤
  )̃fBNgB

  <#if output="html">

  (: JF TCgł̏ꍇAꕔ̃t@C\܂B\[
  XŜɂ́A``{ɂ''QƂĂB) <#/if>

     arch
        arch TufBNgɂ́AA[LeN`(architecture)ŗL̃J
        [lR[h܂܂ĂBɐ[TufBNgA
        Ƃ΁Ai386  alpha ƂT|[gA[LeN`Ƃɕ
        ĂB

     include
        include TufBNgɂ́AJ[lR[hrĥɕKv
        ȃCN[ht@C(include files)̑啔܂܂ĂB
        ɐ[TufBNgAT|[gA[LeN`Ƃ
        t@C܂܂ĂBinclude/asm TufBNǵAƂ
        include/asm-i386 Ƃ̃A[LeN`ɕKvȎۂ
        include fBNgւ̃\tgN(V{bNN)ƂȂ
        BA[LeN`ύXɂ́AJ[l makefile ҏW
        ALinux J[lݒvOĎsKvB

     init
        ̃fBNgɂ́AJ[l̏(initialization)R[h
        ܂Ă̂ŁAJ[l̓̎dg݂ꂩ猩悤Ƃꍇ
        ͂悢o_ɂȂB

     mm ̃fBNgɂ́AǗ(memory management)R[ĥ
        Ă܂܂ĂBA[LeN`ŗL̃ǗR[hɂ
        ́Aarch/i386/mm/fault.c Ƃ arch/*/mm fBNgȉɂ
        B

     drivers
        VXẽfoCXhCo(device drivers)́AׂẴfB
        NgɒuĂB̃fBNg͂ɍĕAblock
        ƂfoCXhCõNXƂɕĂB

     ipc
        ̃fBNgɂ́AJ[l̃vZXԒʐM(inter-process
        communications)ɊւR[h܂܂ĂB

     modules
        ̃fBNǵArhꂽW[(module)ۑ邽
        ɎgpĂB

     fs t@CVXe(file system)R[ĥׂĂ͂ɒuĂ
        B̃fBNg͂ɍĕĂāAvfat  ext2 
        T|[gt@CVXeƂɕĂB

     kernel
        vȃJ[l(kernel)R[huĂBłAA[LeN
        `ŗL̃J[lR[h́Aarch/*/kernel ɂB

     net
        J[l̃lbg[N(network)֌W̃R[huĂB

     lib
        ̃fBNgɂ́AJ[l̃Cu(library)R[h܂
        ĂBA[LeN`ŗL̃CúAarch/*/lib Ō
        邱ƂłB

     scripts
        ̃fBNgɂ́AJ[lݒ肷ƂɎgpXNv
        g(script) (Ƃ΁Aawk  tk XNvg)܂܂ĂB

  15.3.  ǂ猩ׂ

  Linux J[l炢ŕGȃvOɂȂƁA悤Ƃ҂
  邩̂悤ȊȂȂB܂ŒHׂ[ȂāAȂ
  ̊̂悤łBJ[l̈ꕔĂƁA΂΂
  ̊֘At@CւƓāAɎŉTĂ̂Ȃ
  ȂBȉł́A߂ɕt薼ɂāA\[Xc[̂ǂ΍ŗ
  qgqׂB

  15.3.1.  VXe̋NƏ

  Intel x[X̃VXeȂAJ[lN̂́Aloadlin.exe 
  LILO J[lɃ[hĐJ[lɓnƂłB
  ̕ɊւẮAarch/i386/kernel/head.S 邱ƁBhead.S ̓A[
  LeN`ŗL̐ݒsĂAinit/main.c ɂ main()
  [`փWvB

  15.3.2.  Ǘ

  ɊւR[h̑啔 mm ɂ邪AA[LeN`ŗL̃R[h
  arch/*/mm ɂBy[WtHgR[h mm/memory.c ɂA
  }bsOƃy[WLbṼR[h mm/filemap.c ɂBobt@
  LbV́Amm/buffer.c(: fs/buffer.c) ŎĂAXb
  vLbV mm/swap_state.c  mm/swapfile.c ɂB

  15.3.3.  J[l

  ֘AėpR[h̑啔́Akernel ɂ邪AA[LeN`ŗL̃R
  [h arch/*/kernel ɂBXPW[ kernel/sched.c ɂ
  Afork ̃R[h kernel/fork.c ɂB{gn[t̃R[h
  include/linux/interrupt.h Ɋ܂܂ĂB task_struct f[^\
  ́Ainclude/linux/sched.h ɂB

  15.3.4.  PCI

  PCI zhCo drivers/pci/pci.c ɂAVXeŜ̒`
  include/linux/pci.h ɂBX̃A[LeN`ɂ͌ŗL PCI BIOS R
  [hAAlpha AXP ̂̂ arch/alpha/kernel/bios32.c ɂB

  15.3.5.  vZXԒʐM

  ׂ͂ ipc ɂBׂĂ System V IPC IuWFNg
  ipc_perm f[^\̂܂ł邪A include/linux/ipc.h ɂ
  BSystem V bZ[W ipc/msg.c ŎĂāAL
  ipc/shm.c AZ}tH ipc/sem.c ɂBpCv́Aipc/pipe(:
  fs/pipe.c) ŎĂB

  15.3.6.  荞ݏ

  J[l̊荞ݏR[h́AقƂǂׂă}CNvZbT(
  āA΂΃vbgtH[)ŗL̂̂łBIntel ̊荞ݏR
  [h́A arch/i386/kernel/irq.c ɂA̒` include/asm-
  i386/irq.h ɂB

  15.3.7.  foCXhCo

  Linux J[l\[XR[h̑啔́AfoCXhCô̂łB
  Linux foCXhCõ\[Xׂ̂ẮAdrivers ɂ邪ÃfB
  Ng̓foCX^CvɂĂɕ򂵂ĂB

     /block
        IDE(ide.c) Ȃǂ̃ubNfoCXhCoBt@CVXeu
        Ƃł邷ׂẴfoCXǂ̂悤ɏ̂
        ꍇ́Adrivers/block/genhd.c ɂ device_setup() ׂ
        łB́An[hfBXN̏łȂANFS t@CV
        Xe}Eg邽߂Ƀlbg[NKvƂۂɂ̓lbg
        [NfoCXBubNfoCXɂ́AIDE x[X
        SCSI x[X̗̃foCX܂܂B

     /char
        ́Atty VA|[gA}EXȂǂ̃LN^x[X̃fo
        CXTƂɌꏊłB

     /cdrom
        Linux ׂ̂Ă CD-ROM ̃R[hB CD-ROM foCX(
        ΁A Soundblaster CD-ROM)ɒuĂBIDE CD hCo
         drivers/block  ide-cd.c ɂASCSI CD hCo
        drivers/scsi  scsi.c ɂ̂ŁAӂ邱ƁB

     /pci
        ɂ́APCI zhCô߂̃\[XBPCI TuVXe
        }bvꏉ@̂ɓKꏊł
        Barch/alpha/kernel/bios32.c ɂ Alpha AXP PCI C
        (fixup)R[hɒl邾낤B

     /scsi
        ́ASCSI R[ĥׂĂꏊłALinux ŃT|[g
        Ă SCSI foCXׂ̂ẴhCouĂꏊł
        B

     /net
        ́ADEC Chip 21040 PCI C[TlbghCo(tulip.c)Ƃ
        lbg[NfoCXhCoꏊłB

     /sound
        ́AׂẴTEhJ[hhCoꏊłB

  15.3.8.  t@CVXe

  EXT2 t@CVXẽ\[Xׂ͂āAfs/ext2 fBNgɂAf
  [^\̒`́Ainclude/linux/ext2_fs.h  ext2_fs_i.h, ext2_fs_sb.h
  ɂBzt@CVXẽf[^\̂́A include/linux/fs.h ɋL
  qĂÃR[h fs/* ɂBobt@LbV́Aupdate
  f[ƈꏏ fs/buffer.c ŎĂB
  15.3.9.  lbg[N

  lbg[ÑR[h́Anet ɕۑĂāȂ啔 include
  t@C include/net ɂBBSD \PbgR[h́Anet/socket.c ɂ
  AIP version 4 INET \PbgR[h́Anet/ipv4/af_inet.c ɂB
  p̃vgRT|[gR[h(sk_buff [`Ȃ)́A net/core 
  ATCP/IP lbg[ÑR[h net/ipv4 ɂBlbg[Nfo
  CXhCóAdrivers/net ɂB

  15.3.10.  W[

  J[lW[R[h́AJ[lɂ镔Ƃ modules ̃pb
  P[WɓĂ镔ƂBJ[lR[hׂ͂ kernel/module.c
  ɂÃf[^\ƃJ[lf[ł kerneld ̃bZ[W
  ́Ainclude/linux/module.h  include/linux/kerneld.h Ƃɂꂼ
  ĂB ELF IuWFNgt@C̍\́Ainclude/linux/elf.h Ō
  ƂłB

  16.  Linux f[^\

  ̏͂ł́Avȃf[^\̂񋓂ĂB́ALinux Ŏgp
  A{ɂĂqׂĂ̂łB̍\̂ɂ́A{
  ̑̍ق𐮂邽߂ɁA኱̕ҏWĂB

  16.1.  arp_table()

  [in net/ipv4/arp.c]

  struct arp_table
  {
    struct arp_table      *next;            /* Linked entry list            */
    unsigned long         last_used;        /* For expiry                   */
    unsigned long         last_updated;     /* For expiry                   */
    unsigned int          flags;            /* Control status               */
    u32                   ip;               /* ip address of entry          */
    u32                   mask;             /* netmask - used for generalised
                                                         proxy arps (tridge)*/
    unsigned char         ha[MAX_ADDR_LEN]; /* Hardware address             */
    struct device         *dev;             /* Device the entry is tied to  */
    struct hh_cache       *hh;              /* Hardware headers chain       */

    /*
     *      The following entries are only used for unresolved hw addresses.
     */

    struct timer_list     timer;            /* expire timer                 */
    int                   retries;          /* remaining retries            */
    struct sk_buff_head   skb;              /* list of queued packets       */
  };

  16.2.  blk_dev_struct

  blk_dev_struct f[^\̂gp̂́Aobt@LbVoR
  ubNfoCX𗘗pł悤ɁAubNfoCXo^邽߂ł
  B́Ablk_dev zɕێB
  [in include/linux/blkdev.h]

  struct blk_dev_struct {
    void (*request_fn)(void);
    struct request * current_request;
    struct request   plug;
    struct tq_struct plug_tq;
  };
  ...
  ...
  extern struct blk_dev_struct blk_dev[MAX_BLKDEV];

  16.3.  buffer_head

  buffer_head f[^\̂́Aobt@LbVɂubNobt@
  ێ邽߂̂̂łB
  [in include/linux/fs.h]

  /* bh state bits */
  #define BH_Uptodate  0   /* 1 if the buffer contains valid data      */
  #define BH_Dirty     1   /* 1 if the buffer is dirty                 */
  #define BH_Lock      2   /* 1 if the buffer is locked                */
  #define BH_Req       3   /* 0 if the buffer has been invalidated     */
  #define BH_Touched   4   /* 1 if the buffer has been touched (aging) */
  #define BH_Has_aged  5   /* 1 if the buffer has been aged (aging)    */
  #define BH_Protected 6   /* 1 if the buffer is protected             */
  #define BH_FreeOnIO  7   /* 1 to discard the buffer_head after IO    */

  struct buffer_head {
    /* First cache line: */
    unsigned long      b_blocknr;    /* block number                   */
    kdev_t             b_dev;        /* device (B_FREE = free)         */
    kdev_t             b_rdev;       /* Real device                    */
    unsigned long      b_rsector;    /* Real buffer location on disk   */
    struct buffer_head *b_next;      /* Hash queue list                */
    struct buffer_head *b_this_page; /* circular list of buffers in one
                                        page                           */

    /* Second cache line: */
    unsigned long      b_state;      /* buffer state bitmap (above)    */
    struct buffer_head *b_next_free;
    unsigned int       b_count;      /* users using this block         */
    unsigned long      b_size;       /* block size                     */

    /* Non-performance-critical data follows. */
    char               *b_data;      /* pointer to data block          */
    unsigned int       b_list;       /* List that this buffer appears  */
    unsigned long      b_flushtime;  /* Time when this (dirty) buffer
                                      * should be written              */
    unsigned long      b_lru_time;   /* Time when this buffer was
                                      * last used.                     */
    struct wait_queue  *b_wait;
    struct buffer_head *b_prev;      /* doubly linked hash list        */
    struct buffer_head *b_prev_free; /* doubly linked list of buffers  */
    struct buffer_head *b_reqnext;   /* request queue                  */
  };

  16.4.  device

  VXêׂẴlbg[NfoCX́Adevice f[^\̂ɂ
  ĕ\B
  [in include/linux/netdevice.h]

  struct device
  {

    /*
     * This is the first field of the "visible" part of this structure
     * (i.e. as seen by users in the "Space.c" file).  It is the name
     * the interface.
     */
    char                    *name;

    /* I/O specific fields                                           */
    unsigned long           rmem_end;        /* shmem "recv" end     */
    unsigned long           rmem_start;      /* shmem "recv" start   */
    unsigned long           mem_end;         /* shared mem end       */
    unsigned long           mem_start;       /* shared mem start     */
    unsigned long           base_addr;       /* device I/O address   */
    unsigned char           irq;             /* device IRQ number    */

    /* Low-level status flags. */
    volatile unsigned char  start,           /* start an operation   */
                            interrupt;       /* interrupt arrived    */
    unsigned long           tbusy;           /* transmitter busy     */
    struct device           *next;

    /* The device initialization function. Called only once.         */
    int                     (*init)(struct device *dev);

    /* Some hardware also needs these fields, but they are not part of
       the usual set specified in Space.c. */
    unsigned char           if_port;         /* Selectable AUI,TP,   */
    unsigned char           dma;             /* DMA channel          */

    struct enet_statistics* (*get_stats)(struct device *dev);

    /*
     * This marks the end of the "visible" part of the structure. All
     * fields hereafter are internal to the system, and may change at
     * will (read: may be cleaned up at will).
     */

    /* These may be needed for future network-power-down code.       */
    unsigned long           trans_start;     /* Time (jiffies) of
                                                last transmit        */
    unsigned long           last_rx;         /* Time of last Rx      */
    unsigned short          flags;           /* interface flags (BSD)*/
    unsigned short          family;          /* address family ID    */
    unsigned short          metric;          /* routing metric       */
    unsigned short          mtu;             /* MTU value            */
    unsigned short          type;            /* hardware type        */
    unsigned short          hard_header_len; /* hardware hdr len     */
    void                    *priv;           /* private data         */

    /* Interface address info. */
    unsigned char           broadcast[MAX_ADDR_LEN];
    unsigned char           pad;
    unsigned char           dev_addr[MAX_ADDR_LEN];
    unsigned char           addr_len;        /* hardware addr len    */
    unsigned long           pa_addr;         /* protocol address     */
    unsigned long           pa_brdaddr;      /* protocol broadcast addr*/
    unsigned long           pa_dstaddr;      /* protocol P-P other addr*/
    unsigned long           pa_mask;         /* protocol netmask     */
    unsigned short          pa_alen;         /* protocol address len */

    struct dev_mc_list      *mc_list;        /* M'cast mac addrs     */
    int                     mc_count;        /* No installed mcasts  */

    struct ip_mc_list       *ip_mc_list;     /* IP m'cast filter chain */
    __u32                   tx_queue_len;    /* Max frames per queue   */

    /* For load balancing driver pair support */
    unsigned long           pkt_queue;       /* Packets queued       */
    struct device           *slave;          /* Slave device         */
    struct net_alias_info   *alias_info;     /* main dev alias info  */
    struct net_alias        *my_alias;       /* alias devs           */

    /* Pointer to the interface buffers. */
    struct sk_buff_head     buffs[DEV_NUMBUFFS];

    /* Pointers to interface service routines. */
    int                     (*open)(struct device *dev);
    int                     (*stop)(struct device *dev);
    int                     (*hard_start_xmit) (struct sk_buff *skb,
                                                struct device *dev);
    int                     (*hard_header) (struct sk_buff *skb,
                                            struct device *dev,
                                            unsigned short type,
                                            void *daddr,
                                            void *saddr,
                                            unsigned len);
    int                     (*rebuild_header)(void *eth,
                                            struct device *dev,
                                            unsigned long raddr,
                                            struct sk_buff *skb);
    void                    (*set_multicast_list)(struct device *dev);
    int                     (*set_mac_address)(struct device *dev,
                                            void *addr);
    int                     (*do_ioctl)(struct device *dev,
                                            struct ifreq *ifr,
                                            int cmd);
    int                     (*set_config)(struct device *dev,
                                            struct ifmap *map);
    void                    (*header_cache_bind)(struct hh_cache **hhp,
                                            struct device *dev,
                                            unsigned short htype,
                                            __u32 daddr);
    void                    (*header_cache_update)(struct hh_cache *hh,
                                            struct device *dev,
                                            unsigned char *  haddr);
    int                     (*change_mtu)(struct device *dev,
                                            int new_mtu);
    struct iw_statistics*   (*get_wireless_stats)(struct device *dev);
  };

  ...
  ...
  extern struct device    *dev_base;

  16.5.  device_struct

  device_struct f[^\̂́ALN^foCXƃubNfoCXo
  ^邽߂ɎgpB(́AfoCXƁÃfoCXɎgp
  t@C샋[`̃ZbgƂێB) chrdevs  blkdevs z
  ɂX̗LȔԍ́ALN^foCXƃubNfoCXƂ
  ꂼɕ\̂łB
  [in fs/devices.c]

  struct device_struct {
      const char * name;
      struct file_operations * fops;
  };

  ()

  static struct device_struct chrdevs[MAX_CHRDEV] = {
          { NULL, NULL },
  };

  static struct device_struct blkdevs[MAX_BLKDEV] = {
          { NULL, NULL },
  };

  16.6.  dma_chan()

  [in kernel/dma.c]

  struct dma_chan {
          int  lock;
          const char *device_id;
  };

  16.7.  ext2_inode()

  [in include/linux/ext2_fs.h]

  struct ext2_inode {
    __u16   i_mode;         /* File mode */
    __u16   i_uid;          /* Owner Uid */
    __u32   i_size;         /* Size in bytes */
    __u32   i_atime;        /* Access time */
    __u32   i_ctime;        /* Creation time */
    __u32   i_mtime;        /* Modification time */
    __u32   i_dtime;        /* Deletion Time */
    __u16   i_gid;          /* Group Id */
    __u16   i_links_count;  /* Links count */
    __u32   i_blocks;       /* Blocks count */
    __u32   i_flags;        /* File flags */
    union {
            struct {
                    __u32  l_i_reserved1;
            } linux1;
            struct {
                    __u32  h_i_translator;
            } hurd1;
            struct {
                    __u32  m_i_reserved1;
            } masix1;
    } osd1;                         /* OS dependent 1 */
    __u32   i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
    __u32   i_version;      /* File version (for NFS) */
    __u32   i_file_acl;     /* File ACL */
    __u32   i_dir_acl;      /* Directory ACL */
    __u32   i_faddr;        /* Fragment address */
    union {
            struct {
                    __u8    l_i_frag;       /* Fragment number */
                    __u8    l_i_fsize;      /* Fragment size */
                    __u16   i_pad1;
                    __u32   l_i_reserved2[2];
            } linux2;
            struct {
                    __u8    h_i_frag;       /* Fragment number */
                    __u8    h_i_fsize;      /* Fragment size */
                    __u16   h_i_mode_high;
                    __u16   h_i_uid_high;
                    __u16   h_i_gid_high;
                    __u32   h_i_author;
            } hurd2;
            struct {
                    __u8    m_i_frag;       /* Fragment number */
                    __u8    m_i_fsize;      /* Fragment size */
                    __u16   m_pad1;
                    __u32   m_i_reserved2[2];
            } masix2;
    } osd2;                         /* OS dependent 2 */
  };

  16.8.  ext2_inode_info()

  [in include/linux/ext2_fs_i.h]

  struct ext2_inode_info {
    __u32   i_data[15];
    __u32   i_flags;
    __u32   i_faddr;
    __u8    i_frag_no;
    __u8    i_frag_size;
    __u16   i_osync;
    __u32   i_file_acl;
    __u32   i_dir_acl;
    __u32   i_dtime;
    __u32   i_version;
    __u32   i_block_group;
    __u32   i_next_alloc_block;
    __u32   i_next_alloc_goal;
    __u32   i_prealloc_block;
    __u32   i_prealloc_count;
    int     i_new_inode:1;  /* Is a freshly allocated inode */
  };

  16.9.  fib_info()

  [in net/ipv4/route.c]

  struct fib_info
  {
          struct fib_info         *fib_next;
          struct fib_info         *fib_prev;
          __u32                   fib_gateway;
          struct device           *fib_dev;
          int                     fib_refcnt;
          unsigned long           fib_window;
          unsigned short          fib_flags;
          unsigned short          fib_mtu;
          unsigned short          fib_irtt;
  };

  16.10.  fib_node()

  [in net/ipv4/route.c]

  struct fib_node
  {
          struct fib_node         *fib_next;
          __u32                   fib_dst;
          unsigned long           fib_use;
          struct fib_info         *fib_info;
          short                   fib_metric;
          unsigned char           fib_tos;
  };

  16.11.  fib_zone()

  [in net/ipv4/route.c]

  struct fib_zone
  {
          struct fib_zone *fz_next;
          struct fib_node **fz_hash_table;
          struct fib_node *fz_list;
          int             fz_nent;
          int             fz_logmask;
          __u32           fz_mask;
  };

  16.12.  file

  I[vꂽt@CA\PbǵAꂼ file f[^\̂ɂ
  ĕ\B
  [in include/linux/fs.h]

  struct file {
    mode_t f_mode;
    loff_t f_pos;
    unsigned short f_flags;
    unsigned short f_count;
    unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
    struct file *f_next, *f_prev;
    int f_owner;         /* pid or -pgrp where SIGIO should be sent */
    struct inode * f_inode;
    struct file_operations * f_op;
    unsigned long f_version;
    void *private_data;  /* needed for tty driver, and maybe others */
  };

  16.13.  files_struct

  file_struct f[^\̂́AvZXI[vt@CɂċLq
  ̂łB
  [in include/linux/sched.h]

  struct files_struct {
    int count;
    fd_set close_on_exec;
    fd_set open_fds;
    struct file * fd[NR_OPEN];
  };

  [in include/linux/fs.h]

  #define NR_OPEN 256

  16.14.  file_system_type()

  [in include/linux/fs.h]

  struct file_system_type {
    struct super_block *(*read_super) (struct super_block *, void *, int);
    const char *name;
    int requires_dev;
    struct file_system_type * next;
  };

  [in fs/super.c]

  static struct file_system_type *file_systems = (struct file_system_type *) NULL;

  16.15.  free_area()

  [in mm/page_alloc.c]

  /*
   * Free area management
   *
   * The free_area_list arrays point to the queue heads
   * of the free areas of different sizes
   */

  #define NR_MEM_LISTS 6

  /* The start of this MUST match the start of "struct page" */
  struct free_area_struct {
          struct page *next;
          struct page *prev;
          unsigned int * map;
  };

  #define memory_head(x) ((struct page *)(x))

  static struct free_area_struct free_area[NR_MEM_LISTS];

  (: Ql linux-2.0.11)

  struct free_area_struct {
          struct page list;
          unsigned int * map;
  };

  16.16.  fs_struct

  [in include/linux/sched.h]

  struct fs_struct {
    int count;
    unsigned short umask;
    struct inode * root, * pwd;
  };

  16.17.  gendisk

  gendisk f[^\̂́An[hfBXNɊւێĂB
  ́ẢߒŁAfBXNAp[eBVo
  ۂɎgpB
  [in include/linux/genhd.h]

  struct hd_struct {
      long start_sect;
      long nr_sects;
  };

  struct gendisk {
      int major;               /* major number of driver */
      const char *major_name;  /* name of major driver */
      int minor_shift;         /* number of times minor is shifted to
                                  get real minor */
      int max_p;               /* maximum partitions per device */
      int max_nr;              /* maximum number of real devices */

      void (*init)(struct gendisk *);
                               /* Initialization called before we
                                  do our thing */
      struct hd_struct *part;  /* partition table */
      int *sizes;              /* device size in blocks, copied to
                                  blk_size[] */
      int nr_real;             /* number of real devices */

      void *real_devices;      /* internal use */
      struct gendisk *next;
  };

  ()

  extern struct gendisk *gendisk_head;    /* linked list of disks */

  16.18.  hh_cache()

  [in include/linux/netdevice.h]

  struct hh_cache
  {
    struct hh_cache *hh_next;
    void            *hh_arp;        /* Opaque pointer, used by
                                     * any address resolution module,
                                     * not only ARP.
                                     */
    int             hh_refcnt;      /* number of users */
    unsigned short  hh_type;        /* protocol identifier, f.e ETH_P_IP */
    char            hh_uptodate;    /* hh_data is valid */
    char            hh_data[16];    /* cached hardware header */
  };

  16.19.  ide_drive_t()

  [in drivers/block/ide.h]

  typedef struct ide_drive_s {
    special_t       special;        /* special action flags */
    unsigned present        : 1;    /* drive is physically present */
    unsigned noprobe        : 1;    /* from:  hdx=noprobe */
    unsigned keep_settings  : 1;    /* restore settings after drive reset */
    unsigned busy           : 1;    /* currently doing revalidate_disk() */
    unsigned removable      : 1;    /* 1 if need to do check_media_change */
    unsigned using_dma      : 1;    /* disk is using dma for read/write */
    unsigned forced_geom    : 1;    /* 1 if hdx=c,h,s was given at boot */
    unsigned unmask         : 1;    /* flag: okay to unmask other irqs */
    unsigned no_unmask      : 1;    /* disallow setting unmask bit */
    unsigned no_io_32bit    : 1;    /* disallow enabling 32bit I/O */
    unsigned nobios         : 1;    /* flag: do not probe bios for drive */
    unsigned slow           : 1;    /* flag: slow data port */
    unsigned autotune       : 2;    /* 1=autotune, 2=noautotune, 0=default */
  #if FAKE_FDISK_FOR_EZDRIVE
    unsigned remap_0_to_1   : 1;    /* flag: partitioned with ezdrive */
  #endif /* FAKE_FDISK_FOR_EZDRIVE */
    unsigned no_geom        : 1;    /* flag: do not set geometry */
    ide_media_t     media;          /* disk, cdrom, tape, floppy */
    select_t        select;         /* basic drive/head select reg value */
    byte            ctl;            /* "normal" value for IDE_CONTROL_REG */
    byte            ready_stat;     /* min status value for drive ready */
    byte            mult_count;     /* current multiple sector setting */
    byte            mult_req;       /* requested multiple sector setting */
    byte            tune_req;       /* requested drive tuning setting */
    byte            io_32bit;       /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
    byte            bad_wstat;      /* used for ignoring WRERR_STAT */
    byte            sect0;          /* offset of first sector for DM6:DDO */
    byte            usage;          /* current "open()" count for drive */
    byte            head;           /* "real" number of heads */
    byte            sect;           /* "real" sectors per track */
    byte            bios_head;      /* BIOS/fdisk/LILO number of heads */
    byte            bios_sect;      /* BIOS/fdisk/LILO sectors per track */
    unsigned short  bios_cyl;       /* BIOS/fdisk/LILO number of cyls */
    unsigned short  cyl;            /* "real" number of cyls */
    void              *hwif;        /* actually (ide_hwif_t *) */
    struct wait_queue *wqueue;      /* used to wait for drive in open() */
    struct hd_driveid *id;          /* drive model identification info */
    struct hd_struct  *part;        /* drive partition table */
    char            name[4];        /* drive name, such as "hda" */
  #ifdef CONFIG_BLK_DEV_IDECD
    struct cdrom_info cdrom_info;   /* for ide-cd.c */
  #endif /* CONFIG_BLK_DEV_IDECD */
  #ifdef CONFIG_BLK_DEV_IDETAPE
    idetape_tape_t  tape;           /* for ide-tape.c */
  #endif /* CONFIG_BLK_DEV_IDETAPE */
  #ifdef CONFIG_BLK_DEV_IDEFLOPPY
    void *floppy;                   /* for ide-floppy.c */
  #endif /* CONFIG_BLK_DEV_IDEFLOPPY */
  #ifdef CONFIG_BLK_DEV_IDESCSI
    void *scsi;                     /* for ide-scsi.c */
  #endif /* CONFIG_BLK_DEV_IDESCSI */
    } ide_drive_t;

  16.20.  ide_hwif_t()

  [in drivers/block/ide.h]

  typedef struct hwif_s {
    struct hwif_s   *next;          /* for linked-list in ide_hwgroup_t */
    void            *hwgroup;       /* actually (ide_hwgroup_t *) */
    unsigned short  io_base;        /* base io port addr */
    unsigned short  ctl_port;       /* usually io_base+0x206 */
    ide_drive_t     drives[MAX_DRIVES];     /* drive info */
    struct gendisk  *gd;            /* gendisk structure */
    ide_tuneproc_t  *tuneproc;      /* routine to tune PIO mode for drives */
  #if defined(CONFIG_BLK_DEV_HT6560B) || defined(CONFIG_BLK_DEV_PROMISE)
    ide_selectproc_t *selectproc;   /* tweaks hardware to select drive */
  #endif
    ide_dmaproc_t   *dmaproc;       /* dma read/write/abort routine */
    unsigned long   *dmatable;      /* dma physical region descriptor table */
    unsigned short  dma_base;       /* base addr for dma ports (triton) */
    byte            irq;            /* our irq number */
    byte            major;          /* our major number */
    char            name[5];        /* name of interface, eg. "ide0" */
    byte            index;          /* 0 for ide0; 1 for ide1; ... */
    hwif_chipset_t  chipset;        /* sub-module for tuning.. */
    unsigned        noprobe    : 1; /* don't probe for this interface */
    unsigned        present    : 1; /* this interface exists */
    unsigned        serialized : 1; /* serialized operation with mate hwif */
    unsigned        sharing_irq: 1; /* 1 = sharing irq with another hwif */
  #ifdef CONFIG_BLK_DEV_PROMISE
    unsigned        is_promise2: 1; /* 2nd i/f on promise DC4030 */
  #endif /* CONFIG_BLK_DEV_PROMISE */
  #if (DISK_RECOVERY_TIME > 0)
    unsigned long   last_time;      /* time when previous rq was done */
  #endif
  #ifdef CONFIG_BLK_DEV_IDECD
    struct request request_sense_request;   /* from ide-cd.c */
    struct packet_command request_sense_pc; /* from ide-cd.c */
  #endif /* CONFIG_BLK_DEV_IDECD */
  #ifdef CONFIG_BLK_DEV_IDETAPE
    ide_drive_t     *tape_drive; /* Pointer to the tape on this interface */
  #endif /* CONFIG_BLK_DEV_IDETAPE */
    } ide_hwif_t;

  ...
  ...
  #ifndef _IDE_C
  extern  ide_hwif_t      ide_hwifs[];        /* master data repository */
  #endif

  16.21.  inode

  VFS inode f[^\̂́AfBXÑt@CfBNg̏
  ̂łB
  [in include/linux/fs.h]

  struct inode {
      kdev_t                       i_dev;
      unsigned long                i_ino;
      umode_t                      i_mode;
      nlink_t                      i_nlink;
      uid_t                        i_uid;
      gid_t                        i_gid;
      kdev_t                       i_rdev;
      off_t                        i_size;
      time_t                       i_atime;
      time_t                       i_mtime;
      time_t                       i_ctime;
      unsigned long                i_blksize;
      unsigned long                i_blocks;
      unsigned long                i_version;
      unsigned long                i_nrpages;
      struct semaphore             i_sem;
      struct inode_operations      *i_op;
      struct super_block           *i_sb;
      struct wait_queue            *i_wait;
      struct file_lock             *i_flock;
      struct vm_area_struct        *i_mmap;
      struct page                  *i_pages;
      struct dquot                 *i_dquot[MAXQUOTAS];
      struct inode                 *i_next, *i_prev;
      struct inode                 *i_hash_next, *i_hash_prev;
      struct inode                 *i_bound_to, *i_bound_by;
      struct inode                 *i_mount;
      unsigned short               i_count;
      unsigned short               i_flags;
      unsigned char                i_lock;
      unsigned char                i_dirt;
      unsigned char                i_pipe;
      unsigned char                i_sock;
      unsigned char                i_seek;
      unsigned char                i_update;
      unsigned short               i_writecount;
      union {
          struct pipe_inode_info   pipe_i;
          struct minix_inode_info  minix_i;
          struct ext_inode_info    ext_i;
          struct ext2_inode_info   ext2_i;
          struct hpfs_inode_info   hpfs_i;
          struct msdos_inode_info  msdos_i;
          struct umsdos_inode_info umsdos_i;
          struct iso_inode_info    isofs_i;
          struct nfs_inode_info    nfs_i;
          struct xiafs_inode_info  xiafs_i;
          struct sysv_inode_info   sysv_i;
          struct affs_inode_info   affs_i;
          struct ufs_inode_info    ufs_i;
          struct socket            socket_i;
          void                     *generic_ip;
      } u;
  };

  () [in fs/inode.c]

  static struct inode * first_inode;

  16.22.  ipc_perm

  ipc_perm f[^\̂́ASystem V IPC IuWFNg̃ANZX
  Lq̂łB
  [in include/linux/ipc.h]

  struct ipc_perm
  {
    key_t  key;
    ushort uid;   /* owner euid and egid */
    ushort gid;
    ushort cuid;  /* creator euid and egid */
    ushort cgid;
    ushort mode;  /* access modes see mode flags below */
    ushort seq;   /* sequence number */
  };

  16.23.  ipfrag()

  [in include/net/ip.h]

  struct ipfrag
  {
    int             offset;   /* offset of fragment in IP datagram    */
    int             end;      /* last byte of data in datagram        */
    int             len;      /* length of this fragment              */
    struct sk_buff  *skb;     /* complete received fragment           */
    unsigned char   *ptr;     /* pointer into real fragment data      */
    struct ipfrag   *next;    /* linked list pointers                 */
    struct ipfrag   *prev;
  };

  16.24.  ipq()

  [in include/net/ip.h]

  struct ipq
  {
    unsigned char   *mac;       /* pointer to MAC header              */
    struct iphdr    *iph;       /* pointer to IP header               */
    int             len;        /* total length of original datagram  */
    short           ihlen;      /* length of the IP header            */
    short           maclen;     /* length of the MAC header           */
    struct timer_list timer;    /* when will this queue expire?       */
    struct ipfrag   *fragments; /* linked list of received fragments  */
    struct ipq      *next;      /* linked list pointers               */
    struct ipq      *prev;
    struct device   *dev;       /* Device - for icmp replies */
  };

  [in net/ipv4/ip_fragment.c]

  static struct ipq *ipqueue = NULL;

  16.25.  irqaction

  [in include/linux/interrupt.h]

  irqaction f[^\̂́AVXe̊荞݃nh[Lq邽߂
  gp̂łB

  struct irqaction {
    void (*handler)(int, void *, struct pt_regs *);
    unsigned long flags;
    unsigned long mask;
    const char *name;
    void *dev_id;
    struct irqaction *next;
  };

  16.26.  irq_action

  [in arch/*/kernel/irq.c](i386, alpha)

  static struct irqaction *irq_action[16] = {
          NULL, NULL, NULL, NULL,
          NULL, NULL, NULL, NULL,
          NULL, NULL, NULL, NULL,
          NULL, NULL, NULL, NULL
  };

  16.27.  kdev_t()

  [in include/linux/kdev_t.h]

  typedef unsigned short kdev_t;

  16.28.  linux_binfmt

  Linux oCit@C̃tH[}bǵAꂼ
  linux_binfmt f[^\̂ɂĕ\B
  [in include/linux/binfmts.h]

  struct linux_binfmt {
    struct linux_binfmt * next;
    long *use_count;
    int (*load_binary)(struct linux_binprm *, struct  pt_regs * regs);
    int (*load_shlib)(int fd);
    int (*core_dump)(long signr, struct pt_regs * regs);
  };

  16.29.  mem_map_t

  mem_map_t f[^\(y[WƂĂ΂)́AɂX̃y
  [WɊւێ邽߂ɎgpB
  [in include/linux/mm.h]

  typedef struct page {
    /* these must be first (free area handling) */
    struct page        *next;
    struct page        *prev;
    struct inode       *inode;
    unsigned long      offset;
    struct page        *next_hash;
    atomic_t           count;
    unsigned           flags;     /* atomic flags, some possibly
                                     updated asynchronously */
    unsigned           dirty:16,
                       age:8;
    struct wait_queue  *wait;
    struct page        *prev_hash;
    struct buffer_head *buffers;
    unsigned long      swap_unlock_entry;
    unsigned long      map_nr;    /* page->map_nr == page - mem_map */
  } mem_map_t;
  .....
  .....
  extern mem_map_t * mem_map;

  [in include/linux/pagemap.h]

  extern struct page * page_hash_table[PAGE_HASH_SIZE];

  16.30.  mm_struct

  mm_struct f[^\̂́A^XN̓vZX̉zLq
  ߂ɎgpB
  [in include/linux/sched.h]

  struct mm_struct {
    int count;
    pgd_t * pgd;
    unsigned long context;
    unsigned long start_code, end_code, start_data, end_data;
    unsigned long start_brk, brk, start_stack, start_mmap;
    unsigned long arg_start, arg_end, env_start, env_end;
    unsigned long rss, total_vm, locked_vm;
    unsigned long def_flags;
    struct vm_area_struct * mmap;
    struct vm_area_struct * mmap_avl;
    struct semaphore mmap_sem;
  };

  16.31.  module()

  [in include/linux/module.h]

  struct module {
      struct module *next;
      struct module_ref *ref; /* the list of modules that refer to me */
      struct symbol_table *symtab;
      const char *name;
      int size;                       /* size of module in pages */
      void* addr;                     /* address of module */
      int state;
      void (*cleanup)(void);          /* cleanup routine */
  };

  [in kernel/module.c]

  static struct module kernel_module;
  static struct module *module_list = &kernel_module;

  16.32.  msg()

  [in include/linux/msg.h]

  struct msg {
      struct msg *msg_next;   /* next message on queue */
      long  msg_type;
      char *msg_spot;         /* message text address */
      time_t msg_stime;       /* msgsnd time */
      short msg_ts;           /* message text size */
  };

  16.33.  msqid_ds()

  [in include/linux/msg.h]

  struct msqid_ds {
      struct ipc_perm msg_perm;
      struct msg *msg_first;  /* first message on queue */
      struct msg *msg_last;   /* last message in queue */
      time_t msg_stime;       /* last msgsnd time */
      time_t msg_rtime;       /* last msgrcv time */
      time_t msg_ctime;       /* last change time */
      struct wait_queue *wwait;
      struct wait_queue *rwait;
      ushort msg_cbytes;      /* current number of bytes on queue */
      ushort msg_qnum;        /* number of messages in queue */
      ushort msg_qbytes;      /* max number of bytes on queue */
      ushort msg_lspid;       /* pid of last msgsnd */
      ushort msg_lrpid;       /* last receive pid */
  };
  ...
  ...
  #define MSGMNI   128   /* <= 1K */  /* max # of msg queue identifiers */

  [in ipc/msg.c]

  static struct msqid_ds *msgque[MSGMNI];

  16.34.  packet_type()

  [in include/linux/netdevice.h]

  struct packet_type {
    unsigned short        type;   /* This is really htons(ether_type). */
    struct device *       dev;
    int                   (*func) (struct sk_buff *, struct device *,
                                   struct packet_type *);
    void                  *data;
    struct packet_type    *next;
  };

  [in net/core/dev.c]

  struct packet_type *ptype_base[16];
  struct packet_type *ptype_all = NULL;           /* Taps */

  16.35.  pci_bus

  VXêׂĂ PCI oX́Apci_bus f[^\̂ɂĕ\
  ĂB
  [in include/linux/pci.h]

  struct pci_bus {
    struct pci_bus  *parent;     /* parent bus this bridge is on */
    struct pci_bus  *children;   /* chain of P2P bridges on this bus */
    struct pci_bus  *next;       /* chain of all PCI buses */

    struct pci_dev  *self;       /* bridge device as seen by parent */
    struct pci_dev  *devices;    /* devices behind this bridge */

    void    *sysdata;            /* hook for sys-specific extension */

    unsigned char  number;       /* bus number */
    unsigned char  primary;      /* number of primary bridge */
    unsigned char  secondary;    /* number of secondary bridge */
    unsigned char  subordinate;  /* max number of subordinate buses */
  };
  ...
  ...
  extern struct pci_bus   pci_root;       /* root bus */

  16.36.  pci_dev

  PCI-PCI ubW PCI-ISA ubW܂ށAVXêׂĂ PCI f
  oCX́Apci_dev f[^\̂ɂĕ\B
  [in include/linux/pci.h]

  /*
   * There is one pci_dev structure for each slot-number/function-number
   * combination:
   */
  struct pci_dev {
    struct pci_bus  *bus;      /* bus this device is on */
    struct pci_dev  *sibling;  /* next device on this bus */
    struct pci_dev  *next;     /* chain of all devices */

    void    *sysdata;          /* hook for sys-specific extension */

    unsigned int  devfn;       /* encoded device & function index */
    unsigned short  vendor;
    unsigned short  device;
    unsigned int  class;       /* 3 bytes: (base,sub,prog-if) */
    unsigned int  master : 1;  /* set if device is master capable */
    /*
     * In theory, the irq level can be read from configuration
     * space and all would be fine.  However, old PCI chips don't
     * support these registers and return 0 instead.  For example,
     * the Vision864-P rev 0 chip can uses INTA, but returns 0 in
     * the interrupt line and pin registers.  pci_init()
     * initializes this field with the value at PCI_INTERRUPT_LINE
     * and it is the job of pcibios_fixup() to change it if
     * necessary.  The field must not be 0 unless the device
     * cannot generate interrupts at all.
     */
    unsigned char  irq;        /* irq generated by this device */
  };
  ...
  ...
  extern struct pci_dev   *pci_devices;   /* list of all devices */

  16.37.  pipe_inode_info()

  [in include/linux/pipe_fs_i.h]

  struct pipe_inode_info {
          struct wait_queue * wait;
          char * base;
          unsigned int start;
          unsigned int len;
          unsigned int lock;
          unsigned int rd_openers;
          unsigned int wr_openers;
          unsigned int readers;
          unsigned int writers;
  };

  #define PIPE_WAIT(inode)        ((inode).u.pipe_i.wait)
  #define PIPE_BASE(inode)        ((inode).u.pipe_i.base)
  #define PIPE_START(inode)       ((inode).u.pipe_i.start)
  #define PIPE_LEN(inode)         ((inode).u.pipe_i.len)
  #define PIPE_RD_OPENERS(inode)  ((inode).u.pipe_i.rd_openers)
  #define PIPE_WR_OPENERS(inode)  ((inode).u.pipe_i.wr_openers)
  #define PIPE_READERS(inode)     ((inode).u.pipe_i.readers)
  #define PIPE_WRITERS(inode)     ((inode).u.pipe_i.writers)
  #define PIPE_LOCK(inode)        ((inode).u.pipe_i.lock)
  #define PIPE_SIZE(inode)        PIPE_LEN(inode)
  ...
  ...

  16.38.  proto_ops()

  [in include/linux/net.h]

  struct proto_ops {
    int   family;

    int   (*create)     (struct socket *sock, int protocol);
    int   (*dup)        (struct socket *newsock, struct socket *oldsock);
    int   (*release)    (struct socket *sock, struct socket *peer);
    int   (*bind)       (struct socket *sock, struct sockaddr *umyaddr,
                         int sockaddr_len);
    int   (*connect)    (struct socket *sock, struct sockaddr *uservaddr,
                         int sockaddr_len, int flags);
    int   (*socketpair) (struct socket *sock1, struct socket *sock2);
    int   (*accept)     (struct socket *sock, struct socket *newsock,
                           int flags);
    int   (*getname)    (struct socket *sock, struct sockaddr *uaddr,
                           int *usockaddr_len, int peer);
    int   (*select)     (struct socket *sock, int sel_type,
                           select_table *wait);
    int   (*ioctl)      (struct socket *sock, unsigned int cmd,
                           unsigned long arg);
    int   (*listen)     (struct socket *sock, int len);
    int   (*shutdown)   (struct socket *sock, int flags);
    int   (*setsockopt) (struct socket *sock, int level, int optname,
                           char *optval, int optlen);
    int   (*getsockopt) (struct socket *sock, int level, int optname,
                           char *optval, int *optlen);
    int   (*fcntl)      (struct socket *sock, unsigned int cmd,
                           unsigned long arg);
    int   (*sendmsg)    (struct socket *sock, struct msghdr *m,
                           int total_len, int nonblock, int flags);
    int   (*recvmsg)    (struct socket *sock, struct msghdr *m,
                      int total_len, int nonblock, int flags, int *addr_len);
  };

  [in net/socket.c]

  static struct proto_ops *pops[NPROTO];

  16.39.  request

  request f[^\̂́AVXẽubNfoCXɑ΂ăNGXg
  𑗂邽߂ɎgpB̃NGXǵAɁAobt@LbVɑ
  f[^ubN̓ǂݏłȂ΂ȂȂB
  [in include/linux/blkdev.h]

  struct request {
      volatile int rq_status;
  #define RQ_INACTIVE            (-1)
  #define RQ_ACTIVE              1
  #define RQ_SCSI_BUSY           0xffff
  #define RQ_SCSI_DONE           0xfffe
  #define RQ_SCSI_DISCONNECTING  0xffe0

      kdev_t rq_dev;
      int cmd;        /* READ or WRITE */
      int errors;
      unsigned long sector;
      unsigned long nr_sectors;
      unsigned long current_nr_sectors;
      char * buffer;
      struct semaphore * sem;
      struct buffer_head * bh;
      struct buffer_head * bhtail;
      struct request * next;
  };

  () [in drivers/block/ll_rw_blk.c]

  static struct request all_requests[NR_REQUEST];

  16.40.  rtable

  rtable f[^\̂́A IP zXgɃpPbg𑗐MۂɎׂ
  [gɊւێ̂ŁAIP [gLbV̓Ŏgp
  B
  [in include/net/route.h]

  struct rtable
  {
      struct rtable     *rt_next;
      __u32             rt_dst;
      __u32             rt_src;
      __u32             rt_gateway;
      atomic_t          rt_refcnt;
      atomic_t          rt_use;
      unsigned long     rt_window;
      atomic_t          rt_lastuse;
      struct hh_cache   *rt_hh;
      struct device     *rt_dev;
      unsigned short    rt_flags;
      unsigned short    rt_mtu;
      unsigned short    rt_irtt;
      unsigned char     rt_tos;
  };

  [in net/ipv4/route.c]

  struct rtable           *ip_rt_hash_table[RT_HASH_DIVISOR];

  16.41.  Scsi_Cmnd()

  (ȗĂ܂)
  [in drivers/scsi/scsi.h]

  typedef struct scsi_cmnd {
    struct Scsi_Host * host;
    Scsi_Device * device;
    unsigned char target, lun, channel;
    unsigned char cmd_len;
    unsigned char old_cmd_len;
    struct scsi_cmnd *next, *prev, *device_next, *reset_chain;

    /* These elements define the operation we are about to perform */
    unsigned char cmnd[12];
    unsigned request_bufflen;   /* Actual request size */

    void * request_buffer;      /* Actual requested buffer */

    /* These elements define the operation we ultimately want to perform */
    unsigned char data_cmnd[12];
    unsigned short old_use_sg;  /* We save  use_sg here when requesting
                                 * sense info */
    unsigned short use_sg;      /* Number of pieces of scatter-gather */
    unsigned short sglist_len;  /* size of malloc'd scatter-gather list */
    unsigned short abort_reason;/* If the mid-level code requests an
                                 * abort, this is the reason. */
    unsigned bufflen;           /* Size of data buffer */
    void *buffer;               /* Data buffer */

    unsigned underflow;         /* Return error if less than this amount is
                                 * transfered */

    unsigned transfersize;    /* How much we are guaranteed to transfer with
                               * each SCSI transfer (ie, between disconnect /
                               * reconnects.   Probably == sector size */

    struct request request;     /* A copy of the command we are working on */
    unsigned char sense_buffer[16];  /* Sense for this command, if needed */
    unsigned long serial_number;
    unsigned long serial_number_at_timeout;
    int retries;
    int allowed;
    int timeout_per_command, timeout_total, timeout;
    unsigned volatile char internal_timeout;
    unsigned flags;
    int this_count;
    void (*scsi_done)(struct scsi_cmnd *);
    void (*done)(struct scsi_cmnd *);  /* Mid-level done function */
    Scsi_Pointer SCp;   /* Scratchpad used by some host adapters */
    unsigned char * host_scribble;
    int result;                    /* Status code from lower level driver */
    unsigned char tag;             /* SCSI-II queued command tag */
    unsigned long pid;             /* Process ID, starts at 0 */
  } Scsi_Cmnd;

  16.42.  Scsi_Device()

  [in drivers/scsi/scsi.h]

  typedef struct scsi_device {
    struct scsi_device * next;      /* Used for linked list */

    unsigned char id, lun, channel;

    unsigned int manufacturer;      /* Manufacturer of device, for using
                                     * vendor-specific cmd's */
    int attached;                   /* # of high level drivers attached to
                                     * this */
    int access_count;               /* Count of open channels/mounts */
    struct wait_queue * device_wait;/* Used to wait if device is busy */
    struct Scsi_Host * host;
    void (*scsi_request_fn)(void);  /* Used to jumpstart things after an
                                     * ioctl */
    struct scsi_cmnd *device_queue; /* queue of SCSI Command structures */
    void *hostdata;                 /* available to low-level driver */
    char type;
    char scsi_level;
    char vendor[8], model[16], rev[4];
    unsigned char current_tag;      /* current tag */
    unsigned char sync_min_period;  /* Not less than this period */
    unsigned char sync_max_offset;  /* Not greater than this offset */
    unsigned char queue_depth;      /* How deep a queue to use */

    unsigned writeable:1;
    unsigned removable:1;
    unsigned random:1;
    unsigned has_cmdblocks:1;
    unsigned changed:1;             /* Data invalid due to media change */
    unsigned busy:1;                /* Used to prevent races */
    unsigned lockable:1;            /* Able to prevent media removal */
    unsigned borken:1;              /* Tell the Seagate driver to be
                                     * painfully slow on this device */
    unsigned tagged_supported:1;    /* Supports SCSI-II tagged queuing */
    unsigned tagged_queue:1;        /* SCSI-II tagged queuing enabled */
    unsigned disconnect:1;          /* can disconnect */
    unsigned soft_reset:1;          /* Uses soft reset option */
    unsigned sync:1;                /* Negotiate for sync transfers */
    unsigned single_lun:1;          /* Indicates we should only allow I/O to
                                     * one of the luns for the device at a
                                     * time. */
    unsigned was_reset:1;           /* There was a bus reset on the bus for
                                     * this device */
    unsigned expecting_cc_ua:1;     /* Expecting a CHECK_CONDITION/UNIT_ATTN
                                     * because we did a bus reset. */
  } Scsi_Device;
  ...
  ...
  extern Scsi_Device * scsi_devices;

  16.43.  Scsi_Device_Template

  [in drivers/scsi/hosts.h]

  struct Scsi_Device_Template
  {
    struct Scsi_Device_Template * next;
    const char * name;
    const char * tag;
    long * usage_count;           /* Used for loadable modules */
    unsigned char scsi_type;
    unsigned char major;
    unsigned char nr_dev;         /* Number currently attached */
    unsigned char dev_noticed;    /* Number of devices detected. */
    unsigned char dev_max;        /* Current size of arrays */
    unsigned blk:1;               /* 0 if character device */
    int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */
    int (*init)(void);            /* Sizes arrays based
                                     upon number of devices
                                   *  detected */
    void (*finish)(void);         /* Perform initialization after attachment */
    int (*attach)(Scsi_Device *); /* Attach devices to arrays */
    void (*detach)(Scsi_Device *);
  };
  ...
  ...
  extern struct Scsi_Device_Template * scsi_devicelist;

  16.44.  Scsi_Disk()

  [in drivers/scsi/sd.h

  ypedef struct scsi_disk {
    unsigned capacity;              /* size in blocks */
    unsigned sector_size;           /* size in bytes */
    Scsi_Device  *device;
    unsigned char ready;            /* flag ready for FLOPTICAL */
    unsigned char write_prot;       /* flag write_protect for rmvable dev */
    unsigned char sector_bit_size;  /* sector_size = 2
                                       to the  bit size power */
    unsigned char sector_bit_shift; /* power of 2 sectors per FS block */
    unsigned ten:1;                 /* support ten byte read / write */
    unsigned remap:1;               /* support remapping  */
    unsigned has_part_table:1;      /* has partition table */
  } Scsi_Disk;

  extern Scsi_Disk * rscsi_disks;

  16.45.  Scsi_Host()

  (ȗĂ܂)
  [in drivers/scsi/hosts.h]

  struct Scsi_Host
  {
      struct Scsi_Host * next;
      unsigned short extra_bytes;
      volatile unsigned char host_busy;
      char host_no;  /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */
      unsigned long last_reset;
      struct wait_queue *host_wait;
      Scsi_Cmnd *host_queue;
      Scsi_Host_Template * hostt;

      unsigned int max_id;
      unsigned int max_lun;
      unsigned int max_channel;

      struct Scsi_Host * block;
      unsigned wish_block:1;

      /* These parameters should be set by the detect routine */
      unsigned char *base;
      unsigned int  io_port;
      unsigned char n_io_port;
      unsigned char irq;
      unsigned char dma_channel;

      unsigned int unique_id;

      int this_id;
      int can_queue;
      short cmd_per_lun;
      short unsigned int sg_tablesize;
      unsigned unchecked_isa_dma:1;
      unsigned use_clustering:1;
      unsigned loaded_as_module:1;
      void (*select_queue_depths)(struct Scsi_Host *, Scsi_Device *);
      unsigned long hostdata[0];  /* Used for storage of host specific stuff */
  };

  16.46.  Scsi_Host_Template()

  (ȗĂ܂B)
  [in drivers/scsi/hosts.h]

  typedef struct  SHT
  {

      /* Used with loadable modules so we can construct a linked list. */
      struct SHT * next;

      /* Used with loadable modules so that
       we know when it is safe to unload */
      long * usage_count;

      struct proc_dir_entry *proc_dir;
      int (*proc_info)(char *, char **, off_t, int, int, int);
      const char *name;
      int (* detect)(struct SHT *);
      int (*release)(struct Scsi_Host *);
      const char *(* info)(struct Scsi_Host *);
      int (* command)(Scsi_Cmnd *);
      int (* queuecommand)(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
      int (* abort)(Scsi_Cmnd *);
      int (* reset)(Scsi_Cmnd *, unsigned int);
      int (* slave_attach)(int, int);
      int (* bios_param)(Disk *, kdev_t, int []);
      int can_queue;
      int this_id;
      short unsigned int sg_tablesize;
      short cmd_per_lun;
      unsigned char present;
      unsigned unchecked_isa_dma:1;
      unsigned use_clustering:1;

  } Scsi_Host_Template;

  extern struct Scsi_Host * scsi_hostlist;

  [in drivers/scsi/hosts.c]

  static Scsi_Host_Template builtin_scsi_hosts[] =
  ...
  ...

  16.47.  sem()

  [in include/linux/sem.h]

  struct sem {
    short   semval;         /* current value */
    short   sempid;         /* pid of last operation */
  };

  16.48.  semaphore

  Z}tH́Advȃf[^\R[ḧی삷邽߂ɗpdg
  ݂łB
  [in include/asm/semaphore.h](i386, alpha]

  struct semaphore {
      int count;
      int waking;
      int lock ;                /* to make waking testing atomic */
      struct wait_queue *wait;
  };

  16.49.  semid_ds()

  [in include/linux/sem.h]

  struct semid_ds {
    struct ipc_perm sem_perm;        /* permissions .. see ipc.h */
    time_t          sem_otime;       /* last semop time */
    time_t          sem_ctime;       /* last change time */
    struct sem      *sem_base;       /* ptr to first semaphore in array */
    struct sem_queue *sem_pending;   /* pending operations to be processed */
    struct sem_queue **sem_pending_last; /* last pending operation */
    struct sem_undo *undo;           /* undo requests on this array */
    ushort          sem_nsems;       /* no. of semaphores in array */
  };

  [in ipc/sem.c]

  static struct semid_ds *semary[SEMMNI];

  16.50.  sem_queue()

  [in include/linux/sem.h]

  struct sem_queue {
      struct sem_queue *  next;    /* next entry in the queue */
      struct sem_queue ** prev;    /* previous entry in the queue,
                                      *(q->prev) == q */
      struct wait_queue * sleeper; /* sleeping process */
      struct sem_undo *   undo;    /* undo structure */
      int                 pid;     /* process id of requesting process */
      int                 status;  /* completion status of operation */
      struct semid_ds *   sma;     /* semaphore array for operations */
      struct sembuf *     sops;    /* array of pending operations */
      int                 nsops;   /* number of operations */
  };

  16.51.  sem_undo()

  [in include/linux/sem.h]

  struct sem_undo {
      struct sem_undo *  proc_next; /* next entry on this process */
      struct sem_undo *  id_next;   /* next entry on this semaphore set */
      int                semid;     /* semaphore set identifier */
      short *            semadj;    /* array of adjustments,
                                       one per semaphore */
  };

  16.52.  shmid_ds()

  [in include/linux/shm.h]

  struct shmid_ds {
      struct ipc_perm shm_perm;       /* operation perms */
      int     shm_segsz;              /* size of segment (bytes) */
      time_t  shm_atime;              /* last attach time */
      time_t  shm_dtime;              /* last detach time */
      time_t  shm_ctime;              /* last change time */
      unsigned short  shm_cpid;       /* pid of creator */
      unsigned short  shm_lpid;       /* pid of last operator */
      short   shm_nattch;             /* no. of current attaches */
      /* the following are private */
      unsigned short   shm_npages;    /* size of segment (pages) */
      unsigned long   *shm_pages;     /* array of ptrs to frames -> SHMMAX */
      struct vm_area_struct *attaches; /* descriptors for attaches */
  };

  [in ipc/shm.c]

  static struct shmid_ds *shm_segs[SHMMNI];

  16.53.  sigaction()

  [in include/asm/signal.h](i386, alpha)

  struct sigaction {
          __sighandler_t sa_handler;
          sigset_t sa_mask;
          unsigned long sa_flags;
          void (*sa_restorer)(void);
  };

  16.54.  signal_struct()

  [in include/linux/sched.h]

  struct signal_struct {
          int count;
          struct sigaction action[32];
  };

  16.55.  sk_buff

  sk_buff f[^\̂́Albg[Nf[^vgRKwړ
  ɁÃf[^Lq邽߂Ɏgp̂łB
  [in include/linux/skbuff.h]

  struct sk_buff
  {
    struct sk_buff      *next;   /* Next buffer in list                  */
    struct sk_buff      *prev;   /* Previous buffer in list              */
    struct sk_buff_head *list;   /* List we are on                       */
    int                 magic_debug_cookie;
    struct sk_buff      *link3;  /* Link for IP protocol level buffer chains*/
    struct sock         *sk;     /* Socket we are owned by               */
    unsigned long       when;    /* used to compute rtt's                */
    struct timeval      stamp;   /* Time we arrived                      */
    struct device       *dev;    /* Device we arrived on/are leaving by  */
    union
    {
        struct tcphdr   *th;
        struct ethhdr   *eth;
        struct iphdr    *iph;
        struct udphdr   *uh;
        unsigned char   *raw;
        /* for passing file handles in a unix domain socket */
        void            *filp;
    } h;

    union
    {
        /* As yet incomplete physical layer views */
        unsigned char   *raw;
        struct ethhdr   *ethernet;
    } mac;

    struct iphdr        *ip_hdr;     /* For IPPROTO_RAW                       */
    unsigned long       len;         /* Length of actual data                 */
    unsigned long       csum;        /* Checksum                              */
    __u32               saddr;       /* IP source address                     */
    __u32               daddr;       /* IP target address                     */
    __u32               raddr;       /* IP next hop address                   */
    __u32               seq;         /* TCP sequence number                   */
    __u32               end_seq;     /* seq [+ fin] [+ syn] + datalen         */
    __u32               ack_seq;     /* TCP ack sequence number               */
    unsigned char       proto_priv[16];
    volatile char       acked,       /* Are we acked ?                        */
                        used,        /* Are we in use ?                       */
                        free,        /* How to free this buffer               */
                        arp;         /* Has IP/ARP resolution finished        */
    unsigned char       tries,       /* Times tried                           */
                        lock,        /* Are we locked ?                       */
                        localroute,  /* Local routing asserted for this frame */
                        pkt_type,    /* Packet class                          */
                        pkt_bridged, /* Tracker for bridging                  */
                        ip_summed;   /* Driver fed us an IP checksum          */
  #define PACKET_HOST         0        /* To us                                 */
  #define PACKET_BROADCAST    1        /* To all                                */
  #define PACKET_MULTICAST    2        /* To group                              */
  #define PACKET_OTHERHOST    3        /* To someone else                       */
    unsigned short      users;       /* User count - see datagram.c,tcp.c     */
    unsigned short      protocol;    /* Packet protocol from driver.          */
    unsigned int        truesize;    /* Buffer size                           */
    atomic_t            count;       /* reference count                       */
    struct sk_buff      *data_skb;   /* Link to the actual data skb           */
    unsigned char       *head;       /* Head of buffer                        */
    unsigned char       *data;       /* Data head pointer                     */
    unsigned char       *tail;       /* Tail pointer                          */
    unsigned char       *end;        /* End pointer                           */
    void                (*destructor)(struct sk_buff *); /* Destruct function */
    __u16               redirport;   /* Redirect port                         */
  };

  16.56.  sk_buff_head()

  [in include/linux/skbuff.h]

  struct sk_buff_head
  {
          struct sk_buff  * next;
          struct sk_buff  * prev;
          __u32           qlen;           /* Must be same length as a pointer
                                             for using debugging */
  #if CONFIG_SKB_CHECK
          int             magic_debug_cookie;
  #endif
  };

  [in net/core/dev.c]

  static struct sk_buff_head backlog;

  16.57.  sock

  X sock f[^\̂́ABSD \PbgɊւvgRŗL̏
  ێ邽߂̂̂łBႦ΁AINET(Internet Address Domain)\Pb
  g̏ꍇÃf[^\̂ɂ́ATCP/IP  UDP/IP ŗLׂ̏̂Ă
  ێ邱ƂɂȂB
  [in include/net/sock.h]

  struct sock
  {
      /* This must be first. */
      struct sock             *sklist_next;
      struct sock             *sklist_prev;

      struct options          *opt;
      atomic_t                wmem_alloc;
      atomic_t                rmem_alloc;
      unsigned long           allocation;       /* Allocation mode */
      __u32                   write_seq;
      __u32                   sent_seq;
      __u32                   acked_seq;
      __u32                   copied_seq;
      __u32                   rcv_ack_seq;
      unsigned short          rcv_ack_cnt;      /* count of same ack */
      __u32                   window_seq;
      __u32                   fin_seq;
      __u32                   urg_seq;
      __u32                   urg_data;
      __u32                   syn_seq;
      int                     users;            /* user count */
    /*
     *    Not all are volatile, but some are, so we
     *     might as well say they all are.
     */
      volatile char           dead,
                              urginline,
                              intr,
                              blog,
                              done,
                              reuse,
                              keepopen,
                              linger,
                              delay_acks,
                              destroy,
                              ack_timed,
                              no_check,
                              zapped,
                              broadcast,
                              nonagle,
                              bsdism;
      unsigned long           lingertime;
      int                     proc;

      struct sock             *next;
      struct sock             **pprev;
      struct sock             *bind_next;
      struct sock             **bind_pprev;
      struct sock             *pair;
      int                     hashent;
      struct sock             *prev;
      struct sk_buff          *volatile send_head;
      struct sk_buff          *volatile send_next;
      struct sk_buff          *volatile send_tail;
      struct sk_buff_head     back_log;
      struct sk_buff          *partial;
      struct timer_list       partial_timer;
      long                    retransmits;
      struct sk_buff_head     write_queue,
                              receive_queue;
      struct proto            *prot;
      struct wait_queue       **sleep;
      __u32                   daddr;
      __u32                   saddr;        /* Sending source */
      __u32                   rcv_saddr;    /* Bound address */
      unsigned short          max_unacked;
      unsigned short          window;
      __u32                   lastwin_seq;  /* sequence number when we last
                                               updated the window we offer */
      __u32                   high_seq;     /* sequence number when we did
                                               current fast retransmit */
      volatile unsigned long  ato;          /* ack timeout */
      volatile unsigned long  lrcvtime;     /* jiffies at last data rcv */
      volatile unsigned long  idletime;     /* jiffies at last rcv */
      unsigned int            bytes_rcv;
  /*
   *    mss is min(mtu, max_window)
   */
      unsigned short          mtu;          /* mss negotiated in the syn's */
      volatile unsigned short mss;          /* current eff. mss - can change */
      volatile unsigned short user_mss;     /* mss requested by user in ioctl */
      volatile unsigned short max_window;
      unsigned long           window_clamp;
      unsigned int            ssthresh;
      unsigned short          num;
      volatile unsigned short cong_window;
      volatile unsigned short cong_count;
      volatile unsigned short packets_out;
      volatile unsigned short shutdown;
      volatile unsigned long  rtt;
      volatile unsigned long  mdev;
      volatile unsigned long  rto;

      volatile unsigned short backoff;
      int                     err, err_soft;/* Soft holds errors that don't
                                               cause failure but are the cause
                                               of a persistent failure not
                                               just 'timed out' */
      unsigned char           protocol;
      volatile unsigned char  state;
      unsigned char           ack_backlog;
      unsigned char           max_ack_backlog;
      unsigned char           priority;
      unsigned char           debug;
      int                     rcvbuf;
      int                     sndbuf;
      unsigned short          type;
      unsigned char           localroute;       /* Route locally only */
  /*
   *    This is where all the private (optional) areas that don't
   *    overlap will eventually live.
   */
      union
      {
            struct unix_opt   af_unix;
  #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
          struct atalk_sock   af_at;
  #endif
  #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
          struct ipx_opt      af_ipx;
  #endif
  #ifdef CONFIG_INET
          struct inet_packet_opt  af_packet;
  #ifdef CONFIG_NUTCP
          struct tcp_opt      af_tcp;
  #endif
  #endif
      } protinfo;
  /*
   *    IP 'private area'
   */
      int                 ip_ttl;           /* TTL setting */
      int                 ip_tos;           /* TOS */
      struct tcphdr       dummy_th;
      struct timer_list   keepalive_timer;  /* TCP keepalive hack */
      struct timer_list   retransmit_timer; /* TCP retransmit timer */
      struct timer_list   delack_timer;     /* TCP delayed ack timer */
      int                 ip_xmit_timeout;  /* Why the timeout is running */
      struct rtable       *ip_route_cache;  /* Cached output route */
      unsigned char       ip_hdrincl;       /* Include headers ? */
  #ifdef CONFIG_IP_MULTICAST
      int                 ip_mc_ttl;        /* Multicasting TTL */
      int                 ip_mc_loop;       /* Loopback */
      char                ip_mc_name[MAX_ADDR_LEN]; /* Multicast device name */
      struct ip_mc_socklist   *ip_mc_list;      /* Group array */
  #endif

  /*
   *    This part is used for the timeout functions (timer.c).
   */
      int                      timeout;         /* What are we waiting for? */
      struct timer_list        timer;           /* This is the TIME_WAIT/receive
                                                 * timer when we are doing IP
                                                 */
      struct timeval           stamp;
   /*
    *    Identd
    */
      struct socket            *socket;
    /*
     *    Callbacks
     */
      void                     (*state_change)(struct sock *sk);
      void                     (*data_ready)(struct sock *sk,int bytes);
      void                     (*write_space)(struct sock *sk);
      void                     (*error_report)(struct sock *sk);

  };

  ()[in net/ipv4/udp.c]

  struct sock *udp_hash[UDP_HTABLE_SIZE];

  ()[in net/ipv4/tcp.c]

  struct sock *tcp_established_hash[TCP_HTABLE_SIZE];
  ...
  struct sock *tcp_listening_hash[TCP_LHTABLE_SIZE];
  ...
  struct sock *tcp_bound_hash[TCP_BHTABLE_SIZE];

  16.58.  sockaddr()

  [in include/linux/socket.h]

  struct sockaddr
  {
          unsigned short  sa_family;      /* address family, AF_xxx       */
          char            sa_data[14];    /* 14 bytes of protocol address */
  };

  16.59.  socket

  X socket f[^\̂́ABSD \PbgɊւێ̂
  BA͒PƂő݂̂ł͂ȂAVFS inode f[^\̂
  ꕔƂđ݂̂łB
  [in include/linux/net.h]

  struct socket {
    short                type;         /* SOCK_STREAM, ...             */
    socket_state         state;
    long                 flags;
    struct proto_ops     *ops;         /* protocols do most everything */
    void                 *data;        /* protocol data                */
    struct socket        *conn;        /* server socket connected to   */
    struct socket        *iconn;       /* incomplete client conn.s     */
    struct socket        *next;
    struct wait_queue    **wait;       /* ptr to place to wait on      */
    struct inode         *inode;
    struct fasync_struct *fasync_list; /* Asynchronous wake up list    */
    struct file          *file;        /* File back pointer for gc     */
  };

  16.60.  super_block()

  [in include/linux/fs.h]

  struct super_block {
          kdev_t s_dev;
          unsigned long s_blocksize;
          unsigned char s_blocksize_bits;
          unsigned char s_lock;
          unsigned char s_rd_only;
          unsigned char s_dirt;
          struct file_system_type *s_type;
          struct super_operations *s_op;
          struct dquot_operations *dq_op;
          unsigned long s_flags;
          unsigned long s_magic;
          unsigned long s_time;
          struct inode * s_covered;
          struct inode * s_mounted;
          struct wait_queue * s_wait;
          union {
                  struct minix_sb_info minix_sb;
                  struct ext_sb_info ext_sb;
                  struct ext2_sb_info ext2_sb;
                  struct hpfs_sb_info hpfs_sb;
                  struct msdos_sb_info msdos_sb;
                  struct isofs_sb_info isofs_sb;
                  struct nfs_sb_info nfs_sb;
                  struct xiafs_sb_info xiafs_sb;
                  struct sysv_sb_info sysv_sb;
                  struct affs_sb_info affs_sb;
                  struct ufs_sb_info ufs_sb;
                  void *generic_sbp;
          } u;
  };
  ...
  ...
  extern struct super_block super_blocks[NR_SUPER];

  16.61.  swap_control()

  [in include/linux/swapctl.h]

  typedef struct swap_control_v5
  {
          int     sc_max_page_age;
          int     sc_page_advance;
          int     sc_page_decline;
          int     sc_page_initial_age;
          int     sc_max_buff_age;
          int     sc_buff_advance;
          int     sc_buff_decline;
          int     sc_buff_initial_age;
          int     sc_age_cluster_fract;
          int     sc_age_cluster_min;
          int     sc_pageout_weight;
          int     sc_bufferout_weight;
          int     sc_buffer_grace;
          int     sc_nr_buffs_to_free;
          int     sc_nr_pages_to_free;
          enum RCL_POLICY sc_policy;
  } swap_control_v5;
  typedef struct swap_control_v5 swap_control_t;
  extern swap_control_t swap_control;

  [in mm/swap.c]

  /*
   * Constants for the page aging mechanism: the maximum age (actually,
   * the maximum "youthfulness"); the quanta by which pages rejuvenate
   * and age; and the initial age for new pages.
   */

  swap_control_t swap_control = {
          20, 3, 1, 3,            /* Page aging */
          10, 2, 2, 4,            /* Buffer aging */
          32, 4,                  /* Aging cluster */
          8192, 8192,             /* Pageout and bufferout weights */
          -200,                   /* Buffer grace */
          1, 1,                   /* Buffs/pages to free */
          RCL_ROUND_ROBIN         /* Balancing policy */
  };

  16.62.  swap_info_struct()

  [in include/linux/swap.h]

  struct swap_info_struct {
          unsigned int flags;
          kdev_t swap_device;
          struct inode * swap_file;
          unsigned char * swap_map;
          unsigned char * swap_lockmap;
          int lowest_bit;
          int highest_bit;
          int cluster_next;
          int cluster_nr;
          int prio;                       /* swap priority */
          int pages;
          unsigned long max;
          int next;                       /* next entry on swap list */
  };

  extern int nr_swap_pages;
  extern int nr_free_pages;
  extern atomic_t nr_async_pages;
  extern int min_free_pages;
  extern int free_pages_low;
  extern int free_pages_high;

  [in mm/swap.c]

  /*
   * We identify three levels of free memory.  We never let free mem
   * fall below the min_free_pages except for atomic allocations.  We
   * start background swapping if we fall below free_pages_high free
   * pages, and we begin intensive swapping below free_pages_low.
   *
   * Keep these three variables contiguous for sysctl(2).
   */
  int min_free_pages = 20;
  int free_pages_low = 30;
  int free_pages_high = 40;

  /* We track the number of pages currently being asynchronously swapped
     out, so that we don't try to swap TOO many pages out at once */
  atomic_t nr_async_pages = 0;

  16.63.  task_struct

  X task_struct f[^\̂́AVXéAЂƂ̃vZX
  ̓^XNɂċLq̂łB
  [in include/linux/sched.h]

  struct task_struct {
  /* these are hardcoded - don't touch */
    volatile long        state;      /* -1 unrunnable, 0 runnable, >0 stopped */
    long                 counter;
    long                 priority;
    unsigned             long signal;
    unsigned             long blocked;   /* bitmap of masked signals */
    unsigned             long flags;     /* per process flags, defined below */
    int errno;
    long                 debugreg[8];    /* Hardware debugging registers */
    struct exec_domain   *exec_domain;
  /* various fields */
    struct linux_binfmt  *binfmt;
    struct task_struct   *next_task, *prev_task;
    struct task_struct   *next_run,  *prev_run;
    unsigned long        saved_kernel_stack;
    unsigned long        kernel_stack_page;
    int                  exit_code, exit_signal;
    /* ??? */
    unsigned long        personality;
    int                  dumpable:1;
    int                  did_exec:1;
    int                  pid;
    int                  pgrp;
    int                  tty_old_pgrp;
    int                  session;
    /* boolean value for session group leader */
    int                  leader;
    int                  groups[NGROUPS];
    /*
     * pointers to (original) parent process, youngest child, younger sibling,
     * older sibling, respectively.  (p->father can be replaced with
     * p->p_pptr->pid)
     */
    struct task_struct   *p_opptr, *p_pptr, *p_cptr,
                         *p_ysptr, *p_osptr;
    struct wait_queue    *wait_chldexit;
    unsigned short       uid,euid,suid,fsuid;
    unsigned short       gid,egid,sgid,fsgid;
    unsigned long        timeout, policy, rt_priority;
    unsigned long        it_real_value, it_prof_value, it_virt_value;
    unsigned long        it_real_incr, it_prof_incr, it_virt_incr;
    struct timer_list    real_timer;
    long                 utime, stime, cutime, cstime, start_time;
  /* mm fault and swap info: this can arguably be seen as either
     mm-specific or thread-specific */
    unsigned long        min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
    int swappable:1;
    unsigned long        swap_address;
    unsigned long        old_maj_flt; /* old value of maj_flt */
    unsigned long        dec_flt;     /* page fault count of the last time */
    unsigned long        swap_cnt;    /* number of pages to swap on next pass */
  /* limits */
    struct rlimit        rlim[RLIM_NLIMITS];
    unsigned short       used_math;
    char                 comm[16];
  /* file system info */
    int                  link_count;
    struct tty_struct    *tty;           /* NULL if no tty */
  /* ipc stuff */
    struct sem_undo      *semundo;
    struct sem_queue     *semsleeping;
  /* ldt for this task - used by Wine.  If NULL, default_ldt is used */
    struct desc_struct *ldt;
  /* tss for this task */
    struct thread_struct tss;
  /* filesystem information */
    struct fs_struct     *fs;
  /* open file information */
    struct files_struct  *files;
  /* memory management info */
    struct mm_struct     *mm;
  /* signal handlers */
    struct signal_struct *sig;
  #ifdef __SMP__
    int                  processor;
    int                  last_processor;
    int                  lock_depth;   /* Lock depth.
                                          We can context switch in and out
                                          of holding a syscall kernel lock... */
  #endif
  };

  ...
  ...
  extern struct task_struct *task[NR_TASKS];
  ...
  extern struct task_struct *current_set[NR_CPUS];
  /*
   *      On a single processor system this comes out as current_set[0] when cpp
   *      has finished with it, which gcc will optimise away.
   */
  #define current (0+current_set[smp_processor_id()]) /* Current on this processor */
  extern unsigned long volatile jiffies;

  [in include/linux/tasks.h]

  #define NR_TASKS        512

  (: ȉ̃R[h́Apatch-1.3.99 œ܂A炭p
  Ƃ̂Ȃ܂܁Av2.2.0 ȍ~ŏłĂ܂B)
  [in kernel/sched.c]

  #ifdef PAST_2_0
      /* This process is locked to a processor group */
      if (p->processor_mask && !(p->processor_mask & (1<<this_cpu))
                  return -1000;

  16.64.  timer_list

  timer_list Ƃf[^\ɂāAvZX̃A^C^C}[
  ĂB
  [in include/linux/timer.h]

  struct timer_list {
    struct timer_list *next;
    struct timer_list *prev;
    unsigned long expires;
    unsigned long data;
    void (*function)(unsigned long);
  };

  16.65.  timer_struct()

  [in include/linux/timer.h]

  struct timer_struct {
          unsigned long expires;
          void (*fn)(void);
  };

  extern unsigned long timer_active;
  extern struct timer_struct timer_table[32];

  16.66.  tq_struct

  X̃^XNL[(tq_struct)f[^\̂́AL[ɓo^ꂽd
  ɊւێĂBʏ킱̃^XŃAfoCXhCo
  ƂĕKvȂ̂AɎsKv̂Ȃ^XNłB
  [in include/linux/tqueue.h]

  struct tq_struct {
      struct tq_struct *next;   /* linked list of active bh's */
      int sync;                 /* must be initialized to zero */
      void (*routine)(void *);  /* function to call */
      void *data;               /* argument to function */
  };

  16.67.  vfsmount()

  [in include/linux/mount.h]

  struct vfsmount
  {
     kdev_t mnt_dev;                 /* Device this applies to */
     char *mnt_devname;              /* Name of device e.g. /dev/dsk/hda1 */
     char *mnt_dirname;              /* Name of directory mounted on */
     unsigned int mnt_flags;         /* Flags of this device */
     struct semaphore mnt_sem;       /* lock device while I/O in progress */
     struct super_block *mnt_sb;     /* pointer to superblock */
     struct file *mnt_quotas[MAXQUOTAS]; /* fp's to quotafiles */
     time_t mnt_iexp[MAXQUOTAS];     /* expiretime for inodes */
     time_t mnt_bexp[MAXQUOTAS];     /* expiretime for blocks */
     struct vfsmount *mnt_next;      /* pointer to next in linkedlist */
  };

  [in fs/super.c]

  static struct vfsmount *vfsmntlist = (struct vfsmount *) NULL,
                         *vfsmnttail = (struct vfsmount *) NULL,
                         *mru_vfsmnt = (struct vfsmount *) NULL;

  16.68.  vm_area_struct

  X vm_area f[^\̂́AvZX̉zGALq
  ̂łB
  [in include/linux/mm.h]

  struct vm_area_struct {
    struct mm_struct * vm_mm;  /* VM area parameters */
    unsigned long vm_start;
    unsigned long vm_end;
    pgprot_t vm_page_prot;
    unsigned short vm_flags;
  /* AVL tree of VM areas per task, sorted by address */
    short vm_avl_height;
    struct vm_area_struct * vm_avl_left;
    struct vm_area_struct * vm_avl_right;
  /* linked list of VM areas per task, sorted by address */
    struct vm_area_struct * vm_next;
  /* for areas with inode, the circular list inode->i_mmap */
  /* for shm areas, the circular list of attaches */
  /* otherwise unused */
    struct vm_area_struct * vm_next_share;
    struct vm_area_struct * vm_prev_share;
  /* more */
    struct vm_operations_struct * vm_ops;
    unsigned long vm_offset;
    struct inode * vm_inode;
    unsigned long vm_pte;      /* shared mem */
  };

  16.69.  vm_operations_struct()

  [in include/linux/mm.h]

  struct vm_operations_struct {
      void (*open)(struct vm_area_struct * area);
      void (*close)(struct vm_area_struct * area);
      void (*unmap)(struct vm_area_struct *area, unsigned long, size_t);
      void (*protect)(struct vm_area_struct *area, unsigned long, size_t,
                  unsigned int newprot);
      int (*sync)(struct vm_area_struct *area, unsigned long, size_t,
                  unsigned int flags);
      void (*advise)(struct vm_area_struct *area, unsigned long, size_t,
                  unsigned int advise);
      unsigned long (*nopage)(struct vm_area_struct * area,
                  unsigned long address, int write_access);
      unsigned long (*wppage)(struct vm_area_struct * area,
                  unsigned long address, unsigned long page);
      int (*swapout)(struct vm_area_struct *,  unsigned long, pte_t *);
      pte_t (*swapin)(struct vm_area_struct *, unsigned long, unsigned long);
  };

  16.70.  wait_queue()

  [in include/linux/wait.h]

  struct wait_queue {
          struct task_struct * task;
          struct wait_queue * next;
  };

  17.  LvȃEFu FTP TCg

  ȉł́A֗ȃEFuTCg FTP TCgɂďqׂB

     http://www.azstarnet.com/~axplinux/
        ́ADavid Mosberger-Tag  Alpha AXP Linux ̃EFuTCg
        ŁAAlpha AXP HOWTO ׂ̂ĂW܂ꏊłB܂A
        ́ACPU ̃f[^V[gƂ Linux  Alpha AXP ɌŗL̏
        ւcȃNWB (: 
        ́Ahttp://www.alphalinux.org/ Ƀ_CNg܂B)

     http://www.redhat.com/
        Red Hat ̃EFuTCgB̗LvȃNB

     ftp://sunsite.unc.edu/
        ̃t[\tgW߂W[TCgBLinux ŗL̃\tgEF
        ÁA pub/Linux ɂB

     http://www.intel.com/
        Intel ̃EFuTCgBIntel `bv̏TƂɕ֗łB

     http://www.ssc.com/lj/index.html
        Linux Journal ́Aɂ΂炵 Linux GłB̗Dꂽ
        ĹANԍwǂēǂނɒlB
        (: ݂́Ahttp://www2.linuxjournal.com/ ƂȂĂ܂B)

     http://www.blackdown.org/java-linux.html
        Linux ł Java ɊւvC}TCgB

     ftp://tsx-11.mit.edu/ftp/pub/linux/
        MIT  Linux FTP TCgB

     ftp://ftp.cs.helsinki.fi/pub/Software/Linux/Kernel/
        Linux ̃J[l\[XB
        (: ݂́Ahttp://www.kernel.org/ ƂȂĂ܂B)

     http://www.linux.org.uk/
        UK Linux [UO[vB

     (http://sunsite.unc.edu/mdw/linux.html)
        http://www.linuxdoc.org/ (: ݂̃y[WłB)" Linux
        Documentation Project ̃z[y[WB

     http://www.digital.com/
        Digital Equipment Corporation ̃CTCgB (DEC  Compaq 
        ꂽ߁ACompaq ̃TCgɃ_CNg܂B)

     http://altavista.digital.com/
        DEC  Altavista T[`GWBEFuƃj[XO[vɊւ
        ɂ́A悢ꏊłB

     http://www.linuxhq.com/
        Linux HQ EFuTCgɂ́Aє̍ŐVpb`u
        ĂBȊOɂAAhoCX⃊N̂ŁA莝̃VX
        eɍłKJ[l\[X肵ꍇɖɗ
        B(: lɁA http://www.kernelnotes.org/ 
        B)

     http://www.amd.com/
        AMD ̃EFuTCg

     http://www.cyrix.com/
        Cyrix ̃EFuTCgB

     http://www.arm.com/
        ARM ̃EFuTCgB

     ȉ́A󒍂łB

     http://www.linux.or.jp/link/kernel.html
        u{ Linux vɂJ[l֌W̃NW

     http://jungla.dit.upm.es/~jmseyas/linux/kernel/hackers-docs.html
        J[l֘ÃNW
     http://www.linux.or.jp/JF/
        JF z[y[W

     http://www.gnu.org/home.ja.html
        { GNU z[y[W

     http://arashi.debian.or.jp/~mhatta/fdl.ja.txt
        GNU Free Documentation License(GNU FDL)̓{

  18.  LDP 錾(LDP Manifesto)

  ȉ́ALinux Documentation Project(LDP) ́uӐ錾(Manifesto)vł
  B

  (: ł́A1998 N 9  21 s Michael K. Johnson ɂ
  LDP Manifesto LڂĂ܂A|󎞂ł͊ɍXVĂ̂ŁA
  ŐVłfڂ܂B)

  ===============

  : David S. Lawyer (dave@lafn.org)
  ŏI: 2000N718

  ́̕ALinux Documentation Project ̖ڕWƌA쐬̕@A
  уCZXɂďqׂ̂łB

  18.1.  Tv

  Linux Documentation Project ́AGNU/Linux Iy[eBOVXeɂ
  Ă̗ǎŃt[ȕJ邽߂ɊĂ܂BLDP ̍ő̖
  ÍALinux Ɋւ邷ׂĂ̎̕Aŉi߂邱Ƃ
  BHOWTO  Guide ̍쐬ɂ܂Bɂ́AȒP
  pƌł镶VXe\zƍlĂ܂Bman y[W
  info AHOWTO ̑̓͂ɂ܂B

  LDP ̃S[́ALinux Ɋւ鐳ȃt[̃Zbg邱ƂłB
  ICł(_E[h\)́ALinux ܂E̗lX
  ωɑΉĕpɂɃAbvf[głƂ_܂A
  ́AItCœǂނ߂ CD-ROM ꂽЂƂĂ
  ƍlĂ܂B LDP ̏̕ołɋ́A``uLDP 
  ̏oŁv''B

  LDP ́A{IɃ{eBAɂɂ₩ȋ̂łAŏ̒g
  DĂ܂B^cɋ̂́A񊈓ɎQĂ
  B́AQ҂CtH[}ɋA[OXgŋc_
  邱ƂAŗǂ̂łƎvĂ܂BӌHႤƂ́A
  ̍l̈Ⴂ𗝉A[̂ӂɒB悤ɂĂ܂B

  18.2.  ݂̃vWFNgƂ̎Q@

  ݂ LDP ̎vȊ́AHOWTO ƂłB炩 HOWTO 
  Ǝvꍇ́Aɓ̃gsbNȂǂ܂`FbNĂ
  Bɑ݂Ƃ́Å̕Ǘ҂ɘAāA菕
  \ô悢Ǝv܂BHOWTO Ȃꍇ́AVK HOWTO ̍쐬
  l邱ƂɂȂł傤BڍׂɂẮALDP Author Guide (ȑO
  HOWTO-HOWTO ƌĂ΂Ă̂ł)  HOWTO-INDEX B

  Guide ́AVXeǗȂǂ̕LgsbNЃTCY LDP 
  łB́AC vO~OfoCX man y[WǗĂ
  ܂B

  ɂAHOWTO ̊ԈႢsmȂƂ̃`FbNAEFuTCg̉
  PA Linux ̓VXe̊JƂd܂B
  (HOWTO ̎MȊO)vWFNgɋ΁A݂ LDP R[fB
  lC^[ł Guylhem Aznar ( guyhem@metalab.unc.edu )ƘA
  ALDP  feedback@@linuxdoc.org Ƀ[𑗂ĂB

  18.3.  LDP EFuTCg

  LDP ɂ́AE 250 ȏ̃~[TCĝŁA LDP 
  ̌_E[h\łBCTCg
  ́Ahttp://www.linuxdoc.org łBŃ~[TCg̃Xg
  āA߂̃~[TCg𗘗pĂB

  18.4.  쐬̕@

  ȉ́ALDP ŌݗpĂ񑩂ƂłBƂ͈قȂ@
  VKƂꍇ́A܂̃vɋĂ
  B

  o  ׂĂ HOWTO ́ALinuxDoc  DocBook ̂ǂ炩 SGML tH
     [}bgō쐬Kv܂BLinuxDoc ̂قVvł
     ADocBook ́A@\ǉĂ̂ł╡GłB

  o  Guide ́ALDP 쐬SȏЂłAɈړIƂ
     Ȃ̂ŁÂ LaTeX `ɂȂĂ܂BAGuide ̒҂
     ́ADocBook DTD g SGML `ɈڍsĂ܂BDocBook DTD 
     AɂICɂΉAlXȏo͌`̕쐬ł
     邩łBLaTeX gꍇ́AX^Ct@ĈŁA
     gΈ̑̍قɊւđ LDP Ƃ̐ێł܂B

  o  man y[ẂAUnix ̕WIȃIC}jAȂ̂ŁAUnix ̕W
     ł nroff man (邢́ABSD mdoc )}Nō쐬܂B

  18.5.  CZX̕Kv

  NłALDP (邢́AȊO LDP ̐)A郁fBA
  tH[}bgŁAzz(̔An)邱ƂłȂ΂Ȃ܂
  B҂ɒ엿xȂĂ悢ƂKvłBCӂɕύX
  邱Ƃ܂ł͗vĂ܂񂪁A͂Ă܂B

  L̏𖞂Ǝ̃CZXt邱Ƃł܂A\ߗp
  ӂꂽCZXgƂ\łBLDP ł́ARɗpł郉C
  ZX̒^pӂĂ܂BGPL 𗘗p悤Ƃl܂A
  ŃCZXl܂Bp GPL 쐬悤Ƃ
  vWFNgisȂ̂ŁÃCZXg炭ɑÓ
  ȑIƂȂł傤B (:  GFDL ̖̂œ肪\łB{
  ``uEFu FTP TCgv''QƂĂB)

  X̃̕Rs[Cgɂ́AvȒ҂̖OLĂB"The
  Linux Documentation Project" ́AȌÂł͂Ȃ̂ŁARs
  [Cgێ҂ƂĂ͎gpł܂B

  18.6.  CZX̒^

  ȉ́A쌠\̃TvƃCZX̒^ł̂ŁAiɑ
  Ďgp邱Ƃł܂B(: CZX͌ƕLĂ܂B)

  Copyright (c) 2000 by John Doe (Ȃ̖OɕςĂB)

  Please freely copy and distribute (sell or give away) this document in
  any format. It's requested that corrections and/or comments be
  fowarded to the document maintainer. You may create a derivative work
  and distribute it provided that you:

  ́̕ACӂ̃tH[}bgŁARɕy(̔nɂ)zz
  \łBȂтɃRǵAǗ҈Ăɂ肭B
  I앨̍쐬Ƃ̔zźAȉ̏𖞂苖܂B

  1. Send your derivative work (in the most suitable format such as
     sgml) to the LDP (Linux Documentation Project) or the like for
     posting on the Internet. If not the LDP, then let the LDP know
     where it is available.

     쐬񎟓I앨́A(SGML Ȃǂ̍œKȃtH[}bg)C^[
     lbg LDP (Linux Documentation Project) ɗނĉ܂
     t邱ƁBLDP ȊOɑtƂ́Aǂœ\ LDP ɒm
     点邱ƁB

  2. License the derivative work with this same license or use GPL.
     Include a copyright notice and at least a pointer to the license
     used.

     񎟓I앨ɂ͂̕Ɠ̃CZX GPL t^邱ƁB
     ɂ́A쌠\Ay(gpCZX̑S͑Sfڂ
     łȂꍇ)ȂƂ̃CZXQƂł|C^܂߂
     ƁB

  3. Give due credit to previous authors and major contributors.

     i̒ҕтɎvȍv҂̎𖾋L邱ƁB

  If you're considering making a derived work other than a translation,
  it's requested that you discuss your plans with the current
  maintainer.

  |ȊO̓񎟓I앨̍쐬lĂꍇ́A݂̕Ǘ҂Ƃ
  vɂĘbĂB

  18.7.  LDP ̏o

  ȂALDP ̔zz(o)Ɋ֐SoŎЂ̕ȂAȉ
  ǂ݉B

  LɎCZXvɏƂ炵āANł LDP ̒Io
  łzz邱Ƃ\łB킴킴߂Kv͂܂B
  A LDP ɊÂ|񎟓I앨zz悤ƂĂꍇ́A
  CZXKvƂAzzOɒ҂ƘAċ𓾂
  Kv܂B

  cړI LDP ̔邱ƂA\łB́A
  ė~ƍlĂ܂BALDP ͎RȔzz\Ȃ̂ŁAN
  𕡐Azzł邱Ƃɂ͗ӂĂBāAR
  Rs[ꂽ̖{̈ꕔ́A̒̕쌠NQ邱ƂȂARs[
  ₷ʂ̎̂Ƃėʂ\܂B

  ́ALDP ̔̔œ炩̗v璘쌠x悤v
  ͂܂BAcړI LDP ̔ꍇ́A҂ɒ
  񋟂邩A̎v̈ꕔ𒘎҂ LDP ŚA邢 Linux R~
  jeB[Ɋt邱ƂĂƎv܂B̔Ă LDP 
  t[Rs[҂ɑt悤ƎvȂł傤BLDP 
  Linux R~jeB[ɑ΂ĂȂT|[ǵAɍ]
  󂯂ł傤B

  ́ALDP ̏ołzz̃vꍇ́Am点Ăق
  vĂ܂Bǂ`œ\ɂȂ̂m肽łB LDP
  ołĂꍇA邢͏ołv悵Ăꍇ́A
  feedback@linuxdoc.org ܂Ń[ŘAĂBNĂ
  m肽̂łB

  ́ALinux \tgEFA̔zzA\tgEFAƈꏏ CD-ROM
  ŁA LDP zz悤肢Ă܂BLDP ́Au
  ȁvLinux Ƃėp邱ƂӐ}̂ł̂ŁAzz\
  tgEFA LDP ohĂ̂̂y݂Ȃ̂łB

  19.  The GNU General Public License

  ȉ́̕AGNU General Public License (GPL  copyleft) ł
  A Linux ͂̃CZXɏ]ĂBɋLڂ
  ́ALinux ̒쌠̓eɊւ邢̌߂łBLinux
  ́AVFAEFAłApubNhC\tgEFAłȂBLinux J
  [l̑唼́A1993 N Linus Torvalds 쌠擾ĂA
  ȊÕ\tgEFAJ[l̕ɂĂAꂼ̍쐬҂쌠
  ĂBāALinux ́A쌠̐ݒ肳ꂽ\tgEFAł
  ȀŁAȉɎ GPL ̏̂ƂɍĔzz\Ȃ̂łB

  (: ȉ́A
  <ftp://ftp.sra.co.jp/pub/gnu/local-fix/GPL2-j/gpl.text.gz>ɂnM
  VAnbq̓{ƂČJĂ̂؂肵܂
  B GNU ̑̕ɊւẮA``uEFu FTP TCgv'' 
  B܂ GPL |󂵂Ă̎ԈႦĂ܂B
  lтƂƂɁAL̂悤ɒ܂(2001/07/22))

                              GNU  ʌLgp
                              =======================

                               1991 N6 Co[W2

                  Copyright (C) 1989,1991 Free Software Foundation, Inc.
                       675 Mass Ave, Cambridge, MA 02139, USA

  lAȉ̓eύXȂł̂܂ܕʂꍇɌA{gp
  𕡐Еz邱Ƃł܂B

  ͂߂
  --------

  قƂǂ̃\tgEFA̎gṕA\tgEFALAύX郆[
  U̎RDƂӐ}Ă܂Bɑ΂āAXGNU ʌLg
  ṕAt[E\tgEFALύX鎩R[Uɕۏ؂
  邽߂̂́At[E\tgEFÃ[USĂɂƂăt[
  邱Ƃۏ؂邽߂̂̂łB{gṕAFree Software
  Foundation ̂قƂǑSẴ\tgEFAɓKp邾łȂAvO
  ̍쐬҂{gpɈ˂Ƃꍇ̂̃vOɂKp邱
  Ƃł܂B(̑Free Software Foundation ̃\tgEFÂ
  ́A{ł͂ȂAGNU CuʌLgpŕی삳
  B) Ȃ͎̃vOɂKpł܂BXt[E\
  tgEFAɂČꍇ͎R̂ƂɌyĂ̂łāAi
  Ƃł͂܂BẌʌLgp̊éA̎m
  邱ƂړIƂėĂĂ܂B

  o  t[E\tgEFA̕RɔЕzł邱(āA]ނȂ
     Ȃ̂̃T[rXɑ΂đΉ𐿋ł邱)B

  o  \[XER[hۂɎ󂯎邩A邢́A]΂
     肷邱Ƃ\ł邱ƁB

  o  肵\tgEFAύXAVt[EvÖꕔ
     Ďgpł邱ƁB

  o  ȏ̊eesȂƂłƂƂ[UgmĂ
     ƁB

  ̂悤ȃ[Ǔ邽߂ɁAX́Aľے肵
  A邢͕悤Ƀ[Uɋ߂邱Ƃ͂łȂƂ
  ݂Kv܂B̐́A[UAt[E\tg
  EFA̕ЕzύX悤Ƃꍇɂ́Ã[Ug
  ׂ`ƂȂ܂BႦ΁AȂt[E\tgEFA̕
  ЕzꍇALɂ炸AȂ͎̎Ă錠
  Sđɗ^Ȃ΂Ȃ܂BȂ́A܂\[XER[h
  󂯎łƂƂF߂Ȃ΂Ȃ܂BɂȂ
  ́Aނ炪̌m悤ɁȀm炵߂Ȃ΂
  ܂B

  X͎̂Q̕@Ń[Ǔ܂B(1) \tgEFAɒ쌠
  咣A(2) {gp̏̉Ń\tgEFA𕡐EЕzEύX
  [Uɗ^܂B

  ܂Ae쐬҂Xg邽߂ɁA{t[E\tgEFAۏ؂
  邱ƂSĂ̐lXĂKv܂BɁA̒N
  ĕύXꂽ\tgEFAЕzꂽꍇA̎҂͂̃\tgEFA
  IWiEo[Wł͂ȂƂƂm炳Kv܂B
  ́Al̊֗^ɂČJ҂ɑ΂]eȂ悤ɂ
  ߂łB

  ŌɁAǂ̃t[EvO\tgEFAɐ₦Ă
  BX́At[EvO̍ĔЕz҂lIɓ擾A
  セ̃vO̍YɂĂ܂Ƃ댯ƊĂ
  ܂Bh߂ɉX́A̓ANłRɎgpł
  ɎgpׂA邢͉lɑ΂ĂSgpȂ́A
  ꂩɂׂł邱Ƃ𖾂炩ɂĂ܂B

  ʁEЕzEύXɑ΂鐳mȏƏɎ܂B

  GNU ʌLgp̉ł̕AЕzAύXɊւƏ
  ==============================================================

  1. {gṕA{ʌLgp̊eɏ]ĔЕzƂ
     쌠҂̍m\ĂvO₻̑̍쐬ɓKp
     ܂BȉɂāuvOvƂ́Â悤ȃvO
     ŵƂA܂AuvOvƂ́Aquv
     OvgA܂́A쌠@ɂSĂ̔hGȂ킿A
     ́uvOv̑S͈ꕔÂ܂ܖ͕ύXāA^
     ̌ɕϊāAɑgݍ񂾍쐬Ӗ܂B(ȉA
     ΐuύXvƂp̒ɖɊ܂܂̂Ƃ܂B) {g
     pɂċ󂯂҂uȂvƌĂт܂B

     AЕzAύXȊO̍sׂ͖{gp̑ΏۂƂ܂B͖{
     gp͈̔͊OłBuvOvssׂɊւĐ
     ܂BuvOv̏o͂́A( uvOvsč
     ǂƂ͖֌W) ̓euvOvł
     ꍇɌ{gp̑ΏۂƂȂ܂BꂪĂ͂܂邩ǂ́A
     uvOv̂Ɉ˂܂B

  2. Ȃ́Aǂ̂悤Ȕ}̏֕悤ƂꍇłĂA肵
     uvOṽ\[XER[ĥ܂܂̓eŕʂœK
     Ȓ쌠\ƕۏ؂̕𖾊mAKɕtLꍇɌA
     ͔Еz邱Ƃł܂B̏ꍇA{gpyіۏ؂Ɋւ
     Lڕ́ASČ̂܂܂̌`ŕ\ĂB܂AuvO 
     v̔Еzɑ΂ẮAuvOvƋɖ{gp̎ʂn
     ĂB̈nɗv͐邱Ƃł
     B܂AȂƎ̕ۏ؂sȂꍇ͂LƂ邱Ƃł
     ܂B

  3. ̊eSĖĂAȂ́AuvOv͂
     ꕔύXāuvOvƂ邱ƂłAɁAύX
     łE쐬L 2 ɏ]ĕ͔Еz邱Ƃł܂B

     o  (a) t@CύX|Ƃ̕ύXƂAύXt@Cɖ
        mɕ\邱ƁB

     o  (b) ύXۂ킸A}uvOv͂̈ꕔ
        ɑgݍł邩͂ꂩhЕzꍇ
        ́ȂŜ{gp̏ɏ]đO҂֖Ŏgp
        ƁB

     o  (c) ύXvOsɒʏ̑ΘbIȕ@ŃR}h
        ނ悤ɂȂĂƂ΁Ałʂ̕@őΘbIɂ̃vO
        s鎞ɁA̓ev^ֈ󎚂邩A
        ͉ʂɕ\邱ƁB

        o  K؂Ȓ쌠\B

        o  ۏ؂ł邱(ȂƎɕۏ؂ꍇ́A̎|)B

        o  Еz󂯂҂A{gpƓ̏ɏ]āuvO
           vĔЕzł邱ƁB

        o  Еz󂯂҂{gp̎ʂQƂ@B

        (OƂāAuvOv̂͑ΘbIłĂN̕
        ʏ͈󎚂Ȃ̂Ȃ΁AȂ́uvOv͂̂悤
        ȕ󎚂Kv͂܂B)

     ̗v͕ύXꂽ쐬ɂSēKp܂B̕ύXł̈
     镔uvOv̔hł͂ȂAꎩ̓ƗňقȂ
     쐬ƍIɍlꍇAȂʂ̍쐬Ƃ
     ЕźA{gpƂ̏͂̕ɂ͓Kp܂
     BAuvOv̈ꕔƂĔЕzꍇ
     ́AŜ{gp̏ɏ]ĔЕzȂ΂Ȃ炸Agp
     󂯂鑼̑SĂ̎҂ɑ΂鋖vOŜɂ킽ė^
     Ȃ΂Ȃ炸AʂƂāANɂ炸ASĂ̕
     {gpKpȂ΂Ȃ܂B

     ̂悤ɁA{̈Ӑ}Ƃ́ASɂȂɂďꂽ
     쐬ɂāAvAȂƌ֌W𑈂Ƃł͂
     ܂Bނ낻̖ړÍA쐬uvOvłꍇ
     ɂ̔hW̔ЕzK邱Ƃɂ܂B

     ɁAuvOv(́uvOv) ƁuvO
     vƂ͂ȂȂ̃vOƂAPɕۊǂЕẑ߂ɓ̔}
     ̏ɂ܂Ƃ߂ċL^ƂĂA{gp͑̃vOɂ͓Kp
     ܂B

  4. Ȃ́Aȉ̂ꂩ1 𖞂AL2 yё3 
     ɏ]āuvOv(́AL3 ŌyĂuvO
     v)IuWFNgER[h͎s\Ȍ`ŕyєЕz邱
     Ƃł܂B

     o  (a) Ή@Bǂݎ\ȃ\[XER[hꎮꏏɈn
        ƁB̏ꍇÃ\[XER[ḧn͏L2 yё 3
        ɏ]āAʏ\tgEFǍɗp}̂ōsȂ邱
        ƁB

     o  (b) ȂƂ3 NԂ̗LԂ߁A̊ԓłΑΉ
        @Bǂݎ\ȃ\[XER[hꎮ̕A\[XЕzɊ
        ȏ̑Ήvɒ񋟂|Ayт̏ꍇɂ͏L
        2 yё3 ɏ]āAʏ\tgEFǍɗp}
        Œ񋟂|LڂʂAO҂ɈꏏɈnƁB

     o  (c) Ή\[XER[hЕz̐\oɍۂāAȂ
        ꏏɈnƁB(̑ÍAcړIƂȂЕz
        āAȂL (b) ɊÂāAIuWFNgER[
        h͎s\`̃vO肵ĂȂꍇɌKp
        IڂłB)

     ȂA\[XER[hƂ́AύXƂɓKLq`w܂B
     As\`̃t@CɑΉ\[XER[hꎮƂ́A
     ܂܂SW[ɑΉSẴ\[XER[hAyт
     ÃC^tF[X`t@CAyюs\ɂRpCƃC
     Xg[̐ɊւLqw܂BʂȗOƂāAs\
     ȃt@C삷Iy[eBOEVXe̎vȍ\vf(R
     pCAJ[lȂ) Ƌ(\[XER[h̓oCîǂ炩
     ) ЕzĂ̂ɂẮA̍\vf̂s`ɕt
     ĂȂꍇɌAЕz\[XER[hɊ܂߂Kv͂
     B

     s\`܂̓IuWFNgER[h̔ЕzAwꂽꏊ
     ̂̕߂̃ANZX̕^łꍇAꏊ̃\[XER
     [ĥ̕߂̓ȃANZX𕊗^΁AƂO҂ɃIu
     WFNgER[hƋɃ\[X̕ȂƂA\[XER[h
     ЕẑƂ݂Ȃ܂B

  5. {gpIɋĂꍇAȂ́AuvO
     v𕡐AύXATuCZXAЕz邱Ƃł܂B{gp
     ɏ]킸ɁuvOv𕡐AύXATuCZXAЕz
     ƂśׂAꎩ̂łAA{gpȂɋ
     ĂuvOv̌Iɏł܂B̏ꍇA{
     gpɏ]ĂȂ畡₻̌𓾂ĂO҂́A{g
     pɊSɏ]ĂꍇɌALȎgp
     Ƃ܂B

  6. Ȃ͂܂ӂ̈ƂďĂȂ̂ŁA{gp󂯓
     Kv͂܂BAȂɁuvOv͂̔h
     ύX͍ĔЕz鋖^͖̂{gpȊOɂ͂܂B
     ̍śׂAȂ{gp󂯓Ȃ̂ł΁A@
     ɂċւ܂B]āAȂuvOv(́uvO
     v) ̕ύX͔Еzs΁Aꎩ̂łȂ͖{gp
     󂯓AAuvOv͂́uvOv̕
     AЕzAύXɊւ邱̏Ə̑SĂ󂯓ꂽƂ
     ܂B

  7. ȂuvOv(͂́uvOv) ĔЕz
     IɁA̎̎҂́A̎gp҂A{gp̏ɏ]
     āuvOv𕡐AЕzAύX邱ƂeƂgp
     ̂Ƃ܂BȂ́A̎҂ɋꂽ̍sgɂāA
     ɐ邱Ƃ͂ł܂BȂɂ́AO҂ɖ{gp
     ̎󂯓ӔC͂܂B

  8. ٔ̔A͓NQ̐\āA(ɌȂ) 
     ̗ŘʂƂāAȂɉۂꂽ{gpƑ
     ̂łƂĂ(̖ٔ߁A_Ȃɂ̂ł
     )A{gp̏Ə̂ł͂܂B{gpɂ
     ӖƁȂ̉炩̊֘AӖ𓯎ɖԗlŔЕz邱
     łȂȂ΁AȂ́uvOvSЕzĂ͂܂
     BႦ΁A̓eAȂ璼ږ͊Ԑڂɕ󂯎
     SĂ̐lɎgp̂ȂvO̍ĔЕzȂ̂ł΁A
     Ȃ̗vƖ{gp̗𖞑@́A
     uvOv̔ЕzSɒfO邱ƂłB

     {̈镔炩̓ʂȏ󋵉Ŗ܂͓Kps\ɂȂ
     ꍇA{̂̑̎c̕Kp悤ɈӐ}Ă
     A܂A{͑ŜƂĂ̑̏󋵂ɓĂ͂܂悤ɈӐ}
     Ă܂B
     {̖ړÍA₻̑̍YNQÂ悤Ȍ
     Â咣̑Ó𑈂悤ɂȂɊ߂邱Ƃł͂܂B{
     ̗B̖ړÍAt[E\tgEFA̔ЕzVXe̊S
     邱ƂŁA͌Lgp̎Hɂės܂B̐lX
     ÃVXëтKpMāÃVXeʂĔЕz
     Ă镝L͈͂̃\tgEFAɐɂ݂ȂvĂ܂
     B쐬҂񑡎҂̉炩̃VXeʂă\tgEFAЕz
     ƌ߂邱Ƃ͔ނ̎RӎułAgp󂯂҂͂
     I邱Ƃ͂ł܂B

     {́A{gp̑̏̈Ӗeł邩Sɖ炩
     ɂ邱ƂӐ}Ă܂B

  9. uvOv̔ЕzEgpA鍑ɂē͒쌠ŕی삳
     ꂽC^tF[X̂ǂ炩ŐꍇAuvOv{g
     pɂ쌠ێ҂́A̍O|̖IȔЕz
     n搧AȊO(OȂ) Ɍ肵ĔЕz
     悤ɂ邱Ƃł܂B̂悤ȏꍇA̐{gp̖{
     ɂĂ邩̂悤ɖ{gp̒ɑgݓ
     ̂Ƃ܂B

  10.
     Free Software Foundation ͐A{ʌLgp̉ŁA͐V
     ł\邱Ƃ܂B̂悤ȐVo[ẂAs̃o
     [WƊ{IɕςƂ͂܂񂪁AV⌜Ď
     ɑΉ邽߂ɍוł͈قȂ邩܂B

     eo[ẂAo[Wԍɂċʂ܂BuvOv
     ɖ{gp̃o[Wԍ̎w肪ꍇ́A̎w肳ꂽo[
     WA͂̌ Free Software Foundation \Ă
     ꂩ̃o[W1 IāȀƏɏ]Ă
     BuvOvɖ{gp̃o[Wԍ̎w肪Ȃꍇ
     ́AFree Software Foundation \ǂ̃o[WłI邱
     Ƃł܂B

  11.
     uvOv̈ꕔЕz̈قȂ鑼̃t[EvOɑg
     ݂ꍇ́ÅJ҂ɏʂŋ߂ĂBFree
     Software Foundation 쌠Ă\tgEFAɂ
     ́AFree Software Foundation ֏ʂoĂB̂悤ȏ
     ɑΉ邽߂ɉX͗OI邱Ƃ܂A̔f
     ƂȂ̂́A2 ̖ڕW̎ɍv邩ۂƂ_łB
     AP͉X̃t[E\tgEFȂSĂ̔ht[ȏ
     ɕۂƂłAP̓\tgEFA̋LƍėpƂLi
     邱ƂłB

     ۏ ------

  12.
     uvOv͖Ŏgp܂̂ŁAKp@߂͈͓̔ŁA
     uvOv̕ۏ؂͈؂܂B쌠҂₻̑̑O҂͑S
     ۏ؂Łû܂܁v̏ԂŁAAÖقł邩킸
     ؂̕ۏ؂ȂŒ񋟂̂Ƃ܂Błۏ؂Ƃ́As
     ړIKɂĂ̈Öق̕ۏ؂܂܂܂AɌ肳
     ̂ł͂܂BuvOv̕i␫\ɊւSẴ
     XN͂Ȃ̂Ƃ܂BuvOvɌׂƂ킩
     ꍇAɔ؂̔hpCEɗvp͑SĂ
     ̕SƂ܂B

  13.
     Kp@߂̒߁A͏ʂɂ鍇ӂꍇA쌠҂L
     󂯂āuvOv̕ύXEĔЕzׂO҂́Auv
     OvgpƁA܂͎gpłȂƂɋN؂̑Q
     ɂĉ̐ӔC܂B쌠҂OL̑O҂Â悤
     ȑQ̔\ɂĒm炳ĂꍇłlłB
     AłQɂ͒ʏ푹QAʑQAQAԐڑQ܂
     ܂(f[^̏A͂̐m̑rAȂO҂
     ÃvOƂ̃C^tF[X̕sKA܂܂܂A
     Ɍ肳̂ł͂܂)B

     ȏ

  
  ****

  p(GNU General Public Licence) 𐳎ƂB̘a
  ٌm̈ӌ̂āAł邾mɉp|󂵂̂ł
  A@IɗLȌ_񏑂ł͂ȂB

  â̍ĔzzɊւ
  ****************************

  Ȃ}̂łׂ̏ĖĂꍇɌA{a
  ̂܂ܕʂzz邱ƂB܂AȂ͑O҂ɑ΂Ė{
  mƓ̋^ꍇɌAĔzz邱ƂĂ
  B

  o  ́AzzꂽRs[ɒ쌠\і{mOčڂ
     Ă邱ƁB

  o  Rs[̎̎҂ɍĔzzꍇA̔zz҂{mƓ
     ^Ă邱ƁB

  o  a̖{ςȂƁB

  Ȃ̐VvOɂ̏Kp@
  ====================================================

  ȂVvO쐬Apɋꍇ́AvO
  t[E\tgEFAɂāASĂ̐lXȏ̊eɏ]Ă
  ĔЕzύX邱Ƃł悤ɂ̂ŗǂ̕@łB

  邽߂ɂ́AvOɈȉ̕\ĂB̏ꍇA
  ؂łƂƂłʓIɓ`邽߂ɁA\[XEt@C̖`
  ̑S\΍łSłȂ̕@ŕ\ꍇłA
  u쌠\vƑSǂݏõׂAhXւ̃|C^̓t@C
  ɕ\ĂĂB

       vOƂǂȓ̂ɂĂ̊ȒPȐ̍s
       ------------------------------------------------------------
       Copyright (C) 19 NA쌠Җ
                                ----------

       {vO̓t[E\tgEFAłBȂ́AFree Software Foundation
       \GNU ʌLgṕuo[WQv͂ȍ~̊eo[W
       ̒炢ꂩIÃo[W߂ɏ]Ė{vO
       ĔЕz܂͕ύX邱Ƃł܂B

       {vO͗LpƂ͎v܂AЕzɂẮAsꐫyѓړIK
       ɂĂ̈Öق̕ۏ؂܂߂āAȂۏ؂sȂ܂BڍׂɂĂ
       GNU ʌLgpǂ݂B

       Ȃ́A{vOƈꏏGNU ʌLgp̎ʂ󂯎Ă
       ͂łBłȂꍇ́AFree Software Foundation, Inc., 675 Mass Ave,
       Cambridge, MA 02139, USA ֎莆ĂB

  ܂A[UdqC⏑MłȂƘAƂ@ɂĂ̏
  YĂB

  vOΘbIɓ삷ꍇ́AΘb[hŋNɎ̂悤
  Zm\悤ɂĂB

       Gnomovision o[W69ACopyright (C) 19 N쌠Җ
                                                        ----------
       Gnomovision ͊Sɖۏ؂łBڍׂ show w ƃ^CvĂB
       t[E\tgEFAȂ̂ŁȀ̉łĔЕz邱Ƃł܂B
       ڍׂ show c ƃ^CvĂB

  Lshow w show c ͊eXA{ʌLgp̊֘A镔\
  R}hw܂BAȂg̃R}hshow w
  show c ƂĂіłȂĂ\܂BɁÃR}h
  ͂Ȃ̃vOɍ킹ׂɁA}EXŃNbN胁j[`
  ɂ邱Ƃł܂B

  ܂AKvƔF߂ꍇɂ́AȂ̌ق(ȂvO}Ƃē
  Ăꍇ) ݐЂwZÃvOɑ΂u쌠v
  F߂̏ʂ肵ĂBɂ̕ڂ܂B
  O͕ςĂB

       Yoyodyne, Inc. ́AJames Hacker JvO`Gnomovision' (RpC
       ɂȂvO) ɂĂ̒쌠@̑SĂ̌B

       Ty Coon ̏, 1 April 1989
       --------------
       Ty Coon, В

  {ʌLgṕAȂ̃vOY̑ΏۂƂȂĂ鑼
  vOɑgݍނƂ͔F߂Ă܂BȂ̃vOTu[
  `ECułāAȂ̃CuY̑ΏۂƂȂ
  鑼̃AvP[VƃN邱ƂɂāAɗLpȂ̂
  悤Ƃꍇɂ́A{gp̑ɁAGNU CuʌLg
  pɏ]ĂB
  20.  pW

     Argument
        ֐⃋[`͏nB

     ARP
        Address Resolution Protocol. IP AhX𕨗n[hEFAAh
        Xɕϊ邽߂ɎgpB

     Ascii
        American Standard Code for Information Interchange. At@xb
        ǧX́̕A8 rbgR[hŕ\BAscii ́Aꂽ
        ۑ̂ɍłpɂɗpĂB(: Ascii R[h
        ́A7 rbgłB)

     Bit
        1  0 (IIt)\ŏPʂ̃f[^B

     Bottom Half Handler
        J[lő҂sɓo^ꂽd郋[`B

     broadcast address()
        ()Â̌nɂ́AI[[u[hLXgƂ
        łB݁AׂẴrbg 0 ̏ꍇ́AzXg\
        Bȉ́A RFC 1700 ̏łB

           IP-address ::= { <Network-number>, <Host-number> }
               or
           IP-address ::= { <Network-number>, <Subnet-number>, <Host-number> }

        ܂A"-1" Ƃ\LgꍇAtB[hɂׂărbg 1 ܂܂
        ƂӖB悭pP[XɎ̂悤Ȃ̂B

           (a) {0, 0}
             ̃lbg[N̂̃zXgBMAhXƂĂ̂݁AgpłB
        ...

           (c) { -1, -1}

             ꂽu[hLXgBMAhXƂĂ̂݁AgpłB
             ̃AhXtꂽf[^ÓAM(Tu)lbg
             OɃtH[hĂ͂ȂȂB

           (d) {<Network-number>, -1}
             u[hLXǵAw肳ꂽlbg[NɑBMAhX
             ƂĂ̂݁AgpłB

           (e) {<Network-number>, <Subnet-number>, -1}
             u[hLXǵAw肳ꂽTulbgɑBMAhX
             Ă̂݁AgpłB

           (f) {<Network-number>, -1, -1}
             u[hLXǵATulbgꂽlbg[Nׂ̂ẴTulb
             gɑMBMAhXƂĂ̂݁AgpłB

     (RFC 1700 <http://www.ring.gr.jp/archives/doc/RFC/rfc1700.txt>,
     J.Postel, October 1994)
     buddy algorithm(buddy system)()
        ũVXeł́A蓖ĂubÑTCY 2 ̗ݐ
        Ȃ΂ȂȂ (Ȃ킿A4 oCgA8 oCgA16 oCgA32 o
        CgȂ)B܂Aŏ̊蓖ăTCYႦ 8 oCgƂ
        Ɍ܂ĂBubŃAyAŏBeubNɂ́A
        ЊAƁu_(buddy, AJ̌ŁAuFBv
        B󋵂ɂẮuGvӖ邱Ƃ)v݂B
        (p.119, uUnix J[l̖@vAB.Goodheart, J.Cox, NMi
        , veBXz[, 1997)

     Byte
        8 rbg̃f[^B

     C  vO~OBLinux J[l̑啔 C ŏ
        B

     CISC
        Complex Instruction Set Computer. RISC ̔ΊTOBɑ
        ́A΂ΕGȃAZu߂T|[gvZbTBx86 A
        [LeN` CISC A[LeN`łB

     CPU
        Central Processing Unit. Rs[^̃CGW
        Bmicroprocessor  processor QƂ̂ƁB

     clock tick()
        u()NbN`bN^C}`bNƂt́Au^C}荞
        ݂Ǝ̃^C}荞݂̊Ԃ̎ԁvƂӖłg錾tł
        Ał́A^C}荞݂ƂCxĝwĂ
        Bv(p.143 1, uLinux foCXhCov , Alessandro
        Rubini, RNG RMq, O'Reilly Japan, 1998)

        uׂĂ OS ́A炩̕@ŃVXeԂ𑪒肵ێȂ
        ΂ȂȂBʏAVXeԂɂ́An[hEFAɈ
        ̊ԊuŊ荞݂gKB̊荞݃[`ԂuJ
        EgvBLinux ł́AVXeԂ̓VXeJnȍ~
        ueBbNvő肳B1 eBbN(:ftHg) 10
        ~bɓA^C}荞݂ 1 b 100 gKB
        Ԃ͎̕ϐɊi[B

        unsigned long volatile jiffies:

     (p.57, uLinux J[lC^[iv, M.Beck,Harald Bohme , 
     ЃNCbN, sA\, AXL[, 1999)

     Data Structure
        ́Ãf[^ZbgŁÃtB[h\
        B

     Device Driver
        ̃foCX𐧌䂷\tgEFABƂ΁ANCR 810 foCX
        hCóA NCR 810 SCSI foCX𐧌䂷B

     DMA
        Direct Memory Access

        ()
        CPU ȊOɒڃANZX@\Edg݁BDMA ́Ȃ
        ^Rs[^ȂǁAROM ȂVXeŁAlɃf[^
        ލۂɎgpꂽ̂ŏłB
        u̓o̓VXeɎgpĂACfȂ́AIBM 360
        ̏fŏ߂ĎpɋꂽBIBM 360  DMA {iI
        ̗pŏ̃}VłBvuIBM  1964 NɁAIBM 360 t@~
        𔭕\A....v (p648/p390, uRs[^̍\Ɛ݌v: n[
        hEFAƃ\tgEFÃC^[tFCX( 2 )v, D.
        Patterson/J. Hennessy, c , o BP , 1999)

     ELF
        Executable and Linkable Format. Unix System Laboratory Ő݌v
        ꂽIuWFNgt@C̃tH[}bgBł́ALinux ōł
        ʓIɎgptH[}bgƂĂ̊Sɒ蒅ĂB

     EIDE
        Extended IDE

     Executable image
        }V߂ƃf[^܂ވ̍\t@CB̃t@C
        ́AvZX̉zɃ[hAs邱Ƃ\ł
        Bprogram QƂ̂ƁB

     FDDI()
        Fiber Distributed Data InterfaceB͌t@Co[P[up
        Ő݌vꂽBO̎劲lbg[NɁAc[̎}Ԃ炳
        B

     Function
        炩̍sׂs\tgEFABƂ΁Aӂ̐̑傫
        ԂȂǁB

     IDE
        Integrated Disk Electronics.

     Image
        executale image QƂ̂ƁB

     IP Internet Protocol.

     IPC
        Interprocess Communication(vZXԒʐM).

     Interface
        [`Ăяof[^\nۂ̕WIȕ@BƂ
        ΁AR[ĥӂ̃C[(layer, w)Ԃ̃C^[tFCX
        ́Ãf[^\nԂ肷郋[`łƂ
        낤BLinux  VFS ́AC^[tFCX̓T^łB

     IRQ
        Interrupt ReQuest.

     ISA
        Industry Standard Architecture. ͕WKił邪Atbs
        [fBXNhCoȂǂ̃VXeR|[lgɎgA
        ́AÂȂf[^oXC^[tFCXłB

     Kernel Module
        IɃ[hJ[l@\łAt@CVXefoCX
        hCoȂǂŗpB

     Kilobyte
        oCg̃f[^BK oCgƂ\LB (lbg[N
        1000 , ȊOł 1024 oCg)

     magic number()
        J[lt magic-number.txt ɏڂ܂B{
        ́AJF ̃J[l 2.2 t̃y[WB

     major number()
        J[lt devices.txt ɏڂ܂B{
        ́AJF ̃J[l 2.2 t̃y[WB

     Megabyte
        SoCg̃f[^BM oCgƂ\LB

     Microprocessor
        xɏWςꂽ CPUB݂̑啔 CPU ̓}CNvZbT
        B

     Module
        t@CBAZu̖߂ C ̂悤ȍꂩ̌`
        CPU ߂܂łB

     multicast()
        ʂɁAjLXg(unicast)́AuΈvA}`LX
        g(multicast)́AuΓ葽vAu[hLX
        g(broadcast)́AuΑSv̊֌Wɗ܂Bł́Au[
        hLXg̊TO}`LXgƕ\Ă镔
        ܂BC[TlbgAhXɂẮAETHER TYPES
        <http://www.ring.gr.jp/archives/doc/RFC/iana/assignments/ethernet-
        numbers> QlɂĂB

     network trailer()
        uTrailer JvZt[tH[}bg 4.2 BSD ̍Ƀ
        Ԃ̃Rs[悭s߂ɓ VAX ̃y[WOVXeɓ
        t[tH[}bgłB݂ł͊ɎgȂȂĂ
        (RFC 893)Bv(p.37, uC^[lbgW NCbNt@
        Xv, ⏹Ȓ, O'Reilly Japan, 1999)

     Object file
        }VR[hƃf[^܂ރt@CBsC[WƂȂɂ́A
        IuWFNgt@C⃉CuƃNKvB

     Page
        ́ATCỸy[WɕĂB

     Pointer
        ̈ʒuBł̑̈ʒułAhX܂łB

     Process
        ́AvO̎sł̂łBvZX́A쒆
        vOłƍl邱ƂłB

     Processor
        Microprocessor ̗́BCPU Ɠ`B

     PCI
        Peripheral Component Interconnect. Rs[^VXe̎Ӌ@
        𑊌݂ɐڑ@qׂWKiłB

     Peripheral
        VXe CPU ɑĎd񏈗@\vZb
        TBƂ΁A IDE Rg[`bvȂǁB

     Program
        ѐ CPU ߂̃ZbgB"hello world" ̕\Ƃ^
        XNsBexecutable image QƂ̂ƁB

     Protocol
        vgŔAlbg[ŇłAӂ̋vZX
        lbg[NC[ԂŃAvP[Vf[^]ۂɎg
        pB

     Register
        `bv̈̏ꏊłA▽߂̕ێ̂߂ɎgpB

     Register File
        vZbT̃WX^̃ZbgB

     RISC
        Reduced Instruction Set Computer. CISC ̔ΊTOB́AP
        ȏ鏭ȂAZu߂ȂvZbTBARM 
        Alpha vZbT͂ǂ RISC A[LeN`łB

     Routine
        ֐ƎĂ邪AɌƁA[`͒lԂȂB

     SCSI
        Small Computer System Interface.

     Shell
        ̓vOłAIy[eBOVXeƐlԂƂ̊Ԃ̃C
        ^[tFCXƂċ@\ĂBR}hVFƂĂ
        ALinux ōłʓIɗpĂVF́Abash VF
        B

     signal mask()
        u(vZX)VOi}XŃAvZXɓ͂Ȃ悤ɁA݃u
        bNĂVOȉW`ĂB}XN i Ԗڂ
        rbg 1 ł΁AVOiԍ i ̃VOi͂Ȃ悤Ƀu
        bNBvuŏdvȂ̂́AVOivZXɓ͂Ȃ
        悤ɃubNƂƂÃVOi SIG_IGN Ŗ
        邱ƂƓł͂ȂƂ_łBVOíAK
        ؂Ȏ_őo܂ŕێ̂ł͂ȂÂĂĂ܂
        ̂łBv(p.138, UNIX C vO~O, David A. Curry, AX
        L[ЕҏWĖ, AXL[o, 1997)

     SMP
        Symmetrical multiprocessing. ̃vZbTVXeł
        ÃvZbTԂł͎dɕSB (:
        Symmetric Multi-Processors ƂB)

     Socket
        \PbgƂ́Albg[NRlNV̈̒[\
        ́BLinux ́A BSD \PbgC^[tFCXT|[gĂB

     Software
        CPU (AZu C ̂悤ȍ̗)ƃf[^B啔
        ̏ꍇ́AvOƌB

     sparse address mapping scheme()
        (Alpha CPU ́A32-bit  64-bit ̃[hEXgAT|[g
        炸A 8-bit  16-bit ̃[hEXgAłȂ|A
        ̂Ƃ̒qׂ) uoCgPʂ̃[hEXgAoȂ
        ƂŁA\tgEFAZ}tHAI/O TuVXe̐݌ve
        B I/O Ɋւɑ΂ Digital(DEC) ̉́AI/O
        ]̍ۂɂ̉ʃAhXC(low-order address lines)
        găf[^TCYw肵AłfR[h邱ƂŃoCg
        Pʂ̓]Ƃ̂łB̏ Sparse
        Addressing ́AAhXԂQƂƂɁǍʂƂ
        I/O ԂA (non-contiguous)Ȃ̂ɂȂĂ܂B...v
        (chpter 8, Alpha-HOWTO, Neal Crook, LDP, 1997)

     System V
        1983 Nɍ쐬ꂽ Unix ̔h\tgEFABɂ́Aɂ
        āASystem V IPC JjY܂܂ĂB

     TCP
        Transmission Control Protocol.

     Task Queue
        Linux J[lŎd񂵂ɂ郁JjYB

     type of interrupts()
        荞݃nhɂ́Aunh(faster version of IRQ
        handler)vƁuᑬnhvB/proc/interrupts  + L
        t荞ݔԍ́Aunhvł邱ƂB

        u2 ނ̊荞݃nh̎ȈႢ́Anh͊荞݂
        Ag~bNȏۏ؂̂ɑ΂Aᑬnh͂Ȃ_
        B... vɁACPU ́u荞݂LɂvtO͍ȃn
        h̎sɂ̓ItɂAǂȊ荞݂ɂΏȂ悤
        Ă܂BAᑬȃnhĂяoƁAJ[l͊
        ݂̕񍐂 CPU ōēxLɂAᑬȃnhsɂ
        荞݂ɑΏł悤ɂ܂Bv(p.202, uLinux foCXh
        Cov, Alessandro Rubini, RNGERMq, O'Reilly Japan,
        1998)
        nh̐ [in include/asm-i386/irq.h]
        ᑬnh̐ [in arch/i386/kernel/irq.c]

     UDP
        User Datagram Protocol.

     Virtual Memory
        VXe̕ۂ̈ȏ̗eʂɌ邽߂̃n[hEF
        Aƃ\tgEFAƂ̃JjYB

     word()
        uRs[^ɂẮAɉZrbgBv
        (p.321, ANSI C ꎫT, щp, Zp]_, 1997)
        uCPU ƃԂňɎ󂯓nf[^̊{PʁB...8 rb
        g CPU  1 [h 8 rbgA16 rbg CPU  1 [h 16
        rbgA32 rbg CPU  1 [h 32 rbgƂȂ邱Ƃ
        Bv (p.848, Wp\RpꎫT, ďCԖxi, GaVXe,
        1999)

  21.  쌠Ɣzz

  Legal Notice
  (: {͂́Aɕt钘쌠ƔzzłB)

  UNIX ́AUnivel ̓o^WłB Linux ́ALinus Torvalds ̓o^W
  AUnix Ƃ͖֌WłB

  Copyright (c) 1996,1997,1998,1999 David A Rusling
  3 Foxglove Close, Wokingham, Berkshire RG41 3NF, UK
  david.rusling@arm.com

  {(The Linux Kernel)́Ȁɏ]AŁAŜ͈
  𕡐єzz邱Ƃ\łB

  o  L쌠\Ƃ̔zzƂAŜ͈ꕔׂ̂̕
     ɊSȂŕێȂ΂Ȃ܂B

  o  |͔h쐬ꍇAzzɐ悾Ē҂ɘAA
     ̏F𓾂Ȃ΂Ȃ܂B

  o  ̈̕ꕔ݂̂zzꍇA̕Ŝ\ł邱
     mAŜ肷@Ȃ΂Ȃ܂B

  o  ]ł̔yё̕ł̈pƂĂ̋͂̕ȕ𔲂
     ꍇ́ApK؂ɖA̋\LK
     v͂܂B

  wpړIł̗pɂẮA̋K̓KpOƂȂꍇ
  ŁA҂ɘAAq˂ĂB͒҂ƂẲX
  邽߂̂̂łAwK҂⋳҂ւ̐ۂƂӐ}̂
  ͂܂B

  ׂ̂̕Ẵ\[XR[h(̂܂)ɂ́AGNU General
  Public License Kp܂BLCZX́A FTP TCgł
  A prep.ai.mit.edu:/pub/gnu/COPYING œ肪\łB{ ``The
  GNU General Public Lincense'' ́ÃCZX̃Rs[ƂȂĂ
  B

  22.  Bibliography

  1. Richard L. Sites, Alpha Architecture Reference Manual, Digital
     Press
     (: alpha ֘A
     ́Ahttp://ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-
     library.html 肪\łB)

  2. Matt Welsh and Lar Kaufman, Running Linux, O'Reilly & Associates,
     Inc, ISBN 1-56592-100-3
     (:uRunning Linux, lbg[N\z܂Łv, RNG Z
     pďCA A1996N4s, O'Reilly Wp, ISBN
     4-900900-00-1)

  3. PCI Special Interest Group, PCI Local Bus Specification
     (: ֘AN http://www.pcisig.com)

  4. PCI Special Interest Group, PCI BIOS ROM Specification

  5. PCI Special Interest Group, PCI to PCI Bridge Architecture
     Specification

  6. Intel, Peripheral Components, Intel 296467, ISBN 1-55512-207-8

  7. Brian W. Kernighan and Dennis Richie, The C Programming Language
     Prentice Hall, ISBN 0-13-11-362-8
     (: uvO~O C v,Γcv , 1989, o, ISBN
     4-320-02692-6)

  8. Steven Levy, Hackers, Penguin, ISBN 0-14-023269-9

  9. Intel, Intel 486 Prosessor Family: Programmer's Reference Manual,
     Intel
     (: 炭̓e̕ƂāA Intel Architecture Software
     Developer's Manual, Volume 1,2,3 ܂BCẽTCg
     http://www.intel.co.jp/jp/developer/vtune/cbts/refman.htm łmF
     B)

  10.
     Comer D. E, Interworking with TCP/IP, Volume 1 - Principle,
     Protocols and Architecture, Prentice Hall International Inc
     (: uTCP/IP ɂlbg[N\z Vol.1 ( 2 )v,䏃/ 
     {V, o, 1993, ISBN 4-320-02667-5)

  11.
     David Jagger, ARM Architecture Reference Manual, Prentice Hall,
     ISBN 0-13-736299-4

  ȉ́A󒍂łB

  o  uLinux J[lC^[iv, M.Beck, H.Bohme,, ЃNCb
     N , ASCII, 1999, ISBN4-7561-3135

  o  uLinux foCXhCo], Alessandro Rubini, RNG RMq
     , O'Reilly Japan, 1998, ISBN4-900900-73-7

  o  uUnix J[l̖@v, B.Goodheart, J.Cox, NMi Ė, v
     eBXz[, 1997, ISBN4-931356-04-4

  o  uLinux 2.0 J[lubNv, R.Card, E.Dumas, , Pci ɓq
     , Ohmsha, 1999, ISBN4-274-07879-5

  o  uLinux Core Kernel Commentaryv, Scott Maxwell,  , w
     , 2000, ISBN4-7978-2006-3 ...

  23.  {ɂ

  ́̕ADavid A. Rusling  The Linux Kernel ̖|łBHTML ł
  eLXgł܂B

  󕶂 HTML łɂ́A PostScript łɂ\[XR[hւ̃t@
  XNƂĖߍ݂܂BAJF TCgɂ́A{ŒڎQ
  Œ̃\[Xt@CグĂ܂B\[XŜɂȂ
  ɂ́A̕ HTML \[X
  <ftp://ftp.linet.gr.jp/pub/JF/html/The-Linux-Kernel.tar.gz>ƁAJ[l
   2.0.33 ̃\[X_E[hACӂ̏ꏊɓWJāÃ̕T
  ufBNg The-Linux-Kernel-images  linux ƂOŃ\[X
  ̃V{bNN𒣂ĂBS\[Xt@CȒPɎQƂł
  悤ɂȂ܂B

  J[l\[X́AOT[o[
  ftp://ftp.ring.gr.jp/archives/linux/kernel.org/kernel/v2.0 A߂
  ̃~[TCg_E[hł܂B

  23.1.  Ql

  ́̕AJ[l 2.0.33 ɊÂĂ܂B2.2.x ł̕ύXɂ
  ́A The linux-kernel mailing list FAQ ɊȒPȐ܂B 2.4.x
  ɂẮAChangeLog  uf炵 Linux 2.4 ̐Ev ƂL
  ALDP ɁALinux Kernel Internal Ƃ܂B

  ̕ȊÕJ[l֘AɂẮA/usr/src/linux/Documentation
   kernel-docs.txt AKernel links
  <http://jungla.dit.upm.es/~jmseyas/linux/kernel/hackers-docs.html> 
  Ql܂B܂A{ł͐GĂȂ Linux ̋Nɂ
  Ă̕ƂāAJF  uRgǂ Linux J[lv
  <http://www.linux.or.jp/JF/JFdocs/readkernel.html> ܂B

  ŝĂ{ Linux J[l֘AЂɂ
  ́A``bibliography'' B

  23.2.  ӎ

  |ɍۂẮAJF Project ̃o[AɎ̊FɂbɂȂ
  B

  쓈   
   L 
  RX _K 
  ˌ  
     
   T 
  { _ 
  l  
    
   r 
  toshi 
  c 
  n MV

  䂳Ɛ쓈ɂ́AS҂ɂ킽荸ǂĂ܂Bɐ쓈
  ɂ́Asȓ_ɂČJԂĂ܂BRXAˌ
  Aɂ́AxZ`Ă܂B삳A
  {AJȍǂ肪Ƃ܂Bׂ͂Ă̕
  ɋނŊӂ܂B

  AA뎚E܂AJF [OXg
  <JF@linux.or.jp> A҂܂łm点B

  UTi <ysenda@pop01.odn.ne.jp>

