· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/Kernel Analysis-HOWTO

Kernel Analysis-HOWTO

Kernel Analysis-HOWTO

Roberto Arcomano

           
        

±è³²Çü

           
        

고친 과정
고침 0.72003-03-26

차례
1. ¼­¹®
1.1. ¼­¹®
1.2. ÀúÀÛ±Ç Á¤º¸
1.3. ¹ø¿ª¿¡ °üÇÏ¿©
1.4. °¨»çÀÇ ±Û
2. »ç¿ëµÈ ¹®¹ý
2.1. ÇÔ¼öÀÇ ¹®¹ý
2.2. µé¿©¾²±â
2.3. ÇÔ¼ö°£ È£Ã⠺м® (InterCalling Analysis)
2.3.1. °³¿ä
2.3.2. ¼¼ºÎ»çÇ×
2.3.3. ÇÔ¼ö°£ È£Ã⠺м®ÀÇ ÀåÁ¡
2.3.4. ÇÔ¼ö°£ È£Ã⠺м®ÀÇ ´ÜÁ¡
3. ±âÃÊÀûÀÎ ³»¿ë
3.1. Ä¿³ÎÀ̶õ ¹«¾ùÀΰ¡?
3.2. »ç¿ëÀÚ ¸ðµå¿Í Ä¿³Î ¸ðµå
3.2.1. °³¿ä
3.2.2. µ¿ÀÛ ¸ðµå
3.3. »ç¿ëÀÚ ¸ðµå¿¡¼­ Ä¿³Î ¸ðµå·Î Àüȯ
3.3.1. ¾ðÁ¦ ÀÌ·¯ÇÑ ÀüȯÀÌ ÀϾ´Â°¡?
3.3.2. ½Ã½ºÅÛ ÄÝ
3.3.3. IRQ À̺¥Æ®
3.4. ¸ÖƼŽºÅ·
3.4.1. ¸ÞÄ«´ÏÁò
3.4.2. ŽºÅ© ±³È¯ (task switching)
3.5. ¸¶ÀÌÅ©·ÎÄ¿³Î OS ¿Í ¸ð³î¸®Æ½ OS
3.5.1. °³¿ä
3.5.2. ¸¶ÀÌÅ©·Î Ä¿³Î ¹æ½ÄÀÇ Àå´ÜÁ¡
3.6. ³×Æ®¿öÅ·
3.6.1. ISO ÀÇ OSI °èÃþ
3.6.2. Ä¿³ÎÀº ¹«½¼ ÀÏÀ» Çϴ°¡?
3.7. °¡»ó ¸Þ¸ð¸®
3.7.1. ¼¼±×¸ÕÅ×ÀÌ¼Ç (Segmentation)
3.7.2. ¼¼±×¸ÕÅ×À̼ÇÀÇ ¹®Á¦Á¡
3.7.3. ÆäÀÌÁö³×ÀÌ¼Ç (Pagination)
3.7.4. ÆäÀÌÁö³×À̼ÇÀÇ ¹®Á¦Á¡
3.7.5. ¼¼±×¸ÕÅ×À̼ǰú ÆäÀÌÁö³×À̼Ç
4. ¸®´ª½ºÀÇ ½ÃÀÛ
5. ¸®´ª½ºÀÇ Æ¯Â¡
5.1. °³¿ä
5.1.1. À¯¿¬¼ºÀ» À§ÇÑ ¿ä¼Òµé
5.2. ÆäÀÌÁö³×À̼Ǹ¸À» »ç¿ë
5.2.1. ¸®´ª½º ¼¼±×¸ÕÆ®
5.2.2. ¸®´ª½º ÆäÀÌÁö³×À̼Ç
5.2.3. ¿Ö ŽºÅ©µé °£¿¡ ÁÖ¼Ò Ãæµ¹ÀÌ ÀϾÁö ¾Ê´Â°¡?
5.2.4. ¸Þ¸ð¸®¸¦ ÆäÀÌÁö ´ÜÀ§·Î ºÐ¸®ÇØ¾ß Çϴ°¡?
5.2.5. Ä¿³Î ÆäÀÌÁö¿¡ ´ëÇÏ¿©
5.3. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® (SoftIRQ)
5.3.1. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ Áغñ
5.3.2. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ¼³Á¤
5.3.3. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ½ÇÇà
5.4. Ä¿³Î ¾²·¹µå
5.4.1. Ä¿³Î ¾²·¹µå ¿¹Á¦: kswapd [mm/vmscan.c]
5.5. Ä¿³Î ¸ðµâ
5.5.1. °³¿ä
5.5.2. ¸ðµâÀÇ ·Îµù°ú ¾ð·Îµù
5.5.3. ¸ðµâÀÇ Á¤ÀÇ
5.5.4. Ä¿³Î¿¡ À¯¿¬¼ºÀ» Ãß°¡ÇÏ´Â À¯¿ëÇÑ ÆÁ
5.6. proc µð·ºÅ丮
5.6.1. /proc/sys/kernel
5.6.2. /proc/sys/net
5.6.3. /proc/sys/net/core
5.6.4. /proc/sys/net/ipv4
5.6.5. /proc/sys/net/ipv4/conf/interface
6. ¸®´ª½º ¸ÖƼŽºÅ·
6.1. °³¿ä
6.1.1. ŽºÅ© »óÅÂ
6.2. ŸÀÓ ½½¶óÀ̽º
6.2.1. PIT 8253 ÇÁ·Î±×·¡¹Ö
6.2.2. ¸®´ª½º ŸÀÌ¸Ó ÀÎÅÍ·´Æ® - ÇÔ¼ö°£ È£Ã⠺м®
6.3. ½ºÄÉÁÙ·¯
6.4. ÇϹݺΠ(Bottom Half), ŽºÅ© Å¥ (Task Queues), ¼ÒÀÛ¾÷ (Tasklets)
6.4.1. °³¿ä
6.4.2. ¼±¾ð
6.4.3. Ç¥½Ã
6.4.4. ½ÇÇà
6.5. Àú¼öÁØ ·çƾµé
6.6. ŽºÅ© ½ºÀ§Äª
6.6.1. ŽºÅ© ½ºÀ§ÄªÀº ¾ðÁ¦ ÀϾ´Â°¡?
6.6.2. ŽºÅ© ½ºÀ§Äª
6.7. Fork
6.7.1. °³¿ä
6.7.2. ¹«¾ùÀÌ º¹»çµÇÁö ¾Ê´Â°¡?
6.7.3. fork ÇÔ¼ö°£ È£Ã⠺м®
6.7.4. Copy on Write
7. ¸Þ¸ð¸® °ü¸®
7.1. °³¿ä
7.1.1. ¼¼±×¸ÕÆ®
7.2. i386 ¿¡¼­ÀÇ Æ¯Â¡
7.3. ¸Þ¸ð¸® ¸ÅÇÎ
7.4. Àú¼öÁØÀÇ ¸Þ¸ð¸® ÇÒ´ç
7.4.1. ºÎÆÃ½Ã ÃʱâÈ­ °úÁ¤
7.4.2. ·±Å¸ÀÓ ÇÒ´ç
7.5. ½º¿ÍÇÎ
7.5.1. °³¿ä
7.5.2. kswapd
7.5.3. ¾ðÁ¦ ½º¿ÍÇÎÀÌ ÇÊ¿äÇѰ¡?
8. ¸®´ª½º ³×Æ®¿öÅ·
8.1. ¸®´ª½ºÀÇ ³×Æ®¿öÅ© °ü¸® ¹æ¹ý
8.2. TCP ¿¹Á¦
8.2.1. ÀÎÅÍ·´Æ® ó¸®: netif_rx
8.2.2. ÀÎÅÍ·´Æ® ó¸® ÈÄ: net_rx_action
9. ¸®´ª½º ÆÄÀÏ ½Ã½ºÅÛ
10. À¯¿ëÇÑ ÆÁ
10.1. ½ºÅðú Èü
10.1.1. °³¿ä
10.1.2. ¸Þ¸ð¸® ÇÒ´ç
10.2. ÀÀ¿ë ÇÁ·Î±×·¥ (Application) °ú ÇÁ·Î¼¼½º
10.2.1. ±âº»ÀûÀÎ Á¤ÀÇ
10.3. ¶ô (locks)
10.3.1. °³¿ä
10.4. Copy on Write
11. 80386 CPU ¿¡ ´ëÇÑ ºÎºÐµé
11.1. ºÎÆÃ °úÁ¤
11.2. 80386 (±× ÀÌÈÄ ¹öÀü Æ÷ÇÔ) ÀÇ µð½ºÅ©¸³ÅÍ(Descriptors)
11.2.1. °³¿ä
11.2.2. µð½ºÅ©¸³ÅÍÀÇ Á¾·ù
12. IRQ
12.1. °³¿ä
12.2. »óÈ£ÀÛ¿ë µµ½Ä (Interaction Schema)
12.2.1. ¹«½¼ ÀÏÀÌ ÀϾ´Â°¡?
13. À¯Æ¿¸®Æ¼ ÇÔ¼öµé
13.1. list_entry [include/linux/list.h]
13.2. Sleep
13.2.1. Sleep Code
13.2.2. ½ºÅÃÀÇ °í·Á
14. Á¤Àû º¯¼öµé
14.1. °³¿ä
14.2. ÁÖ¿ä º¯¼öµé
14.2.1. current
14.2.2. µî·ÏµÈ ÆÄÀÏ ½Ã½ºÅÛ
14.2.3. ¸¶¿îÆ®µÈ ÆÄÀÏ ½Ã½ºÅÛ
14.2.4. µî·ÏµÈ ³×Æ®¿öÅ© ÆÐŶ ŸÀÔ
14.2.5. µî·ÏµÈ ³×Æ®¿öÅ© ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝ
14.2.6. µî·ÏµÈ ³×Æ®¿öÅ© ÀåÄ¡
14.2.7. µî·ÏµÈ ¹®ÀÚ ÀåÄ¡
14.2.8. µî·ÏµÈ ºí·° ÀåÄ¡
15. ¿ë¾î
16. ¸µÅ©

1. ¼­¹®


1.1. ¼­¹®

ÀÌ ¹®¼­¿¡¼­´Â ¸®´ª½º Ä¿³ÎÀ» ±¸¼ºÇÏ´Â °¢ ºÎºÐÀ» Á¤ÀÇÇÏ°í ±× ºÎºÐÀ» ¼öÇàÇÏ´Â ÁÖµÈ ÇÔ¼ö¿Í ÀÚ·á ±¸Á¶, ±×¸®°í À̵éÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö (how the "wheel spins") ¸¦ ¼³¸íÇÏ·Á°í ÇÑ´Ù. ÀÌ ¹®¼­ÀÇ ÃֽйöÀüÀº http://www.bertolinux.com ¿¡¼­ ã¾Æº¼ ¼ö ÀÖ´Ù. ÀÌ ¹®¼­¿¡ ´ëÇÑ °³¼±Á¡À̳ª Á¦¾È »çÇ×ÀÌ ÀÖ´Ù¸é ´ç½ÅÀÇ ¾ÆÀ̵ð¾î¸¦ ´ÙÀ½ÀÇ ¸ÞÀÏ ÁÖ¼Ò¸¦ ÅëÇØ º¸³»Áֱ⠹ٶõ´Ù: . ÀÌ ¹®¼­¿¡ »ç¿ëµÈ ÄÚµåµéÀº ÀÌ HOWTO ¹®¼­°¡ ¾²¿©Áö°í ÀÖ´Â ½ÃÁ¡¿¡¼­ ÃֽоÈÁ¤ ¹öÀüÀÎ ¸®´ª½º Ä¿³Î ¹öÀü 2.4.x ¸¦ ÂüÁ¶ÇÏ¿´´Ù.


1.2. ÀúÀÛ±Ç Á¤º¸

Copyright (C) 2000,2001,2002 Roberto Arcomano. Copyright (C) 2003 ±è³²Çü (Çѱ¹¾îÆÇ). º» ¹®¼­´Â ¿©·¯ºÐÀÌ ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü(Free Software Foundation)¿¡¼­ ¹ßÇàÇÑ GNU ¶óÀ̺귯¸® ÀÏ¹Ý °ø°³ »ç¿ë±Ç(GNU Library General Public License)ÀÇ ±ÔÁ¤(Áï »ç¿ë±Ç 2ÆÇÀ̳ª ȤÀº ¿©·¯ºÐÀÇ ¼±Åÿ¡ µû¶ó ´õ ÀÌÈÄÀÇ »ç¿ë±Ç)À» ÁؼöÇÏ´Â ÇÑ ÀçÀ¯Æ÷Çϰųª ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ÀÚÀ¯ ¹®¼­ÀÌ´Ù. º» ¹®¼­´Â À̰ÍÀÌ À¯¿ëÇÏ°Ô »ç¿ëµÇ±â¸¦ ¹Ù¶ó´Â ¸¶À½À¸·Î ¹èÆ÷ÇÏ´Â °ÍÀÌÁö¸¸, ±×¿¡ ´ëÇÑ ¾î¶°ÇÑ º¸Áõµµ ÇÏÁö ¾Ê´Â´Ù: »ó¾÷ÀûÀÎ ¿ëµµ³ª ƯÁ¤ÇÑ ¸ñÀû¿¡ ¸Â°Ô »ç¿ë ÇßÀ»¶§ Àǹ«ÀûÀ¸·Î µû¶ó ºÙ´Â º¸Áõµµ ¾ø´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº GNU ¶óÀ̺귯¸® ÀÏ¹Ý ´ëÁß »ç¿ë±Ç (GPL) ¿¡ ´ëÇØ º¸±â ¹Ù¶õ´Ù. GNU GPL ÀÇ º¹»çº»Àº ¿©±â ¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù.


1.3. ¹ø¿ª¿¡ °üÇÏ¿©

´ç½ÅÀÌ ÀÌ ¹®¼­¸¦ ¹ø¿ªÇÏ´Â °ÍÀº ÀÚÀ¯ÀÌ´Ù. ÇÏÁö¸¸ ±×Àü¿¡ ´ÙÀ½°ú °°Àº »çÇ×µéÀ» Âü°íÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù:

  1. ´ç½ÅÀÌ ¹ø¿ªÇؼ­ ¿Ã¸®°íÀÚ ÇÏ´Â LDP ¿¡ ÀÌ¹Ì ÀÌ ¹®¼­ÀÇ ¹ø¿ªº»ÀÌ ÀÖ´ÂÁö üũÇÑ´Ù.

  2. ÀýÀ» À¯ÁöÇÑ´Ù. (, , , À» Æ÷ÇÔ)

참고: TXT ÆÄÀÏÀ̳ª HTML ÆÄÀÏÀ» Á÷Á¢ ¹ø¿ªÇؼ­´Â ¾ÈµÇ°í LYX ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¡¾ß¸¸ À̸¦ ÀÌ¿ëÇØ ´Ù¸¥ ÆÄÀÏ Çü½Ä (TXT, HTML, RIFF µî) À¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. "LyX" ÇÁ·Î±×·¥À» »ç¿ëÇϱâ À§Çؼ­ http://www.lyx.org ¿¡¼­ ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù.

¹ø¿ªÀ» À§Çؼ­ ³ª¿¡°Ô Áú¹®À» ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×Àú ´ç½ÅÀÇ ¹ø¿ª¹°¿¡ °üÇØ (´ç½ÅÀÌ ¿øÇÑ´Ù¸é) ³»°¡ ¾Ë ¼ö ÀÖ°Ô¸¸ ÇØÁÖ¸é µÈ´Ù.

´ç½ÅÀÇ ¹ø¿ª¿¡ °¨»çÇÑ´Ù!


1.4. °¨»çÀÇ ±Û

ÀÌ ¹®¼­¸¦ »¡¸® ¿Ã·ÁÁÖ°í ¹ßÇ¥ÇØ ÁØ The Linux Documentation Project ¿¡ °¨»çÇÑ´Ù.

Klaas de Waal ÀÇ Á¦¾È¿¡ °¨»çÇÑ´Ù.


2. »ç¿ëµÈ ¹®¹ý


2.1. ÇÔ¼öÀÇ ¹®¹ý

ÇÔ¼ö¿¡ ´ëÇØ¼­ ¼³¸íÇÒ ¶§´Â ´ÙÀ½°ú °°Àº ÇüÅ·Πǥ±âÇÑ´Ù:

	   "ÇÔ¼ö À̸§ [ ÆÄÀÏ À§Ä¡ . È®ÀåÀÚ ]"
	  

¿¹¸¦ µé¾î:

예 1.

"schedule [ kernel/sched.c ]"

¶ó´Â Ç¥ÇöÀÌ ÀÖÀ» ¶§ À̰ÍÀº ¿ì¸®°¡ Áö±Ý

예 2.

"schedule"

À̶ó´Â ÇÔ¼ö¿¡ °üÇØ¼­ ¼³¸íÇϰí ÀÖÀ½À» ³ªÅ¸³»¸ç, ÀÌ ÇÔ¼ö´Â

예 3.

[ kernel/sched.c ]

¶ó´Â ÆÄÀÏ¿¡¼­ ã¾Æº¼ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù.

참고: ¿©±â¼­´Â ½ÃÀÛ µð·ºÅ丮°¡ /usr/src/linux ¶ó°í °¡Á¤Çϰí ÀÖ´Â °ÍÀÌ´Ù.


2.2. µé¿©¾²±â

¼Ò½º ÄÚµå ¾È¿¡¼­ÀÇ µé¿©¾²±â¿¡´Â 3°³ÀÇ °ø¹é¹®ÀÚ°¡ »ç¿ëµÇ¾ú´Ù.


2.3. ÇÔ¼ö°£ È£Ã⠺м® (InterCalling Analysis)


2.3.1. °³¿ä

ÀÌ ¹®¼­¿¡¼­´Â Ä¿³Î ÇÔ¼öµéÀÇ È£Ãâ °ü°è¸¦ Ç¥ÇöÇϱâ À§ÇØ (µé¿©¾²±âÀÇ ¹æ½ÄÀ¸·Î) "ÇÔ¼ö°£ È£Ã⠺м® (InterCalling Analysis : ICA)" À» »ç¿ëÇÑ´Ù.

¿¹¸¦ µé¾î sleep_on À̶ó´Â ÇÔ¼ö¸¦ ÇÔ¼ö°£ È£Ã⠺м®À» ÅëÇØ Ç¥ÇöÇÏ¸é ¾Æ·¡¿Í °°´Ù:

		  
|sleep_on
|init_waitqueue_entry      --
|__add_wait_queue            |   enqueuing request  
   |list_add                 |
      |__list_add          -- 
   |schedule              ---     waiting for request to be executed
      |__remove_wait_queue --   
      |list_del              |   dequeuing request
         |__list_del       -- 
 
                          sleep_on ICA
        

µé¿©¾²±â·Î Ç¥ÇöµÈ ÇÔ¼ö°£ È£Ã⠺м® µÚ¿¡´Â ÇÔ¼öÀÇ À§Ä¡°¡ ³ª¿Â´Ù:

  • sleep_on [kernel/sched.c]

  • init_waitqueue_entry [include/linux/wait.h]

  • __add_wait_queue

  • list_add [include/linux/list.h]

  • __list_add

  • schedule [kernel/sched.c]

  • __remove_wait_queue [include/linux/wait.h]

  • list_del [include/linux/list.h]

  • __list_del

참고: ÇÔ¼öÀÇ À§Ä¡°¡ ¹Ù·Î ¾Õ¿¡ Ç¥½ÃÇÑ ÇÔ¼öÀÇ À§Ä¡¿Í °°Àº °æ¿ì¿¡´Â ¸í½ÃÇÏÁö ¾Ê¾Ò´Ù.


2.3.2. ¼¼ºÎ»çÇ×

ÇÔ¼ö°£ È£Ã⠺м®¿¡¼­ ´ÙÀ½°ú °°Àº ÇüŰ¡ ÀÖÀ» °ÍÀÌ´Ù:

function1 -> function2
		

À̰ÍÀº function1 Àº ´Ù¸¥ ÇÔ¼ö¸¦ °¡¸®Å°´Â ÀϹÝÀûÀÎ Æ÷ÀÎÅͶó´Â °ÍÀ» ¶æÇÑ´Ù. À§ÀÇ °æ¿ì¿¡¼­ function1 Àº function2 ¸¦ °¡¸®Å²´Ù.

¶Ç ´ÙÀ½°ú °°Àº ÇüÅ¿¡¼­´Â:

function:
		

function Àº ÇÔ¼ö°¡ ¾Æ´ÔÀ» ¶æÇÑ´Ù. À̰ÍÀº ·¹À̺íÀÌ´Ù (ÀϹÝÀûÀ¸·Î ¾î¼Àºí·¯ ·¹À̺íÀÏ °ÍÀÌ´Ù).

