ÄÁÅÙÃ÷»ó¼¼º¸±â

ÄÚµå·Î ¾Ë¾Æº¸´Â ARM ¸®´ª½º Ä¿³Î
ÄÚµå·Î ¾Ë¾Æº¸´Â ARM ¸®´ª½º Ä¿³Î
  • ÀúÀڳ뼭¿µ,À±¼®ÈÆ,°­Áø¼º,¼Û¿øÁØ,ÀÌÀ±Àç,ÀÓÀ±Àç °øÀú/¹éâ¿ì °¨¼ö
  • ÃâÆÇ»çÁ¦ÀÌÆà
  • ÃâÆÇÀÏ2020-06-03
  • µî·ÏÀÏ2020-12-21
º¸À¯ 1, ´ëÃâ 0, ¿¹¾à 0, ´©Àû´ëÃâ 8, ´©Àû¿¹¾à 0

Ã¥¼Ò°³

2³â°£ÀÇ ÄÚµå ºÐ¼®, 1³â°£ÀÇ ÁýÇÊ·Î Áý´ë¼ºÇÑ ÃÖÃÊÀÇ ARM ¸®´ª½º Ä¿³Î ºÐ¼®¼­!
¸®´ª½º Ä¿³Î ÄÚµå ºÐ¼®ÀÇ Çõ¸íÀûÀÎ ¹æ¹ýÀ» Á¦°øÇÑ´Ù!
¸®´ª½º Ä¿³Î ÄÚµå ºÐ¼®À» À§ÇÑ °¡Àå ½Ç¿ëÀûÀÎ Áöħ¼­!
ÀÌ Ã¥Àº ÀúÀÚµéÀÌ 3³â°£ ¸®´ª½º Ä¿³ÎÀ» ºÐ¼®ÇÑ °æÇè°ú ÀڷḦ ¹ÙÅÁÀ¸·Î ÁýÇʵǾú´Ù. ¾î¶² Ã¥¿¡¼­µµ ´Ù·ç¾îÁÖÁö ¾Ê¾Ò´ø ³»¿ë, ¼ö¹Ú °ÑÇÓ±â½ÄÀ¸·Î ¾Ë¾Æº¸¾Ò´ø ³»¿ë¿¡ ´ëÇØ Ã¶ÀúÇÏ°Ô ÇÔ¼ö È帧À» µû¶ó°¡¸ç ºÐ¼®ÇÏ°í ÀÖ´Ù. ¾î·Á¿ï ¹ýÇÑ ÀÌ·¯ÇÑ °úÁ¤À» ÀúÀÚµéÀº ¡®line by line ºÐ¼®¡¯À̶ó´Â Á÷±¸·Î ½ÂºÎÇÔÀ¸·Î½á ±âÁ¸ÀÇ À̷м­¿¡ ´ä´äÇÔÀ» ´À²¼´ø µ¶Àڵ鿡°Ô ÁöÀû Äè°¨À» ¾È°ÜÁÙ °ÍÀÌ´Ù.
±âÁ¸ÀÇ À̷м­¿Í ´Þ¸® ARM¿ë ¸®´ª½º Ä¿³ÎÀ» ´Ù·ç°í ÀÖ´Â ÀÌ Ã¥Àº ¸®´ª½º Ä¿³Î°ú ARM¿¡ ´ëÇÑ Á¤È®ÇÑ Áö½ÄÀ» ½×À» ¼ö ÀÖµµ·Ï »ó¼¼ÇÑ ÄÚµå ºÐ¼®°ú dzºÎÇÑ ±×¸²À¸·Î ±¸¼ºÇÏ¿´°í, µ¶ÀÚ´Â ÀÌ Ã¥À» ÅëÇØ ÁÖ±âÀûÀ¸·Î ¸±¸®ÁîµÇ´Â ÃֽŠ¸®´ª½º Ä¿³ÎÀ» ºÐ¼®ÇÒ ¼ö ÀÖ´Â È¿À²ÀûÀÎ ¹æ¹ýÀ» ÀÚ¿¬½º·´°Ô ¹è¿ï ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ Ã¥Àº ¸®´ª½º Ä¿³ÎÀÇ ºÎÆà ½ÃÀÛ¿¡¼­ºÎÅÍ ³¡±îÁö¸¦ ¼ø¼­´ë·Î ¼³¸íÇÏ°í ÀÖ¾î ¸®´ª½º Ä¿³ÎÀ» Ä¿³Î ¼Ò½º Äڵ带 ÅëÇØ Á¦´ë·Î ºÐ¼®Çغ¸°íÀÚ ÇÏ´Â µ¶ÀÚ¿¡°Ô ÀûÇÕÇÏ´Ù. ¸®´ª½º Äڵ带 ÇÑ ¹ø Á¤µµ ºÐ¼®Çغ¸°í´Â ½Í¾ú´Âµ¥ ¹æ´ëÇÑ ¾ç°ú ¸Á¸Á´ëÇظ¦ Ç¥·ùÇÒ °Í °°Àº ´À³¦¿¡ ¾öµÎ¸¦ ¸ø ³»½Ã´ø ºÐ, ¸®´ª½ºÀÇ ½ÇÁ¦ µ¿ÀÛ °úÁ¤ÀÌ ±Ã±ÝÇϼ̴ø ºÐ, ½ÇÁ¦ OS ·¹º§ÀÇ Áö½Ä¿¡ ¸ñ¸»¶óÇϽôø ºÐ, ÀÌ·¯ÇÑ µ¶Àڵ鿡°Ô ÀÌ Ã¥ÀÌ ºû°ú ¼Ò±Ý°ú °°Àº Á¸Àç°¡ µÇ±â¸¦ ¹Ù¶õ´Ù.
ÀÌ Ã¥¿¡¼­ ´Ù·ç´Â ÁÖ¿ä ³»¿ëÀº ´ÙÀ½°ú °°´Ù.
- Ä¿³Î ¼Ò½º ºôµå ½Ã½ºÅÛ
- ARM ÇÁ·Î¼¼¼­ÀÇ ±¸Á¶
- È¿°úÀûÀÎ ºÐ¼® ȯ°æ ±¸Ãà
- ¾î¼Àºí¸® ·¹º§ÀÇ ºÎÆà °úÁ¤
- Ä¿³Î ºÐ¼® ½Ã ÀÚÁÖ »ç¿ëµÇ´Â API, ARM ¸í·É¾î, GAS Å°¿öµå
- ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ ´ÙÀ½ Çڵ鷯°¡ È£ÃâµÇ±â±îÁöÀÇ ÀÚ¼¼ÇÑ °úÁ¤

