PDLQF 〻ᒿ
ㅜ7ㄐࡍ〻ᒿ(init)
൘ṨⓀԓ⸱Ⲵ init/ⴞᖅѝᴹањ main.c ᮷ԦDŽ㌫㔏൘ᢗ㹼ᆼ boot/ⴞᖅѝⲴ head.s 〻ᒿቡՊሶ
ᢗ㹼ᵳӔ㔉 main.cDŽ䈕〻ᒿ㲭❦н䮯ˈնতᤜҶṨࡍⲴᡰᴹᐕDŽഐ↔൘䰵䈫䈕〻ᒿⲴԓ⸱ᰦ
䴰㾱৲➗ᖸཊަԆ〻ᒿѝⲴࡍ䜘࠶DŽྲ㜭ᆼޘ⨶䀓䘉䟼䈳⭘Ⲵᡰᴹ〻ᒿˈ䛓Ѹⴻᆼ䘉ㄐᇩ
ᓄ䈕ሩ Linux ṨᴹҶབྷ㠤ⲴҶ䀓DŽ
Ӿ䘉аㄐᔰˈᡁԜሶ᧕䀖བྷ䟿Ⲵ C 〻ᒿԓ⸱ˈഐ↔䈫㘵ᴰྭާᴹаᇊⲴ C 䈝䀰⸕䇶DŽᴰྭⲴаᵜ
৲㘳Җ䘈ᱟ Brian W. Kernighan ઼ Dennis M. Ritchie 㕆㪇ⲴljC 〻ᒿ䇮䇑䈝䀰NJDŽሩ䈕ҖㅜӄㄐޣҾᤷ䪸
઼ᮠ㓴Ⲵ⨶䀓ˈԕ䈤ᱟᔴ៲ C 䈝䀰Ⲵޣ䭞DŽཆ䘈䴰㾱 GNU gcc ൘䓛䗩Ѫ৲㘳ˈഐѪ൘Ṩԓ
⸱ѝᖸཊൠᯩ֯⭘Ҷ gcc Ⲵᢙኅ⢩ᙗDŽֻྲ㚄˄inline˅࠭ᮠǃ㚄˄፼˅≷㕆䈝ㅹDŽ
൘⌘䟺 C 䈝䀰〻ᒿᰦˈѪҶо〻ᒿѝᴹⲴ⌘䟺࡛ˈᡁԜ֯⭘'//'Ѫ⌘䟺䈝ⲴᔰDŽᴹޣ
ᴹ⌘䟺Ⲵ㘫䈁ࡉ䟷⭘оަаṧⲴ⌘䟺ḷᘇDŽሩҾ〻ᒿѝⲴཤ᮷Ԧ˄*.h˅ˈӵᾲ㾱ѹⲴ䀓䟺ˈާ
փ䈖㓶⌘䟺ᇩሶ൘⌘䟺ᓄཤ᮷ԦⲴㄐ㢲ѝ㔉ࠪDŽ
7.1 main.c ぁᓅ
7.1.1 ࣕ㜳ᨅ䘦
main.c 〻ᒿ俆ݸ࡙⭘ࡽ䶒 setup.s 〻ᒿᗇⲴ㌫㔏৲ᮠ䇮㖞㌫㔏Ⲵṩ᮷Ԧ䇮༷ԕ৺аӋᆈޘተ
䟿DŽ䘉Ӌᆈ䟿ᤷ᰾ҶѫᆈⲴᔰൠ൰ǃ㌫㔏ᡰᤕᴹⲴᆈᇩ䟿઼Ѫ儈䙏㕃ߢᆈⲴᵛㄟൠ൰DŽ
ྲ䘈ᇊѹҶ㲊ᤏⴈ˄RAMDISK˅ˈࡉѫᆈሶ䘲ᖃ߿ቁDŽᮤњᆈⲴ᱐ۿ⽪മ㿱മ 7-1 ᡰ⽪DŽ
ഴ ㌱㔕ѣᆎࣕ㜳ࡈ࠼⽰ᝅഴȾ
മѝˈ儈䙏㕃ߢ䜘࠶䘈㾱ᢓ䲔㻛ᱮᆈ઼ ROM BIOS ঐ⭘Ⲵ䜘࠶DŽ儈䙏㕃ߢᱟ⭘Ҿ⻱ⴈㅹඇ䇮༷Ѥ
ᰦᆈ᭮ᮠᦞⲴൠᯩˈԕ 1K˄1024˅ᆇ㢲ѪањᮠᦞඇঅսDŽѫᆈฏⲴᆈ⭡ᆈ㇑⨶⁑ඇ mm 䙊
䗷࠶亥ᵪࡦ䘋㹼㇑⨶࠶䝽ˈԕ 4K ᆇ㢲Ѫањᆈ亥অսDŽṨ〻ᒿԕ㠚⭡䇯䰞儈䙏㕃ߢѝⲴᮠᦞˈ
ն䴰㾱䙊䗷 mm 㜭֯⭘࠶䝽ࡠⲴᆈ亥䶒DŽ
❦ˈṨ䘋㹼ᡰᴹᯩ䶒Ⲵ⺜ԦࡍᐕDŽᤜ䲧䱡䰘ǃඇ䇮༷ǃᆇㅖ䇮઼༷ ttyˈ䘈ᤜӪᐕ䇮
㖞ㅜањԫ࣑˄task 0˅DŽᖵᡰᴹࡍᐕᆼᡀ〻ᒿቡ䇮㖞ѝᯝݱ䇨ḷᘇԕᔰѝᯝˈᒦ࠷ᦒࡠԫ࣑
0 ѝ䘀㹼DŽ൘䰵䈫䘉Ӌࡍᆀ〻ᒿᰦˈᴰྭᱟ䐏⵰㻛䈳⭘Ⲵ〻ᒿ␡ޕ䘋৫ⴻˈྲᇎ൘ⴻнл৫Ҷˈ
ቡᲲᰦݸ᭮а᭮ˈ㔗㔝ⴻлањࡍ䈳⭘DŽ൘ᴹӋ⨶䀓ѻ㔗㔝⹄ウ⋑ᴹⴻᆼⲴൠᯩDŽ
൘ᮤњṨᆼᡀࡍˈṨሶᢗ㹼ᵳ࠷ᦒࡠҶ⭘ᡧ⁑ᔿ˄ԫ࣑ 0˅ˈҏণ CPU Ӿ 0 ⢩ᵳ㓗࠷ᦒ
ࡠҶㅜ 3 ⢩ᵳ㓗DŽ↔ᰦ main.c Ⲵѫ〻ᒿቡᐕ൘ԫ࣑ 0 ѝDŽ❦㌫㔏ㅜа⅑䈳⭘䘋〻ࡋᔪ࠭ᮠ fork()ˈ
Ṩ〻ᒿ 儈䙏㕃ߢ 㲊ᤏⴈ ѫᆈ
PDLQF 〻ᒿ
ࡋᔪࠪањ⭘Ҿ䘀㹼 init()Ⲵᆀ䘋〻˄䙊ᑨ㻛〠Ѫ init 䘋〻˅DŽ㌫㔏ᮤњࡍ䗷〻㿱മ 7-2 ᡰ⽪DŽ
ഴ Ṯࡓခぁᓅ⍷ぁ⽰ᝅഴ
main.c 〻ᒿ俆ݸ⺞ᇊྲօ࠶䝽֯⭘㌫㔏⢙⨶ᆈˈ❦䈳⭘Ṩ䜘࠶Ⲵࡍ࠭ᮠ࠶࡛ሩᆈ㇑
⨶ǃѝᯝ༴⨶ǃඇ䇮઼༷ᆇㅖ䇮༷ǃ䘋〻㇑⨶ԕ৺⺜ⴈ઼䖟ⴈ⺜Ԧ䘋㹼ࡍ༴⨶DŽ൘ᆼᡀҶ䘉Ӌ
ѻˈ㌫㔏䜘࠶ᐢ㓿༴Ҿ䘀㹼⣦ᘱDŽ↔〻ᒿᢺ㠚ᐡĀᐕā〫ࣘࡠԫ࣑ 0˄䘋〻 0˅ѝ䘀㹼ˈᒦ֯
⭘ fork()䈳⭘俆⅑ࡋᔪࠪ䘋〻 1˄init 䘋〻˅ˈᒦ൘ަѝ䈳⭘ init()࠭ᮠDŽ൘䈕࠭ᮠѝ〻ᒿሶ㔗㔝䘋㹼ᓄ⭘
⧟ຳⲴࡍᒦᢗ㹼 shell ⲫᖅ〻ᒿDŽ㘼䘋〻 0 ࡉՊ൘㌫㔏オ䰢ᰦ㻛䈳ᓖᢗ㹼ˈഐ↔䘋〻 0 䙊ᑨҏ㻛〠
Ѫ idle 䘋〻DŽ↔ᰦ䘋〻 0 ӵᢗ㹼 pause()㌫㔏䈳⭘ˈᒦ৸Պ䈳⭘䈳ᓖ࠭ᮠDŽ
init()࠭ᮠⲴ࣏㜭࠶Ѫ 4 њ䜘࠶˖ķᆹ㻵ṩ᮷Ԧ㌫㔏˗ĸᱮ⽪㌫㔏ؑ˗Ĺ䘀㹼㌫㔏ࡍ䍴Ⓚ䝽㖞
᮷Ԧ rc ѝⲴભԔ˗ĺᢗ㹼⭘ᡧⲫᖅ shell 〻ᒿDŽ
ԓ⸱俆ݸ䈳⭘㌫㔏䈳⭘ setup()ˈ⭘ᶕ᭦䳶⺜ⴈ䇮༷࠶㺘ؑᒦᆹ㻵ṩ᮷Ԧ㌫㔏DŽ൘ᆹ㻵ṩ᮷Ԧ㌫
㔏ѻࡽˈ㌫㔏Պݸࡔᯝᱟ䴰㾱ݸᔪ・㲊ᤏⴈDŽ㤕㕆䈁Ṩᰦ䇮㖞Ҷ㲊ᤏⴈⲴབྷሿˈᒦ൘ࡽ䶒Ṩࡍ
䗷〻ѝᐢ㓿ᔰ䗏Ҷаඇᆈ⭘㲊ᤏⴈˈࡉṨቡՊ俆ݸቍ䈅ᢺṩ᮷Ԧ㌫㔏࣐䖭ࡠᆈⲴ㲊ᤏⴈѝDŽ
❦ init()ᢃᔰањ㓸ㄟ䇮༷ tty0ˈᒦ༽ࡦަ᮷Ԧ᧿䘠ㅖԕӗ⭏ḷ߶䗃ޕ stdinǃḷ߶䗃ࠪ stdout ઼䭉
䈟䗃ࠪ stderr 䇮༷DŽṨ䲿࡙⭘䘉Ӌ᧿䘠ㅖ൘㓸ㄟкᱮ⽪аӋ㌫㔏ؑˈֻྲ儈䙏㕃ߢѝ㕃ߢඇᙫ
ᮠǃѫᆈオ䰢ᆈᙫᆇ㢲ᮠㅹDŽ
᧕⵰ init()৸ᯠᔪҶањ䘋〻˄䘋〻 2˅ˈᒦ൘ަѝѪᔪ・⭘ᡧӔӂ֯⭘⧟ຳ㘼ᢗ㹼аӋࡍ䝽㖞ˈ
ণ൘⭘ᡧԕ֯⭘ shell ભԔ㹼⧟ຳѻࡽˈṨ䈳⭘/bin/sh 〻ᒿ䘀㹼Ҷ䝽㖞᮷Ԧ etc/rc ѝ䇮㖞ⲴભԔDŽrc
᮷ԦⲴ⭘о DOS ㌫㔏ṩⴞᖅкⲴ AUTOEXEC.BAT ᮷Ԧ㊫լDŽ䘉⇥ԓ⸱俆ݸ䙊䗷ޣ䰝᮷Ԧ᧿䘠ㅖ
0ˈ
ᒦ・ᢃᔰ᮷Ԧ/etc/rcˈӾ㘼ᢺḷ߶䗃ޕ stdin ᇊࡠ etc/rc ᮷ԦкDŽ䘉ṧˈᡰᴹⲴḷ߶䗃ޕᮠᦞ䜭ሶӾ
䈕᮷Ԧѝ䈫DŽ❦Ṩԕ䶎Ӕӂᖒᔿᢗ㹼/bin/shˈӾ㘼ᇎ⧠ᢗ㹼/etc/rc ᮷ԦѝⲴભԔDŽᖃ䈕᮷ԦѝⲴભ
Ԕᢗ㹼ᆼ∅ˈ/bin/sh ቡՊ・䘰ࠪDŽഐ↔䘋〻 2 ҏቡ䲿ѻ㔃ᶏDŽ
init()࠭ᮠⲴᴰа䜘ԭ⭘Ҿ൘ᯠᔪ䘋〻ѝѪ⭘ᡧᔪ・ањᯠⲴՊ䈍ˈᒦ䘀㹼⭘ᡧⲫᖅ shell 〻ᒿ
/bin/shDŽ൘㌫㔏ᢗ㹼䘋〻 2 ѝⲴ〻ᒿᰦˈ⡦䘋〻˄init 䘋〻˅аⴤㅹᖵ⵰ᆳⲴ㔃ᶏDŽ䲿⵰䘋〻 2 Ⲵ䘰ࠪˈ
⡦䘋〻ቡ䘋ޕࡠањᰐ䲀ᗚ⧟ѝDŽ൘䈕ᗚ⧟ѝˈ⡦䘋〻Պ⅑⭏ᡀањᯠ䘋〻ˈ❦൘䈕䘋〻ѝࡋᔪа
њᯠⲴՊ䈍ˈᒦԕⲫᖅ shell ᯩᔿ⅑ᢗ㹼〻ᒿ/bin/shˈԕࡋᔪ⭘ᡧӔӂ shell ⧟ຳDŽ❦⡦䘋〻㔗㔝ㅹᖵ
ሩ⢙⨶ᆈ䜘࠶䘋
㹼࣏㜭ࡂ࠶о࠶䝽
㌫㔏ࡍ
㌫㔏䜘࠶ࡍ
ᤜሩԫ࣑ ࡍ
〫ࡠԫ࣑ ѝᢗ㹼
オ䰢ᰦᢗ㹼 SDXVH
䇮㖞㓸ㄟḷ߶ ,2
ࡋᔪ䘋〻
ᢗ㹼 VKHOO ༴⨶ UF
ᗚ⧟ㅹᖵ䘋〻 䘰ࠪ
ࡋᔪᆀ䘋〻
䇮㖞㓸ㄟḷ߶ ,2
ᢗ㹼 VKHOO
ᗚ⧟ㅹᖵ䘋〻䘰ࠪ
࣐䖭ṩ᮷Ԧ㌫㔏
䘰ࠪ
䘰ࠪ
䗃ޕᇊࡠ UF ᮷Ԧ
ࡋᔪ䘋〻 ˄LQLW˅
䘋〻 ԫ࣑
䘋〻 LQLW 䘋〻
䘋〻
䘋〻 Q
PDLQF 〻ᒿ
䈕ᆀ䘋〻DŽⲫᖅ shell 㲭❦оࡽ䶒Ⲵ䶎Ӕӂᔿ shell ᱟањ〻ᒿ/bin/shˈնᱟᡰ֯⭘ⲴભԔ㹼৲ᮠ˄argv[]˅
нDŽⲫᖅ shell Ⲵㅜ 0 њભԔ㹼৲ᮠⲴㅜ 1 њᆇㅖаᇊᱟањ߿'-'DŽ䘉њ⢩ᇊⲴḷᘇՊ൘/bin/sh ᢗ㹼
ᰦ䙊⸕ᆳ䘉нᱟа⅑Პ䙊Ⲵ䘀㹼ˈ㘼ᱟѪⲫᖅ shell 䘀㹼/bin/sh ⲴDŽӾ䘉ᰦᔰˈ⭘ᡧቡԕ↓ᑨ֯⭘
Linux ભԔ㹼⧟ຳҶˈ㘼⡦䘋〻䲿ѻ৸䘋ޕㅹᖵ⣦ᘱDŽ↔㤕⭘ᡧ൘ભԔ㹼кᢗ㹼Ҷ exit ᡆ logout ભԔˈ
䛓Ѹ൘ᱮ⽪аᶑᖃࡽⲫᖅ shell 䘰ࠪⲴؑˈ㌫㔏ቡՊ൘䘉њᰐ䲀ᗚ⧟ѝ⅑䟽༽ԕкࡋᔪⲫᖅ shell
䘋〻Ⲵ䗷〻DŽ
ԫ࣑ 1 ѝ䘀㹼Ⲵ init()࠭ᮠⲴє䜘࠶ᇎ䱵кᓄ䈕ᱟ⤜・Ⲵ⧟ຳࡍ〻ᒿ init ㅹⲴ࣏㜭DŽ৲㿱〻ᒿ
ࡇ㺘ሩ䘉ᯩ䶒Ⲵ䈤᰾DŽ
⭡Ҿࡋᔪᯠ䘋〻Ⲵ䗷〻ᱟ䙊䗷ᆼޘ༽ࡦ⡦䘋〻ԓ⸱⇥઼ᮠᦞ⇥Ⲵᯩᔿᇎ⧠ˈഐ↔൘俆⅑֯⭘ fork()
ࡋᔪᯠ䘋〻 init ᰦˈѪҶ⺞؍ᯠ䘋〻⭘ᡧᘱḸѝ⋑ᴹ䘋〻 0 Ⲵཊ։ؑˈ㾱≲䘋〻 0 ൘ࡋᔪ俆њᯠ䘋〻
˄䘋〻 1˅ѻࡽн㾱֯⭘ަ⭘ᡧᘱḸˈণ㾱≲ԫ࣑ 0 н㾱䈳⭘࠭ᮠDŽഐ↔൘ main.c ѫ〻ᒿ〫ࣘࡠԫ࣑ 0
ᢗ㹼ˈԫ࣑ 0 ѝⲴԓ⸱ fork()н㜭ԕ࠭ᮠᖒᔿ䘋㹼䈳⭘DŽ〻ᒿѝᇎ⧠Ⲵᯩ⌅ᱟ䟷⭘ྲлᡰ⽪Ⲵ gcc ࠭ᮠ
፼˄㚄˅ᖒᔿᶕᢗ㹼䘉њ㌫㔏䈳⭘˄৲㿱〻ᒿㅜ 23 㹼˅˖
䙊䗷༠᰾ањ㚄˄LQOLQH˅࠭ᮠˈԕ䇙 JFF ᢺ࠭ᮠⲴԓ⸱䳶ᡀࡠ䈳⭘ᆳⲴԓ⸱ѝDŽ䘉Պᨀ儈ԓ⸱ᢗ㹼
Ⲵ䙏ᓖˈഐѪⴱ৫Ҷ࠭ᮠ䈳⭘Ⲵᔰ䬰DŽཆˈྲԫօањᇎ䱵৲ᮠᱟањᑨ䟿ˈ䛓Ѹ൘㕆䈁ᰦ䘉Ӌᐢ⸕٬ቡ
㜭֯ᗇᰐ䴰ᢺ፼࠭ᮠⲴᡰᴹԓ⸱䜭ᤜ䘋ᶕ㘼䇙ԓ⸱ҏᗇࡠㆰDŽ৲㿱ㅜ ㄐѝⲴޣ䈤᰾DŽ
VWDWLFLQOLQHBV\VFDOOLQWIRUN
ަѝ_syscall0()ᱟ unistd.h ѝⲴ፼ᆿԓ⸱ˈᆳԕ፼ޕ≷㕆Ⲵᖒᔿ䈳⭘ Linux Ⲵ㌫㔏䈳⭘ѝᯝ int 0x80DŽ
ṩᦞ include/unistd.h ᮷Ԧㅜ 133 㹼кⲴᆿᇊѹˈᡁԜᢺ䘉њᆿኅᔰᒦᴯԓ䘋к䶒а㹼ѝቡԕⴻࠪ䘉ᶑ
䈝ᇎ䱵кᱟ int fork()ࡋᔪ䘋〻㌫㔏䈳⭘ˈ㿱ྲлᡰ⽪DŽ
XQLVWGK ᮷ԦѝBV\VFDOOⲴᇊѹDŽণѪнᑖ৲ᮠⲴ㌫㔏䈳⭘ᆿ࠭ᮠ˖W\SHQDPHYRLGDŽ
GHILQHBV\VFDOOW\SHQDPH?
W\SHQDPHYRLG?
^?
ORQJBBUHV?
BBDVPBBYRODWLOH
LQW[
?䈳⭘㌫㔏ѝᯝ [DŽ
D
BBUHV?䘄എ٬ÎHD[BBUHVDŽ
BB15BQDPH?䗃ޕѪ㌫㔏ѝᯝ䈳⭘BB15BQDPHDŽ
LIBBUHV! ?ྲ䘄എ٬! ˈࡉⴤ᧕䘄എ䈕٬DŽ
UHWXUQW\SHBBUHV?
HUUQR BBUHV?ࡉ㖞ࠪ䭉ˈᒦ䘄എDŽ
UHWXUQ?
`
ṩᦞк䶒ᇊѹᢺBV\VFDOOLQWIRUNኅᔰԓ䘋ㅜ 㹼ᡁԜԕᗇࡠྲл䈝˖
VWDWLFLQOLQHLQWIRUNYRLG
^
ORQJBBUHV
BBDVPBBYRODWLOH
LQW[
D
BBUHV
BB15BIRUN
LIBBUHV!
UHWXUQLQWBBUHV
HUUQR
BBUHV
UHWXUQ
PDLQF 〻ᒿ
`
gcc Պᢺк䘠Ā࠭ᮠāփѝⲴ䈝ⴤ᧕ᨂޕࡠ䈳⭘ fork()䈝Ⲵԓ⸱༴ˈഐ↔ᢗ㹼 fork()нՊᕅ䎧࠭ᮠ䈳
⭘DŽཆˈᆿ〠ᆇㅖѢĀsyscall0āѝᴰⲴ 0 㺘⽪ᰐ৲ᮠˈ1 㺘⽪ᑖ 1 њ৲ᮠDŽྲ㌫㔏䈳⭘ᑖᴹ 1
њ৲ᮠˈ䛓Ѹቡᓄ䈕֯⭘ᆿ_syscall1()DŽ
㲭❦к䶒㌫㔏ѝᯝ䈳⭘ᢗ㹼ѝᯝᤷԔ INT ᰦ䘈ᱟ䚯ݽнҶ֯⭘ึḸˈնᱟ㌫㔏䈳⭘֯⭘ԫ࣑ⲴṨ
ᘱḸ㘼䶎⭘ᡧḸˈᒦф⇿њԫ࣑䜭ᴹ㠚ᐡ⤜・ⲴṨᘱḸˈഐ↔㌫㔏䈳⭘нՊᖡ૽䘉䟼䇘䇪Ⲵ⭘ᡧᘱḸDŽ
ཆˈ൘ࡋᔪᯠ䘋〻 init˄ণ䘋〻 1˅Ⲵ䗷〻ѝˈ㌫㔏ሩަ䘋㹼ҶаӋ⢩↺༴⨶DŽ䘋〻 0 ઼䘋〻 init
ᇎ䱵кᰦ֯⭘⵰Ṩԓ⸱˄ሿҾ 1MB Ⲵ⢙⨶ᆈ˅Ⲵԓ⸱઼ᮠᦞ⢙⨶ᆈ亥䶒˄640KB˅ˈ
ᱟᢗ㹼Ⲵԓ⸱н൘а༴ˈഐ↔ᇎ䱵кᆳԜҏᰦ֯⭘⵰Ⲵ⭘ᡧึḸDŽ൘Ѫᯠ䘋〻 init ༽ࡦަ⡦
䘋〻˄䘋〻 0˅Ⲵ亥ⴞᖅ઼亥㺘亩ᰦˈ䘋〻 0 Ⲵ 640KB 亥㺘亩ᙗ⋑ᴹ᭩ࣘ䗷˄ӽ❦䈫߉˅ˈնᱟ䘋
〻 1 Ⲵ 640KB ሩᓄⲴ亥㺘亩ত㻛䇮㖞ᡀҶ䈫DŽഐ↔ᖃ䘋〻 1 ᔰᢗ㹼ᰦˈަሩ⭘ᡧḸⲴࠪޕḸሶ
ሬ㠤亥䶒߉؍ᣔᔲᑨˈӾ㘼Պ֯ᗇṨⲴᆈ㇑⨶〻ᒿѪ䘋〻 1 ൘ѫᆈѝ࠶䝽аᆈ亥䶒ˈᒦᢺԫ
࣑ 0 Ḹѝᓄ亥䶒ᇩ༽ࡦࡠ↔ᯠ亥䶒кDŽӾ↔ᰦ䎧ˈԫ࣑ 1 Ⲵ⭘ᡧᘱḸᔰᴹ㠚ᐡ⤜・Ⲵᆈ亥䶒DŽ
ণӾԫ࣑ 1 ᢗ㹼䗷ࠪ/ޕḸˈԫ࣑ 0 ઼ԫ࣑ 1 Ⲵ⭘ᡧḸᡀӂ⤜・ⲴḸDŽѪҶнࠪ⧠ߢケ䰞仈ˈ
ቡᗵ享㾱≲ԫ࣑ 0 ൘ԫ࣑ 1 ᢗ㹼Ḹѻࡽ⾱→֯⭘ࡠ⭘ᡧึḸฏˈ㘼䇙䘋〻 init 㜭অ⤜֯⭘ึḸDŽ
ഐѪ൘Ṩ䈳ᓖ䘋〻䘀㹼ᰦ⅑ᒿᱟ䲿ᵪⲴˈᴹ㜭൘ԫ࣑ 0 ࡋᔪҶԫ࣑ 1 ӽ❦ݸݱ䇨ԫ࣑ 0DŽഐ↔ԫ
࣑ 0 ᢗ㹼 fork()ˈ䲿Ⲵ pause()࠭ᮠҏᗵ享䟷⭘፼࠭ᮠᖒᔿᶕᇎ⧠ˈԕ䚯ݽԫ࣑ 0
൘ԫ࣑ 1 ѻ
ࡽ֯⭘⭘ᡧḸDŽ
ᖃ㌫㔏ѝањ䘋〻˄ֻྲ
init 䘋〻Ⲵᆀ䘋〻ˈ䘋〻 2˅ᢗ㹼䗷 execve()䈳⭘ˈ䘋〻 2 Ⲵԓ⸱઼ᮠᦞ
ՊսҾ㌫㔏Ⲵѫᆈѝˈഐ↔㌫㔏↔ԕ䲿ᰦ࡙⭘߉ᰦ༽ࡦᢰᵟ
8
˄Copy on Write˅ᶕ༴⨶ަԆᯠ
䘋〻Ⲵࡋᔪ઼ᢗ㹼DŽ
ሩҾ Linux ᶕ䈤ˈᡰᴹԫ࣑䜭ᱟ൘⭘ᡧ⁑ᔿл䘀㹼Ⲵˈᤜᖸཊ㌫㔏ᓄ⭘〻ᒿˈྲ shell 〻ᒿǃ㖁㔌
ᆀ㌫㔏〻ᒿㅹDŽṨⓀԓ⸱ lib/ⴞᖅлⲴᓃ᮷Ԧ˄䲔ަѝⲴ string.c 〻ᒿ˅ቡᱟу䰘Ѫ䘉䟼ᯠࡋᔪⲴ䘋〻
ᨀ࠭ᮠ᭟ᤱˈṨԓ⸱ᵜ䓛ᒦн֯⭘䘉Ӌᓃ࠭ᮠDŽ
7.1.2 ԙ⸷⌞䠀
ぁᓅ 7-1 linux/init/main.c
OLQX[LQLWPDLQF
&/LQXV7RUYDOGV
ᇊѹᆿĀBB
/,%5$5<BBāᱟѪҶᤜᇊѹ൘ XQLVWGK ѝⲴ፼≷㕆ԓ⸱ㅹؑDŽ
GHILQHBB/,%5$5<BB
K ཤ᮷Ԧᡰ൘Ⲵ唈䇔ⴞᖅᱟ LQFOXGHˈࡉ൘ԓ⸱ѝቡн⭘᰾⺞ᤷ᰾ަս㖞DŽྲнᱟ 81,; Ⲵ
ḷ߶ཤ᮷Ԧˈࡉ䴰㾱ᤷ᰾ᡰ൘Ⲵⴞᖅˈᒦ⭘ৼᕅᤜտDŽXQLVWGK ᱟḷ߶ㅖᑨᮠо㊫ර᮷ԦDŽ
ަѝᇊѹҶㅖᑨᮠ઼㊫රˈᒦ༠᰾Ҷ࠭ᮠDŽྲ䘈ᇊѹҶㅖBB/,%5$5<BBˈࡉ䘈Պ
㌫㔏䈳⭘઼፼≷㕆ԓ⸱ V\VFDOOㅹDŽ
LQFOXGHXQLVWGK!
LQFOXGHWLPHK!ᰦ䰤㊫රཤ᮷ԦDŽަѝᴰѫ㾱ᇊѹҶ WP 㔃ᶴ઼аӋᴹޣᰦ䰤Ⲵ࠭ᮠᖒDŽ
৲㿱ᆈ㇑⨶аㄐ˖߉ᰦ༽ࡦᵪࡦDŽ
PDLQF 〻ᒿ
ZHQHHGWKLVLQOLQHIRUNLQJIURPNHUQHOVSDFHZLOOUHVXOW
LQ12&23<21:5,7(XQWLODQH[HFYHLVH[HFXWHG7KLV
LVQRSUREOHPEXWIRUWKHVWDFN7KLVLVKDQGOHGE\QRWOHWWLQJ
PDLQXVHWKHVWDFNDWDOODIWHUIRUN7KXVQRIXQFWLRQ
FDOOVZKLFKPHDQVLQOLQHFRGHIRUIRUNWRRDVRWKHUZLVHZH
ZRXOGXVHWKHVWDFNXSRQH[LWIURPIRUN
$FWXDOO\RQO\SDXVHDQGIRUNDUHQHHGHGLQOLQHVRWKDWWKHUH
ZRQWEHDQ\PHVVLQJZLWKWKHVWDFNIURPPDLQEXWZHGHILQH
VRPHRWKHUVWRR
ᡁԜ䴰㾱л䶒䘉Ӌ፼䈝ӾṨオ䰤ࡋᔪ䘋〻ሶሬ㠤⋑ᴹ߉ᰦ༽ࡦ&23<21:5,7(
ⴤࡠᢗ㹼ањ H[HFYH 䈳⭘DŽ䘉ሩึḸ㜭ᑖᶕ䰞仈DŽ༴⨶ᯩ⌅ᱟ൘ IRUN䈳⭘н䇙 PDLQ
֯⭘ԫօึḸDŽഐ↔ቡн㜭ᴹ࠭ᮠ䈳⭘䘉ણ⵰ IRUN ҏ㾱֯⭘፼Ⲵԓ⸱ˈࡉᡁԜ൘Ӿ
IRUN䘰ࠪᰦቡ㾱֯⭘ึḸҶDŽ
ᇎ䱵кᴹ SDXVH ઼ IRUN 䴰㾱֯⭘፼ᯩᔿˈԕ؍䇱Ӿ PDLQѝнՊᔴҡึḸˈնᱟᡁԜ
ᰦ䘈ᇊѹҶަԆаӋ࠭ᮠDŽ
/LQX[ ൘Ṩオ䰤ࡋᔪ䘋〻ᰦн֯⭘߉ᰦ༽ࡦᢰᵟ˄&RS\RQZULWH˅DŽPDLQ൘〫ࣘࡠ⭘ᡧ
⁑ᔿ˄ࡠԫ࣑ ˅ᢗ㹼፼ᯩᔿⲴ IRUN઼ SDXVHˈഐ↔؍䇱н֯⭘ԫ࣑ Ⲵ⭘ᡧḸDŽ
൘ᢗ㹼 PRYHWRBXVHUBPRGHѻˈᵜ〻ᒿ PDLQቡԕԫ࣑ Ⲵ䓛ԭ൘䘀㹼ҶDŽ㘼ԫ࣑ ᱟᡰ
ᴹሶࡋᔪᆀ䘋〻Ⲵ⡦䘋〻DŽᖃᆳࡋᔪањᆀ䘋〻ᰦ˄LQLW 䘋〻˅ˈ⭡Ҿԫ࣑ ԓ⸱ҾṨ
オ䰤ˈഐ↔⋑ᴹ֯⭘߉ᰦ༽ࡦ࣏㜭DŽ↔ᰦԫ࣑ Ⲵ⭘ᡧḸቡᱟԫ࣑ Ⲵ⭘ᡧḸˈণᆳԜޡ
֯⭘ањḸオ䰤DŽഐ↔ᐼᵋ൘ PDLQF 䘀㹼൘ԫ࣑ Ⲵ⧟ຳлᰦн㾱ᴹሩึḸⲴԫօˈԕ
ݽᔴҡึḸDŽ㘼൘⅑ᢗ㹼 IRUNᒦᢗ㹼䗷 H[HFYH࠭ᮠˈ㻛࣐䖭〻ᒿᐢнҾṨオ䰤ˈ
ഐ↔ԕ֯⭘߉ᰦ༽ࡦᢰᵟҶDŽ৲㿱каㄐĀ/LQX[ Ṩ֯⭘ᆈⲴᯩ⌅āа㢲ᇩDŽ
л䶒BV\VFDOOᱟ XQLVWGK ѝⲴ፼ᆿԓ⸱DŽԕ፼ޕ≷㕆Ⲵᖒᔿ䈳⭘ /LQX[ Ⲵ㌫㔏䈳⭘ѝᯝ
[DŽ䈕ѝᯝᱟᡰᴹ㌫㔏䈳⭘ⲴޕDŽ䈕ᶑ䈝ᇎ䱵кᱟ LQWIRUNࡋᔪ䘋〻㌫㔏䈳⭘DŽኅ
ᔰⴻѻቡՊ・᰾ⲭDŽV\VFDOO 〠ѝᴰⲴ 㺘⽪ᰐ৲ᮠˈ 㺘⽪ њ৲ᮠDŽ
৲㿱 LQFOXGHXQLVWGKˈ 㹼DŽ
VWDWLFLQOLQHBV\VFDOOLQWIRUN
LQWSDXVH㌫㔏䈳⭘˖Ჲڌ䘋〻Ⲵᢗ㹼ˈⴤࡠ᭦ࡠањؑDŽ
VWDWLFLQOLQHBV\VFDOOLQWSDXVH
LQWVHWXSYRLG%,26㌫㔏䈳⭘ˈӵ⭘Ҿ OLQX[ ࡍ˄ӵ൘䘉њ〻ᒿѝ㻛䈳⭘˅DŽ
VWDWLFLQOLQHBV\VFDOOLQWVHWXSYRLG%,26
LQWV\QF㌫㔏䈳⭘˖ᴤᯠ᮷Ԧ㌫㔏DŽ
VWDWLFLQOLQHBV\VFDOOLQWV\QF
LQFOXGHOLQX[WW\K!WW\ ཤ᮷ԦˈᇊѹҶᴹޣ WW\BLRˈѢ㹼䙊ؑᯩ䶒Ⲵ৲ᮠǃᑨᮠDŽ
LQFOXGHOLQX[VFKHGK!䈳ᓖ〻ᒿཤ᮷ԦˈᇊѹҶԫ࣑㔃ᶴ WDVNBVWUXFWǃㅜ њࡍԫ࣑
ⲴᮠᦞDŽ䘈ᴹаӋԕᆿⲴᖒᔿᇊѹⲴᴹޣ᧿䘠ㅖ৲ᮠ䇮㖞઼㧧Ⲵ
፼ޕᔿ≷㕆࠭ᮠ〻ᒿDŽ
LQFOXGHOLQX[KHDGK!KHDG ཤ᮷ԦˈᇊѹҶ⇥᧿䘠ㅖⲴㆰঅ㔃ᶴˈ઼ࠐњ䘹ᤙㅖᑨ䟿DŽ
LQFOXGHDVPV\VWHPK!㌫㔏ཤ᮷ԦDŽԕᆿⲴᖒᔿᇊѹҶ䇨ཊᴹޣ䇮㖞ᡆ؞᭩
᧿䘠ㅖѝᯝ䰘ㅹⲴ፼ޕᔿ≷㕆ᆀ〻ᒿDŽ
LQFOXGHDVPLRK!LR ཤ᮷ԦDŽԕᆿⲴ፼ޕ≷㕆〻ᒿᖒᔿᇊѹሩ LR ㄟⲴ࠭ᮠDŽ
LQFOXGHVWGGHIK!ḷ߶ᇊѹཤ᮷ԦDŽᇊѹҶ 18//RIIVHWRI7<3(0(0%(5DŽ
LQFOXGHVWGDUJK!ḷ߶৲ᮠཤ᮷ԦDŽԕᆿⲴᖒᔿᇊѹ䟿৲ᮠࡇ㺘DŽѫ㾱䈤᰾Ҷњ
㊫රYDBOLVW઼йњᆿYDBVWDUWYDBDUJ ઼ YDBHQGˈYVSULQWIǃ