ÀÌ ¹®¼­¿¡¼­´Â ¸¹Àº Àý¿¡¼­ C ÄÚµåÀÇ Çüųª ½´µµ-ÄÚµå ÀÇ ÇüÅ·ΠǥÇöÇÏ¿´´Ù. ½ÇÁ¦ÀÇ ¼Ò½º ÆÄÀÏ¿¡´Â À̰͵éÀÌ ¾î¼Àºí·¯ Äڵ峪 ±¸Á¶È­ µÇÁö ¾ÊÀº ÄÚµåÀÇ ÇüÅ·Πµé¾îÀÖÀ» ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ Â÷ÀÌÁ¡Àº ÇнÀÀ» À§ÇÑ °ÍÀÌ´Ù.


2.3.3. ÇÔ¼ö°£ È£Ã⠺м®ÀÇ ÀåÁ¡

ÇÔ¼ö°£ È£Ã⠺м® (ICA) ¸¦ »ç¿ëÇϴµ¥ À־ ´ÙÀ½°ú °°Àº ¸¹Àº ÀåÁ¡µéÀÌ ÀÖ´Ù:

  • Ä¿³Î ÇÔ¼ö¸¦ È£ÃâÇÏ¿´À» ¶§ ¾î¶² ÀÏÀÌ ÀϾ´Â °¡¸¦ ÀüüÀûÀ¸·Î ¾Ë ¼ö ÀÖ´Ù.

  • ÇÔ¼öÀÇ µÚ¿¡ ÇÔ¼öÀÇ À§Ä¡°¡ ³ª¿À¹Ç·Î, ÇÔ¼ö°£ È£Ã⠺м®À» ÇϳªÀÇ ÇÔ¼öÀÇ ·¹ÆÛ·±½º ·Îµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

  • ÇÔ¼ö°£ È£Ã⠺м®Àº sleep/awake ¸ÞÄ«´ÏÁò¿¡¼­ À¯¿ëÇÏ´Ù. À̸¦ ÀÌ¿ëÇØ ÇÁ·Î¼¼½º°¡ sleep µÇ±â Àü¿¡ ¾î¶² ÀÏÀ» ÇÏ´ÂÁö¿Í (½ºÄÉÁÙ ÀÌÈÄ¿¡) wake up ÀÌÈÄ¿¡ ¹«½¼ ÀÏÀ» ÇÒ °ÍÀÎÁö¸¦ º¼ ¼ö ÀÖ´Ù.


2.3.4. ÇÔ¼ö°£ È£Ã⠺м®ÀÇ ´ÜÁ¡

ÇÔ¼ö°£ È£Ã⠺м® (ICA) ¸¦ »ç¿ëÇϴµ¥ À־ ´ÙÀ½°ú °°Àº ´ÜÁ¡µéÀÌ ÀÖ´Ù:

  • ¸ðµç ÀÌ·ÐÀûÀÎ ¸ðµ¨¿¡ À־, ½ÇÁ¦ ¼Ò½ºÄÚµå¿Í ƯÁ¤ÇÑ Á¶°Çµé°ú °°Àº ÀÚ¼¼ÇÑ »çÇ×µéÀ» Á¦¿ÜÇÏ°í ´Ü¼øÈ­ ½ÃÄ×´Ù.

  • ½ºÅÃÀÇ »óÅÂ, µ¥ÀÌŸÀÇ °ª µîÀ» Ç¥ÇöÇϱâ À§Çؼ­´Â Ãß°¡ÀûÀΠǥÇöÀÌ Ãß°¡µÇ¾î¾ß ÇÑ´Ù.


3. ±âÃÊÀûÀÎ ³»¿ë


3.1. Ä¿³ÎÀ̶õ ¹«¾ùÀΰ¡?

Ä¿³ÎÀ̶õ ÄÄÇ»ÅÍ ½Ã½ºÅÛÀÇ ÇÙ½É(core) ºÎºÐÀ» ¸»ÇÑ´Ù. Áï, ÄÄÇ»ÅÍÀÇ ÀÚ¿øµéÀ» »ç¿ëÀÚ°¡ °øÀ¯ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¼ÒÇÁÆ®¿þ¾î ÀÌ´Ù.

Ä¿³ÎÀº (±×·¡ÇÈÀ» ÀÌ¿ëÇÑ °ü¸® ÇÁ·Î±×·¥µµ Æ÷ÇÔÇÒ ¼ö ÀÖ´Â) ¿î¿µÃ¼Á¦ÀÇ ÁÖ¿ä ¼ÒÇÁÆ®¿þ¾î¶ó°í »ý°¢ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¿¹¸¦ µé¾î, (´Ù¸¥ Unix ±â¹ÝÀÇ ¿î¿µÃ¼Á¦¿Í °°ÀÌ) ¸®´ª½º¿¡¼­´Â X À©µµ¿ì ȯ°æÀº Ä¿³Î¿¡ ¼ÓÇØÀÖÁö ¾Ê´Ù. ¿Ö³ÄÇϸé X À©µµ¿ì ȯ°æÀº ¿ÀÁ÷ ±×·¡ÇÈ ¿¬»ê ¸¸À» °ü¸®Çϱ⠶§¹®ÀÌ´Ù. (ºñµð¿À Ä«µå ÀåÄ¡¿¡ Á¢±ÙÇϱâ À§Çؼ­ »ç¿ëÀÚ ¸ðµåÀÇ I/O ¸¦ »ç¿ëÇÑ´Ù.)

´ëÁ¶ÀûÀ¸·Î À©µµ¿ìÁî ȯ°æ (Win9x, WinME, WinNT, Win2K, WinXP µî) ¿¡¼­´Â Ä¿³Î°ú ±×·¡ÇÈ È¯°æÀÌ È¥ÇյǾî ÀÖ´Ù.


3.2. »ç¿ëÀÚ ¸ðµå¿Í Ä¿³Î ¸ðµå


3.2.1. °³¿ä

(ÄÄÇ»ÅͰ¡ ¹æ ÇѰ³¸¦ Â÷ÁöÇÒ ¸¸Å­ÀÇ Å©±â¿´´ø) ¿¹Àü¿¡´Â »ç¿ëÀÚµéÀÌ ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ´Â °Íµµ ¹«Ã´ Èûµç ÀÏÀ̾ú°í, ¶§¶§·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÄÄÇ»Å͸¦ ¸Á°¡¶ß¸®±âµµ ÇÏ¿´´Ù.


3.2.2. µ¿ÀÛ ¸ðµå

À§¿Í °°ÀÌ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛÀ» ¸Á°¡¶ß¸®´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ, ÀÌÈÄÀÇ ¿î¿µÃ¼Á¦µéÀº 2 °¡ÁöÀÇ ´Ù¸¥ µ¿ÀÛ ¸ðµå¸¦ °®µµ·Ï µðÀÚÀεǾú´Ù.

  1. Ä¿³Î ¸ðµå: Áß¿äÇÑ ÀڷᱸÁ¶³ª Á÷Á¢ÀûÀÎ Çϵå¿þ¾î Á¢±Ù (I/O ȤÀº memory mapped), Á÷Á¢ÀûÀÎ ¸Þ¸ð¸® Á¢±Ù, IRQ, DMA µîÀÇ Ã³¸®

  2. »ç¿ëÀÚ ¸ðµå: »ç¿ëÀÚ°¡ ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖÀ½

               |          Applications           /|\
               |         ______________           |
               |         | User Mode  |           |  
               |         ______________           | 
               |               |                  |  
Implementation |        _______ _______           |   Abstraction
    Detail     |        | Kernel Mode |           |
               |        _______________           |
               |               |                  |
               |               |                  | 
               |               |                  |
              \|/          Hardware               |
	  

Ä¿³Î ¸ðµå¿¡¼­´Â »ç¿ëÀÚ ¸ðµåÀÇ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛ ÀÚü³ª ½Ã½ºÅÛÀÇ ±â´É¿¡ ¼Õ»óÀ» ÀÔÈ÷´Â °ÍÀ» ¹æÁö ÇÑ´Ù.

±Ù·¡ÀÇ ¸¶ÀÌÅ©·Î ÇÁ·Î¼¼½ºµéÀº Çϵå¿þ¾î ÀûÀ¸·Î ÃÖ¼ÒÇÑ 2 °¡Áö ÀÌ»óÀÇ »óŸ¦ ±¸ÇöÇϰí ÀÖ´Ù. ¿¹¸¦ µé¾î ÀÎÅÚ¿¡¼­´Â, 4 °¡Áö »óÅ·ΠPL (Privilege Level: Ư±Ç ·¹º§) °áÁ¤ÇÑ´Ù. Áï, 0, 1, 2, 3 ÀÇ 4 °¡Áö »óŸ¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ Áß¿¡¼­ Ä¿³Î ¸ðµå´Â 0 À» »ç¿ëÇÑ´Ù.

À¯´Ð½º ±â¹ÝÀÇ ¿î¿µÃ¼Á¦´Â ¿ÀÁ÷ 2 ´Ü°èÀÇ Æ¯±Ç ·¹º§À» ÇÊ¿ä·Î Çϸç, ¾ÕÀ¸·Î ÀÌ·¯ÇÑ °³³äÀÌ ÄÚµå »ó¿¡¼­ ¾î¶»°Ô ÀÌ¿ëµÇ´ÂÁö º¸°Ô µÉ °ÍÀÌ´Ù.


3.3. »ç¿ëÀÚ ¸ðµå¿¡¼­ Ä¿³Î ¸ðµå·Î Àüȯ


3.3.1. ¾ðÁ¦ ÀÌ·¯ÇÑ ÀüȯÀÌ ÀϾ´Â°¡?

À§ÀÇ 2 °¡Áö ¸ðµå¸¦ ÀÌÇØÇß´Ù¸é, ´ÙÀ½À¸·Î ÀÌ·¯ÇÑ 2 °¡Áö ¸ðµå »çÀÌÀÇ ÀüȯÀÌ ¾ðÁ¦ ÀϾ´ÂÁö¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù.

ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ ÀüȯÀÌ ÀϾ´Â °æ¿ì´Â ´ÙÀ½ÀÇ 2 °¡Áö °æ¿ìÀÌ´Ù:

  1. ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇßÀ» ¶§: ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÑ ÀÌÈÄ¿¡, ÇÁ·Î¼¼½º´Â ÀÚµ¿ÀûÀ¸·Î Ä¿³Î ¸ðµå¿¡ ÀÖ´Â Äڵ带 È£ÃâÇÑ´Ù.

  2. IRQ (ȤÀº ¿¹¿Ü) °¡ ¹ß»ýÇßÀ» ¶§: ÀÎÅÍ·´Æ® ¿äû (InterRupt reQuest: IRQ) ÀÌ ¹ß»ýÇÑ ÈÄ¿¡, ÀÎÅÍ·´Æ® Çڵ鷯 (ȤÀº ¿¹¿Ü Çڵ鷯) °¡ È£ÃâµÇ°í, (ÀÎÅÍ·´Æ® 󸮰¡ ³¡³ª¸é) Á¦¾î°æ·Î´Â ¾Æ¹« Àϵµ ¾ø¾ú´ø µíÀÌ (»ç¿ëÀÚ ¸ðµåÀÇ) ÇÁ·Î¼¼½º·Î µ¹¾Æ°£´Ù.


3.3.2. ½Ã½ºÅÛ ÄÝ

½Ã½ºÅÛ ÄÝÀº Ä¿³Î ¸ðµå ³»¿¡ ÀÖ´Â ¿î¿µÃ¼Á¦ ·çƾµéÀ» °ü¸®Çϴ Ưº°ÇÑ ÇÔ¼ö¶ó°í ÇÒ ¼ö ÀÖ´Ù.

½Ã½ºÅÛ ÄÝÀº ´ÙÀ½°ú °°Àº °æ¿ì¿¡ È£ÃâµÈ´Ù:

  • I/O ÀåÄ¡³ª ÆÄÀÏ¿¡ Á¢±ÙÇÒ ¶§ (read/write)

  • Ư±ÇÀÌ ÀÖ´Â Á¤º¸¿¡ Á¢±ÙÇÒ Çʿ䰡 ÀÖÀ» ¶§ (pid, ½ºÄÉÁÙ¸µ Á¤Ã¥ µî)

  • ½ÇÇà ȯ°æÀ» ¹Ù²ã¾ß ÇÒ ¶§ (fork, exec)

  • ƯÁ¤ÇÑ ¸í·ÉÀ» ¼öÇàÇØ¾ß ÇÒ ¶§ (chdir, kill, brk, signal µî)

                                 |                |
                         ------->| System Call i  | (Accessing Devices)
|                |       |       |  [sys_read()]  |
| ...            |       |       |                |
| system_call(i) |--------       |                |
|   [read()]     |               |                |
| ...            |               |                |
| system_call(j) |--------       |                |  
|   [get_pid()]  |       |       |                |
| ...            |       ------->| System Call j  | (Accessing kernel data structures)
|                |               |  [sys_getpid()]|
                                 |                | 
 
    USER MODE                        KERNEL MODE
 
  
                        Unix System Calls Working 
	  

½Ã½ºÅÛ ÄÝÀº »ç¿ëÀÚ ¸ðµå¿¡¼­ ·Î¿ì ·¹º§ÀÇ ÀÚ¿ø (Çϵå¿þ¾î) °ú Åë½ÅÀ» À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÅÀÇ À¯ÀÏÇÑ ÀÎÅÍÆäÀ̽ºÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ´Ü ÇϳªÀÇ ¿¹¿Ü »çÇ×À¸·Î´Â ÇÁ·Î¼¼½º¿¡¼­ ioperm À» È£ÃâÇÑ °æ¿ìÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â »ç¿ëÀÚ ¸ðµå¿¡¼­ ÀåÄ¡¿¡ Á÷Á¢ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. (IRQ ´Â »ç¿ëµÇÁö ¾Ê´Â´Ù.)

참고: ¸ðµç C ¾ð¾î ÇÔ¼ö°¡ ½Ã½ºÅÛ ÄÝÀÎ °ÍÀÌ ¾Æ´Ï¶ó ±×Áß ÀϺΠ¸¸ÀÌ ½Ã½ºÅÛ ÄÝÀÌ´Ù.

´ÙÀ½ÀÇ ¸®½ºÆ®´Â ¸®´ª½º Ä¿³Î 2.4.17 ÀÇ ½Ã½ºÅÛ ÄÝÀÇ ¸ñ·ÏÀ» º¸¿©ÁØ´Ù. [ arch/i386/kernel/entry.S ] [1]

.long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/
        .long SYMBOL_NAME(sys_exit)
        .long SYMBOL_NAME(sys_fork)
        .long SYMBOL_NAME(sys_read)
        .long SYMBOL_NAME(sys_write)
        .long SYMBOL_NAME(sys_open)             /* 5 */
        .long SYMBOL_NAME(sys_close)
        .long SYMBOL_NAME(sys_waitpid)
        .long SYMBOL_NAME(sys_creat)
        .long SYMBOL_NAME(sys_link)
        .long SYMBOL_NAME(sys_unlink)           /* 10 */
        .long SYMBOL_NAME(sys_execve)
        .long SYMBOL_NAME(sys_chdir)
        .long SYMBOL_NAME(sys_time)
        .long SYMBOL_NAME(sys_mknod)
        .long SYMBOL_NAME(sys_chmod)            /* 15 */
        .long SYMBOL_NAME(sys_lchown16)
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old break syscall holder */
        .long SYMBOL_NAME(sys_stat)
        .long SYMBOL_NAME(sys_lseek)
        .long SYMBOL_NAME(sys_getpid)           /* 20 */
        .long SYMBOL_NAME(sys_mount)
        .long SYMBOL_NAME(sys_oldumount)
        .long SYMBOL_NAME(sys_setuid16)
        .long SYMBOL_NAME(sys_getuid16)
        .long SYMBOL_NAME(sys_stime)            /* 25 */
        .long SYMBOL_NAME(sys_ptrace)
        .long SYMBOL_NAME(sys_alarm)
        .long SYMBOL_NAME(sys_fstat)
        .long SYMBOL_NAME(sys_pause)
        .long SYMBOL_NAME(sys_utime)            /* 30 */
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old stty syscall holder */
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old gtty syscall holder */
        .long SYMBOL_NAME(sys_access)
        .long SYMBOL_NAME(sys_nice)
        .long SYMBOL_NAME(sys_ni_syscall)       /* 35 */                /* old ftime syscall holder */
        .long SYMBOL_NAME(sys_sync)
        .long SYMBOL_NAME(sys_kill)
        .long SYMBOL_NAME(sys_rename)
        .long SYMBOL_NAME(sys_mkdir)
        .long SYMBOL_NAME(sys_rmdir)            /* 40 */
        .long SYMBOL_NAME(sys_dup)
        .long SYMBOL_NAME(sys_pipe)
        .long SYMBOL_NAME(sys_times)
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old prof syscall holder */
        .long SYMBOL_NAME(sys_brk)              /* 45 */
        .long SYMBOL_NAME(sys_setgid16)
        .long SYMBOL_NAME(sys_getgid16)
        .long SYMBOL_NAME(sys_signal)
        .long SYMBOL_NAME(sys_geteuid16)
        .long SYMBOL_NAME(sys_getegid16)        /* 50 */
        .long SYMBOL_NAME(sys_acct)
        .long SYMBOL_NAME(sys_umount)                                   /* recycled never used phys() */
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old lock syscall holder */
        .long SYMBOL_NAME(sys_ioctl)
        .long SYMBOL_NAME(sys_fcntl)            /* 55 */
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old mpx syscall holder */
        .long SYMBOL_NAME(sys_setpgid)
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old ulimit syscall holder */
        .long SYMBOL_NAME(sys_olduname)
        .long SYMBOL_NAME(sys_umask)            /* 60 */
        .long SYMBOL_NAME(sys_chroot)
        .long SYMBOL_NAME(sys_ustat)
        .long SYMBOL_NAME(sys_dup2)
        .long SYMBOL_NAME(sys_getppid)
        .long SYMBOL_NAME(sys_getpgrp)          /* 65 */
        .long SYMBOL_NAME(sys_setsid)
        .long SYMBOL_NAME(sys_sigaction)
        .long SYMBOL_NAME(sys_sgetmask)
        .long SYMBOL_NAME(sys_ssetmask)
        .long SYMBOL_NAME(sys_setreuid16)       /* 70 */
        .long SYMBOL_NAME(sys_setregid16)
        .long SYMBOL_NAME(sys_sigsuspend)
        .long SYMBOL_NAME(sys_sigpending)
        .long SYMBOL_NAME(sys_sethostname)
        .long SYMBOL_NAME(sys_setrlimit)        /* 75 */
        .long SYMBOL_NAME(sys_old_getrlimit)
        .long SYMBOL_NAME(sys_getrusage)
        .long SYMBOL_NAME(sys_gettimeofday)
        .long SYMBOL_NAME(sys_settimeofday)
        .long SYMBOL_NAME(sys_getgroups16)      /* 80 */
        .long SYMBOL_NAME(sys_setgroups16)
        .long SYMBOL_NAME(old_select)
        .long SYMBOL_NAME(sys_symlink)
        .long SYMBOL_NAME(sys_lstat)
        .long SYMBOL_NAME(sys_readlink)         /* 85 */
        .long SYMBOL_NAME(sys_uselib)
        .long SYMBOL_NAME(sys_swapon)
        .long SYMBOL_NAME(sys_reboot)
        .long SYMBOL_NAME(old_readdir)
        .long SYMBOL_NAME(old_mmap)             /* 90 */
        .long SYMBOL_NAME(sys_munmap)
        .long SYMBOL_NAME(sys_truncate)
        .lng SYMBOL_NAME(sys_ftruncate)
        .long SYMBOL_NAME(sys_fchmod)
        .long SYMBOL_NAME(sys_fchown16)         /* 95 */
        .long SYMBOL_NAME(sys_getpriority)
        .long SYMBOL_NAME(sys_setpriority)
        .long SYMBOL_NAME(sys_ni_syscall)                               /* old profil syscall holder */
        .long SYMBOL_NAME(sys_statfs)
        .long SYMBOL_NAME(sys_fstatfs)          /* 100 */
        .long SYMBOL_NAME(sys_ioperm)
        .long SYMBOL_NAME(sys_socketcall)
        .long SYMBOL_NAME(sys_syslog)
        .long SYMBOL_NAME(sys_setitimer)
        .long SYMBOL_NAME(sys_getitimer)        /* 105 */
        .long SYMBOL_NAME(sys_newstat)
        .long SYMBOL_NAME(sys_newlstat)
        .long SYMBOL_NAME(sys_newfstat)
        .long SYMBOL_NAME(sys_uname)
        .long SYMBOL_NAME(sys_iopl)             /* 110 */
        .long SYMBOL_NAME(sys_vhangup)
        .long SYMBOL_NAME(sys_ni_syscall)       /* old "idle" system call */
        .long SYMBOL_NAME(sys_vm86old)
        .long SYMBOL_NAME(sys_wait4)
        .long SYMBOL_NAME(sys_swapoff)          /* 115 */
        .long SYMBOL_NAME(sys_sysinfo)
        .long SYMBOL_NAME(sys_ipc)
        .long SYMBOL_NAME(sys_fsync)
        .long SYMBOL_NAME(sys_sigreturn)
        .long SYMBOL_NAME(sys_clone)            /* 120 */
        .long SYMBOL_NAME(sys_setdomainname)
        .long SYMBOL_NAME(sys_newuname)
        .long SYMBOL_NAME(sys_modify_ldt)
        .long SYMBOL_NAME(sys_adjtimex)
        .long SYMBOL_NAME(sys_mprotect)         /* 125 */
        .long SYMBOL_NAME(sys_sigprocmask)
        .long SYMBOL_NAME(sys_create_module)
        .long SYMBOL_NAME(sys_init_module)
        .long SYMBOL_NAME(sys_delete_module)
        .long SYMBOL_NAME(sys_get_kernel_syms)  /* 130 */
        .long SYMBOL_NAME(sys_quotactl)
        .long SYMBOL_NAME(sys_getpgid)
        .long SYMBOL_NAME(sys_fchdir)
        .long SYMBOL_NAME(sys_bdflush)
        .long SYMBOL_NAME(sys_sysfs)            /* 135 */
        .long SYMBOL_NAME(sys_personality)
        .long SYMBOL_NAME(sys_ni_syscall)       /* for afs_syscall */
        .long SYMBOL_NAME(sys_setfsuid16)
        .long SYMBOL_NAME(sys_setfsgid16)
        .long SYMBOL_NAME(sys_llseek)           /* 140 */
        .long SYMBOL_NAME(sys_getdents)
        .long SYMBOL_NAME(sys_select)
        .long SYMBOL_NAME(sys_flock)
        .long SYMBOL_NAME(sys_msync)
        .long SYMBOL_NAME(sys_readv)            /* 145 */
        .long SYMBOL_NAME(sys_writev)
        .long SYMBOL_NAME(sys_getsid)
        .long SYMBOL_NAME(sys_fdatasync)
        .long SYMBOL_NAME(sys_sysctl)
        .long SYMBOL_NAME(sys_mlock)            /* 150 */
        .long SYMBOL_NAME(sys_munlock)
        .long SYMBOL_NAME(sys_mlockall)
        .long SYMBOL_NAME(sys_munlockall)
        .long SYMBOL_NAME(sys_sched_setparam)
        .long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
        .long SYMBOL_NAME(sys_sched_setscheduler)
        .long SYMBOL_NAME(sys_sched_getscheduler)
        .long SYMBOL_NAME(sys_sched_yield)
        .long SYMBOL_NAME(sys_sched_get_priority_max)
        .long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
        .long SYMBOL_NAME(sys_sched_rr_get_interval)
        .long SYMBOL_NAME(sys_nanosleep)
        .long SYMBOL_NAME(sys_mremap)
        .long SYMBOL_NAME(sys_setresuid16)
        .long SYMBOL_NAME(sys_getresuid16)      /* 165 */
        .long SYMBOL_NAME(sys_vm86)
        .long SYMBOL_NAME(sys_query_module)
        .long SYMBOL_NAME(sys_poll)
        .long SYMBOL_NAME(sys_nfsservctl)
        .long SYMBOL_NAME(sys_setresgid16)      /* 170 */
        .long SYMBOL_NAME(sys_getresgid16)
        .long SYMBOL_NAME(sys_prctl)
        .long SYMBOL_NAME(sys_rt_sigreturn)
        .long SYMBOL_NAME(sys_rt_sigaction)
        .long SYMBOL_NAME(sys_rt_sigprocmask)   /* 175 */
        .long SYMBOL_NAME(sys_rt_sigpending)
        .long SYMBOL_NAME(sys_rt_sigtimedwait)
        .long SYMBOL_NAME(sys_rt_sigqueueinfo)
        .long SYMBOL_NAME(sys_rt_sigsuspend)
       .long SYMBOL_NAME(sys_pread)            /* 180 */
        .long SYMBOL_NAME(sys_pwrite)
        .long SYMBOL_NAME(sys_chown16)
        .long SYMBOL_NAME(sys_getcwd)
        .long SYMBOL_NAME(sys_capget)
        .long SYMBOL_NAME(sys_capset)           /* 185 */
        .long SYMBOL_NAME(sys_sigaltstack)
        .long SYMBOL_NAME(sys_sendfile)
        .long SYMBOL_NAME(sys_ni_syscall)               /* streams1 */
        .long SYMBOL_NAME(sys_ni_syscall)               /* streams2 */
        .long SYMBOL_NAME(sys_vfork)            /* 190 */
        .long SYMBOL_NAME(sys_getrlimit)
        .long SYMBOL_NAME(sys_mmap2)
        .long SYMBOL_NAME(sys_truncate64)
        .long SYMBOL_NAME(sys_ftruncate64)
        .long SYMBOL_NAME(sys_stat64)           /* 195 */
        .long SYMBOL_NAME(sys_lstat64)
        .long SYMBOL_NAME(sys_fstat64)
        .long SYMBOL_NAME(sys_lchown)
        .long SYMBOL_NAME(sys_getuid)
        .long SYMBOL_NAME(sys_getgid)           /* 200 */
        .long SYMBOL_NAME(sys_geteuid)
        .long SYMBOL_NAME(sys_getegid)
        .long SYMBOL_NAME(sys_setreuid)
        .long SYMBOL_NAME(sys_setregid)
        .long SYMBOL_NAME(sys_getgroups)        /* 205 */
        .long SYMBOL_NAME(sys_setgroups)
        .long SYMBOL_NAME(sys_fchown)
        .long SYMBOL_NAME(sys_setresuid)
        .long SYMBOL_NAME(sys_getresuid)
        .long SYMBOL_NAME(sys_setresgid)        /* 210 */
        .long SYMBOL_NAME(sys_getresgid)
        .long SYMBOL_NAME(sys_chown)
        .long SYMBOL_NAME(sys_setuid)
        .long SYMBOL_NAME(sys_setgid)
        .long SYMBOL_NAME(sys_setfsuid)         /* 215 */
        .long SYMBOL_NAME(sys_setfsgid)
        .long SYMBOL_NAME(sys_pivot_root)
        .long SYMBOL_NAME(sys_mincore)
        .long SYMBOL_NAME(sys_madvise)
        .long SYMBOL_NAME(sys_getdents64)       /* 220 */
        .long SYMBOL_NAME(sys_fcntl64)
        .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for TUX */
        .long SYMBOL_NAME(sys_ni_syscall)       /* Reserved for Security */
        .long SYMBOL_NAME(sys_gettid)
        .long SYMBOL_NAME(sys_readahead)        /* 225 */
	  