¸ñÂ÷

PART I ARM ¸®´ª½º Ä¿³Î - Ä¿³Î ºÐ¼®À» À§ÇØ ¾î¶² Áغñ°¡ ÇÊ¿äÇÒ±î?
Chapter 1 Ä¿³Î¿¡ ´ëÇÑ ¼Ò°³ ±×¸®°í 2.6°ú 3.2ÀÇ Â÷ÀÌ 002
1.1 Ä¿³ÎÀǠź»ý°ú ¿ªÇÒ ±×¸®°í ³»ºÎ ±¸Á¶ 002
1.1.1 ¸®´©½º¿¡ ÀÇÇؠź»ýÇÑ ¸®´ª½º 002
1.1.2 ´Ù¾çÇÑ ¼­ºê½Ã½ºÅÛÀÌ ¸ð¿© µ¿ÀÛÇϴ ¸ð³ë¸®µñ Ä¿³Î 003
1.1.3 Àü ¼¼°è¿¡¼­ °¡Àå À¯¸íÇÑ ¹ü¿ë ¿î¿µÃ¼Á¦ 005
1.2 Ä¿³Î 2.6°ú 3.2ÀÇ Â÷ÀÌ 006

Chapter 2 Ä¿³Î ºôµù ½Ã½ºÅÛ 008
2.1 Ä¿³Î ÃʱâÈ­ 008
2.2 Ä¿³Î ¼³Á¤ 009
2.3 Ä¿³Î ºôµù 011
2.4 Ä¿³Î ¼³Ä¡ 019

Chapter 3 ARM ÇÁ·Î¼¼¼­ ¾Ë¾Æº¸±â 021
3.1 ÇÁ·Î¼¼¼­ °³¿ä¿Í Æ¯Â¡ 021
3.2 ÇÁ·Î¼¼¼­ ¾ÆÅ°ÅØó¿Í ÄÚ¾î 022
3.3 ÇÁ·Î¼¼¼­ ¸í¸í¹ý 023
3.4 ÇÁ·Î¼¼¼­ ³»ºÎ ±¸Á¶ 024
3.5 ÇÁ·Î¼¼¼­ ¸ðµå¿Í ·¹Áö½ºÅÍ 026
3.6 ÇÁ·Î¼¼¼­ ÀͼÁ¼Ç 028
3.7 Çϵå¿þ¾î È®Àå ±â´É 030
3.7.1 Ä³½Ã 030
3.7.2 ¸Þ¸ð¸® °ü¸® ÀåÄ¡ 031
3.7.3 ÄÚÇÁ·Î¼¼¼­ 031

Chapter 4 ºÐ¼® È¯°æ ±¸ÃàÇϱâ 032
4.1 ¸®´ª½º Ä¿³Î ¼Ò½º ´Ù¿î·ÎµåÇÏ¿© ¼³Ä¡Çϱâ 032
4.1.1 Ä¿³Î ¼Ò½º ´Ù¿î·ÎµåÇϱâ 032
4.1.2 ¼Ò½º ¼³Ä¡Çϱâ 034
4.2 ctags + cscope ¼³Ä¡Çϱâ 035
4.2.1 ctags·Î ¼Ò½º ÄÚµå Å±נ¸¸µé±â 035
4.2.2 cscope Å±נµ¥ÀÌÅͺ£À̽º ¸¸µé±â 037
4.3 vim Ç÷¯±×ÀΠ´Ù¿î·Îµå ¹× È¯°æ¼³Á¤ 038
4.3.1 vim Ç÷¯±×ÀΠ´Ù¿î·ÎµåÇϱâ 039
4.3.2 vim + plugin È¯°æ±¸¼º 043
4.3.3 vim È¯°æ¼³Á¤Çϱâ 044
4.4 ¼Ò½º ºÐ¼® È¯°æ Åø µÑ·¯º¸±â 047

PART II Ä¿³ÎÀÇ ½ÃÀÛ - start_kernelÀº ¾î¶»°Ô È£ÃâµÉ±î?
Chapter 5 Ä¿³Î ¾ÐÃà ÇØÁ¦ ÁغñÇϱâ 056
5.1 ºÎÆ®·Î´õ¿¡ À̾î Ã¹ ½ºÅ¸Æ® ²÷±â - start ·¹À̺í 057
5.2 BSS ¿µ¿ª ÃʱâÈ­Çϱâ - not_relocated ·¹À̺í 059
5.3 Ä³½Ã È°¼ºÈ­Çϱâ - cache_on ·¹À̺í 062
5.4 ÆäÀÌÁö µð·ºÅ͸® ¿£Æ®¸® ÃʱâÈ­Çϱâ - _ _setup_mmu ·¹À̺í 065
5.5 I-Cache È°¼ºÈ­ ¹× Ä³½Ã Á¤Ã¥ Àû¿ëÇϱâ - _ _common_mmu_cache_on ·¹À̺í 069