3.3.3. IRQ À̺¥Æ®

IRQ °¡ ¹ß»ýÇϸé ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º´Â IRQ Çڵ鷯¸¦ ½ÇÇàÇϱâ À§ÇØ ÀÎÅÍ·´Æ® µÈ´Ù.

IRQ °¡ ó¸®µÈ ÈÄ, Á¦¾î °æ·Î´Â ¸¶Ä¡ ¾Æ¹« Àϵµ ¾ø´ø °Íó·³ ÀÎÅÍ·´Æ®°¡ °É¸° ÁöÁ¡À¸·Î µÇµ¹¾Æ °£´Ù.

              Running Task 
             |-----------|          (3)
NORMAL       |   |       | [break execution] IRQ Handler
EXECUTION (1)|   |       |     ------------->|---------| 
             |  \|/      |     |             |  does   |         
 IRQ (2)---->| ..        |----->             |  some   |      
             |   |       |-----             |  work   |       
BACK TO      |   |       |     |             |  ..(4). |
NORMAL    (6)|  \|/      |     -------------|_________|
EXECUTION    |___________|  [return to code]
                                    (5)
               USER MODE                     KERNEL MODE

         User->Kernel Mode Transition caused by IRQ event
	  

¾Æ·¡ÀÇ ¼ø¼­°¡ ¸Å°ÜÁø ´Ü°è´Â À§ÀÇ ±×¸²¿¡¼­ ³ªÅ¸³ª´Â À̺¥Æ®ÀÇ ¹øÈ£¿¡ ÇØ´çÇÑ´Ù:

  1. ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ°í ÀÖÀ½

  2. ½ÇÇà µµÁß IRQ ¹ß»ý

  3. ÇÁ·Î¼¼½º´Â ÀÎÅÍ·´Æ® µÇ°í ÀÎÅÍ·´Æ® Çڵ鷯 È£Ãâ

  4. ÀÎÅÍ·´Æ® Çڵ鷯 ÄÚµå ¼öÇà

  5. Á¦¾î °æ·Î´Â (¾Æ¹« Àϵµ ¾ø´ø °Íó·³) »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º·Î µ¹¾Æ°¨

  6. ÇÁ·Î¼¼½º°¡ ´Ù½Ã ½ÇÇà

ƯÈ÷ °ü½ÉÀÖ°Ô ÁöÄѺ¸¾Æ¾ß ÇÒ °ÍÀº Timer IRQ ÀÌ´Ù. Timer IRQ ´Â ŸÀ̸Ӱ¡ ¼³Á¤µÈ ¸Å ½Ã°£ °£°Ý (ms ´ÜÀ§) ¸¶´Ù ¹ß»ýÇÏ¸ç ´ÙÀ½°ú °°Àº °ÍµéÀ» °ü¸®ÇÑ´Ù:

  1. ¾Ë¶÷

  2. (ÇÁ·Î¼¼½º ½ºÄÉÁÙ¸µ À̳ª Åë°è µî¿¡¼­ »ç¿ëµÇ´Â) ½Ã½ºÅÛ Ä«¿îÅÍ¿Í Å½ºÅ© Ä«¿îÅÍ

  3. ŸÀÓ ½½¶óÀ̽º [2] ¿¡ ±â¹ÝÀ» µÐ ¸ÖƼ ŽºÅ·


3.4. ¸ÖƼŽºÅ·


3.4.1. ¸ÞÄ«´ÏÁò

ÃÖ±ÙÀÇ ¿î¿µÃ¼Á¦¿¡¼­ÀÇ ÇÙ½ÉÀº ŽºÅ© (task, ÀÛ¾÷) [3] ÀÌ´Ù. ŽºÅ©´Â ¸Þ¸ð¸® »ó¿¡¼­ µ¿ÀÛÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î¼­ ´Ù¸¥ ŽºÅ© µé°ú ¸ðµç ÀÚ¿øµéÀ» (CPU ¿Í ¸Þ¸ð¸® µîÀ» Æ÷ÇÔ) °øÀ¯ÇÑ´Ù.

ÀÌ·¯ÇÑ ÀÚ¿øÀÇ °øÀ¯ ´Â ¸ÖƼŽºÅ· ¸ÞÄ«´ÏÁò ¿¡ ÀÇÇØ¼­ °ü¸®µÈ´Ù. ¸ÖƼŽºÅ· ¸ÞÄ«´ÏÁòÀº ŸÀÓ ½½¶óÀ̽º ·Î Á¤ÇØÁø ½Ã°£ÀÌ È帣¸é ÇöÀçÀÇ Å½ºÅ©¸¦ ´Ù¸¥ ŽºÅ©·Î ±³Ã¼ÇÑ´Ù. »ç¿ëÀÚ´Â ¸ðµç ÀÚ¿øÀ» Á¡À¯Çϰí ÀÖ´Â °Í °°Àº ȯ»ó ¿¡ ºüÁö°Ô µÈ´Ù. ¶ÇÇÑ ÇѸíÀÇ »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀ» »ç¿ëÇϰí ÀÖ´Â ½Ã³ª¸®¿À¸¦ »ý°¢ÇØ º¸¸é, ¸¶Âù°¡Áö·Î »ç¿ëÀÚ´Â ¸¹Àº ŽºÅ©µéÀÌ µ¿½Ã¿¡ ¼öÇàµÇ°í ÀÖ´Â °Í°ú °°Àº ȯ»ó ¿¡ ºüÁö°Ô µÈ´Ù.

ÀÌ·¯ÇÑ ¸ÖƼŽºÅ·À» ±¸ÇöÇϱâ À§Çؼ­ ŽºÅ©´Â ´ÙÀ½°ú °°Àº »óÅ º¯¼ö¸¦ °¡Áø´Ù:

  1. READY, ½ÇÇàÇÒ Áغñ°¡ µÇ¾î ÀÖ´Ù.

  2. BLOCKED, ÀÚ¿øÀ» ±â´Ù¸®°í ÀÖ´Ù.

ŽºÅ©ÀÇ »óÅ´ ±×¿¡ °ü·ÃµÈ ¸®½ºÆ® (READY ¸®½ºÆ®¿Í BLOCKED ¸®½ºÆ®) ³»¿¡ ŽºÅ©°¡ ¼ÓÇØ ÀÖ´ÂÁö¿¡ ÀÇÇØ¼­ °ü¸®µÈ´Ù.


3.4.2. ŽºÅ© ±³È¯ (task switching)

(½ÇÇàÁßÀÎ) ÇÑ Å½ºÅ©¿¡¼­ ´Ù¸¥ ŽºÅ©·Î À̵¿ÇÏ´Â °ÍÀ» ŽºÅ© ±³È¯ (context switching (¹®¸Æ ±³È¯) À̶ó°í ºÎ¸£±âµµ ÇÑ´Ù) À̶ó°í ÇÑ´Ù. ¸¹Àº ÄÄÇ»ÅÍ´Â ÀÌ·¯ÇÑ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇØ ÁÖ´Â Çϵå¿þ¾îÀûÀÎ ¸í·ÉÀ» °¡Áö°í ÀÖ´Ù. ŽºÅ© ±³È¯Àº ´ÙÀ½°ú °°Àº °æ¿ì¿¡ ÀϾ´Ù:

  1. ŸÀÓ ½½¶óÀ̽º Á¾·á ÈÄ: ½ÇÇàÇÒ Áغñ°¡ µÈ ŽºÅ©¸¦ ½ºÄÉÁÙ¸µÇÏ¿© ½ÇÇàÇÑ´Ù.

  2. ŽºÅ©°¡ ¾î¶² ÀåÄ¡¸¦ ±â´Ù¸®´Â °æ¿ì: »õ·Î¿î ŽºÅ©¸¦ ½ºÄÉÁÙ¸µÇÏ¿© ±³È¯ÇÑ´Ù. [4]

ŽºÅ© ±³È¯Àº Schedule °³Ã¼¿¡ ÀÇÇØ¼­ °ü¸®µÈ´Ù.

Timer    |           |
 IRQ     |           |                            Schedule
  |      |           |                     ________________________
  |----->|   Task 1  |------------------>|(1)Chooses a Ready Task |
  |      |           |                    |(2)Task Switching       |
  |      |___________|                    |________________________|   
  |      |           |                               /|\
  |      |           |                                | 
  |      |           |                                |
  |      |           |                                |
  |      |           |                                |      
  |----->|   Task 2  |-------------------------------|
  |      |           |                                |
  |      |___________|                                |
  .      .     .     .                                .
  .      .     .     .                                .
  .      .     .     .                                .
  |      |           |                                |
  |      |           |                                |
  ------>|   Task N  |--------------------------------
         |           |
         |___________| 
    
            Task Switching based on TimeSlice
	  

¸®´ª½º¿¡¼­ ŸÀÓ ½½¶óÀ̽º´Â ÀϹÝÀûÀ¸·Î 10 ms ÀÌ´Ù.

 |           |            
 |           | Resource    _____________________________
 |   Task 1  |----------->|(1) Enqueue Resource request |
 |           |  Access    |(2)  Mark Task as blocked    |
 |           |            |(3)  Choose a Ready Task     |
 |___________|            |(4)    Task Switching        |
                          |_____________________________|
                                       |
                                       |
 |           |                         |
 |           |                         |
 |   Task 2  |-------------------------
 |           |  
 |           |
 |___________|
 
     Task Switching based on Waiting for a Resource
	  


3.5. ¸¶ÀÌÅ©·ÎÄ¿³Î OS ¿Í ¸ð³î¸®Æ½ OS


3.5.1. °³¿ä

Áö±Ý±îÁö ¿ì¸®°¡ »ìÆìº» °ÍÀº ¸ð³î¸®Æ½ OS ¶ó ºÒ¸®´Â °Íµé À̾úÁö¸¸, ¸¶ÀÌÅ©·ÎÄ¿³Î À̶ó°í ÇÏ´Â ¹æ½ÄÀÇ ¿î¿µÃ¼Á¦µµ ÀÖ´Ù.

¸¶ÀÌÅ©·ÎÄ¿³Î ¹æ½ÄÀÇ ¿î¿µÃ¼Á¦´Â »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º´Â ¹°·Ð Ç÷ÎÇÇ µð½ºÅ© °ü·Ã ŽºÅ©, ÇÏµå µð½ºÅ© °ü·Ã ŽºÅ©, ³×Æ®¿öÅ© °ü·Ã ÀÛ¾÷ µî Ä¿³ÎÀÌ Ã³¸®ÇÏ´Â ÀÛ¾÷ µéµµ ŽºÅ© ¹æ½ÄÀ¸·Î ó¸®ÇÑ´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀÇ ¿î¿µÃ¼Á¦·Î´Â Amoeba, Mach µîÀÌ ÀÖ´Ù.


3.5.2. ¸¶ÀÌÅ©·Î Ä¿³Î ¹æ½ÄÀÇ Àå´ÜÁ¡

ÀåÁ¡:

  • °¢°¢ÀÇ Å½ºÅ©´Â ÇѰ¡Áö Á¾·ùÀÇ ¿¬»ê ¸¸À» ¼öÇàÇϹǷΠ¿î¿µÃ¼Á¦ÀÇ ÀÔÀå¿¡¼­´Â À̸¦ °ü¸®ÇϱⰡ ½¬¿öÁø´Ù. ±×·¡¼­ ¸¸¾à ³×Æ®¿öÅ© ºÎºÐÀ» ¼öÁ¤ÇÏ°í ½Í´Ù¸é À̸¦ ´ã´çÇϴ ŽºÅ© ¸¸À» ¼öÁ¤ÇÏ¸é µÉ °ÍÀÌ´Ù. (´Ù¸¥ ºÎºÐÀÇ ±¸Á¶ÀûÀÎ º¯È­°¡ ¾ø´Â ÀÌ»óÀûÀÎ °æ¿ì¶ó¸é)

´ÜÁ¡:

  • ƯÁ¤ÇÑ Å½ºÅ©·Î ÁøÀÔÇÏ´Â ½Ã°£°ú ±× ŽºÅ©¿¡¼­ º¹±ÍÇÏ´Â ½Ã°£¸¸Å­ÀÇ 2 ¹èÀÇ Å½ºÅ© Àüȯ ½Ã°£ÀÌ Ãß°¡µÇ¾î¾ß ÇϹǷΠ¸ð³î¸®Æ½ ¹æ½ÄÀÇ ¿î¿µÃ¼Á¦º¸´Ù ¼º´ÉÀ» ¶³¾îÁö°Ô µÈ´Ù.

°³ÀÎÀûÀÎ ÀǰßÀ¸·Î´Â ¸¶ÀÌÅ©·ÎÄ¿³Î ¹æ½ÄÀº ±³À°¿ë ¿¹Á¦·Î´Â ÀûÀýÇÏÁö¸¸ (Minix ó·³) ½ÇÁ¦·Î Àû¿ëµÉ ¼ö ÀÖÀ» ¸¸Å­ ÃÖÀûÀÇ ¿î¿µÃ¼Á¦´Â ¾Æ´Ï¶ó°í »ý°¢ÇÑ´Ù. ¸®´ª½º¿¡¼­´Â ¸¶ÀÌÅ©·ÎÄ¿³ÎÀÇ ±¸Á¶¸¦ ¾à°£ ±¸ÇöÇÏ¿© Ä¿³Î ½º·¹µå ¶ó°í ºÒ¸®´Â ¸î°¡Áö ŽºÅ©¸¦ »ç¿ëÇÑ´Ù. (ÇÏµå µð½ºÅ©¿Í °°Àº ÀúÀå ÀåÄ¡¿¡¼­ (½º¿Ò¾Æ¿ôµÈ) ÆäÀÌÁö¸¦ ´Ù½Ã ¹Þ¾Æ¿À´Â kswapd ¿Í °°Àº ŽºÅ©°¡ ÀÖ´Ù.) ÀÌ °æ¿ì ½º¿ÍÇÎÀº ¸Å¿ì ´À¸° ÀÛ¾÷À̱⠶§¹®¿¡ ¼º´É¸é¿¡¼­ ¹®Á¦µÉ °ÍÀº ¾ø´Ù.


3.6. ³×Æ®¿öÅ·


3.6.1. ISO ÀÇ OSI °èÃþ

ISO-OSI Ç¥ÁØÀº ´ÙÀ½°ú °°Àº °èÃþµé·Î ÀÌ·ç¾îÁø ³×Æ®¿öÅ© ±¸Á¶¸¦ ¼³¸íÇϰí ÀÖ´Ù:

  1. ¹°¸®ÀûÀÎ °èÃþ (¿¹: PPP, Ethernet)

  2. µ¥ÀÌŸ-¸µÅ© °èÃþ (¿¹: PPP, Ethernet)

  3. ³×Æ®¿öÅ© °èÃþ (¿¹: IP, X.25)

  4. Àü¼Û °èÃþ (¿¹: TCP, UDP)

  5. ¼¼¼Ç °èÃþ (¿¹: SSL)

  6. Ç¥Çö °èÃþ (¿¹: FTP ÀÇ binary-ascii ÄÚµù)

  7. ÀÀ¿ë °èÃþ (¿¹: ³×½ºÄÉÀÌÇÁ¿Í °°Àº ÀÀ¿ë ÇÁ·Î±×·¥)

À§ÀÇ ¸®½ºÆ® Áß¿¡¼­ óÀ½ 2 °³ÀÇ °èÃþÀº ÁÖ·Î Çϵå¿þ¾î·Î ±¸ÇöµÈ´Ù. ³ª¸ÓÁö °èÃþµéÀº ¼ÒÇÁÆ®¿þ¾î¿¡ ¼ÓÇÑ´Ù. (ȤÀº Æß¿þ¾î³ª ¶ó¿ìÅÍ)

¿î¿µÃ¼Á¦´Â ¸¹Àº ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇϰí ÀÖÀ¸¸ç ±× ÁßÀÇ Çϳª·Î´Â TCP/IP ¸¦ µé ¼ö ÀÖ´Ù. (À̰ÍÀº 3-4 °èÃþÀÇ °¡Àå ÁÖµÈ ÇÁ·ÎÅäÄÝÀÌ´Ù.)


3.6.2. Ä¿³ÎÀº ¹«½¼ ÀÏÀ» Çϴ°¡?

ISO-OSI °èÃþÀÇ Ã³À½ 2 °¡Áö¿¡ ´ëÇØ¼­´Â Ä¿³ÎÀº (ÁÖ¼Ò¸¦ Á¦¿ÜÇϰí) ¾Æ¹« °Íµµ ¾ËÁö ¸øÇÑ´Ù.

RX (¼ö½Å) ½Ã¿¡ Ä¿³ÎÀÌ ÇÏ´Â ÀÏÀº:

  1. (ÀÌ´õ³Ý Ä«µå³ª ¸ðµ©°ú °°Àº) ·Î¿ì ·¹º§ ÀåÄ¡¿ÍÀÇ ¿¬°á(handshake)À» °ü¸®ÇÏ°í ±× ÀåÄ¡µé·ÎºÎÅÍ ÇÁ·¹ÀÓ [5] À» ¹Þ¾Æ¿Â´Ù.

  2. ±× (ÀÌ´õ³ÝÀ̳ª PPP °°Àº) ÇÁ·¹ÀÓ À¸·ÎºÎÅÍ TCP/IP ÆÐŶ À» ±¸¼ºÇÑ´Ù.

  3. ÆÐŶ À» ¼ÒÄÏ À¸·Î º¯È¯ÇÏ¿© (Æ÷Æ® ¹øÈ£¿¡ ¸Â´Â) ÀûÀýÇÑ ÀÀ¿ëÇÁ·Î±×·¥¿¡°Ô ³Ñ°ÜÁְųª

  4. ÆÐŶ À» ÀûÀýÇÑ Å¥¿¡ º¸³»ÁØ´Ù.

frames         packets              sockets
NIC ---------> Kernel ----------> Application
                  |    packets
                  --------------> Forward
                        - RX - 
	  

TX (¼Û½Å) ½Ã¿¡ Ä¿³ÎÀÌ ÇÏ´Â ÀÏÀº:

  1. ¼ÒÄÏ À» ÆÐŶ À¸·Î º¯È¯Çϰųª

  2. Å¥¿¡ µé¾îÀÖ´Â Á¤º¸¸¦ °¡Á®¿Í¼­ ÆÐŶ À» ±¸¼ºÇÑ´Ù.

  3. ÆÐŶ À» (ÀÌ´õ³ÝÀ̳ª PPP ¿¡¼­ »ç¿ëµÇ´Â) ÇÁ·¹ÀÓ À¸·Î ºÐ¸®ÇÑ´Ù.

  4. Çϵå¿þ¾î ÀåÄ¡¸¦ »ç¿ëÇØ¼­ ÇÁ·¹ÀÓ À» Àü¼ÛÇÑ´Ù.

sockets       packets                     frames
Application ---------> Kernel ----------> NIC
              packets     /|\    
Forward  -------------------
                        - TX -  
	  


3.7. °¡»ó ¸Þ¸ð¸®


3.7.1. ¼¼±×¸ÕÅ×ÀÌ¼Ç (Segmentation)

¼¼±×¸ÕÅ×À̼ÇÀº ¸Þ¸ð¸® ÇÒ´ç ¹®Á¦¸¦ ÇØ°áÇϴ ù¹øÂ° ¹æ¹ýÀÌ´Ù: À̸¦ ÀÌ¿ëÇÏ¸é ¼Ò½ºÄڵ尡 ¸Þ¸ð¸® »óÀÇ ¾î´À ºÎºÐ¿¡ ³õÀÌ°Ô µÉÁö¸¦ ½Å°æ¾²Áö ¾Ê°íµµ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î ÀÌ·¯ÇÑ ±â´ÉÀº ÀÀ¿ë ÇÁ·Î±×·¥ °³¹ßÀÚ¿¡°Ô OS ¿Í Çϵå¿þ¾î¿¡ µ¶¸³ÀûÀÎ ÇÁ·Î±×·¥À» °³¹ßÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

            |       Stack        |
            |          |         |
            |         \|/        |
            |        Free        | 
            |         /|\        |     Segment ---> Process    
            |          |         |
            |        Heap        |
            | Data uninitialized |
            |  Data initialized  |
            |       Code         |
            |____________________|  
 
                   Segment
	  

¼¼±×¸ÕÆ®´Â ÇÁ·Î±×·¥ÀÇ ³í¸®ÀûÀÎ °³Ã¼, ȤÀº ¸Þ¸ð¸® »óÀÇ ÇÁ·Î±×·¥¿¡ ´ëÇÑ À̹ÌÁö¶ó°í ¸» ÇÒ ¼ö ÀÖ´Ù.

ÇÁ·Î±×·¡¹Ö½Ã¿¡ ¿ì¸®´Â µ¥ÀÌŸ°¡ ¸Þ¸ð¸® »óÀÇ ¾î´À ºÎºÐ¿¡ ³õÀÌ°Ô µÉ Áö ÀüÇô °í·ÁÇÏÁö ¾Ê´Â´Ù. ¿ÀÁ÷ ¼¼±×¸ÕÆ® (ÇÁ·Î±×·¥) ³»¿¡¼­ÀÇ À§Ä¡(offset)¿¡ ´ëÇØ¼­¸¸ »ý°¢ÇÒ »ÓÀÌ´Ù.

º¸Åë °¢°¢ÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼­ ÇϳªÀÇ ¼¼±×¸ÕÆ®¸¦ ÇÒ´çÇϰųª ȤÀº ±× ¹Ý´ëÀÌÁö¸¸ ¸®´ª½º¿¡¼­´Â ±×·¸°Ô ÇÏÁö ¾Ê´Â´Ù. ¸®´ª½º¿¡¼­´Â Ä¿³Î°ú ´Ù¸¥ ¸ðµç ÇÁ·Î¼¼½ºµé¿¡ ´ëÇØ ¿ÀÁ÷ 4 °³ÀÇ ¼¼±×¸ÕÆ® ¸¸À» »ç¿ëÇÑ´Ù.


3.7.2. ¼¼±×¸ÕÅ×À̼ÇÀÇ ¹®Á¦Á¡

                                ____________________
                          ----->|                    |----->
                          | IN  |     Segment A      | OUT
 ____________________     |     |____________________|   
|                    |____|     |                    |   
|     Segment B      |          |     Segment B      |
|                    |____      |                    |   
|____________________|    |     |____________________|   
                          |     |     Segment C      |   
                          |     |____________________|
                          ----->|     Segment D      |-----> 
                            IN  |____________________| OUT 
 
                     Segmentation problem
	  

À§ÀÇ ±×¸²¿¡¼­ A ¿Í D ¶ó´Â ÇÁ·Î¼¼½º(¼¼±×¸ÕÆ®)¸¦ ¾ø¾Ö°í »õ·Î B ¶ó´Â ÇÁ·Î¼¼½º¸¦ Áý¾î³Ö´Â °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. ÀÌ °æ¿ì B °¡ µé¾î°¥ ¸¸ÇÑ ÃæºÐÇÑ ¸Þ¸ð¸® °ø°£ÀÌ ÀÖÁö¸¸ ÇÁ·Î¼¼½º¸¦ 2 °³·Î ³ª´­ ¼ö ¾øÀ¸¹Ç·Î °á±¹ ¸Þ¸ð¸®·Î ·ÎµåÇÏÁö ¸øÇÑ´Ù. (¸Þ¸ð¸® ºÎÁ·)

ÀÌ·¯ÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â ¼¼±×¸ÕÆ®´Â (³í¸®ÀûÀÎ °ø°£À̱⠶§¹®¿¡) ¿¬¼ÓµÈ °ø°£ÀÌ°í ³ª´©¾î Áú ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.


3.7.3. ÆäÀÌÁö³×ÀÌ¼Ç (Pagination)

             ____________________
            |     Page 1         |
            |____________________|
            |     Page 2         |
            |____________________| 
            |      ..            |     Segment ---> Process    
            |____________________|
            |     Page n         |
            |____________________|
            |                    |
            |____________________|
            |                    |
            |____________________|  
 
                   Segment
	  

ÆäÀÌÁö³×ÀÌ¼Ç ('ÆäÀÌ¡' À̶ó°í Çϱ⵵ ÇÑ´Ù) À̶õ ¸Þ¸ð¸®¸¦ °íÁ¤µÈ ±æÀÌÀÇ n °³ÀÇ Á¶°¢À¸·Î ³ª´©´Â °ÍÀÌ´Ù.

ÇÁ·Î¼¼½º´Â Çϳª ÀÌ»óÀÇ ÆäÀÌÁö·Î ·ÎµåµÉ ¼ö ÀÖ´Ù. ¸Þ¸ð¸®°¡ ÇØÁ¦µÇ¸é ¸ðµç ÆäÀÌÁö°¡ ÇØÁ¦µÈ´Ù. (¾ÕÀÇ Âü°í)

ÆäÀÌÁö³×À̼ÇÀº ½º¿ÍÇÎ (swapping) À̶ó°í ÇÏ´Â ¶ÇÇϳªÀÇ Áß¿äÇÑ ¸ñÀûÀ» À§Çؼ­µµ »ç¿ëµÈ´Ù. ¸¸¾à ÆäÀÌÁö°¡ ½ÇÁ¦ ¸Þ¸ð¸® »ó¿¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é ¿¹¿Ü (Exception) ¸¦ ¹ß»ý½Ã۰í, ÀÌ´Â Ä¿³ÎÀÌ ¸Þ¸ð¸® »ó¿¡ »õ·Î¿î ÆäÀÌÁö¸¦ ã°Ô ÇÑ´Ù. ÀÌ ¸ÞÄ«´ÏÁòÀº ¿î¿µÃ¼Á¦¿¡¼­ ½ÇÁ¦ ¸Þ¸ð¸®°¡ Çã¿ëÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº ÀÀ¿ë ÇÁ·Î±×·¥À» ¸Þ¸ð¸® »ó¿¡ ·ÎµåÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.


3.7.4. ÆäÀÌÁö³×À̼ÇÀÇ ¹®Á¦Á¡

             ____________________
   Page   X |     Process Y      |
            |____________________|
            |                    |
            |       WASTE        |
            |       SPACE        |
            |____________________|  
   
              Pagination Problem
	  

À§ÀÇ ±×¸²À» º¸¸é ÆäÀÌÁö³×ÀÌ¼Ç Á¤Ã¥ÀÇ ¹®Á¦Á¡À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù: ÇÁ·Î¼¼½º Y °¡ ÆäÀÌÁö X ¿¡ ·ÎµåµÇ´Â °æ¿ì, ÇϳªÀÇ ÆäÀÌÁö¿¡ ÇØ´çÇÏ´Â Àüü ¿µ¿ªÀÌ ÇÒ´çµÇ¹Ç·Î µÚÂÊÀÇ ³ª¸ÓÁö ¿µ¿ªÀº ³¶ºñµÈ´Ù.


3.7.5. ¼¼±×¸ÕÅ×À̼ǰú ÆäÀÌÁö³×À̼Ç

¼¼±×¸ÕÅ×À̼ǰú ÆäÀÌÁö³×À̼ÇÀÇ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§Çؼ­ 2 °¡Áö Á¤Ã¥À» È¥ÇÕÇØ¼­ »ç¿ëÇÑ´Ù.

                                  |      ..            |
                                  |____________________|
                            ----->|      Page 1        |
                            |     |____________________|
                            |     |      ..            |
 ____________________       |     |____________________|
|                    |      |---->|      Page 2        |
|      Segment X     |  ----|     |____________________|
|                    |      |     |       ..           |
|____________________|      |     |____________________|
                            |     |       ..           |
                            |     |____________________|
                            |---->|      Page 3        |
                                  |____________________|
                                  |       ..           |
	  

(¼¼±×¸ÕÆ® X ·Î ±¸ºÐµÇ´Â) ÇÁ·Î¼¼½º X ´Â 3 ºÎºÐÀ¸·Î ³ª´©¾îÁö°í °¢°¢Àº ÆäÀÌÁö·Î ·ÎµåµÈ´Ù.

ÀÌ·Î ÀÎÇØ ´ÙÀ½°ú °°Àº ¹®Á¦Á¡ÀÌ ÇØ°áµÈ´Ù:

  1. ¼¼±×¸ÕÅ×À̼ÇÀÇ ¹®Á¦Á¡: ¸Þ¸ð¸®¸¦ ÆäÀÌÁö ´ÜÀ§·Î ÇÒ´çÇϰí ÇØÁ¦Çϱ⠶§¹®¿¡ ¸Þ¸ð¸® °ü¸®¸¦ ÃÖÀûÈ­µÈ ¹æ¹ýÀ¸·Î ÇÒ ¼ö ÀÖ´Ù.

  2. ÆäÀÌÁö³×À̼ÇÀÇ ¹®Á¦Á¡: ¿ÀÁ÷ ¸¶Áö¸· ÆäÀÌÁö ¸¸ÀÌ ³¶ºñµÈ´Ù. ÇÏÁö¸¸ ¸Å¿ì ÀÛÀº Å©±âÀÇ ÆäÀÌÁö¸¦ »ç¿ëÇϵµ·Ï °áÁ¤ÇÒ ¼ö ÀÖ°í - ¿¹¸¦ µé¾î 4096 ¹ÙÀÌÆ®¸¦ ÇÑ ÆäÀÌÁö·Î ¼³Á¤ÇÑ´Ù¸é ÃÖ´ë 4096 * ŽºÅ©ÀÇ ¼ö ¸¸Å­ÀÇ ¹ÙÀÌÆ®°¡ ³¶ºñµÉ °ÍÀÌ´Ù - ÆäÀÌÁö¸¦ °èÃþÀûÀ¸·Î (2-3 ´Ü°è·Î) °ü¸®ÇÒ ¼ö ÀÖ´Ù.

                          |         |           |         |
                          |         |   Offset2 |  Value  |
                          |         |        /|\|         |
                  Offset1 |         |-----    | |         |
                      /|\ |         |    |    | |         |
                       |  |         |    |   \|/|         | 
                       |  |         |    ------>|         |
                      \|/ |         |           |         |
 Base Paging Address ---->|         |           |         |
                          | ....... |           | ....... |
                          |         |           |         |    
 
                     Hierarchical Paging
	  


4. ¸®´ª½ºÀÇ ½ÃÀÛ

¿©±â¼­´Â startup_32: ¶ó°í ÇÏ´Â ·¹ÀÌºí¿¡¼­ ½ÃÀ۵Ǵ C ÄÚµåºÎÅÍ »ìÆìº»´Ù.

|startup_32:
   |start_kernel
      |lock_kernel
      |trap_init
      |init_IRQ
      |sched_init
      |softirq_init
      |time_init
      |console_init 
      |#ifdef CONFIG_MODULES 
         |init_modules 
      |#endif 
      |kmem_cache_init 
      |sti 
      |calibrate_delay 
      |mem_init
      |kmem_cache_sizes_init
      |pgtable_cache_init
      |fork_init
      |proc_caches_init 
      |vfs_caches_init
      |buffer_init
      |page_cache_init
      |signals_init 
      |#ifdef CONFIG_PROC_FS 
        |proc_root_init 
      |#endif 
      |#if defined(CONFIG_SYSVIPC) 
         |ipc_init
      |#endif 
      |check_bugs      
      |smp_init
      |rest_init
         |kernel_thread
         |unlock_kernel
         |cpu_idle

   

  • startup_32 [arch/i386/kernel/head.S]

  • start_kernel [init/main.c]

  • lock_kernel [include/asm/smplock.h]

  • trap_init [arch/i386/kernel/traps.c]

  • init_IRQ [arch/i386/kernel/i8259.c]

  • sched_init [kernel/sched.c]

  • softirq_init [kernel/softirq.c]

  • time_init [arch/i386/kernel/time.c]

  • console_init [drivers/char/tty_io.c]

  • init_modules [kernel/module.c]

  • kmem_cache_init [mm/slab.c]

  • sti [include/asm/system.h]

  • calibrate_delay [init/main.c]

  • mem_init [arch/i386/mm/init.c]

  • kmem_cache_sizes_init [mm/slab.c]

  • pgtable_cache_init [arch/i386/mm/init.c]

  • fork_init [kernel/fork.c]

  • proc_caches_init

  • vfs_caches_init [fs/dcache.c]

  • buffer_init [fs/buffer.c]

  • page_cache_init [mm/filemap.c]

  • signals_init [kernel/signal.c]

  • proc_root_init [fs/proc/root.c]

  • ipc_init [ipc/util.c]

  • check_bugs [include/asm/bugs.h]

  • smp_init [init/main.c]

  • rest_init

  • kernel_thread [arch/i386/kernel/process.c]

  • unlock_kernel [include/asm/smplock.h]

  • cpu_idle [arch/i386/kernel/process.c]

¸¶Áö¸· ºÎºÐÀÇ rest_init ¶ó´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù:

  1. init ¶ó´Â Ä¿³Î ¾²·¹µå¸¦ ½ÃÀÛ½ÃŲ´Ù.

  2. kernel_unlock À» È£ÃâÇÑ´Ù.

  3. ½ÇÇàÇÒ ÇÁ·Î¼¼½º°¡ ¾Æ¹« °Íµµ ¾ø´Â °æ¿ì¿¡ ½ÇÇàµÉ ºÎºÐÀÎ cpu_idle ·çƾÀ» ½ÇÇàÇÑ´Ù.

»ç½Ç start_kernel ÇÔ¼ö´Â Àý´ë ³¡³ªÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼ö´Â ³¡¾øÀÌ cpu_idle ·çƾÀ» ½ÇÇà½ÃŲ´Ù.

´ÙÀ½Àº ù¹øÂ° Ä¿³Î ¾²·¹µåÀÎ init ÇÔ¼ö¿¡ ´ëÇÑ ¼³¸íÀÌ´Ù:

|init
   |lock_kernel
   |do_basic_setup
      |mtrr_init
      |sysctl_init
      |pci_init
      |sock_init
      |start_context_thread
      |do_init_calls
         |(*call())-> kswapd_init
   |prepare_namespace
   |free_initmem
   |unlock_kernel
   |execve
   


5. ¸®´ª½ºÀÇ Æ¯Â¡


5.1. °³¿ä

¸®´ª½º´Â ´Ù¸¥ ¿î¿µÃ¼Á¦µé°ú ±¸ºÐµÇ´Â ´ÙÀ½°ú °°Àº Ư¡µéÀ» °¡Áö°í ÀÖ´Ù:

  1. ÆäÀÌÁö³×À̼Ǹ¸À» »ç¿ë

  2. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® (softirq)

  3. Ä¿³Î ¾²·¹µå

  4. Ä¿³Î ¸ðµâ

  5. proc µð·ºÅ丮


5.1.1. À¯¿¬¼ºÀ» À§ÇÑ ¿ä¼Òµé

À§¿¡¼­ ¿­°ÅÇÑ 4 ¹øÂ°¿Í 5 ¹øÂ° Ư¡Àº Ä¡¸íÀûÀÎ Ä¿³Î ¹ö±×³ª ƯÁ¤ÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ¿´À» ¶§ ½Ã½ºÅÛÀ» ¸®ºÎÆÃÇÏÁö ¾Ê°í (½Ã½ºÅÛ °ü¸®ÀÚ°¡) »ç¿ëÀÚ ¸ðµå¿¡¼­ ¹®Á¦¸¦ ÇØ°áÇϰųª ½Ã½ºÅÛÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â ¸·´ëÇÑ À¯¿¬¼ºÀ» Á¦°øÇÑ´Ù. ¿¹¸¦ µé¾î ´ëÇü ¼­¹ö¿¡¼­ ƯÁ¤ ºÎºÐÀ» ¼öÁ¤ÇÒ Çʿ䰡 ÀÖÀ» ¶§ ¸®ºÎÆÃÀ» ÇÏÁö ¾Ê°í ÇØ°áÇϱâ À§Çؼ­ Ä¿³Î ¸ðµâÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.