Chapter 6 ¾ÐÃàµÈ Ä¿³Î À̹ÌÁöÀΠzImage·ÎºÎÅÍ Ä¿³Î À̹ÌÁö º¹¿øÇϱâ 070
6.1 µ¤¾î¾²Áö ¾Ê°Ô Ä¿³Î ¾ÐÃà Ç®±â - wont_overwrite, decompress_kernel ·¹À̺í 071
6.2 ¾ÐÃà ÇØÁ¦µÈ Ä¿³Î È£ÃâÇϱâ - call_kernel ·¹À̺í 072
6.3 Ä³½ÃŬ¸° ¹× Ç÷¯½Ã - cache_clean_flush ·¹À̺í 073
6.4 Ä³½Ã ºñÈ°¼ºÈ­Çϱâ - cache_off ·¹À̺í 075

Chapter 7 start_kernel() È£ÃâÇϱâ 076
7.1 ÃʱâÈ­ Á¶¸ÁÇϱâ - stext ·¹À̺í 076
7.2 ÇÁ·Î¼¼¼­ Á¤º¸ Ã£±â - _ _look_processor_type 081
7.2.1 _ _lookup_processor_type ·¹À̺í 081
7.2.2 _ _proc_info_begin°ú _ _proc_info_end¿¡ ÀúÀåµÈ Á¤º¸ 083
7.2.3 MMU ºñÈ°¼ºÈ­ »óÅ¿¡¼­ °¡»ó ÁÖ¼Ò¸¦ ¹°¸® ÁּҷΠº¯°æÇϱâ 085
7.2.4 proc_info_list ±¸Á¶Ã¼¸¦ Ã£¾Æ ÇÁ·Î¼¼¼­ Á¤º¸ ºñ±³Çϱâ 087
7.3 ³» ¸Ó½Å Å¸ÀԠã±â - _ _lookup_machine_type 088
7.3.1 _ _lookup_machine_type ·¹À̺í 088
7.3.2 _ _arch_info_begin°ú _ _arch_info_end¿¡ ÀúÀåµÈ machine_desc Á¤º¸¿Í Á¢±Ù ¹æ¹ý 090
7.3.3 machine_desc ±¸Á¶Ã¼¸¦ Ã£¾Æ ¸Ó½Å Á¤º¸ ºñ±³Çϱâ 091
7.4 ºÎÆ®·Î´õ¿¡¼­ ¿Â atags - _ _vet_atags ·¹À̺í 092
7.5 °¡»ó ¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§ÇØ ±âÃÊ °ø»çÇϱâ - _ _create_page_table ·¹À̺í 095
7.6 Äھ ¼³Á¤ÇÏÀÚ - v6_setup ·¹À̺í 101
7.7 MMU¸¦ ÄÑ°í °¡»ó ÁÖ¼Ò »ç¿ëÇϱâ - _ _enable_mmu / _ _turn_mmu_on ·¹À̺í 102
7.8 start_kernel·Î Á¡ÇÁ - _ _mmap_switched ·¹À̺í 107

PART III Ä¿³ÎÀÇ ½ÇÇà - Ä¿³ÎÀÇ ½ÃÀÛ°ú ³¡Àº ¾îµðÀΰ¡?
Chapter 8 smp_setup_processor_id() ~ lock_kernel() 112
8.1 smp_setup_processor_id(), lockdep_init(), debug_objects_early_init() 113
8.1.1 smp_setup_processor_id() 113
8.1.2 lockdep_init() 113
8.1.3 debug_objects_early_init() 115
8.2 ½ºÅà¿À¹öÇ÷ο젰¨ÁöÇϱâ - boot_init_stack_canary() 117
8.3 ÇÁ·Î¼¼½º¸¦ ±×·ìÈ­Çϴ ¹æ¹ýÀ» Á¦°øÇϴ cgroup ÃʱâÈ­Çϱâ ? cgroup_init_early() 118
8.3.1 cgroupfs_root¿Í cgroupÀÇ °ü°è ÃʱâÈ­Çϱâ - init_cgroup_root() 123
8.3.2 ¼­ºê½Ã½ºÅÛ ÃʱâÈ­Çϱâ - cgroup_init_subsys() 123
8.4 irq¸¦ ºñÈ°¼ºÈ­Çϱâ - local_irq_disable() 125
8.5 early_boot_irqs_off(), early_init_irq_lock_class() 125
8.6 ºò Ä¿³Î ¶ô - lock_kernel() 127

Chapter 9 Å¬·° À̺¥Æ®¿¡ ´ëÇÑ Çڵ鷯 µî·ÏÇϱâ 134
9.1 ÇÔ¼öÀÇ ¼±¾ð°ú Á¤ÀÇ - tick_init() 134
9.2 À̺¥Æ® Ã³¸® Çڵ鷯 µî·ÏÇϱâ - clockevents_register_notifier() 136
9.2.1 clockevents_lock¿¡ ´ëÇÑ ½ºÇÉ ¶ô °É±â 137
9.2.2 clockevents_chainÀÌ »ý¼ºµÇ´Â ¿ø¸® 139
9.2.3 clockevents_chain¿¡ tick_notifier¸¦ µî·ÏÇϴ ¹æ¹ý 140
9.2.4 clockevents_lock¿¡ ´ëÇÑ ½ºÇÉ ¶ôÀ» ÇØÁ¦Çϴ ¿ø¸® 142

Chapter 10 CPU ºñÆ®¸Ê¿¡ ¼öÇà ÁßÀΠCPU µî·Ï°ú HIGHMEM °ü¸®¸¦ À§ÇÑ ÃʱâÈ­ 144
10.1 ÇÖÇ÷¯±× Á¤º¸¸¦ ´ã°í Àִ ºñÆ®¸Ê¿¡ init_task¸¦ ¼öÇàÇϴ CPU Ãß°¡Çϱâ - boot_cpu_init() 144
10.2 ÇÏÀÌ ¸Þ¸ð¸® °ü¸®Çϱâ - page_address_init() 146

Chapter 11 Àüü Á¶¸ÁÇϱâ - setup_arch() 149