5.2. ÆäÀÌÁö³×À̼Ǹ¸À» »ç¿ë

¸®´ª½º¿¡¼­´Â °¢°¢ÀÇ Å½ºÅ©¸¦ ±¸ºÐÇϱâ À§ÇØ ¼¼±×¸ÕÅ×À̼ÇÀ» »ç¿ëÇÏÁö ¾Ê°í ÆäÀÌÁö³×À̼ÇÀ» »ç¿ëÇÑ´Ù. (¸ðµç ŽºÅ©´Â ¿ÀÁ÷ 2 °³ÀÇ ¼¼±×¸ÕÆ® (ÄÚµå ¼¼±×¸ÕÆ®¿Í µ¥ÀÌŸ (½ºÅÃ) ¼¼±×¸ÕÆ®) ¸¦ »ç¿ëÇÒ »ÓÀÌ´Ù.)

°¢°¢ÀÇ Å½ºÅ©´Â ÀڽŸ¸ÀÇ ÆäÀÌÁö Å×À̺íÀ» »ç¿ëÇϹǷΠ¼­·Î ´Ù¸¥ ŽºÅ© °£ÀÇ ÆäÀÌÁö °ü·Ã ¿À·ù´Â Àý´ë ÀϾÁö ¾Ê´Â´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. ¾î¶² °æ¿ì¿¡ À־´Â ¿©·¯ ŽºÅ©µéÀÌ ÇϳªÀÇ ÆäÀÌÁö Å×À̺íÀ» ÂüÁ¶Çϱ⵵ Çϴµ¥, °øÀ¯ ¶óÀ̺귯¸®¿Í °°Àº °æ¿ì (¸Þ¸ð¸®¸¦ Àý¾àÇϱâ À§ÇØ) ÄÚµå ºÎºÐÀ» °øÀ¯ÇÏ°í µ¥ÀÌŸ´Â °¢ ŽºÅ©ÀÇ ½ºÅÿ¡ ÀúÀåÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.


5.2.1. ¸®´ª½º ¼¼±×¸ÕÆ®

¸®´ª½º Ä¿³Î¿¡¼­´Â ´ÙÀ½°ú °°Àº ¿ÀÁ÷ 4 °³ÀÇ ¼¼±×¸ÕÆ® ¸¸ÀÌ Á¸ÀçÇÑ´Ù:

  1. Ä¿³Î ÄÚµå ¼¼±×¸ÕÆ® [0x10]

  2. Ä¿³Î µ¥ÀÌŸ/½ºÅà ¼¼±×¸ÕÆ® [0x18]

  3. »ç¿ëÀÚ ÄÚµå ¼¼±×¸ÕÆ® [0x23]

  4. »ç¿ëÀÚ µ¥ÀÌŸ/½ºÅà ¼¼±×¸ÕÆ® [0x2b]

¸ñÀû [¼¼±×¸ÕÆ®] ÀÇ ÇüÅ·ΠǥÇöÇÏ¿´´Ù.

ÀÎÅÚ CPU ÀÇ °æ¿ì, ´ÙÀ½°ú °°Àº ¼¼±×¸ÕÆ® ·¹Áö½ºÅ͵éÀÌ »ç¿ëµÈ´Ù:

  • CS - ÄÚµå ¼¼±×¸ÕÆ®

  • DS - µ¥ÀÌŸ ¼¼±×¸ÕÆ®

  • SS - ½ºÅà ¼¼±×¸ÕÆ®

  • ES - ¿¹ºñ ¼¼±×¸ÕÆ® (¼­·Î ´Ù¸¥ ¼¼±×¸ÕÆ®¿¡ ¼ÓÇÑ ¸Þ¸ð¸® ¿µ¿ªÀ» º¹»çÇÏ´Â ÀÏ µîÀ» ¼öÇàÇÒ ¶§ ÇÊ¿äÇÏ´Ù)

±×·¡¼­ ¸ðµç ŽºÅ©´Â ÄÚµå ¼¼±×¸ÕÆ®·Î 0x23 À», µ¥ÀÌŸ/½ºÅà ¼¼±×¸ÕÆ®·Î 0x2b ¸¦ »ç¿ëÇÑ´Ù.


5.2.2. ¸®´ª½º ÆäÀÌÁö³×À̼Ç

¸®´ª½º¿¡¼­´Â Çϵå¿þ¾îÀÇ ±¸Á¶¿¡ µû¶ó 3 ´Ü°èÀÇ ÆäÀÌÁö°¡ »ç¿ëµÈ´Ù. ÀÎÅÚ CPU ¿¡¼­´Â ´ÜÁö 2 ´Ü°èÀÇ ÆäÀÌÁö ¸¸ÀÌ Áö¿øµÈ´Ù. ¸®´ª½º´Â ¶ÇÇÑ Copy on Write ¸ÞÄ«´ÏÁòÀ» Áö¿øÇÑ´Ù. (´õ ÀÚ¼¼ÇÑ Á¤º¸´Â À» Âü°í)


5.2.3. ¿Ö ŽºÅ©µé °£¿¡ ÁÖ¼Ò Ãæµ¹ÀÌ ÀϾÁö ¾Ê´Â°¡?

´ë´äÀº ¸Å¿ì °£´ÜÇÏ´Ù: ŽºÅ©µé °£¿¡ ÁÖ¼Ò Ãæµ¹ÀÌ ÀϾÁö ¾Ê´Â ÀÌÀ¯´Â ±×°ÍÀÌ ºÒ°¡´ÉÇϱ⠶§¹®ÀÌ´Ù. ¼±Çü ÁÖ¼Ò¸¦ ¹°¸® ÁÖ¼Ò·Î ¸ÅÇÎÇÏ´Â °ÍÀº ÆäÀÌÁö³×ÀÌ¼Ç ¿¡ ÀÇÇØ¼­ ÇàÇØÁö¹Ç·Î ¹°¸®ÀûÀÎ ÆäÀÌÁö¸¦ ´ÜÀÏÇÑ (univocal) ¹æ¹ýÀ¸·Î ÇÒ´çÇÒ Çʿ䰡 ¾ø´Ù.


5.2.4. ¸Þ¸ð¸®¸¦ ÆäÀÌÁö ´ÜÀ§·Î ºÐ¸®ÇØ¾ß Çϴ°¡?

±×·² Çʿ䰡 ¾ø´Ù. ÆäÀÌÁöÀÇ ÇÒ´çÀº µ¿ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù. ÆäÀÌÁö´Â ¿ÀÁ÷ ŽºÅ©°¡ ÆäÀÌÁö¸¦ ¿äûÇÑ °æ¿ì¿¡¸¸ ÇÊ¿äÇÏ´Ù. ±×·¡¼­ Å©±â º°·Î Á¤¸®µÈ ÀÌ¿ë °¡´ÉÇÑ ¸Þ¸ð¸® (ÆäÀÌÁö) ¿µ¿ª¿¡¼­ ¿øÇÏ´Â Å©±â¿¡ ÇØ´çÇÏ´Â ÆäÀÌÁö¸¦ ¼±ÅÃÇÑ´Ù. ÆäÀÌÁö°¡ ÇØÁ¦µÇ¸é ´ÜÁö ÀÌ¿ë °¡´ÉÇÑ ÆäÀÌÁö ¸®½ºÆ®¿¡ Ãß°¡ÇÏ¸é µÈ´Ù.


5.2.5. Ä¿³Î ÆäÀÌÁö¿¡ ´ëÇÏ¿©

Ä¿³Î ÆäÀÌÁö¿¡´Â ¹®Á¦Á¡ÀÌ Çϳª ÀÖ´Ù: Ä¿³Î ÆäÀÌÁö´Â µ¿ÀûÀ¸·Î ÇÒ´çµÇÁö¸¸ ÇÒ´çµÇ´Â ¿µ¿ªÀÌ ¿¬¼ÓµÈ ¿µ¿ªÀ̶ó´Â °ÍÀ» º¸ÀåÇÒ ¼ö´Â ¾ø´Ù´Â °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ¼±Çü Ä¿³Î °ø°£Àº ¹°¸®ÀûÀÎ Ä¿³Î °ø°£°ú µ¿ÀÏÇϱ⠶§¹®ÀÌ´Ù..??

ÄÚµå ¼¼±×¸ÕÆ®´Â ¹®Á¦°¡ ¾ø´Ù. ºÎÆ® ÄÚµå´Â ºÎÆÃ ½Ã¿¡ ÇÒ´çµÇ°í (µû¶ó¼­ °íÁ¤µÈ Å©±âÀÇ ¸Þ¸ð¸® ¿µ¿ª ¸¸À» °¡Áø´Ù) ¸ðµâ¿¡¼­´Â ¸ðµâ Äڵ带 Æ÷ÇÔÇÏ´Â ¸Þ¸ð¸® ¿µ¿ª ¸¸À» ÇÒ´çÇÑ´Ù.

½ÇÁ¦ÀûÀÎ ¹®Á¦´Â ½ºÅà ¼¼±×¸ÕÆ®¿¡¼­ ³ªÅ¸³ª´Âµ¥, °¢°¢ÀÇ Å½ºÅ©µéÀÌ Ä¿³Î ½ºÅà ÆäÀÌÁö¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù. ½ºÅà ¼¼±×¸ÕÆ®´Â ¹Ýµå½Ã ¿¬¼ÓÀûÀÎ ¿µ¿ª¿¡ ÇÒ´çµÇ¾î¾ß ÇϹǷΠ(½ºÅÃÀÇ Á¤ÀÇ¿¡ µû¶ó) ŽºÅ©ÀÇ ½ºÅà ¿µ¿ªÀÇ ÃÖ´ë Å©±â¸¦ Á¤ÇÏ°Ô µÇ¾ú´Ù. ¸¸¾à ÀÌ Å©±â¸¦ ³Ñ¾î°¡°Ô µÇ¸é Ä¿³Î ¸ðµå ÇÁ·Î¼¼½ºÀÇ ÀÚ·á ±¸Á¶¸¦ µ¤¾î¾²°Ô µÇ´Â ÀÏÀÌ ¹ú¾îÁú °ÍÀÌ´Ù.

Ä¿³ÎÀÇ ±¸Á¶´Â ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ÇÇÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù:

  • Àç±ÍÀûÀÎ ÇÔ¼ö È£ÃâÀÌ ¾ø´Ù.

  • N ¹ø ÀÌ»óÀÇ ÇÔ¼ö°£ È£ÃâÀÌ ¾ø´Ù.

N À» ¾Ë°í, ¸ðµç Ä¿³Î ÇÔ¼öµéÀÇ Á¤Àû º¯¼öÀÇ Æò±ÕÄ¡¸¦ ¾Ë¸é ½ºÅÃÀÇ Å©±â Á¦ÇÑÀ» ÃßÁ¤ÇÒ ¼ö ÀÖ´Ù.

ÀÌ ¹®Á¦Á¡À» ½ÇÁ¦·Î È®ÀÎÇØ º¸°í ½Í´Ù¸é, ³»ºÎÀûÀ¸·Î ÀÚ½ÅÀ» Àç±Í È£ÃâÇÏ´Â ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Â ¸ðµâÀ» »ý¼ºÇØ º¸¸é µÈ´Ù. ÀÌ ¸ðµâÀº ¸îÂ÷·Ê ¼öÇàµÈ ÈÄ¿¡ ÆäÀÌÁö ÆúÆ® ¿¹¿Ü Çڵ鷯¿¡ ÀÇÇØ¼­ ÁßÁöµÉ °ÍÀÌ´Ù. (º¸ÅëÀº Àбâ Àü¿ë ÆäÀÌÁö¿¡ ¾²±â Á¢±Ù µîÀÇ ÀÌÀ¯·Î)


5.3. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® (SoftIRQ)

IRQ °¡ ¹ß»ýÇÏ¿´À» ¶§, ¼º´É Çâ»óÀ» À§ÇØ Å½ºÅ© ±³È¯Àº ³ªÁßÀ¸·Î ¹Ì·ç¾î Áø´Ù. ¸î¸î°¡Áö ŽºÅ© µéÀº (IRQ ¸¦ ó¸®ÇÑ ÈÄ¿¡ ½ÇÇàµÇ¸ç, TCP/IP ÆÐŶÀ» ±¸¼ºÇÏ´Â °Í ó·³ CPU ÀÚ¿øÀ» ¸¹ÀÌ ÇÊ¿ä·Î ÇÏ´Â ÀÛ¾÷µé) Å¥¿¡ ³Ö¾îÁö¸ç ½ºÄÉÁÙ¸µÀÌ ÀϾ ¶§ ½ÇÇàµÈ´Ù. (ŸÀÓ ½½¶óÀ̽º°¡ ³¡³¯ ¶§)

ÃÖ±Ù ¹öÀüÀÇ Ä¿³Î (2.4.x) ¿¡¼­´Â ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® ¸ÞÄ«´ÏÁòÀº kdoftirqd_CPUn À̶ó´Â Ä¿³Î ¾²·¹µå·Î ±¸ÇöÇÑ´Ù. n Àº Ä¿³Î ¾²·¹µå°¡ ½ÇÇàµÇ´Â CPU ÀÇ ¹øÈ£¸¦ ÀǹÌÇÑ´Ù (´ÜÀÏ CPU ½Ã½ºÅÛÀÇ °æ¿ì ksoftirqd_CPU0 Àº PID 3 ¹øÀ» »ç¿ëÇÑ´Ù).


5.3.2. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ¼³Á¤

cpu_raise_softirq Àº Å¥¿¡ µé¾îÀÖ´Â ÀÛ¾÷µéÀ» °ü¸®ÇÏ´Â ksoftirqd_CPU0 Ä¿³Î ¾²·¹µå¸¦ ±ú¿ì´Â ·çƾÀÌ´Ù.

|cpu_raise_softirq
   |__cpu_raise_softirq
   |wakeup_softirqd
      |wake_up_process
	  

  • cpu_raise_softirq [kernel/softirq.c]

  • __cpu_raise_softirq [include/linux/interrupt.h]

  • wakeup_softirq [kernel/softirq.c]

  • wake_up_process [kernel/sched.c]

__cpu_raise_softirq ·çƾÀº ÇØ´çÇÏ´Â ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ¿´´Ù°í º¤ÅÍ ³»ÀÇ ºñÆ®¸¦ ¼³Á¤ÇÑ´Ù.

wakeup_softirq ·çƾÀº ksoftirqd_CPU0 Ä¿³Î ¾²·¹µå¸¦ ±ú¿ì±â À§ÇØ wakeup_process À» »ç¿ëÇÑ´Ù.


5.3.3. ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ½ÇÇà

TODO: ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ® ¸ÞÄ«´ÏÁò¿¡ Æ÷ÇÔµÈ ÀÚ·á ±¸Á¶¸¦ ¼³¸í

ksoftirqd_CPU0 Ä¿³Î ¾²·¹µå°¡ ±ú¾î³ª¸é Å¥¿¡ µé¾îÀÖ´Â ÀÛ¾÷µéÀ» ¼öÇàÇÒ °ÍÀÌ´Ù.

ksoftirqd_CPU0 ÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù (ºÎºÐ ¹ßÃé):

for ( ; ; ) {
   if (!softirq_pending(cpu)) 
      schedule();
   __set_current_state(TASK_RUNNING);
   while (softirq_pending(cpu)) { 
      do_softirq(); 
      if (current->need_resched) 
         schedule 
   }
   __set_current_state(TASK_INTERRUPTIBLE)
}
	  

  • ksoftirqd [kernel/softirq.c]


5.4. Ä¿³Î ¾²·¹µå

¸®´ª½º°¡ ¸ð³î¸®Æ½ ¿î¿µÃ¼Á¦ÀÌÁö¸¸, ½Ã½ºÅÛÀÇ °ü¸® (housekeeping) ÀÛ¾÷À» À§ÇÑ ¸î°³ÀÇ Ä¿³Î ¾²·¹µå °¡ Á¸ÀçÇÑ´Ù.

ÀÌ·¯ÇÑ Å½ºÅ©µéÀº »ç¿ëÀÚ ¿µ¿ªÀÇ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏÁö ¾Ê°í, Ä¿³Î ¿µ¿ªÀÇ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÑ´Ù. ¶ÇÇÑ ´Ù¸¥ Ä¿³Î ¿µ¿ªÀÇ ÄÚµå¿Í ºñ½ÁÇÏ°Ô ³ôÀº ¿ì¼± ¼øÀ§¸¦ °¡Áö°í ½ÇÇàµÈ´Ù. (i386 ȯ°æ¿¡¼­ RING0)

Ä¿³Î ¾²·¹µå´Â kernel_thread [arch/i386/kernel/process] ÇÔ¼ö¸¦ ÅëÇØ »ý¼ºµÈ´Ù. ÀÌ ÇÔ¼ö´Â ¾î¼Àºí¸® ºÎºÐ¿¡¼­ (fork ¿Í ºñ½ÁÇÑ ½Ã½ºÅÛ ÄÝÀÎ) clone [arch/i386/kernel/process.c] ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÑ´Ù:

int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
        long retval, d0;
 
        __asm__ __volatile__(
                "movl %%esp,%%esi\n\t"
                "int $0x80\n\t"         /* Linux/i386 system call */
                "cmpl %%esp,%%esi\n\t"  /* child or parent? */
                "je 1f\n\t"             /* parent - jump */
                /* Load the argument into eax, and push it.  That way, it does
                 * not matter whether the called function is compiled with
                 * -mregparm or not.  */
                "movl %4,%%eax\n\t"
                "pushl %%eax\n\t"               
                "call *%5\n\t"          /* call fn */
                "movl %3,%0\n\t"        /* exit */
                "int $0x80\n"
                "1:\t"
                :"=a" (retval), "=S" (d0)
                :"0" (__NR_clone), "i" (__NR_exit),
                 "r" (arg), "r" (fn),
                 "b" (flags | CLONE_VM)
                : "memory");
        return retval;
}
	 

ÀÌ ÇÔ¼ö°¡ Çѹø È£ÃâµÇ¸é ¸Å¿ì ´À¸° ÀÚ¿ø (½º¿Ò ȤÀº USB À̺¥Æ®) À» ±â´Ù¸®°í ÀÖ´Â »õ·Î¿î ŽºÅ© (º¸Åë 2, 3 ó·³ ¸Å¿ì ³·Àº PID ¸¦ °¡Áø´Ù) ¸¦ »ý¼ºÇÑ °ÍÀÌ´Ù. ÀÌ·¸°Ô ¸Å¿ì ´À¸° ÀÚ¿øÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â ŽºÅ© ±³È¯¿¡ µû¸£´Â ¿À¹öÇìµå¸¦ ÁÙÀ̱â À§Çؼ­ ÀÌ´Ù.

¾Æ·¡´Â (ps x ¸í·ÉÀ¸·Î ¾Ë¾Æº») ÀϹÝÀûÀÎ Ä¿³Î ¾²·¹µåÀÇ ¸®½ºÆ®ÀÌ´Ù.

PID      COMMAND
 1        init
 2        keventd
 3        kswapd
 4        kreclaimd
 5        bdflush
 6        kupdated
 7        kacpid
67        khubd
	 

init Ä¿³Î ¾²·¹µå´Â ºÎÆÃ½Ã¿¡ ÃÖÃÊ·Î »ý¼ºµÇ´Â ŽºÅ©ÀÌ´Ù. ÀÌ Å½ºÅ©´Â (/etc/inittab À» ÂüÁ¶ÇÏ¿©) ´Ù¸¥ ¸ðµç »ç¿ëÀÚ ¸ðµå ŽºÅ© - ÄÜ¼Ö µ¥¸ó, tty µ¥¸ó, ³×Æ®¿öÅ© µ¥¸ó (rc ½ºÅ©¸³Æ® Âü°í) µî - À» È£ÃâÇÑ´Ù.


5.4.1. Ä¿³Î ¾²·¹µå ¿¹Á¦: kswapd [mm/vmscan.c]

kswapd ´Â clone() [arch/i386/kernel/process.c] ¿¡ ÀÇÇØ »ý¼ºµÈ´Ù.

ÃʱâÈ­ ·çƾÀº ´ÙÀ½°ú °°´Ù:

|do_initcalls
   |kswapd_init
      |kernel_thread
         |syscall fork (in assembler)
	  

  • do_initcalls [init/main.c]

  • kswapd_init [mm/vmscan.c]

  • kernel_thread [arch/i386/kernel/process.c]


5.5. Ä¿³Î ¸ðµâ


5.5.1. °³¿ä

¸®´ª½º Ä¿³Î ¸ðµâÀº ½ÇÇà Áß¿¡ Ãß°¡ÇÒ ¼ö ÀÖ´Â Ä¿³Î ¸ðµå¿¡¼­ ½ÇÇàµÇ´Â ÄÚµåÀÇ ÀϺκР(¿¹¸¦ µé¸é, FS (ÆÄÀÏ ½Ã½ºÅÛ), ³×Æ®¿öÅ©, Çϵå¿þ¾î µå¶óÀ̹ö µî) À» ¸»ÇÑ´Ù.