Chapter 12 unwind_init() ~ early_trap_init() 152
12.1 ½ºÅ࿪ÃßÀûÇϱâ - unwind_init() 152
12.2 ¸Ó½Å Á¤º¸¸¦ ´ã°í Àִ machine_desc ±¸Á¶Ã¼ ±¸Çϱâ - setup_machine() 153
12.3 ATAG Á¤º¸ Ã³¸®Çϱâ ? setup_arch() 154
12.4 ºÎÆàÆĶó¹ÌÅ͠ó¸®Çϱâ - parse_cmdline() 156
12.5 ¸®¼Ò½º Æ®¸® ±¸¼ºÇϱâ - request_standard_resources() 158
12.6 cpu possible ºñÆ®¸Ê ÃʱâÈ­Çϱâ - smp_init_cpus() 164
12.7 ARM ¿¹¿Ü ¸ðµå¸¶´Ù ½ºÅàÁöÁ¤ÇØÁÖ±â - cpu_init() 165
12.8 ÀͼÁ¼Ç Çڵ鸵À» À§ÇØ ÃʱâÈ­Çϱâ - early_trap_init() 167
12.9 ÀÎÅÍ·´Æ® Çڵ鷯 ÇÔ¼ö »ìÆ캸±â 174
12.9.1 IRQ Çڵ鷯 È£ÃâÇϱâ - asm_do_IRQ() 177
12.9.2 ÀÎÅÍ·´Æ® ÀÌÀüÀ¸·Î µ¹¾Æ°¡±â - ret_to_user ·¹À̺í 179

Chapter 13 ÇÁ·Î¼¼¼­ ¼Â¾÷Çϱâ ? setup_processor() 181
13.1 setup_processor() ±¸Á¶ ¾Ë¾Æº¸±â 181
13.2 CPU ID Ã£±â - read_cpuid_id() 183
13.3 ÇÁ·Î¼¼¼­ Á¤º¸ Ã£±â - lookup_processor_type() 184
13.4 ÇÁ·Î¼¼¼­ ¾ÆÅ°ÅØó Á¤º¸ Ã£±â - cpu_architecture() 185
13.5 ÇÁ·Î¼¼¼­ Ä³½Ã Å¸ÀԠã±â - cacheid_init() 189
13.6 ÇÁ·Î¼¼¼­ ÃʱâÈ­ ÇÔ¼ö È£ÃâÇϱâ - cpu_proc_init() 193

Chapter 14 ¸Þ¸ð¸® ÆäÀÌ¡ ÁغñÇϱâ - paging_init() 196
14.1 paging_init() Àüü ±¸Á¶ »ìÆ캸±â 196
14.2 ¸Þ¸ð¸® Å¸ÀÔ Å×ÀÌºí ¼³Á¤ÇØÁÖ±â - build_mem_type_table() 198
14.3 ¸Þ¸ð¸® Á¤º¸ Á¡°ËÇϱâ ? sanity_check_meminfo() 201
14.4 ÆäÀÌÁö Å×À̺í ÁغñÇϱâ - prepare_page_table() 203
14.4.1 prepare_page_table() 203
14.4.2 ¸®´ª½ºÀÇ ÆäÀÌ¡ ±¸Á¶ 205
14.4.3 ÆäÀÌÁö µð·ºÅ͸® ¿£Æ®¸® ±¸Çϱâ 206
14.4.4 pmd_clear() 208
14.5 µð¹ÙÀ̽º ¿µ¿ª ¸ÅÇΠÁغñÇϱâ - devicemaps_init() 210
14.6 ÇÏÀÌ ¸Þ¸ð¸® »ç¿ë ÁغñÇϱâ - kmap_init() 215
14.7 Á¦·Î ÆäÀÌÁö ÃʱâÈ­Çϱâ 216
14.7.1 ¸Þ¸ð¸® ÇÒ´çÇϱâ - _ _ alloc_bootmem_nopanic() 217
14.7.2 ÁöÁ¤µÈ ³ëµå¿¡¼­ fallbackÀ» »ç¿ëÇÏ¿© ¸Þ¸ð¸® ÇÒ´ç¹Þ±â - alloc_bootmem_core() 218
14.7.3 °¡»ó ÁÖ¼Ò¸¦ page ±¸Á¶Ã¼·Î º¯È¯Çϱâ - virt_to_page() 220
14.8 D-CacheÀÇ ÀÏ°ü¼º À¯ÁöÇϱâ ? flush_dcache_page() 221

Chapter 15 ºÎÆ® Å¸ÀÓ ½Ã ¸Þ¸ð¸® ÇÒ´çÀÚ ÃʱâÈ­Çϱâ - bootmem_init() 223
15.1 bootmemÀÇ ÇÔ¼ö È帧°ú ÀڷᱸÁ¶µé 224
15.2 bootmem_init() ±¸Á¶ ¾Ë¾Æº¸±â 229
15.3 ·¥µð½ºÅ© À§Ä¡ Ã£±â - check_initrd() 230
15.4 ³ëµåÀÇ ¹ðÅ© Á¤º¸¸¦ ÆäÀÌÁö µð·ºÅ͸®¿¡ ¹Ý¿µÇϱâ - bootmem_init_node() 231
15.4.1 map_memory_bank() 233
15.4.2 bootmem_bootmap_pages() 236
15.4.3 find_bootmap_pfn() 238
15.4.4 node_set_online() 239
15.4.5 NODE_DATA() ¸ÅÅ©·Î 240
15.4.6 init_bootmem_node() 242
15.4.7 free_bootmem_node() 244
15.4.8 reserve_bootmem_node() 245
15.5 0¹ø ³ëµå Á¦¿Ü½ÃÅ°±â - reserve_node_zero() 246
15.6 ·¥µð½ºÅ© ³ëµå Á¦¿Ü½ÃÅ°±â - bootmem_reserve_initrd() 248
15.7 °¡¿ë ÆäÀÌÁö ¾ø´Ù°í ¼³Á¤Çϱâ - bootmem_free_node() 248
15.8 free_area ¿µ¿ª ÃʱâÈ­ 251
15.8.1 free_area ±¸Á¶Ã¼ 251
15.8.2 free_area_init_node() 253
15.8.3 free_area_init_core() 254
15.8.4 init_currently_empty_zone() 256
15.8.5 memmap_init() 257