¸®´ª½ºÀÇ ÇÙ½É ºÎºÐ - ÇÁ·Î¼¼½º ½ºÄÉÁÙ¸µ, ÀÎÅÍ·´Æ® °ü¸®, ³×Æ®¿öÅ©ÀÇ ÇÙ½ÉÀûÀÎ ºÎºÐ - µéÀº ¸ðµâÈ­µÉ ¼ö ¾ø´Ù.

/lib/modules/Ä¿³Î¹öÀü/ µð·ºÅ丮¿¡ ½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ ¸ðµâµéÀ» ã¾Æº¼ ¼ö ÀÖ´Ù.


5.5.2. ¸ðµâÀÇ ·Îµù°ú ¾ð·Îµù

¸ðµâÀ» ·ÎµåÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù:

insmod ¸ðµâÀ̸§ parameters

예 4.

insmod ne io=0x300 irq=9

참고: Ä¿³Î ¸î°¡Áö ÆÄ¶ó¹ÌÅ͵éÀ» ÀÚµ¿À¸·Î ã¾ÆÁֱ⸦ ¿øÇÑ´Ù¸é (¿¹¸¦ µé¸é PCI µå¶óÀ̹ö¸¦ »ç¿ëÇÏ´Â °æ¿ì³ª, /etc/conf.modules ¾È¿¡ ÆÄ¶ó¹ÌÅ͸¦ Àû¾îµÐ °æ¿ì) insmod ´ë½Å¿¡ modprobe ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¸ðµâÀº ¾ð·ÎµùÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù:

rmmod ¸ðµâÀ̸§


5.5.3. ¸ðµâÀÇ Á¤ÀÇ

¸ðµâÀº Ç×»ó ´ÙÀ½°ú °°Àº ³»¿ëÀ» Æ÷ÇÔÇÑ´Ù:

  1. insmod (ȤÀº modprobe) ½Ã¿¡ ½ÇÇàµÇ´Â init_module ÇÔ¼ö

  2. rmmod ½Ã¿¡ ½ÇÇàµÇ´Â cleanup_module ÇÔ¼ö

¸¸¾à À§ÀÇ µÎ ÇÔ¼ö°¡ ¸ðµâ³»¿¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é, ¾î¶² ÇÔ¼ö°¡ ÀÌ·¯ÇÑ ¿ªÇÒ (init, exit) À» ÇÒ °ÍÀÎÁö¸¦ ³ªÅ¸³»±â À§ÇØ ´ÙÀ½°ú °°Àº 2 °³ÀÇ ¸ÅÅ©·Î¸¦ Ãß°¡ÇØ¾ß ÇÑ´Ù.

  1. module_init(ÇÔ¼öÀ̸§)

  2. module_exit(ÇÔ¼öÀ̸§)

참고: ¸ðµâ¿¡¼­´Â ¿ÀÁ÷ (EXPORT_SYMBOL ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿©) ¿ÜºÎ·Î °ø°³µÈ Ä¿³Î º¯¼ö¸¸À» º¼ ¼ö ÀÖ´Ù.


5.5.4. Ä¿³Î¿¡ À¯¿¬¼ºÀ» Ãß°¡ÇÏ´Â À¯¿ëÇÑ ÆÁ

// kernel sources side
void (*foo_function_pointer)(void *);
 
if (foo_function_pointer)
  (foo_function_pointer)(parameter);
	  

// module side
extern void (*foo_function_pointer)(void *);

void my_function(void *parameter) {
  //My code
}
 
int init_module() {
  foo_function_pointer = my_function;
}

int cleanup_module() {
  foo_function_pointer = NULL;
}
	  

ÀÌ °£´ÜÇÑ ÆÁÀº ¿ÀÁ÷ ¸ðµâÀÌ ·ÎµåµÇ¾úÀ» ¶§¸¸ my_function ·çƾÀ» ½ÇÇàÇϵµ·Ï Çϱ⠶§¹®¿¡ Ä¿³Î¿¡ ³ôÀº À¯¿¬¼ºÀ» ÁÖ°Ô µÈ´Ù. ÀÌ ÇÔ¼ö ³»¿¡¼­´Â ¿øÇÏ´Â ¾î¶² ÇൿÀÌ¶óµµ ¼öÇàÇÒ ¼ö ÀÖ´Ù: ¿¹¸¦ µé¾î rshape ¸ðµâÀº ³×Æ®¿öÅ©·ÎºÎÅÍ µé¾î¿À´Â ÀÔ·Â Æ®·¡ÇÈÀÇ BandWidth ¸¦ Á¶ÀýÇÏ´Â °Í°ú °°Àº ¿ªÇÒÀ» ÇÑ´Ù.

Àüü ¸ðµâ ¸ÞÄ«´ÏÁòÀº °í¸¿°Ôµµ head list (¿øÇÏ´Â ¸¸Å­ ¸®½ºÆ®¸¦ È®ÀåÇÒ ¼ö ÀÖ°Ô Çã¿ë) ¿Í °°Àº Àü¿ª º¯¼ö¸¦ ¸ðµâ¿¡ °ø°³ (export) ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀüÇüÀûÀÎ ¿¹·Î´Â ÆÄÀÏ ½Ã½ºÅÛ, Generic devices (¹®ÀÚ, ºí·°, ³×Å©¿öÅ©, ÀüÈ­ ¿¬°á) µîÀÌ ÀÖ´Ù. ±×¸®°í Ä¿³ÎÀÌ ¸ðµâÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÁغñÇØ¾ß ÇÑ´Ù: ƯÁ¤ÇÑ °æ¿ì¿¡ À־´Â °¡´ÉÇÑ Ç¥ÁØ¿¡ ¸Â°Ô ´Ù¸¥ ±¸Á¶ (infrastructure) µéÀ» »ý¼ºÇØ¾ß ÇÑ´Ù. (ÃÖ±Ù¿¡ »ý¼ºµÈ ÀüÈ­¿¬°á ÀåÄ¡¿Í °°ÀÌ)


5.6. proc µð·ºÅ丮

proc ÆÄÀÏ ½Ã½ºÅÛÀº /proc µð·ºÅ丮¿¡ ÀÖÀ¸¸ç, Ä¿³Î°ú Á÷Á¢ ´ëÈ­ÇÏ´Â °ÍÀÌ Çã¿ëµÈ Ư¼öÇÑ µð·ºÅ丮ÀÌ´Ù.

¸®´ª½º´Â Ä¿³Î°úÀÇ Á÷Á¢ÀûÀÎ Åë½ÅÀ» Áö¿øÇϱâ À§ÇØ proc µð·ºÅ丮¸¦ »ç¿ëÇÑ´Ù: À̰ÍÀº ¸¹Àº °æ¿ì¿¡ À¯¿ëÇÏ´Ù - ¿¹¸¦ µé¾î ¸ÞÀÎ ÇÁ·Î¼¼½ºÀÇ ÀÚ·á ±¸Á¶¸¦ º¸°í ½Í´Ù°Å³ª ƯÁ¤ÇÑ ÇϳªÀÇ ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽º¿¡¸¸ proxy-arp ±â´ÉÀ» Ȱ¼ºÈ­ÇÏ´Â °æ¿ì, ÃÖ´ë ¾²·¹µåÀÇ °¹¼ö¸¦ º¯°æÇÏ°í ½ÍÀº °æ¿ì, ȤÀº ISA ³ª PCI ¿Í °°Àº ƯÁ¤ ¹ö½ºÀÇ »óŸ¦ µð¹ö±ëÇÏ´Â °æ¿ì¿¡ À־ ¾î¶² Ä«µå°¡ ¼³Ä¡µÇ¾î ÀÖ°í, ¾î¶² I/O address ¸¦ »ç¿ëÇϸç, ÇÒ´çµÈ IRQ °¡ ¾î¶² °ÍÀÌ ÀÖ´ÂÁö¸¦ ¾Ë°í ½ÍÀº °æ¿ì µîÀÌ ÀÖ°Ú´Ù.

|-- bus
|   |-- pci
|   |   |-- 00
|   |   |   |-- 00.0
|   |   |   |-- 01.0
|   |   |   |-- 07.0
|   |   |   |-- 07.1
|   |   |   |-- 07.2
|   |   |   |-- 07.3
|   |   |   |-- 07.4
|   |   |   |-- 07.5
|   |   |   |-- 09.0
|   |   |   |-- 0a.0
|   |   |   `-- 0f.0
|   |   |-- 01
|   |   |   `-- 00.0
|   |   `-- devices
|   `-- usb
|-- cmdline
|-- cpuinfo
|-- devices
|-- dma
|-- dri
|   `-- 0
|       |-- bufs
|       |-- clients
|       |-- mem
|       |-- name
|       |-- queues
|       |-- vm
|       `-- vma
|-- driver
|-- execdomains
|-- filesystems
|-- fs
|-- ide
|   |-- drivers
|   |-- hda -> ide0/hda
|   |-- hdc -> ide1/hdc
|   |-- ide0
|   |   |-- channel
|   |   |-- config
|   |   |-- hda
|   |   |   |-- cache
|   |   |   |-- capacity
|   |   |   |-- driver
|   |   |   |-- geometry
|   |   |   |-- identify
|   |   |   |-- media
|   |   |   |-- model
|   |   |   |-- settings
|   |   |   |-- smart_thresholds
|   |   |   `-- smart_values
|   |   |-- mate
|   |   `-- model
|   |-- ide1
|   |   |-- channel
|   |   |-- config
|   |   |-- hdc
|   |   |   |-- capacity
|   |   |   |-- driver
|   |   |   |-- identify
|   |   |   |-- media
|   |   |   |-- model
|   |   |   `-- settings
|   |   |-- mate
|   |   `-- model
|   `-- via
|-- interrupts
|-- iomem
|-- ioports
|-- irq
|   |-- 0
|   |-- 1
|   |-- 10
|   |-- 11
|   |-- 12
|   |-- 13
|   |-- 14
|   |-- 15
|   |-- 2
|   |-- 3
|   |-- 4
|   |-- 5
|   |-- 6
|   |-- 7
|   |-- 8
|   |-- 9
|   `-- prof_cpu_mask
|-- kcore
|-- kmsg
|-- ksyms
|-- loadavg
|-- locks
|-- meminfo
|-- misc
|-- modules
|-- mounts
|-- mtrr
|-- net
|   |-- arp
|   |-- dev
|   |-- dev_mcast
|   |-- ip_fwchains
|   |-- ip_fwnames
|   |-- ip_masquerade
|   |-- netlink
|   |-- netstat
|   |-- packet
|   |-- psched
|   |-- raw
|   |-- route
|   |-- rt_acct
|   |-- rt_cache
|   |-- rt_cache_stat
|   |-- snmp
|   |-- sockstat
|   |-- softnet_stat
|   |-- tcp
|   |-- udp
|   |-- unix
|   `-- wireless
|-- partitions
|-- pci
|-- scsi
|   |-- ide-scsi
|   |   `-- 0
|   `-- scsi
|-- self -> 2069
|-- slabinfo
|-- stat
|-- swaps
|-- sys
|   |-- abi
|   |   |-- defhandler_coff
|   |   |-- defhandler_elf
|   |   |-- defhandler_lcall7
|   |   |-- defhandler_libcso
|   |   |-- fake_utsname
|   |   `-- trace
|   |-- debug
|   |-- dev
|   |   |-- cdrom
|   |   |   |-- autoclose
|   |   |   |-- autoeject
|   |   |   |-- check_media
|   |   |   |-- debug
|   |   |   |-- info
|   |   |   `-- lock
|   |   `-- parport
|   |       |-- default
|   |       |   |-- spintime
|   |       |   `-- timeslice
|   |       `-- parport0
|   |           |-- autoprobe
|   |           |-- autoprobe0
|   |           |-- autoprobe1
|   |           |-- autoprobe2
|   |           |-- autoprobe3
|   |           |-- base-addr
|   |           |-- devices
|   |           |   |-- active
|   |           |   `-- lp
|   |           |       `-- timeslice
|   |           |-- dma
|   |           |-- irq
|   |           |-- modes
|   |           `-- spintime
|   |-- fs
|   |   |-- binfmt_misc
|   |   |-- dentry-state
|   |   |-- dir-notify-enable
|   |   |-- dquot-nr
|   |   |-- file-max
|   |   |-- file-nr
|   |   |-- inode-nr
|   |   |-- inode-state
|   |   |-- jbd-debug
|   |   |-- lease-break-time
|   |   |-- leases-enable
|   |   |-- overflowgid
|   |   `-- overflowuid
|   |-- kernel
|   |   |-- acct
|   |   |-- cad_pid
|   |   |-- cap-bound
|   |   |-- core_uses_pid
|   |   |-- ctrl-alt-del
|   |   |-- domainname
|   |   |-- hostname
|   |   |-- modprobe
|   |   |-- msgmax
|   |   |-- msgmnb
|   |   |-- msgmni
|   |   |-- osrelease
|   |   |-- ostype
|   |   |-- overflowgid
|   |   |-- overflowuid
|   |   |-- panic
|   |   |-- printk
|   |   |-- random
|   |   |   |-- boot_id
|   |   |   |-- entropy_avail
|   |   |   |-- poolsize
|   |   |   |-- read_wakeup_threshold
|   |   |   |-- uuid
|   |   |   `-- write_wakeup_threshold
|   |   |-- rtsig-max
|   |   |-- rtsig-nr
|   |   |-- sem
|   |   |-- shmall
|   |   |-- shmmax
|   |   |-- shmmni
|   |   |-- sysrq
|   |   |-- tainted
|   |   |-- threads-max
|   |   `-- version
|   |-- net
|   |   |-- 802
|   |   |-- core
|   |   |   |-- hot_list_length
|   |   |   |-- lo_cong
|   |   |   |-- message_burst
|   |   |   |-- message_cost
|   |   |   |-- mod_cong
|   |   |   |-- netdev_max_backlog
|   |   |   |-- no_cong
|   |   |   |-- no_cong_thresh
|   |   |   |-- optmem_max
|   |   |   |-- rmem_default
|   |   |   |-- rmem_max
|   |   |   |-- wmem_default
|   |   |   `-- wmem_max
|   |   |-- ethernet
|   |   |-- ipv4
|   |   |   |-- conf
|   |   |   |   |-- all
|   |   |   |   |   |-- accept_redirects
|   |   |   |   |   |-- accept_source_route
|   |   |   |   |   |-- arp_filter
|   |   |   |   |   |-- bootp_relay
|   |   |   |   |   |-- forwarding
|   |   |   |   |   |-- log_martians
|   |   |   |   |   |-- mc_forwarding
|   |   |   |   |   |-- proxy_arp
|   |   |   |   |   |-- rp_filter
|   |   |   |   |   |-- secure_redirects
|   |   |   |   |   |-- send_redirects
|   |   |   |   |   |-- shared_media
|   |   |   |   |   `-- tag
|   |   |   |   |-- default
|   |   |   |   |   |-- accept_redirects
|   |   |   |   |   |-- accept_source_route
|   |   |   |   |   |-- arp_filter
|   |   |   |   |   |-- bootp_relay
|   |   |   |   |   |-- forwarding
|   |   |   |   |   |-- log_martians
|   |   |   |   |   |-- mc_forwarding
|   |   |   |   |   |-- proxy_arp
|   |   |   |   |   |-- rp_filter
|   |   |   |   |   |-- secure_redirects
|   |   |   |   |   |-- send_redirects
|   |   |   |   |   |-- shared_media
|   |   |   |   |   `-- tag
|   |   |   |   |-- eth0
|   |   |   |   |   |-- accept_redirects
|   |   |   |   |   |-- accept_source_route
|   |   |   |   |   |-- arp_filter
|   |   |   |   |   |-- bootp_relay
|   |   |   |   |   |-- forwarding
|   |   |   |   |   |-- log_martians
|   |   |   |   |   |-- mc_forwarding
|   |   |   |   |   |-- proxy_arp
|   |   |   |   |   |-- rp_filter
|   |   |   |   |   |-- secure_redirects
|   |   |   |   |   |-- send_redirects
|   |   |   |   |   |-- shared_media
|   |   |   |   |   `-- tag
|   |   |   |   |-- eth1
|   |   |   |   |   |-- accept_redirects
|   |   |   |   |   |-- accept_source_route
|   |   |   |   |   |-- arp_filter
|   |   |   |   |   |-- bootp_relay
|   |   |   |   |   |-- forwarding
|   |   |   |   |   |-- log_martians
|   |   |   |   |   |- mc_forwarding
|   |   |   |   |   |-- proxy_arp
|   |   |   |   |   |-- rp_filter
|   |   |   |   |   |-- secure_redirects
|   |   |   |   |   |-- send_redirects
|   |   |   |   |   |-- shared_media
|   |   |   |   |   `-- tag
|   |   |   |   `-- lo
|   |   |   |       |-- accept_redirects
|   |   |   |       |-- accept_source_route
|   |   |   |       |-- arp_filter
|   |   |   |       |-- bootp_relay
|   |   |   |       |-- forwarding
|   |   |   |       |-- log_martians
|   |   |   |       |-- mc_forwarding
|   |   |   |       |-- proxy_arp
|   |   |   |       |-- rp_filter
|   |   |   |       |-- secure_redirects
|   |   |   |       |-- send_redirects
|   |   |   |       |-- shared_media
|   |   |   |       `-- tag
|   |   |   |-- icmp_echo_ignore_all
|   |   |   |-- icmp_echo_ignore_broadcasts
|   |   |   |-- icmp_ignore_bogus_error_responses
|   |   |   |-- icmp_ratelimit
|   |   |   |-- icmp_ratemask
|   |   |   |-- inet_peer_gc_maxtime
|   |   |   |-- inet_peer_gc_mintime
|   |   |   |-- inet_peer_maxttl
|   |   |   |-- inet_peer_minttl
|   |   |   |-- inet_peer_threshold
|   |   |   |-- ip_autoconfig
|   |   |   |-- ip_conntrack_max
|   |   |   |-- ip_default_ttl
|   |   |   |-- ip_dynaddr
|   |   |   |-- ip_forward
|   |   |   |-- ip_local_port_range
|   |   |   |-- ip_no_pmtu_disc
|   |   |   |-- ip_nonlocal_bind
|   |   |   |-- ipfrag_high_thresh
|   |   |   |-- ipfrag_low_thresh
|   |   |   |-- ipfrag_time
|   |   |   |-- neigh
|   |   |   |   |-- default
|   |   |   |   |   |-- anycast_delay
|   |   |   |   |   |-- app_solicit
|   |   |   |   |   |-- base_reachable_time
|   |   |   |   |   |-- delay_first_probe_time
|   |   |   |   |   |-- gc_interval
|   |   |   |   |   |-- gc_stale_time
|   |   |   |   |   |-- gc_thresh1
|   |   |   |   |   |-- gc_thresh2
|   |   |   |   |   |-- gc_thresh3
|   |   |   |   |   |-- locktime
|   |   |   |   |   |-- mcast_solicit
|   |   |   |   |   |-- proxy_delay
|   |   |   |   |   |-- proxy_qlen
|   |   |   |   |   |-- retrans_time
|   |   |   |   |   |-- ucast_solicit
|   |   |   |   |   `-- unres_qlen
|   |   |   |   |-- eth0
|   |   |   |   |   |-- anycast_delay
|   |   |   |   |   |-- app_solicit
|   |   |   |   |   |-- base_reachable_time
|   |   |   |   |   |-- delay_first_probe_time
|   |   |   |   |   |-- gc_stale_time
|   |   |   |   |   |-- locktime
|   |   |   |   |   |-- mcast_solicit
|   |   |   |   |   |-- proxy_delay
|   |   |   |   |   |-- proxy_qlen
|   |   |   |   |   |-- retrans_time
|   |   |   |   |   |-- ucast_solicit
|   |   |   |   |   `-- unres_qlen
|   |   |   |   |-- eth1
|   |   |   |   |   |-- anycast_delay
|   |   |   |   |   |-- app_solicit
|   |   |   |   |   |-- base_reachable_time
|   |   |   |   |   |-- delay_first_probe_time
|   |   |   |   |   |-- gc_stale_time
|   |   |   |   |   |-- locktime
|   |   |   |   |   |-- mcast_solicit
|   |   |   |   |   |-- proxy_delay
|   |   |   |   |   |-- proxy_qlen
|   |   |   |   |   |-- retrans_time
|   |   |   |   |   |-- ucast_solicit
|   |   |   |   |   `-- unres_qlen
|   |   |   |   `-- lo
|   |   |   |       |-- anycast_delay
|   |   |   |       |-- app_solicit
|   |   |   |       |-- base_reachable_time
|   |   |   |       |-- delay_first_probe_time
|   |   |   |       |-- gc_stale_time
|   |   |   |       |-- locktime
|   |   |   |       |-- mcast_solicit
|   |   |   |       |-- proxy_delay
|   |   |   |       |-- proxy_qlen
|   |   |   |       |-- retrans_time
|   |   |   |       |-- ucast_solicit
|   |   |   |       `-- unres_qlen
|   |   |   |-- route
|   |   |   |   |-- error_burst
|   |   |   |   |-- error_cost
|   |   |   |   |-- flush
|   |   |   |   |-- gc_elasticity
|   |   |   |   |-- gc_interval
|   |   |   |   |-- gc_min_interval
|   |   |   |   |-- gc_thresh
|   |   |   |   |-- gc_timeout
|   |   |   |   |-- max_delay
|   |   |   |   |-- max_size
|   |   |   |   |-- min_adv_mss
|   |   |   |   |-- min_delay
|   |   |   |   |-- min_pmtu
|   |   |   |   |-- mtu_expres
|   |   |   |   |-- redirect_load
|   |   |   |   |-- redirect_number
|   |   |   |   `-- redirect_silence
|   |   |   |-- tcp_abort_on_overflow
|   |   |   |-- tcp_adv_win_scale
|   |   |   |-- tcp_app_win
|   |   |   |-- tcp_dsack
|   |   |   |-- tcp_ecn
|   |   |   |-- tcp_fack
|   |   |   |-- tcp_fin_timeout
|   |   |   |-- tcp_keepalive_intvl
|   |   |   |-- tcp_keepalive_probes
|   |   |   |-- tcp_keepalive_time
|   |   |   |-- tcp_max_orphans
|   |   |   |-- tcp_max_syn_backlog
|   |   |   |-- tcp_max_tw_buckets
|   |   |   |-- tcp_mem
|   |   |   |-- tcp_orphan_retries
|   |   |   |-- tcp_reordering
|   |   |   |-- tcp_retrans_collapse
|   |   |   |-- tcp_retries1
|   |   |   |-- tcp_retries2
|   |   |   |-- tcp_rfc1337
|   |   |   |-- tcp_rmem
|   |   |   |-- tcp_sack
|   |   |   |-- tcp_stdurg
|   |   |   |-- tcp_syn_retries
|   |   |   |-- tcp_synack_retries
|   |   |   |-- tcp_syncookies
|   |   |   |-- tcp_timestamps
|   |   |   |-- tcp_tw_recycle
|   |   |   |-- tcp_window_scaling
|   |   |   `-- tcp_wmem
|   |   `-- unix
|   |       `-- max_dgram_qlen
|   |-- proc
|   `-- vm
|       |-- bdflush
|       |-- kswapd
|       |-- max-readahead
|       |-- min-readahead
|       |-- overcommit_memory
|       |-- page-cluster
|       `-- pagetable_cache
|-- sysvipc
|   |-- msg
|   |-- sem
|   `-- shm
|-- tty
|   |-- driver
|   |   `-- serial
|   |-- drivers
|   |-- ldisc
|   `-- ldiscs
|-- uptime
`-- version
	 

ÀÌ µð·ºÅ丮¿¡´Â ¸ðµç ŽºÅ©¿¡ °üÇÑ Á¤º¸°¡ µé¾îÀÖ´Ù. (°¢ µð·ºÅ丮ÀÇ À̸§Àº ŽºÅ©ÀÇ PID ¿¡ ÇØ´çÇÏ´Â ¼ýÀÚÀ̰í À̸¦ ÀÌ¿ëÇÏ¿© ŽºÅ©¿¡ ´ëÇÑ ¸ðµç Á¤º¸ - ½ÇÇà ÆÄÀÏÀÇ °æ·Î¶óµçÁö ¸Þ¸ð¸® »ç¿ë·® µî - ¸¦ º¼ ¼ö ÀÖ´Ù)

Èï¹Ì·Î¿î Á¡Àº ÀÌ·¯ÇÑ Ä¿³ÎÀÇ Á¤º¸ µéÀ» ´ÜÁö º¼ ¼ö¸¸ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó (ŽºÅ©ÀÇ Á¤º¸ ȤÀº TCP/IP ½ºÅÃÀ» Ȱ¼ºÈ­ÇÏ´Â ³×Æ®¿öÅ© ¿É¼Ç¿¡ °üÇÑ »çÇ×µéÀ» º¸´Â °Í) ¸î¸î Á¤º¸µéÀº ¼öÁ¤ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ °ÍµéÀº /proc/sys µð·ºÅ丮 ¾Æ·¡¿¡ ÀÖ´Ù.

/proc/sys/ 
          acpi
          dev
          debug
          fs
          proc
          net
          vm
          kernel
	 


5.6.1. /proc/sys/kernel

´ÙÀ½Àº ¸Å¿ì Áß¿äÇϰí Àß ¾Ë·ÁÁø ¼öÁ¤ÇÒ ¼ö ÀÖ´Â Ä¿³Î Á¤º¸µéÀÌ´Ù:

overflowgid
overflowuid
random
threads-max 	// Max number of threads, typically 16384
sysrq 		// kernel hack: you can view instant register values and more
sem
msgmnb
msgmni
msgmax
shmmni
shmall
shmmax
rtsig-max
rtsig-nr
modprobe 	// modprobe file location
printk
ctrl-alt-del
cap-bound
panic
domainname 	// domain name of your Linux box
hostname 	// host name of your Linux box
version 	// date info about kernel compilation
osrelease 	// kernel version (i.e. 2.4.5)
ostype 		// Linux! 
	  


5.6.2. /proc/sys/net

À̰ÍÀº proc ÀÇ ÇÏÀ§ µð·ºÅ丮 Áß¿¡¼­ °¡Àå À¯¿ëÇÑ µð·ºÅ丮ÀÏ °ÍÀÌ´Ù. ¿©±â¼­´Â Ä¿³ÎÀÇ ³×Æ®¿öÅ© ¼³Á¤¿¡ ´ëÇÑ ¸Å¿ì Áß¿äÇÑ ºÎºÐµéÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.

core
ipv4
ipv6
unix
ethernet
802
	  


5.6.3. /proc/sys/net/core

¾Æ·¡ÀÇ ¸®½ºÆ®´Â netdev_max_backlog - ³×Æ®¿öÅ© ÆÐŶÀÇ Àüü °¹¼ö (º¸Åë 300) - ¿Í °°Àº ÀϹÝÀûÀÎ ³×Æ®¿öÅ© ¼³Á¤À» º¸¿©ÁØ´Ù. ÀÌ °ªÀº ÆÐŶÀ» ¹ÞÀ» ¶§ ³×Æ®¿öÅ©ÀÇ BandWidth ¸¦ Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. ¸®´ª½º´Â ¹öÆÛ¸¦ ºñ¿ì±â À§ÇØ ½ºÄÉÁÙ¸µÀÌ ÀϾ ¶§ ±îÁö ±â´Ù·Á¾ß ÇÑ´Ù (bottom half ¸ÞÄ«´ÏÁò¿¡ ÀÇÇØ ó¸®). 1000/HZ ms ÀÏ ¶§

  300    *        100             =     30 000
packets     HZ(Timeslice freq)         packets/s
 
30 000   *       1000             =      30 M
packets     average (Bytes/packet)   throughput Bytes/s
	  

¸¸¾à ´õ ³ôÀº throughput À» ¿øÇÑ´Ù¸é netdev_max_backlog À» ´ÙÀ½°ú °°ÀÌ Áõ°¡½Ãų ¼ö ÀÖ´Ù:

echo 4000 > /proc/sys/net/core/netdev_max_backlog

참고: HZ °ª¿¡ ÁÖÀÇÇϱ⠹ٶõ´Ù: (alpha ³ª arm-tbox °°Àº) ƯÁ¤ ȯ°æ¿¡¼­´Â ÀÌ °ªÀÌ 1000 À¸·Î ¼³Á¤µÇ¾î Àֱ⠶§¹®¿¡ Æò±Õ 300 MBytes/sec ÀÇ throughput ÀÌ ³ª¿Â´Ù.


5.6.4. /proc/sys/net/ipv4

ip_forward °ªÀº ¸®´ª½º ¹Ú½ºÀÇ IP Æ÷¿öµùÀ» Ȱ¼ºÈ­Çϰųª ºñȰ¼ºÈ­ ½ÃŰ´Â ¿ªÇÒÀ» ÇÑ´Ù. À̰ÍÀº ¸ðµç ÀåÄ¡¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ¼³Á¤À̰í, °¢°¢ÀÇ ÀåÄ¡¸¦ ¼±ÅÃÇÏ¿© ¸í½ÃÇÒ ¼öµµ ÀÖ´Ù.


5.6.5. /proc/sys/net/ipv4/conf/interface

°³ÀÎÀûÀÎ »ý°¢À¸·Î´Â ÀÌ µð·ºÅ丮°¡ /proc Áß¿¡¼­ °¡Àå À¯¿ëÇÑ °÷À̶ó°í »ý°¢ÇÑ´Ù. ¿Ö³ÄÇϸé À̰÷¿¡¼­ ³×Æ®¿öÅ© ¼³Á¤À» Á¶±Ý º¯°æÇÏ¿© ¹«¼± ³×Æ®¿öÅ©¸¦ Áö¿øÇϵµ·Ï ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. (ÀÚ¼¼ÇÑ ³»¿ëÀº Wireless-HOWTO ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù)

À̸¦ ÀÌ¿ëÇÏ´Â ¿¹Á¦·Î´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù:

  • forwarding, ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽ºÀÇ IP Æ÷¿öµù ±â´ÉÀ» Ȱ¼ºÈ­ÇÑ´Ù.

  • proxy_arp, proxy arp ±â´ÉÀ» Ȱ¼ºÈ­ÇÑ´Ù. ÀÌ¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº The Linux Documentation Project ÀÇ ProxyARP Subnetting HOWTO ¹®¼­¿Í ¹«¼± ³×Æ®¿öÅ© »ó¿¡¼­ proxy arp ¸¦ »ç¿ëÇÏ´Â ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇÑ Wireless HOWTO ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù)

  • send_redirects, ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽º°¡ ICMP_REDIRECT ¸Þ½ÃÁö¸¦ º¸³»Áö ¾Êµµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. (À§¿¡µµ ¾ê±âÇßµíÀÌ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº Wireless HOWTO ¹®¼­¸¦ Âü°íÇ϶ó)


6. ¸®´ª½º ¸ÖƼŽºÅ·


6.1. °³¿ä

ÀÌ Àý¿¡¼­´Â ¸®´ª½º¿¡¼­ ¸ÖƼŽºÅ· ȯ°æÀ» °ü¸®ÇÏ´Â ¸ÞÄ«´ÏÁò°ú ÀÚ·á ±¸Á¶¿¡ ´ëÇØ¼­ ºÐ¼®ÇØ º¼ °ÍÀÌ´Ù.


6.1.1. ŽºÅ© »óÅÂ

¸®´ª½ºÀÇ Å½ºÅ©´Â ´ÙÀ½ ÁßÀÇ ÇѰ¡Áö »óŸ¦ °¡Áø´Ù ([include/linux.h] Âü°í):

  1. TASK_RUNNING, ÀÌ »óÅ´ Å½ºÅ©°¡ Ready ¸®½ºÆ® ¿¡ µé¾îÀÖÀ½À» ¸»ÇÑ´Ù.

  2. TASK_INTERRUPTIBLE, ŽºÅ©´Â ½Ã±×³ÎÀ̳ª ÀÚ¿øÀ» ±â´Ù¸®´Â ÁßÀÌ´Ù. (sleep)

  3. TASK_UNINTERRUPTIBLE, ŽºÅ©´Â ÀÚ¿øÀ» ±â´Ù¸®°í ÀÖÀ¸¸ç (sleep), °°Àº ´ë±â Å¥ ¿¡ µé¾îÀÖ´Ù.

  4. TASK_ZOMBIE, ºÎ¸ð°¡ ¾ø´Â ÀÚ½Ä Å½ºÅ©

  5. TASK_STOPPED, ŽºÅ©´Â µð¹ö±ë ÁßÀÌ´Ù.

       ______________     CPU Available     ______________
      |              |  ---------------->  |              |
      | TASK_RUNNING |                     | Real Running |  
      |______________|  ----------------  |______________|
                           CPU Busy
            |   /|\       
Waiting for |    | Resource  
 Resource   |    | Available             
           \|/   |      
    ______________________                     
   |                      |
   | TASK_INTERRUPTIBLE / |
   | TASK-UNINTERRUPTIBLE |
   |______________________|
 
                     Main Multitasking Flow
	 


6.2. ŸÀÓ ½½¶óÀ̽º


6.2.1. PIT 8253 ÇÁ·Î±×·¡¹Ö

¸Å 10 ms ¸¶´Ù (HZ °ªÀÇ ¼³Á¤¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖÀ½) ¸ÖƼŽºÅ· ȯ°æÀ» Áö¿øÇϵµ·Ï IRQ0 ÀÌ ¹ß»ýÇÑ´Ù. ÀÌ ½ÅÈ£´Â 1.19318 MHz ÀÇ Á֯ļö¸¦ °¡Áö´Â PIT 8253 Ŭ·°¿¡ ¿¬°áµÈ PIC 8259 (i386 À̻󿡼­) Ĩ¿¡¼­ ¹ß»ýµÈ´Ù.

    _____         ______        ______        
   | CPU |------| 8259 |------| 8253 |
   |_____| IRQ0  |______|      |___/|\|
                                    |_____ CLK 1.193.180 MHz
	 

// From include/asm/param.h
#ifndef HZ 
#define HZ 100 
#endif
 
// From include/asm/timex.h
#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
 
// From include/linux/timex.h
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
 
// From arch/i386/kernel/i8259.c
outb_p(0x34,0x43); /* binary, mode 2, LSB/MSB, ch 0 */ 
outb_p(LATCH  0xff , 0x40); /* LSB */
outb(LATCH >> 8 , 0x40); /* MSB */
	 

±×·¡¼­ 8253 PIT (Programmable Inteval Timer) ¸¦ ÇÁ·Î±×·¡¹ÖÇÒ ¶§ HZ °ªÀÌ 100 ÀÎ °æ¿ì (±âº»°ª) LATCH °ªÀ» 11931.8 (1193180 / HZ) ·Î ¼³Á¤ÇÑ´Ù. LATCH °ªÀº Á֯ļö¸¦ °áÁ¤ÇÏ´Â ¿ä¼Ò°¡ µÈ´Ù. (frequence divisor factor)

LATCH ¸¦ 11931.8 ·Î ¼³Á¤ÇÏ´Â °ÍÀº 8253 ÀÇ Ãâ·Â°ªÀÌ 1193180/11931.8 = 100 HZ ÀÇ Á֯ļö¸¦ °¡Áöµµ·Ï ÇÑ´Ù. µû¶ó¼­ ÁÖ±â´Â 10 ms °¡ µÈ´Ù.

Áï, ŸÀÓ ½½¶óÀ̽º °ªÀº 1/HZ ÀÌ´Ù.

°¢ ŸÀÓ ½½¶óÀ̽º ¸¶´Ù ÀϽÃÀûÀ¸·Î ÇöÀç ÇÁ·Î¼¼½ºÀÇ ½ÇÇàÀ» ÁßÁöÇϰí (ŽºÅ© ½ºÀ§Äª ¾øÀÌ) ¸î°¡Áö ºÎ¼öÀûÀÎ ÀϵéÀ» ó¸®ÇÑ ÈÄ¿¡ ´Ù½Ã ÀÌÀüÀÇ ÇÁ·Î¼¼½º·Î µ¹¾Æ¿À°Ô µÈ´Ù.


6.2.2. ¸®´ª½º ŸÀÌ¸Ó ÀÎÅÍ·´Æ® - ÇÔ¼ö°£ È£Ã⠺м®

Linux Timer IRQ
IRQ 0 [Timer]
 |  
\|/
|IRQ0x00_interrupt        //   Æ÷Àå (wrapper) IRQ Çڵ鷯
   |SAVE_ALL              ---   
      |do_IRQ                |  Æ÷Àå ÇÔ¼ö 
         |handle_IRQ_event  ---
            |handler() -> timer_interrupt  // µî·ÏµÈ IRQ 0 Çڵ鷯
               |do_timer_interrupt
                  |do_timer  
                     |jiffies++;
                     |update_process_times  
                     |if (--counter = 0) { // ÇÁ·Î¼¼½ºÀÇ Å¸ÀÓ ½½¶óÀ̽º°¡ ´Ù µÈ °æ¿ì
                        |counter = 0;        //   counter °ªÀ» Áö¿ì°í 
                        |need_resched = 1;   //   ½ºÄÉÁÙ¸µÀ» ¿äûÇÔ
                     |}
         |do_softirq
         |while (need_resched) { // ÇÊ¿äÇÑ °æ¿ì
            |schedule             //   ÇÁ·Î¼¼½º¸¦ ½ºÄÉÁÙ¸µ
            |handle_softirq
         |}
   |RESTORE_ALL

	 

°¢ ÇÔ¼öµéÀº ¾Æ·¡¿Í °°ÀÌ Ã£¾Æº¼ ¼ö ÀÖ´Ù:

  • IRQ0x00_interrupt, SAVE_ALL [include/asm/hw_irq.h]

  • IRQ0x00_interrupt, SAVE_ALL [include/asm/hw_irq.h]

  • timer_interrupt, do_timer_interrupt [arch/i386/kernel/time.c]

  • do_timer, update_process_times [kernel/timer.c]

  • do_softirq [kernel/soft_irq.c]

  • RESTORE_ALL, while loop [arch/i386/kernel/entry.S]

참고:

  1. IRQ0x00_interrupt ÇÔ¼ö´Â (´Ù¸¥ IRQ0xXY_interrupt ÇÔ¼öó·³) IDT (Interrupt Descriptor Table, ¸®¾ó ¸ðµåÀÇ Interrupt Vector Table °ú °°´Ù. 11 Àå Âü°í) ¿¡¼­ Á÷Á¢ °¡¸®Å°°í ÀÖÀ¸¹Ç·Î, ÇÁ·Î¼¼¼­·Î µé¾î¿À´Â ¸ðµç ÀÎÅÍ·´Æ®´Â IRQ0x#NR_interrupt ÇÔ¼ö¿¡ ÀÇÇØ 󸮵ȴÙ. (¿©±â¼­ #NR Àº ÀÎÅÍ·´Æ® ¹øÈ£¸¦ ÀǹÌ) ±×·¡¼­ ¿©±â¿¡¼­´Â ÀÌ·± ÇÔ¼öµéÀº Æ÷Àå IRQ Çڵ鷯 (wrapper irq handler) ¶ó°í ºÎ¸¥´Ù.

  2. do_IRQ À̳ª handle_IRQ_event ¿Í °°Àº Æ÷Àå ÇÔ¼öµéÀÌ ½ÇÇàµÈ´Ù. [arch/i386/kernel/irq.c]

  3. ±× ÀÌÈÄ¿¡´Â ÀÌÀü¿¡ request_irq [arch/i386/kernel/irq.c] ¿¡¼­ µî·ÏµÈ (handler() ·Î ÂüÁ¶µÇ´Â) °ø½ÄÀûÀÎ IRQ ·çƾ À¸·Î Á¦¾î°¡ ³Ñ¾î°£´Ù. ÀÌ °æ¿ì¿¡´Â timer_interrupt [arch/i386/kernel/time.c] °¡ µÈ´Ù.

  4. timer_interrupt [arch/i386/kernel/time.c] °¡ ½ÇÇàµÈ´Ù.

  5. Á¦¾î´Â ¾î¼Àºí¸® ·çƾÀ¸·Î ³Ñ¾î°£´Ù. [arch/i386/kernel/entry.S]

¼³¸í:

¸ÖƼŽºÅ·À» °ü¸®Çϱâ À§ÇØ ¸®´ª½º¿¡¼­´Â (´Ù¸¥ À¯´Ð½º¿¡¼­¿Í °°ÀÌ) counter À̶ó´Â º¯¼ö¸¦ µÎ¾î¼­ ŽºÅ©°¡ CPU ¸¦ ¾ó¸¸Å­ »ç¿ëÇß´ÂÁö¸¦ ±â·ÏÇØ µÐ´Ù. ±×·¡¼­ ¸Å IRQ 0 ¿¡¼­ ÀÌ °ªÀ» °¨¼Ò½Ã۰í (4 ¹ø ºÎºÐ¿¡ ÇØ´ç), counter °ªÀÌ 0 ÀÌ µÇ¸é ŽºÅ© ½ºÀ§ÄªÀÌ ÀϾµµ·Ï ÇÑ´Ù. (4 ¹ø¿¡¼­ need_resched °ªÀ» 1 ·Î ¼³Á¤Çϰí, 5 ¹ø¿¡¼­ resched °ª¿¡ µû¶ó schedule [kernel/sched.c] ÀÌ ½ÇÇàµÈ´Ù)


6.3. ½ºÄÉÁÙ·¯

½ºÄÉÁÙ·¯´Â ÁÖ¾îÁø ƯÁ¤ ½Ã°£¿¡¼­ ½ÇÇàµÇ¾î¾ß ÇÒ Å½ºÅ©¸¦ ¼±ÅÃÇÏ´Â ºÎºÐÀÇ Äڵ带 ¸»ÇÑ´Ù.