Chapter 16 mm_init_owner() ~ preempt_disable() 264
16.1 ¸Þ¸ð¸® ¼ÒÀ¯ÀÚ ¼³Á¤Çϱâ ? mm_init_owner() 264
16.2 ¸í·É¾î ¶óÀΠÀúÀåÇصαâ ? setup_command_line() 265
16.3 per-cpu µ¥ÀÌÅÍ ÃʱâÈ­Çϱâ - setup_per_cpu_areas() 266
16.4 CPU °³¼ö ±¸Çϱâ - setup_nr_cpu_ids() 269
16.5 SMP »óÀÇ ºÎÆàÇÁ·Î¼¼½º µî·ÏÇϱâ - smp_prepare_boot_cpu() 270
16.6 ½ºÄÉÁÙ·¯¸¦ »ç¿ëÇϱâ À§ÇØ ÀڷᱸÁ¶ ÃʱâÈ­Çϱâ ? sched_init() 272
16.6.1 ±×·ì ½ºÄÉÁÙ¸µ ½Ã »ç¿ëµÇ´Â task_groupÀÇ sched_entity ±¸Á¶Ã¼¿Í runqueue ±¸Á¶Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸® ÇÒ´ç 273
16.6.2 root_domain, rt_bandwidth, task_group °ü·Ã ÀڷᱸÁ¶ ÃʱâÈ­ 276
16.6.3 ½Ã½ºÅÛÀÇ ¸ðµç possible cpuÀÇ ·±Å¥ ÃʱâÈ­ 278
16.6.4 ÇöÀç Å½ºÅ©ÀÇ ½ºÄÉÁÙ¸µ °ü·Ã °ª ÃʱâÈ­ ¹× ·Îµå¹ë·±½ÌÀ» À§ÇÑ ÀÎÅÍ·´Æ® Çڵ鷯 µî·Ï 280
16.7 Ä¿³Î ¼±Á¡ Çã¿ëÇϱâ¿Í ¼±Á¡ ¸·±â ? preempt_enable()/preempt_disable() 281

Chapter 17 ºô·ÁÁÙ ÈÄ¿øÀÚ ±¸¼ºÇϱâ 283
17.1 build_all_zonelists()¿¡¼­ ´Ù·ç´Â ÀڷᱸÁ¶µé 283
17.2 build_all_zonelists() ±¸Á¶ ¾Ë¾Æº¸±â 285
17.3 Á¸ÀÇ ¸®½ºÆ® ¹æ½Ä °áÁ¤Çϱâ - set_zonelist_order() 287
17.4 Æú¹é ¸®½ºÆ®¿Í Æú¹é ºñÆ®¸Ê ±¸¼ºÇϱâ - _ _build_all_zonelists() 290
17.4.1 build_zonelists() 291
17.4.2 build_zonelists_in_node_order() 293
17.4.3 build_zonelists_in_zone_order() 296
17.4.4 build_thisnode_zonelists() 297
17.4.5 build_zonelist_cache() 297
17.5 Æú¹é ¸®½ºÆ® Á¤º¸ Ãâ·ÂÇϱâ - mminit_verify_zonelist() 299
17.6 ÆäÀÌÁö ÇÒ´ç ¿äûÀ» Ã³¸®ÇÒ ³ëµå Á¤Çϱâ - cpuset_init_current_mems_allowed() 300
17.7 ÇÁ¸® ÆäÀÌÁö °³¼ö ±¸Çϱâ - nr_free_pagecache_pages() 300
17.8 ÆäÀÌÁö ¸ðºô¸®Æ¼ 304

Chapter 18 page_alloc_init() ~ pidhash_init() 308
18.1 ÇÖÇ÷¯±× CPU¸¦ À§ÇÑ page Ã³¸®Çϱâ - page_alloc_init() 309
18.2 console ÆĶó¹ÌÅ͠ó¸®Çϱâ - parse_early_param() 311
18.3 Æ¯º°ÇÑ ÆĶó¹ÌÅ͠ó¸®Çϱâ - parse_args() 313
18.4 ÀÎÅÍ·´Æ® È°¼ºÈ­ ¿©ºÎ È®ÀÎÇϱâ - irqs_disabled() 317
18.5 Ä¿³Î ¿¹¿Ü Å×À̺í Á¤ÀÇÇϱâ - sort_main_extable() 318
18.6 RCU ¸ÞÄ¿´ÏÁò ÃʱâÈ­Çϱâ - rcu_init() 320
18.7 IRQ¸¦ »ç¿ëÇϱâ À§ÇÑ ÁغñÇϱâ - early_irq_init() 323
18.8 ÀÎÅÍ·´Æ® ÃʱâÈ­Çϱâ - init_IRQ() 328
18.9 ÇÁ·Î¼¼½º Á¤º¸¸¦ ºü¸£°Ô Ã£±â À§ÇÑ ±¸Á¶ ¸¸µé±â ? pidhash_init() 331

Chapter 19 init_timers() ~ page_cgroup_init() 333
19.1 Å¸À̸ӠÃʱâÈ­Çϱâ ? init_timers() 334
19.1.1 timer_cpu_notify() 335
19.1.2 register_cpu_notifier() 336
19.1.3 open_softirq() 337
19.2 High Resolution Å¸À̸ӠÃʱâÈ­Çϱâ ? hrtimers_init() 338
19.3 softirqÀÇ Äݹé ÇÔ¼ö µî·ÏÇϱâ - softirq_init() 341
19.4 xtime ¼³Á¤Çϱâ - timekeeping_init() 345
19.5 Çϵå¿þ¾î Å¸À̸ӠÃʱâÈ­Çϱâ - time_init() 348
19.6 clock Å¸ÀÓ ÃʱâÈ­Çϱâ - sched_clock_init() 350
19.7 CPUÀÇ ÀÎÅÍ·´Æ® È°¼ºÈ­Çϱâ - local_irq_enable() 352
19.8 ·çÆ® ÆÄÀϽýºÅÛÀ¸·Î »ç¿ëµÇ´Â init ·¥µð½ºÅ© °Ë»çÇϱâ 353
19.9 µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» À§ÇÑ ÃʱâÈ­ ÀÛ¾÷Çϱâ - vmalloc_init() 353
19.10 µ§Æ®¸®¿Í ¾ÆÀ̳ëµå Ä³½Ã¿¡ ´ëÇÑ ÃʱâÈ­ ¹Ì¸® ¼öÇàÇϱâ - vfs_caches_init_early() 355
19.11 cpuset ¼­ºê½Ã½ºÅÛ ÃʱâÈ­Çϱâ - cpuset_init_early() 358
19.12 memory ¼­ºê½Ã½ºÅÛ ÃʱâÈ­Çϱâ - page_cgroup_init() 360

Chapter 20 bootmem ÇÒ´çÀÚ¸¦ Á¾·áÇÏ°í ¹öµð ½Ã½ºÅÛÀ¸·Î ±³Ã¼ 363
20.1 mem_init() ÇÔ¼öÀǠȣÃâ °ü°è¿Í ÀڷᱸÁ¶ÀÇ »ó°ü °ü°è 363
20.2 mem_init() ±¸Á¶ ¾Ë¾Æº¸±â 364
20.3 Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ºñÆ®¸Ê¿¡ ±â·ÏÇϱâ - free_unused_memmap_node() 366
20.4 ÀϹݠÇÁ¸® ÆäÀÌÁö ¹öµð ½Ã½ºÅÛÀ¸·Î ÀÌ°üÇϱâ - free_all_bootmem_node() 368
20.4.1 register_page_bootmem_info_node() 368
20.4.2 free_all_bootmem_core() 370
20.4.3 _ _free_pages_bootmem() 372
20.4.4 _ _free_pages() 376
20.4.5 free_hot_cold_page() 376
20.4.6 _ _free_pages_ok() 378
20.5 ÇÏÀÌ ¸Þ¸ð¸® ÇÁ¸® ÆäÀÌÁö ¹öµð½Ã½ºÅÛÀ¸·Î ÀÌ°üÇϱâ - free_area() 383

Chapter 21 CPU ÇÖÇ÷¯±× Áö¿øÀ» À§ÇÑ ÃʱâÈ­ 385
21.1 cpu_hotplug ¸â¹ö º¯¼ö ÃʱâÈ­Çϱâ - cpu_hotplug_init() 385
21.2 CPUÀÇ ¿Â¶óÀΠ¡æ ¿ÀÇÁ¶óÀÎÀ¸·Î º¯°æ ½Ã Ã³¸® 386

Chapter 22 ½½·¦ ¸Þ¸ð¸® ÇÒ´çÀÚ È°¼ºÈ­Çϱâ - kmem_cache_init() 389
22.1 ½½·¦ ÇÒ´çÀÚ °³³ä°ú ±¸Á¶Ã¼µé 389
22.2 ½½·¦ ÇÒ´çÀÚÀÇ Áß¿ä ±¸Á¶Ã¼ - kmem_cache¿Í kmem_list3 391
22.3 kmem_cache_init() ±¸Á¶ ¾Ë¾Æº¸±â 394
22.4 initkmem_list3[ ], cache_cache.nodelists[ ] ÃʱâÈ­ 399
22.5 kmem_list3 ¹è¿­¿¡ ¿¬°áÇÏ°í cache Ãà¼Ò½Ã°£ Á¤Çϱâ - set_up_list3s() 401
22.6 cacheÀÇ È®Àå ¹× Ãà¼Ò¿¡¼­ »ç¿ëµÉ ÆäÀÌÁö ¿À´õ ±¸Çϱâ - cache_estimate() 402
22.7 malloc_sizes¿Í cache_names 406
22.8 cache »ý¼ºÇϱâ - kmem_cache_create() 408
22.8.1 kmem_cache_zalloc() 410
22.8.2 calculate_slab_order() 411
22.8.3 setup_cpu_cache() 412
22.8.4 enable_cpucache() 414
22.9 arraycache_init, kmem_list3 cache »ý¼º 414
22.10 Á¤ÀûÀ¸·Î ÇÒ´ç¹ÞÀº ¸Þ¸ð¸®¸¦ kmalloc()À» ÅëÇØ ÇÒ´ç¹ÞÀº ¸Þ¸ð¸®·Î ´ëüÇϱâ 417

Chapter 23 kmem_trace_init() ~ security_init() 420
23.1 ID allocator Ä³½Ã »ý¼ºÇϱâ ? idr_init_cache() 421
23.2 pageset ÃʱâÈ­Çϱâ - setup_per_cpu_pageset() 421
23.3 ÀÎÅ͸®ºê ³ëµå ÁöÁ¤Çϱâ - numa_policy_init() 427
23.4 Å¸À̸ӠÃʱâÈ­ ¸¶¹«¸®Çϱâ - late_time_init() 431
23.5 BogoMIPS ÃøÁ¤Çϱâ - calibrate_delay() 431
23.6 ÇÁ·Î¼¼½º ½Äº°ÀÚ(ID) ÇÒ´çÀ» À§ÇÑ ºñÆ®¸Ê ¸¸µé±â - pidmap_init() 433
23.7 ¿ì¼±¼øÀ§ Æ®¸®ÀÇ ÀڷᱸÁ¶ ÃʱâÈ­Çϱâ - prio_tree_init() 435
23.8 anon_vma ½½·¦ Ä³½Ã »ý¼ºÇϱâ - anon_vma_init() 435
23.9 °´Ã¼¿¡ »ç¿ëÀÚº°·Î ÀÚ°Ý ºÎ¿©Çϱâ ? cred_init() 437
23.10 fork()¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÀڷᱸÁ¶ ÃʱâÈ­Çϱâ - fork_init() 438
23.11 ÇÁ·Î¼¼½º »ý¼ºÀ» À§ÇѠij½Ã ÃʱâÈ­Çϱâ - proc_caches_init() 439
23.12 ¹öÆ۠ij½Ã ÃʱâÈ­Çϱâ - buffer_init() 442
23.13 º¸¾È Å° ÁغñÇϱâ ? key_init() 445