½ÇÇàµÇ°í Àִ ŽºÅ©¸¦ ±³Ã¼ÇØ¾ß ÇÏ´Â °æ¿ì¿¡ ±× È帰¡ µÉ ŽºÅ©¸¦ ¼±ÅÃÇÑ´Ù. ¾Æ·¡´Â schedule ÇÔ¼öÀÌ´Ù. [kernel/sched.c]

|schedule
   |do_softirq // ÀÌÀü¿¡ °É¸° soft-IRQ ó¸®
   |for each task
      |calculate counter
   |prepare_to__switch // ŽºÅ© ½ºÀ§ÄªÀ» À§ÇÑ È¯°æ ¼³Á¤
   |switch_mm // ¸Þ¸ð¸® ȯ°æ º¯°æ (CR3 ·¹Áö½ºÅÍ °ª ¼öÁ¤)
   |switch_to (assembler)
      |SAVE ESP
      |RESTORE future_ESP
      |SAVE EIP
      |push future_EIP *** ÇÔ¼ö È£ÃâÀ» ÇÑ °Í ó·³ ÆÄ¶ó¹ÌÅÍ ¼³Á¤
         |jmp __switch_to (TSS ¿¡ °ü·ÃµÈ ÀÛ¾÷À» ¼öÇà)
         |__switch_to()
          ..
         |ret *** future_EIP °¡ °¡¸®Å°´Â °÷À¸·Î º¹±Í
      new_task
	


6.4. ÇϹݺΠ(Bottom Half), ŽºÅ© Å¥ (Task Queues), ¼ÒÀÛ¾÷ (Tasklets)


6.4.1. °³¿ä

ÀüÅëÀûÀÎ À¯´Ð½º¿¡¼­´Â (ÀåÄ¡·Î ºÎÅÍ) IRQ °¡ ¹ß»ýÇßÀ» ¶§, ÀåÄ¡°¡ ¿äûÇÑ Å½ºÅ©¸¦ ó¸®Çϱâ À§ÇØ Å½ºÅ© ½ºÀ§Äª À» ¼öÇàÇÏ¿´´Ù.

¸®´ª½º¿¡¼­´Â ¼º´ÉÀ» Çâ»ó½Ã۱â À§ÇØ ±ä±ÞÇÏÁö ¾ÊÀº ÀÛ¾÷Àº µÚ·Î ¹Ì·ç¾î ´õ ºü¸¥ À̺¥Æ® 󸮸¦ ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

ÀÌ ±â´ÉÀº Ä¿³Î ¹öÀü 1.x ¿¡¼­ºÎÅÍ ÇϹݺΠ(Bottom Half - BH) ¿¡ ÀÇÇØ ¼öÇàµÇ¾î Á³´Ù. IRQ Çڵ鷯¿¡¼­´Â (³ªÁß¿¡ - ½ºÄÉÁÙ¸µ½Ã - ¼öÇàµÇµµ·Ï) ÇϹݺηΠǥ½ÃÇÑ´Ù.

ÃÖ½ÅÀÇ Ä¿³Î ¹öÀü¿¡¼­´Â Á» ´õ µ¿ÀûÀÌ°í ¸ÖÆ¼ ÇÁ·Î¼¼¼­ ȯ°æÀ» Áö¿øÇÏ´Â ¼ÒÀÛ¾÷ (Tasklet) À̶ó´Â °³³äÀ» µµÀÔÇÏ¿´´Ù.

ÇϹݺδ ´ÙÀ½°ú °°Àº ÇüŰ¡ µÉ °ÍÀÌ´Ù:

  1. ¼±¾ð (Declaration)

  2. Ç¥½Ã (Mark)

  3. ½ÇÇà (Execution)


6.4.2. ¼±¾ð

#define DECLARE_TASK_QUEUE(q) LIST_HEAD(q)
#define LIST_HEAD(name) \
   struct list_head name = LIST_HEAD_INIT(name) 
struct list_head { 
   struct list_head *next, *prev; 
};
#define LIST_HEAD_INIT(name) { (name), (name) }
	 

        DECLARE_TASK_QUEUE [include/linux/tqueue.h, include/linux/list.h]
	 

DECLARE_TASK_QUEUE(q) ¸ÅÅ©·Î´Â ŽºÅ© Å¥¸¦ °ü¸®ÇÏ´Â q ¶ó´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇϴµ¥ »ç¿ëµÈ´Ù.


6.4.3. Ç¥½Ã

¾Æ·¡´Â mark_bh ÇÔ¼ö¿¡ ´ëÇÑ ÇÔ¼ö°£ È£Ã⠺м®ÀÌ´Ù [include/linux/interrupt.h]:

|mark_bh(NUMBER)
   |tasklet_hi_schedule(bh_task_vec + NUMBER)
      |insert into tasklet_hi_vec
         |__cpu_raise_softirq(HI_SOFTIRQ) 
            |soft_active |= (1  HI_SOFTIRQ)

                   ''mark_bh''[include/linux/interrupt.h]
	 


6.4.4. ½ÇÇà

do_IRQ ÇÔ¼ö¿¡¼­ ¾Æ·¡¿Í °°Àº ºÎºÐÀÌ È£ÃâµÇ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù [arch/i386/kernel/irq.c]:

|do_softirq
   |h->action(h)-> softirq_vec[TASKLET_SOFTIRQ]->action -> tasklet_action
      |tasklet_vec[0].list->func
	 

h->action(h) Àº ÀÌÀü¿¡ Å¥¿¡ µé¾î°¡ ÀÖ´ø ÇÔ¼öÀÌ´Ù.


6.5. Àú¼öÁØ ·çƾµé

set_intr_gate

set_trap_gate

set_task_gate (»ç¿ëµÇÁö ¾ÊÀ½)

(*interrupt)[NR_IRQS](void) = { IRQ0x00_interrupt, IRQ0x01_interrupt, ..}

NR_IRQS = 224 [kernel 2.4.2]


6.6. ŽºÅ© ½ºÀ§Äª


6.6.1. ŽºÅ© ½ºÀ§ÄªÀº ¾ðÁ¦ ÀϾ´Â°¡?

¿©±â¼­´Â ¸®´ª½º Ä¿³ÎÀÌ ¼öÇàÁßÀΠŽºÅ©¸¦ ´Ù¸¥ ŽºÅ©·Î ±³Ã¼ÇÏ´Â °ÍÀ» »ìÆìº¼ °ÍÀÌ´Ù.

ŽºÅ© ½ºÀ§ÄªÀº ´ÙÀ½°ú °°Àº ¸¹Àº °æ¿ì¿¡¼­ ÇÊ¿äÇÏ´Ù:

  • ŸÀÓ ½½¶óÀ̽º°¡ ³¡³­ °æ¿ì, ´Ù¸¥ ŽºÅ©¸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù.

  • ŽºÅ©°¡ ÀÚ¿øÀ» »ç¿ëÇÏ·Á´Â °æ¿ì ÀÌ ÀÚ¿øÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ» ¶§±îÁö Àáµé°Ô µÈ´Ù. ÀÌ ¶§¿¡µµ ´Ù¸¥ ŽºÅ©¸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù.

  • ŽºÅ©°¡ ÆÄÀÌÇÁ¸¦ ±â´Ù¸®°í ÀÖ´Â °æ¿ì, ÆÄÀÌÇÁ¿¡ ¾²±â ¿¬»êÀ» ¼öÇàÇÒ ´Ù¸¥ ŽºÅ©¸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù.


6.6.2. ŽºÅ© ½ºÀ§Äª

                           TASK SWITCHING TRICK
#define switch_to(prev,next,last) do {                                  \
        asm volatile("pushl %%esi\n\t"                                  \
                     "pushl %%edi\n\t"                                  \
                     "pushl %%ebp\n\t"                                  \
                     "movl %%esp,%0\n\t"        /* save ESP */          \
                     "movl %3,%%esp\n\t"        /* restore ESP */       \
                     "movl $1f,%1\n\t"          /* save EIP */          \
                     "pushl %4\n\t"             /* restore EIP */       \
                     "jmp __switch_to\n"                                \
                     "1:\t"                                             \
                     "popl %%ebp\n\t"                                   \
                     "popl %%edi\n\t"                                   \
                     "popl %%esi\n\t"                                   \
                     :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
                      "=b" (last)                                       \
                     :"m" (next->thread.esp),"m" (next->thread.eip),    \
                      "a" (prev), "d" (next),                           \
                      "b" (prev));                                      \
} while (0)
	 

¿©±â¿¡´Â ´ÙÀ½°ú °°Àº Æ®¸¯ÀÌ Á¸ÀçÇÑ´Ù:

  1. push %4 ¸¦ ÅëÇØ ½ºÅÿ¡ future_EIP ¸¦ ³Ö´Â´Ù.

  2. jmp __switch_to ´Â __switch_to ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù. ÇÏÁö¸¸ call ¸í·ÉÀ» ÅëÇØ ½ÇÇàÇÑ °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ½ÇÇàµÈ µÚ¿¡´Â À§¿¡¼­ ¼³Á¤ÇÑ future_EIP ºÎºÐÀ¸·Î ¸®Å쵃 °ÍÀÌ´Ù. (µû¶ó¼­ »õ·Î¿î ŽºÅ©°¡ ½ÇÇàµÈ´Ù)

      U S E R   M O D E                 K E R N E L     M O D E

 |          |     |          |       |          |     |          |
 |          |     |          | Timer |          |     |          |
 |          |     |  Normal  |  IRQ  |          |     |          |
 |          |     |   Exec   |------>|Timer_Int.|     |          |
 |          |     |     |    |       | ..       |     |          |
 |          |     |    \|/   |       |schedule()|     | Task1 Ret|
 |          |     |          |       |_switch_to|--  |  Address |
 |__________|     |__________|       |          |  |  |          |
                                     |          |  |S |          | 
Task1 Data/Stack   Task1 Code        |          |  |w |          |
                                     |          | T|i |          |
                                     |          | a|t |          |
 |          |     |          |       |          | s|c |          |
 |          |     |          | Timer |          | k|h |          |
 |          |     |  Normal  |  IRQ  |          |  |i |          | 
 |          |     |   Exec   |------>|Timer_Int.|  |n |          |
 |          |     |     |    |       | ..       |  |g |          |
 |          |     |    \|/   |       |schedule()|  |  | Task2 Ret|
 |          |     |          |       |_switch_to|--  |  Address |
 |__________|     |__________|       |__________|     |__________|
 
Task2 Data/Stack   Task2 Code        Kernel Code  Kernel Data/Stack
	 


6.7. Fork


6.7.1. °³¿ä

fork ´Â »õ·Î¿î ŽºÅ©¸¦ »ý¼ºÇϱâ À§ÇØ »ç¿ëµÈ´Ù. Task Parent ¿¡¼­ ½ÃÀÛÇÏ¿© Task Child ·Î ¸¹Àº ÀڷᱸÁ¶¸¦ º¹»çÇÑ´Ù.

                               |         |
                               | ..      |
         Task Parent           |         |
         |         |           |         |
         |  fork   |---------->|  CREATE |   
         |         |          /|   NEW   |
         |_________|         / |   TASK  |
                            /  |         |
             ---           /   |         |
             ---          /    | ..      |
                         /     |         |
         Task Child     / 
         |         |   /
         |  fork   |-/
         |         |
         |_________|
              
                       Fork SysCall
	 


6.7.2. ¹«¾ùÀÌ º¹»çµÇÁö ¾Ê´Â°¡?

»õ·Î »ý¼ºµÈ ŽºÅ© (Task Child) ´Â ±× ºÎ¸ð ŽºÅ© (Task Parent) ¿Í °ÅÀÇ °°Áö¸¸, ´ÙÀ½°ú °°Àº Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù:

  1. ¸í¹éÇÑ Â÷ÀÌÁ¡À¸·Î´Â PID °ªÀÌ ´Ù¸£´Ù.

  2. ÀÚ½Ä Å½ºÅ©¿¡¼­´Â fork() ÇÔ¼ö°¡ 0 À» ¸®ÅÏÇÏÁö¸¸, ºÎ¸ð ŽºÅ©¿¡¼­´Â ÀÚ½Ä Å½ºÅ©ÀÇ PID °ªÀº ¸®ÅÏÇÑ´Ù. (»ç¿ëÀÚ ¸ðµå¿¡¼­ À̸¦ ÀÌ¿ëÇØ ¼­·Î¸¦ ±¸º°ÇÑ´Ù)

  3. ÀÚ½Ä Å½ºÅ©ÀÇ ¸ðµç µ¥ÀÌŸ ÆäÀÌÁö´Â (ºÎ¸ð ŽºÅ©¿¡¼­ ÀÚ½ÅÀÇ ÆäÀÌÁö¿¡ WRITE ±ÇÇÑÀ» °¡Áöµµ·Ï ¼³Á¤µÈ µ¥ ¹ÝÇØ) WRITE ±ÇÇÑ ¾øÀÌ READ + EXECUTE ±ÇÇÑÀ¸·Î ¼³Á¤µÇ¾î Áø´Ù. ±×·¡¼­ ¾²±â ¿¬»êÀÌ ¿äûµÇ¸é Page Fault ¿¹¿Ü°¡ ¹ß»ýµÇ¾î »õ·Î¿î µ¶¸³ÀûÀÎ ÆäÀÌÁö¸¦ »ý¼ºÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸ÞÄ«´ÏÁòÀ» Copy on Write ¶ó°í ºÎ¸¥´Ù. (´õ ÀÚ¼¼ÇÑ »çÇ×Àº ¿¡¼­ ¼³¸íÇÑ´Ù)


6.7.3. fork ÇÔ¼ö°£ È£Ã⠺м®

|sys_fork 
   |do_fork
      |alloc_task_struct 
         |__get_free_pages
       |p->state = TASK_UNINTERRUPTIBLE
       |copy_flags
       |p->pid = get_pid    
       |copy_files
       |copy_fs
       |copy_sighand
       |copy_mm // CopyOnWrite ¸ÞÄ«´ÏÁòÀ» °ü¸® (I part)
          |allocate_mm
          |mm_init
             |pgd_alloc -> get_pgd_fast
                |get_pgd_slow
          |dup_mmap
             |copy_page_range
                |ptep_set_wrprotect
                   |clear_bit // ÆäÀÌÁö¸¦ read-only ·Î ¼³Á¤
          |copy_segments // For LDT
       |copy_thread
          |childregs->eax = 0  
          |p->thread.esp = childregs // ÀÚ½Ä Å½ºÅ©¿¡¼­ 0 À» ¸®ÅÏÇϵµ·Ï ¼³Á¤
          |p->thread.eip = ret_from_fork // ÀÚ½Ä Å½ºÅ©°¡ ¼öÇàµÉ ½ÃÀÛ ºÎºÐ ¼³Á¤
       |retval = p->pid // ºÎ¸ð ŽºÅ©´Â ÀÚ½Ä Å½ºÅ©ÀÇ pid ¸¦ ¸®ÅÏÇϵµ·Ï ¼³Á¤
       |SET_LINKS // ŽºÅ©¸¦ ¸®½ºÆ® Æ÷ÀÎÅÍ¿¡ »ðÀÔ
       |nr_threads++ // Àü¿ª º¯¼ö 
       |wake_up_process(p) // »õ·Î »ý¼ºµÈ ÀÚ½Ä Å½ºÅ©¸¦ ±ú¿ò
       |return retval
              
               fork ICA
	 

  • sys_fork [arch/i386/kernel/process.c]

  • do_fork [kernel/fork.c]

  • alloc_task_struct [include/asm/processor.c]

  • __get_free_pages [mm/page_alloc.c]

  • get_pid [kernel/fork.c]

  • copy_files

  • copy_fs

  • copy_sighand

  • copy_mm

  • allocate_mm

  • mm_init

  • pgd_alloc -> get_pgd_fast [include/asm/pgalloc.h]

  • get_pgd_slow

  • dup_mmap [kernel/fork.c]

  • copy_page_range [mm/memory.c]

  • ptep_set_wrprotect [include/asm/pgtable.h]

  • clear_bit [include/asm/bitops.h]

  • copy_segments [arch/i386/kernel/process.c]

  • copy_thread

  • SET_LINKS [include/linux/sched.h]

  • wake_up_process [kernel/sched.c]


6.7.4. Copy on Write

¸®´ª½º¿¡¼­´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î Copy on Write ¸¦ ±¸ÇöÇÑ´Ù:

  1. ¾²±â ¿¬»êÀÌ ÀϾ ¶§ Page Falut °¡ ÀϾµµ·Ï º¹»çµÈ ¸ðµç ÆäÀÌÁö¸¦ read-only ·Î Ç¥½ÃÇÑ´Ù.

  2. Page Fault Çڵ鷯¿¡¼­ »õ·Î¿î ÆäÀÌÁö¸¦ »ý¼ºÇÑ´Ù.

 | Page 
 | Fault 
 | Exception
 |
 |
 -----------> |do_page_fault
                 |handle_mm_fault
                    |handle_pte_fault 
                       |do_wp_page        
                          |alloc_page      // »õ·Î¿î ÆäÀÌÁö ÇÒ´ç
                          |break_cow
                             |copy_cow_page // ÀÌÀü ÆäÀÌÁö¸¦ »õ·Î¿î ÆäÀÌÁö·Î º¹»ç
                             |establish_pte // ÆäÀÌÁö Å×ÀÌºí Æ÷ÀÎÅ͸¦ ´Ù½Ã ¼³Á¤
                                |set_pte
                            
              Page Fault ICA
	 

  • do_page_fault [arch/i386/mm/fault.c]

  • handle_mm_fault [mm/memory.c]

  • handle_pte_fault

  • do_wp_page

  • alloc_page [include/linux/mm.h]

  • break_cow [mm/memory.c]

  • copy_cow_page

  • establish_pte

  • set_pte [include/asm/pgtable-3level.h]


7. ¸Þ¸ð¸® °ü¸®


7.1. °³¿ä

°£´ÜÈ÷ ¸»Çؼ­, ¸®´ª½º´Â segmentation °ú pagnation À» µ¿½Ã¿¡ »ç¿ëÇÑ´Ù.


7.1.1. ¼¼±×¸ÕÆ®

¸®´ª½º´Â ¿ÀÁ÷ 4 °³ÀÇ ¼¼±×¸ÕÆ® ¸¸À» »ç¿ëÇÑ´Ù:

  • KERNEL SPACE (0xC000 0000 (3 GB) ºÎÅÍ 0xFFFF FFFF (4 GB) ±îÁö) ¸¦ À§ÇÑ 2 °³ÀÇ ¼¼±×¸ÕÆ® (code ¿Í data/stack)

  • USER SPACE (0 (0 GB) ºÎÅÍ 0xBFFF FFFF (3 GB) ±îÁö) ¸¦ À§ÇÑ 2 °³ÀÇ ¼¼±×¸ÕÆ® (code ¿Í data/stack)

                               __
   4 GB--->|                |    |
           |     Kernel     |    |  Kernel Space (Code + Data/Stack)
           |                |  __|
   3 GB--->|----------------|  __
           |                |    |
           |                |    |
   2 GB--->|                |    |
           |     Tasks      |    |  User Space (Code + Data/Stack)
           |                |    |
   1 GB--->|                |    |
           |                |    |
           |________________|  __| 
 0x00000000
          Kernel/User Linear addresses
	 


7.2. i386 ¿¡¼­ÀÇ Æ¯Â¡

ÀÌÀü¿¡µµ ¸»ÇßµíÀÌ ¸®´ª½º´Â Pagination À» 3 ´Ü°èÀÇ ÆäÀÌ¡À» ÀÌ¿ëÇØ¼­ ±¸ÇöÇÏÁö¸¸, i386 ȯ°æ¿¡¼­´Â ½ÇÁ¦·Î ±× Áß¿¡¼­ 2 ´Ü°è ¸¸À» »ç¿ëÇÑ´Ù:

   ------------------------------------------------------------------
   L    I    N    E    A    R         A    D    D    R    E    S    S
   ------------------------------------------------------------------
        \___/                 \___/                     \_____/ 
 
     PD offset              PF offset                 Frame offset 
     [10 bits]              [10 bits]                 [12 bits]       
          |                     |                          |
          |                     |     -----------          |        
          |                     |     |  Value  |----------|---------
          |     |         |     |     |---------|   /|\    |        |
          |     |         |     |     |         |    |     |        |
          |     |         |     |     |         |    | Frame offset |
          |     |         |     |     |         |   \|/             |
          |     |         |     |     |---------|------            |
          |     |         |     |     |         |      |            |
          |     |         |     |     |         |      | x 4096     |
          |     |         |  PF offset|_________|-------            |
          |     |         |       /|\ |         |                   |
      PD offset |_________|-----   |  |         |          _________|
            /|\ |         |    |   |  |         |          | 
             |  |         |    |  \|/ |         |         \|/
 _____       |  |         |    ------>|_________|   PHYSICAL ADDRESS 
|     |     \|/ |         |    x 4096 |         |
| CR3 |-------->|         |           |         |
|_____|         | ....... |           | ....... |
                |         |           |         |    
 
               Page Directory          Page File

                       Linux i386 Paging