Chapter 24 VFS¿¡¼­ »ç¿ëµÇ´Â ´Ù¾çÇѠij½Ãµé ÃʱâÈ­Çϱâ - vfs_caches_init() 449

Chapter 25 radix_tree_init() ~ ftrace_init() 468
25.1 ·¡µñ½º Æ®¸® °ü·ÃµÈ ÀڷᱸÁ¶ ÃʱâÈ­Çϱâ - radix_tree_init() 469
25.2 ½Ã±×³ÎÀ» »ç¿ëÇÒ ÁغñÇϱâ ? signals_init() 470
25.3 proc ÆÄÀϽýºÅÛÀ» µî·ÏÇÏ°í ¸¶¿îÆ®Çϱâ - proc_root_init() 471
25.4 ÃʱâÈ­ÇÏÁö ¸øÇÑ ¼­ºê½Ã½ºÅÛ µî·ÏÇϱâ - cgroup_init() 472
25.5 top_cpusetÀ» Àç¼³Á¤ÇÏ°í cpuset ÆÄÀϽýºÅÛ µî·ÏÇϱâ - cpuset_init() 474
25.6 Å½ºÅ© Åë°è Á¤º¸ ÀÎÅÍÆäÀ̽º ÃʱâÈ­Çϱâ - taskstats_init_early() 475
25.7 Áö¿¬ Á¤º¸ °ü¸®¸¦ À§ÇÑ Áغñ - delayacct_init() 477
25.7.1 µô·¹ÀÌ ¾îÄ«¿îÆà477
25.7.2 dealyacct_init() 477
25.7.3 task_delay_info ±¸Á¶Ã¼¿Í delayacct_tsk_init() 478
25.8 ¾²±â ¹öÆÛÀÇ ÀÏ°ü¼º °Ë»çÇϱâ - check_bugs() 481

Chapter 26 ¸Þ¸ð¸®¿Í ¹éÅ· ½ºÅä¾î ½ÌÅ©Çϱâ - ÆäÀÌÁö ¶óÀÌÆ®¹é 483
26.1 ÆäÀÌÁö ¶óÀÌÆ®¹é ¸ÞÄ¿´ÏÁò 484
26.2 ÆäÀÌÁö ¶óÀÌÆ®¹é È°¼ºÈ­Çϱâ - pdflush_init() 485
26.3 pdflush ½º·¹µå 487
26.4 ÆäÀÌÁö ¶óÀÌÆ®¹é ÇÔ¼ö ÁöÁ¤Çϱâ - pdflush_operation() 489
26.5 ¾î¶»°Ô ÁÖ±âÀû ÆäÀÌÁö ¶óÀÌÆ®¹é, °­Á¦Àû ÆäÀÌÁö ¶óÀÌÆ®¹é Äݹé ÇÔ¼ö°¡ È£ÃâµÇ³ª? 490
26.5.1 ÁÖ±âÀû ÆäÀÌÁö ¶óÀÌÆ®¹é ÇÔ¼ö - wb_kupdate() 490
26.5.2 °­Á¦Àû ÆäÀÌÁö ¶óÀÌÆ®¹é ÇÔ¼ö - background_writeout() 493
26.6 ÁÖ±âÀû ÆäÀÌÁö ¶óÀÌÆ®¹é ÃʱâÈ­Çϱâ - page_writeback_init() 494

Chapter 27 Ä¿³Î ºÎÆÃÀÇ ¸¶Áö¸· ÇÔ¼ö ±¸Á¶ ¾Ë¾Æº¸±â - rest_init() 496

Chapter 28 ÇÔ¼ö¸¦ ½ÇÇàÇÒ Ä¿³Î ½º·¹µå »ý¼ºÇϱâ - kernel_thread() 499
28.1 kernel_thread() ±¸Á¶ ¾Ë¾Æº¸±â 499
28.2 ÇÁ·Î¼¼¼­¸¦ »ý¼ºÇϴ °ÔÀÌÆ®¿þÀÌ - do_fork() 500
28.3 ºÎ¸ð ÇÁ·Î¼¼½º º¹»çÇϱâ - copy_process() 504

Chapter 29 »õ·Î »ý¼ºÇѠŽºÅ© ±ú¿ì±â 514
29.1 wake_up_new_task() ±¸Á¶ ¾Ë¾Æº¸±â 514
29.2 Å½ºÅ©ÀÇ ·±Å¥ °¡Á®¿À±â - task_rq_lock() 517
29.3 Å½ºÅ©ÀÇ ¿ì¼±¼øÀ§ °³¼±Çϱâ - effective_prio() 518

Chapter 30 Ä¿³Î »ç¿ëÇÒ ÁغñÇϱâ - kernel_init() 522
30.1 ÇöÀç ÇÁ·Î¼¼½º¸¦ ´Ù¸¥ CPU·Î ÀÌÁÖ½ÃÅ°±â - sched_init_smp() 523
30.2 ½Ã½ºÅÛ Àü¹ÝÀûÀ¸·Î ÃʱâÈ­ ¸¶¹«¸®Çϱâ - do_basic_setup() 526
30.2.1 rcu_sched_grace_period()¸¦ ½ÇÇàÇÒ ½º·¹µå »ý¼ºÇϱâ - rcu_init_sched() 527
30.2.2 events ¿öÅ© Å¥ »ý¼ºÇϱâ - init_workqueues() 528
30.2.3 cpuset ¼­ºê½Ã½ºÅÛÀÇ top_cpuset ÃʱâÈ­Çϱâ - cpuset_init_smp() 535
30.2.4 khelper ¿öÅ© Å¥ »ý¼ºÇϱâ - usermodehelper_init() 536
30.2.5 ¸®´ª½ºÀÇ µð¹ÙÀ̽º ¸ðµ¨ ÃʱâÈ­Çϱâ - driver_init() 538
30.2.6 irq Á¤º¸¸¦ proc ÆÄÀϽýºÅÛ¿¡ µî·ÏÇϱâ - init_irq_proc() 548
30.2.7 Ä¿³ÎÀÌ ¸ð¸£´Â ¼­ºê½Ã½ºÅ۠ȣÃâÇϱâ - do_initcalls() 549
30.3 ÃʱâÈ­ ´ÙÀ½À» ÁغñÇϱâ ? init_post() 554

Chapter 31 Ä¿³Î ½º·¹µå µ¥¸ó 556
31.1 Ä¿³Î ½º·¹µå µ¥¸ó - kthreadd() 556
31.2 ½Ã±×³Î ¹«½ÃÇϱâ - ignore_signals() 559
31.3 ³ªÀ̽º °ª ¼³Á¤Çϱâ - set_user_nice() 562
31.4 Å½ºÅ©¸¦ ½ÇÇà½Ãų CPU Ã£±â - set_cpus_allowed_ptr() 567
31.5 ¸®½ºÆ®¸¦ Æ÷ÇÔÇÏ°í Àִ ½ÇÁ¦ ±¸Á¶Ã¼ À§Ä¡ Ã£±â - list_entry() 569
31.6 Ä¿³Î ½º·¹µå »ý¼ºÇϱâ - create_kthread() 572

Chapter 32 find_task_by_pid_ns() ~ cpu_idle() 575
32.1 PID·Î Å½ºÅ© Ã£±â - find_task_by_pid_ns() 576
32.2 BKL ÇØÁ¦Çϱâ - unlock_kernel() 579
32.3 ½ºÄÉÁÙ¸µ Å¬·¡½º¸¦ idle·Î º¯°æÇϱâ - init_idle_bootup_task() 580
32.4 RCU ¸ÞÄ¿´ÏÁòÀÌ È°¼ºÈ­µÇ¾úÀ½À» ¾Ë¸®±â - rcu_scheduler_starting() 580
32.5 Ä¿³Î ¼±Á¡ È°¼ºÈ­Çϱâ - preempt_enable_no_resched() 581
32.6 ÇÁ·Î¼¼½º ½ºÄÉÁÙ¸µ ¼öÇàÇϱâ - schedule() 582
32.6.1 schedule()ÀÇ ÁøÂ¥ ¾Ë¸ÍÀÌ - _ _schedule() 582
32.7 ¸®´ª½º ºÎÆà´ëÀåÁ¤ÀÇ ³¡ - cpu_idle() 584

Appendix A ¾î¼Àºí·¯, gas Å°¿öµå Á¤¸® 588
A.1 ARM ¸í·É¾î ±âº» 588
A.1.1 ºÐ±â ¸í·É¾î 588
A.1.2 »ê¼ú ¿¬»ê ¸í·É¾î 588
A.1.3 ³í¸® ¿¬»ê ¸í·É¾î 588
A.1.4 ºñ±³ ¿¬»ê ¸í·É¾î 589
A.1.5 µ¥ÀÌÅÍ Àü¼Û ¸í·É¾î 589
A.1.6 »óÅ ·¹Áö½ºÅÍ ¸í·É¾î 589
A.1.7 ÄÚÇÁ·Î¼¼¼­ ¸í·É¾î 590
A.1.8 ±âŸ ¸í·É¾î 591
A.2 Á¶°ÇºÎ ½ÇÇà 591
A.3 gas Áö½Ã¾î 592

Appendix B Ä¿³Î ºÐ¼® ½Ã ÀÚÁÖ ³ª¿À´Â API 594
B.1 ÀÌÁß ¿¬°á ¸®½ºÆ® 594
B.2 ºñÆ® ¿¬»ê API 595

Appendix C °¡º±°Ô ¾Ë¾Æº¸´Â ext2 ÆÄÀϽýºÅÛ 596
C.1 ÆÄÀÏÀ» ³ªÅ¸³»´Â ±¸Á¶: inode 596
C.2 i_mode Çʵ带 ÀÌ·ç´Â ºñÆ® ±¸Á¶ 597
C.3 ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ °¡Áö°í Àִ Çʵå - i_block[] 598
C.4 µð½ºÅ©¿¡ ÀúÀåµÇ´Â ±¸Á¶ 600
C.4.1 ÆÄƼ¼ÇÀÌ °¡Áö´Â ±¸Á¶ 600
C.4.2 Block Group ±¸Á¶ 601
C.4.3 Inode Table ±¸Á¶ 603
C.4.4 µð·ºÅ͸®, ÆÄÀÏ, Inode Table, Data Block °£ÀÇ °ü°è 604

Appendix D ¸®´ª½º ½º·¹µå ¸ðµ¨ 608
D.1 ½º·¹µå ¸ðµ¨ 608
D.2 ¸®´ª½º ½º·¹µå ±¸Çö 609

Appendix E ¸µÄ¿ ½ºÅ©¸³Æ® ÆÄÀÏÀÇ ±¸Á¶ 612
E.1 ARM ¸µÄ¿ ½ºÅ©¸³Æ® ÆÄÀÏ ±¸¼º 613
E.2 ¸µÄ¿ ½ºÅ©¸³Æ® ±¸¼ºµµ 615

Appendix F Äڵ堸®½ºÆ® 623

Appendix G ±×¸² ¸®½ºÆ® 632

Appendix H ¾Ë¾Æº¾½Ã´Ù! ¸®½ºÆ® 639

ã¾Æº¸±â 642

ÇÑÁÙ ¼­Æò