¸®´ª½º Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö ¾È³»¼­

 

Version 1.1.0, 1999³â 4¿ù 26ÀÏ.

 

¿øÀúÀÚ : Ori Pomerantz

¿ªÀÚ : 亴ö(dataeng@chollian.net)

¹ø¿ª½ÃÀÛ : 1999³â 8¿ù 16ÀÏ.

 

ÀÌ Ã¥ÀÇ ¸ðµç ¹ø¿ª ³»¿ëÀº ¾Æ·¡¿¡ ¾ð±ÞÇÑ, ±×¸®°í ¿ø¹®ÀÇ GPLÀ» µû¸¨´Ï´Ù. ´©±¸³ª ÀÌ

Ã¥À» GPLÇÏ¿¡¼­ ÀÚÀ¯·Ó°Ô ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¸ ¼öÁ¤ÀÇ °æ¿ì³ª ¹ø¿ª»óÀÇ ¿À·ù´Â

º»Àο¡°Ô ¾Ë·ÁÁֽøé Áï½Ã À̸¦ ¹Ý¿µÇÒ °ÍÀ̸ç, ÀÌ ¾È³»¼­°¡ ÀÏ°üµÈ ³»¿ëÀ» À¯ÁöÇÏ´Â

µ¥ µµ¿òÀ» ÁÙ °ÍÀÔ´Ï´Ù.

ºÎ·Ï C,D´Â ÀÌ Ã¥ÀÇ ³»¿ë°ú Á÷Á¢ÀûÀÎ °ü·ÃÀÌ ¾ø±â¿¡ ¹ø¿ªÇÏÁö ¾Ê¾Ò½À´Ï´Ù.

ºÎ·Ï EÀÇ GPLÀº ¼ÛâÈÆ´ÔÀÇ ¹ø¿ªÀ» ±×´ë·Î ÀοëÇß½À´Ï´Ù.

 

 

ÀÌ °¡À̵åÀÇ ³»¿ëÀº ¸®´ª½ºÀÇ Ä¿³Î ¸ðµâ¿¡ °üÇÑ °ÍÀÌ´Ù. ÀÌ°ÍÀº Ä¿³Î ¸ðµâÀ» ¸¸µå´Â

¹æ¹ýÀ» ¾Ë±â ¿øÇÏ´Â ±×¸®°í C¾ð¾î¸¦ ¾î´À Á¤µµ ÀÌÇØÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô À¯¿ëÇÒ °ÍÀÌ

´Ù. ÀÌ°ÍÀº Áß¿äÇÑ ±â¹ý¿¡ ´ëÇÑ ¸ðµç ¿¹Á¦¿Í ÇÔ²², How-To ¸í·É ¸Å´º¾ó·Î ¾²¿©Áø °ÍÀÌ

´Ù. ÀÌ °¡À̵å´Â Ä¿³Î ¼³°èÀÇ ¸¹Àº ºÎºÐÀ» ´Ù·ç°í ÀÖÁö¸¸, ±×°Í¿¡ ´ëÇØ ¸¹Àº °ÍÀ» ¾Ë

ÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù --- ÀÌ·¯ÇÑ ÁÖÁ¦¿¡ ´ëÇÑ ³»¿ëÀº ¸®´ª½º ¹®¼­ ÇÁ·ÎÁ§Æ®, Ãâ°£µÈ ÀÚ

·á¿¡¼­ ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ç½ÅÀº ÀÌ Ã¥ÀÇ ³»¿ëÀ» Çã°¡µÈ Á¶°Ç¾Æ·¡¼­ ÀÚÀ¯·Ó°Ô Àç

¹èÆ÷ÇÏ°í º¹»çÇÒ ¼ö ÀÖ´Ù. Ä«ÇǶóÀÌÆ®¿Í ¹èÆ÷¿¡ °üÇÑ ¾Æ·¡ÀÇ ³»¿ëÀ» »ìÆ캸±æ ¹Ù¶õ´Ù.

 

¿©±â¿¡ ¾ð±ÞµÈ ¸ðµç Á¦Ç°ÀÇ ¸íĪÀº ´ÜÁö Á¦Ç°¿¡ ´ëÇÑ ÀνÄÀ» ¸íÈ®È÷ Çϱâ À§ÇÑ ¸ñÀûÀÌ

¸ç, µî·Ï »óÇ¥´Â ¸ðµÎ °¢ ¼ÒÀ¯ÀÚ¿¡ ¼ÓÇØ ÀÖÀ½À» ¹àÈù´Ù. ³ª´Â Á¦Ç°¿¡ °ü°èµÈ ȸ»ç, ¼Ò

À¯È¸»ç¿¡ ¾î¶°ÇÑ ¼ÒÀ¯±Çµµ ÁÖÀåÇÏÁö ¾Ê´Â´Ù

 

Copyright(c) 1999 Ori Pomerantz

Ori Pomerantz

Apt. #1032

2355 N Hwy 360

Grand Prairie

TX 75050

USA

Email: mpg@simple-tech.com

 

¸®´ª½º Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö ¾È³»¼­´Â ¹«·áÀÌ´Ù. ´ç½ÅÀº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÇ G-

NU °ø°³ ¶óÀ̼±½ºÇÏ(Ver2)¿¡¼­ À̸¦ ¼öÁ¤, Àç ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù. ¹öÀü 2´Â ÀÌ Ã¥ÀÇ ºÎ·Ï

E¿¡ ±â¼úµÇ¾î ÀÖ´Ù. ÀÌ Ã¥ÀÌ ¾µ¸ð ÀÖ°Ô ¿©·¯ »ç¶÷¿¡ ¹èÆ÷µÇ±â¸¦ ¹Ù¶õ´Ù, ±×·¯³ª ¾î¶²

»çÈÄ º¸Àåµµ ¾øÀ» °ÍÀÌ´Ù; »óÇ°¼º ÀÖ´Â Á¦Ç°ÀÇ »çÈÄ º¸ÀåÀº ¾øÀ» °ÍÀ̸ç, Ưº°ÇÑ ¸ñÀû

¿¡ ÀûÇÕÇÏ°Ô ¹Ù²îÁöµµ ¾ÊÀ» °ÍÀÌ´Ù. ÀúÀÚ´Â ÀÌ Ã¥ÀÌ À§¿¡ ¾ð±ÞÇÑ Ä«ÇǶóÀÌÆ®¿¡ ÁØÇÏ¿©

»ç¶÷µé¿¡°Ô, ȤÀº »ó¾÷ÀûÀ¸·Î ³Î¸® ÆÛÁö´Â °Í¿¡ ¿ë±â¸¦ ¾òÀ» °ÍÀÌ´Ù. ´Ù½Ã ¸»Çϸé, ´ç

½ÅÀº ÀÌ Ã¥À» ¹«·á·Î º¹»çÇÏ°í Àç ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù. ¹°¸®Àû, ÀüÀÚÀû, ¶Ç´Â ±× Áß°£ÀÇ

¸Åü·Î¼­ Àç »ý»êµÇ´Â °Í¿¡ ÀúÀÚÀÇ ¾î¶² ¸í½ÃÀû Çã°¡µµ ÇÊ¿ä ¾ø´Ù. ÁÖÀÇÇÒ °ÍÀº, ÆÄ»ý

µÈ °á°ú ±×¸®°í ÀÌ ¹®¼­ÀÇ º¯È¯Àº ¹Ýµå½Ã GNUÀÇ °ø°³ ¶óÀ̼¾½ºÇÏ¿¡¼­¸¸ °¡´ÉÇÏ´Ù´Â °Í

À̸ç, ¿ø Ä«ÇǶóÀÌÆ® Á¶°ÇÀº À¯ÁöµÇ¾îÁ®¾ß¸¸ ÇÑ´Ù. ´ç½ÅÀÌ ÀÌ Ã¥¿¡ »õ·Î¿î ³»¿ëÀ» ÷

ºÎÇϱ⠿øÇÑ´Ù¸é, »õ·Î¿î ±³Á¤À» À§ÇØ À¯¿ëÇÑ ¿ø¹®ÀÇ ¼Ò½º ÄÚµå¿Í ÇÔ²²(L A T E X¿Í

°°Àº) ÀÌ ¹®¼­ÀÇ À¯Áö º¸¼öÀÚÀÎ, Ori Pomerantz¿¡°Ô ±× ³»¿ëÀ» ¾Ë¸®±â¸¦ ¹Ù¶õ´Ù. ÀÌ·¸

°Ô ÇÔÀ¸·Î¼­ »õ·Î¿î ³»¿ëÀÌ Ãß°¡µÉ °ÍÀ̸ç, ¸®´ª½ºÀÇ ¼¼°è¿¡ ÀÏ°üµÈ ±³Á¤À» Á¦°øÇÏ°Ô

µÈ´Ù. ÀÌ Ã¥À» »ó¾÷ÀûÀ¸·Î ¹èÆ÷ÇÏ°í ÃâÆÇÇÒ °èȹÀ̶ó¸é, ¾à°£ÀÇ ±âºÎ±Ý, ·Î¿­Æ¼, ÃâÆÇ

·á´Â, ¸®´ª½º ¹®¼­ ÇÁ·ÎÁ§Æ®¿Í ÀúÀÚ´Â ´ç»çÀÚ¿¡°Ô Å« °¨»ç¸¦ ´À³¥ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹æ

¹ýÀº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¿Í ¸®´ª½º ¹®¼­ ÇÁ·ÎÁ§Æ®¿¡ ±â¿©ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. Áú¹®À̳ª

ȤÀº ÁÖ¼®ÀÌ ÀÖ´Ù¸é, À§ÀÇ ÁÖ¼Ò·Î ¿¬¶ôÇϱ⠹ٶõ´Ù.

 

 

³»¿ë

 

0. ¼Ò°³

0.1 ´©°¡ ÀÌ°ÍÀ» Àоî¾ß Çϴ°¡?

0.2 ¹®Ã¼¿¡ ´ëÇÑ ÁÖÀÇ

0.3 º¯È­µÈ °Íµé

0.3.1 ¹®¼­ ¹öÀü 1.0.1¿¡¼­ÀÇ º¯È­

0.3.2 ¹®¼­ ¹öÀü 1.1.0¿¡¼­ÀÇ º¯È­

0.4 °¨»çÀÇ ¸»

0.4.1 1.0.1À» À§ÇÑ

0.4.2 1.1.0À» À§ÇÑ

 

1. Hello, world

hello.c

1.1 Ä¿³Î ¸ðµâÀ» À§ÇÑ Makefiles

Makefile

1.2 ´ÙÁß ÆÄÀÏ

start.c

stop.c

Makefile

 

2. ¹®ÀÚ ÀåÄ¡ ÆÄÀϵé

chardev.c

2.1 ´ÙÁß ¹öÀü ¼Ò½º ÆÄÀÏ

 

3. /proc ÆÄÀÏ ½Ã½ºÅÛ

procfs.c

 

4. ÀÔ·ÂÀ» À§ÇÑ /procÀÇ ÀÌ¿ë

procfs.c

 

5. ÀåÄ¡ ÆÄÀÏÀÇ Á¦¾î(IOCTL ´Ù·ç±â)

chardev.c

chardev.h

ioctl.c

 

6. Ãʱâ Á¶°Çµé

param.c

 

7. ½Ã½ºÅÛ È£Ãâ

syscall.c

 

8. Blocking Processes

sleep.c

 

9. printk'sÀÇ ´ëÄ¡

printk.c

 

10. ŽºÅ© ½ºÄÉÁÙ¸µ

sched.c

 

11. ÀÎÅÍ·´Æ® 󸮱â

11.1 ÀÎÅÚ±¸Á¶¿¡¼­ÀÇ Å°º¸µå

intrpt.c

 

12. ´ëĪÇü ´ÙÁß Ã³¸®

 

13. ¹üÇϱ⠽¬¿î ½Ç¼ö

 

A. 2.0¿¡¼­ 2.2.107»çÀÌÀÇ º¯È­

 

B. ¾îµð¿¡¼­ Ãß°¡ÀûÀÎ ³»¿ëÀ» ¾òÀ» ¼ö Àִ°¡?

 

C. »óÇ°°ú ¼­ºñ½º

 

C.1 ÃâÆǹ° ¾ò±â

 

D. ´ç½ÅÀÌ È£ÀǸ¦ º¸ÀÌ·Á¸é(±âºÎ¸¦ ¿øÇϸé)

 

E. The GNU General Public License

 

Á¦ 0 Àå

 

¼Ò°³

 

ÀÚ ÀÌÁ¦ ´ç½ÅÀº Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇϱ⸦ ¿øÇÑ´Ù. ´ç½ÅÀº C¾ð¾î¸¦ ¾È´Ù, ¸¹Àº ÇÁ·Î±×·¥

µéÀ» ÀÛ¼ºÇÏ°í ½ÇÇàÇßÀ» °ÍÀÌ´Ù. ±×¸®°í, ÀÌÁ¦ ´ç½ÅÀº ½ÇÁ¦ µ¿ÀÛÀÌ ¾îµð¿¡¼­ ÀϾ´Â

Áö ¾îµð¿¡¼­ ÇϳªÀÇ ´ÜÀÏÇÑ ¿ÍÀϵå Æ÷ÀÎÅÍ°¡ ÆÄÀϽýºÅÛÀ» Áö¿ï ¼ö ÀÖ´ÂÁö, ¸®ºÎÆ®µÇ

´ÂÄÚ¾î ´ýÇÁ¸¦ ¹ß»ýÇÏ´ÂÁö ¾Ë ¼ö Àֱ⸦ ¿øÇÑ´Ù. ÀÌÁ¦, Ŭ·´(¿ªÁÖ:¸ðµâÀ» ÀÛ¼ºÇÏ´Â)¿¡

¿Â °ÍÀ» ȯ¿µÇÑ´Ù. ³ª´Â DOS(°í¸¿°Ôµµ, ÀÌÁ¦ ³ª»Û ¿î¿µÃ¼Á¦¸¦ °ßµ®¾ß ÇÑ´Ù)ÇÏ¿¡¼­ Áß

¿äÇÑ µð·ºÅ丮¸¦ Áö¿ï ¼ö ÀÖ´Â ¿ÍÀϵå Æ÷ÀÎÅ͸¦ °¡Áö°í ÀÖ°í, ¸®´ª½º ÇÏ¿¡¼­µµ ¾ÈÀüÇÏ

°Ô »ì¼ö ÀÖÀ»Áö ¸ð¸¥´Ù. ÁÖÀÇ: ¿©±âÀÇ ÄÚµå´Â ÀÎÅÚ ÆæƼ¾ö¿¡¼­ ½ÇÇàµÇ´Â ¹öÀü 2.0.35

¿¡¼­ 2.2.3¿¡¼­ ÀÛ¼ºµÇ°í °Ë»çµÇ¾ú´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡, ¹öÀüÀÌ 2.0.x¿¡¼­ 2.2.xÀ̶ó

¸é ´Ù¸¥ CPUÀÇ ´Ù¸¥ Ä¿³Î¿¡ À־µµ Á¦´ë·Î µ¿ÀÛÇÒ °ÍÀ̳ª ±× ¾î¶² ¾à¼ÓÇÒ ¼ö´Â ¾ø´Ù

. ÇÑ °¡Áö ¿¹¿Ü´Â 11ÀåÀ̸ç, ÀÌ°ÍÀº x86À» Á¦¿ÜÇÑ ±¸Á¶¿¡¼­´Â ÀûÀýÇÏ°Ô µ¿ÀÛÇÏÁö ¾ÊÀ»

°ÍÀÌ´Ù.

 

 

0.1 ´©°¡ ÀÌ°ÍÀ» Àоî¾ß Çϴ°¡?

 

ÀÌ ¹®¼­´Â Ä¿³Î ¸ðµâ¿¡ ´ëÇØ ¾Ë±â ¿øÇÏ´Â »ç¶÷À» À§ÇÑ °ÍÀÌ´Ù. ¿©·¯ ºÎºÐ¿¡¼­ Ä¿³ÎÀÇ

³»ºÎ¿¡ ´ëÇÑ ³»¿ëÀ» ¾à°£¾¿ ´Ù·ê °ÍÀ̳ª, ÀÌ°ÍÀº ÀÌ ¹®¼­ÀÇ ¸ñÀûÀÌ ¾Æ´Ï´Ù. ³»°¡ ¿©±â

¼­ ¼³¸íÇÑ °Í º¸´Ù ¸¹Àº ÈǸ¢ÇÑ ³»¿ëÀ» Ä¿³Î¿¡¼­ ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¹®¼­´Â ¶ÇÇÑ Ä¿³Î ¸ð

µâÀ» ÀÛ¼ºÇϱ⠿øÇÏ´Â »ç¶÷À» À§ÇÑ °ÍÀ̳ª, ¹öÀü 2.2ÀÇ Ä¿³Î¿¡¼­ ¾ÆÁ÷ ÀûÇÕÇÏÁö ¾Ê´Ù.

´ç½ÅÀÌ ÀÌ·¯ÇÑ °æ¿ì¶ó¸é, ºÎ·Ï AÀÇ ¿¹Á¦µéÀ» »ìÆ캸±æ ±ÇÇÑ´Ù. ÀÌ ¸ñ·ÏÀÇ ¾î¶² °Íµµ

ÀÌÇØÇϱ⠽±Áö´Â ¾ÊÁö¸¸, ´ëºÎºÐÀÇ ±âº»ÀûÀÎ ±â´ÉÀ» Æ÷ÇÔÇÏ°í ÀÖÀ¸¸ç ´ç½ÅÀÌ ½ÃÀÛÇϱâ

¿¡ ÃæºÐÇÑ ³»¿ëÀ» Á¦°øÇÒ °ÍÀÌ´Ù.

 

Ä¿³ÎÀº ¸¹Àº Á¶°¢ ÇÁ·Î±×·¥ÀÇ ÁýÇÕÀÌ°í, ³ª´Â ÇÁ·Î±×·¡¸ÓµéÀÌ Àû¾îµµ ¸î °¡Áö Ä¿³Î ¼Ò

½º¸¦ Àо°í ÀÌÇØÇÑ´Ù°í ¹Ï´Â´Ù. ÀÌ¹Ì ¸»ÇßÁö¸¸, ½Ã½ºÅÛÀÇ Ã³À½°ú ÇÔ²² ÇÏ´Â °¡Ä¡¿Í

³ªÁß¿¡ ¹°¾îº¼ Áú¹®µéÀ» È®½ÅÇÑ´Ù. ³»°¡ »õ·Î¿î ÇÁ·Î±×·¥¾ð¾î¸¦ ¹è¿ì±â ½ÃÀÛÇßÀ» ¶§,

¶óÀ̺귯¸® Äڵ带 ÇÔ²² ÀÐÁö´Â ¾Ê¾ÒÁö¸¸, ÀÛÀº "hello, world"ÇÁ·Î±×·¥À» ÀÛ¼ºÇß¾ú´Ù

. ÀÌ·¯ÇÑ °ÍÀº Ä¿³Î¿¡¼­µµ ¾î¶² Â÷ÀÌÁ¡À» °®Áö ¾Ê´Â´Ù.

 

0.2 ¹®Ã¼¿¡ ´ëÇÑ ÁÖÀÇ

 

³ª´Â ¹®¼­¿¡ °¡´ÉÇÑ ÇÑ ¸¹Àº Á¶Å©¸¦ ³Ö´Â °ÍÀ» ÁÁ¾ÆÇÑ´Ù. ³»°¡ ÀÌ·¸°Ô ÇÏ´Â °ÍÀº ±×°Í

À» Áñ±â±â ¶§¹®À̸ç, ±×¸®°í ´ëºÎºÐÀÇ °æ¿ì ´ç½Åµµ µ¿ÀÏÇÑ ÀÌÀ¯·Î¼­ ÀÌ°ÍÀ» Àд °ÍÀÌ

¶ó°í »ý°¢ÇÑ´Ù. ´ç½ÅÀÌ ¹®¼­ÀÇ Áß¿äÇÑ Á¡¸¸ ¾Ë±â ¿øÇÑ´Ù¸é, º¸ÅëÀÇ ¹®ÀåÀº ¹«½ÃÇÏ°í,

¼Ò½º Äڵ常À» ÀÐÀ¸¸é µÈ´Ù. Áß¿äÇÑ ³»¿ë¿¡ ´ëÇØ ºüÁü¾øÀÌ ÁÖ¼®À» ´Þ¾Æ ³õ¾Ò´Ù.

 

 

0.3 º¯È­µÈ °Íµé

 

0.3.1 ¹®¼­ ¹öÀü 1.0.1¿¡¼­ÀÇ º¯È­

 

1. ¼½¼ÇÀÇ º¯°æ - 0.3 Àå

2. ¾î¶»°Ô ºÎ µð¹ÙÀ̽º ¹øÈ£¸¦ ã´Â°¡? - 2 Àå

3. ¹®ÀÚ¿Í µð¹ÙÀ̽º ÆÄÀÏµé »çÀÌÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇÑ ¼³¸í - 2 Àå

4. Ä¿³Î ¸ðµâÀ» À§ÇÑ Makefiles - 1.1 Àå

5. ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½Ì - 12 Àå

6. '³ª»Û »ý°¢' - 13 Àå

 

0.3.2 ¹®¼­ ¹öÀü 1.1.0¿¡¼­ÀÇ º¯È­

 

1. Ä¿³Î ¹öÀü 2.2ÀÇ Áö¿ø, ¸ðµç ¹®¼­¿¡¼­.

2. ´ÙÁß Ä¿³Î ¹öÀü ¼Ò½º ÆÄÀϵé - 2.1 Àå

3. 2.0°ú 2.2»çÀÌÀÇ º¯È­µé - ºÎ·Ï A.

4. ´ÙÁß ¼Ò½º ÆÄÀÏ¿¡¼­ Ä¿³Î ¸ðµâµé - 1.2 Àå

5. rmmod¿Í ½Ã½ºÅÛ È£ÃâÀÇ È¥¶õÀ» ¸·±â À§ÇÑ Á¦¾È - 7 Àå

 

 

0.4 °¨»çÀÇ ¸»

 

¸¹Àº ¾ÆÀ̵ð¾î¿Í Åä·Ð¿¡ µµ¿òÀ» ÁØ Yoav Weiss¿¡ °¨»çµå¸®¸ç, Ãâ°£ Àü¿¡ ¸¹Àº ½Ç¼öµé

À» ±³Á¤ÇØÁØ ¸¹Àº »ç¶÷µé¿¡°Ô ¶ÇÇÑ °¨»çÇÑ´Ù. ¹°·Ð ³ªÀÇ ½Ç¼ö·Î µå¹°Áö ¾Ê°Ô ½Ç¼ö°¡

³²¾Æ ÀÖÁö¸¸...

ÀÌ Ã¥ÀÇ T E XÃÊ°í´Â '¸®´ª½º ¼³Ä¡, ½ÃÀÛ'¿¡¼­ ºÎ²ô·¯¿òÀ» ´À³¢¸é¼­ ÈÉÃÄ(?)¿ÔÀ¸¸ç,

Matt Welsh¿¡ ÀÇÇØ T E XÀÇ ÀÛ¾÷ÀÌ ¿Ï·áµÇ¾ú´Ù.

¸®´©½º Åä¹ßÁî¿¡°Ô °æÀǸ¦ Ç¥Çϸç, ¸®Â÷µå ½ºÅ縸°ú ³ªÀÇ ÄÄÇ»ÅÍ¿¡ ¶Ù¾î³­ ¿î¿µÃ¼Á¦¸¦

°®Ãßµµ·Ï ÇØÁØ ´Ù¸¥ ¸¹Àº »ç¶÷µé°ú ¾Æ¹«·± Á¶°Ç ¾øÀÌ ¼Ò½ºÄڵ带 ¾òµµ·Ï ÇØÁØ(¸Â¾Æ --

³»°¡ ¿Ö ÀÌÀ¯¸¦ ¸»ÇØ¾ß ÇÏÁö: ¿ªÁÖ-GNUÀÇ ¼Ò½ºÀ̱⿡) »ç¶÷µé¿¡°Ô °¨»çÇÑ´Ù.

 

0.4.1 ¹öÀü 1.0.1À» À§ÇÑ

 

³ª¿¡°Ô ÀüÀÚ¿ìÆíÀ¸·Î µµ¿òÀ» ÁØ »ç¶÷µé ¸ðµÎ¿¡°Ô »çÀÇ¿Í °¨»ç¸¦ µå¸°´Ù. ¾Æ·¡ÀÇ »ç¶÷

µéÀº Ưº°ÇÑ µµ¿òÀ» ÁÖ¾ú´Ù:

 

³×´ú¶õµåÀÇ Frodo Looijaard´Â È£½ºÆ®¸¦ À§ÇÑ À¯¿ëÇÑ Á¦¾È°ú 2.1.xÄ¿³Î¿¡ ´ëÇÑ Á¤º¸¸¦

ÁÖ¾ú´Ù.

´ºÁú·£µåÀÇ Stephen JuddÀº öÀÚ ±³Á¤À» ÇØÁÖ¾ú´Ù..

½º¿þµ§ÀÇ Magnus Ahltorp´Â ¹®ÀÚ¿Í ºí·Ï ÀåÄ¡¿¡ »çÀÌÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇÑ ³ªÀÇ ½Ç¼ö¸¦ ±³

Á¤ÇØ ÁÖ¾ú´Ù.

 

0.4.2 ¹öÀü 1.1.0À» À§ÇÑ

 

ij³ª´Ù Äûº¤ÀÇ Emmanuel Papirakis, 2.2Ä¿³Î¿¡ ¸ðµç ¿¹Á¦µéÀ» Æ÷ÆÃÇØ ÁÖ¾ú´Ù.

³×´ú¶õµåÀÇ Frodo Looijaard´Â ´ÙÁß ÆÄÀÏ Ä¿³Î ¸ðµâ ÀÛ¼º ¹æ¹ýÀ» ¾Ë·Á ÁÖ¾ú´Ù.

 

¹°·Ð, ³ª ÀÚ½ÅÀÇ ºÎÁÖÀÇ·Î ¿©ÀüÈ÷ ½Ç¼ö°¡ ³²¾ÆÀÖ´Ù, ±×¸®°í ¸¸¾à ´ç½ÅÀÌ ÀÌ Ã¥À»

ºÒÇÊ¿äÇÏ°Ô »ý°¢ÇÏ°í ´ç½ÅÀÇ ±âºÎ±ÝÀ» µ¹·Á ¹Þ±â¸¦ ¿øÇÑ´Ù¸é ±×·¸°Ô ÇØÁÙ °ÍÀÌ´Ù.

 

Á¦ 1 Àå

 

Hello, world

 

óÀ½ÀÇ ¿ø½Ã ÇÁ·Î±×·¡¸Ó°¡ ù ¹ø° ÇÁ·Î±×·¥À» ÃÖÃÊÀÇ µ¿±¼ ÄÄÇ»ÅÍÀÇ È­¸é¿¡ Á¶°¢ÇßÀ»

¶§, ±×°ÍÀº »ç½¿ ±×¸² ¾È¿¡ 'Hello, world'¶õ ¹®ÀÚ¿­À» ±×¸° °ÍÀ̾ú´Ù.

·Î¸¶ÀÎÀÇ ÇÁ·Î±×·¥ ±³º»Àº 'Salut, Mundi'ÀÇ ÇÁ·Î±×·¥°ú ÇÔ²² ½ÃÀ۵Ǿú´Ù. ´©°¡ ÀÌ·¯

ÇÑ ÀüÅëÀ» ±ú¶ß·È´ÂÁö »ç¶÷µé¿¡°Ô ¾î¶² ÀÏÀÌ ÀϾ´ÂÁö ¸ð¸£°Ú´Ù. ÀÌ·¯ÇÑ ÀÏÀÌ ¹ß°ß

µÇÁö ¾Ê´Â °ÍÀÌ Á»´õ ¾ÈÀüÇÏÁö ¾Ê¾ÒÀ»±î »ý°¢ÇÑ´Ù.

 

ÇϳªÀÇ Ä¿³Î ¸ðµâÀº Àû¾îµµ µÎ°³ÀÇ ÇÔ¼ö¸¦ °¡Áø´Ù; ¸ðµâÀÌ Ä¿³Î ¾È¿¡ »ðÀ﵃ ¶§ init

¸ðµâÀÌ È£ÃâµÇ°í, Á¦°ÅµÇ±â Àü¿¡ cleanup ¸ðµâÀÌ È£ÃâµÈ´Ù. ÀüÇüÀûÀ¸·Î, init ¸ðµâÀº

Ä¿³Î°ú ÇÔ²² ¹«¾ð°¡ ÀÏÀ» ¼öÇàÇϱâ À§ÇÑ Ã³¸®±âÀÇ µî·Ï°ú ÀÚ½ÅÀÇ ÄÚµå¿Í ÇÔ²² Ä¿³Î ÇÔ

¼öÀÇ Çϳª¸¦ ´ëÄ¡ÇÑ´Ù.(ÀϹÝÀûÀ¸·Î ÄÚµå´Â ¹«¾ðÀΰ¡ ¼öÇàÇÏ°í ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù

). cleanup¸ðµâÀº init¸ðµâÀÌ ¹«¾ùÀ» Çß´ø °£¿¡ ¿ø·¡´ë·Î µÇµ¹¸±°ÍÀÌ°í,±×·¡¼­ ¸ðµâÀº

¾ÈÀüÇÏ°Ô ÀçÀûÀç °¡´ÉÇÏ°Ô µÈ´Ù.

 

<hello.c>

/*

/* hello.c

* Copyright (C) 1998 by Ori Pomerantz

*

* "Hello, world" - Ä¿³Î ¸ðµâÀÇ ¹öÀü.

*/

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù */

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â*/

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* ¸ðµâÀÇ ÃʱâÈ­ */

int init_module()

{

printk("Hello, world - this is the kernel speaking\n");

 

/* 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇϸé, init_moduleÀÌ ½ÇÆÐÇßÀ½À» ³ªÅ¸³»°í Ä¿³Î ¸ðµâÀº

ÀûÀçµÇÁö ¾Ê´Â´Ù */

return 0;

}

 

/* Cleanup - init_moduleÀÌ ¹«¾ùÀ» Çß´ø °£¿¡ µÇµ¹¸°´Ù */

void cleanup_module()

{

printk("Short is the life of a kernel module\n");

}

 

1.1 Ä¿³Î ¸ðµâÀ» À§ÇÑ Makefiles

 

Ä¿³Î ¸ðµâÀº µ¶¸³ÀûÀ¸·Î ½ÇÇàµÇÁö ¾ÊÁö¸¸, ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ Ä¿³ÎÀÇ ½ÇÇà ½Ã¿¡ ¸µÅ©µÉ

°ÍÀÌ´Ù. °á·ÐÀ» ¸»ÇÏÀÚ¸é, ¸ðµâµéÀº -c Ç÷¡±×¿Í ÇÔ²² ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ, ¸ð

µç Ä¿³Î ¸ðµâÀº ¾Æ·¡ÀÇ Á¤ÀÇµÈ ½É¹úµé°ú ÇÔ²² ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù.

 

*. KERNEL --- ÀÌ´Â Çì´õ ÆÄÀÏ¿¡ ÀÌ Äڵ尡 »ç¿ëÀÚ ÇÁ·Î¼¼½º°¡ ¾Æ´Ñ, Ä¿³Î ¸ðµå¿¡¼­

½ÇÇàµÊÀ» ¾Ë¸°´Ù,

 

*. MODULE --- ÀÌ´Â Çì´õ ÆÄÀÏ¿¡ Ä¿³Î ¸ðµâÀ» À§ÇÑ ÀûÀýÇÑ Á¤ÀǵéÀ» Æ÷ÇÔÇϵµ·Ï ÇÑ´Ù.

 

*. LINUX --- ±â¼úÀûÀ¸·Î ¸»ÇÏÀÚ¸é, ÀÌ°ÍÀº ÇÊ¿äÇÏÁö ¾Ê´Ù. ±×·¯³ª, ¿©·¯ °³ÀÇ ¿î¿µÃ¼

Á¦»ó¿¡¼­ ÄÄÆÄÀÏÇϱ⿡ ¾ÆÁÖ Á¶½É½º·´°Ô Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇϱ⠿øÇϸé, ÀÌ°ÍÀÌ ÁÁÀº

°á°ú¸¦ °¡Á®´Ù ÁÙ °ÍÀÌ´Ù. ÀÌ´Â ¿î¿µÃ¼Á¦¿¡ Á¾¼ÓÀûÀÎ Á¶°ÇºÎ ÄÄÆÄÀÏÀ» Çã¿ëÇÒ °ÍÀÌ´Ù.

 

´Ù¸¥ ½É¹úµéÀÌ ÄÄÆÄÀϽÃÀÇ Ç÷¡±×¿¡ µû¶ó Æ÷ÇԵǰųª, ºüÁú °ÍÀÌ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» ¾î

¶»°Ô ÇÏ´ÂÁö È®½ÅÇÏÁö ¸øÇÑ´Ù¸é, /usr/include/linux/config.hÀ» »ìÆ캸¶ó.

 

*. SMP --- ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½Ì. ÀÌ´Â Ä¿³ÎÀÌ ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½ÌÀ» Áö¿øÇÒ °æ¿ì

¿¡ Æ÷ÇԵǾîÁ®¾ß ÇÑ´Ù(´ÜÁö ÇϳªÀÇ CPU»ó¿¡¼­ ¼öÇàµÉÁö¶óµµ). ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½ÌÀ»

¿øÇÑ´Ù¸é, ´Ù¸¥ »çÇ×µéÀÌ ÇÊ¿äÇÏ´Ù(12ÀåÀ» »ìÆ캸¶ó).

 

*. CONFIG MODVERSIONS --- CONFIG MODVERSIONSÀÌ È°¼ºÈ­ÇÏ·Á¸é, Ä¿³ÎÀÇ ÄÄÆÄÀϽÿ¡

Á¤ÀÇÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¸ç, /usr/include/linux/modversions.hÀ» Æ÷ÇÔÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº

¶ÇÇÑ ÄÚµå Àڽſ¡ ÀÇÇØ ¿Ï·áµÇ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

 

Makefile

 

# ±âº»ÀûÀÎ Ä¿³Î ¸ðµâÀ» À§ÇÑ Makefile

CC=gcc

MODCFLAGS := -Wall -MODULE -D__KERNEL__ -D_LINUX

hello.o: hello.c /usr/include/linux/version.h

$(CC) $(MODCFLAGS) -c hello.c

echo insmod hello.o°¡ À̸¦ ½ÇÇàÇÑ´Ù.

echo rmmod hello°¡ À̸¦ Á¾·áÇÑ´Ù.

echo

echo X ¿Í Ä¿³Î ÇÁ·Î±×·¥À» È¥¿ëÇÏÁö ¸»¶ó.

echo insmod¿Í rmmod´Â XÀÇ ¹Û¿¡¼­ ½ÇÇàÇÑ´Ù.

 

ÀÚ, ÀÌÁ¦ ·çÆ®ÀÇ su±ÇÇÑÀ» ¾ò´Â Àϸ¸ ³²¾Ò´Ù

(·çÆ®ÀÇ ±ÇÇÑÀ¸·Î ÄÄÆÄÀÏÀ» ÇÏÁö´Â ¾Ê¾Ò³ª?)(*1)

°¢ÁÖ1 ************************************************************************

·çÆ®¿¡¼­ Á÷Á¢ ÄÄÆÄÀÏÇÏÁö ¾Ê´Â ÀÌÀ¯´Â Á»´õ ¾ÈÀüÇÏ°Ô ½Ã½ºÅÛÀ» °ü¸®ÇÏ°íÀÚ ÇÔÀÌ´Ù.

³ª´Â ¿À·§µ¿¾È º¸¾È°ü°èÀÇ ÀÏÀ» ÇßÀ¸¸ç, µû¶ó¼­ ¸Å¿ì ÆíÁý±¤ÀûÀÌ´Ù.

******************************************************************************

 

±×·¯¸é Á¶½É½º·´°Ô µÎ±Ù°Å¸®¸ç insmod hello¿Í rmmod hello¸¦ Çغ¸ÀÚ. À̸¦ ¼öÇàÇÏ´Â

µ¿¾È, /proc/modules¿¡ »õ·Î¿î Ä¿³Î ¸ðµâ¿¡ ´ëÇÑ ÁÖÀÇ°¡ ±â·ÏµÉ °ÍÀÌ´Ù. ÀÚ ±×·¯¸é,

¿Ö XÀÇ ¹Ù±ù¿¡¼­ insmod¸¦ ½ÇÇà½ÃÄÑ¾ß ÇÏ´Â °É±î? ÀÌ´Â Ä¿³ÎÀÌ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÒ ¶§ p-

rintk¸¦ ÀÌ¿ëÇϱ⠶§¹®ÀÌ´Ù. X¸¦ ÀÌ¿ëÇÏÁö ¾ÊÀ» ¶§, ÀÌ ¸Þ½ÃÁö´Â ´ç½ÅÀÌ ÀÌ¿ëÇÏ´Â °¡

»ó Å͹̳Î(ALT-F?¿¡ ÀÇÇØ ¼±ÅõÈ)¿¡ Ç¥½ÃµÇ¸ç, º¼ ¼ö ÀÖ°Ô µÈ´Ù. ¹Ý¸é¿¡, X¸¦ ÀÌ¿ëÇÏ

¸é, µÎ °¡ÁöÀÇ °¡´É¼ºÀÌ Á¸ÀçÇÑ´Ù. xterm -C·Î ÄܼÖÀ» ¿¬ °æ¿ì, ¿Ã¹Ù¸£°Ô ¸Þ½ÃÁö´Â Ç¥

½ÃµÉ °ÍÀÌ´Ù. ±×·¯Ä¡ ¾Ê¾Ò´Ù¸é, °¡»ó Å͹̳Π7·Î ¸Þ½ÃÁöÀÇ Ãâ·ÂÀÌ Àü´ÞµÈ´Ù -- X¿¡ ÀÇ

ÇØ ¿ÂÅë µÚµ¤ÀÎ.

¸¸¾à Ä¿³ÎÀÌ ºÒ¾ÈÁ¤ÇÏ´Ù¸é X¾øÀÌ µð¹ö±× ¸Þ½ÃÁö¸¦ ¾òÀ» ÇÊ¿ä°¡ ÀÖ´Ù. XÀÇ ¹Ù±ù¿¡¼­,

printk´Â Ä¿³Î¿¡¼­ ÄַܼΠÁ÷Á¢ ¸Þ½ÃÁö¸¦ Àü´ÞÇÑ´Ù. ¹Ý¸é¿¡, XÀÇ ¾È¿¡¼­´Â, printkÀÇ

¸Þ½ÃÁö´Â »ç¿ëÀÚ ÇÁ·Î¼¼½º(xterm -C)·Î Àü´ÞµÈ´Ù. CPU½Ã°£¿¡ ÀÌ ÇÁ·Î¼¼½º°¡ ¼ö½ÅµÇ¸é,

X¼­¹ö ÇÁ·Î¼¼½º¿¡ À̸¦ Àü´ÞÇÒ °ÍÀÌ´Ù. ±×·¡¼­, X¼­¹ö°¡ À̸¦ ¼ö½ÅÇϸé, ±×°ÍÀ» Ç¥½Ã

ÇÒ °ÍÀÌ´Ù --- ±×·¯³ª, ºÒ¾ÈÁ¤ÇÑ ½Ã½ºÅÛÀ¸·Î ÀÎÇØ Ä¿³ÎÀÌ ÀûÀýÇÏ°Ô ¼öÇàµÇÁö ¸øÇÏ´Â

°æ¿ì, ÇÑÂü µ¿¾ÈÀ̳ª Áö¿¬µÈ ¿À·ù ¸Þ½ÃÁö¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ¹«¾ùÀÌ Àß ¸ø µÇ¾ú´ÂÁö

¿À·£ ÈÄ¿¡¾ß ¾Ë°Ô µÇ´Â °ÍÀÌ´Ù.

 

1.2 Ä¿³Î ¸ðµâÀ» À§ÇÑ ´ÙÁß ÆÄÀÏ

 

¶§¶§·Î Ä¿³Î ¸ðµâÀ» ¿©·¯ °³ÀÇ ¼Ò½º ÆÄÀÏ·Î ³ª´­ °æ¿ì°¡ »ý±ä´Ù. ÀÌ·± °æ¿ì¿¡, ¾Æ·¡ÀÇ

°úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.

 

1. ¸ðµç ¼Ò½º ÆÄÀÏ ¾È¿¡¼­ ±×·¯³ª ÇϳªÀÎ, #define __NO_VERSION__À» »ðÀÔÇÑ´Ù. ÀÌ°Í

Àº module.h°¡ kernel_versionÀÇ Á¤ÀǸ¦ Æ÷ÇÔÇϱ⿡ Áß¿äÇϸç. ÄÄÆÄÀϵ¿¾È ¸ðµâÀÇ Ä¿

³Î ¹öÀü°ú ÇÔ²²ÇÏ´Â Àü¿ª º¯¼ö·Î¼­ Áß¿äÇÏ´Ù. __NO_VERSION__°ú ÇÔ²² module.h´Â ¼öÇà

µÇÁö ¾ÊÀ¸¹Ç·Î version.h°¡ ÇÊ¿äÇÏ´Ù¸é ÀÌ°ÍÀ» Æ÷ÇÔ½ÃŲ´Ù.

 

3. ¿ÀºêÁ§Æ® Äڵ带 ÇÕÇÑ´Ù. ÆÄÀϵéÀº Çϳª·Î µÈ´Ù.

x86ÇÏ¿¡¼­, ÀÌ´Â ld -m elf i386 -r -o <name of module>.o <1st source file>.o <sec

ond sourcefile>.o·Î ¼öÇàµÈ´Ù.

 

¿©±â¿¡ ÀÌ·¯ÇÑ Ä¿³Î ¸ðµâÀÇ ¿¹°¡ ÀÖ´Ù.

 

<start.c>

 

/*

* start.c

* Copyright (C) 1999 by Ori Pomerantz

*

* "Hello, world" - Ä¿³Î ¸ðµâ ¹öÀü.

* ÀÌ ÆÄÀÏÀº ´ÜÁö ½ÃÀÛ ·çƾ¸¸À» Æ÷ÇÔÇÑ´Ù.

*/

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* ¸ðµâÀÇ ÃʱâÈ­ */

int init_module()

{

printk("Hello, world - this is the kernel speaking\n");

 

/* 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏ Çϸé, init_module°¡ ½ÇÆÐÇßÀ½À» ³ªÅ¸³»°í Ä¿³Î ¸ðµâÀº

ÀûÀçµÇÁö ¾Ê´Â´Ù */

return 0;

}

 

<stop.c>

 

/*

* stop.c

* Copyright (C) 1999 by Ori Pomerantz

*

* "Hello, world" - Ä¿³Î ¸ðµâ ¹öÀü.

* ÀÌ ÆÄÀÏÀº ´ÜÁö Á¾·á ·çƾ¸¸À» Æ÷ÇÔÇÑ´Ù.

*/

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#define __NO_VERSION__ /* Ä¿³Î ¸ðµâÀÇ ÆÄÀÏÀÌ ¾Æ´Ï´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

#include <linux/version.h> /* __NO_VERSION__¶§¹®¿¡, module.h¿¡ ÀÇÇؼ­ Æ÷ÇÔµÇÁö

¾Ê¾Ò´Ù. */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â*/

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* Á¦°Å - init_moduleÀÌ ¹«¾ùÀ» Çß´ø °£¿¡ µÇµ¹¸°´Ù */

void cleanup_module()

{

printk("Short is the life of a kernel module\n");

}

 

<Makefile>

 

# ´ÙÁß Ä¿³Î ¸ðµâÀ» À§ÇÑ Makefile

CC=gcc

MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

hello.o: start.o stop.o

ld -m elf_i386 -r -o hello.o start.o stop.o

start.o: start.c /usr/include/linux/version.h

$(CC) $(MODCFLAGS) -c start.c

stop.o: stop.c /usr/include/linux/version.h

$(CC) $(MODCFLAGS) -c stop.c

 

 

Á¦ 2 Àå

 

¹®ÀÚ ÀåÄ¡ ÆÄÀϵé

 

ÀÚ, ÀÌÁ¦ ¿ì¸®´Â ´ë´ãÇÑ ÇÁ·Î±×·¡¸ÓµéÀÌ´Ù. ±×¸®°í ¾Æ¹«·± Àϵµ ÇÏÁö ¾Ê´Â Ä¿³Î ¸ðµâ

À» ¾î¶»°Ô ÀÛ¼ºÇÏ´Â Áö¸¦ ¾Ë°Ô µÇ¾ú´Ù. ¿ì¸®´Â Àڽſ¡ ÀںνÉÀ» ´À³¢°í ¸Ó¸®¸¦ °ð°Ô

Ãĵç´Ù. ±×·¯³ª, ¾î¾Áö ¹«¾ùÀΰ¡ ºü¶ß¸° ±âºÐÀÌ µç´Ù. ¸ðµâµéÀº »ç½Ç Àç¹ÌÀÖÁö´Â ¾Ê

´Ù.

 

Ä¿³Î ¸ðµâ°ú ÇÁ·Î¼¼½º°¡ Åë½ÅÇÏ´Â ¹æ¹ýÀº µÎ °¡Áö°¡ ÀÖ´Ù. Çϳª´Â ÀåÄ¡ ÆÄÀÏÀ» ÀÌ¿ë

ÇÏ´Â °ÍÀÌ°í, ´Ù¸¥ Çϳª´Â proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. Ä¿³ÎÀ» ÀÌ¿ëÇÏ´Â ÁÖ

µÈ ÀÌÀ¯°¡ Çϵå¿þ¾î ÀåÄ¡¸¦ Áö¿øÇϱâ À§Çؼ­À̱⿡, ÀåÄ¡ÆÄÀÏ°ú ÇÔ²² ³»¿ëÀ» ½ÃÀÛÇÒ

°ÍÀÌ´Ù. ÀåÄ¡ ÆÄÀÏÀÇ º»·¡ ¸ñÀûÀº Ä¿³Î ¾È¿¡¼­ ÇÁ·Î¼¼½ºµé°ú ÀåÄ¡ µå¶óÀ̹ö»çÀÌÀÇ Åë

½ÅÀ» Çã¶ôÇÏ´Â ÀÏÀÌ°í, ±×¸®°í ±×µéÀ» ÅëÇؼ­ ¹°¸®Àû ÀåÄ¡(¸ðµ©, Å͹̳Πµîµî)µé°úÀÇ

Åë½ÅÀÌ °¡´ÉÇØÁø´Ù.

 

ÀÌ·¯ÇÑ ¹æ¹ýÀÌ ¾Æ·¡¿¡ Àß ¼³¸íµÇ¾î ÀÖ´Ù.

 

°¢ ÀåÄ¡ µå¶óÀ̹ö´Â, ¾î¶² ÇüÅÂÀÇ Çϵå¿þ¾î¸¦ À§ÇØ ÀÀ´äÇÏ´Â, ÀÚ½ÅÀÇ ÁÖ ¹øÈ£¸¦ ÇÒ´ç

¹Þ´Â´Ù. ÀÌ µå¶óÀ̹öµéÀÇ ¸ñ·Ï°ú ÁÖ ¹øÈ£´Â /proc/devices¿¡ ³ªÅ¸³­´Ù. ÀåÄ¡ µå¶óÀ̹ö

¿¡ ÀÇÇØ °ü¸®µÇ´Â °¢ ¹°¸®Àû ÀåÄ¡µéÀº ºÎ ¹øÈ£¸¦ ÇÒ´ç¹Þ´Â´Ù. /dev µð·ºÅ丮´Â °¢°¢ÀÇ

ÀåÄ¡µéÀ» À§ÇÑ, ÀåÄ¡ ÆÄÀϷΠȣÃâµÉ, ±×°ÍÀÌ ½Ã½ºÅÛ »ó¿¡ ½ÇÁ¦·Î ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´õ

¶óµµ, Ưº°ÇÑ ÆÄÀϵéÀ» Æ÷ÇÔÇÑ´Ù.

¿¹¸¦ µé¸é, ls -l /dev/hd[ab]* ¼öÇàÇغ¸¸é, ½Ã½ºÅÛ¿¡ ¿¬°áµÈ ¸ðµç IDEÇÏµå µð½ºÅ©ÀÇ

ÆÄƼ¼ÇÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸ðµÎ°¡ µ¿ÀÏÇÑ ÁÖ ¹øÈ£ 3À» °¡Áö´Â °Í¿¡ ÁÖ¸ñÇ϶ó. ±×·¯

³ª, ºÎ ¹øÈ£´Â ´Ù¸¥ ÀåÄ¡ »ç¿ëÀÚµéÁß Çϳª·ÎºÎÅÍ º¯°æµÈ´Ù. ÀÌ°ÍÀº PC±¸Á¶¸¦ »ç¿ëÇÏ´Â

ÇÑ È®½ÇÇÏ´Ù. ´Ù¸¥ ±¸Á¶ÀÇ ½Ã½ºÅÛ¿¡¼­ ¸®´ª½º»óÀÇ ÀåÄ¡¿¡ ´ëÇؼ­´Â Àß ¸ð¸£°Ú´Ù. ½Ã½º

ÅÛÀÌ ¼³Ä¡µÇ¾úÀ» ¶§, ÀåÄ¡ ÆÄÀÏ ÀüºÎ°¡ mknod¸í·É¿¡ ÀÇÇØ ¸¸µé¾îÁø´Ù. ±×µéÀÌ /dev µð

·ºÅ丮¿¡ À§Ä¡ÇÏ´Â ±â¼úÀûÀÎ ÀÌÀ¯´Â ¾ø´Ù. ½ÇÇèÀ» À§Çؼ­ ÀåÄ¡ ÆÄÀÏÀ» ¸¸µé ¶§, ¿©±â

ÀÇ ¿¹Á¦¿¡¼­Ã³·³, Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏ ÇÏ´Â °÷ÀÇ µð·ºÅ丮 ¾È¿¡ ±×°ÍÀ» À§Ä¡½ÃÄѵµ Àü

Çô ¹®Á¦µÇÁö ¾Ê´Â´Ù.

 

ÀåÄ¡µéÀº Å©°Ô µÎ °¡Áö ÇüÅ·Π³ª´­ ¼ö ÀÖ´Ù: ¹®ÀÚ ÀåÄ¡¿Í ºí·Ï ÀåÄ¡. ÀÌ µÑÀÇ Â÷ÀÌ´Â

ºí·Ï ÀåÄ¡°¡ µ¥ÀÌÅÍÀÇ ¿äûÀ» À§ÇÑ ¹öÆÛ¸¦ °¡Áö¸ç, ±×·¡¼­, ÀÀ´äµÈ ¼ø¼­µÇ·Î ¼±ÅõȴÙ

´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº µ¥ÀÌÅÍ ÀúÀå ÀåÄ¡¿¡¼­, º¸´Ù ¸Ö¸® ¶³¾îÁ® ÀÖ´Â °Íµéº¸´Ù, ¼­·Î °¡

±îÀÌ ÀÖ´Â °Íµé¿¡¼­ Á»´õ ºü¸£°Ô ¼½Å͸¦ ¾²°Å³ª Àд ¸é¿¡¼­ Áß¿äÇÏ´Ù. ´Ù¸¥ Â÷ÀÌ´Â

ºí·Ï ÀåÄ¡°¡ ´ÜÁö ÀԷ¸¸À» ¹Þ¾ÆµéÀÌ°í ºí·ÏµéÀÇ Ãâ·ÂÀ» ¸®ÅÏ ÇÏ´Â(Å©±â´Â ÀåÄ¡¿¡ ÀÇ

Á¸ÀûÀÌ´Ù), ¹Ý¸é¿¡ ¹®ÀÚ ÀåÄ¡´Â ±×³É ¸¹°Å³ª ¶Ç´Â ÀûÀº ¼öÀÇ ¹öÆÛÀÇ À̿븸ÀÌ °¡´ÉÇÏ

´Ù. ´ëºÎºÐÀÇ ÀåÄ¡µéÀº ¹öÆÛ¸µ ÇüŸ¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¹®ÀÚ ÀåÄ¡ÀÌ°í, °íÁ¤

µÈ ºí·Ï Å©±â·Î¼­ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ls -lÀÇ Ãâ·ÂÀÇ Ã¹ ¹ø° ¹®ÀÚ¸¦ È®ÀÎÇÔÀ¸·Î¼­ Àå

Ä¡ ÆÄÀÏÀÌ ¹®ÀÚ ÀåÄ¡ÀÎÁö ºí·Ï ÀåÄ¡ÀÎÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. 'b'¶ó¸é ºí·ÏÀåÄ¡À̸ç, 'c'¶ó

¸é ¹®ÀÚ ÀåÄ¡ÀÌ´Ù. ¸ðµâÀº µÎ ºÎºÐÀ¸·Î ³ª´¶´Ù: ¸ðµâÀ» µî·ÏÇÏ´Â ºÎºÐ°ú ÀåÄ¡µå¶óÀ̹ö

ÀÇ ºÎºÐ. init_moduleÇÔ¼ö°¡ module_register_chrdev¸¦ È£ÃâÇÏ¿© Ä¿³ÎÀÇ ÀåÄ¡ Å×À̺í

¿¡ ÀåÄ¡ µå¶óÀ̹ö¸¦ µî·ÏÇÑ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ ÀåÄ¡¸¦ À§ÇÑ ÁÖ ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù. claenu-

p_module ÇÔ¼ö°¡ ÀåÄ¡ÀÇ ÇØÁ¦¸¦ ÇÑ´Ù. ÀÌ·¯ÇÑ(ÀåÄ¡ÀÇ µî·Ï°ú ÇØÁ¦)°ÍÀÌ ÀÌµé µÎ ÇÔ¼ö

µéÀÇ ÀϹÝÀûÀÎ ±â´ÉÀÌ´Ù. ¸ðµâÀº Ä¿³ÎÀÇ ³»ºÎ¿¡¼­ ÀÚ½ÅÀ» ÃʱâÈ­ÇÏÁö ¾ÊÀ¸¸ç, ÇÁ·Î¼¼

½ºÃ³·³, ±×·¯³ª È£ÃâµÇ¾îÁö¸é, ½Ã½ºÅÛ È£ÃâÀ» °æÀ¯ÇÏ¿© ÇÁ·Î¼¼½º¿¡ ÀÇÇØ, ¶Ç´Â ÀÎÅÍ·´

Æ®¸¦ °æÀ¯ÇÏ¿© Çϵå¿þ¾î ÀåÄ¡¿¡ ÀÇÇØ, ¶Ç´Â Ä¿³ÎÀÇ ´Ù¸¥ ºÎºÐ¿¡ ÀÇÇØ(´Ü¼øÈ÷ ÁöÁ¤µÈ

ÇÔ¼öÀÇ È£Ãâ¿¡ ÀÇÇØ), ¹Ù·Î ÃʱâÈ­µÇ¾î »ç¿ëµÈ´Ù. °á·ÐÀ» ¸»ÇÏÀÚ¸é ¸ðµâÀº, Ä¿³Î¿¡ ÄÚ

µå¸¦ Ãß°¡Çϸé, ¾î¶² ÇüÅÂÀÇ »ç°ÇÀ» À§ÇÑ Ã³¸®±â·Î¼­ µ¿ÀÛµÉ ¼ö ÀÖÀ¸¸ç ±×°ÍÀ» Á¦°ÅÇÏ

¸é ÇØÁ¦µÉ °ÍÀÌ´Ù.

¿ªÁÖ **************************************************************************

¿©±â¼­´Â ºí·Ï ÀåÄ¡¿Í ¹®ÀÚ ÀåÄ¡ÀÇ Àǹ̰¡ ²Ï ¾î·Æ°Ô ¼³¸íµÇÀÖ´Ù. ÀϹÝÀûÀ¸·Î ºí·Ï Àå

Ä¡´Â ºí·ÏÀ̶ó ºÒ¸®´Â ÀÏÁ¤ Å©±âÀÇ ¹öÆÛ(512, 1K Bytesµî, ÀåÄ¡ ÀÇÁ¸Àû)´ÜÀ§·Î µ¥ÀÌÅÍ

ÀÇ Àб⠾²±â°¡ ÇàÇØÁø´Ù. ¹Ý¸é¿¡, ¹®ÀÚ ÀåÄ¡´Â Çϳª(ÀÌ·± °æ¿ì´Â °ÅÀÇ ¾øÁö¸¸ °¡´ÉÀº

ÇÏ´Ù), ȤÀº ¼ö½Ê ³»Áö ¼ö¹é °³ÀÇ °¡º¯ Å©±âÀÇ ¹öÆÛ(ºñ·Ï ÀÌ Å©±â°¡ °íÁ¤µÇ¾î ÀÖÀ»Áö

¶óµµ ÀÌ´Â ¹Ù²Ü ¼ö ÀÖ´Ù)¸¦ °¡Áø´Ù.

ºí·ÏÀåÄ¡ÀÇ ¿¹´Â Çϵåµð½ºÅ©, CDROMÀåÄ¡, Ç÷ÎÇÇ µð½ºÅ©µî ÁÖ·Î ´ë¿ë·®ÀÇ µ¥ÀÌÅ͸¦

´Ù·ç´Â ÀåÄ¡µéÀ̸ç, ¹®ÀÚ ÀåÄ¡´Â Á÷·Ä Åë½Å Æ÷Æ®, ¸ðµ© µîÀÌ´Ù.

*******************************************************************************

 

ÀåÄ¡ µå¶óÀ̹ö´Â 4°³ÀÇ device_<action>ÇÔ¼ö·Î¼­ ÀÌ·ç¾îÁö¸ç, ÀåÄ¡ ÆÄÀÏÀÇ ÁÖ ¹øÈ£¿Í

ÇÔ²² ´©±º°¡°¡ ¾î¶² ÀÛ¾÷À» ÇÏ·Á°í ÇÒ ¶§ È£ÃâµÈ´Ù. Ä¿³ÎÀÌ ±×µéÀÌ È£ÃâµÈ °ÍÀ» ¾Æ´Â

¹æ¹ýÀº ÀåÄ¡°¡ µî·ÏµÉ ¶§ ÁÖ¾îÁö´Â, À̵é 4°³ÀÇ ÇÔ¼ö¸¦ Æ÷ÇÔÇÑ, file_operations ±¸Á¶

ü, Fops, ¸¦ °æÀ¯Çؼ­ÀÌ´Ù. ¿©±â¼­ ±â¾ïÇؾßÇÒ ¶Ç ´Ù¸¥ Á¡Àº ·çÆ®°¡ ÇÏ´Â °Íó·³ ¿ì

¸®°¡(·çÆ®°¡ ¾Æ´Ñ)Ä¿³Î ¸ðµâÀ» ÇØÁ¦(rmmoded)ÇÏ´Â °ÍÀº Çã°¡µÇÁö ¾Ê´Â´Ù. ÀåÄ¡°¡ ÇÁ·Î

¼¼½º¿¡ÀÇÇØ ¿­¸®°í Ä¿³Î ¸ðµâÀ» Á¦°ÅÇϸé, ÀûÁ¤ÇÑ ÇÔ¼öµé (read/write)ÀÌ ÀÌ¿ëµÇ´Â °÷

ÀÇ ¸Þ¸ð¸® È£ÃâÀ» ÀÏÀ¸Å°°Ô µÈ´Ù. ÁÁÀº °æ¿ì¿¡´Â ¾Æ¹«·± Äڵ尡 ÀûÀçµÇÁö ¾Ê°í, ¾à°£

ÀÇ ÁöÀúºÐÇÑ ¿À·ù ¸Þ¼¼Áö¸¸À» º¸°Ô µÇÁö¸¸, ÃÖ¾ÇÀÇ °æ¿ì ´Ù¸¥ Ä¿³Î ¸ðµâÀÌ µ¿ÀÏÇÑ Àå

¼Ò¸¦ ÀÌ¿ëÇϰԵȴÙ. ÀÌ·¯ÇÑ °á°ú´Â ÀüÇô ¿¹ÃøÇÒ ¼ö ¾ø°Ô µÈ´Ù.

º¸Åë, ¹«¾ð°¡¸¦ Çã°¡ÇÏ°í ½ÍÁö ¾ÊÀº °æ¿ì¶ó¸é, ÇÔ¼ö°¡ ÀÛ¾÷À» ¼öÇàÇÏ´Â °÷¿¡¼­ ¿À·ù

ÄÚµå(À½¼ö)¸¦ ¸®ÅÏ ÇÑ´Ù. cleanup_module¿Í ÇÔ²²¶ó¸é ÀÌ°ÍÀÌ voidÇÔ¼öÀ̱⿡ °¡´ÉÇÏ´Ù

. cleanup_module È£ÃâµÇÀÚ¸¶ÀÚ, ÀÌ ¸ðµâÀº Á¾·áµÈ´Ù. ±×·¯³ª, Ä«¿îÅÍ-¾ó¸¶³ª ¸¹Àº Ä¿

³Î ¸ðµâµéÀÌ ÀÌ Ä¿³Î ¸ðµâÀ» ÀÌ¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ-´Â ÂüÁ¶ Ä«¿îÅÍ.(/proc/modules ¸¶Áö

¸· ÁÙÀÇ)·Î È£ÃâµÈ´Ù. 0ÀÌ ¾Æ´Ï¶ó¸é, rmmod´Â ½ÇÆÐÇÑ °ÍÀÌ´Ù. ÀÌ ¸ðµâÀÇ ÂüÁ¶ Ä«¿îÅÍ

´Â mod_use_countÀÇ º¯¼ö¾È¿¡¼­ À¯¿ëÇÏ´Ù. ÀÌ º¯¼ö(MOD_INC_USE_COUNT, MOD_DEC_USE_-

COUNT)ÀÇ Ã³¸®¸¦ À§ÇØ ¸ÅÅ©·Î°¡ Á¤ÀǵǾî ÀÖÀ¸¸ç, mod_use_count¸¦ Á÷Á¢ ÀÌ¿ëÇÏ´Â °Í

º¸´Ù´Â À̵éÀ» ÂüÁ¶ÇÏ´Â °ÍÀÌ ÇâÈÄÀÇ ±â´É º¯°æ¿¡ ´ëºñÇÒ ¼ö ÀÖ´Ù.

 

<chardev.c>

/*

* chardev.c

* Copyright (C) 1998?999 by Ori Pomerantz

*

* ¹®ÀÚ ÀåÄ¡ ¸¸µé±â(Àбâ Àü¿ë)

*/

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* ¹®ÀÚ ÀåÄ¡¸¦ À§ÇØ */

#include <linux/fs.h> /* ¹®ÀÚ ÀåÄ¡ Á¤ÀǵéÀ» ¿©±â¿¡ */

#include <linux/wrapper.h> /* ÇöÀç´Â ¾Æ¹«·± Àϵµ ÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ÇâÈÄÀÇ

ȣȯ¼ºÀ» À§ÇØ */

 

/* 2.2.3 /usr/include/linux/version.hÀ» À§ÇØ Æ÷ÇÔÇÑ´Ù. ±×·¯³ª, 2.0.35¿¡¼­´Â

ÇÊ¿äÇÏÁö ¾Ê´Ù. ÇÊ¿äÇÏ´Ù¸é Ãß°¡ÇÑ´Ù. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

/* Á¶°ÇºÎ ÄÄÆÄÀÏ, LINUX_VERSION_CODE°¡ ÇöÀç ¹öÀüÀÇ ÄÚµåÀÌ´Ù */

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

#include <asm/uaccess.h> /* for put_user */

#endif

 

#define SUCCESS 0

/* ÀåÄ¡ ¼±¾ðÀÚ **************************** */

/* ÀÌ ÀåÄ¡¸¦ À§ÇÑ À̸§, /proc/devices¿¡ ³ªÅ¸³¯ °ÍÀÌ´Ù */

#define DEVICE_NAME "char_dev"

/* ÀÌ ÀåÄ¡·ÎºÎÅÍÀÇ ÃÖ´ë ¸Þ½ÃÁö Å©±â */

#define BUF_LEN 80

 

/* ÀÌ ÀåÄ¡¸¦ Áö±Ý ¿­ °ÍÀΰ¡? µ¿ÀÏ ÀåÄ¡¿¡ÀÇ µ¿½Ã Á¢±ÙÀ» ¹æÁöÇϱâ À§ÇØ ÀÌ¿ëµÈ´Ù */

static int Device_Open = 0;

 

/* ¿äûÇÒ ¶§ ÁÖ¾îÁú µð¹ÙÀ̽º ¸Þ½ÃÁö */

static char Message[BUF_LEN];

 

/* ÇÁ·Î¼¼½º°¡ ¾ó¸¶³ª ¸¹Àº ¸Þ½ÃÁö¸¦ ¾ò¾ú´Â°¡? ¾ò°íÀÚ ÇÏ´Â /device_readÀÇ ¹öÆÛ Å©

±âº¸´Ù ¸Þ½ÃÁö°¡ Ŭ °æ¿ì À¯¿ëÇÏ´Ù */

static char *Message_Ptr;

 

/* ÀÌ ÇÔ¼ö´Â ÀåÄ¡ ÆÄÀÏÀ» ¿­·Á°í ½ÃµµÇÏ´Â ¾î´À ¶§³ª È£ÃâµÇ¾î Áø´Ù */

static int device_open(struct inode *inode,

struct file *file)

{

static int counter = 0;

 

#ifdef DEBUG

printk ("device_open(%p,%p)\n", inode, file);

#endif

 

/* ÇϳªÀÇ ¹°¸®Àû ÀåÄ¡º¸´Ù ¸¹Àº ÀåÄ¡¸¦ ¾ò¾î¾ß ÇÏ´Â °æ¿ì¿¡ ºÎ ÀåÄ¡ ¹øÈ£¸¦ ¾ò´Â

¹æ¹ýÀ» º¸ÀδÙ*/

printk("Device: %d.%d\n", inode->i_rdev >> 8, inode->i_rdev & 0xFF);

 

/* µ¿½Ã¿¡ µÎ ÇÁ·Î¼¼½ºÀÇ Åë½ÅÀ» ¿øÇÏÁö ¾Ê´Â´Ù¸é.*/

if (Device_Open) return -EBUSY;

 

/*

ÀÌ°ÍÀÌ ÇϳªÀÇ ÇÁ·Î¼¼½º¶ó¸é, ¿©±â¿¡¼­ Á»´õ Á¶½É½º·´°Ô Á¢±ÙÇØ¾ß ÇÑ´Ù.

 

ÇÁ·Î¼¼½ºµéÀÇ °æ¿ì¿¡¼­, À§ÇèÀº ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ Device_OpenÀ» °Ë»öÇÏ°í, ´Ù¸¥

ÇÁ·Î¼¼½º°¡ ½ºÄÉÁÙ·¯¿¡ ÀÇÇØ ÀÌ ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¶§ÀÌ´Ù. óÀ½ÀÇ ÇÁ·Î¼¼½º°¡ CPU»ó

¿¡¼­ µ¹¾Æ°¥ ¶§, ÇÁ·Î¼¼½º´Â ÀÌ ÀåÄ¡´Â ¾ÆÁ÷ ¿­¸®Áö ¾Ê¾Ò´Ù°í È®½ÅÇÑ´Ù.

 

±×·¯³ª, ¸®´ª½º´Â ÇÁ·Î¼¼½º°¡ Ä¿³Î ÄÁÅؽºÆ®¾È¿¡¼­ ¼öÇàµÇ´Â µ¿¾È ´ëÄ¡µÇÁö ¾Êµµ

·Ï ÇÑ´Ù.

 

SMPÀÇ °æ¿ì¿¡, ´Ù¸¥ CPU°¡ Á¡À¯ÇÏ´Â µ¿¾È °Ë»ö °úÁ¤ÀÇ ÈÄ¿¡ ¹Ù·Î Device_OpenÀ»

Áõ°¡½Ãų °ÍÀÌ´Ù. ±×·¯³ª, 2.0¹öÀüÀÇ Ä¿³Î¿¡¼­´Â µ¿½Ã¿¡ Ä¿³Î ¸ðµâÀº ´ÜÁö ÇϳªÀÇ

CPU¿¡ ÀÇÇØ Á¡À¯µÇ±â¿¡ ¹®Á¦µÇÁö ¾Ê´Â´Ù. ¼º´É»óÀÇ ÀúÇÏ ¶§¹®¿¡ 2.2¹öÀü¿¡¼­ ÀÌ°Í

Àº º¯°æµÇ¾î Á³´Ù, ºÒÇàÈ÷µµ, SMP¿Í ÇÔ²² ÀÌ·¯ÇÑ ÀÛ¾÷ÀÌ ¾î¶»°Ô SMP±â°è¿¡¼­ ¼öÇà

µÇ´ÂÁö È®ÀÎÇغ¸Áö ¸øÇß´Ù.

*/

 

Device_Open++;

 

/* ¸Þ½ÃÁöÀÇ ÃʱâÈ­ */

sprintf(Message, "If I told you once, I told you %d times ?%s", counter++,

"Hello, world\n");

 

/*

¿©±â¿¡¼­ sprintf¸¦ ¾µ ¼ö ÀÖ°Ô Çã°¡µÇ´Â ÀÌÀ¯´Â ¸Þ½ÃÁöÀÇ ÃÖ´ë ±æÀÌ°¡ BUF_LEN

º¸´Ù Àû±â ¶§¹®ÀÌ´Ù. Ưº°È÷ Ä¿³ÎÀÇ °æ¿ì¿¡ ÀÖ¾î ¹öÆÛ ¿À¹öÇ÷ο찡 ÀϾÁö ¾Ê

µµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù

*/

 

Message_Ptr = Message;

 

/*

ÆÄÀÏÀÌ »ç¿ë Ä«¿îÅ͸¦ Áõ°¡½ÃÅ°´Â °Í¿¡ ÀÇÇØ ¿­·Á ÀÖ´Â µ¿¾È ¸ðµâÀº Á¦°ÅµÇÁö ¾Ê

´Â´Ù(¸ðµâ¿¡¼­ ÂüÁ¶µÇ¾îÁø ¼öµé, ¸¸¾à rmmod¿¡¼­ 0ÀÌ ¾Æ´Ï¸é rmmod´Â ¿Ã¹Ù¸£°Ô ¼ö

ÇàµÇÁö ¸øÇÑ´Ù.

*/

 

MOD_INC_USE_COUNT;

return SUCCESS;

}

 

/* ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ ÀåÄ¡ ÆÄÀÏÀ» Á¾·áÇÒ ¶§ È£ÃâµÈ´Ù. ¹öÀü 2.0.x¿¡¼­ °á°ú °ªÀ»

°¡ÁöÁö ¾Ê±â ¶§¹®¿¡ Ç×»ó Á¾·áµÈ´Ù. ¹öÀü 2,2,x¿¡¼­´Â Á¾·á ½ÇÆнà °á°ú¸¦ µÇµ¹¸°´Ù

- ±×·¯³ª ÀÌ°ÍÀ» ³²°Ü µÑ ÇÊ¿ä´Â ¾ø´Ù */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static int device_release(struct inode *inode, struct file *file)

#else

static void device_release(struct inode *inode, struct file *file)

#endif

{

#ifdef DEBUG

printk("device_release(%p,%p)\n", inode, file);

#endif

 

/* ´ÙÀ½ È£ÃâÀÚÀ» À§ÇÑ ´ë±â */

Device_Open--;

 

/*

»ç¿ëÄ«¿îÅÍÀÇ Áõ°¡, ´Ù½Ã ¸»Çϸé ÆÄÀÏÀ» ¿¬ Ƚ¼ö, °áÄÚ ÀÌ ¸ðµâÀ» Á¦°ÅÇÏÁö ¸»¶ó.

*/

MOD_DEC_USE_COUNT;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return 0;

#endif

}

 

/* ÀÌ ÇÔ¼ö´Â ÀÌ¹Ì ¿­·ÁÁø ÀåÄ¡ ÆÄÀÏ¿¡¼­ ÀÐÀ¸·Á ÇÒ ¶§ ¾ðÁ¦³ª È£ÃâµÈ´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_read(struct file *file,

char *buffer, /* µ¥ÀÌÅ͸¦ ä¿ï ¹öÆÛ */

size_t length, /* ¹öÆÛÀÇ ±æÀÌ */

loff_t *offset) /* ÆÄÀÏ¿¡¼­ÀÇ »ó´ëÀ§Ä¡ */

#else

static int device_read(struct inode *inode,

struct file *file,

char *buffer, /* µ¥ÀÌÅ͸¦ ä¿ï ¹öÆÛ */

int length) /* ¹öÆÛÀÇ ±æÀÌ(ÀÌ°ÍÀ» ÃÊ°úÇؼ­ ¾²Áö ¸»¶ó!) */

#endif

{

/* ½ÇÁ¦ ¹öÆÛ¿¡ ¾²¿©Áø µ¥ÀÌÅÍÀÇ °³¼ö */

int bytes_read = 0;

 

/* ¸Þ½ÃÁöÀÇ ³¡À̶ó¸é, 0À» ¸®ÅÏ ÇÑ´Ù(ÆÄÀÏÀÇ ³¡À» ³ªÅ¸³½´Ù) */

if (*Message_Ptr == 0) return 0;

 

/* ½ÇÁ¦·Î ¹öÆÛ ¾È¿¡ ¾²¿©Áø µ¥ÀÌÅÍ */

while (length && *Message_Ptr)

{

/*

¹öÆÛ´Â Ä¿³Î µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®°¡ ¾Æ´Ñ »ç¿ë µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ ³»¿¡ Àֱ⠶§¹®

¿¡ ÀÛ¾÷¿¡ ÇÒ´çµÇÁö ¾Ê´Â´Ù. ´ë½Å¿¡, put_user¸¦ ÀÌ¿ëÇؼ­ Ä¿³Î µ¥ÀÌÅÍ ¼¼±×

¸ÕÆ®¿¡¼­ »ç¿ëÀÚ µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®·Î º¹»çÇؾ߸¸ ÇÑ´Ù.

*/

put_user(*(Message_Ptr++), buffer++);

length--;

bytes_read ++;

}

 

#ifdef DEBUG

printk ("Read %d bytes, %d left\n", bytes_read, length);

#endif

 

/* Àбâ ÇÔ¼öµéÀº ¹öÆÛ¿¡ ½ÇÁ¦·Î ¾²¿©Áø °³¼ö¸¦ ¸®ÅÏ ÇÑ´Ù. */

return bytes_read;

}

 

/* ÀÌ ÇÔ¼ö´Â ´©±º°¡ ÀåÄ¡ ÆÄÀÏ¿¡ ¾²±â¸¦ ½ÃµµÇÒ ¶§ È£ÃâµÈ´Ù - ÀÌ ¿¹Á¦ ¾È¿¡¼­´Â Áö

¿øµÇÁö ¾ÊÀ½ */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_write(struct file *file,

const char *buffer, /* ¹öÆÛ */

size_t length, /* ¹öÆÛÀÇ ±æÀÌ */

loff_t *offset) /* ÆÄÀÏ¿¡¼­ÀÇ »ó´ë À§Ä¡ */

#else

static int device_write(struct inode *inode,

struct file *file,

const char *buffer,

int length)

#endif

{

return -EINVAL;

}

 

/* ¸ðµâ ¼±¾ð */

/* ÀåÄ¡¸¦ À§ÇÑ ÁÖ ÀåÄ¡ ¹øÈ£. ÀÌ°ÍÀº µî·Ï, ÇØÁ¦½Ã ¸ðµÎ¿¡¼­ »ç¿ëµÇ±â¿¡ Àü¿ª º¯¼ö

(¹°·Ð, Á¤Àû, ÀÌ ¾È¿¡¼­ ÄÁÅؽºÆ®´Â ÀÌ ÆÄÀÏ ³»¿¡¼­ Àü¿ª)ÀÌ´Ù. */

static int Major;

 

/* ÀÌ ±¸Á¶Ã¼´Â ÇÁ·Î¼¼½º°¡ ¸¸µç ÀåÄ¡¿¡¼­ ¹«¾ùÀΰ¡ ÇÏ·Á°í ÇÒ ¶§ ÇÔ¼öµéÀ» À¯ÁöÇϱâ

À§ÇØ È£ÃâµÈ´Ù. ÀÌ ±¸Á¶Ã¼¿¡¼­ÀÇ Æ÷ÀÎÅÍ´Â ÀåÄ¡ Å×ÀÌºí¿¡ À¯ÁöµÇ°í, init_module

¿¡¼­ Áö¿ª º¯¼ö·Î »ç¿ëµÇÁö ¾Ê´Â´Ù. NULLÀº ¾ÆÁ÷ ±â´ÉÀÌ Á¤ÀǵÇÁø ¾ÊÀº ÇÔ¼öµéÀº

À§ÇÑ °ÍÀÌ´Ù. */

struct file_operations Fops =

{

NULL, /* ªO±â */

device_read,

device_write,

NULL, /* µð·ºÅ丮 Àбâ */

NULL, /* ¼±Åà */

NULL, /* ÀÔÃâ·Â Á¦¾î */

NULL, /* ¸Þ¸ð¸® ¸Ê */

device_open,

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

NULL, /* ¹öÆÛ ºñ¿ì±â*/

#endif

device_release /* ÇØÁ¦ */

};

 

/* ¸ðµâÀÇ ÃʱâÈ­ - ¹®ÀÚ ÀåÄ¡ÀÇ µî·Ï */

int init_module()

{

/* ¹®ÀÚ ÀåÄ¡ÀÇ µî·Ï(Àû¾îµµ ½Ãµµ Á¤µµ´Â) */

Major = module_register_chrdev(0, DEVICE_NAME, &Fops);

 

/* À½ÀÇ °ªÀº ¿À·ù¸¦ ³ªÅ¸³½´Ù. */

if (Major < 0)

{

printk ("%s device failed with %d\n",

"Sorry, registering the character",

Major);

return Major;

}

 

printk ("%s The major device number is %d.\n",

"Registeration is a success.",

Major);

printk ("If you want to talk to the device driver,\n");

printk ("you'll have to create a device file. \n");

printk ("We suggest you use:\n");

printk ("mknod <name> c %d <minor>\n", Major);

printk ("You can try different minor numbers %s",

"and see what happens.\n");

 

return 0;

}

 

/* Á¦°Å - /proc·Î ºÎÅÍ °ü°èµÈ ÆÄÀÏÀ» ÇØÁ¦ÇÑ´Ù.*/

void cleanup_module()

{

int ret;

 

/* ÀåÄ¡ÀÇ ÇØÁ¦ */

ret = module_unregister_chrdev(Major, DEVICE_NAME);

 

/* ¿À·ù°¡ »ý±â¸é, º¸°íÇÑ´Ù. */

if (ret < 0) printk("Error in unregister_chrdev: %d\n", ret);

}

 

2.1 ´ÙÁß Ä¿³Î ¹öÀü ¼Ò½º ÆÄÀÏ

 

½Ã½ºÅÛ È£ÃâÀº, ÇÁ·Î¼¼½º¿¡¼­ Ä¿³Î°úÀÇ ÁÖµÈ Á¢¼Ó¼ö´ÜÀÎ, ÀϹÝÀûÀ¸·Î ¹öÀü¿¡ ¹«°üÇÏ°Ô

À¯ÁöµÈ´Ù. »õ·Î¿î ½Ã½ºÅÛ È£ÃâÀÌ Ãß°¡µÉÁö¶óµµ, º¸ÅëÀº ÀÌÀüÀÇ °Í°ú µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ

´Ù. ÀÌ°ÍÀº ÇÏÀ§ ȣȯ¼ºÀ» À§ÇØ ÇÊ¿äÇÏ´Ù --- »õ·Î¿î Ä¿³Î ¹öÀüÀÌ Á¤±Ô ÇÁ·Î¼¼½º¸¦ ¼Õ

»ó½ÃÅ°Áö ¾Ê°Ô ÇÑ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡¼­, ÀåÄ¡ ÆÄÀϵéÀº ¿©ÀüÈ÷ µ¿ÀÏÇÏ°Ô À¯ÁöµÈ´Ù.

¹Ý¸é¿¡, Ä¿³Î ¾ÈÀÇ ³»ºÎ ÀÎÅÍÆäÀ̽ºµé°ú ±â´ÉÀº ¹öÀü¿¡ µû¶ó º¯°æµÈ´Ù.

¸®´ª½ºÀÇ Ä¿³Î ¹öÀüµéÀº ¾ÈÁ¤ ¹öÀü(¦¼ö ¹øÈ£ÀÇ)°ú °³¹ß ¹öÀü(Ȧ¼ö ¹öÀüÀÇ)À¸·Î ³ª´©

¾îÁø´Ù. °³¹ß ¹öÀüÀº »õ·Î¿î ¸ðµç ¾ÆÀ̵ð¾î¸¦ Æ÷ÇÔÇÏ°í, °í·ÁÇؾßÇÒ ½Ç¼öµéÀ» Æ÷ÇÔÇÏ

¿© Àç ÀÛ¼ºµÈ´Ù. °á°úÀûÀ¸·Î, ÀÌµé ¹öÀüµé¿¡¼­ µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ ±â´ëÇÒ ¼ö ¾ø°ÔµÈ

´Ù(ÀÌ°ÍÀÌ ÀÌ Ã¥¿¡¼­ ÀÌÀÇ Áö¿øÀ» ²¨¸®´Â ÀÌÀ¯À̸ç, ¶ÇÇÑ ÀÌ°ÍÀº ³Ê¹« ¸¹Àº ÀÛ¾÷°ú ³Ê

¹« ºü¸¥ º¯°æÀ» °¡Áø´Ù). ¹Ý¸é¿¡, ¾ÈÁ¤ ¹öÀü¿¡¼­´Â, ¸¹Àº ¹ö±× ¼öÁ¤ ¹öÀü¿¡µµ ºÒ±¸ÇÏ

°í ¿©ÀüÈ÷ µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ ±â´ëÇÒ ¼ö ÀÖ´Ù.

ÀÌ °¡À̵åÀÇ ³»¿ëÀº ¹öÀü 2.0.x¿Í 2.2,xÀÇ Ä¿³ÎÀ» µÑ ´Ù Æ÷ÇÔÇÑ´Ù. ÀÌ µÑ »çÀÌÀÇ Â÷ÀÌ

Á¡À¸·Î ÀÎÇØ, Ä¿³Î ¹öÀü¿¡ ÀÇÁ¸ÀûÀÎ ÄÄÆÄÀÏ Á¶°ÇÀ» ¿ä±¸µÈ´Ù. ÀÌ·¯ÇÑ ÀÏ¿¡ ¸ÅÅ©·Î LI-

NUX_VERSION_CODE°¡ ÀÌ¿ëµÈ´Ù. Ä¿³Î ¹öÀüÀÇ a.b.c¿¡ ´ëÇÑ, ÀÌ ¸ÅÅ©·ÎÀÇ °ªÀº 2^16a+2^

8b+c°¡ µÉ °ÍÀÌ´Ù. ÁöÁ¤µÈ Ä¿³Î ¹öÀüÀÇ °ªÀ» ¾ò±â À§ÇØ, KERNEL_VERSION ¸ÅÅ©·Î¸¦ ÀÌ

¿ëÇÑ´Ù. 2.0.35¿¡¼­´Â Á¤ÀǵÇÁö ¾Ê¾ÒÀ¸¹Ç·Î, ÇÊ¿äÇÑ °æ¿ì À̸¦ Á¤ÀÇÇÑ´Ù.

 

Á¦ 3 Àå

 

/proc ÆÄÀÏ ½Ã½ºÅÛ

 

¸®´ª½º¿¡¼­ Ä¿³Î ¸ðµâÀ» À§ÇÑ ÇÁ·Î¼¼½ºµé¿¡ Á¤º¸¸¦ Àü´ÞÇÏ´Â Ãß°¡ÀûÀÎ ¹æ¹ýÀÌ ÀÖ´Ù--

/proc ÆÄÀÏ ½Ã½ºÅÛ. ¿ø·¡´Â ÇÁ·Î¼¼½ºµé¿¡ ´ëÇÑ Á¤º¸¸¦ ½±°Ô ÀνÄÇϱâ À§ÇØ ¼³°èµÇ¾úÁö

¸¸, Áö±ÝÀº ¸ðµç Ä¿³Î¿¡¼­, ¸ðµâÀÇ ¸ñ·ÏÀ» Ç¥½ÃÇÏ´Â /proc/modules, ¸Þ¸ð¸®ÀÇ ÀÌ¿ë »ó

Ÿ¦ Ç¥½ÃÇÏ´Â /proc/meminfo¿Í °°Àº, ÀÌ¿ëµÈ´Ù.

/proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇÏ´Â ÀÌ·¯ÇÑ ¹æ¹ýÀº ÀåÄ¡µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú ¸Å¿ì

À¯»çÇÏ´Ù --- /proc ÆÄÀÏÀ» À§ÇÑ ÇÊ¿äÇÑ ¸ðµç Á¤º¸¿Í ÇÔ²² ±¸Á¶Ã¼ÀÇ »ý¼º, ó¸® ÇÔ¼ö

¸¦ À§ÇÑ Æ÷ÀÎÅÍÀÇ Æ÷ÇÔ(¿ì¸®ÀÇ °æ¿ì¿¡ ÀÌ°ÍÀº ÇÑ ¹øÀÌ´Ù, /proc ÆÄÀÏ¿¡¼­ ´©±º°¡°¡ ÀÐ

±â¸¦ ½ÃµµÇÒ ¶§ ÇÑ ¹ø È£ÃâµÇ¾î Áø´Ù). init_moduleÀÌ Ä¿³Î°ú ÇÔ²² ±¸Á¶Ã¼ÀÇ µî·Ï°ú

cleanup_moduleÀÌ À̸¦ ÇØÁ¦ÇÒ ¶§ÀÌ´Ù.

¿ì¸®°¡ proc_register_dynamicÀ»* ÀÌ¿ëÇÏ´Â ÀÌÀ¯´Â ³ªÀº ÆÄÀÏ ¼º´ÉÀ» À§ÇØ À̸¦ °áÁ¤

Çϱ⠿øÇÏÁö ¾Ê±â ¶§¹®À̸ç, Ä¿³Î¿¡¼­ À§ÇèÇÑ Ãæµ¹À» ¸·±â À§ÇØ °áÁ¤ÇÑ´Ù.

º¸ÅëÀÇ ÆÄÀÏ ½Ã½ºÅÛÀº ¸Þ¸ð¸®(/prco°¡ À§Ä¡ÇÏ´Â)º¸´Ù´Â µð½ºÅ© »ó¿¡ À§Ä¡Çϸç, ÀÌ·¯ÇÑ

°æ¿ìÀÇ inode¹øÈ£´Â ÆÄÀÏÀÇ index-node°¡ À§Ä¡ÇÏ´Â °÷ÀÇ µð½ºÅ©»óÀÇ À§Ä¡¸¦ ³ªÅ¸³½´Ù.

inode´Â ÆÄÀÏ¿¡ °üÇÑ Á¤º¸¸¦, ¿¹¸¦ µé¸é ÆÄÀÏÀÇ ¼ÒÀ¯±Ç, µð½ºÅ© À§Ä¡¸¦ ³ªÅ¸³»´Â Æ÷ÀÎ

ÅÍ ¶Ç´Â ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ ¹ß°ßÇÒ ¼ö ÀÖ´Â À§Ä¡ µîÀ» Æ÷ÇÔÇÑ´Ù.

/proc ½Ã½ºÅÛ»óÀÇ ÆÄÀÏÀÌ ¿­¸®°Å³ª ´ÝÇûÀ» ¶§ ¾î¶°ÇÑ È£Ãâµµ ¾òÀ» ¼ö ¾øÀ¸¹Ç·Î, ¸ðµâ

¿¡¼­ MOD_INC_USE_COUNT¿Í MOD_DEC_USE_COUNT´Â ¾îµð¿¡ ÀÖ´ÂÁö ¾Ë ¼ö ¾øÀ¸¸ç, ±×¸®°í

¸¸¾à ÆÄÀÏÀÌ ¿­¸®°í ¸ðµâÀÌ Á¦°ÅµÇ¾úÀ¸¸é, °á°ú¸¦ ÀüÇô ¿¹ÃøÇÒ ¼ö ¾ø°Ô µÈ´Ù.

´ÙÀ½ Àå¿¡¼­ Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¼ ¼ö ÀÖÀ» °ÍÀ̸ç, ±×·¯³ª Á»´õ À¯¿¬ÇÑ ³»¿ëµéÀ»,

/procÆÄÀϵéÀÇ ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ¸·´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.

 

°¢ÁÖ1 *************************************************************************

2.0, 2.2 ¹öÀü¿¡¼­ inode¸¦ 0À¸·Î ¼³Á¤Çϸé ÀÚµ¿ÀûÀ¸·Î ¿Ï·áµÈ´Ù.

*******************************************************************************

 

<procfs.c>

/*

* procfs.c - /proc¿¡ ÆÄÀÏ »ý¼ºÇϱâ

* Copyright (C) 1998-1999 by Ori Pomerantz

*/

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* /proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇϱ⿡ ÇÊ¿äÇÔ */

#include <linux/proc_fs.h>

 

/* ¹öÀü 2.2.3¿¡¼­ /usr/include/linux/version.h ¿¡ ¸ÅÅ©·Î Æ÷ÇÔÇϳª, 2.0.35¿¡¼­´Â

±×·¸Áö ¸øÇÏ´Ù. ±×·¡¼­ ÇÊ¿äÇÏ´Ù¸é ÀÌ°÷¿¡¼­ Ãß°¡ÇÑ´Ù. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

/* proc ÆÄÀÏ ½Ã½ºÅÛÀÇ ÆÄÀÏ¿¡ µ¥ÀÌÅÍ ¾²±â */

/*

ÀÎÀÚµé

====================

1. µ¥ÀÌÅ͸¦ »ðÀÔÇÒ °÷ÀÇ ¹öÆÛ, ÀÌ¿ëÇÒ °ÍÀ̶ó¸é ÁöÁ¤Ç϶ó.

2. ¹®ÀÚµéÀ» ÁöÁ¤ÇÒ Æ÷ÀÎÅÍ. Ä¿³Î¿¡ ÀÇÇØ ÇÒ´çµÈ ¹öÆÛ¸¦ ÀÌ¿ëÇÏÁö ¾ÊÀ» °æ¿ì À¯¿ëÇÏ´Ù..

3. ÆÄÀÏ¿¡¼­ÀÇ ÇöÀç À§Ä¡.

4. ù ¹ø° ÀÎÀÚÀÇ ¹öÆÛ Å©±â.

5. Zero (ÇâÈÄ¿¡ ÀÌ¿ëÀ» À§ÇØ?).

 

»ç¿ë¹ý°ú ¸®ÅÏ °ª

====================

ÀڽŸ¸ÀÇ ¹öÆÛ¸¦ ÀÌ¿ëÇÒ °æ¿ì, ³ª´Â ±×·¸°Ô ÇÏ´Â °ÍÀ» ÁÁ¾ÆÇÑ´Ù, µÎ ¹ø° ÀÎÀÚ¿¡ À§Ä¡

¸¦ ÁöÁ¤ÇÏ°í ¹öÆÛ¿¡¼­ ÀÌ¿ëµÈ Å©±â¸¦ ¸®ÅÏ ¹Þ´Â´Ù.

°á°ú °ªÀÌ 0À̸é À̹ø¿¡ ´õÀÌ»óÀÇ Á¤º¸(ÆÄÀÏÀÇ ³¡)¸¦ °¡ÁöÁö ¸øÇÔÀ» ¶æÇÑ´Ù. À½¼öÀÇ

°ªÀº ¿À·ù Á¶°ÇÀÌ´Ù.

 

»ó¼¼ÇÑ Á¤º¸

====================

¹®¼­¸¦ Àд °Í¸¸À¸·Î´Â ÀÌ ÇÔ¼ö¿Í ÇÔ²² ¹«¾ùÀ» ÇؾßÇÏ´ÂÁö ¹ß°ßÇÏÁö ¸ø ÇÒ °ÍÀÌ´Ù.

±×·¯³ª Äڵ带 »ìÆ캸´Â °Í¿¡ ÀÇÇØ ¹æ¹ýÀ» ¾Ë ¼ö ÀÖ´Ù. get_info Çʵå¿Í proc_dir_en-

try°¡ ¹«¾ù¿¡ ÀÌ¿ëµÇ¾ú´ÂÁö »ìÆ캽À¸·Î(ÁÖ·Î ÇÊÀÚ´Â find¿Í grepÀÇ Á¶ÇÕÀ» ÀÌ¿ëÇÑ´Ù)

À¸·Î¼­ ÀÌ°ÍÀ» ÀÌÇØÇÏ°Ô µÇ¾ú°í, ±×¸®°í <Ä¿³Î ¼Ò½º µð·ºÅ丮> /fs/proc/array.c¿¡ ÀÌ

¿ëµÇ´Â °ÍÀ» º¸¾Ò´Ù. Ä¿³Î¿¡ ´ëÇØ ¸ð¸£´Â °ÍÀÌ ÀÖ´Ù¸é, ÀÌ·¯ÇÑ °ÍÀÌ Åë»óÀûÀÎ ¹æ¹ýÀ»

Á¦°øÇÑ´Ù. ¸®´ª½º¿¡¼­ÀÇ Ä¿³Î ¼Ò½º·ÎºÎÅÍ ¾ÆÁÖ Ä¿´Ù¶õ ¹«·áÀÎ ÀÌÀÍÀ» ¾òÀ» ¼ö ÀÖ´Ù -

±×°ÍÀ» ÀÌ¿ëÇ϶ó.

*/

 

int procfile_read(char *buffer, char **buffer_location, off_t offset,

int buffer_length, int zero)

{

int len; /* ½ÇÁ¦·Î ÀÌ¿ëµÈ ±æÀÌ */

 

/* ÀÌ°ÍÀº Á¤ÀûÀ̸ç ÀÌ ÇÔ¼ö¸¦ Á¾·áÇصµ ¿©ÀüÈ÷ ¸Þ¸ð¸® »ó¿¡ ³²¾Æ ÀÖ´Ù.*/

static char my_buffer[80];

static int count = 1;

 

/*

ÇÊ¿äÇÑ Á¤º¸ ¸ðµÎ°¡ ÇÑ ¹ø¿¡ ÁÖ¾îÁø´Ù, ±×·¡¼­ »ç¿ëÀÚ°¡ Á¤º¸¸¦ Á»´õ ¿ä±¸Çϸé,

±× ´ë´äÀº Ç×»ó "¾Æ´Ï¿À"ÀÌ´Ù.

 

ÀÌ°ÍÀº ¶óÀ̺귯¸® Ç¥ÁØ readÇÔ¼ö°¡ ½Ã½ºÅÛ È£ÃâÀ» ÅëÇØ Ä¿³ÎÀÌ ÀÀ´ä ÇÒ ¶§±îÁö,

Áï ´õ ÀÌ»óÀÇ Á¤º¸°¡ ¾ø°Å³ª, ¹öÆÛ°¡ Âû ¶§±îÁö °è¼Ó read ½Ã½ºÅÛ È£ÃâÀ» °è¼ÓÇÏ

±â¿¡ Áß¿äÇÏ´Ù.

*/

if (offset > 0) return 0;

 

/* Fill the buffer and get its length */

len = sprintf(my_buffer,

"For the %d%s time, go away!\n",

count,

(count % 100 > 10 && count % 100 < 14) ? "th" :

(count % 10 == 1) ? "st" :

(count % 10 == 2) ? "nd" :

(count % 10 == 3) ? "rd" : "th" );

 

count++;

 

/* ¹öÆÛ°¡ ¾î´À °÷¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë¸°´Ù. */

*buffer_location = my_buffer;

 

/* ±æÀ̸¦ ¸®ÅÏ ÇÑ´Ù. */

return len;

}

 

struct proc_dir_entry Our_Proc_File =

{

0, /* Inode ¹øÈ£ - ¹«½Ã, proc_register[_dynamic]¿¡ ÀÇÇØ Ã¤¿öÁø´Ù. */

4, /* ÆÄÀÏ À̸§ÀÇ ±æÀÌ */

"test", /* ÆÄÀÏ À̸§ */

S_IFREG | S_IRUGO, /* ÆÄÀÏ ¸ðµå - ¼ÒÀ¯ÀÚ, ±×·ì, ´Ù¸¥ ¸ðµÎ°¡ ÀÐÀ» ¼ö ÀÖ´Â Á¤

±Ô È­ÀÏ */

1, /* ¸µÅ©ÀÇ ¼ö(ÆÄÀÏÀÌ ÂüÁ¶µÇ¾îÁø °÷¿¡¼­ÀÇ µð·ºÅ丮µé) */

0, 0, /* ÆÄÀÏÀ» À§ÇÑ uid ¿Í gid - ·çÆ®¿¡¼­ ÁÖ¾îÁø */

80, /* ls¿¡ ÀÇÇØ ³ªÅ¸³ª´Â ÆÄÀÏÀÇ Å©±â */

NULL, /* inode»ó¿¡¼­ ¼öÇà °¡´ÉÇÑ ÇÔ¼ö(¸µÅ·, Á¦°Å µîµî)?

¾Æ¹« °Íµµ Áö¿øÇÏÁö ¾Ê´Â´Ù. */

procfile_read, /* ÀÌ ÆÄÀÏÀ» À§ÇÑ Àбâ ÇÔ¼ö, ´©±º°¡ Àб⸦ ½ÃµµÇÒ ¶§ È£ÃâµÇ

¾îÁø´Ù.*/

NULL /* ÆÄÀÏÀÇ inodeÀ» ÁöÁ¤Çϱâ À§ÇÑ ¿©±â¿¡ ÇÔ¼ö¸¦ °¡Áø´Ù. Æ۹̼Ç, ¼ÒÀ¯ÀÚ

µî°ú ÇÔ²² ¼öÇàÇÑ´Ù */

};

 

/* ¸ðµâÀÇ ÃʱâÈ­ - procÆÄÀÏ µî·Ï */

int init_module()

{

/* proc_register[_dynamic]ÀÌ ¼º°øÀÌ¸é ¼º°ø, ¾Æ´Ï¸é ½ÇÆÐ. */

 

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

/* ¹öÀü 2.2¿¡¼­, proc_register´Â ±¸Á¶Ã¼¾È¿¡¼­ °ªÀÌ 0À̸é ÀÚµ¿ÀûÀ¸·Î µ¿Àû

inode ¹øÈ£¸¦ ÇÒ´çÇϹǷÎ, proc_register_dynamic´Â ´õÀÌ»ó ÇÊ¿ä ¾ø´Ù. */

return proc_register(&proc_root, &Our_Proc_File);

#else

return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

/* proc_root´Â proc ÆÄÀÏ ½Ã½ºÅÛ(/proc)À» À§ÇÑ ·çÆ® µð·ºÅ丮. ¿øÇÏ´Â °÷¿¡

À§Ä¡ÇÒ ¼ö ÀÖ´Ù. */

}

 

/* ¸ðµâÀÇ Á¦°Å - /proc¿¡ ÆÄÀÏÀ» ÇØÁ¦ÇÑ´Ù. */

void cleanup_module()

{

proc_unregister(&proc_root, Our_Proc_File.low_ino);

}

 

 

Á¦ 4 Àå

 

ÀÔ·ÂÀ» À§ÇÑ /procÀÇ ÀÌ¿ë

 

ÀÌÁ¦ Ä¿³ÎÀÇ ¸ðµâ·ÎºÎÅÍ Ãâ·ÂÀ» ¾ò´Â µÎ °¡Áö ¹æ¹ýÀ» ¾Ë°Ô µÇ¾ú´Ù. ÀåÄ¡ µå¶óÀ̹ö¸¦

µî·ÏÇÏ°í mknod¸¦ ÀÌ¿ëÇÏ¿© ÀåÄ¡ÆÄÀÏÀ» ¸¸µå´Â °ÍÀÌ °¡´ÉÇϸç, ¶ÇÇÑ /procÆÄÀÏÀ» ¸¸µå

´Â °Íµµ °¡´ÉÇÏ´Ù. ÀÌ°ÍÀº ÀԷ¿¡¼­µµ ÀÌ¿Í À¯»çÇÔÀ» º¸¿©ÁØ´Ù. ¹®Á¦¶ó¸é, ÀÀ´äÀ» ¾ò

À» ¾î¶² ¹æ¹ýµµ ¾ø´Ù´Â °ÍÀÌ´Ù. Ä¿³Î ¸ðµâ¿¡ ÀÔ·ÂÀ» º¸³»±â À§ÇÑ Ã¹ ¹ø° ¹æ¹ýÀº /pr-

oc ÆÄÀÏ¿¡¼­ ¾²¿©Áø °ÍÀ» ÅëÇؼ­ÀÌ´Ù. ¶§¹®¿¡ /proc ÆÄÀϽýºÅÛÀº ÁÖ·Î ÇÁ·Î¼¼½ºµé¿¡

´ëÇÑ »óȲÀ» ³ªÅ¸³»´Â µ¥¿¡ ¾²À̸ç, ÀÔ·ÂÀ» À§ÇÑ ¾î¶² Ưº°ÇÑ Çü½ÄÀº ¾ø´Ù. proc_dir-

_entry ±¸Á¶Ã¼´Â ÀÔ·Â ÇÔ¼ö¿¡¼­ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç, Ãâ·Â ÇÔ¼ö¿¡¼­¸¸ Æ÷ÀÎÅ͸¦

Æ÷ÇÔÇÑ´Ù. ´ë½Å¿¡, /proc ÆÄÀÏ¿¡ ¾²±â À§Çؼ­, Ç¥ÁØ ÆÄÀϽýºÅÛ ¹æ½ÄÀÇ ÀÌ¿ëÀ» ÇÊ¿ä·Î

ÇÑ´Ù.

¸®´ª½º¿¡¼­ ±×°ÍÀº ÆÄÀÏ ½Ã½ºÅÛÀÇ µî·ÏÀ» À§ÇÑ Ç¥ÁØÀûÀÎ ÀýÂ÷ÀÌ´Ù. ¸ðµç ÆÄÀϽýºÅÛÀÌ

ÆÄÀÏÀÇ µ¿ÀÛ°ú inodeµ¿ÀÛÀ»* ó¸®Çϱâ À§ÇØ ÀڽŸ¸ÀÇ ÇÔ¼öµéÀ» °¡Áö¸ç, struct_inode

¿Í struct_file´ëÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ¿©, À̵éÀÌ ÀÌ·¯ÇÑ ÇÔ¼öµé¿¡¼­ »ç¿ëµÇ´Â Ưº°ÇÑ

±¸Á¶Ã¼ÀÌ´Ù.

°¢ÁÖ1 *************************************************************************

µÑ »çÀÌÀÇ Â÷ÀÌ´Â ÆÄÀÏ µ¿ÀÛÀÌ ÆÄÀÏÀڽŰú ÇÔ²² ´Ù·ç¾îÁö´Â °ÍÀÌ°í, inodeµ¿ÀÛÀÌ ÆÄ

ÀÏ¿¡ ´ëÇÑ ¸µÅ©(¿¬°á°í¸®)¸¦ »ý¼ºÇÏ´Â °Íó·³, ÆÄÀÏ¿¡ ´ëÇÑ ÂüÁ¶ÀÇ ¹æ¹ýÀ¸·Î ´Ù·é´Ù´Â

°ÍÀÌ´Ù.

*******************************************************************************

/proc¿¡¼­, »õ·Î¿î ÆÄÀÏÀ» µî·ÏÇÒ ¶§¸¶´Ù, ÀÌ¿¡ ´ëÇÑ Á¢±ÙÀ» À§ÇØ struct_inodeÀ» Áö

Á¤ÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀÌ ¿ì¸®°¡ ÀÌ¿ëÇÏ´Â ÀýÂ÷À̸ç, struct_inode´Â ¸ðµâÀÇ ÀԷ°ú Ãâ·Â

À» À§ÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ´Â struct_file¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù.

À¯ÀÇÇÒ Á¡Àº Àбâ¿Í ¾²±âÀÇ Ç¥ÁØÀûÀÎ ±ÔÄ¢µéÀÌ Ä¿³Î¿¡¼­´Â ¹Ù²ï´Ù´Â Á¡ÀÌ´Ù. Àбâ ÇÔ

¼ö´Â ¾²±â¸¦ À§ÇØ ÀÌ¿ëµÇ¸ç, ¹Ý¸é¿¡ ¾²±â ÇÔ¼ö´Â Àб⸦ À§ÇØ ÀÌ¿ëµÈ´Ù. ÀÌ´Â Àбâ,

¾²±â°¡ ÀÔ·ÂÀ» À§ÇÑ »ç¿ëÀÚÀÇ °üÁ¡¿¡¼­ ÂüÁ¶µÇ±â ¶§¹®ÀÌ´Ù --- ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡¼­

¹«¾ð°¡ ÀÐÀ¸·Á Çϸé Ä¿³ÎÀº ±×°ÍÀ» Ãâ·ÂÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¸ç, ±×¸®°í ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡

¹«¾ð°¡ ¾²°ÔµÇ¸é Ä¿³ÎÀº ÀÔ·Âó·³ ±×°ÍÀ» ¹Þ¾ÆµéÀδÙ.

 

¶Ç ÇÑ°¡Áö Èï¹Ì·Î¿î Á¡Àº module_permission ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ /proc

ÆÄÀÏ¿¡ ¾î¶² ÀÏÀ» ÇÏ·Á°í ÇÒ ¶§ È£ÃâµÇ¾îÁö¸ç, ±×°Í¿¡ ´ëÇÑ Á¢±ÙÀÇ Çã°¡ ¶Ç´Â ºÒÇ㸦

°áÁ¤ÇÑ´Ù. ÀÌ°ÍÀº ÆÄÀÏÀÇ µ¿ÀÛ°ú ÇöÀç ÀÌ¿ëµÈ uid¿¡ ±Ù°ÅÇϸç(ÇöÀç °¡´ÉÇÑ, ÇöÀç½ÇÇà

µÇ°í ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ), ±×·¯³ª ´Ù¸¥ °Íµé, ´Ù¸¥ ÇÁ·Î

¼¼½ºµéÀÌ µ¿ÀÏÇÑ ÆÄÀÏ°ú ÇÔ²² ¹«¾ùÀ» ÇÏ´ÂÁö, ³¯Â¥¿Í ½Ã°£, ¶Ç´Â ¼ö½ÅµÈ ¸¶Áö¸· ÀÔ·Â

µûÀ§ÀÇ °Íµé¿¡¼­ ±Ù°ÅÇϱ⵵ ÇÑ´Ù.

 

put_user¿Í get_userÀ» ¾²´Â ÀÌÀ¯´Â ¸®´ª½ºÀÇ ¸Þ¸ð¸®(Àû¾îµµ ÀÎÅÚ ±¸Á¶¿¡¼­, ´Ù¸¥ ±¸

Á¶¿¡¼­´Â ´Ù¸¦Áöµµ ¸ð¸£Áö¸¸)°¡ ¼¼±×¸ÕÆ®·Î ±¸¼ºµÇ±â ¶§¹®ÀÌ´Ù. ÀÌ°ÍÀº Æ÷ÀÎÅÍ°¡ ¸Þ¸ð

¸®¿¡¼­ ´ÜÀÏÇÑ À§Ä¡¸¦ ÂüÁ¶ÇÏÁö ¾ÊÀ¸¸ç, ´ÜÁö ¸Þ¸ð¸®»óÀÇ ¼¼±×¸ÕÆ® »ó¿¡ À§Ä¡ÇÏ°í, ±×

°ÍÀÌ ÀÌ¿ë °¡´ÉÇÑ ¼¼±×¸ÕÆ®ÀÎÁö ¾Ë ÇÊ¿ä°¡ ÀÖ´Ù´Â °ÍÀÌ´Ù. Ä¿³ÎÀ» À§ÇÑ ÇϳªÀÇ ¼¼±×¸Õ

Æ®°¡ ÀÖÀ¸¸ç, ÇÁ·Î¼¼½ºµé¿¡µµ °¢°¢ Çϳª¾¿ ÇÒ´çµÈ´Ù. ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÏ·Á ÇÒ ¶§, ´Ü

Áö Àڽſ¡°Ô ÇÒ´çµÈ ¼¼±×¸ÕÆ® ¸¸À» ÀÌ¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ¼¼±×¸ÕÆ®¿¡ ´ëÇؼ­´Â °ÆÁ¤ÇÒ

ÇÊ¿ä°¡ ¾ø´Ù. Ä¿³Î ¸ðµâ¿¡ ¾²·Á°í ÇÒ ¶§, º¸ÅëÀº ½Ã½ºÅÛ¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î °ü¸®µÇ´Â

Ä¿³Î ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ Á¢±ÙÇÏ±æ ¿øÇÑ´Ù. ±×·¯³ª, ÇöÀç ½ÇÇàµÇ°í ÀÖ´Â ÇÁ·Î¼¼½º¿Í Ä¿

³Î »çÀÌ¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®ÀÇ ¾çÀÌ ³Ñ°ÜÁú ¶§, Ä¿³Î ÇÔ¼ö´Â ÇÁ·Î¼¼½º ¼¼±×¸ÕÆ® ¾È¿¡ À§

Ä¡ÇÑ ¸Þ¸ð¸® ¹öÆÛÀÇ Æ÷ÀÎÅ͸¦ ¼ö½ÅÇÑ´Ù. put_user¿Í get_user¸ÅÅ©·Î´Â ÀÌ ¸Þ¸ð¸®¿¡ Á¢

±ÙÇϵµ·Ï Çã¿ëÇÑ´Ù.

 

<procfs.c>

 

/* procfs.c - /proc¾È¿¡ »ý¼ºµÇ´Â ÆÄÀÏ, ÀÔ·Â, Ãâ·ÂÀÌ ¸ðµÎ Çã°¡µÈ´Ù. */

/* Copyright (C) 1998-1999 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* /proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇϱ⿡ ÇÊ¿äÇÔ */

#include <linux/proc_fs.h>

 

/* ¹öÀü 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇϳª, 2.0.35¿¡¼­´Â

±×·¸Áö ¸øÇÏ´Ù. ±×·¡¼­ ÇÊ¿äÇÏ´Ù¸é ÀÌ°÷¿¡¼­ Ãß°¡ÇÑ´Ù. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

#include <asm/uaccess.h> /* get_user¿Í put_user¸¦ À§ÇØ */

#endif

 

/* ¸ðµâÀÇ ÆÄÀÏ ÇÔ¼öµé */

/* ¿©±â¼­ ¼ö½ÅµÈ ¸¶Áö¸· ¸Þ½ÃÁö¸¦ À¯ÁöÇϸç, ½ÃÇèÀ» À§ÇØ ÀÔ·ÂÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù.*/

#define MESSAGE_LENGTH 80

 

static char Message[MESSAGE_LENGTH];

 

/* ÆÄÀÏ µ¿ÀÛ ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇϹǷÎ, Ưº°ÇÑ proc Ãâ·Â ½ÃÇèµéÀº ÇÒ ¼ö ¾ø´Ù - ¿©±â¿¡

¾²¿©Áø °Íó·³, Ç¥ÁØ Àбâ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.*/

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t module_output(

struct file *file, /* ÆÄÀÏ Àбâ */

char *buf, /* »ç¿ëÀÚ ¼¼±×¸ÕÆ® ¾È¿¡¼­ µ¥ÀÌÅ͸¦ ÀúÀåÀ» À§ÇÑ ¹öÆÛ */

size_t len, /* ¹öÆÛÀÇ ±æÀÌ */

loff_t *offset) /* ÆÄÀÏ¿¡¼­ÀÇ »ó´ë À§Ä¡ - ¹«½Ã */

#else

static int module_output(

struct inode *inode,/* inode Àбâ */

struct file *file, /* ÆÄÀÏ Àбâ */

char *buf, /* »ç¿ëÀÚ ¼¼±×¸ÕÆ® ¾È¿¡¼­ µ¥ÀÌÅ͸¦ ÀúÀåÀ» À§ÇÑ ¹öÆÛ */

int len) /* ¹öÆÛÀÇ ±æÀÌ */

#endif

{

static int finished = 0;

int i;

char message[MESSAGE_LENGTH+30];

 

/* ÆÄÀÏÀÇ ³¡À̸é 0À», ´õ ÀÌ»óÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. ¹Ý¸é¿¡, ÇÁ·Î¼¼½º

µéÀº ¹«ÇÑ ·çÇÁ ¾È¿¡¼­ Àб⸦ °è¼ÓÇÑ´Ù.*/

if (finished)

{

finished = 0;

return 0;

}

 

/* put user´Â Ä¿³Î ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡¼­ È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ ¼¼±×¸ÕÆ®·Î ¹®ÀÚ¿­

À» º¹»çÇÑ´Ù. get_user´Â ¹Ý´ëÀÇ µ¿ÀÛÀ»...*/

sprintf(message, "Last input:%s", Message);

for(i=0; i<len && message[i]; i++) put_user(message[i], buf+i);

 

/*

ÁÖÀÇ, ¸Þ½ÃÁöÀÇ Å©±â°¡ ¾Æ·¡ÀÇ ±æÀ̸¦ °¡Áø´Ù°í È®½ÅÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, Àß

·ÁÁú °ÍÀÌ´Ù. ½ÇÁ¦ÀÇ »óȲ¿¡¼­, ¸Þ½ÃÁöÀÇ Å©±â°¡ ¹öÆÛÀÇ ±æÀ̺¸´Ù ÀÛ´Ù¸é, ±æ

À̸¦ ¸®ÅÏ ÇÒ °ÍÀÌ°í, ´ÙÀ½ÀÇ È£Ãâ¿¡¼­ len+1ÀÇ Å©±âÀÇ ¸Þ½ÃÁö¿Í ÇÔ²² ¹öÆÛ´Â

ä¿öÁø´Ù.

*/

finished = 1;

 

return i; /* "read",¿¡ ÀÇÇÑ Å©±â¸¦ ¸®ÅÏ */

}

 

/* ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ°¡ /proc ÆÄÀÏ¿¡ ¾µ ¶§ »ç¿ëÀڷκÎÅÍ ÀÔ·ÂÀ» ¼ö½ÅÇÑ´Ù.*/

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t module_input(

struct file *file, /* ÆÄÀÏ ÀڽŠ*/

const char *buf, /* ÀÔ·Â ¹öÆÛ */

size_t length, /* ¹öÆÛÀÇ ±æÀÌ */

loff_t *offset) /* ÆÄÀϼ­ÀÇ »ó´ëÀ§Ä¡ - ¹«½Ã */

#else

static int module_input(

struct inode *inode,/* ÆÄÀÏÀÇ inode */

struct file *file, /* ÆÄÀÏ ÀڽŠ*/

const char *buf, /* ÀÔ·Â ¹öÆÛ */

int length) /* ¹öÆÛÀÇ ±æÀÌ */

#endif

{

int i;

 

/* ¸Þ½ÃÁö ¾È¿¡ ÀÔ·ÂÀ» Áý¾î³Ö±â, module_outputÀÇ °÷¿¡¼­ ³ªÁß¿¡ ÀÌ¿ëµÈ´Ù.*/

for(i=0; i<MESSAGE_LENGTH-1 && i<length; i++)

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(Message[i], buf+i);

 

/*

¹öÀü 2.2¿¡¼­ get_userÀÇ Àǹ̴ º¯°æµÇ¾ú´Ù. ´õÀÌ»ó ¹®ÀÚ¸¦ ¸®ÅÏÇÏÁö ¾Êµµ·Ï,

±×·¯³ª ù ¹ø° ÀÎÀÚ¿¡ º¯¼ö¸¦ ÁöÁ¤ÇÏ±æ ±â´ëÇÏ°í, ´ÙÀ½ÀÇ ÀÎÀÚ¿¡ »ç¿ëÀÚ ¼¼±×¸Õ

Æ®ÀÇ Æ÷ÀÎÅ͸¦ ÁöÁ¤ÇÑ´Ù.

 

¹öÀü 2.2¿¡¼­ get_userÀÇ ÀÌ·¯ÇÑ º¯°æÀÇ ÀÌÀ¯´Â short ¶Ç´Â intÀÇ Àб⸦ °¡´ÉÇÏ

°Ô ÇÑ´Ù´Â °ÍÀÌ´Ù. Àбâ À§ÇÑ º¯¼öÀÇ ÇüŸ¦ ¾Æ´Â ¹æ¹ýÀº sizeofÀ» ÀÌ¿ëÇؼ­À̸ç,

º¯¼ö ÀÚ½ÅÀ» À§ÇØ ÇÊ¿äÇÏ´Ù.

*/

#else

Message[i] = get_user(buf+i);

#endif

 

Message[i] = '\0'; /* Ç¥ÁØÀ» ¿øÇÑ´Ù, 0Àº ¹®ÀÚ¿­ Á¾·á ¹®ÀÚ */

 

/* ÀÌ¿ëµÈ ÀÔ·Â ¹®ÀÚµéÀÇ °³¼ö¸¦ ¸®ÅÏÇÒ ÇÊ¿ä°¡ ÀÖ´Ù */

return i;

}

 

/*

ÀÌ ÇÔ¼ö´Â µ¿ÀÛÀ» Çã°¡(0À» ¸®ÅÏ), ºÒÇã(¿Ö Çã°¡ÇÏÁö ¾Ê´Âµ¥ ÀÌÀ¯¸¦ ³ªÅ¸³»´Â ¾ç¼ö

ÀÇ °ªÀ» ¸®ÅÏ)°áÁ¤ÇÑ´Ù.

 

¾Æ·¡ÀÇ °ªµéÁß Çϳª·Î¼­ µ¿ÀÛÇÑ´Ù:

0 - ½ÇÇà(ÆÄÀÏÀÇ ½ÇÇà - ¿©±â¼­´Â ¹«ÀǹÌÇÏ´Ù)

2 - ¾²±â(Ä¿³Î ¸ðµâ¿¡¼­ÀÇ ÀÔ·Â)

4 - Àбâ(Ä¿³Î ¸ðµâ·ÎºÎÅÍÀÇ Ãâ·Â)

 

ÀÌ°ÍÀº ÆÄÀÏÀÇ Æ۹̼ÇÀ» °Ë»çÇÏ´Â ½ÇÁ¦ ÇÔ¼öÀÌ´Ù. ls -l¿¡ ÀÇÇØ ¸®ÅÏ µÇ¾îÁö´Â ÆÛ¹Ì

¼ÇµéÀº ´ÜÁö ÂüÁ¶µÉ »ÓÀ̸ç, ÀÌ°÷¿¡¼­ ÁßøµÇ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

*/

static int module_permission(struct inode *inode, int op)

{

/* ¸ðµÎ¿¡°Ô ¸ðµâ¿¡¼­ÀÇ Àб⸦ Çã°¡ÇÏ°í, ·çÆ®(uid 0)¿¡°Ô¸¸ ¾²±â¸¦ Çã°¡ÇÑ´Ù.*/

if (op == 4 || (op == 2 && current->euid == 0))

return 0;

 

/* ¾î¶² °Íµµ ¾Æ´Ï¶ó¸é, Á¢±ÙÀº ºÒÇãµÈ´Ù. */

return -EACCES;

}

 

/* ÆÄÀÏÀº ¿­·Á Áø´Ù.. - ÀÌ°Í¿¡ ´ëÇØ Å©°Ô Á¶½ÉÇÏÁö ¾Ê¾Æµµ µÇÁö¸¸, ¸ðµâÀÇ ÂüÁ¶

Ä«¿îÅ͸¦ Áõ°¡ÇÒ ÇÊ¿ä´Â ÀÖ´Ù.*/

int module_open(struct inode *inode, struct file *file)

{

MOD_INC_USE_COUNT;

return 0;

}

 

/* ÆÄÀÏÀº ´ÝÇôÁø´Ù. - ´Ù½Ã ¸»ÇÏÁö¸¸ ÂüÁ¶ Ä«¿îÅÍÀÇ °ª ¶§¹®¿¡ ÀÌ°ÍÀÌ Èï¹Ì·Î¿ï »Ó

ÀÌ´Ù */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

int module_close(struct inode *inode, struct file *file)

#else

void module_close(struct inode *inode, struct file *file)

#endif

{

MOD_DEC_USE_COUNT;

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return 0; /* ¼º°ø */

#endif

}

 

/* /proc¿¡ µî·ÏÇϱâ À§ÇÑ ±¸Á¶Ã¼, ¸ðµç °ü°èµÈ ÇÔ¼öµéÀÇ Æ÷ÀÎÅÍ¿Í ÇÔ²² */

 

/* proc ÆÄÀÏÀ» À§ÇÑ ¿¬»êµé. ÆÄÀÏ¿¡ ¹«½¼ ÀÏÀ» ¼öÇàÇÏ·Á ÇÒ ¶§ È£ÃâµÇ´Â ¸ðµç ÇÔ¼öµé

ÀÇ Æ÷ÀÎÅÍ°¡ À§Ä¡ÇÑ´Ù.NULLÀÇ ¾Æ¹« °Íµµ ¼öÇàÇÏÁö ¾Ê´Â´Ù´Â ÀǹÌÀÌ´Ù.*/

static struct file_operations File_Ops_4_Our_Proc_File =

{

NULL, /* lseek */

module_output, /* ÆÄÀϷκÎÅÍÀÇ "Àбâ" */

module_input, /* ÆÄÀÏ¿¡ "¾²±â" */

NULL, /* readdir */

NULL, /* select */

NULL, /* ioctl */

NULL, /* mmap */

module_open, /* ´©±º°¡ ÆÄÀÏÀ» ¿­¾ú´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

NULL, /* flush, ¹öÀü 2.2¿¡¼­ Ãß°¡ */

#endif

module_close, /* ´©±º°¡ ÆÄÀÏÀ» ´Ý¾Ò´Ù. */

 

/* ±âŸ µîµî. (/usr/include/linux/fs.h¿¡ ÁÖ¾îÁø ¸ðµç °Íµé).¿©±â¿¡ ¾î¶² °Íµµ

ÁÖÁö ¾Ê¾ÒÀ¸¹Ç·Î, ½Ã½ºÅÛÀº ±âº» °ªÀ» À¯ÁöÇÑ´Ù. À¯´Ð½º¿¡¼­ ÀÌ°ÍÀº 0ÀÌ´Ù(Æ÷ÀÎÅÍ

ÀÏ °æ¿ì ÀÌ°ÍÀº NULL). */

};

 

/*

proc ÆÄÀÏÀ» À§ÇÑ inode ¿¬»êµé. ÀÌ¿ëÇϱ⠿øÇÏ´Â °÷¿¡ ÀÌ ÆÄÀÏ ¿¬»ê ±¸Á¶Ã¼¸¦ À§Ä¡½Ã

Å°°í, ÀÌ ÇÔ¼ö´Â Æ۹̼ÇÀ» À§ÇØ ÀÌ¿ëÇÑ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ inodeÀÇ ÀÛ¾÷ ¸»°íµµ ´Ù¸¥ ÀÏ

¿¡ ÇÔ¼öµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.(ÀÌ·± ÀÏÀº ±×´ÙÁö ±î´Ù·ÓÁö ¾Ê´Ù, ÇÊ¿äÄ¡ ¾Ê´Â °æ¿ì NU-

LLÀ» ÁöÁ¤ÇÑ´Ù)

*/

static struct inode_operations Inode_Ops_4_Our_Proc_File =

{

&File_Ops_4_Our_Proc_File,

NULL, /* »ý¼º(create) */

NULL, /* lookup */

NULL, /* ¿¬°á(link) */

NULL, /* ¿¬°á »èÁ¦(unlink) */

NULL, /* ½É¹ú ¿¬°á(symlink) */

NULL, /* µð·ºÅ丮 »ý¼º(mkdir) */

NULL, /* µð·ºÅ丮 »èÁ¦(rmdir_ */

NULL, /* ³ëµå »ý¼º(mknod) */

NULL, /* À̸§ º¯°æ(rename) */

NULL, /* readlink */

NULL, /* follow_link */

NULL, /* ÆäÀÌÁö Àбâ(readpage) */

NULL, /* ÆäÀÌÁö ¾²±â(writepage) */

NULL, /* bmap */

NULL, /* Àý´Ü(truncate) */

module_permission /* Á¢±Ù Çã°¡¸¦ À§ÇÑ °Ë»ç */

};

 

/* µð·ºÅ丮 µî·Ï */

static struct proc_dir_entry Our_Proc_File =

{

0, /* Inode ¹øÈ£ - ¹«½Ã, proc_register[_dynamic]¿¡ ÀÇÇØ ÁöÁ¤µÉ °ÍÀÌ´Ù. */

7, /* ÆÄÀϸíÀÇ ±æÀÌ */

"rw_test", /* ÆÄÀÏ À̸§ */

S_IFREG | S_IRUGO | S_IWUSR,/* ÆÄÀÏ ¸ðµå - ¼ÒÀ¯ÀÚ, ±×·ì, ±×¸®°í ¸ðµÎ¿¡ Àбâ

°¡ °¡´ÉÇÑ Á¤±Ô ÆÄÀÏ. ½ÇÁ¦·Î, ÀÌ Çʵå´Â ´ÜÁö

ÂüÁ¶ µÉ »ÓÀ̸ç, module_permissionÀÌ ½ÇÁ¦·Î

À̸¦ ÀÌ¿ëÇÑ´Ù. ÀÌ°ÍÀÌ ÀÌ Çʵ带 ÀÌ¿ëÇϱâ´Â

ÇÏÁö¸¸, ¿©±â¼­´Â ÇÊ¿äÄ¡ ¾Ê´Ù. */

1, /* ¸µÅ©ÀÇ °³¼ö(ÆÄÀÏÀÌ ÂüÁ¶µÇ´Â °÷ÀÇ µð·ºÅ丮µé) */

0, 0, /* ÆÄÀÏÀÇ uid¿Í gid - ·çÆ®¿¡ ÀÇÇØ ÁÖ¾îÁø´Ù. */

80, /* ls¿¡ ÀÇÇØ ³ªÅ¸³ª´Â ÆÄÀÏÀÇ Å©±â */

&Inode_Ops_4_Our_Proc_File, /* ÇÊ¿äÇÏ´Ù¸é, ÆÄÀÏÀ» À§ÇÑ inode ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ

¾²±â ÇÔ¼ö°¡ ÇÊ¿äÇϹǷΠ¿©±â¼­´Â ÇÊ¿äÇÏ´Ù.*/

NULL /* ÆÄÀÏÀ» À§ÇÑ Àбâ ÇÔ¼ö. ºÒÇÊ¿ä, À§ÀÇ inode ±¸Á¶Ã¼¿¡¼­ »ç¿ëÇϱ⿡*/

};

 

/* ¸ðµâÀÇ ÃʱâÈ­¿Í »èÁ¦ */

/* ¸ðµâÀÇ ÃʱâÈ­ - proc¿¡ µî·Ï */

int init_module()

{

/* proc_register[_dynamic]ÀÌ 0ÀÌ¸é ¼º°ø, ¾Æ´Ï¸é ½ÇÆÐ */

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

/*

¹öÀü 2.2¿¡¼­ proc_register´Â ±¸Á¶Ã¼ ¾ÈÀÇ °ªÀÌ 0À̸é, µ¿ÀûÀ¸·Î inode¹øÈ£¸¦

ÁöÁ¤ÇÑ´Ù. ±×·¡¼­ proc_register_dynamicÀÌ ´õÀÌ»ó ÇÊ¿äÄ¡ ¾Ê´Ù.

*/

return proc_register(&proc_root, &Our_Proc_File);

#else

return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

}

 

/* »èÁ¦ - /proc¿¡¼­ ÆÄÀÏÀ» Á¦°Å */

void cleanup_module()

{

proc_unregister(&proc_root, Our_Proc_File.low_ino);

}

 

 

Á¦ 5 Àå

 

ÀåÄ¡ ÆÄÀÏÀÇ Á¦¾î(IOCTL ´Ù·ç±â)

 

ÀåÄ¡ ÆÄÀϵéÀº ¹°¸®Àû ÀåÄ¡¸¦ ³ªÅ¸³½´Ù. ´ëºÎºÐÀÇ ¹°¸®Àû ÀåÄ¡µéÀº ÀÔ·ÂÀº ¹°·Ð Ãâ·Â

µµ ÀÌ¿ëÇϸç, Ä¿³Î ³»¿¡¼­ ÇÁ·Î¼¼½ºµé¿¡ ÀåÄ¡ µå¶óÀ̹öÀÇ ÀÔ, Ãâ·ÂÀ» Á¦°øÇϱâ À§ÇÑ

ÀýÂ÷¸¦ °¡Áø´Ù. ÀÌ°ÍÀº Ãâ·Â¸¦ À§ÇÑ ÀåÄ¡ ÆÄÀÏÀÇ ¿­±â¿¡ ÀÇÇØ ¿Ï·áµÇ¸ç, ÀϹÝÀûÀÎ ÆÄ

ÀÏ¿¡ ¾²´Â °Í°ú °°ÀÌ ¾²±â ÀÛ¾÷À» ÇÑ´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¿¡¼­, ÀÌ°ÍÀº device_write¿¡ ÀÇ

ÇØ ¼öÇàµÈ´Ù. ±×·¯³ª, À̰͸¸À¸·Î´Â ÃæºÐÇÏÁö ¾Ê´Ù. ¸ðµ©¿¡ ¿¬°áµÈ Á÷·Ä Åë½Å Æ÷Æ®¸¦

»ó»óÇØ º¸ÀÚ(³»ÀåÇü ¸ðµ©À» °¡Áö°í ÀÖÀ»Áö¶óµµ, CPU¿¡ ÀÖ¾î ±×°ÍÀº ¿©ÀüÈ÷ ¿ø°ÝÀ¸·Î

¸ðµ©¿¡ ¿¬°áµÈ Á÷·ÄÆ÷Æ®ÀÏ »Ó, ÇÏÁö¸¸ ³Ê¹« ¾î·Æ°Ô »ý°¢ÇÏÁö´Â ¾Ê¾Æµµ µÈ´Ù). º»ÁúÀº

¸ðµ©¿¡ ¾²±â À§ÇØ(¸ðµ© ¸í·ÉÀº ¹°·Ð ÀüÈ­¼±À» ÅëÇØ µ¥ÀÌÅ͸¦ º¸³»´Â °Í±îÁö), ±×¸®°í

¸ðµ©À¸·ÎºÎÅÍ Àд °ÍÀ» À§ÇØ(¸í·É¿¡ ´ëÇÑ ÀÀ´äÀº ¹°·Ð ÀüÈ­¼±À» ÅëÇÑ µ¥ÀÌÅÍÀÇ ¼ö½Å)

ÀåÄ¡ ÆÄÀÏÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÏ´ÜÀº, ¾ðÁ¦ Á÷·Ä Æ÷Æ®¸¦ Á¦¾îÇÏ´ÂÁö ¹«¾ùÀ» ÇÏ´ÂÁö,

¿¹¸¦ µé¸é µ¥ÀÌÅ͸¦ ¼Û¼ö½Å ÇÒ ¶§ÀÇ Åë½Å¼Óµµ¸¦ º¸³»´Â °Í µûÀ§ÀÇ, Áú¹®Àº µÚ·Î ³²°Ü

µÎÀÚ. À¯´Ð½º¿¡¼­ ÀÌÀÇ ÀÀ´äÀº ioctlÀ̶ó ºÒ¸®´Â Ưº°ÇÑ ÇÔ¼ö¸¦ ÅëÇؼ­ÀÌ´Ù(input o-

utput controlÀÇ ÁÙÀÓ ¸»ÀÎ). ¸ðµç ÀåÄ¡´Â ÀÚ½ÅÀÇ ioctl ¸í·ÉÀ» °¡Áö¸ç, ioctlÀÇ Àбâ

(ÇÁ·Î¼¼½º¿¡¼­ Ä¿³Î·Î Á¤º¸¸¦ º¸³»±â À§ÇÑ),ioctlÀÇ ¾²±â(*1)(ÇÁ·Î¼¼½º¿¡¼­ Á¤º¸¸¦ ¸®

ÅÏÇϱâ À§ÇÑ)°¡ µÑ ´Ù ¾²ÀÏ ¼öµµ ȤÀº ¾Æ´Ò ¼öµµ ÀÖ´Ù.

°¢ÁÖ 1 ************************************************************************

ÁÖÀÇÇÒ Á¡Àº Àбâ¿Í ¾²±âÀÇ ±ÔÄ¢ÀÌ ´Ù½Ã ¹Ù²ï´Ù´Â °Í, ioctlÀÇ Àбâ´Â Ä¿³Î¿¡ Á¤º¸¸¦

º¸³»´Â °ÍÀÌ°í ¾²±â´Â Ä¿³Î¿¡¼­ Á¤º¸¸¦ ¼ö½ÅÇÑ´Ù´Â °ÍÀÌ´Ù.

*******************************************************************************

ioctl ÇÔ¼ö´Â 3°³ÀÇ ÀÎÀÚ¿Í ÇÔ²² È£ÃâµÇ¾îÁø´Ù: Á¢±ÙÇÏ·Á´Â ÀåÄ¡ ÆÄÀÏÀÇ ÆÄÀÏ ±â¼úÀÚ,

ioctl ¹øÈ£, ±×¸®°í ÇϳªÀÇ ÀÎÀÚ, ÀÌ°ÍÀ» ÅëÇØ ¾î¶² °ÍÀÌ¶óµµ Àü´ÞÇϱâ À§ÇØ Ä³½ºÆ®(

cast:Çüº¯È­ ¿¬»êÀÚ)¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.(*2)

°¢ÁÖ 2 ************************************************************************

ÀÌ°ÍÀº ¾ö¹ÐÇÏ°Ô µûÁöÀÚ¸é Á¤È®ÇÏÁö´Â ¾Ê´Ù. ¿¹¸¦ µé¸é ±¸Á¶Ã¼µîÀº Àü´ÞÇÒ ¼ö´Â ¾ø´Ù.

--- ±×·¯³ª, ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ Àü´Þ ÇÒ ¼ö´Â ÀÖ´Ù.

*******************************************************************************

ioctl ¹øÈ£´Â ÁÖ ÀåÄ¡ ¹øÈ£, ioctlÀÇ ÇüÅÂ, ¸í·É, ±×¸®°í ÀÎÀÚÀÇ ÇüÅ µîÀ» º¯È¯ÇÑ´Ù.

ioctl ¹øÈ£´Â Çì´õ ÆÄÀÏ¿¡ Á¤ÀÇµÈ º¸Åë ÇϳªÀÇ ¸ÅÅ©·Î È£Ãâ(_IO, _IOR, _IOW, _IOWR

-- ÇüÅ¿¡ ÀÇÁ¸ÀûÀÎ)¿¡ ÀÇÇØ ¸¸µé¾îÁø´Ù. ÀÌ Çì´õ ÆÄÀÏÀº ÀÌ¿ëµÇ´Â ioctl(ÀÌ·¸°Ô Çؾß

Á¢±ÙÇÒ ¼ö ÀÖ´Â ioctl ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù)°ú Ä¿³Î ¸ðµâ(ÀÌ°ÍÀÇ ÀÌÇظ¦ °¡´ÉÇÏ°Ô ÇÑ

´Ù) ¸ðµÎ¿¡ ÀÇÇØ #inlcudeµÇ¾î Æ÷ÇԵǾîÁ®¾ß ÇÑ´Ù. ¾Æ·¡ÀÇ ¿¹¿¡¼­, Çì´õ ÆÄÀÏÀº char-

dev,h¿Í ioctl.c¸¦ ÀÌ¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡ Æ÷ÇԵȴÙ. ÀÚ½ÅÀÇ Ä¿³Î ¸ðµâ¿¡ ioctlÀÇ ÀÌ¿ë

À» ¿øÇÑ´Ù¸é, ÀÌ°ÍÀº °¡Àå ÁÁÀº °ø½ÄÀûÀÎ ioctl ÁöÁ¤¹æ¹ýÀÌ´Ù, ÀÌ·¸°Ô ÇÔÀ¸·Î¼­ Çã°¡

µÇÁö ¾ÊÀº ´©±º°¡°¡ ¿ì¿¬È÷ ioctlÀÇ Á¦¾î¸¦ ¾òÀ¸¸é, À߸øµÈ °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù. »ó

¼¼ÇÑ Á¤º¸¸¦ ¿øÇϸé, Ä¿³Î ¼Ò½ºÀÇ `Documentation/ioctl- number.txt'À» ÂüÁ¶Ç϶ó.

 

<chardev.c>

 

/*

* chardev.c

* ÀÔ·Â/Ãâ·Â ¹®ÀÚ ÀåÄ¡ÀÇ »ý¼º

*/

 

/* Copyright (C) 1998-9 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ ¾È¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù.*/

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* ¹®ÀÚ ÀåÄ¡µéÀ» À§ÇØ */

/* ¹®ÀÚ ÀåÄ¡ÀÇ Á¤ÀǵéÀ» ¿©±â¿¡ */

#include <linux/fs.h>

 

/* wrapper.h´Â ÇöÀç¿¡´Â À¯¿ëÇÏÁö ¾Ê´Ù. ±×·¯³ª, ÇâÈÄÀÇ È£È¯¼ºÀ» À§ÇØ Ãß°¡ÇÑ´Ù. */

#include <linux/wrapper.h>

 

/* ÀÚ½ÅÀÇ ioctl ¹øÈ£µé */

#include "chardev.h"

 

/* ¹öÀü 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇϳª, 2.0.35¿¡¼­´Â

±×·¸Áö ¸øÇÏ´Ù. ±×·¡¼­ ÇÊ¿äÇÏ´Ù¸é ÀÌ°÷¿¡¼­ Ãß°¡ÇÑ´Ù. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

#include <asm/uaccess.h> /* get_user¿Í put_user¸¦ À§ÇØ */

#endif

 

#define SUCCESS 0

 

/* ÀåÄ¡ ¼±¾ð */

/* ÀåÄ¡¸¦ À§ÇÑ À̸§, /proc/devices¿¡ ³ªÅ¸³¯ °ÍÀÌ´Ù. */

#define DEVICE_NAME "char_dev"

 

/* ÀåÄ¡¸¦ À§ÇÑ ¸Þ½ÃÁöÀÇ ÃÖ´ë ±æÀÌ */

#define BUF_LEN 80

 

/* ÀåÄ¡ÀÇ ¿­±â°¡ ÀûÀýÇÑÁö - µ¿ÀÏÇÑ ÀåÄ¡¿¡ÀÇ µ¿½Ã Á¢±ÙÀ» ¸·±â À§ÇØ */

static int Device_Open = 0;

 

/* ¿äûµÉ ¶§ ÁÖ¾îÁö´Â ÀåÄ¡ ¸Þ½ÃÁö */

static char Message[BUF_LEN];

 

/* ¾ò¾îÁø ¸Þ½ÃÁö°¡ ¾ó¸¶³ª ¸Ö¸® Àִ°¡ - device_read·Î ¾ò¾îÁø ¸Þ½ÃÁö°¡ ¹öÆÛÀÇ Å©

±âº¸´Ù Ŭ ¶§ À¯¿ëÇÏ´Ù.*/

static char *Message_Ptr;

 

/* ÀåÄ¡ ÆÄÀÏÀ» ¿­·ÁÇÒ ¶§ ¾ðÁ¦µçÁö È£ÃâµÈ´Ù. */

static int device_open(struct inode *inode, struct file *file)

{

#ifdef DEBUG

printk ("device_open(%p)\n", file);

#endif

 

/* µ¿½Ã¿¡ µÎ°³ÀÇ ÇÁ·Î¼¼½º¿ÍÀÇ ´ëÈ­¸¦ ¿øÇÏÁö ¾Ê´Â´Ù. */

if (Device_Open) return -EBUSY;

 

/*

ÀÌ°ÍÀÌ ÇϳªÀÇ ÇÁ·Î¼¼½º¿´´Ù¸é, ´Ù¸¥ ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÀÌ°ÍÀ» Áõ°¡Çϱâ Àü¿¡

Device_OpenÀÌ ÀûÀýÇÏ°Ô ¼öÇàµÇ¾î¾ß Çϱ⠶§¹®¿¡, ÀÌ °÷¿¡¼­ ¸Å¿ì Á¶½ÉÇØ¾ß ÇÑ´Ù

 

±×·¯³ª, Ä¿³ÎÀÇ ³»ºÎ¿¡¼­, ÄÁÅؽºÆ® »çÀÌÀÇ ±³È¯Àº ¹æÁöµÈ´Ù.

 

ÀÌ°ÍÀº SMP±â°è¿¡¼­ ¼öÇàÇÒ ¶§ ÀûÀýÄ¡ ¸ø ÇÑ °á°ú¸¦ °¡Á®¿Â´Ù. SMP¿¡ ´ëÇؼ­´Â

³ªÁß¿¡ ´Ù·ê °ÍÀÌ´Ù.

*/

 

Device_Open++;

 

/* ¸Þ½ÃÁöÀÇ ÃʱâÈ­ */

Message_Ptr = Message;

 

MOD_INC_USE_COUNT;

 

return SUCCESS;

}

 

/* ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ ÀåÄ¡ ÆÄÀÏÀ» Á¾·áÇÒ ¶§ È£ÃâµÈ´Ù. Àý´ë ½ÇÆÐÇÒ ¼ö ¾ø±â¿¡

°á°ú °ªÀº ¾ø´Ù. ¹«¾ùÀÌ ÀϾµç °£¿¡, Ç×»ó ÀåÄ¡¸¦ Á¾·á°¡´ÉÇÏ°Ô ÇؾßÇÑ´Ù(2.0. 2.2

¿¡¼­ ÀåÄ¡ ÆÄÀÏÀº Á¾·á ºÒ°¡´ÉÇÒ ¼öµµ ÀÖ´Ù). */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static int device_release(struct inode *inode, struct file *file)

#else

static void device_release(struct inode *inode,struct file *file)

#endif

{

#ifdef DEBUG

printk ("device_release(%p,%p)\n", inode, file);

#endif

 

/* ´ÙÀ½ È£ÃâÀ» À§ÇÑ Áغñ */

Device_Open--;

 

MOD_DEC_USE_COUNT;

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return 0;

#endif

}

 

/* ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ ÀÌ¹Ì ¿­¸° ÀåÄ¡ ÆÄÀÏÀ» ÀÐÀ» ¶§ È£ÃâµÈ´Ù.*/

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_read(

struct file *file,

char *buffer, /* µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ ¹öÆÛ */

size_t length, /* ¹öÆÛÀÇ Å©±â */

loff_t *offset) /* ÆÄÀÏÀÇ »ó´ë À§Ä¡ */

#else

static int device_read(

struct inode *inode,

struct file *file,

char *buffer, /* µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ ¹öÆÛ */

int length) /* ¹öÆÛÀÇ Å©±â(ÀÌ Å©±â¸¦ ÃÊ°úÇؼ­ ¾²Áö ¸»°Í!) */

#endif

{

/* ½ÇÁ¦ ¹öÆÛ¿¡ ¾²¿©Áø µ¥ÀÌÅÍÀÇ °³¼ö */

int bytes_read = 0;

 

#ifdef DEBUG

printk("device_read(%p,%p,%d)\n", file, buffer, length);

#endif

 

/* ¸Þ½ÃÁöÀÇ ³¡À̶ó¸é, 0À» ¸®ÅÏ(ÆÄÀÏÀÇ ³¡À̶ó´Â Àǹ̷Î) */

if (*Message_Ptr == 0) return 0;

 

/* ½ÇÁ¦ ¹öÆÛ¿¡ ¾²¿©Áø µ¥ÀÌÅÍ */

while (length && *Message_Ptr)

{

/* ¹öÆÛ´Â Ä¿³Î µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®°¡ ¾Æ´Ñ »ç¿ëÀÚ µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¿¡ À§Ä¡ÇϹÇ

·Î, ¹öÆÛÀÇ ÇÒ´çÀÌ ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù. ´ë½Å¿¡, put_userÇÔ¼ö·Î¼­ Ä¿³Î µ¥

ÀÌÅÍ ¼¼±×¸ÕÆ®¿¡¼­ »ç¿ëÀÚ µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®·Î µ¥ÀÌÅ͸¦ º¹»çÇÑ´Ù.*/

put_user(*(Message_Ptr++), buffer++);

length --;

bytes_read ++;

}

 

#ifdef DEBUG

printk ("Read %d bytes, %d left\n", bytes_read, length);

#endif

 

/* Àбâ ÇÔ¼ö´Â ½ÇÁ¦ ¹öÆÛ¿¡ ±â·ÏµÈ °³¼ö¸¦ ¸®ÅÏÇÒ °ÍÀÌ´Ù.*/

return bytes_read;

}

 

/* ÀÌ ÇÔ¼ö´Â ÀåÄ¡ ÆÄÀÏ¿¡ ¾²·ÁÇÒ ¶§ È£ÃâµÈ´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_write(struct file *file,

const char *buffer,

size_t length,

loff_t *offset)

#else

static int device_write(struct inode *inode,

struct file *file,

const char *buffer,

int length)

#endif

{

int i;

 

#ifdef DEBUG

printk ("device_write(%p,%s,%d)", file, buffer, length);

#endif

for(i=0; i<length && i<BUF_LEN; i++)

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(Message[i], buffer+i);

#else

Message[i] = get_user(buffer+i);

#endif

 

Message_Ptr = Message;

 

/* ÀԷ¿¡ ÀÌ¿ëµÈ ¹®ÀÚÀÇ ¼ö¸¦ ¸®ÅÏ */

return i;

}

 

/* ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ ÀåÄ¡ ÆÄÀÏ»óÀÇ ioctlÀÛ¾÷À» ¼öÇàÇÒ ¶§ È£ÃâµÈ´Ù. µÎ°³ÀÇ ¿©

ºÐÀÇ ÀÎÀÚ(Ãß°¡ÇÏ¿© inode¿Í ÇÇÀÏ ±¸Á¶Ã¼, ¸ðµç ÀåÄ¡ ÇÔ¼öµéÀÌ ¾ò´Â)µéÀ» ¾ò°ÔµÈ´Ù:

È£ÃâµÈ ioctlÀÇ ¼ö¿Í ioctl¿¡ ÀÇÇØ ÁÖ¾îÁø ÀÎÀÚ.

 

ioctlÀÌ ¾²±â ȤÀº Àбâ/¾²±â(Ãâ·ÂÀº È£Ãâ ÇÁ·Î¼¼½º¿¡¼­ ¸®ÅϵȴÙ.)À̸é, ioctl È£Ãâ

Àº ÀÌ ÇÔ¼öÀÇ Ãâ·ÂÀ» ¸®ÅÏÇÑ´Ù.

*/

int device_ioctl(struct inode *inode,

struct file *file,

unsigned int ioctl_num, /* ioctlÀÇ ¹øÈ£ */

unsigned long ioctl_param) /* ioctlÀÇ ÀÎÀÚ */

{

int i;

char *temp;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

char ch;

#endif

 

/*ioctl È£Ãâ¿¡ ÀÇÇؼ­ ±³Ã¼ */

switch (ioctl_num)

{

case IOCTL_SET_MSG:

/* ¸Þ½ÃÁö(»ç¿ëÀÚ ¿µ¿ª)ÀÇ Æ÷ÀÎÅÍ ¼ö½Å, ±×¸®°í ÀåÄ¡ÀÇ ¸Þ½ÃÁö¸¦ ÁöÁ¤ */

/* ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÁÖ¾îÁø ioctlÀÇ ÀÎÀÚ¸¦ ¾ò´Â´Ù. */

temp = (char *) ioctl_param;

 

/* ¸Þ½ÃÁöÀÇ ±æÀ̸¦ ã´Â´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(ch, temp);

for (i=0; ch && i<BUF_LEN; i++, temp++) get_user(ch, temp);

#else

for (i=0; get_user(temp) && i<BUF_LEN; i++, temp++);

#endif

 

/* ¹ÙÄû¸¦ ´Ù½Ã ¹ß¸íÇÏÁö ¸»¶ó - device_writeÀÇ È£Ãâ */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

device_write(file, (char *)ioctl_param, i, 0);

#else

device_write(inode, file, (char *)ioctl_param, i);

#endif

break;

case IOCTL_GET_MSG:

/* È£ÃâµÈ ÇÁ·Î¼¼½º¿¡ ÇöÀç ¸Þ½ÃÁö¸¦ ÁØ´Ù - ÀÎÀÚ´Â Æ÷ÀÎÅÍÀÌ´Ù.¿©±â¸¦

ä¿ö¶ó. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

i = device_read(file, (char *)ioctl_param, 99, 0);

#else

i = device_read(inode, file, (char *)ioctl_param, 99);

#endif

/* ÁÖÀÇ - ¹öÆÛÀÇ ±æÀÌ°¡ 100ÀÓÀ» È®ÀÎÇ϶ó. ¹öÆÛÀÇ ¿À¹öÇ÷ο찡 »ý±â¸é

ÇÁ·Î¼¼½º´Â ÄÚ¾î ´ýÇÁ¸¦ ¾ß±âÇÑ´Ù. 99°³ÀÇ ¹®ÀÚ°¡ Çã¶ôµÇ±â¿¡ NULL Á¾

·á ¹®ÀÚ¸¦ À§ÇÑ ¿µ¿ªÀÌ ÇÊ¿äÇÏ´Ù.*/

/* ¹öÆÛÀÇ ¸¶Áö¸·¿¡ 0À» Ãß°¡Çϸé, ÀûÀýÇÑ Á¾·á°¡ µÉ °ÍÀÌ´Ù. */

put_user('\0', (char *) ioctl_param+i);

break;

case IOCTL_GET_NTH_BYTE:

/* ioctlÀÌ ÀÔ·Â(ioctl_param), Ãâ·Â(ÀÌ ÇÔ¼öÀÇ °á°ú°ª) µÑ ´ÙÀÇ ±â´ÉÀ»

°¡Áö¹Ç·Î */

return Message[ioctl_param];

break;

}

 

return SUCCESS;

}

 

/* ¸ðµâ ¼±¾ð */

/*

ÀÌ ±¸Á¶Ã¼´Â ÇÁ·Î¼¼½º°¡ ¸¸µç ÀåÄ¡¿¡¼­ ¹«¾ùÀΰ¡ ÇÏ·Á°í ÇÒ ¶§ ÇÔ¼öµéÀ» À¯ÁöÇϱâ À§

ÇØ È£ÃâµÈ´Ù. ÀÌ ±¸Á¶Ã¼¿¡¼­ÀÇ Æ÷ÀÎÅÍ´Â ÀåÄ¡ Å×ÀÌºí¿¡ À¯ÁöµÇ°í, init_module¿¡¼­ Áö

¿ª º¯¼ö·Î »ç¿ëµÇÁö ¾Ê´Â´Ù. NULLÀº ¾ÆÁ÷ ±â´ÉÀÌ Á¤ÀǵÇÁö ¾ÊÀº ÇÔ¼öµéÀº À§ÇÑ °ÍÀÌ´Ù

*/

struct file_operations Fops = {

NULL, /* ªO±â(seek) */

device_read,

device_write,

NULL, /* µð·ºÅ丮 Àбâ(readdir) */

NULL, /* select */

device_ioctl, /* ioctl */

NULL, /* mmap */

device_open,

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

NULL, /* flush */

#endif

device_release /* Á¾·á */

};

 

/* ¸ðµâÀÇ ÃʱâÈ­ - ¹®ÀÚ ÀåÄ¡ÀÇ µî·Ï */

int init_module()

{

int ret_val;

 

/* ¹®ÀÚ ÀåÄ¡ÀÇ µî·Ï (Àû¾îµµ ½Ãµµ´Â) */

ret_val = module_register_chrdev(MAJOR_NUM, DEVICE_NAME, &Fops);

 

/* À½¼öÀÇ °ªÀº ¿À·ù¸¦ ³ªÅ¸³½´Ù. */

if (ret_val < 0)

{

printk ("%s failed with %d\n",

"Sorry, registering the character device ",

ret_val);

return ret_val;

}

 

printk ("%s The major device number is %d.\n",

"Registeration is a success", MAJOR_NUM);

printk ("If you want to talk to the device driver,\n");

printk ("you'll have to create a device file. \n");

printk ("We suggest you use:\n");

printk ("mknod %s c %d 0\n", DEVICE_FILE_NAME,MAJOR_NUM);

printk ("The device file name is important, because\n");

printk ("the ioctl program assumes that's the\n");

printk ("file you'll use.\n");

 

return 0;

}

 

/* »èÁ¦ - /proc·ÎºÎÅÍ °ü°èµÈ ÆÄÀÏÀÇ µî·Ï »èÁ¦ */

void cleanup_module()

{

int ret;

 

/* ÀåÄ¡ÀÇ µî·Ï »èÁ¦ */

ret = module_unregister_chrdev(MAJOR_NUM, DEVICE_NAME);

 

/* ¿À·ùÀ̸é, Ç¥½ÃÇÑ´Ù. */

if (ret < 0)

printk("Error in module_unregister_chrdev: %d\n", ret);

}

 

<chardev.h>

 

/* chardev.h - ioctlÀÇ Á¤ÀǸ¦ À§ÇÑ Çì´õ ÆÄÀÏ.

*

* Ä¿³ÎÀÇ ¸ðµâ(chardev.c)°ú ioctlÀ» È£ÃâÇÏ´Â ÇÁ·Î¼¼½º(ioctl.c) µÑ ´Ù¿¡ ¾Ë·ÁÁ®¾ß

* ÇϹǷΠ¼±¾ðÀº Çì´õÆÄÀÏ¿¡ ÀÖ¾î¾ß ÇÑ´Ù.

*/

#ifndef CHARDEV_H

#define CHARDEV_H

#include <linux/ioctl.h>

 

/* ÁÖ ÀåÄ¡ ¹øÈ£. ioctlÀÌ ÀÌ°ÍÀ» ¾Ë ÇÊ¿ä°¡ Àֱ⠶§¹®¿¡, µ¿ÀûÀÎ µî·ÏÀº ´õÀÌ»ó ½Å·Ú

ÇÒ ¼ö ¾ø´Ù. */

#define MAJOR_NUM 100

 

/* ÀåÄ¡ µå¶óÀ̹öÀÇ ¸Þ½ÃÁö ÁöÁ¤ */

#define IOCTL_SET_MSG _IOR(MAJOR_NUM, 0, char *)

 

/* _IORÀº »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡¼­ Ä¿³Î ¸ðµâ±îÁö Á¤º¸¸¦ Àü´ÞÇϱâ À§ÇÑ ioctl ¸í·ÉÀÇ °³

* ¼ö¸¦ ¸¸µç´Ù´Â °ÍÀÌ´Ù.

*

* ù ¹ø° ÀÎÀÚµéÀº, MAJOR_NUM, ÀÌ¿ëÇÏ´Â ÁÖ ÀåÄ¡ ¹øÈ£ÀÌ´Ù.

*

* µÎ ¹ø° ÀÎÀÚ´Â ¸í·ÉÀÇ °³¼öÀÌ´Ù.

* (¿©·¯ °¡ÁöÀÇ ´Ù¸¥ Àǹ̸¦ ÇÔ²² °¡Áø´Ù)

*

* ¼¼ ¹ø° ÀÎÀÚ´Â ÇÁ·Î¼¼½º¿¡¼­ Ä¿³Î·ÎºÎÅÍ ¾ò±â ¿øÇÏ´Â µ¥ÀÌÅÍÀÇ ÇüÅÂÀÌ´Ù.

*/

 

/* ÀåÄ¡ µå¶óÀ̹öÀÇ ¸Þ½ÃÁö ¾ò±â */

#define IOCTL_GET_MSG _IOR(MAJOR_NUM, 1, char *)

/* ÀÌ IOCTLÀº ÀåÄ¡ µå¶óÀ̹öÀÇ ¸Þ½ÃÁö¸¦ ¾ò±â À§ÇÑ Ãâ·ÂÀ» À§ÇØ ÀÌ¿ëµÈ´Ù. ±×·¯³ª,

ÀÔ·ÂÇϱâÀ§ÇØ ÀÌ ¸Þ½ÃÁö¸¦ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÇÒ´çµÈ ¹öÆÛ¿¡ ¿©ÀüÈ÷ À¯ÁöÇÒ ÇÊ¿ä°¡

ÀÖ´Ù. */

 

/* ¸Þ½ÃÁöÀÇ n¹ø° ³»¿ëÀ» ¾ò±â */

#define IOCTL_GET_NTH_BYTE _IOWR(MAJOR_NUM, 2, int)

/* ÀÌ IOCTLÀº ÀÔ/Ãâ·Â µÑ ´Ù¿¡ ÀÌ¿ëµÈ´Ù. »ç¿ëÀڷκÎÅÍ n¹ø°ÀÇ ÇϳªÀÇ ¼ö¸¦ ¼ö½ÅÇÏ

°í, Message[n]À» ¸®ÅÏÇÑ´Ù. */

 

/* ÀåÄ¡ ÆÄÀÏÀÇ À̸§ */

#define DEVICE_FILE_NAME "char_dev"

#endif

 

 

<ioctl.c>

 

/* ioctl.c - Ä¿³Î ¸ðµâÀÇ ioctlÀ» Á¦¾îÇϱâ À§ÇÑ ÇÁ·Î¼¼½º.

*

* ÀÌÁ¦ ÀÔ/Ãâ·ÂÀ» À§ÇØ catÀ» ÀÌ¿ëÇÒ °ÍÀÌ´Ù. ±×·¯³ª, Áö±ÝÀº ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º¿¡ ¾²±â

* °¡ ¿ä±¸µÇ¾î, ioctlÀÌ ÇÊ¿äÇÏ´Ù.

*/

 

/* Copyright (C) 1998 by Ori Pomerantz */

/* ÀåÄ¡ÀÇ ±Ô°Ýµé, ioctl ¹øÈ£¿Í ÁÖ ÀåÄ¡ ÆÄÀÏµé °°Àº */

#include "chardev.h"

#include <fcntl.h> /* ¿­±â */

#include <unistd.h> /* Á¾·á */

#include <sys/ioctl.h> /* ioctl */

 

/* ioctl È£ÃâÀ» À§ÇÑ ÇÔ¼ö */

ioctl_set_msg(int file_desc, char *message)

{

int ret_val;

 

ret_val = ioctl(file_desc, IOCTL_SET_MSG, message);

if (ret_val < 0)

{

printf ("ioctl_set_msg failed:%d\n", ret_val);

exit(-1);

}

}

 

ioctl_get_msg(int file_desc)

{

int ret_val;

char message[100];

 

/*

ÁÖÀÇ - Ä¿³Î¿¡ ¾î´À Å©±âÀÇ ¹öÆÛ¸¦ ¾µÁö ¸»ÇÏÁö ¾Ê¾Ò±â¿¡ À§ÇèÇÏ´Ù. ÀÌ°ÍÀº ¿À¹ö

Ç÷ο츦 ¾ß±âÇÒ ¼öµµ ÀÖ´Ù. ½ÇÁ¦ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­´Â, µÎ °³ÀÇ ioctlÀ» ÀÌ¿ëÇÑ

´Ù - Çϳª´Â Ä¿³Î¿¡ ¹öÆÛÀÇ Å©±â¸¦ ¾Ë¸®°í ´Ù¸¥ Çϳª´Â ÀÌ ¹öÆÛ¸¦ ÀÌ¿ëÇÑ´Ù.

*/

ret_val = ioctl(file_desc, IOCTL_GET_MSG, message);

if (ret_val < 0)

{

printf ("ioctl_get_msg failed:%d\n", ret_val);

exit(-1);

}

 

printf("get_msg message:%s\n", message);

}

 

ioctl_get_nth_byte(int file_desc)

{

int i;

char c;

 

printf("get_nth_byte message:");

i = 0;

while (c != 0)

{

c = ioctl(file_desc, IOCTL_GET_NTH_BYTE, i++);

if (c < 0)

{

printf("ioctl_get_nth_byte failed at the %d'th byte:\n", i);

exit(-1);

}

putchar(c);

}

 

putchar('\n');

}

 

/* Main - ioctl ÇÔ¼ö¸¦ È£Ãâ */

main()

{

int file_desc, ret_val;

 

char *msg = "Message passed by ioctl\n";

file_desc = open(DEVICE_FILE_NAME, 0);

if (file_desc < 0)

{

printf ("Can't open device file: %s\n", DEVICE_FILE_NAME);

exit(-1);

}

 

ioctl_get_nth_byte(file_desc);

ioctl_get_msg(file_desc);

ioctl_set_msg(file_desc, msg);

 

close(file_desc);

}

 

Á¦ 6 Àå

 

Ãʱ⠺¯¼öµé

 

¸¹Àº ÀÌÀüÀÇ ¿¹Á¦µé¿¡¼­, Ä¿³Î ¸ðµâ°ú ¹ÐÂøµÈ, /proc ÆÄÀÏÀ» À§ÇÑ ÆÄÀÏ À̸§ ¶Ç´Â Àå

Ä¡¸¦ À§ÇÑ ÁÖ ÀåÄ¡ ¹øÈ£µîÀ» ´Ù·ç°í ioctl¿¡ À̸¦ Àû¿ëÇß´Ù. ÀÌ´Â À¯´Ð½º¿Í ¸®´ª½º¿¡

¼­ À¯¿¬ÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇØ »ç¿ëÀÚ°¡ ÃÖÀûÈ­¸¦ °¡´ÉÇÏ°Ô Çϵµ·Ï Çϴ öÇп¡

»óÃæµÈ´Ù. ¸í·ÉÇà ÀÎÀÚ¿¡ ÀÇÇØ ÀÛ¾÷À» Çϱâ Àü¿¡ ÇÁ·Î±×·¥ ¶Ç´Â Ä¿³Î¿¡ ¾Ë¸®´Â ¹æ¹ýÀÌ

ÇÊ¿äÇÏ´Ù. Ä¿³Î ¸ðµâÀÇ °æ¿ì¿¡¼­´Â, argc¿Í argvÀÇ ÀÎÀÚ¸¦ ¾òÁö ¸øÇÑ´Ù---´ë½Å¿¡, ´õ

ÁÁÀº °ÍÀ» ¾ò´Â´Ù. Ä¿³Î ¸ðµâ ¾È¿¡ Àü¿ªº¯¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ °¡´ÉÇÏ°í, insmod´Â ÀÌ

µé º¯¼ö¿¡ °ªÀ» ÁöÁ¤ÇÒ °ÍÀÌ´Ù. ÀÌ Ä¿³Î ¸ðµâ¿¡¼­, µÎ °¡Áö¸¦ Á¤ÀÇÇÑ´Ù; str1¿Í str2.

ÇÊ¿ä·Î ÇÏ´Â ¸ðµç ÀÏÀÌ Ä¿³Î ¸ðµâ·Î ÄÄÆÄÀÏ µÇ°í, insmod str1=xxx¿Í str2=yyy¸¦ ½ÇÇà

ÇÑ´Ù. init_moduleÀÌ È£ÃâµÇ¸é, str1Àº ¹®ÀÚ¿­ xxx·Î str2´Â ¹®ÀÚ¿­ yyy·Î ÁöÁ¤µÈ´Ù.

¹öÀü 2.0¿¡¼­ À̵é ÀÎÀÚ´Â ¾Æ¹«·± Çü°Ë»çµµ(*1) ¹ÞÁö ¾Ê´Â´Ù. str1¿Í str2ÀÇ Ã¹ ¹ø°

¹®ÀÚ°¡ ¼ýÀÚÀ̸é Ä¿³ÎÀº ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍ°¡ ¾Æ´Ñ integerÀÇ °ªÀ» º¯¼ö¿¡ ´ëÀÔÇÒ °ÍÀÌ

´Ù. ½ÇÁ¦ Àû¿ëµÇ´Â »óȲ¿¡¼­´Â À̸¦ °Ë»çÇØ¾ß ÇÑ´Ù. ÇÑÆí ¹öÀü 2.2¿¡¼­ ¸ÅÅ©·Î MACRO-

_PARMÀÌ insmod¿¡ ÀÎÀÚµéÀÇ À̸§°ú ÇüÅ µîÀ» ¾Ë¸®±â À§ÇØ ÀÌ¿ëµÈ´Ù. ¿¹¸¦ µé¸é, ÀÌ°Í

Àº ÀÚ·áÇüÀÇ ¹®Á¦¿Í Ä¿³Î ¸ðµâÀÌ ¼ýÀÚ¿Í ÇÔ²² ½ÃÀÛÇÏ´Â ¹®ÀÚ¿­ÀÇ ¼ö½ÅÀ» Çã°¡ÇÏ´Â ¹®

Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.

 

°¢ÁÖ1 *************************************************************************

CÀÇ ¸ñÀûÄڵ尡 ÀÚ·áÇüÀÌ ¾Æ´Ñ ´ÜÁö Àü¿ªº¯¼öµéÀÇ À§Ä¡¸¸À» °¡Áö¹Ç·Î, ÀÌ´Â ºÒ°¡´ÉÇÏ

´Ù. ÀÌ°ÍÀÌ Çì´õ ÆÄÀÏÀÌ ÇÊ¿äÇÑ ÀÌÀ¯ÀÌ´Ù.

*******************************************************************************

 

<param.c>

/*

* ¸ðµâÀÇ ¼³Ä¡ ½Ã¿¡ ¸í·ÉÇà ÀÎÀÚµéÀ» ¼ö½Å

*/

 

/* Copyright (C) 1998-9 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õµé */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇà */

#include <linux/module.h> /* Ưº°È÷, ÇϳªÀÇ ¸ðµâ */

 

/* CONFIG_MODVERSIONSÀÇ ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

#include <stdio.h> /* NULLÀÌ ÇÊ¿äÇÏ´Ù */

 

/* 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ À̸¦ À§ÇÑ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, 2.0.35¿¡¼­´Â Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ°÷¿¡ Ãß°¡ÇÑ´Ù.*/

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

/* Emmanuel Papirakis:

*

* ÀÎÀÚÀÇ À̸§Àº ÀÌÁ¦(2.2¿¡¼­) ¸ÅÅ©·Î·Î ´Ù·ç¾îÁø´Ù.

* Ä¿³ÎÀº ½É¹ú À̸§À» ÀÌ°ÍÀÌ ´Ü Çѹø »ç¿ëµÇ±â¿¡ ¸ÅÅ©·Î È®ÀåÇÏÁö ¾Ê´Â´Ù.

*

* ¸ðµâ¿¡ ÀÎÀÚ¸¦ Àü´ÞÇϱâ À§ÇØ, include/linux/modules.h(line 176)¿¡ Á¤ÀÇµÈ ¸ÅÅ©·Î

¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ÀÌ ¸ÅÅ©·Î´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ ÃëÇÑ´Ù. ÀÎÀÚÀÇ À̸§°ú ÀÚ·áÇü. ÀÌ ÀÚ

·áÇüÀº °ã µû¿ÈÇ¥(")ÀÌ´Ù. ¿¹¸¦ µé¸é, "i"´Â Á¤¼öÀÚ·áÇüÀÌ°í "s"´Â ¹®ÀÚ¿­ÀÌ´Ù.

*/

char *str1, *str2;

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

MODULE_PARM(str1, "s");

MODULE_PARM(str2, "s");

#endif

 

/* ÃʱâÈ­ ¸ðµâ - ÀÎÀÚµéÀ» º¸¶ó */

int init_module()

{

if (str1 == NULL || str2 == NULL)

{

printk("Next time, do insmod param str1=<something>");

printk("str2=<something>\n");

}

else

printk("Strings:%s and %s\n", str1, str2);

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

printk("If you try to insmod this module twice,");

printk("(without rmmod'ing\n");

printk("it first), you might get the wrong");

printk("error message:\n");

printk("'symbol for parameters str1 not found'.\n");

#endif

 

return 0;

}

 

/* »èÁ¦ */

void cleanup_module()

{

}

 

Á¦ 7 Àå

 

½Ã½ºÅÛ È£Ãâ

 

ÀÚ ÀÌÁ¦. °Ü¿ì /proc ÆÄÀÏ°ú ÀåÄ¡ 󸮱âÀÇ µî·Ï ÀýÂ÷¸¦ ¾Ë°ÔµÇ¾ú´Ù. ´ç½ÅÀÌ Ä¿³Î ÇÁ

·Î±×·¡¸Ó·Î¼­ ¿øÇÏ´Â °ÍÀ», ÀåÄ¡ µå¶óÀ̹öÀÇ ÀÛ¼º µûÀ§, ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, ¹«¾ð°¡

ºñÁ¤»óÀûÀÎ °æ¿ì¿¡¼­´Â ¾î¶»°Ô Çؾß, ¾î¶² ¹æ¹ýÀ¸·Î ½Ã½ºÅÛÀÇ µ¿ÀÛÀ» º¯°æÇÒ ¼ö ÀÖÀ»

±î?.

 

ÀÌ°ÍÀÌ Ä¿³Î ÇÁ·Î±×·¡¹Ö¿¡¼­ À§Çè¿¡ óÇÏ´Â ºÎºÐÀÌ´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¿¡¼­, ³ª´Â open ½Ã

½ºÅÛ È£ÃâÀ» °­Á¦·Î Á¾·á½ÃÄ×´Ù. ÀÌ´Â ¾î¶² ÆÄÀϵµ ¿­ ¼ö ¾øÀ¸¸ç, ¾î¶² ÇÁ·Î±×·¥µµ ½Ç

ÇàÇÒ ¼ö ¾ø´Ù´Â ¶æÀ̸ç, ÄÄÇ»Å͸¦ ¼Ë´Ù¿îÇÏÁöµµ ¸øÇÏ°Ô µÈ´Ù. °á±¹Àº Àü¿ø ½ºÀ§Ä¡¸¦

³»·Á¾ß ÇÑ´Ù. ¾Æ¹« ÆÄÀϵµ ¼Õ»óµÇÁö ¾ÊÀ¸¸é ¿îÀÌ ÁÁÀº °ÍÀÌ´Ù. ¾î¶² ÆÄÀϵµ ÀÒÁö ¾Êµµ

·Ï Çϱâ À§ÇØ, insmod¿Í rmmod¸¦ ½ÇÇàÇϱâ Àü¿¡ sync¸í·ÉÀ» ½ÇÇàÇÏ´Â ÁÁ´Ù.

/proc¿Í ÀåÄ¡ ÆÄÀϵéÀº ÀÏ´Ü Àؾî¶ó. ±×µéÀº ´ÜÁö »ç¼ÒÇÑ °ÍµéÀÌ´Ù. Ä¿³Î Åë½Å ÀýÂ÷¿¡

¼­ÀÇ ½ÇÁ¦ ÇÁ·Î¼¼½º´Â, ¸ðµç ÇÁ·Î¼¼½ºµé¿¡ ÀÇÇØ Çϳª¸¸ ÀÌ¿ëµÇ´Â, ½Ã½ºÅÛ È£ÃâÀÌ´Ù.

ÇÁ·Î¼¼½º°¡ Ä¿³Î·ÎºÎÅÍ ¼­ºñ½º¸¦ ¿äû ¹ÞÀ¸¸é(ÆÄÀÏÀÇ ¿­±â, »õ·Î¿î ÇÁ·Î¼¼½ºÀÇ »ý¼º,

´õ ¸¹Àº ¸Þ¸ð¸®ÀÇ ¿ä±¸µî), ÀÌ ¶§ ÀÌ·¯ÇÑ ÀýÂ÷°¡ ÀÌ¿ëµÈ´Ù. ÀÛ¾÷ Áß¿¡ Ä¿³ÎÀÇ µ¿ÀÛÀ»

º¯°æÇÏ±æ ¿øÇϸé, ÀÌ·¯ÇÑ Àϵµ ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í, ÇÁ·Î±×·¥¿¡¼­ ½ÇÇàµÇ´Â ÇÁ·Î¼¼½º

°¡ ¾î¶² °ÍÀÎÁö ¾Ë±â ¿øÇϸé, strace <command> <arguments>¸¦ ½ÇÇàÇ϶ó.

ÀϹÝÀûÀ¸·Î, ÇÁ·Î¼¼½º´Â Ä¿³Î¿¡ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï µÇ¾îÀÖ´Ù. Ä¿³Î ¸Þ¸ð¸®ÀÇ Á¢±ÙÀº

ºÒ°¡´ÉÇϸç Ä¿³ÎÇÔ¼öÀÇ È£Ãâµµ ºÒ°¡´ÉÇÏ´Ù. CPUÀÇ Çϵå¿þ¾î¿¡¼­ °­Á¦·Î ÀÌ·¯ÇÑ ÀÏÀ»

±ÝÁöÇÑ´Ù(ÀÌ°ÍÀÌ 'º¸È£ ¸ðµå'¸¦ È£ÃâÇÏ´Â ÀÌÀ¯ÀÌ´Ù). ½Ã½ºÅÛ È£ÃâÀº ÀÌ·¯ÇÑ ÀϹÝÀûÀÎ

±ÔÄ¢¿¡¼­ ¿¹¿ÜÀÇ °æ¿ìÀÌ´Ù. ·¹Áö½ºÅÍ¿¡ ÀûÀýÇÑ ¾î¶² °ªÀ» ä¿ö ÇÁ·Î¼¼½º¿¡ Àü´ÞÇϰųª

, Ưº°ÇÑ ¸í·ÉÀÌ Ä¿³Î³»ÀÇ ÀÌ¹Ì Á¤ÀÇµÈ À§Ä¡¿¡¼­ ºÐ±âÇϵµ·Ï ÇÏ´Â ÀÏÀÌ ¹ß»ýÇÑ´Ù.(¹°

·Ð, ±× À§Ä¡´Â »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ Àд °ÍÀÌ °¡´ÉÇϸç, ±×·¯³ª, ¾²´Â °ÍÀº ºÒ°¡

´ÉÇÏ´Ù). ÀÎÅÚ CPUÇÏ¿¡¼­ ÀÌ°ÍÀº ÀÎÅÍ·´Æ® 0x80¿¡ ÀÇÇØ ¼öÇàµÈ´Ù. Çϵå¿þ¾î´Â ÀÌ À§Ä¡

¿¡ ´ÜÁö Çѹø ºÐ±âÇÏ´Â °ÍÀ» ¾Ë¸ç, »ç¿ëÀÚ ¸ðµå¿¡¼­ ´õÀÌ»óÀÇ ½ÇÇàÀº Á¦ÇѵȴÙ. ±×·¯

³ª ½Ã½ºÅÛ Ä¿³Î¿¡¼­´Â ´Ù¸£´Ù -- ±×·¡¼­ ´ç½ÅÀÌ ¿øÇÏ´ø ÀÏÀ» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. Ä¿³Î¿¡

¼­ ÇÁ·Î¼¼½ºÀÇ À§Ä¡·Î ºÐ±âÇÏ´Â °ÍÀº ½Ã½ºÅÛ È£Ãâ·Î¼­ °¡´ÉÇÏ´Ù. ½Ã½ºÅÛ È£Ãâ ¹øÈ£¿¡

ÀÇÇÑ À§Ä¡¸¦ °Ë»çÇÏ°í, Ä¿³Î¿¡ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ¿äûµÈ ¼­ºñ½º°¡ ¹«¾ùÀÎÁö ¾Ë¸°´Ù. ÀÌ

¶§, È£ÃâµÈ Ä¿³ÎÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ¾Ë±â À§ÇØ ½Ã½ºÅÛ È£Ãâ Å×À̺í(sys_call_table)À» ¾Ë¾Æ

º»´Ù. ÀÌÈÄ ÇÔ¼ö¸¦ È£ÃâÇÏ°í, ¸î °¡Áö ½Ã½ºÅÛ °Ë»ç ÈÄ, ÇÁ·Î¼¼½º¿¡ °á°ú °ªÀ» ¸®ÅÏÇÑ

´Ù(¶Ç´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡, ÇÁ·Î¼¼½º ½Ã°£ÀÌ Á¾·áµÇ¸é). ÀÌ Äڵ带 Àб⠿øÇÑ´Ù¸é, ÀÌ

¼Ò½º´Â arch/architecture/kernel/entry.SÀÇ ENTRY(½Ã½ºÅÛ È£Ãâ)ÀÌÈÄÀÇ ÇàÀ» ÀÐ¾î º¸

¶ó.

 

½Ã½ºÅÛ È£ÃâÀÇ ÀÛ¾÷À» º¯°æÇÏ·Á¸é, ÇÔ¼ö¸¦ Á¶±Ý ¼öÁ¤ÇÏ´Â ÀÏÀÌ ÇÊ¿äÇϸç(º¸ÅëÀº ¾à°£

ÀÇ Äڵ带 Ãß°¡ÇÏ°í. ¿ø·¡ÀÇ ÇÔ¼ö¸¦ È£Ãâ), sys_call_table¿¡¼­ ÁöÁ¤µÈ ÇÔ¼öÀÇ Æ÷ÀÎÅÍ

¸¦ º¯°æÇÑ´Ù. ³ªÁß¿¡ Áö¿ì°Å³ª ºÒ¾ÈÁ¤ÇÑ »óÅ¿¡¼­ ½Ã½ºÅÛÀ» Á¾·áÇϱ⠿øÇÏÁö ¾ÊÀ¸¹Ç·Î

, cleanup_module¿¡¼­ ¿ø·¡ÀÇ Å×À̺í À§Ä¡·Î µÇµ¹¸®´Â ÀÏÀÌ ¸Å¿ì Áß¿äÇÏ´Ù. ¿©±âÀÇ ¼Ò

½º Äڵ尡 ÀÌ·¯ÇÑ Ä¿³Î ¸ðµâÀÇ ¿¹ÀÌ´Ù. ¿ì¸®´Â Á¤»óÀÇ »ç¿ëÀÚ¸¦ °üÂû('spy')ÇÏ±æ ¿øÇÏ

°í, »ç¿ëÀÚ°¡ ÆÄÀÏÀ» ¿­ ¶§ printk ¸Þ½ÃÁö¸¦ ³ªÅ¸³ª±æ ¿øÇÑ´Ù. °á·ÐÀ» ¸»Çϸé, ÀÚ½ÅÀÇ

ÇÔ¼ö¿Í ÇÔ²² ÆÄÀÏÀ» ¿©´Â ½Ã½ºÅÛ È£ÃâÀ» ´ëÄ¡ÇÏ´Â, our_sys_openÀÌ È£ÃâµÈ´Ù. ÀÌ ÇÔ¼ö

´Â ÇöÀç ÇÁ·Î¼¼½ºÀÇ uid(»ç¿ëÀÚ id)¸¦ °Ë»çÇÏ°í, °üÂû ´ë»óÀÇ uid¿Í ÀÏÄ¡Çϸé, printk

¸¦ È£ÃâÇÏ¿© ¿­·ÁÁø ÆÄÀÏÀÇ À̸§À» Ç¥½ÃÇÑ´Ù. ±×¶§, ¾î´ÀÂÊÀ̵ç. µ¿ÀÏÇÑ ¸Å°³º¯¼ö¿Í

ÇÔ²² ¿ø·¡ÀÇ openÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÆÄÀÏÀ» ½ÇÁ¦·Î ¿­ ¼ö ÀÖ´Ù.

 

init_module ÇÔ¼ö´Â sys_call_table³»ÀÇ ÀûÀýÇÑ À§Ä¡·Î ´ëÄ¡µÇ°í º¯¼ö³»ÀÇ ¿ø Æ÷ÀÎÅÍ

´Â À¯ÁöµÈ´Ù. cleanup_module ÇÔ¼öÀÇ ¸ðµç º¯¼ö´Â Æò»ó½ÃÀÇ »óÅ·ΠµÇµ¹·ÁÁø´Ù. ÀÌ·¯

ÇÑ Á¢±ÙÀº µ¿ÀÏÇÑ ½Ã½ºÅÛ È£Ãâ·Î µÎ°³ÀÇ Ä¿³Î ¸ðµâÀÇ º¯°æ °¡´É¼º ¶§¹®¿¡ À§ÇèÇÏ´Ù.

µÎ °³ÀÇ Ä¿³Î ¸ðµâ A¿Í B¸¦ °¡Áø´Ù°í »ý°¢Çغ¸ÀÚ. A´Â A_openÀ» B´Â B_open¸¦ ½Ã½ºÅÛ

È£ÃâÇÑ´Ù. ÀÌÁ¦, A´Â Ä¿³Î¿¡ Ãß°¡µÇ¾úÀ¸¸ç, ½Ã½ºÅÛ È£ÃâÀº A_open¸¦ ´ëÄ¡ÇÏ°í, È£ÃâÀÌ

¿Ï·áµÉ ¶§ ¿ø·¡ÀÇ sys_openÀÌ È£ÃâµÉ °ÍÀÌ´Ù. ´ÙÀ½À¸·Î, B°¡ Ä¿³Î¿¡ Ãß°¡µÈ´Ù. ½Ã½ºÅÛ

È£Ãâ¿¡ ÀÇÇØ B_openÀÌ ´ëÄ¡µÇ°í, ¿Ï·áµÉ ¶§, A_open, ¿ø·¡ÀÇ ½Ã½ºÅÛ È£ÃâÀÌ ¹«¾ùÀÎÁö

¸¦ »ý°¢ÇÒ °ÍÀÌ´Ù.

 

Áö±Ý, B°¡ ù ¹ø°·Î Á¦°ÅµÇ¸é, ¸ðµç °ÍÀÌ Á¤»óÀÌ´Ù -- ÀÌ°ÍÀº ´Ü¼øÈ÷ ¿ø·¡ÀÇ È£ÃâÀÎ

A_open½Ã½ºÅÛ È£Ãâ·Î Àç ÀûÀçµÉ °ÍÀÌ´Ù, ±×·¯³ª, A°¡ Á¦°ÅµÇ°í, B°¡ Á¦°ÅµÇ¸é, ½Ã½ºÅÛ

Àº °íÀåÀ» ÀÏÀ¸Å²´Ù. AÀÇ Á¦°Å´Â ¿ø·¡ÀÇ ½Ã½ºÅÛ È£Ãâ Àç ÀûÀçÇÏ°í, sys_open, ·çÇÁÀÇ

¹ÛÀ¸·Î B¸¦ ¹Ð¾î³½´Ù. À̶§, B°¡ Á¦°ÅµÇ¾úÀ¸¸é, ¿ø·¡ÀÇ È£ÃâÀ̶ó°í »ý°¢ÇÑ °ÍÀ», ´õÀÌ

»ó ¸Þ¸ð¸®¿¡ Á¸ÀçÇÏÁö ¾Ê´Â, A_open, ½Ã½ºÅÛ È£ÃâÇÏ¿© Àç ÀûÀçÇÑ´Ù. ¿ì¼±, ÀÌ Æ¯º°ÇÑ

¹®Á¦¸¦ ÇØ°áÇÏ°í, ´õÀÌ»ó ¾ÇÈ­½ÃÅ°Áö ¾Ê±â À§ÇØ ½Ã½ºÅÛ È£ÃâÀÌ openÇÔ¼ö¿Í µ¿ÀÏÇϸé

±×¸®°í ÀüÇô º¯°æµÇÁö ¾Ê¾Ò(±×·¡¼­ B°¡ Á¦°ÅµÇ¾úÀ» ¶§ ½Ã½ºÅÛÈ£ÃâÀ» º¯°æÇÏÁö ¾Ê¾Ò´Ù)

´Â Áö °Ë»ç¸¦ ÇؾßÇÒ °ÍÀÌ´Ù. A°¡ Á¦°ÅµÇ¾úÀ» ¶§, ÀÌ°ÍÀº ½Ã½ºÅÛ È£ÃâÀÌ B_openÀ¸·Î

º¯°æµÇ¾úÀ½À» ±×·¡¼­ ´õÀÌ»ó A_openÀ» °¡¸®Å°Áö ¾ÊÀ½À» º¸¿©ÁÖ¸ç, ÀÌ°ÍÀÌ ¸Þ¸ð¸®·ÎºÎ

ÅÍ Á¦°ÅµÇ±â Àü¿¡´Â sys_open¿¡ ÀÇÇØ Àç ÀûÀçµÇÁö ¾Ê´Â´Ù. ºÒÇàÈ÷µµ, B_openÀº ¿©ÀüÈ÷

´õÀÌ»ó ¾Æ¹« °Íµµ ¾ø´Â °÷À¸·Î A_openÀ» È£ÃâÇÏ·Á°í ½ÃµµÇϸç, µû¶ó¼­ ½Ã½ºÅÛÀº BÀÇ

Á¦°Å ¾øÀ̵µ °íÀåÀ» ÀÏÀ¸Å°°Ô µÈ´Ù.

 

ÀÌ·¯ÇÑ ¹®Á¦¸¦ ¸·´Â ¹æ¹ýÀº µÎ °¡Áö ¹æ¹ýÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. ù ¹ø°´Â, sys_open

¿¡ÀÇÇØ È£ÃâµÈ ¿ø·¡ÀÇ °ªÀ» Àç ÀûÀçÇÏ´Â °ÍÀÌ´Ù. ºÒÇàÈ÷µµ, sys_openÀº /proc/ksyms³»

ÀÇ Ä¿³Î ½Ã½ºÅÛÀÇ ºÎºÐÀÌ ¾Æ´Ï¸ç, ÀÌ°Í¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Ù. ´Ù¸¥ ÇϳªÀÇ ¹æ¹ýÀº ·çÆ®°¡

Çѹø ÀûÀçµÈ ¸ðµâÀ» Á¦°ÅÇÏ´Â °ÍÀ» ¸·±â À§ÇØ ÂüÁ¶ Ä«¿îÅ͸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº

½ÇÁ¦ÀÇ ¸ðµâ¿¡¼­´Â ÀûÇÕÇϳª, ¿©±â¼­ÀÇ ¿¹·Î´Â ÀûÇÕÇÏÁö ¾Ê´Ù --- ÀÌ°ÍÀÌ ¿©±â¼­ ÀÌ·¯

ÇÑ ÀÏÀ» ÇÏÁö ¾Ê´Â ÀÌÀ¯ÀÌ´Ù.

 

<syscall.c>

/* syscall.c

*

* ½Ã½ºÅÛ È£Ãâ "ÈÉÃÄ¿Â" ¿¹Á¦

*/

 

/* Copyright (C) 1998 - by Ori Pomerantz */

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ÇÑ´Ù. */

#include <linux/module.h> /* Ưº°È÷, ¸ðµâ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

#include <sys/syscall.h> /* ½Ã½ºÅÛ È£ÃâÀÇ ¸ñ·Ï */

 

/* ÇöÀç(ÇÁ·Î¼¼½º)ÀÇ ±¸Á¶Ã¼¸¦ À§ÇØ, ÇöÀç »ç¿ëÀÚ°¡ ´©±¸ÀÎÁö ¾Ë ÇÊ¿ä°¡ ÀÖ´Ù */

#include <linux/sched.h>

 

/* 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ À̸¦ À§ÇÑ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, 2.0.35¿¡¼­´Â Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ°÷¿¡ Ãß°¡ÇÑ´Ù.*/

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

#include <asm/uaccess.h>

#endif

 

/* ½Ã½ºÅÛ È£Ãâ Å×À̺í(ÇÔ¼öµéÀÇ Å×À̺í), ÀÌ°ÍÀº ¿ÜºÎ½ÇÇàÀ¸·Î Á¤ÀÇÇϸç Ä¿³ÎÀº ins-

mod¸¦ ÇÒ ¶§ ÀÌ°ÍÀ» ä¿ï °ÍÀÌ´Ù. */

extern void *sys_call_table[];

 

/* ¾Ë¾Æº¸±â ¿øÇÏ´Â UID - ¸í·É ÇàÀ¸·ÎºÎÅÍ ÁöÁ¤µÈ´Ù. */

int uid;

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

MODULE_PARM(uid, "i");

#endif

 

/* ¿ø ½Ã½ºÅÛ È£Ãâ¿¡¼­ ÁöÁ¤µÈ Æ÷ÀÎÅÍ. È£ÃâµÈ ¿ø·¡ÀÇ ÇÔ¼ö(sys_open)º¸´Ù ÀÌ°ÍÀ» À¯

ÁöÇؾßÇÏ´Â ÀÌÀ¯´Â ´©±º°¡ ¸ÕÀú ½Ã½ºÅÛ È£ÃâÀ» ´ëÄ¡ÇÒÁöµµ ¸ð¸£±â ¶§¹®ÀÌ´Ù. ÀÌ ¸ðµâ

¿¡ ÇÔ¼ö¸¦ »ðÀÔÇϱâ ÀÌÀü¿¡ sys_openÀ¸·Î ´Ù¸¥ ¸ðµâÀ» ´ëÄ¡ÇÒ ¼ö Àֱ⠶§¹®¿¡, ÀÌ°ÍÀÌ

100% ¾ÈÀüÇÏÁö ¾Ê´Ù´Â °Í¿¡ ÁÖÀÇÇ϶ó - ±×¸®°í, ÀÌÀü¿¡ Á¦°ÅµÉ ¼öµµ ÀÖ´Ù.

 

¶Ç ´Ù¸¥ ÀÌÀ¯´Â, sys_openÀ» ¾ò±â ¸øÇϱ⠶§¹®ÀÌ´Ù. ÀÌ°ÍÀº Á¤Àû º¯¼öÀ̸ç, µû¶ó¼­ ¿Ü

ºÎ¿¡¼­ ÂüÁ¶µÇÁö ¾Ê´Â´Ù

*/

asmlinkage int (*original_call)(const char *, int, int);

 

/* ¸î °¡ÁöÀÇ ÀÌÀ¯·Î, 2.2.3¿¡¼­ current->uid´Â ½ÇÁ¦ »ç¿ëÀÚÀÇ ID°¡ ¾Æ´Ñ, 0À¸·Î ÁÖ

¾îÁø´Ù. ÀÌ°ÍÀ¸·Î ÀÎÇØ Àá½Ã ¹«¾ùÀÌ À߸øµÈ °ÍÀÎÁö ã±â À§ÇØ ³ë·ÂÇÑ ÀûÀÌ ÀÖ´Ù - ±×

·¡¼­ uid¸¦ ¾ò±â À§ÇØ ´ÜÁö ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ°ÍÀº ÇÁ·Î¼¼½º°¡ ÇÏ´Â

¹æ¹ýÀ̶õ °ÍÀ» ¾Ë°ÔµÇ¾ú´Ù.

 

¶Ç ´Ù¸¥ ¸î °¡Áö ÀÌÀ¯·Î, ÈÄ¿¡ ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ¾ø¾Ö±â À§ÇØ Ä¿³ÎÀ» ÀçÄÄÆÄÀÏ ÇÏ¿´´Ù.

*/

asmlinkage int (*getuid_call)();

 

/* ÀÌ ÇÔ¼ö´Â sys_openÇÔ²² ´ëÄ¡µÉ °ÍÀÌ´Ù(ÇÔ¼ö´Â ½Ã½ºÅÛ È£ÃâÀ» È£ÃâÇÏ¿´À» ¶§ È£Ãâ

µÇ¾îÁø´Ù). Á¤È®ÇÑ ÇÔ¼ö ¿øÇüÀ» ã±â À§ÇØ, ÀÎÀÚÀÇ °³¼ö¿Í ÀÚ·áÇü, fs/openÀÇ Ã³À½À»

»ìÆì º¸¶ó.

 

ÀÌ·ÐÀûÀ¸·Î´Â, Ä¿³ÎÀÇ ÇöÀç ¹öÀü¿¡ ¹­¿© ÀÖ´Ù´Â ¶æÀÌ´Ù. ½ÇÁ¦ÀûÀ¸·Î, ½Ã½ºÅÛ È£ÃâÀº

´ëºÎºÐ °ÅÀÇ º¯°æµÇÁö ¾Ê´Â´Ù(ÀçÄÄÆÄÀÏ ÇÒ °ÍÀÌ ¿ä±¸µÈ´Ù. ½Ã½ºÅÛ È£ÃâÀÌ Ä¿³Î°ú ÇÁ·Î

¼¼½º»çÀÌÀÇ Åë½ÅÀ» ´ã´çÇϹǷÎ)

*/

asmlinkage int our_sys_open(const char *filename, int flags, int mode)

{

int i = 0;

char ch;

 

/* »ç¿ëÀÚ°¡ ´©±¸ÀÎÁö ¾Ë±â ¿øÇϸé, °Ë»çÇÑ´Ù.*/

if (uid == getuid_call())

{

/* getuid_callÀº getuid ½Ã½ºÅÛ È£ÃâÀ̸ç, È£ÃâÇÑ ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ´Â

»ç¿ëÀÚÀÇ uid¸¦ ÁØ´Ù. */

/* ÀûÀýÇÏ´Ù¸é, ÆÄÀÏÀ» Ç¥½ÃÇÑ´Ù. */

printk("Opened file by %d: ", uid);

do

{

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(ch, filename+i);

#else

ch = get_user(filename+i);

#endif

 

i++;

printk("%c", ch);

}

while (ch != 0);

 

printk("\n");

}

 

/* ¿ø·¡ÀÇ sys_openÀ» È£Ãâ - ¹Ý¸é¿¡, ÆÄÀÏÀ» ¿­ ¼ö ÀÖ´Â ´É·ÂÀ» ÀÒ°Ô µÈ´Ù.*/

return original_call(filename, flags, mode);

}

 

/* ¸ðµâÀÇ ÃʱâÈ­ - ½Ã½ºÅÛ È£ÃâÀÇ ´ëÄ¡ */

int init_module()

{

/* ÁÖÀÇ - ½ÇÇàÀÌ Áö±Ýº¸´Ù ´Ê¾îÁø´Ù. ±×·¯³ª ´ÙÀ½À» À§Çؼ­... */

printk("I'm dangerous. I hope you did a ");

printk("sync before you insmod'ed me.\n");

printk("My counterpart, cleanup_module(), is even");

printk("more dangerous. If\n");

printk("you value your file system, it will ");

printk("be \"sync; rmmod\" \n");

printk("when you remove this module.\n");

 

/* original_call³»ÀÇ ¿ø ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ À¯ÁöÇÏ°í, our_sys_open°ú ÇÔ²² ½Ã½º

ÅÛ È£Ãâ Å×À̺íÀÇ ½Ã½ºÅÛ È£Ãâ·Î ´ëÄ¡ÇÑ´Ù. */

original_call = sys_call_table[__NR_open];

sys_call_table[__NR_open] = our_sys_open;

 

/* ½Ã½ºÅÛ È£Ãâ foo¸¦ À§ÇÑ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ¾ò±â À§ÇØ, sys_call_table[__NR_foo]

·Î °£´Ù. */

printk("Spying on UID:%d\n", uid);

 

/* getuid¸¦ À§ÇÑ ½Ã½ºÅÛ È£Ãâ ¾ò±â */

getuid_call = sys_call_table[__NR_getuid];

return 0;

}

 

/* »èÁ¦ - /proc¿¡ »ç¿ëµÈ ÆÄÀÏÀ» Á¦°Å */

void cleanup_module()

{

/* ½Ã½ºÅÛ ÄݹéÀ» º¸ÅëÀÇ »óÅ·ΠµÇµ¹¸°´Ù. */

if (sys_call_table[__NR_open] != our_sys_open)

{

printk("Somebody else also played with the ");

printk("open system call\n");

printk("The system may be left in ");

printk("an unstable state.\n");

}

 

sys_call_table[__NR_open] = original_call;

}

 

Á¦ 8 Àå

 

ÇÁ·Î¼¼½ºÀÇ ½ÇÇà ±ÝÁö(Blocking Processes)

 

´©±º°¡ ¿Ã¹Ù¸£Áö ¸øÇÑ ÀÏÀ» ´ç½Å¿¡°Ô ¿ä±¸ÇÏ¸é ¾î¶»°Ô ÇൿÇϰڴ°¡? ´Ù¸¥ »ç¶÷ÀÌ ±Í

Âú°Ô ÇÑ´Ù¸é, ±×Àú 'Áö±ÝÀº ¾ÈµÅ, ¹Ù»Ú´Ü ¸»À̾ß. Àú¸®°¡¶ó±¸!' ¶ó°í ¸»ÇÏ¸é µÈ´Ù. ±×

·¯³ª, Ä¿³Î ¸ðµâ¿¡¼­´Â ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±ÍÂú°Ô(?)Çϸé, ´Ù¸¥ ¹æ½ÄÀ¸·Î ¸»ÇØ¾ß ÇÑ´Ù.

¼­ºñ½º °¡´ÉÇÒ ¶§±îÁö ´ë±â »óÅ·ΠÇÁ·Î¼¼½º¸¦ ¸¸µå´Â °ÍÀÌ °¡´ÉÇÏ´Ù. °á±¹, ÇÁ·Î¼¼½º

´Â Ä¿³Î¿¡ ÀÇÇØ ´ë±âµÇ°í, ¸ðµç ½Ã°£¿¡(´ÙÁß ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ CPU»ó¿¡¼­ µ¿½Ã¿¡ ½Ç

ÇàµÇ´Â ¹æ¹ýÀÌ´Ù) ±ú¾î³¯ °ÍÀÌ´Ù.

 

ÀÌ Ä¿³Î ¸ðµâÀÌ ÀÌ°ÍÀÇ ¿¹ÀÌ´Ù. ÆÄÀÏ(/proc/sleep·Î È£ÃâµÈ)Àº µ¿½Ã¿¡ ÇϳªÀÇ ÇÁ·Î¼¼

½º¿¡¼­¸¸ ¿­¸°´Ù. ÆÄÀÏÀÌ ÀÌ¹Ì ¿­·ÁÀÖÀ¸¸é, Ä¿³Î ¸ðµâÀº module_interruptible_sleep-

_onÀ»(*1) È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ŽºÅ©(ŽºÅ©´Â ÇÁ·Î¼¼½º¿Í ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇÑ Á¤º¸

¸¦ °¡Áö°í ÀÖ´Â Ä¿³ÎÀÇ µ¥ÀÌÅÍ ±¸Á¶Ã¼ÀÌ´Ù)¿¡ ´ëÇÑ »óÅ º¯¼ö TASK_INTERRUPTIBLEÀ»

º¯°æÇÏ°í, ¾î¶² ¹æ½ÄÀ¸·Îµç ±ú¾î³¯ ¶§±îÁö ½ÇÇàµÇÁö ¾Êµµ·Ï WaitQ¿¡ Ãß°¡ÇÏ°í, ŽºÅ©

µéÀº Å¥¿¡¼­ ÆÄÀÏ·ÎÀÇ Á¢±ÙÀ» ±â´Ù¸°´Ù.

°¢ÁÖ1 *************************************************************************

¿­·ÁÁø ÆÄÀÏÀ» À¯ÁöÇÏ´Â °¡Àå ½¬¿î ¹æ¹ýÀº tail -f·Î ÆÄÀÏÀ» ¿©´Â °ÍÀÌ´Ù..

*******************************************************************************

 

ÇÁ·Î¼¼½º°¡ ÆÄÀÏ°ú ÇÔ²² Á¾·áµÇ¸é, ŽºÅ©µµ Á¾·áµÇ¸ç, ±×¸®°í module_close°¡ È£ÃâµÈ

´Ù. ÀÌ ÇÔ¼ö´Â Å¥¾ÈÀÇ ¸ðµç ÇÁ·Î¼¼½ºµéÀ» ±ú¿ì°Ô µÈ´Ù(À̵éÀ» ±ú¿ì±â À§ÇÑ ´Ü ÇϳªÀÇ

ÀýÂ÷). À̷μ­ ÇÁ·Î¼¼½º´Â ¹æ±Ý Á¾·áµÈ ÆÄÀÏÀÇ ½ÇÇàÀ» °è¼ÓÇÒ ¼ö ÀÖ´Ù. Á¦ ½Ã°£¿¡, ½º

ÄÉÁì·¯´Â ÀÌ ÇÁ·Î¼¼µé¿¡ ÃæºÐÇÑ ½Ã°£À» °áÁ¤ÇÏ°í ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ CPUÀÇ Á¦¾î ±ÇÀ» ÁØ

´Ù. °á±¹, Å¥¾ÈÀÇ ÇÁ·Î¼¼½ºµé Áß Çϳª¿¡ ½ºÄÉÁì·¯°¡ CPUÀÇ Á¦¾î ±ÇÀ» ³Ñ°ÜÁØ´Ù. ÀÌ°Í

Àº modulue_interruptible_sleep_on(*2)¿¡¼­ È£ÃâµÈ Á÷ÈÄ¿¡ ½ÃÀ۵ȴÙ. ¸ðµç ´Ù¸¥ ÇÁ·Î

¼¼µé¿¡ À§ÀÇ Àü¿ªº¯¼öÀÇ °ªÀ» ÁöÁ¤ÇÏ¿© ÀÚ½ÅÀÌ ½ÇÇàÁßÀÓÀ» ¾Ë¸®¸ç, ÆÄÀÏÀº ¿©ÀüÈ÷ ¿­

·ÁÀÖ°í ÀÚ½ÅÀÇ »îÀ» »ì¾Æ°£´Ù. ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº CPU ½ÇÇà½Ã°£ÀÇ ÀϺθ¦ °¡Áú ¶§, Àü

¿ª º¯¼ö¸¦ »ìÆ캸°í ´Ù½Ã ´ë±â»óÅ·Πµ¹¾Æ°£´Ù.

°¢ÁÖ2 *************************************************************************

ÇÁ·Î¼¼½º´Â ¿©ÀüÈ÷ Ä¿³Î ¸ðµå ¾È¿¡ ÀÖ´Ù --- ÇÁ·Î¼¼½º¿¡ °üÇÑ ÇÑ, open ½Ã½ºÅÛ È£ÃâÀº

¼öÇàµÇ¾ú°í ½Ã½ºÅÛ È£ÃâÀº ¾ÆÁ÷ ¸®ÅϵÇÁö ¾Ê¾Ò´Ù. ÇÁ·Î¼¼½º´Â È£ÃâµÈ »ç°Ç(open)°ú ¸®

ÅÏµÈ »ç°Ç»çÀÌ¿¡¼­ ´©°¡ CPU ½Ã°£ÀÇ ´ëºÎºÐÀ» »ç¿ëÇÏ´ÂÁö ¾ËÁö ¸øÇÑ´Ù.

*******************************************************************************

 

»îÀ» Á»´õ È°±âÂ÷°Ô Çϱâ À§ÇØ, module_close´Â ÆÄÀÏ¿¡ Á¢±ÙÇÏ·Á´Â ÇÁ·Î¼¼½ºµéÀÇ ±ú¿ò

À» µ¶Á¡ÇÏÁö ¾Ê´Â´Ù. ÀûÀýÇÑ ½ÅÈ£°¡, Ctrl-C(SIGINT)¿Í °°Àº, ÇÁ·Î¼¼½º¸¦ ±ú¿î´Ù(*3).

ÀÌ·± °æ¿ì¿¡, -EINTRÀÌ ¹Ù·Î ¸®ÅÏ µÇ±æ ¿øÇÑ´Ù. ÀÌ°ÍÀº »ç¿ëÀڵ鿡°Ô Áß¿äÇϸç, ¿¹¸¦

µé¸é, ÆÄÀÏÀ» ¹Þ±â Àü¿¡ ÇÁ·Î¼¼½º¸¦ °­Á¦·Î Á¾·áÇÏ´Â °æ¿ì¿¡¼­. Áß¿äÇÏ°Ô ±â¾ïÇØ¾ß ÇÒ

°ÍÀÌ Çϳª ´õ ÀÖ´Ù. ¶§¶§·Î ÇÁ·Î¼¼½ºµéÀº ´ë±â»óŸ¦ ¿øÇÏÁö ¾Ê´Â´Ù. ÀÌ·± ÇÁ·Î¼¼½ºµé

Àº ÆÄÀÏÀ» ¿­ ¶§ O_NONBLOCK Ç÷¡±×¸¦ ÀÌ¿ëÇÑ´Ù. Ä¿³ÎÀº ´Ù¸¥ ¿µ¿ª¿¡ ´ëÇÑ µ¿ÀÛ¿¡ ´ë

ÇØ, ¾Æ·¡ÀÇ ¿¹Á¦ÀÇ ÆÄÀÏÀ» ¿©´Â °Í °°Àº, -EAGAIN ¿À·ù Äڵ带 ¸®ÅÏÇÒ °ÍÀÌ´Ù. cat_n-

oblock ÇÁ·Î±×·¥ÀÌ, ÀÌÀåÀÇ ¼Ò½º µð·ºÅ丮¿¡ ÀÖ´Â, O_NONBLOCK·Î ÆÄÀÏÀ» ¿­ ¼ö ÀÖ°Ô

ÇÒ °ÍÀÌ´Ù.

°¢ÁÖ3 *************************************************************************

ÀÌ°Í ¶§¹®¿¡ module_interruptible_sleep_on¸¦ ÀÌ¿ëÇÑ´Ù. ´ë½Å¿¡, module_sleep_onÀ»

ÀÌ¿ëÇÒ ¼öµµ ÀÖÁö¸¸, Ctrl-C¸¦ ¹«½ÃÇÏ´Â ¸Å¿ì È­³­ »ç¿ëÀÚ¿¡°Ô´Â ¼Ò¿ëÀÌ ¾ø´Ù.

*******************************************************************************

 

<sleep.c>

/* sleep.c - /proc¿¡ ¸¸µç´Ù, ¸¸¾à ¿©·¯ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ÆÄÀÏÀ» ¿­·ÁÇϸé, Çϳª¸¦

Á¦¿ÜÇÑ ¸ðµÎ¸¦ ´ë±â »óÅ·Π¸¸µç´Ù. */

 

/* Copyright (C) 1998-9 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ÇÑ´Ù. */

#include <linux/module.h> /* Ưº°È÷, ¸ðµâ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* proc fsÀ» ÀÌ¿ëÇϱ⿡ ÇÊ¿ä */

#include <linux/proc_fs.h>

 

/* ÇÁ·Î¼¼½º¸¦ ´ë±â »óÅ·Π¸¸µé±â À§ÇØ, ±×¸®°í ³ªÁß¿¡ ±ú¿ì±â À§ÇØ */

#include <linux/sched.h>

#include <linux/wrapper.h>

 

/* 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ À̸¦ À§ÇÑ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, 2.0.35¿¡¼­´Â Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ°÷¿¡ Ãß°¡ÇÑ´Ù.*/

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

#include <asm/uaccess.h> /* get_user¿Í put_user¸¦ À§ÇØ */

#endif

 

/* ¸ðµâÀÇ ÇÔ¼öµé */

/* ÀÔ·Â ÇÁ·Î¼¼½º°¡ °¡´ÉÇÔÀ» Áõ¸íÇϱâ À§ÇØ, ¸¶Áö¸· ¸Þ½ÃÁö¸¦ À¯ÁöÇÑ´Ù. */

#define MESSAGE_LENGTH 80

 

static char Message[MESSAGE_LENGTH];

 

 

/* ÆÄÀÏ¿¡ °üÇÑ ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇϹǷÎ, Ưº°ÇÑ procÃâ·ÂÀ» ÀÌ¿ëÇÒ ¼ö ¾ø´Ù - ÀÌ ÇÔ¼ö¿Í

°°Àº Ç¥ÁØ Àбâ ÇÔ¼ö¸¦ ÀÌ¿ëÇؾ߸¸ ÇÑ´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t module_output(

struct file *file, /* ÆÄÀÏ Àбâ */

char *buf, /* µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ(»ç¿ëÀÚ ¼¼±×¸ÕÆ®¿¡¼­) */

size_t len, /* ¹öÆÛÀÇ ±æÀÌ */

loff_t *offset) /* ÆÄÀÏÀÇ »ó´ë À§Ä¡ - ¹«½Ã */

#else

static int module_output(

struct inode *inode,/* inode Àбâ */

struct file *file, /* ÆÄÀÏ Àбâ */

char *buf, /* µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ(»ç¿ëÀÚ ¼¼±×¸ÕÆ®¿¡¼­) */

int len) /* ¹öÆÛÀÇ ±æÀÌ */

#endif

{

static int finished = 0;

int i;

char message[MESSAGE_LENGTH+30];

 

/* ÆÄÀÏÀÇ ³¡À̸é 0À» ¸®ÅÏÇÑ´Ù - ÀÌ À§Ä¡¿¡¼­ ´õ ÀÌ»ó °¡Áú °ÍÀÌ ¾ø´Ù. */

if (finished)

{

finished = 0;

return 0;

}

 

/* ÀÌ°ÍÀ» ÀÌÇØÇÒ ¼ö ¾ø´Ù¸é, Ä¿³Î ÇÁ·Î±×·¡¸ÓÀÇ Èñ¸ÁÀ» ¹ö·Á¾ß µÉÁöµµ */

sprintf(message, "Last input:%s\n", Message);

for(i=0; i<len && message[i]; i++) put_user(message[i], buf+i);

finished = 1;

 

return i; /* "read"¿¡ ÀÇÇÑ µ¥ÀÌÅÍÀÇ °³¼ö¸¦ ¸®ÅÏ */

}

 

/* /proc ÆÄÀÏ¿¡ »ç¿ëÀÚ°¡ ¾²·ÁÇϸé, ÀÌ ÇÔ¼ö´Â »ç¿ëÀڷκÎÅÍÀÇ ÀÔ·ÂÀ» ¼ö½ÅÇÑ´Ù.*/

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t module_input(

struct file *file, /* ÆÄÀÏ ÀڽŠ*/

const char *buf, /* ÀÔ·Â ¹öÆÛ */

size_t length, /* ¹öÆÛÀÇ Å©±â */

loff_t *offset) /* ÆÄÀÏÀÇ »ó´ë À§Ä¡ - ¹«½Ã*/

#else

static int module_input(

struct inode *inode,/* ÆÄÀÏÀÇ inode */

struct file *file, /* ÆÄÀÏ ÀڽŠ*/

const char *buf, /* ÀÔ·Â ¹öÆÛ */

int length) /* ¹öÆÛÀÇ Å©±â */

#endif

{

int i;

 

/* module_outputÀÌ ³ªÁß¿¡ »ç¿ë °¡´ÉÇÏ°Ô, ¸Þ½ÃÁö ¾È¿¡ ÀÔ·ÂÀ» ³Ö´Â´Ù. */

for(i=0; i<MESSAGE_LENGTH-- && i<length; i++)

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(Message[i], buf+i);

#else

Message[i] = get_user(buf+i);

#endif

 

/* ¿ì¸®´Â ÇϳªÀÇ Ç¥ÁØÀ» ¿øÇÑ´Ù. 0Àº ¹®ÀÚ¿­ Á¾·á¹®ÀÚ */

Message[i] = '\0';

 

/* »ç¿ëµÈ ÀÔ·Â ¹®ÀÚÀÇ °³¼ö°¡ ÇÊ¿äÇÏ´Ù. */

return i;

}

 

/* ÆÄÀÏÀÌ ´©±º°¡¿¡ ÀÇÇØ ÇöÀç ¿­·ÁÀÖÀ¸¸é 1 */

int Already_Open = 0;

 

/* ÆÄÀÏÀ» »ç¿ëÇÏ±æ ¿øÇÏ´Â ÇÁ·Î¼¼½ºµéÀÇ Å¥ */

static struct wait_queue *WaitQ = NULL;

 

/* /proc ÆÄÀÏÀÌ ¿­¸± ¶§ È£Ãâ */

static int module_open(struct inode *inode, struct file *file)

{

/* ÆÄÀÏÀÇ Ç÷¡±×°¡ O_NONBLOCKÀ» Æ÷ÇÔÇϸé, ÇÁ·Î¼¼½º°¡ ÆÄÀÏÀÇ Á¢±ÙÀ» ±â´Ù¸®±æ

¿øÇÏÁö ¾Ê´Â´Ù´Â ÀǹÌÀÌ´Ù. ÀÌ·± °æ¿ì, ÆÄÀÏÀÌ ÀÌ¹Ì ¿­·Á ÀÖÀ¸¸é, -EAGAINÀ¸·Î

½ÇÆи¦ Ç¥½ÃÇϸç, "´Ù½Ã ½ÃµµÇØ¾ß ÇÑ´Ù"´Â ÀǹÌÀÇ, ´ë½Å¿¡ ´ë±âÁßÀÎ ´Ù¸¥ ÇÁ·Î

¼¼½ºµéÀÇ ½ÇÇàÀº ±ÝÁöÇÑ´Ù. */

if ((file->f_flags & O_NONBLOCK) && Already_Open)

return -EAGAIN;

 

/* Ä¿³ÎÀÇ ¸ðµâ ¾È¿¡¼­ ÇÁ·Î¼¼½º°¡ ·çÇÁ ¾ÈÀ̶ó¸é, MOD_INC_USE_COUNTÀ» À§ÇÑ ¿Ã¹Ù

¸¥ À§Ä¡À̸ç, Ä¿³ÎÀº Á¦°ÅµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. */

MOD_INC_USE_COUNT;

 

/* ÆÄÀÏÀÌ ÀÌ¹Ì ¿­·Á ÀÖÀ¸¸é, ´ÝÈú ¶§±îÁö ±â´Ù¸°´Ù. */

while (Already_Open)

{

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

int i, is_sig=0;

#endif

 

/* ÀÌ ÇÔ¼ö´Â ÇöÀç ÇÁ·Î¼¼½º¸¦ ´ë±âÇϱâ À§ÇØ, ½Ã½ºÅÛ È£ÃâÀ» Æ÷ÇÔÇÏ¿©, ¿©±â

¿¡¼­Ã³·³, Ãß°¡µÈ´Ù. ÀÌ ÇÔ¼öÀÇ È£Ãâ ÈÄ¿¡ ½ÇÇàÀÌ Àç°³µÉ °ÍÀÌ°í, ´©±º°¡

¿¡ÀÇÇØ wake_up(&WaitQ)¶Ç´Â Ctrl-C¿Í °°Àº ½Ã±×³ÎÀÌ ¼ö½ÅµÉ ¶§, ÇÁ·Î¼¼½º

¿¡ º¸³»Áø´Ù. */

module_interruptible_sleep_on(&WaitQ);

 

/* ±ú¾î ÀÖÀ¸¸é, ÀÌ¹Ì ½Ã±×³ÎÀ» ¼ö½ÅÇÏ¿© ½ÇÇà±ÝÁö µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î, -EINTR

À» ¸®ÅÏÇÑ´Ù(½Ã½ºÅÛ È£ÃâÀÇ ½ÇÆÐ). ÀÌ°ÍÀº ÇÁ·Î¼¼½ºµé¿¡ Á¾·á ¶Ç´Â Á¤Áö¸¦

Çã°¡ÇÑ´Ù. */

 

/*

* Emmanuel Papirakis:

*

* 2.2.*¿¡¼­ ¾à°£ÀÇ ¼öÁ¤ÀÌ ÀÖ¾ú´Ù. ½Ã±×³ÎÀº µÎ°³ÀÇ ¿öµå(64ºñÆ®)¸¦ Æ÷ÇÔÇÏ

* °í µÎ°³ÀÇ unsigned longÀÇ ¹è¿­À» Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼¾È¿¡ ÀúÀåµÈ´Ù. 2¹øÀÇ

* °Ë»ç¸¦ ¿©±â¿¡¼­ ¼öÇàÇØ¾ß ÇÑ´Ù.

*

* Ori Pomerantz:

*

* ´©±¸µµ 64ºñÆ® º¸´Ù Å« °ªÀ» »ç¿ëÇÏÁö ¾ÊÀ» °ÍÀÌ°í, ¶ÇÇÑ, À̹®¼­´Â 16ºñÆ®

* Å©±âÀÇ ¿öµå¿Í ÇÔ²² ÇÏ´Â ¸®´ª½º ¹öÀüÀº »ç¿ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ ÄÚµå´Â

* ¾îµð¿¡¼­³ª Àû¿ë °¡´ÉÇÏ´Ù.

*/

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

for(i=0; i<_NSIG_WORDS && !is_sig; i++)

{

is_sig = current->signal.sig[i] & ~current->blocked.sig[i];

}

 

if (is_sig)

{

#else

if (current->signal & ~current->blocked)

{

#endif

/*

ÇÁ·Î¼¼½ºµéÀÌ ÀÎÅÍ·´Æ®·Î¼­ ½ÇÇàµÇ°í close¿Í ¿¬°áµÇ´Â Åë½ÅÇÒ ¼ö ¾øÀ¸¹Ç

·Î ¿©±â¿¡¼­ MOD_DEC_USE_COUNT¸¦ Ãß°¡ÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¿©±â¿¡¼­ »ç

¿ë Ä«¿îÅ͸¦ °¨¼ÒÇÏÁö ¾ÊÀ¸¸é, ¾ç¼öÀÇ °ªÀ¸·Î ³²°ÜÁö°ÔµÇ°í 0À¸·Î °¨¼ÒÇÒ

¾î¶² ¹æ¹ýµµ ¾ø°ÔµÇ¾î, ¿µ±¸ÀûÀÎ ¸ðµâ·Î¼­ ³²°ÜÁö°Ô µÇ¸ç, ¸®ºÎÆÿ¡ ÀÇÇØ

¼­¸¸ Á¾·áÇÒ ¼ö ÀÖ´Ù.

*/

MOD_DEC_USE_COUNT;

 

return -EINTR;

}

}

 

/* ¿©±â¿¡¼­ ¾ò¾ú´Ù¸é, Already_Open 0ÀÏ °ÍÀÌ´Ù. */

/* ÆÄÀÏ ¿­±â */

Already_Open = 1;

 

return 0; /* Á¢±Ù Çã°¡ */

}

 

/* /proc ÆÄÀÏÀÌ Á¾·áµÇ¾úÀ» ¶§ È£ÃâµÇ¾îÁø´Ù. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

int module_close(struct inode *inode, struct file *file)

#else

void module_close(struct inode *inode, struct file *file)

#endif

{

/* Already_OpenÀ» 0À¸·Î ÁöÁ¤, WaitQ¾ÈÀÇ ÇÁ·Î¼¼½ºµé Áß Çϳª´Â Already_OpenÀ»

1·Î ÇÒ °ÍÀÌ°í ÆÄÀÏÀ» ¿­°Ô µÈ´Ù. Already_OpenÀÌ 1·Î µÉ ¶§ ¸ðµç ´Ù¸¥ ÇÁ·Î¼¼

½ºµéÀº ´ë±â»óÅ·ΠµÈ´Ù. */

Already_Open = 0;

 

/* WaitQ¾ÈÀÇ ¸ðµç ÇÁ·Î¼¼½º¸¦ ±ú¿ì°Ô µÇ¸ç, ¸¸¾à ´©±º°¡ ÆÄÀÏÀ» ±â´Ù¸®°í ÀÖ¾ú´Ù

¸é, ÆÄÀÏÀ» ¿­ ¼ö ÀְԵȴÙ. */

module_wake_up(&WaitQ);

MOD_DEC_USE_COUNT;

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return 0; /* ¼º°ø */

#endif

}

 

/* ÀÌ ÇÔ¼ö´Â µ¿ÀÛÀÇ Çã°¡(0À» ¸®ÅÏ), ºÒÇã(¿Ö Çã°¡ÇÏÁö ¾Ê´Âµ¥ ÀÌÀ¯¸¦ ³ªÅ¸³»´Â ¾ç¼ö

ÀÇ °ªÀ» ¸®ÅÏ)¸¦ °áÁ¤ÇÑ´Ù.

 

¾Æ·¡ÀÇ °ªµé Áß Çϳª·Î¼­ µ¿ÀÛÇÑ´Ù:

0 - ½ÇÇà(ÆÄÀÏÀÇ ½ÇÇà - ¿©±â¼­´Â ¹«ÀǹÌÇÏ´Ù)

2 - ¾²±â(Ä¿³Î ¸ðµâ¿¡¼­ÀÇ ÀÔ·Â)

4 - Àбâ(Ä¿³Î¸ðµâ·ÎºÎÅÍÀÇ Ãâ·Â)

 

ÀÌ°ÍÀº ÆÄÀÏÀÇ Æ۹̼ÇÀ» °Ë»çÇÏ´Â ½ÇÁ¦ ÇÔ¼öÀÌ´Ù. ls -l¿¡ ÀÇÇØ ¸®ÅÏ µÇ¾îÁö´Â Æ۹̼Ç

µéÀº ´ÜÁö ÂüÁ¶µÉ »ÓÀ̸ç, ÀÌ°÷¿¡¼­ ÁßøµÇ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

*/

static int module_permission(struct inode *inode, int op)

{

/* ¸ðµÎ¿¡°Ô ¸ðµâ¿¡¼­ÀÇ Àб⸦ Çã°¡ÇÏ°í, ·çÆ®(uid 0)¿¡°Ô¸¸ ¾²±â¸¦ Çã°¡ÇÑ´Ù.*/

if (op == 4 || (op == 2 && current->euid == 0)) return 0;

 

/* ¾î¶² °Íµµ ¾Æ´Ï¶ó¸é, Á¢±ÙÀº ºÒÇãµÈ´Ù. */

return -EACCES;

}

 

/* /proc¿¡ µî·ÏÇϱâ À§ÇÑ ±¸Á¶Ã¼, ¸ðµç °ü°èµÈ ÇÔ¼öµéÀÇ Æ÷ÀÎÅÍ¿Í ÇÔ²² */

/* proc ÆÄÀÏÀ» À§ÇÑ ¿¬»êµé. ÆÄÀÏ¿¡ ¹«½¼ ÀÏÀ» ¼öÇàÇÏ·Á ÇÒ ¶§ È£ÃâµÇ´Â ¸ðµç ÇÔ¼öµé

ÀÇ Æ÷ÀÎÅÍ°¡ À§Ä¡ÇÑ´Ù. NULLÀº ¾Æ¹« °Íµµ ¼öÇàÇÏÁö ¾Ê´Â´Ù´Â ÀǹÌÀÌ´Ù.*/

static struct file_operations File_Ops_4_Our_Proc_File =

{

NULL, /* lseek */

module_output, /* ÆÄÀÏ·Î ºÎÅÍÀÇ "Àбâ" */

module_input, /* ÆÄÀÏ¿¡ "¾²±â" */

NULL, /* readdir */

NULL, /* select */

NULL, /* ioctl */

NULL, /* mmap */

module_open, /* /proc ÆÄÀÏÀÌ ¿­·ÁÁö¸é È£Ãâ */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

NULL, /* flush */

#endif

module_close /* ÆÄÀÏÀÌ ´ÝÈú ¶§ È£Ãâ */

};

 

/* proc ÆÄÀÏÀ» À§ÇÑ inode ¿¬»êµé. ÀÌ¿ëÇϱ⠿øÇÏ´Â °÷¿¡ ÀÌ ÆÄÀÏ ¿¬»ê ±¸Á¶Ã¼¸¦ À§

Ä¡½ÃÅ°°í, ÀÌ ÇÔ¼ö´Â Æ۹̼ÇÀ» À§ÇØ ÀÌ¿ëÇÑ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ inodeÀÇ ÀÛ¾÷ ¸»°íµµ ´Ù¸¥

ÀÏ¿¡ ÇÔ¼öµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.(ÀÌ·± ÀÏÀº ±×´ÙÁö ±î´Ù·ÓÁö ¾Ê´Ù, ÇÊ¿äÄ¡ ¾Ê´Â °æ¿ì

NULLÀ» ÁöÁ¤ÇÑ´Ù) */

static struct inode_operations Inode_Ops_4_Our_Proc_File =

{

&File_Ops_4_Our_Proc_File,

NULL, /* »ý¼º(create) */

NULL, /* lookup */

NULL, /* ¿¬°á(link) */

NULL, /* ¿¬°á ÇØÁ¦(unlink) */

NULL, /* ½É¹ú ¿¬°á(symlink) */

NULL, /* µð·ºÅ丮 ¸¸µé±â(mkdir) */

NULL, /* µð·ºÅ丮 Áö¿ì±â(rmdir) */

NULL, /* ³ëµå »ý¼º(mknod) */

NULL, /* À̸§ º¯°æ(rename) */

NULL, /* readlink */

NULL, /* follow_link */

NULL, /* ÆäÀÌÁö Àбâ(readpage) */

NULL, /* ÆäÀÌÁö ¾²±â(writepage) */

NULL, /* bmap */

NULL, /* Àý´Ü(truncate) */

module_permission /* Á¢±Ù Çã°¡¸¦ À§ÇÑ °Ë»ç */

};

 

/* µð·ºÅ丮 µî·Ï */

static struct proc_dir_entry Our_Proc_File =

{

0, /* Inode ¹øÈ£ - ¹«½Ã, proc_register[_dynamic]¿¡ ÀÇÇØ ÁöÁ¤µÉ °ÍÀÌ´Ù. */

5, /* ÆÄÀϸíÀÇ ±æÀÌ */

"sleep",/* ÆÄÀÏ À̸§ */

S_IFREG | S_IRUGO | S_IWUSR, /* ÆÄÀÏ ¸ðµå - ¼ÒÀ¯ÀÚ, ±×·ì, ±×¸®°í ¸ðµÎ¿¡ Àбâ

°¡ °¡´ÉÇÑ Á¤±Ô ÆÄÀÏ. ½ÇÁ¦·Î, ¿©±â¼­ ÀÌ Çʵå

´Â ´ÜÁö ÂüÁ¶µÉ »ÓÀ̸ç, module_permission¿¡¼­

½ÇÁ¦·Î À̸¦ ÀÌ¿ëÇÑ´Ù. ÀÌ°ÍÀÌ ÀÌ Çʵ带 ÀÌ¿ë

Çϱâ´Â ÇÏÁö¸¸, ¿©±â¼­´Â ÇÊ¿äÄ¡ ¾Ê´Ù. */

1, /* ¸µÅ©ÀÇ °³¼ö(ÆÄÀÏÀÌ ÂüÁ¶µÇ´Â °÷ÀÇ µð·ºÅ丮µé) */

0, 0, /* ÆÄÀÏÀÇ uid¿Í gid - ·çÆ®¿¡ ÀÇÇØ ÁÖ¾îÁø´Ù. */

80, /* ls¿¡ ÀÇÇØ ³ªÅ¸³ª´Â ÆÄÀÏÀÇ Å©±â */

&Inode_Ops_4_Our_Proc_File, /* ÇÊ¿äÇÏ´Ù¸é, ÆÄÀÏÀ» À§ÇÑ inode ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ

¾²±â ÇÔ¼ö°¡ ÇÊ¿äÇϹǷΠ¿©±â¼­´Â ÇÊ¿äÇÏ´Ù.*/

NULL /* ÆÄÀÏÀ» À§ÇÑ Àбâ ÇÔ¼ö. ºÒÇÊ¿ä, À§ÀÇ inode ±¸Á¶Ã¼¿¡¼­ »ç¿ëÇϱ⿡

*/

};

 

/* ¸ðµâÀÇ ÃʱâÈ­¿Í »èÁ¦ */

/* ¸ðµâÀÇ ÃʱâÈ­ - proc¿¡ µî·Ï */

int init_module()

{

/* proc_register_dynamicÀÌ successÀÌ¸é ¼º°ø, ¾Æ´Ï¸é ½ÇÆÐ */

 

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return proc_register(&proc_root, &Our_Proc_File);

#else

return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

 

/* proc_rootÀº proc fs(/proc)¸¦ À§ÇÑ ·çÆ® µð·ºÅ丮ÀÌ´Ù. ¿øÇÏ´Â °÷¿¡ ÆÄÀÏÀ»

À§Ä¡½ÃŲ´Ù. */

}

 

 

/* »èÁ¦ - /proc·ÎºÎÅÍ ÆÄÀÏÀ» µî·Ï Á¦°Å. ÇÁ·Î¼¼½º°¡ ¿©ÀüÈ÷ WaitQ¾È¿¡¼­ ´ë±âÁßÀ̶ó

¸é open ÇÔ¼öÀÇ ³»ºÎ¿¡¼­ ¹Ì ÀûÀçµÈ °ÍÀ» ¾òÀ» ¼öµµ Àֱ⿡ À§ÇèÇØÁø´Ù. Á¦ 10 Àå¿¡¼­

ÀÌ·± °æ¿ìÀÇ Ã³¸® ¹æ¹ýÀ» ¼³¸íÇÒ °ÍÀÌ´Ù. */

void cleanup_module()

{

proc_unregister(&proc_root, Our_Proc_File.low_ino);

}

 

Á¦ 9 Àå

 

printkÀÇ ´ëÄ¡

 

¹®¼­ÀÇ Ã³À½¿¡¼­(Á¦ 1 Àå), X¿Í Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹ÖÀ» È¥ÇÕÇÏ¿© ÀÛ¼ºÇÏÁö ¸»¶ó°í Çß

´Ù. Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇÏ´Â µ¿¾È ÀÌ°ÍÀº È®½ÇÈ÷ ÁöÄÑÁ®¾ß ÇÏÁö¸¸, ½ÇÁ¦·Î´Â ¸ðµâ·Î ºÎ

ÅÍÀÇ ¸Þ¼¼Áö¸¦ º¸³»µµ·Ï tty(*1) ¸í·ÉÀ» ¾î´À °÷¿¡¼­µç »ç¿ëÇÏ±æ ¿øÇÒ °ÍÀÌ´Ù. ÀÌ°ÍÀº

Ä¿³Î ¸ðµâÀÌ ÇØÁ¦µÈ ÈÄ¿¡ ¿À·ù¸¦ ÀνÄÇϱâ À§ÇØ Áß¿äÇϸç, ÀÌ°ÍÀº ±×µéÀÇ ¸ðµÎ¿¡¼­ ÀÌ

¿ëµÉ ¼ö ÀÖ´Ù. ¿©±âÀÇ ¹æ¹ýÀÌ ÇöÀç ½ÇÇàÁßÀÎ ttyÀÇ Æ÷ÀÎÅÍ, ÇöÀç ŽºÅ©ÀÇ tty ±¸Á¶Ã¼

¸¦¾ò±â À§ÇØ ÇöÀç ÀÌ¿ëµÇ´Â °ÍÀÌ´Ù. ÀÌÁ¦, tty¿¡¼­ ¹®ÀÚ¿­À» ¾²±â À§ÇØ ÀÌ¿ëÇÏ´Â ¹®ÀÚ

¿­ ¾²±â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ã±â À§ÇØ tty ±¸Á¶Ã¼ÀÇ ¾ÈÀ» µé¿©´Ùº¸°Ô µÈ´Ù.

°¢ÁÖ1 *************************************************************************

Teletype, ¿ø·¡´Â À¯´Ð½º ½Ã½ºÅÛÀÇ Åë½Å¿¡ ÀÌ¿ëµÇ´ø Å°º¸µå--ÇÁ¸°ÅÍÀÇ Á¶ÇÕ±â°è, ¿À´Ã

³¯¿¡´Â À¯´Ð½º ÇÁ·Î±×·¥¿¡¼­ ÀÌ¿ëµÇ´Â ÅؽºÆ® ½ºÆ®¸²ÀÇ Ãß»óÀû ÀǹÌ, ¹°¸®Àû Å͹̳Î,

X È­¸é ÀåÄ¡»óÀÇ xterm, ³×Æ®¿÷ »ó¿¡ ¿¬°áµÈ telnet, ±âŸ µîµî.

*******************************************************************************

 

<printk.c>

/* printk.c - ½ÇÇàÁßÀÎ tty¿¡, X¸¦ ÅëÇؼ­µç, telnet, ¶Ç´Â ´Ù¸¥ °Í, ÅؽºÆ®¸¦ Ãâ·Â

Çϱâ. */

 

/* Copyright (C) 1998 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÑ´Ù */

#include <linux/module.h> /* Ưº°È÷, ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS¿Í ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* ¿©±â¿¡¼­ ÇÊ¿äÇÑ Çì´õ */

#include <linux/sched.h> /* For current */

#include <linux/tty.h> /* tty ¼±¾ðµéÀ» À§ÇØ */

 

/* ÇöÀç ŽºÅ©¿¡¼­ ÀÌ¿ëµÇ´Â ÀûÀýÇÑ tty¿¡ ¹®ÀÚ¿­À» Ç¥½ÃÇÑ´Ù. */

void print_string(char *str)

{

struct tty_struct *my_tty;

 

/* ÇöÀç ŽºÅ©¸¦ À§ÇÑ tty */

my_tty = current->tty;

 

/* my_ttyÀÌ NULLÀ̸é, ÇÁ¸°Æ®ÇÒ tty°¡ ¾ø´Ù´Â ÀǹÌ(¿¹¸¦ µé¾î, ¸¸¾à µ¥¸óÀ̶ó¸é).

ÀÌ °æ¿ì¿¡´Â, ¾Æ¹« °Íµµ ÇÒ ¼ö ¾ø´Ù. */

if (my_tty != NULL)

{

/*

my_tty->driver°¡ ttyÀÇ ÇÔ¼öµéÀÇ ±¸Á¶Ã¼À̸ç, À̵é Áß Çϳª(write)°¡ tty¿¡ ¹®

ÀÚ¿­À» ¾²´Âµ¥ ÀÌ¿ëµÈ´Ù. »ç¿ëÀÚ ¸Þ¸ð¸® ¼¼±×¸ÕÆ®, Ä¿³Î ¸Þ¸ð¸® ¼¼±×¸ÕÆ®, ¸ðµÎ¿¡

¼­ ¹®ÀÚ¿­À» °¡Á®¿Ã ¼ö ÀÖ´Ù.

 

ÀÌ ÇÔ¼öÀÇ Ã¹ ¹ø° ÀÎÀÚ´Â, º¸Åë µ¿ÀÏÇÑ ÇÔ¼ö°¡ È®½ÇÇÑ ÇüÅÂÀÇ ¸ðµç tty¸¦ À§Çؼ­

ÀÌ¿ëµÇ±â ¶§¹®¿¡, ¾²·Á´Â ttyÀÌ´Ù. µÎ ¹ø° ÀÎÀÚ´Â ÇÔ¼ö°¡ Ä¿³Î ¸Þ¸ð¸®(0) ¶Ç´Â

»ç¿ëÀÚ ¸Þ¸ð¸®(0ÀÌ ¾Æ´Ñ °ª)¿¡¼­ ¹®ÀÚ¿­À» ¼ö½ÅÇÒ °ÍÀÎÁö¸¦ Á¤ÇÑ´Ù. ¼¼ ¹ø° ÀÎÀÚ

´Â ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍÀ̸ç, ³× ¹ø° ÀÎÀÚ´Â ¹®ÀÚ¿­ÀÇ ±æÀÌÀÌ´Ù.

*/

 

(*(my_tty->driver).write)(

my_tty, /* tty ÀڽŠ*/

0, /* »ç¿ëÀÚ ¿µ¿ª¿¡¼­ ¹®ÀÚ¿­À» °¡Á®¿ÀÁö ¾Ê´Â´Ù. */

str, /* ¹®ÀÚ¿­ */

strlen(str)); /* ±æÀÌ */

/*

tty´Â ¿ø·¡ ASCII Ç¥ÁØÀ» Áؼö(Åë»óÀûÀ¸·Î)ÇÏ´Â Çϵå¿þ¾î ÀåÄ¡ÀÌ´Ù. ASCII¿¡ ÀÇÇÏ

¸é, »õ·Î¿î ÁÙ·Î À̵¿Çϱâ À§ÇØ µÎ ¹®ÀÚ°¡, CR & LF, ÇÊ¿äÇÏ´Ù. ¹Ý¸é¿¡, À¯´Ð½º¿¡

¼­´Â ASCIIÀÇ LF°¡ µÎ °¡Áö ¸ñÀû¿¡ ÀÌ¿ëµÈ´Ù - CRÀ» ÀÌ¿ëÇÒ ¼ö ¾ø±â¿¡ \nÀ» ÀÌ¿ë

ÇÒ ¼ö ¾ø°í LFÀÇ ÈÄ¿¡ ´ÙÀ½ ÁÙÀÌ Ä®·³ÀÇ ¿À¸¥ÂÊ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.

 

ÀÌ°ÍÀÌ À¯´Ð½º¿Í À©µµ¿ì¿¡¼­ ÅؽºÆ® ÆÄÀÏÀÌ ´Ù¸¥ ÀÌÀ¯ÀÌ´Ù. CP/M¿¡¼­ ÀÌ°ÍÀÌ ÆÄ»ý

µÇ¾úÀ¸¸ç, MS-DOS¿Í À©µµ¿ìó·³, ASCII Ç¥ÁØÀº ¾ö°ÝÇÏ°Ô ÁؼöµÇ±â¿¡, »õ·Î¿î ÁÙÀº

LF¿Í CR¸ðµÎ°¡ ¿ä±¸µÈ´Ù.

*/

(*(my_tty->driver).write)(my_tty, 0, "\015\012", 2);

}

}

 

/* ¸ðµâÀÇ ÃʱâÈ­¿Í »èÁ¦ */

/* ¸ðµâÀÇ ÃʱâÈ­ - /proc¿¡ ÆÄÀÏ µî·Ï */

int init_module()

{

print_string("Module Inserted");

return 0;

}

 

/* »èÁ¦ - /proc¿¡¼­ ÆÄÀÏ Á¦°Å */

void cleanup_module()

{

print_string("Module Removed");

}

 

Á¦ 10 Àå

 

ŽºÅ© ½ºÄÉÁÙ¸µ

 

¸Å¿ì ÀÚÁÖ, housekeeping:'¹®Á¦ ÇØ°á¿¡ Á÷Á¢ °ü¿©ÇÏÁö ¾Ê´Â ¿î¿µ ·çƾ' ŽºÅ©¸¦ ÁöÁ¤

ÇÑ ½Ã°£¿¡ ¼öÇàÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. ŽºÅ©°¡ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ¿Ï·áÇÏ°Ô ÇÏ·Á¸é, ÀÌ°ÍÀ»

crontab ÆÄÀÏ¿¡ ³Ö¾î ¼öÇàÇÑ´Ù. ŽºÅ©°¡ Ä¿³Î ¸ðµâ¿¡ ÀÇÇØ ¿Ï·áÇÏ°Ô ÇÏ·Á¸é, µÎ °¡ÁöÀÇ

°¡´É¼ºÀ» °¡Áø´Ù. ù ¹ø°´Â ÇÊ¿äÇÒ ¶§ ½Ã½ºÅÛ ÄÝ¿¡ ÀÇÇØ ¸ðµâÀÌ ±ú¾î³ªµµ·Ï crontab

ÆÄÀÏ¿¡ ÇÁ·Î¼¼½º¸¦ ³Ö´Â °ÍÀÌ°í, ¿¹¸¦ µé¸é ÆÄÀÏ ¿­±â¿¡ ÀÇÇÑ. ÀÌ°ÍÀº ¾ÆÁÖ ºñÈ¿À²Àû

ÀÌ´Ù, ±×·¯³ª --- crontabÀÇ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ Á¦°ÅÇϰųª, ¸Þ¸ð¸®¿¡¼­ »õ·Î¿î ½ÇÇà

°¡´ÉÇÑ ÇÁ·Î¼¼½º¸¦ Àаųª, ¸Þ¸ð¸®ÀÇ ¾îµð¿¡¼­µç Ä¿³Î ¸ðµâÀ» ±ú¿ì°íÀÚ ÇÏ´Â °æ¿ì¿¡´Â

À¯¿ëÇÏ´Ù.

ÀÌ·¯ÇÑ ÀÏ ´ë½Å¿¡, ŸÀÌ¸Ó ÀÎÅÍ·´Æ®ÀÇ È£Ãâ¿¡ ÀÇÇØ ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ Å½ºÅ©

¸¦ ¸¸µç ¹æ¹ýÀ̸ç, ±¸Á¶Ã¼ tq_struct¿¡ ÀÇÇØ ¸¸µé¾îÁö°í, ¿©±â¿¡ ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ Áö

Á¤ÇÏ°Ô µÈ´Ù. À̶§, tq_timer¿¡ ÀÇÇØ È£ÃâµÇµµ·Ï ŽºÅ© ¸ñ·Ï»óÀÇ Å½ºÅ©¸¦ queue_ta-

sk¿¡ ³Ö°ÔµÇ¸ç, ÀÌ ¸ñ·ÏÀÇ Å½ºÅ©´Â ´ÙÀ½ ŸÀÌ¸Ó ÀÎÅÍ·´Æ®¿¡¼­ ½ÇÇàµÈ´Ù. ÇÔ¼ö°¡ °è¼Ó

½ÇÇàµÇµµ·Ï À¯ÁöÇØ¾ß Çϱ⠶§¹®¿¡, ´ÙÀ½ ŸÀÌ¸Ó ÀÎÅÍ·´Æ®¿¡¼­ ½ÇÇàµÇµµ·Ï È£ÃâµÉ ¶§¸¶

´Ù tq_timer»ó¿¡ ÀÌ°ÍÀ» ´Ù½Ã ³Ö´Â ÀÏÀÌ ÇÊ¿äÇÏ´Ù.

¿©±â¼­ ±â¾ïÇØ¾ß ÇÒ Áß¿äÇÑ Á¡ÀÌ Çϳª ÀÖ´Ù. ¸ðµâÀÌ rmmod¿¡ ÀÇÇØ Á¦°ÅµÉ ¶§, ù ¹ø°·Î

ÂüÁ¶ Ä«¿îÅ͸¦ °Ë»çÇÑ´Ù. ÀÌ°ÍÀÌ 0À̸é, module_cleanupÀÌ Á¤»óÀûÀ¸·Î È£ÃâµÈ °ÍÀÌ´Ù.

À̶§, ¸ðµâÀº ¸Þ¸ð¸®¿¡¼­ °ü°èµÈ ¸ðµç ÇÔ¼ö¸¦ Á¦°ÅÇÑ´Ù. ¸¸¾à ŸÀ̸ÓÀÇ Å½ºÅ© ¸ñ·Ï

»ó¿¡ ´õ ÀÌ»ó À¯¿ëÇÏÁö ¾ÊÀº À̵é ÇÔ¼öµé Áß ÇϳªÀÇ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇϰԵǸé, ´©±¸µµ

À̸¦ ¾ËÁö ¸øÇÑ´Ù. ³ªÁß¿¡ ³ªÀÌ°¡ µç ÈÄ(ÄÄÇ»ÅÍÀÇ °üÁ¡¿¡¼­, Àΰ£ÀÇ °üÁ¡ÀÌ ¾Æ´Ñ,

1/100ÃÊ º¸´Ù ÀûÀ» °ÍÀÌ´Ù), Ä¿³ÎÀº ŸÀ̸Ӹ¦ °¡Áö°í ŽºÅ© ¸ñ·Ï»óÀÇ Å½ºÅ©¸¦ È£Ãâ

ÇÏ·Á ÇÒ °ÍÀÌ´Ù. ºÒÇàÈ÷µµ, ÀÌ ÇÔ¼ö´Â ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ´ëºÎºÐÀÇ °æ¿ì, ÀÌ°Í

Àº »ç¿ëµÇÁö ¾Ê°Ô µÈ ¸Þ¸ð¸® ÆäÀÌÁöÀ̸ç, ¿À·ù ¸Þ½ÃÁö¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ±×·¯³ª, ¸¸

¾à ´Ù¸¥ Äڵ尡 µ¿ÀÏÇÑ ¸Þ¸ð¸®ÀÇ À§Ä¡¿¡ Á¸ÀçÇϸé, ¸Å¿ì À߸øµÈ °á°ú¸¦ ¾ò°ÔµÈ´Ù. ºÒ

ÇàÈ÷µµ, ŽºÅ©ÀÇ ¸ñ·ÏÀ¸·ÎºÎÅÍ Å½ºÅ©¸¦ Á¦°ÅÇÒ ½¬¿î ¹æ¹ýÀ» °®°í ÀÖÁö ¸øÇÏ´Ù. cle-

anup_moduleÀÌ ¿¡·¯ ÄÚµå¿Í ÇÔ²² ¸®ÅϵÇÁö ¾ÊÀ¸¹Ç·Î(void ÇÔ¼öÀÌ´Ù), ÀÌÀÇ ÇØ°áÃ¥Àº

¸ðµç °ÍÀÌ ¸®ÅϵÇÁö ¾Ê°Ô ÇÏ´Â °ÍÀÌ´Ù. ´ë½Å¿¡, ÀÌ°ÍÀº ´ë±â ÇÁ·Î¼¼½º¿¡ rmmod¸¦ ³Ö±â

À§ÇØ sleep_on¶Ç´Â module_sleep_on(*1)À» È£ÃâÇÑ´Ù. ±×Àü¿¡, ÀÌ°ÍÀº Àü¿ª º¯¼ö¸¦ Áö

Á¤ÇÏ¿© ÇÔ¼ö(rmmod)°¡ ŸÀÌ¸Ó ÀÎÅÍ·´Æ®·Î È£ÃâµÈ ÈÄ Á¦°ÅµÇµµ·Ï ÇÑ´Ù. ´ÙÀ½ ŸÀÌ¸Ó ÀÎ

ÅÍ·´Æ®¿¡¼­ rmmod ÇÁ·Î¼¼½º´Â ±ú¾î³ª°í, Å¥¾È¿¡ ´õ ÀÌ»óÀÇ ÇÔ¼ö°¡ ¾øµµ·Ï Á¦°ÅÇÏ°í ¸ð

µâ¿¡¼­ ¾ÈÀüÇÏ°Ô Á¦°ÅµÈ´Ù.

 

°¢ÁÖ1 *************************************************************************

½ÇÁ¦·Î ¶È°°Àº ÇÔ¼öÀÌ´Ù.

*******************************************************************************

 

<sched.c>

 

/* sched.c - ŸÀÌ¸Ó ÀÎÅÍ·´Æ® »ó¿¡¼­ È£ÃâµÇ¾îÁö´Â ÇÔ¼öµéÀÇ ½ºÄÉÁÙ¸µ */

 

/* Copyright(C) 1998 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ¼öÇàÇÑ´Ù */

#include <linux/module.h> /* Ưº°È÷, ¸ðµâ¿¡¼­ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â*/

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

 

/* proc fs¿¡ ÀÌ¿ëµÇ±â¿¡ */

#include <linux/proc_fs.h>

 

/* ½ºÄÉÁÙ °¡´ÉÇÑ Å½ºÅ©¸¦ ¿©±â¿¡ */

#include <linux/tqueue.h>

 

/* ´ë±â »óÅÂ¿Í ³ªÁß¿¡ ±ú¿ìµµ·Ï Çϱâ À§ÇØ ÇÊ¿äÇÏ´Ù */

#include <linux/sched.h>

 

/* 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ À̸¦ À§ÇÑ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, 2.0.35¿¡¼­´Â Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ°÷¿¡ Ãß°¡ÇÑ´Ù.*/

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

/* È£ÃâµÈ ŸÀÌ¸Ó ÀÎÅÍ·´Æ®ÀÇ È½¼ö */

static int TimerIntrpt = 0;

 

/* cleanup¿¡ ÀÇÇØ ÀÌ¿ëµÈ´Ù. intrpt_routineÀÌ task_queue¿¡ ³²¾ÆÀÖ´Â µ¿¾È ¸ðµâ¿¡¼­

Á¦°ÅµÇ´Â °ÍÀ» ¸·±âÀ§ÇØ */

static struct wait_queue *WaitQ = NULL;

static void intrpt_routine(void *);

 

/* ÀÌ Å½ºÅ©¸¦ À§ÇÑ task_queue ±¸Á¶Ã¼, tqueue.h·Î ºÎÅÍ */

static struct tq_struct Task = {

NULL, /* ¸ñ·ÏÀÇ ´ÙÀ½ Ç׸ñ - queue_task°¡ ÀÌ ÀÏÀ» ÇÑ´Ù. */

0, /* task_queue¿¡ ¾ÆÁ÷ ¾Æ¹« °Íµµ Ãß°¡µÇÁö ¾Ê¾Ò´Ù. */

intrpt_routine, /* ½ÇÇà ÇÔ¼ö */

NULL /* ÇÔ¼ö¸¦ À§ÇÑ void* ÀÎÁö */

};

 

/* ÀÌ ÇÔ¼ö´Â ŸÀÌ¸Ó ÀÎÅÍ·´Æ®¿¡¼­ È£ÃâµÈ´Ù. void* Æ÷ÀÎÅÍ¿¡ À¯ÀÇ - ŽºÅ© ÇÔ¼öµéÀº

* ¿©·¯ ¸ñÀû¿¡ ÀÌ¿ëµÇ¸ç, ¸Å¹ø ´Ù¸¥ ÀÎÀÚ¸¦ °¡Áø´Ù. */

static void intrpt_routine(void *irrelevant)

{

/* Ä«¿îÅ͸¦ Áõ°¡ */

TimerIntrpt++;

 

/* Á¦°ÅµÇ±æ ¿øÇϸé */

if (WaitQ != NULL)

wake_up(&WaitQ); /* ÀÌÁ¦ cleanup_moduleÀº ¸®ÅÏ °¡´ÉÇÏ´Ù. */

else

queue_task(&Task, &tq_timer); /* task_queue¾È¿¡ ´Ù½Ã Áý¾î³Ö´Â´Ù. */

}

 

/* proc fs ÆÄÀÏ¿¡ µ¥ÀÌÅÍ ¾²±â */

int procfile_read(char *buffer, char **buffer_location, off_t offset,

int buffer_length, int zero)

{

int len; /* ½ÇÁ¦·Î ÀÌ¿ëµÈ Å©±â */

 

/* ÀÌ°ÍÀº Á¤ÀûÀ̸ç ÀÌ ÇÔ¼ö¸¦ ¹þ¾î³ªµµ ¿©ÀüÈ÷ ¸Þ¸ð¸®¿¡ ³²¾Æ ÀÖ´Ù. */

static char my_buffer[80];

static int count = 1;

 

/* ¸ðµç Á¤º¸¸¦ Çѹø¿¡ ÁְԵǸç, ´õ ÀÌ»óÀÇ Á¤º¸°¡ ¾ø´À³Ä°í ¹°À¸¸é ´ë´äÀº

Ç×»ó '¾ø´Ù'ÀÌ´Ù. */

if (offset > 0) return 0;

 

/*¹öÆÛ¸¦ ä¿ì°í ±× Å©±â¸¦ ¾ò´Â´Ù. */

len = sprintf(my_buffer, "Timer was called %d times so far\n", TimerIntrpt);

count++;

 

/* ÇÔ¼ö¿¡ ¹öÆÛ¸¦ ¾îµð¿¡¼­ È£ÃâÇß´ÂÁö ¾Ë·ÁÁØ´Ù. */

*buffer_location = my_buffer;

 

/* Å©±â¸¦ ¸®ÅÏ */

return len;

}

 

struct proc_dir_entry Our_Proc_File =

{

0, /* Inode ¹øÈ£ - ¹«½Ã, proc_register_dynamic¿¡ ÀÇÇØ ¼öÁ¤µÈ´Ù. */

5, /* ÆÄÀÏ À̸§ÀÇ ±æÀÌ */

"sched",/* ÆÄÀÏ À̸§ */

S_IFREG | S_IRUGO,/* ÆÄÀÏ ¸ðµå - ¼ÒÀ¯ÀÚ, ±×·ì, ¸ðµÎ°¡ ÀÐÀ» ¼ö ÀÖ´Â Á¤±Ô ÆÄ

ÀÏ */

1, /* ¸µÅ©ÀÇ °³¼ö(ÆÄÀÏÀÌ ÂüÁ¶µÇ´Â °÷ÀÇ µð·ºÅ丮µé) */

0, 0, /* ÆÄÀÏÀÇ uid¿Í gid - ·çÆ®¿¡ ÀÇÇØ ÁÖ¾îÁø´Ù. */

80, /* ls¿¡ ÀÇÇØ Ç¥½ÃµÇ´Â ÆÄÀÏÀÇ Å©±â */

NULL, /* inodeÀ» ´Ù·ç´Â ÇÔ¼ö(linking, removing, etc.) ¾î¶² °Íµµ Áö¿øÇÏÁö

¾Ê´Â´Ù. */

procfile_read, /* ÀÌ ÆÄÀÏÀ» À§ÇÑ Àбâ ÇÔ¼ö, ´©±º°¡ ÀÌ°ÍÀ» ÀÐÀ»·Á ÇÒ ¶§ È£Ãâ

µÈ´Ù. */

NULL /* Æ۹̼Ç, ¼ÒÀ¯ÀÚµî, ÆÄÀÏÀÇ inode¸¦ ¹Ù²Ù±â À§ÇÑ ÇÔ¼ö°¡ À§Ä¡ÇÑ´Ù. */

};

 

/* ¸ðµâ ÃʱâÈ­ - /proc ÆÄÀÏ¿¡ µî·Ï */

int init_module()

{

/* tq_timer ŽºÅ© Å¥¾È¿¡ ŽºÅ©¸¦ ³Ö´Â´Ù. ´ÙÀ½ ŸÀÌ¸Ó ÀÎÅÍ·´Æ®¿¡¼­ ½ÇÇàµÉ

°ÍÀÌ´Ù. */

queue_task(&Task, &tq_timer);

 

/* proc_register_dynamicÀÌ ¼º°øÀÌ¸é ¼º°ø, ¾Æ´Ï¸é ½ÇÆÐ */

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

return proc_register(&proc_root, &Our_Proc_File);

#else

return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

}

 

/* Á¦°Å */

void cleanup_module()

{

/* /proc¿¡¼­ Á¦°ÅÇϱâ */

proc_unregister(&proc_root, Our_Proc_File.low_ino);

 

/*

intrpt_routineÀÌ ¸¶Áö¸·¿¡ È£ÃâµÉ ¶§±îÁö ´ë±â. intrpt_routine¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®

¸¦ ÇØÁ¦ÇÏ°í ŽºÅ©°¡ ÀÛ¾÷µéÀ» ÂüÁ¶ÇÏ´Â tq_timerµ¿¾È ´ë±âÇϱâ À§ÇØ ÇÊ¿äÇÏ´Ù.

¿©±â¿¡¼­ ½Ã±×³ÎÀÌ Çã°¡µÇÁö ¾ÊÀ½¿¡ ÁÖÀÇÇ϶ó.

WaitQ°¡ NULLÀÌ ¾Æ´Ï¹Ç·Î, ÀÚµ¿ÀûÀ¸·Î ÀÎÅÍ·´Æ® ·çƾ¿¡ Á¾·áµÉ ½Ã°£À» ¾Ë¸°´Ù.

*/

sleep_on(&WaitQ);

}

 

Á¦ 11 Àå

 

ÀÎÅÍ·´Æ® 󸮱â

 

¸¶Áö¸·ÀåÀº Á¦¿ÜÇÏ°í, Ä¿³Î³»ÀÇ ÇÁ·Î¼¼½ºÀÇ ¿äû¿¡ ´ëÇÑ ÀÀ´ä ó¸®ÀÇ °ÅÀÇ ÀüºÎ¸¦ ´Ù

·ç¾ú´Ù, Ưº°ÇÑ ÆÄÀÏÀÇ ´Ù·ç±â, ioctl¿¡ º¸³»±â, ½Ã½ºÅÛ È£Ãâ µî. ±×·¯³ª, Ä¿³ÎÀÇ ÀÛ

¾÷Àº ÇÁ·Î¼¼½ºÀÇ ¿äû¿¡ ´ëÇÑ ÀÀ´ä¸¸ÀÌ ÀüºÎ´Â ¾Æ´Ï´Ù. ´Ù¸¥ ÀÛ¾÷Àº, ÀÌ°ÍÀº ¸Å¿ì Áß

¿äÇÏ´Ù, ÄÄÇ»ÅÍ¿¡¼­ÀÇ Çϵå¿þ¾î ÀåÄ¡¸¦ ¿¬°áÇÏ´Â °ÍÀÌ´Ù.

CPU¿Í ÄÄÇ»ÅÍÀÇ ³ª¸ÓÁö Çϵå¿þ¾î»çÀÌÀÇ »óÈ£ ÀÛ¿ë¿¡´Â µÎ °¡Áö ÇüÅ°¡ ÀÖ´Ù. ±× ù ¹ø

° ÇüÅ´ CPU°¡ Çϵå¿þ¾î¿¡ ¸í·ÉÀ» ÁÙ ¶§¿Í,Çϵå¿þ¾î°¡ CPU¿¡ ¹«¾ð°¡ ¸»ÇÒ ÇÊ¿ä°¡ ÀÖ

À» ¶§ÀÌ´Ù. µÎ ¹ø° ÀÎÅÍ·´Æ® È£ÃâÀº, CPU°¡ ¾Æ´Ñ Çϵå¿þ¾î¿¡ ´ëÇØ ÆíÇÏ°Ô Ãë±ÞµÇ¾î¾ß

Çϱ⿡ Çϵå¿þ¾î¿¡ ¹ÐÁ¢ÇÏ°Ô ¿¬°áµÈ´Ù. ÀüÇüÀûÀ¸·Î Çϵå¿þ¾î ÀåÄ¡´Â ¸Å¿ì ÀûÀº ¾çÀÇ

¸Þ¸ð¸®¸¸À» °¡Áö¸ç, ÀÌ ³»¿ëÀ» À¯¿ëÇÑ ½ÃÁ¡¿¡¼­ ÀÐÁö ¾ÊÀ¸¸é ÀÒ¾î¹ö¸®°Ô µÈ´Ù.

¸®´ª½º¿¡¼­, Çϵå¿þ¾î ÀÎÅÍ·´Æ®´Â IRQ(Iinterrupt RequestÀÇ ¾à¾î)(*1)¶ó ºÒ¸®¾îÁø´Ù.

µÎ °¡Áö ÇüÅÂÀÇ, ªÀº(short) ±×¸®°í ±ä(long), ÀÎÅÍ·´Æ®°¡ ÀÖ´Ù. ªÀº IRQ´Â ¸Å¿ì

ªÀº ±â°£ÀÇ ½Ã°£¿¡ ½ÇÇàµÇ¾î¾ß Çϸç, ³ª¸ÓÁö ½Ã°£µ¿¾È ÄÄÇ»ÅÍ´Â ±ÝÁöµÇ°í ´Ù¸¥ ÀÎÅÍ

·´Æ®´Â ¼öÇàµÇÁö ¾Ê´Â´Ù. ±ä IRQ´Â Á» ´õ ±ä ½Ã°£À» °¡Áö¸ç, ½ÇÇàµÇ´Â µ¿¾È ´Ù¸¥ ÀÎÅÍ

·´Æ®°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù(µ¿ÀÏÇÑ ÀåÄ¡¿¡¼­°¡ ¾Æ´Ñ). ¸ðµç ÀÎÅÍ·´Æ®°¡ °¡´ÉÇÏ´Ù¸é, ±ä Çü

Å·Π¼±¾ðµÇ´Â °ÍÀÌ ÁÁ´Ù.

CPU°¡ ÀÎÅÍ·´Æ®¸¦ ¼ö½ÅÇϸé, ¹«¾ùÀ» ÇÏ°Ç ÀÏ´Ü ¸ØÃß°í(Á»´õ Áß¿äÇÑ ÀÎÅÍ·´Æ®´Â Á¦¿ÜÇÏ

°í, ¼øÀ§°¡ ³ôÀº ÀÎÅÍ·´Æ®°¡ ¿Ï·áµÇ¸é ÀÌ°ÍÀÌ Ã³¸®µÈ´Ù), ½ºÅûóÀÇ ÀÎÀÚµéÀ» ´ëÇÇÇÏ°í

ÀÎÅÍ·´Æ® 󸮱⸦ È£ÃâÇÑ´Ù. ÀÌ´Â ½Ã½ºÅÛÀÌ ºÒ¾ÈÁ¤ÇÑ »óÅ¿¡ ºüÁöÁö ¾Ê°Ô Áß¿äÇÑ °Í

µéÀº ½ºÅÿ¡ ´ëÇǽÃÅ°°í ÀÎÅÍ·´Æ® 󸮱⿡¼­ Çã°¡µÇÁö ¾Ê´Â´Ù´Â ÀǹÌÀÌ´Ù. ÀÎÅÍ·´Æ®

󸮱⿡¼­ÀÇ ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÃ¥Àº ÇÊ¿äÇÑ ÀÏÀ», º¸ÅëÀº Çϵå¿þ¾î·ÎºÎÅÍ Àаųª

Çϵå¿þ¾î¿¡ ¹«¾ð°¡¸¦ º¸³»´Â, ±×¸®°í ³ªÁß¿¡ »õ·Î¿î Á¤º¸ÀÇ Ã³¸®¸¦ À§ÇÑ ½ºÄÉÁÙ(ÀÌ°Í

Àº 'bottom half'¶ó ºÒ¸°´Ù)µîÀ», Áï½Ã ¼öÇàÇÏ°í ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù. Ä¿³ÎÀº °¡´ÉÇÑ ÇÑ

'bottom half'ÀÇ È£ÃâÀ» º¸ÁõÇÑ´Ù --- ÀÌ°ÍÀÌ ¼öÇàµÇ¸é, ¸ðµç °ÍÀÌ Ä¿³Î ¸ðµâ ¾È¿¡¼­

Çã°¡µÈ ¸ðµç °ÍÀÌ Çã°¡µÇ¾î Áø´Ù.

ÀÌ·¯ÇÑ °ÍÀ» ¼öÇàÇÏ´Â ¹æ¹ýÀº °ü·ÃµÈ IRQ°¡ ¼ö½ÅµÇ¾úÀ» ¶§ È£ÃâµÈ ÀÎÅÍ·´Æ® 󸮱⸦

¾ò±â À§ÇØ request_irq¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù(ÀÎÅÚ ±¸Á¶¿¡¼­ ÀÌ°ÍÀº 16°³Áß ÇϳªÀÌ´Ù).

ÀÌ ÇÔ¼ö´Â IRQ ¹øÈ£, ÇÔ¼öÀÇ À̸§, Ç÷¡±×, /proc/interrupts¸¦ À§ÇÑ À̸§°ú ÀÎÅÍ·´Æ®

󸮱⿡¼­ Àü´ÞµÈ ÀÎÀÚ¸¦ ¼ö½ÅÇÑ´Ù. ÀÌ Ç÷¡±×´Â IRQ¸¦ °øÀ¯ÇÏ°íÀÚ ÇÏ´Â ´Ù¸¥ ÀÎÅÍ·´

Æ®¸¦ Ç¥½ÃÇϱâ À§ÇØ SH_SHIRQ¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ°í SA_INTERRUPT´Â ÀÌ°ÍÀÌ ºü¸¥ ÀÎÅÍ·´Æ®

ÀÓÀ» Ç¥½ÃÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÀÌ IRQ»ó¿¡ 󸮱Ⱑ ÀÖÁö ¾ÊÀ» ¶§³ª µÑÀÇ °øÀ¯¸¦ Çã°¡ÇÏ

¿´À» ¶§¸¸ ¼öÇàµÉ °ÍÀÌ´Ù.

±×¸®°í ³ª¸é, ÀÎÅÍ·´Æ® 󸮱âÀÇ ¾È¿¡¼­, Çϵå¿þ¾î¿Í Åë½ÅÇÏ°Ô µÇ°í 'bottom half'¸¦

½ºÄÉÁÙÇϱâ À§ÇØ queue_task_irq¿Í tq_immediate¿Í mark_bh(BH_IMMEDATE)¸¦ ÀÌ¿ëÇÏ°Ô

µÈ´Ù. ¹öÀü 2.0¿¡¼­ Ç¥ÁØ queue_task¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â ÀÌÀ¯´Â ÀÎÅÍ·´Æ®°¡ ´©±º°¡ÀÇ

queue_task(*2)ÀÇ Áß°£¿¡¼­ ¹ß»ýÇÒ ¼öµµ À־ÀÌ´Ù. Ãʱ⠹öÀüÀÇ ¸®´ª½º¿¡¼­´Â ´ÜÁö

32°³ÀÇ 'bottom half'¹è¿­¸¸ÀÌ °¡Á³À¸¹Ç·Î mark_bh°¡ ÇÊ¿äÇÏ°í ±×µé Áß Çϳª(BH_IMME-

DATE)°¡ 'bottom-half'¸¦ ¾òÁö ¸øÇÑ ÀåÄ¡µéÀ» À§ÇÑ 'bottom half'µéÀÇ ¿¬°á ¸®½ºÆ®¿¡

ÀÌ¿ëµÈ´Ù.

 

°¢ÁÖ1 ************************************************************************

ÀÌ°ÍÀº ÀÎÅÚ ±¸Á¶ÀÇ Ç¥ÁØ ¸í¸í¹ýÀÌ´Ù.

******************************************************************************

 

°¢ÁÖ2 ************************************************************************

queue_task_irq ´Â Àü¿ª Àá±Ý¿¡ ÀÇÇØ ÀÌ°ÍÀ¸·ÎºÎÅÍ º¸È£µÈ´Ù. --- 2.2¿¡¼­´Â ¾ø´Ù

queue_task_irq ¿Í queue_task´Â Àá±Ý¿¡ ÀÇÇØ º¸È£µÈ´Ù.

******************************************************************************

 

11.1 ÀÎÅÚ ±¸Á¶¿¡¼­ Å°º¸µå

 

°æ°í: ÀÌ ÀåÀÇ ºÎºÐÀº ÀüÀûÀ¸·Î ÀÎÅÚ ±¸Á¶¿¡ ÀÇÁ¸ÀûÀÌ´Ù. ÀÎÅÚ ±¸Á¶¿¡¼­ ½ÇÇàÇÏ´Â °Í

ÀÌ ¾Æ´Ï¶ó¸é, ¿Ã¹Ù¸£°Ô ¼öÇàµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿©±âÀÇ Äڵ带 ÄÄÆÄÀÏ ÇÏ·Á°í ½ÃµµÇÏÁö

¸»¶ó.

 

ÀÌ ÀåÀÇ ¿¹Á¦ ÄÚµå´Â ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. ÇÑÆíÀ¸·Î ÀÌ°ÍÀº ¸ðµç »ç¶÷¿¡°Ô ÀÇ¹Ì ÀÖ

´Â °á°ú¸¦ °¡Á®´ÙÁÖ´Â ¿¹Á¦ÀÌ´Ù. ´Ù¸¥ ÇÑÆíÀ¸·Î, Ä¿³ÎÀÌ ÀÌ¹Ì º¸ÅëÀÇ ÀåÄ¡µé¿¡ ´ëÇÑ

µå¶óÀ̹ö¸¦ ¸ðµÎ Æ÷ÇÔÇÏ°í ÀÖ°í, ÀÌ·± ÀåÄ¡ µå¶óÀ̹öµéÀº ³»°¡ ÀÛ¼ºÇÑ °Í°ú °°ÀÌ Á¸Àç

ÇÒ¼ö ¾ø´Ù. Å°º¸µå ÀÎÅÍ·´Æ®¸¦ À§ÇÑ ÀÌ Äڵ带 À§ÇÑ ÇØ°áÃ¥À¸·Î ³»°¡ ¹ß°ßÇÑ °ÍÀº, ¿ì

¼± ¿ø·¡ÀÇ Å°º¸µå ÀÎÅÍ·´Æ®¸¦ ºÒ´ÉÀ¸·Î ÇÏ´Â °ÍÀÌ´Ù. Ä¿³ÎÀÇ ¼Ò½º ÆÄÀÏ¿¡ Á¤Àû ½É¹úÀÌ

Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î(driver/char/keyboards.c), ÀÌ°ÍÀ» Àç ÀûÀçÇÒ ¹æ¹ýÀº ¾ø´Ù. ÀÌ ÄÚ

µå¸¦ insmodÇϱâ Àü¿¡ ´Ù¸¥ Å͹̳ο¡¼­ sleep 120À» ½ÇÇàÇÑ´Ù.

ÀÌ ÄÚµå´Â, ÀÎÅÚ ±¸Á¶¿¡¼­ Å°º¸µåÀÇ Á¦¾î¸¦ ÇÏ´Â IRQÀÎ, IRQ 1¿¡ ¹­¿©ÀÖ´Ù. Å°º¸µå ÀÎ

ÅÍ·´Æ®¸¦ ¼ö½ÅÇϸé, Å°º¸µåÀÇ »óŸ¦ Àаí(inb(0x64)°¡ ÀÌ¿ëµÈ´Ù) Å°º¸µå¿¡¼­ ¸®ÅϵÈ

°ªÀ» Á¶»çÇÑ´Ù. ÀÌÁ¦ Ä¿³ÎÀº ÀÌ¿ëµÈ Å° ÄÚµå(½ºÄµ ÄÚµåÀÇ Ã³À½ 7 ºñÆ®µé)ÀÇ °ªÀ», ÀÌ

°ÍÀº ´­·ÁÁö°Å³ª(8¹ø° ºñÆ®°¡ 0À̸é) ¶Ç´Â ¶³¾îÁ³À»(¸¸¾à 1À̸é), got_char¿¡¼­ ¾ò´Â

´Ù.

 

<intrpt.c>

 

/* intrpt.c - ÀÎÅÍ·´Æ® 󸮱â */

 

/* Copyright (C) 1998 by Ori Pomerantz */

 

/* ÇÊ¿äÇÑ Çì´õ ÆÄÀϵé */

/* Ä¿³Î ¸ðµâ¿¡¼­ÀÇ Ç¥ÁØ Çì´õ */

#include <linux/kernel.h> /* Ä¿³Î ÀÛ¾÷À» ÇÑ´Ù. */

#include <linux/module.h> /* Ưº°È÷, ¸ðµâ */

 

/* CONFIG_MODVERSIONS ´Ù·ç±â */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif

#include <linux/sched.h>

#include <linux/tqueue.h>

 

/* ÀÎÅÍ·´Æ®¸¦ ¿øÇÑ´Ù. */

#include <linux/interrupt.h>

#include <asm/io.h>

 

/* 2.2.3¿¡¼­ /usr/include/linux/version.h¿¡ À̸¦ À§ÇÑ ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, 2.0.35¿¡¼­´Â Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç ÇÊ¿äÇÑ °æ¿ì¿¡ ÀÌ°÷¿¡ Ãß°¡ÇÑ´Ù.*/

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

 

/* Bottom Half - °¡´ÉÇÑ ¾ÈÀüÇÏ°Ô ¸ðµç °ÍÀ» ¼öÇàÇϵµ·Ï º¸ÅëÀº Ä¿³Î ¸ðµâ¿¡ ÀÇÇØ Çã

°¡µÇ°í Ä¿³Î¿¡ ÀÇÇØ È£ÃâµÇ¾î ¾ò°ÔµÈ´Ù. */

static void got_char(void *scancode)

{

printk("Scan Code %x %s.\n",

(int) *((char *) scancode) & 0x7F,

*((char *) scancode) & 0x80 ? "Released" : "Pressed");

}

 

/* ÀÌ ÇÔ¼ö´Â Å°º¸µå ÀÎÅÍ·´Æ®¸¦ ¼­ºñ½ºÇÑ´Ù. Å°º¸µå·ÎºÎÅÍ °ü°èµÈ Á¤º¸¸¦ Àаí Ä¿³Î

ÀÌ ¾ÈÀüÇÏ´Ù°í ¿©±â´Â ¶§¿¡ ¼öÇàÇϱâ À§ÇØ 'bottom half'¿¡¼­ ½ºÄÉÁÙ µÈ´Ù. */

void irq_handler(int irq, void *dev_id, struct pt_regs *regs)

{

/*

'bottom half'¿¡¼­ Æ÷ÀÎÅ͸¦ ÅëÇØ ÀνÄÇÒ ÇÊ¿ä°¡ Àֱ⿡ ÀÌ º¯¼öµéÀº Á¤ÀûÀÌ´Ù.

*/

static unsigned char scancode;

static struct tq_struct task =

{

NULL,

0,

got_char,

&scancode

};

unsigned char status;

 

/* Å°º¸µåÀÇ »óŸ¦ Àбâ */

status = inb(0x64);

scancode = inb(0x60);

 

/* 'bottom half'¿¡¼­ ¼öÇàµÇ±â À§ÇØ ½ºÄÉÁÙ */

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

queue_task(&task, &tq_immediate);

#else

queue_task_irq(&task, &tq_immediate);

#endif

mark_bh(IMMEDIATE_BH);

}

 

/* ¸ðµâÀÇ ÃʱâÈ­ - IRQ 󸮱âÀÇ µî·Ï */

int init_module()

{

/*

Å°º¸µåÀÇ ÀÎÅÍ·´Æ® 󸮱Ⱑ ´Ù¸¥ 󸮱â¿Í ÇÔ²² Á¸ÀçÇÒ ¼ö ¾øÀ¸¹Ç·Î, ¿©±â¿¡¼­

ó·³, ÀÛ¾÷À» Çϱâ Àü¿¡ ÀÌ°ÍÀ» ºÒ´É(free irq) À¸·Î ÇؾßÇÑ´Ù. ÀÌ°ÍÀÌ ¾îµð¿¡ ÀÖ

´ÂÁö ¸ð¸£¹Ç·Î, ³ªÁß¿¡ ¿ø»óÅ·Πº¹¿øÇÒ ¼ö ¾ø°ÔµÈ´Ù - µû¶ó¼­ ÄÄÇ»ÅÍ´Â Á¾·áµÈ

½ÃÁ¡¿¡¼­ Àç½Ãµ¿ µÉ °ÍÀÌ´Ù.

*/

free_irq(1, NULL);

 

/* IRQ 1À» ¿äû, Å°º¸µåÀÇ IRQ, irq_handler·Î °¡±â À§ÇØ. */

return request_irq(1,irq_handler,SA_IRQ,"test_keyboard_irq_handler", NULL");

 

/*

1 - Å°º¸µåÀÇ IRQ ¹øÈ£

irq_handler - 󸮱â

SA_SHIRQ - SA_SHIRQ´Â ÀÌ IRQ»ó¿¡¼­ ´Ù¸¥ 󸮱⸦ °¡Áú ¼ö ÀÖ´Ù´Â ÀǹÌ.

SA_INTERRUPT´Â ºü¸¥ ÀÎÅÍ·´Æ®¿¡¼­ 󸮱⸦ ¸¸µé±â À§ÇØ ÀÌ¿ë.

*/

}

 

/* Á¦°Å */

void cleanup_module()

{

/*

ÀÌ°ÍÀº ´ÜÁö ¿Ïº®¼ºÀ» À§ÇØ ¿©±â ÀÖ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ÀüÀûÀ¸·Î ºÎÀûÀýÇϸç,

Å°º¸µå ÀÎÅÍ·´Æ®¸¦ Àç ÀûÀçÇÒ ¾î¶² ¹æ¹ýµµ ¾øÀ¸¹Ç·Î ÄÄÇ»ÅÍ´Â ¿ÏÀüÈ÷ ¾µ ¼ö ¾ø°Ô

µÇ°í Àç ½Ãµ¿µÇ¾î¾ß¸¸ ÇÑ´Ù.

*/

free_irq(1, NULL);

}

 

Á¦ 12 Àå

 

´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½Ì

 

Çϵå¿þ¾îÀÇ ¼º´ÉÀ» Çâ»óÇÏ´Â °¡Àå ¼Õ½¬¿î ¹æ¹ýÁßÀÇ Çϳª´Â º¸µå »ó¿¡ ¸¹Àº CPU¸¦ ÀåÂø

ÇÏ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ´Ù¸¥ CPU¿¡¼­ ´ÙÀ½ ÀÛ¾÷À» ¼öÇàÇÏ°Ô Çϰųª(ºñ´ëĪÇü ´ÙÁß ÇÁ·Î

¼¼½Ì) ¶Ç´Â µ¿ÀÏÇÑ ÀÛ¾÷À» º´·Ä·Î ¼öÇàÇÏ°Ô ¸¸µé ¼öµµ ÀÖ´Ù(´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½Ì, S-

MP). ºñ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½ÌÀ» È¿À²ÀûÀ¸·Î µ¿ÀÛÇϱâ À§Çؼ­´Â ÄÄÇ»ÅÍ°¡ ÇØ¾ß ÇÒ Å½º

Å©µé¿¡ ´ëÇÑ Æ¯º°ÇÑ Áö½ÄÀÌ ¿ä±¸µÇ¸ç, ¸®´ª½º¿Í °°Àº ÀÏ¹Ý ¸ñÀûÀ» À§ÇÑ ¿î¿µÃ¼Á¦¿¡´Â

ÀûÇÕÇÏÁö ¾Ê´Ù. ´Þ¸® ¸»Çϸé, ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½ÌÀº »ó´ëÀûÀ¸·Î ½±°Ô Àû¿ëÇÒ ¼ö ÀÖ

´Ù. »ó´ëÀûÀ¸·Î ½¬¿î, Á¤È®ÇÑ Àǹ̴ --- ½ÇÁ¦·Î´Â °áÄÚ ½±Áö ¾Ê´Ù. ´ëĪÇü ´ÙÁß ÇÁ·Î

¼¼½Ì ȯ°æ¿¡¼­, CPU´Â µ¿ÀÏÇÑ ¸Þ¸ð¸®¸¦ °øÀ¯Çϸç, ÇϳªÀÇ CPU¿¡¼­ ¼öÇàµÈ °á°ú°¡ ´Ù¸¥

CPU¿¡ ÀÌ¿ëµÇ´Â ¸Þ¸ð¸®¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù. ´õ ÀÌ»ó ÀÌÀü¿¡ ÁöÁ¤ÇÑ º¯¼öÀÇ °ªÀÌ

µ¿ÀÏÇÒ Áö È®½ÅÇÒ ¼ö ¾ø´Ù --- ¼öÇàµÇ°í ÀÖÁö ¾Ê´Â µ¿¾È¿¡ ´Ù¸¥ CPU°¡ ±×°ÍÀ» ´Ù·êÁö

µµ ¸ð¸¥´Ù. ¸í¹éÇÏ°Ô, ÀÌó·³ µ¿ÀÛÇÏ´Â ÇÁ·Î±×·¥Àº ºÒ°¡´ÉÇÏ´Ù. ÇÁ·Î¼¼½º´Â º¸Åë µ¿½Ã

¿¡ ÇϳªÀÇ CPU¿¡¼­¸¸ ½ÇÇàµÉ °ÍÀ̱⿡, ÀÌ·± Á¾·ùÀÇ ÇÁ·Î¼¼½º ÇÁ·Î±×·¡¹ÖÀº ¿©±â¿¡¼­

´Ù·ê ÁÖÁ¦´Â ¾Æ´Ï´Ù. ´Ù¸¥ ÇÑÆí, Ä¿³ÎÀº, ´Ù¸¥ CPU»ó¿¡¼­ ¼öÇàµÇ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡

ÀÇÇØ È£ÃâµÇ¾îÁú °ÍÀÌ´Ù. ¹öÀü 2.0.x¿¡¼­, Àüü Ä¿³ÎÀÌ ÇϳªÀÇ °Å´ëÇÑ ½ºÇÉ ¶ôÀÇ ³»ºÎ

¿´±â¿¡ ¹®Á¦°¡ µÉ°Ô ¾ø¾ú´Ù. ÀÌ´Â ÇϳªÀÇ CPU°¡ Ä¿³ÎÀ» »ç¿ëÇÏ°í, ´Ù¸¥ CPU°¡ ÀÌ°ÍÀ»

¾ò±â ¿øÇϸé, ¿¹¸¦ µé¾î ½Ã½ºÅÛ È£Ãâ °°Àº, ´Ù¸¥ CPU´Â ¾ÕÀÇ CPU°¡ ¿Ï·áµÇ±æ ±â´Ù¸®°Ô

µÈ´Ù. ÀÌ´Â ¸®´ª½ºÀÇ SMP¸¦ ¾ÈÀüÇÏ°Ô ¸¸µéÁö¸¸, ²ûÁ÷ÇÒ Á¤µµ·Î ºñÈ¿À²ÀûÀÌ´Ù(*1).

¹öÀü 2.2.x¿¡¼­´Â, ¿©·¯ °³ÀÇ CPUµéÀÌ µ¿½Ã¿¡ ÇϳªÀÇ Ä¿³ÎÀ» »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

±×·¡¼­ ¸ðµâ ÀÛ¼ºÀÚµéÀº ÀÌ°ÍÀ» Àß ¾Ë ÇÊ¿ä°¡ ÀÖ´Ù. SMP ±â°è¸¦ Çϳª ¾ò°ÔµÇ¾ú±â¿¡,

ÀÌ Ã¥ÀÇ ´ÙÀ½ ¹öÀü¿¡¼­´Â Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» Æ÷ÇÔÇÒ ¼ö Àֱ⸦ ¹Ù¶õ´Ù.

 

°¢ÁÖ1 *************************************************************************

ÀÌ°ÍÀÇ ¿¹¿Ü´Â ¿©·¯°³ÀÇ CPU»ó¿¡ Çѹø¿¡ ¼öÇà °¡´ÉÇÑ ¾²·¹µåµÈ ÇÁ·Î¼¼½ºµéÀÌ´Ù, ÀÌ°Í

Àº SMP¿Í ÇÔ²² ÀÌ¿ëÇصµ ¾ÈÀüÇÏ´Ù.

*******************************************************************************

 

Á¦ 13 Àå

 

¹üÇϱ⠽¬¿î ½Ç¼ö

 

ÀÌÀü¿¡ ³ª´Â ¼¼»ó ¼ÓÀ¸·Î ³ª°¡´Â ±×¸®°í Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¾Ë·ÁÁÖ¾ú°í, ¿©

±â¿¡¼­ ¸î°¡Áö¸¦ ÁÖÀÇÇÒ ÇÊ¿ä°¡ ÀÖÀ½À» ¾Ë·ÁÁÖ°Ú´Ù. °æ°í¸¦ ³»Áö ¸øÇϰųª ¹«¾ð°¡ ³ª

»Û ÀÏÀÌ »ý±â¸é, ¹®Á¦¸¦ ³ª¿¡°Ô ¾Ë·Á ´Þ¶ó.

 

1. Ç¥ÁØ ¶óÀ̺귯¸®ÀÇ ÀÌ¿ëÀº ºÒ°¡´ÉÇÏ´Ù. Ä¿³Î ¸ðµâ¿¡¼­´Â ´ÜÁö Ä¿³Î ÇÔ¼ö¸¸ÀÌ ÀÌ¿ë

°¡´ÉÇϸç, À̵é ÇÔ¼ö´Â /proc/ksyms¿¡¼­ º¼ ¼ö ÀÖ´Ù.

 

2. ªÀº ½Ã°£À» À§ÇÑ ÀÏÀÌ ÇÊ¿äÇϸé ÀÎÅÍ·´Æ®¸¦ ºÒ´ÉÀ¸·Î Çصµ µÈ´Ù. ±×·¯³ª, ³ªÁß¿¡

ÀÎÅÍ·´Æ® °¡´ÉÀ¸·Î ÇÏÁö ¾ÊÀ¸¸é, ½Ã½ºÅÛÀº ¾ÇÈ­µÇ°í Àü¿øÀ» ²¨¾ß¸¸ ÇÏ°Ô µÈ´Ù.

 

3. Ä¿´Ù¶õ ±«¹° ¾Õ¿¡¼­ ±âÁ×Áö ¸»¶ó. ¾Æ¸¶ ÀÌ°Í¿¡ ´ëÇØ °æ°í¸¦ º¸³»Áö ¸øÇÏ°ÚÁö¸¸,

³»°¡ ÀÌ°ÍÀ» ¾Ë¾Æ³½ °æ¿ì¿¡´Â ±×·¸°Ô ÇÒ °ÍÀÌ´Ù.

 

 

ºÎ·Ï A

 

2.0°ú 2.2»çÀÌÀÇ º¯È­

 

¹®¼­ÀÇ ¸ðµç º¯°æ ³»¿ëÀÌ Àüü Ä¿³Î ¹öÀü¿¡ ´ëÇؼ­ Àû¿ë°¡´ÉÇÑÁö´Â ¸ð¸£°Ú´Ù. ¿¹Á¦µé

ÀÇ º¯È¯ °úÁ¤¿¡¼­(½ÇÁ¦·Î, Emmanual PapirakisÀÇ º¯°æÀ» Àû¿ë) ¾Æ·¡ÀÇ Â÷ÀÌÁ¡µéÀ» ¾Ë

¾Æ³»¾ú´Ù. ¾ð±ÞµÈ ¸ðµç ³»¿ëÀº ¸ðµâ ÇÁ·Î±×·¡¸Ó¿¡°Ô µµ¿òÀ» ÁÖ±â À§ÇØ, Ưº°È÷ ÀÌ Ã¥

ÀÇ ÀÌÀü ¹öÀüÀÇ ³»¿ëÀ» °øºÎÇß´ø ÇÁ·Î±×·¡¸Ó¿¡°Ô À¯¿ëÇÒ °ÍÀÌ°í »õ·Î¿î ¹öÀüÀ¸·ÎÀÇ º¯

ȯ¿¡ ÀÌ¿ëÇÑ ±â¹ýÀº ´ëºÎºÐ À¯»çÇÏ´Ù. 2.2·ÎÀÇ º¯È¯À» ¿øÇÏ´Â »ç¶÷µéÀ» À§ÇÑ Ãß°¡ÀûÀÎ

³»¿ëÀ» http:://www.atnf.csiro.au/~rgooch/linux/docs/porting-to-2.2.html¿¡¼­ ¾Ë

¼ö ÀÖ´Ù.

 

1. asm/uaccess.h - put_user¿Í get_user°¡ ÇÊ¿äÇϸé ÀÌ°ÍÀ» #includeÇØ¾ß ÇÑ´Ù.

 

2. ¹öÀü 2.2¿¡¼­ get_user - get_user´Â »ç¿ëÀÚ ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅÍ¿Í Á¤º¸¸¦ ä¿ì±â À§

ÇÑ Ä¿³Î ¸Þ¸ð¸®ÀÇ º¯¼ö¸¦ ÀÎÀÚ·Î °®´Â´Ù. get_user´Â ÀÌÁ¦ º¯¼ö°¡ 2 ȤÀº 4¹ÙÀÌÆ® ±æ

ÀÌ¸é µ¿½Ã¿¡ 2 ȤÀº 4 ¹ÙÀÌÆ®¸¦ Àд °ÍÀÌ °¡´ÉÇÏ´Ù.

 

3. file_operations - ÀÌ ±¸Á¶Ã¼´Â ÀÌÁ¦ open°ú close»çÀÌÀÇ flushÇÔ¼ö¸¦ °¡Áø´Ù.

 

4. file_operations³»ÀÇ close - ¹öÀü 2.2¿¡¼­, closeÇÔ¼ö´Â integer°á°ú¸¦ ¸®ÅÏÇÏ°í,

fail °á°ú°¡ Çã°¡µÇ¾î Áø´Ù.

 

5. file_opearations³»ÀÇ read¿Í write - À̵é ÇÔ¼ö¸¦ À§ÇÑ Çì´õµéÀº º¯°æµÇ¾ú´Ù. ÀÌ

Á¦ À̵éÀº integer ´ë½Å¿¡ ssize_t¸¦ ¸®ÅÏÇÏ°í, À̵éÀÇ ÀÎÀÚ ¸®½ºÆ®´Â ´Ù¸£´Ù. in-

ode´Â ´õ ÀÌ»ó ÀÎÀÚ°¡ ¾Æ´Ï¸ç, ÆÄÀϳ»ÀÇ offset°¡ Ãß°¡µÇ¾ú´Ù.

 

6. proc_register_dynamic - ÀÌ ÇÔ¼ö´Â ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ´ë½Å¿¡, proc_regi-

sterÀ» È£ÃâÇÒ ¼ö ÀÖ°í ±¸Á¶Ã¼ÀÇ indoeÇÊµå ¾È¿¡ 0À» ÁöÁ¤ÇÑ´Ù.

 

7. Signals - ±¸Á¶Ã¼ÀÇ ½Ã½º³ÎµéÀº ´õ ÀÌ»ó 32ºñÆ®ÀÇ integer°¡ ¾Æ´Ï¸ç, NSIG_WORDS

¹è¿­ÀÇ intergerµéÀÌ´Ù.

 

8. queue_task_irq - ÀÎÅÍ·´Æ® 󸮱â¾È¿¡¼­ ŽºÅ©¸¦ ½ºÄÉÁÙÇÏ±æ ¿øÇϸé queue_task

À» ÀÌ¿ëÇÑ´Ù. queue_task_irq´Â ÀÌ¿ëÇÒ ¼ö ¾ø´Ù.

 

9. ¸ðµâÀÇ ÀÎÀÚµé - ´õ ÀÌ»ó ¸ðµâ ÀÎÀÚ¸¦ Àü¿ª º¯¼ö·Î ¼³Á¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. 2.2¿¡¼­

±×µéÀÇ Çü¼±¾ðÀ» À§ÇØ MODULE_PARMÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº ±â´ÉÀÌ ¸¹ÀÌ Çâ»óµÇ¾úÀ¸

¸ç, È¥¶õÀÌ ¾ø°Ô µðÁöÆ®¿Í ÇÔ²² ½ÃÀÛÇÏ´Â stringÀÎÀÚµéÀÇ ¼ö½ÅÀ» Çã°¡ÇÑ´Ù.

 

10. ´ëĪÇü ´ÙÁß ÇÁ·Î¼¼½Ì - Ä¿³ÎÀÇ ³»ºÎ¿¡ ´õ ÀÌ»ó °Å´ëÇÑ ½ºÇÉ ¶ôÀÌ Á¸ÀçÇÏÁö ¾Ê´Â

´Ù. Ä¿³Î ¸ðµâÀº SMPÀÓÀ» ÀνÄÇØ¾ß ÇÑ´Ù.

 

ºÎ·Ï B

 

¾îµð¿¡¼­ Ãß°¡ÀûÀÎ ³»¿ëÀ» ¾òÀ» ¼ö Àִ°¡?

 

ÀÌ Ã¥ÀÇ ¸¹Àº ÀåÀ» Á»´õ ½±°Ô ¾µ ¼ö ÀÖ¾ú´ÂÁöµµ ¸ð¸£°Ú´Ù. »õ·Î¿î ÆÄÀÏ ½Ã½ºÅÛ ¸¸µé±â

, »õ·Î¿î ÇÁ·ÎÅäÄÝ ½ºÅÿ¡ ´ëÇÑ ³»¿ëÀ» Ãß°¡ÇÏ°íµµ ½Í¾ú´Ù. ºÎÆ® ½ºÆ®·¡ÇÎÀ̳ª µð½ºÅ©

ÀÎÅÍÆäÀ̽º¿Í °°Àº, ¿©±â¼­ ´Ù·çÁö ¾ÊÀº Ä¿³ÎÀÇ ¸ÞÄ¿´ÏÁò¿¡ ´ëÇÑ ¼³¸íÀ» Ãß°¡ÇÏ°íµµ

½Í¾ú´Ù. ±×·¯³ª, ÀÌ·¸°Ô ÇÏÁö´Â ¾Ê¾Ò´Ù. ³»°¡ ÀÌ Ã¥À» ¾´ ¸ñÀûÀº Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡

¹ÖÀÇ ¼û°ÜÁø ºñ¹ÐÀ» ¾Ë¸®°í ±âº»ÀûÀÎ ±â¹ýÀ» °¡¸£Ä¡°íÀÚ ÇÔÀ̾ú´Ù.

Ä¿³Î ÇÁ·Î±×·¡¹Ö¿¡ »ó´çÇÑ °ü½ÉÀ» °¡Áö´Â »ç¶÷µéÀ» À§ÇØ, http://jungla.dit.upm.

es/~jmseyas/linux/kernel/hackers-docs.htmÀÇ ¸®¼Ò½º¸¦ »ìÆ캸±æ ÃßõÇÑ´Ù. ¶ÇÇÑ,

¸®´©½º°¡ ¸»ÇßµíÀÌ, Ä¿³ÎÀ» ÀÌÇØÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº Ä¿³Î ¼Ò½º ÀÚü¸¦ º¸´Â °ÍÀÌ´Ù

. Á»´õ ¸¹Àº Ä¿³Î ¸ðµâÀÇ ¿¹Á¦µéÀ» »ìÆ캸±â ¿øÇϸé, Phrack ÀâÁö¸¦ ÃßõÇÑ´Ù. º¸¾È

¿¡ ´ëÇØ °ü½ÉÀÌ ¾øÀ»Áö¶óµµ, Ä¿³Î ¸ðµâÀÌ Ä¿³ÎÀÇ ³»ºÎ¿¡¼­ ¾î¶² ÀÏÀ» ÇÏ´ÂÁö¿¡ ´ëÇÑ

ÁÁÀº ¿¹Á¦µéÀ» ¸¹ÀÌ °¡Áö°í ÀÖÀ¸¸ç, À̵éÀ» ÀÌÇØÇϴµ¥´Â Å« ³ë·ÂÀÌ ¿ä±¸µÇÁö ¾Ê´Â´Ù.

´õ ³ªÀº ÇÁ·Î±×·¡¸Ó°¡ µÇ±â À§ÇÑ ¿©Á¤¿¡ ³»°¡ Á¶±ÝÀÇ µµ¿òÀÌ¶óµµ ÁÖ¾ú±æ ¹Ù¶ó¸ç, Àû¾î

µµ ¿©±âÀÇ ±â¼úÀ» ÅëÇØ ¾à°£ÀÇ Àç¹Ì¸¦ ´À³¢±æ ¹Ù¶õ´Ù. ±×¸®°í, ´ç½ÅÀÌ À¯¿ëÇÑ Ä¿³Î ¸ð

µâÀ» ÀÛ¼ºÇÏ°Ô µÇ¸é, GPLÇÏ¿¡¼­ °ø°³ÇÏ±æ ¹Ù¶ó¸ç, ³ª ¶ÇÇÑ ±×·¸°Ô ÇÒ °ÍÀÌ´Ù.

 

ºÎ·Ï C

 

»óÇ°°ú ¼­ºñ½º

 

I hope nobody minds the shameless promotions here. They are all things which

are likely to be of use to beginning Linux Kernel Module programmers.

 

C.1 ÇÁ¸°Æ®µÈ Ãâ·Â¹° ¾ò±â

 

The Coriolis group is going to print this book sometimes in the summer of '99.

If this is already summer, and you want this book in print, you can go easy on

your printer and buy it in a nice, bound form.

 

ºÎ·Ï D

 

´ç½ÅÀÌ È£ÀǸ¦ º¸ÀÌ·Á¸é

 

This is a free document. You have no obligations beyond those given in the GNU

Public License (Appendix E). However, if you want to do something in return

for getting this book, there are a few things you could do.

 

Send me a postcard to

Ori Pomerantz

Apt. #1032

2355 N Hwy 360

Grand Prairie

TX 75050

USA

 

If you want to receive a thank-you from me, include your e-mail address.

Contribute money, or better yet, time, to the free software community. Write a

program or a document and publish it under the GPL. Teach other people how to

use free software, such as Linux or Perl.

Explain to people how being selfish is not incompatible with living in a

society or with helping other people. I enjoyed writing this document, and

I believe publishing it will contribute to me in the future. At the same time,

I wrote a book which, if you got this far, helps you. Remember that happy people

are usually more useful to oneself than unhappy people, and able people are way

better than people of low ability.

 

Be happy. If I get to meet you, it will make the encounter better for me, it will make

you more useful for me ;).

 

ºÎ·Ï E

 

GNU General Public License

 

This is an unofficial translation of the GNU General Public License into Korean. It was

not published by the Free Software Foundation, and does not legally state the

distribution terms for software that uses the GNU GPL--only the original English text

of the GNU GPL does that. However, I hope that this translation will help Korean

speakers understand the GNU GPL better.

 

ÀÌ ¹®¼­´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü(Free Software Foundation)ÀÇ GNU General Public

License¸¦ Çѱ¹¾î·Î ¹ø¿ªÇÑ °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â GNU General Public License°¡ ³»Æ÷ÇÏ

°í Àִ ȣÇýÀûÀÎ ÀÚÀ¯¿Í °øÀ¯ÀÇ Á¤½ÅÀ» º¸´Ù ¸¹Àº »ç¶÷µé¿¡°Ô ¾Ë¸®±â À§ÇÑ Èñ¸Á¿¡¼­

ÀÛ¼ºµÇ¾úÁö¸¸ ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÇ °ø½Ä ¹®¼­·Î Ãë±ÞµÉ ¼ö´Â ¾ø´Ù. ÀÌ´Â ¿ø·¡ÀÇ ¹®

¼­°¡ ÀǵµÇÏ°í ÀÖ´Â ³»¿ëµéÀÌ ¿Ö°îµÇÁö ¾Ê°í ¹ý·üÀûÀ¸·Î À¯È¿Çϱâ À§Çؼ­ ¼±ÇàµÇ¾î¾ß

ÇÒ ¾ç±¹ÀÇ ÇöÇà ¹ý·ü°ú ¾ð¾îÀÇ ÀûÇÕ¼º ¿©ºÎ¿¡ ´ëÇÑ Àü¹®°¡µéÀÇ °ËÅä ÀÛ¾÷¿¡ ¸¹Àº ºñ¿ë

ÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. µû¶ó¼­, ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº ¿À¿ªÀ̳ª Çؼ®»óÀÇ ³­Á¡À¸·Î

ÀÎÇؼ­ ¹ß»ýµÉ Áö ¸ð¸¦ ºÐÀïÀÇ °¡´É¼ºÀ» ¹Ì¿¬¿¡ ¹æÁöÇÏ°í ¹®¼­°¡ ´ã°í ÀÖ´Â ³»¿ë°ú Ãë

Áö¸¦ º¸´Ù ¸¹Àº »ç¶÷µé¿¡°Ô È«º¸ÇÏ·Á´Â »ó¹ÝµÈ ¸ñÀûÀ» Çѱ¹¾î ¹ø¿ª¹®À» °ø½ÄÀûÀ¸·Î ½Â

ÀÎÇÏÁö ¾ÊÀ½À¸·Î½á ¾ç¸³½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº GNU General Public License¸¦ ½Ç¹«¿¡ Àû¿ëÇÒ °æ¿ì, ¿ÀÁ÷ ¿µ

¹®ÆÇ GNU General Public License¿¡ ÀÇÇؼ­ ¸¸ÀÌ ±× ¹ý·üÀû È¿·ÂÀÌ ¿Ã¹Ù¸£°Ô ¹ß»ýµÉ

¼ö ÀÖÀ½À» ±Ç°íÇÏ°í ÀÖ´Ù. ÀÌ ¹ø¿ª¹®Àº ¹ý·üÀû °ËÅä¿Í ¹®¼­°£ÀÇ µ¿Àϼº ¿©ºÎ¿¡ ´ëÇÑ

°ËÁõÀ» °ÅÄ¡Áö ¾ÊÀº °ÍÀ̸ç ÀÌ·Î ÀÎÇؼ­ ¾ß±âµÉ ¼ö ÀÖÀ» Áöµµ ¸ð¸¦ ¹ý·üÀûÀÎ ¹®Á¦¿¡

´ëÇؼ­ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ ÇÏÁö ¾Ê´Â´Ù.

 

Original Copy: GNU General Public License

 

Korean Translator: 1998 Song Changhun ¼ÛâÈÆ mailto:chsong@cyber.co.kr

 

¸ñ Â÷

 

* GNU GENERAL PUBLIC LICENSE

* Àü ¹®(îñ Ùþ)

* º¹Á¦¿Í °³ÀÛ, ¹èÆ÷¿¡ °üÇÑ Á¶°Ç°ú ±ÔÁ¤

* GPLÀ» ½Ç¹«¿¡ Àû¿ëÇÏ´Â ¹æ¹ý

 

GNU GENERAL PUBLIC LICENSE

 

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.

59 Temple Place - Suite 330, Boston, MA 02111-1307, USA

 

ÀúÀ۱ǰú »ç¿ë Çã°¡¿¡ ´ëÇÑ º» »çÇ×ÀÌ ¸í½ÃµÇ´Â ÇÑ,

¾î¶°ÇÑ Á¤º¸ ¸Åü¿¡ ÀÇÇÑ º»¹®ÀÇ ÀüÀ糪 ¹ßÃéµµ ¹«»óÀ¸·Î Çã¿ëµÈ´Ù.

´Ü, ¿ø¹®¿¡ ´ëÇÑ ¼öÁ¤°ú ÷»èÀº Çã¿ëµÇÁö ¾Ê´Â´Ù.

 

Àü ¹® (îñ Ùþ)

 

¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ´ëºÎºÐÀÇ ¶óÀ̼¾½º´Â ÇØ´ç ¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ¼öÁ¤°ú °øÀ¯ÀÇ ÀÚÀ¯

¸¦ Á¦ÇÑÇÏ·Á´Â °ÍÀ» ±× ¸ñÀûÀ¸·Î ÇÑ´Ù. ±×·¯³ª, GNU General Public License´Â ÀÚÀ¯

¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ¼öÁ¤°ú °øÀ¯ÀÇ ÀÚÀ¯¸¦ È£ÇýÀûÀ¸·Î º¸ÀåÇϱâ À§Çؼ­ ¼º¸³µÇ¾ú´Ù. ÀÚ

À¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÌ Á¦°øÇÏ´Â ´ëºÎºÐÀÇ ¼ÒÇÁÆ®¿þ¾îµéÀº GNU General Public License

ÀÇ ±ÔÁ¤¿¡ ÀÇÇؼ­ °ü¸®µÇ°í ÀÖÀ¸¸ç º°µµÀÇ °ü¸® ¹æ¹ýÀÌ º¸´Ù È¿°úÀûÀ̶ó°í ÆǴܵǴÂ

¶óÀ̺귯¸® ¼­ºê·çƾ(library subroutine)ÀÇ °æ¿ì, µ¶¸³µÈ ¹®¼­ÀÎ GNU Library Gener-

al Public License¸¦ ¼±ÅÃÀûÀ¸·Î Àû¿ëÇÏ°í ÀÖ´Ù. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¶õ À̸¦ »ç¿ëÇÏ·Á´Â ¸ð

µç»ç¶÷¿¡ ´ëÇؼ­ µ¿ÀÏÇÑ ÀÚÀ¯¿Í ±Ï¸®°¡ ÇÔ²² ¾çµµµÇ´Â ¼ÒÇÁÆ®¿þ¾î¸¦ ÀǹÌÇϸç ÇÁ·Î±×

·¥ÀúÀÛÀÚÀÇ ÀÇÁö¿¡ µû¶ó ¾î¶°ÇÑ ÇÁ·Î±×·¥¿¡µµ ÀÌ ±ÔÁ¤µéÀÌ Àû¿ëµÉ ¼ö ÀÖ´Ù.

ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¸¦ ¾ð±ÞÇÒ ¶§ »ç¿ëµÇ´Â 'ÀÚÀ¯'¶ó´Â ´Ü¾îÀÇ Àǹ̴ ±ÝÀüÀûÀÎ Ãø¸éÀÇ ÀÚ

À¯°¡ ¾Æ´Ñ ±¸¼ÓµÇÁö ¾Ê´Â´Ù´Â °üÁ¡¿¡¼­ÀÇ ÀÚÀ¯¸¦ ÀǹÌÇϸç GNU General Public Licen-

se´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÌ¿ëÇÑ º¹Á¦¿Í °³ÀÛ, ¹èÆ÷¿Í ¼öÀÍ »ç¾÷ µîÀÇ °¡´ÉÇÑ ¸ðµç Çü

ÅÂÀÇ ÀÚÀ¯¸¦ ½ÇÁ¦ÀûÀ¸·Î º¸ÀåÇÑ´Ù. ¿©±â¿¡´Â ¼Ò½º ÄÚµåÀÇ ÀüºÎ ¶Ç´Â ÀϺθ¦ ¿ø¿ëÇؼ­

°³¼±µÈ ÇÁ·Î±×·¥À¸·Î º¯Çü½ÃÅ°°Å³ª »õ·Î¿î ÇÁ·Î±×·¥À» âÀÛÇÒ ¼ö ÀÖ´Â ÀÚÀ¯°¡ Æ÷ÇÔµÇ

¸ç Àڽſ¡°Ô ¾çµµµÈ ÀÌ·¯ÇÑ ÀÚÀ¯¿Í ±Ç¸®µéÀ» º¸´Ù ¸íÈ®ÇÏ°Ô ÀνÄÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§

ÇÑ ±ÔÁ¤ ¶ÇÇÑ Æ÷ÇԵǾî ÀÖ´Ù.

GNU General Public License´Â ÀÌ ¹®¼­¿¡ ¼ÒÇÁÆ®¿þ¾î ÇǾ絵ÀÚÀÇ ±Ç¸®¸¦ Á¦ÇÑÇϴ Ư

Á¤ Á¶Ç×°ú ´Ü¼­µéÀ» º°Ç×À¸·Î ÷°¡½ÃÅ°Áö ¸øÇÏ°Ô ÇÔÀ¸·Î½á »ç¿ëÀÚµéÀÇ ½ÇÁúÀûÀÎ ÀÚÀ¯

¿Í ±Ç¸®¸¦ º¸ÀåÇÏ°í ÀÖ´Ù. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÇ °³ÀÛ°ú ¹èÆ÷¿¡ °ü°èÇÏ°í ÀÖ´Â »ç¶÷µéÀº

ÀÌ·¯ÇÑ ¹«Á¶°ÇÀûÀÎ ±Ç¸® ¾çµµ ±ÔÁ¤À» ÁؼöÇؾ߸¸ ÇÑ´Ù.

¿¹¸¦ µé¸é, ƯÁ¤ ÇÁ·Î±×·¥À» ¹èÆ÷ÇÒ °æ¿ì ¾çµµÀÚ´Â ÇǾ絵ÀÚ¿¡°Ô ÀÚ½ÅÀÌ ¾çµµ¹Þ¾Ò´ø

¸ðµç ±Ç¸®¸¦ ¼öÀÍ ¿©ºÎ¿¡ °ü°è¾øÀÌ ±×´ë·Î ÀÌÀüÇؾ߸¸ ÇÑ´Ù. ¼Ò½º Äڵ忡 ´ëÇÑ »ç¿ë

±Ç¸® ¶ÇÇÑ ¿©±â¿¡ Æ÷ÇԵǾî¾ß Çϸç ÀÌ¿Í °°Àº »çÇ×µéÀ» ¸í½ÃÇÔÀ¸·Î½á ÇǾ絵Àڵ鿡°Ô

±×µéÀÌ ¾çµµ¹ÞÀº ±Ç¸®¸¦ ¾Ë ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù.

ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº ´ÙÀ½°ú °°Àº µÎ °¡Áö ¹æ¹ý¿¡ ÀÇÇؼ­ ¹Ýº¹µÇ´Â ¾çµµ¿¡ µû¸¥ »ç

¿ëÀÚ ¸ðµÎÀÇ ±Ç¸®¸¦ º¸È£ÇÑ´Ù: (1) ÀúÀÛ±ÇÀ» ÀÎÁ¤ÇÔÀ¸·Î½á ÇÁ·Î±×·¥ ÀúÀÛÀÚµéÀÇ ±Ç¸®

¸¦ º¸È£ÇÑ´Ù. (2) ÀúÀÛ±ÇÀÇ ¾çµµ¿¡ °üÇÑ ½ÇÁ¤¹ý¿¡ ÀÇÇؼ­ À¯È¿ÇÑ ¹ý·üÀû È¿·ÂÀ» °®´Â

GNU General Public License¸¦ ÅëÇؼ­ ¼ÒÇÁÆ®¿þ¾îÀÇ º¹Á¦¿Í °³ÀÛ, ¹èÆ÷ µî¿¡ ´ëÇÑ ¼Ò

ÇÁÆ®¿þ¾î ÇǾ絵ÀÚÀÇ ±Ç¸®¸¦ ½ÇÁúÀûÀ¸·Î º¸ÀåÇÑ´Ù.

ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÇ »ç¿ëÀÚµéÀº Áö¼ÓÀûÀÎ ¾çµµ °úÁ¤À» ÅëÇؼ­ ¼ÒÇÁÆ®¿þ¾î ÀÚü¿¡ ¼öÁ¤

°ú º¯Çü¿¡ ÀÇÇÑ ¹®Á¦°¡ ¹ß»ýµÉ ¼ö ÀÖÀ¸¸ç ÀÌ´Â ÃÖÃÊÀÇ ÀúÀÛÀÚ¿¡ ÀÇÇÑ ¼ÒÇÁÆ®¿þ¾î°¡ °®

´Â ¹®Á¦°¡ ¾Æ´Ò ¼ö ÀÖ´Ù´Â °³¿¬¼º¿¡ ´ëÇؼ­ ÀνÄÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù. GNU General Publ-

ic License¿¡ ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ ±ÔÁ¤ÇÏÁö ¾ÊÀº ÀÌÀ¯´Â ÀÌ

·¯ÇÑ Á¡µéÀÌ °í·ÁµÇ¾ú±â ¶§¹®À̸ç ÀÌ´Â ÇÁ·Î±×·¥ ¿øÀúÀÛÀÚ¿Í ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÇ

ÀÚÀ¯·Î¿î È°µ¿À» º¸ÀåÇÏ´Â Çö½ÇÀûÀÎ ¼ö´ÜÀ̱⵵ ÇÏ´Ù.

ƯÇã Á¦µµ´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÇ ¹ßÀüÀ» À§ÇùÇÏ´Â ¿ä¼ÒÀÏ ¼ö¹Û¿¡ ¾ø´Ù. µû¶ó¼­, ÀÚÀ¯

¼ÒÇÁÆ®¿þ¾î¸¦ ¹èÆ÷ÇÒ °æ¿ì °³º°ÀûÀÎ ¹èÆ÷ °úÁ¤¿¡ ƯÇ㸦 ÃëµæÇÑ ÀúÀÛ¹°À» ÇÔ²² Æ÷ÇÔ½ÃÅ°

Áö ¾ÊÀ½À¸·Î½á ÀÌ¿ë »óÀÇ ÀÚÀ¯°¡ Á¦ÇѵÇÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æ¹ýÀÌ´Ù. GNU G-

eneral Public License´Â ÀÌ·¯ÇÑ ¹®Á¦¿¡ ´ëóÇϱâ À§Çؼ­ ƯÇã°¡ ÃëµæµÈ ÀúÀÛ¹°Àº ±×

¶óÀ̼¾½º¸¦ ºÒƯÁ¤ ´Ù¼ö(ÀÌÇÏ, "°øÁß"À̶ó ÇÑ´Ù)¿¡°Ô °ø°³ÀûÀ¸·Î Çã¿ëÇÏ´Â °æ¿ì¿¡ ÇÑ

Çؼ­ ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ±ÔÁ¤ÇÏ°í ÀÖ´Ù.

 

º¹Á¦(copying)¿Í °³ÀÛ(modification), ¹èÆ÷(distribution) µî¿¡ °ü·ÃµÈ ±¸Ã¼ÀûÀÎ Á¶°Ç

°ú ±ÔÁ¤Àº ´ÙÀ½°ú °°´Ù.

 

º¹Á¦¿Í °³ÀÛ, ¹èÆ÷¿¡ °üÇÑ Á¶°Ç°ú ±ÔÁ¤

 

Á¦ 0 Ç×. º» ¶óÀ̼¾½º´Â GNU General Public LicenseÀÇ ±ÔÁ¤¿¡ µû¶ó¼­ ¹èÆ÷µÉ ¼ö ÀÖ´Ù

´Â »çÇ×ÀÌ ÀúÀÛ±ÇÀÚ¿¡ ÀÇÇؼ­ ¸í½ÃµÈ ¸ðµç ÄÄÇ»ÅÍ ÇÁ·Î±×·¥ ÀúÀÛ¹°¿¡ ´ëÇؼ­ µ¿ÀÏÇÏ°Ô

Àû¿ëµÈ´Ù. ÄÄÇ»ÅÍ ÇÁ·Î±×·¥ ÀúÀÛ¹°(ÀÌÇÏ, "ÇÁ·Î±×·¥"À̶ó ÇÑ´Ù)À̶õ ƯÁ¤ ÇÁ·Î±×·¥ÀÌ

³ª ÀÌ¿Í °ü·ÃµÈ ±âŸ ÀúÀÛ¹°À» ÀǹÌÇÏ°í "2Â÷Àû ÇÁ·Î±×·¥"À̶õ ÀúÀ۱ǹýÀÇ ±ÔÁ¤¿¡ µû

¶ó ÇÁ·Î±×·¥ÀÇ ÀüºÎ ¶Ç´Â »ó´ç ºÎºÐÀ» ¿ø¿ëÇϰųª ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î·ÎÀÇ ¹ø¿ªÀ»

Æ÷ÇÔÇÒ ¼ö ÀÖ´Â °³ÀÛ °úÁ¤À» ÅëÇؼ­ âÀÛµÈ »õ·Î¿î ÇÁ·Î±×·¥°ú ÀÌ¿Í °ü·ÃµÈ ÀúÀÛ¹°À»

ÀǹÌÇÑ´Ù(ÀÌÈÄ·Î ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î·ÎÀÇ ¹ø¿ªÀº º°´Ù¸¥ Á¦ÇÑ ¾øÀÌ °³ÀÛÀÇ ¹üÀ§¿¡

Æ÷ÇԵǴ °ÍÀ¸·Î °£ÁÖÇÑ´Ù) "ÇǾ絵ÀÚ"¶õ GNU General Public LicenseÀÇ ±ÔÁ¤¿¡ ÀÇÇØ

¼­ ÇÁ·Î±×·¥À» ¾çµµ¹ÞÀº »ç¶÷À» ÀǹÌÇÑ´Ù.

º» ¶óÀ̼¾½º´Â ÇÁ·Î±×·¥¿¡ ´ëÇÑ º¹Á¦¿Í °³ÀÛ, ¹èÆ÷ ÇàÀ§¿¡ ´ëÇؼ­¸¸ Àû¿ëµÈ´Ù. µû¶ó¼­

, ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°´Â ÇàÀ§´Â Á¦ÇѵÇÁö ¾ÊÀ¸¸ç ÇÁ·Î±×·¥ÀÇ ½ÇÇà¿¡ µû¸¥ °á°ú¹°Àº

½ÇÇà ÀÚü¿¡ ÀÇÇÑ °á°ú¹°ÀÇ »ý¼º ¿©ºÎ¿¡ »ó°ü¾øÀÌ °á°ú¹°ÀÌ 2Â÷Àû ÇÁ·Î±×·¥À» ±¸¼ºÇß

À»¶§¿¡ ÇÑÇؼ­ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤À» Àû¿ëÇÒ ¼ö ÀÖ´Ù. 2Â÷Àû ÇÁ·Î±×·¥ÀÇ ±¸¼º ¿©ºÎ´Â

2Â÷Àû ÇÁ·Î±×·¥ ¾È¿¡¼­ÀÇ ÇÁ·Î±×·¥ÀÇ ¿ªÇÒÀ» Åä´ë·Î ÆÇ´ÜÇÑ´Ù.

 

Á¦ 1 Ç×.ÇǾ絵ÀÚ´Â ÇÁ·Î±×·¥¿¡ ´ëÇÑ º¸ÁõÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù´Â »ç½Ç°ú ÀúÀÛ±ÇÀ» ÇÔ²²

¸í½ÃÇÏ´Â ÇÑ, ¾çµµ¹ÞÀº ¼Ò½º ÄÚµåÀÇ ÀüºÎ ¶Ç´Â ÀϺθ¦ ¾î¶°ÇÑ Á¤º¸ ¸Åü¸¦ ÅëÇؼ­µµ

º¹Á¦Çؼ­ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù. ÇǾ絵ÀÚ°¡ ÇÁ·Î±×·¥ÀÇ ¼Ò½º Äڵ带 Àç¹èÆ÷ÇÒ ¶§´Â ÇÁ·Î±×

·¥¿¡ ´ëÇÑ º¸ÁõÀÌ °á¿©µÇ¾î ÀÖ´Ù´Â »ç½Ç°ú º» ¶óÀ̼¾½º¿¡ ´ëÇؼ­ ¾ð±ÞÇÑ »çÇ×µéÀ» ¾ç

µµ¹ÞÀº ±×´ë·Î À¯Áö½ÃÄÑ¾ß Çϸç GNU General Public License ¿ø¹®À» ÇÔ²² Á¦°øÇØ¾ß ÇÑ

´Ù. º¹Á¦¹°À» ¹èÆ÷ÇÒ °æ¿ì, º¹Á¦¹°À» Á¦ÀÛÇϱâ À§Çؼ­ ¼Ò¿äµÈ °æºñ¸¦ Ãæ´çÇϱâ À§Çؼ­

¹èÆ÷º»À» À¯·á·Î ÆǸÅÇÒ ¼ö ÀÖÀ¸¸ç À¯·á ÆǸſ¡ µû¸¥ ¹èÆ÷º»ÀÇ È¯ºÒÀ» º¸ÀåÇÏ´Â º°µµ

ÀÇ º¸ÁõÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

 

Á¦ 2 Ç×. ÇǾ絵ÀÚ´Â ÀÚ½ÅÀÌ ¾çµµ¹ÞÀº ÇÁ·Î±×·¥ÀÇ ÀüºÎ ¶Ç´Â ÀϺθ¦ °³ÀÛÇÒ ¼ö ÀÖÀ¸¸ç

À̸¦ ÅëÇؼ­ 2Â÷Àû ÇÁ·Î±×·¥À» âÀÛÇÒ ¼ö ÀÖ´Ù. °³ÀÛµÈ ÇÁ·Î±×·¥À̳ª âÀÛµÈ 2Â÷Àû ÇÁ

·Î±×·¥ÀÇ ¼Ò½º ÄÚµå´Â Á¦ 1 Ç×ÀÇ ±ÔÁ¤¿¡ ÀÇÇؼ­ ´ÙÀ½ÀÇ »çÇ×µéÀ» ¸¸Á·½ÃÅ°´Â Á¶°Ç¿¡

ÇÑÇؼ­ º¹Á¦Çؼ­ ¹èÆ÷µÉ ¼ö ÀÖ´Ù.

* a) °³ÀÛµÈ ÆÄÀÏÀº ÆÄÀÏÀÌ °³ÀÛµÈ »ç½Ç°ú °³ÀÛµÈ ³¯Â¥°¡ ¸í½ÃÀûÀ¸·Î È®À뵃 ¼ö ÀÖµµ

·Ï ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù.

* b) ¹èÆ÷Çϰųª ÃâÆÇÇÏ·Á´Â ÀúÀÛ¹°ÀÇ ÀüºÎ ¶Ç´Â ÀϺΰ¡ ¾çµµ¹ÞÀº ÇÁ·Î±×·¥À¸ ·ÎºÎÅÍ

ÆÄ»ýµÈ °ÍÀ̶ó¸é °³ÀÛµÈ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¹èÆ÷º»À̳ª ÃâÆǹ° Àü ü¿¡ ´ëÇÑ »ç¿ë ±Ç¸®

¸¦ °øÁß¿¡°Ô ¹«»óÀ¸·Î Çã¿ëÇØ¾ß ÇÑ´Ù.

* c) °³ÀÛµÈ ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ ½ÇÇà ÇüÅ°¡ ¸í·É¾î ÀÔ·Â ¹æ½Ä¿¡ ÀÇÇÑ ´ëÈ­ Çü ±¸Á¶

ÀÏ °æ¿ì, °³ÀÛµÈ ÇÁ·Î±×·¥Àº ÀÌ·¯ÇÑ ´ëÈ­Çü ±¸Á¶·Î ÆòÀÌÇÏ°Ô ½Ç ÇàµÇ¾úÀ» ¶§ ÀúÀ۱ǿ¡

´ëÇÑ »çÇ×°ú ÇÁ·Î±×·¥¿¡ ´ëÇÑ º¸ÁõÀÌ °á¿©µÇ¾î ÀÖ ´Ù´Â »ç½ÇÀÌ °³ÀÛµÈ ÇÁ·Î±×·¥À» º»

¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ ÀÇÇؼ­ ´Ù½Ã °³ÀÛ Çؼ­ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù´Â »çÇ×°ú GNU General Pub-

lic License¸¦ ¿­¶÷ÇÒ ¼ö ÀÖ´Â ¹æ¹ý°ú ÇÔ²² ½ÇÇà Á÷ÈÄ¿¡ Áö¸é ¶Ç´Â È­¸éÀ» ÅëÇؼ­ Ãâ

·ÂµÉ ¼ö ÀÖµµ ·Ï ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù(¿¹¿Ü ±ÔÁ¤: ¾çµµ¹ÞÀº ÇÁ·Î±×·¥ÀÌ ´ëÈ­Çü ±¸Á¶¸¦ °®

Ãß°í ÀÖ´Ù ÇÏ´õ¶óµµ Åë»óÀûÀÎ ½ÇÇà ȯ°æ¿¡¼­ Àü¼úÇÑ »çÇ×µéÀÌ Ãâ·ÂµÇÁö ¾Ê´Â ÇüÅ¿´À»

°æ¿ì, À̸¦ °³ÀÛÇÑ ÇÁ·Î±×·¥ ¿ª½Ã °ü·Ã »çÇ×µéÀ» Ãâ·Â½Ã Å°Áö ¾Ê¾Æµµ µÈ´Ù)

º» Á¶Ç×µéÀº °³ÀÛµÈ ºÎºÐÀÌ Æ÷ÇÔµÈ 2Â÷Àû ÇÁ·Î±×·¥ Àüü¿¡ Àû¿ëµÈ´Ù. ¸¸¾à, ¾î¶°ÇÑ Àú

ÀÛ¹°ÀÌ 2Â÷Àû ÇÁ·Î±×·¥¿¡ Æ÷ÇԵǾî ÀÖ´Â ºÎºÐ°ú µ¿ÀÏÇÑ °ÍÀ̶ó ÇÏ´õ¶óµµ ±×°ÍÀÌ ¾çµµ

¹ÞÀº ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ÆÄ»ýµÈ °ÍÀÌ ¾Æ´Ï¶ó º°µµÀÇ µ¶¸³ ÀúÀÛ¹°·Î ÀÎÁ¤µÉ ¸¸ÇÑ »ó´çÇÑ

ÀÌÀ¯°¡ ÀÖÀ» °æ¿ì, ÀÌ ÀúÀÛ¹°ÀÇ °³º°ÀûÀÎ ¹èÆ÷ °úÁ¤¿¡´Â º» ¶óÀ̼¾½º¿Í ±ÔÁ¤µéÀÌ Àû¿ë

µÇÁö ¾Ê´Â´Ù. ±×·¯³ª, ÀÌ·¯ÇÑ ÀúÀÛ¹°ÀÌ 2Â÷Àû ÇÁ·Î±×·¥¿¡ Æ÷ÇԵǾî ÇÔ²² ¹èÆ÷µÈ´Ù¸é

°³º°ÀûÀÎ ÀúÀ۱ǰú ¹èÆ÷ ±âÁØ¿¡ »ó°ü¾øÀÌ ¹èÆ÷º»ÀÇ Àüü ÀúÀÛ¹° ¸ðµÎ°¡ º» ¶óÀ̼¾½º¿¡

ÀÇÇؼ­ °ü¸®µÇ¾î¾ß Çϸç Àüü ÀúÀÛ¹°ÀÇ ÀϺΠ¶Ç´Â ÀüºÎ¿¡ ´ëÇÑ »ç¿ë»óÀÇ ¸ðµç ±Ç¸®°¡

°øÁß¿¡°Ô ¹«»óÀ¸·Î ¾çµµµÇ¾î¾ß ÇÑ´Ù.

ÀÌ·¯ÇÑ ±ÔÁ¤Àº °³º°ÀûÀÎ ÀúÀÛ¹°¿¡ ´ëÇÑ ÀúÀÛ±ÇÀÚÀÇ ±Ç¸®¸¦ ¸»¼Ò½ÃÅ°·Á´Â °ÍÀÌ ¾Æ´Ï¶ó

2Â÷Àû ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ¹Ýº¹ÀûÀ¸·Î ÆÄ»ýµÇ°Å³ª ÀÌ·¯ÇÑ ÇÁ·Î±×·¥µéÀ» ¸ð¾Æ ³õÀº ¹èÆ÷

º»¿¡ ´ëÇؼ­ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤µéÀ» µ¿ÀÏÇÏ°Ô Àû¿ëÇϱâ À§ÇÑ °ÍÀÌ´Ù. ÇÁ·Î±×·¥(¶Ç´Â

2Â÷Àû ÇÁ·Î±×·¥)µéÀ» ´Ü¼øÈ÷ ÀúÀåÇϰųª ¹èÆ÷ÇÒ ¸ñÀûÀ¸·Î ÇÔ²² ±¸¼ºÇØ ³õÀº °æ¿ì´Â ÀÌ

µéÀÌ ÆÄ»ýÀû ÀúÀÛ¹°À» »ý¼ºÇÏÁö ¾Ê´Â ÇÑ º» ¶óÀ̼¾½º¿¡ ÀÇÇؼ­ °ü¸®µÈ´Ù.

 

Á¦ 3 Ç×. ÇǾ絵ÀÚ´Â ´ÙÀ½ÀÇ Á¶Ç× Áß Çϳª¸¦ ¸¸Á·½ÃÅ°´Â Á¶°Ç¿¡ ÇÑÇؼ­ Á¦ 1 Ç×°ú Á¦

2 Ç×ÀÇ ±ÔÁ¤¿¡ µû¶ó ÇÁ·Î±×·¥(¶Ç´Â Á¦ 2 Ç×ÀÇ ±ÔÁ¤¿¡ ÀÇÇÑ 2 Â÷Àû ÇÁ·Î±×·¥)À» ¸ñÀû

Äڵ峪 ½ÇÇà ÇüÅ·Πº¹Á¦Çؼ­ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.

* a) ¸ñÀû Äڵ峪 ½ÇÇà ÇüÅ¿¡ ÇØ´çÇÏ´Â ¼Ò½º ÄÚµåÀÇ ÀüºÎ¸¦ Á¦ 1 Ç×°ú Á¦ 2 Ç×ÀÇ ±Ô

Á¤¿¡ µû¶ó¼­ ÄÄÇ»ÅÍ°¡ ÀԷ¹ްųª ¹ø¿ªÇÒ ¼ö ÀÖ´Â ÇüÅ·Π¼ÒÇÁÆ® ¿þ¾îÀÇ ¹èÆ÷¸¦ À§ÇØ

¼­ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â Á¤º¸ ¸Åü¸¦ ÅëÇؼ­ ÇÔ²² Á¦ °øÇØ¾ß ÇÑ´Ù.

* b) ¸ñÀû Äڵ峪 ½ÇÇà ÇüÅ¿¡ ÇØ´çÇÏ´Â ¼Ò½º ÄÚµåÀÇ ÀüºÎ¸¦ ÃÖ¼ÒÇÑ 3³â ÀÌ»ó À¯ÁöµÉ

¼ö ÀÖ´Â Àμ⹰ÀÇ ÇüÅ·ΠÁ¦ 1 Ç×°ú Á¦ 2 Ç×ÀÇ ±ÔÁ¤¿¡ µû¶ó¼­ ¼ÒÇÁÆ®¿þ¾îÀÇ ¹èÆ÷¸¦ À§

Çؼ­ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â Á¤º¸ ¸Åü¸¦ ÅëÇؼ­ Á¦ÀÛ ½Çºñ¿¡ ÁØÇÏ´Â ºñ¿ë¸¸À» ºÎ°úÇؼ­

°øÁß¿¡°Ô ¾çµµµÉ ¼ö ÀÖµµ·Ï ÇÔ²² Á¦°øÇØ¾ß ÇÑ´Ù.

* c) ¸ñÀû Äڵ峪 ½ÇÇà ÇüÅ¿¡ ÇØ´çÇÏ´Â ¼Ò½º ÄÚµåÀÇ ÀüºÎ¸¦ ÃëµæÇÒ ¼ö ÀÖ´Â ¹æ¹ý¿¡

´ëÇÑ Á¤º¸¸¦ ÇÔ²² Á¦°øÇØ¾ß ÇÑ´Ù(ÀÌ Ç׸ñÀº ºñ¿µ¸®ÀûÀÎ ¹èÆ÷¿Í Ç׸ñ b)¿¡ ÀÇÇؼ­ ¸ñÀû

Äڵ峪 ½ÇÇà ÇüÅÂÀÇ ¹èÆ÷º»À» Á¦°øÇÒ ¶§¿¡ ÇÑÇØ ¼­ Àû¿ëµÉ ¼ö ÀÖ´Ù)

ÀúÀÛ¹°¿¡ ´ëÇÑ ¼Ò½º ÄÚµå¶õ ÇØ´ç ÀúÀÛ¹°À» °³ÀÛÇϱâ À§Çؼ­ ÀϹÝÀûÀ¸·Î ¼±È£µÇ´Â Ç¥Çö

Çü½ÄÀ» ÀǹÌÇÏ°í ½ÇÇ๰¿¡ ´ëÇÑ ¼Ò½º ÄÚµå¶õ ¿Ã¹Ù¸£°Ô ½ÇÇàµÇ±â À§Çؼ­ ÇÊ¿äÇÑ ¸ðµâ°ú

ÀÎÅÍÆäÀ̽º Á¤ÀÇ ÆÄÀÏ, ÄÄÆÄÀÏ°ú ¼³Ä¡¸¦ À§Çؼ­ ÇÊ¿äÇÑ ½ºÅ©¸³Æ® µîÀ» ¸ðµÎ Æ÷ÇÔÇÑ´Ù.

±×·¯³ª, ÄÄÆÄÀÏ·¯³ª Ä¿³Î°ú °°Àº ¿î¿µÃ¼Á¦ÀÇ ÁÖ¿ä ºÎºÐµé¿¡ ´ëÇÑ ¼Ò½º Äڵ峪 ¹ÙÀ̳Ê

¸®ÇüÅ´ ÇÁ·Î±×·¥ÀÌ ÀÌ·¯ÇÑ ºÎºÐµé°ú Á÷Á¢ °ü°èµÇÁö ¾Ê´Â ÇÑ ÇÔ²² Á¦°øÇÏÁö ¾Ê¾Æµµ

¹«°üÇÏ´Ù. ¸ñÀû Äڵ峪 ½ÇÇà ÇüŸ¦ ƯÁ¤ Àå¼Ò·ÎºÎÅÍ º¹Á¦ÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÏ´Â ¹æ½Ä

À¸·Î ¹èÆ÷ÇÒ °æ¿ì, µ¿ÀÏÇÑ Àå¼Ò·ÎºÎÅÍ ¼Ò½º Äڵ带 º¹Á¦ÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÏ´Â °ÍÀº

ÇǾ絵ÀÚ¿¡°Ô ¼Ò½º Äڵ带 ¸ñÀû Äڵ峪 ½ÇÇà ÇüÅÂ¿Í ÇÔ²² º¹Á¦ÇØ °¥ °ÍÀ» ±ÔÁ¤ÇÏÁö ¾Ê

¾Ò´Ù ÇÏ´õ¶óµµ ¼Ò½º Äڵ带 ÇÔ²² ¹èÆ÷ÇÏ´Â °ÍÀ¸·Î °£ÁÖÇÑ´Ù.

 

Á¦ 4 Ç×. º» ¶óÀ̼¾½º¿¡ ÀÇÇؼ­ ¸í½ÃÀûÀ¸·Î ÇÁ·Î±×·¥À» ¾çµµ¹ÞÁö ¾Ê¾Ò´Ù¸é ¾çµµ¹ÞÀº

ÇÁ·Î±×·¥¿¡ ´ëÇÑ º¹Á¦¿Í °³ÀÛ, º°µµÀÇ ¶óÀ̼¾½º ¼³Á¤°ú ¹èÆ÷ ÇàÀ§ µÕÀ» ÇÒ ¼ö ¾ø´Ù.

ÀÌ¿Í °ü·ÃµÈ ¾î¶°ÇÑ ÇàÀ§µµ ¹ý·üÀûÀ¸·Î ¹«È¿ÀÌ¸ç º» ¶óÀ̼¾½º¿¡¼­ ±ÔÁ¤ÇÏ°í ÀÖ´Â »ç¿ë

»óÀÇ ¸ðµç ±Ç¸®´Â ÀÚµ¿ÀûÀ¸·Î ¼Ò¸êµÈ´Ù. ´Ü, º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ ÀÇÇÏÁö ¾Ê°í ¾çµµ

¹ÞÀº ÇÁ·Î±×·¥À̶ó ÇÏ´õ¶óµµ À̸¦ ¸í½ÃÀûÀÎ ¶óÀ̼¾½º ¾çµµ ±ÔÁ¤¿¡ µû¶ó ´Ù½Ã ¹èÆ÷ÇßÀ»

°æ¿ì, ÇÁ·Î±×·¥À» ´Ù½Ã ¾çµµ¹ÞÀº Á¦ 3ÀÇ ÇǾ絵ÀÚ´Â º» ¶óÀ̼¾½º¸¦ ÁؼöÇÏ´Â Á¶°ÇÇÏ¿¡

¼­ »ç¿ë»óÀÇ ±Ç¸®¸¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù.

 

Á¦ 5 Ç×. ÇǾ絵ÀÚ´Â ÇÁ·Î±×·¥ÀÇ ¾çµµ¿¡ °üÇÑ º» ¶óÀ̼¾½º¿¡ ¼­¸íÇÏÁö ¾ÊÀ½À¸·Î½á º»

¶óÀ̼¾½ºÀÇ ±ÔÁ¤µéÀ» ¹Þ¾ÆµéÀÌÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ÀÌ °æ¿ì, ÇǾ絵ÀÚ¿¡°Ô´Â ÇÁ·Î±×·¥¿¡

´ëÇÑ ´Ü¼øÇÑ »ç¿ë¸¸ÀÌ Çã¿ëµÇ¸ç ÇÁ·Î±×·¥°ú 2Â÷Àû ÇÁ·Î±×·¥¿¡ ´ëÇÑ °³ÀÛ°ú ¹èÆ÷ ÇàÀ§

´Â Çã¿ëµÇÁö ¾Ê´Â´Ù. ÀÌ´Â ÇǾ絵ÀÚ°¡ ¶óÀ̼¾½º¿¡ ¼­¸íÇÏÁö ¾ÊÀ½À¸·Î½á ¹ß»ýµÈ ¹ý·üÀû

±ÝÁö »çÇ×ÀÌ´Ù. µû¶ó¼­, ÇÁ·Î±×·¥(¶Ç´Â 2Â÷Àû ÇÁ·Î±×·¥)À» °³ÀÛÇϰųª ¹èÆ÷ÇÏ´Â ÇàÀ§

´Â º¹Á¦¿Í °³ÀÛ, ¹èÆ÷¿¡ °üÇÑ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤°ú Á¶°ÇµéÀ» ¸ðµÎ ¹Þ¾ÆµéÀÌ°Ú´Ù´Â ¹¬

½ÃÀûÀÎ µ¿ÀÇ·Î °£ÁÖÇÑ´Ù.

 

Á¦ 6 Ç×. ÇǾ絵ÀÚ¿¡ ÀÇÇؼ­ ÇÁ·Î±×·¥(¶Ç´Â 2Â÷Àû ÇÁ·Î±×·¥)ÀÌ ¹Ýº¹ÀûÀ¸·Î ¹èÆ÷µÉ °æ

¿ì, °¢ ´Ü°è¿¡¼­ÀÇ ÇǾ絵ÀÚ´Â º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ ÀÇÇÑ ÇÁ·Î±×·¥ÀÇ º¹Á¦¿Í °³ÀÛ,

¹èÆ÷¿¡ ´ëÇÑ ±ÇÇÑÀ» ÃÖÃÊÀÇ ÇÁ·Î±×·¥ ¾çµµÀڷκÎÅÍ ¾çµµ¹ÞÀº °ÍÀ¸·Î ÀÚµ¿ÀûÀ¸·Î °£ÁÖ

µÈ´Ù. ÇÁ·Î±×·¥(¶Ç´Â 2Â÷Àû ÇÁ·Î±×·¥)À» ¾çµµÇÒ ¶§´Â ÇǾ絵ÀÚÀÇ ±Ç¸®¸¦ Á¦ÇÑÇÒ ¼ö ÀÖ

´Â ¾î¶°ÇÑ »çÇ×µµ º°Ç×À¸·Î ÷°¡ÇÒ ¼ö ¾øÀ¸¸ç ±× ´©±¸µµ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤µéÀ» Áؼö

Çϵµ·Ï °­Á¦ÇÒ ¼ö ¾ø´Ù.

 

Á¦ 7 Ç×. ¹ý¿øÀÇ ÆÇ°áÀ̳ª ƯÇã±Ç ħÇØ¿¡ ´ëÇÑ ÁÖÀå ¶Ç´Â Æ¯Çã ¹®Á¦¿¡ ±¹ÇѵÇÁö ¾Ê´Â

±× ¹ÛÀÇ ´Ù¸¥ ÀÌÀ¯µé·Î ÀÎÇؼ­ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ ¹èÄ¡µÇ´Â »ç¾ÈÀÌ ¹ß»ýÇÑ´Ù ÇÏ´õ

¶óµµ º» ¶óÀ̼¾½º¿¡ ¹èÄ¡µÇ´Â ±ÔÁ¤µéÀÌ º» ¶óÀ̼¾½º¿¡ ´ëÇÑ ½ÇÇà »óÀÇ ¿ì¼±±ÇÀ» °®°Ô

µÇÁö´Â ¾Ê´Â´Ù. µû¶ó¼­, ¹ý¿øÀÇ ¸í·ÉÀ̳ª ÇÕÀÇ µî¿¡ ÀÇÇؼ­ º» ¶óÀ̼¾½º¿¡ À§¹èµÇ´Â

»çÇ×µéÀÌ ºÎ°úµÈ´Ù ÇÏ´õ¶óµµ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤µéÀ» ÇÔ²² ÃæÁ·½ÃÅ°¸é¼­ ÇØ´ç ÇÁ·Î±×

·¥À» ¹èÆ÷ÇÒ ¼ö ¾ø´Ù¸é ÀÌ ÇÁ·Î±×·¥ÀÇ ¹èÆ÷´Â ±ÝÁöµÈ´Ù. ¿¹¸¦ µé¸é, ƯÁ¤ ƯÇã °ü·Ã

¶óÀ̼¾½º°¡ Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀÎ ¾çµµ ¹æ¹ý¿¡ ÀÇÇؼ­ ÇÁ·Î±×·¥À» ¹«»óÀ¸·Î ¹èÆ÷ÇÏ´Â °Í

À» Çã¿ëÇÏÁö ¾Ê´Â´Ù¸é ÀÌ ÇÁ·Î±×·¥Àº º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ ÀÇÇؼ­ °ü¸®µÇ´Â ÇÁ·Î±×·¥

µé°ú ÇÔ²² ¹èÆ÷µÉ ¼ö ¾ø´Ù. ƯÁ¤ »óȲ¿¡¼­ º» Á¶Ç×ÀÇ ÀϺκÐÀÌ Àû¿ëµÉ ¼ö ¾ø´Â °æ¿ì¿¡

´Â ÇØ´ç ºÎºÐÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ºÎºÐµéÀ» Àû¿ë½ÃÅ°¸ç º» Á¶Ç×ÀÇ ÀüºÎ¸¦ Àû¿ë½ÃÅ°±â À§

Çؼ­´Â ´Ù¸¥ »óȲ°ú Á¶°ÇµéÀÌ ÇÊ¿äÇÏ´Ù. º» Á¶Ç×ÀÇ ¸ñÀûÀº ƯÇ㳪 Àç»ê±Ç ħÇØ µîÀÇ

ÇàÀ§¸¦ Á¶ÀåÇϰųª ÇØ´ç ±Ç¸®¸¦ ÀÎÁ¤ÇÏÁö ¾ÊÀ¸·Á´Â °ÍÀÌ ¾Æ´Ï¶ó GNU General Public

LicenseÀÇ ½ÇÁ¦ÀûÀÎ Àû¿ëÀ» ÅëÇؼ­ ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÇ ¹èÆ÷ ü°è¸¦ ÅëÇÕÀûÀ¸·Î º¸È£ÇÏ

±â À§ÇÑ °ÍÀÌ´Ù. ¸¹Àº »ç¶÷µéÀÌ ¹èÆ÷ ü°è¿¡ ´ëÇÑ ½Å·ÚÀÖ´Â Áö¿øÀ» °è¼ÓÇØ ÁÜÀ¸·Î½á

¼ÒÇÁÆ®¿þ¾îÀÇ ´Ù¾çÇÑ ºÐ¾ß¿¡ ¸¹Àº °øÇåÀ» ÇØ ÁÖ¾ú´Ù. ¼ÒÇÁÆ®¿þ¾î¸¦ ¾î¶°ÇÑ ¹èÆ÷ ü°è

¸¦ ÅëÇؼ­ ¹èÆ÷ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÏ´Â °ÍÀº ÀüÀûÀ¸·Î ÀúÀÛÀÚ¿Í ±âÁõ°¡µéÀÇ ÀÇÁö¿¡ ´Þ·Á

ÀÖÁö ÀÏ¹Ý »ç¿ëÀÚµéÀÌ °­¿äÇÒ ¼ö ÀÖ´Â ¹®Á¦´Â ¾Æ´Ñ °ÍÀÌ´Ù. º» Á¶Ç×Àº °è¼ÓµÇ´Â º» ¶ó

À̼¾½ºÀÇ ³»¿ëµéÀ» ÅëÇؼ­ Áß¿äÇÏ°Ô Ãë±ÞµÇ°í ÀÖ´Â Á¡µéÀ» º¸´Ù ¸íÈ®ÇÏ°Ô ¼³¸íÇÏ´Â µ¥

µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

 

Á¦ 8 Ç×. ƯÇã±Ç°ú ÀúÀÛ±ÇÀÇ ¹ýÀû ó¸® ¹æ½Ä¿¡ ÀÇÇؼ­ ƯÁ¤ ±¹°¡¿¡¼­ ÇÁ·Î±×·¥ÀÇ ¹èÆ÷

¿Í »ç¿ëÀÌ ÇÔ²² ¶Ç´Â °³º°ÀûÀ¸·Î ±ÝÁöµÉ °æ¿ì, º» ¶óÀ̼¾½º¿¡ ÀÇÇؼ­ ÇÁ·Î±×·¥À» °ø°³

ÇÑ ¿øÀúÀÛÀÚ´Â ¹®Á¦°¡ ¹ß»ýµÇÁö ¾Ê´Â ±¹°¡¿¡ ÇÑÇؼ­ À̸¦ ¹èÆ÷ÇÑ´Ù´Â ¹èÆ÷»óÀÇ Áö¿ªÀû

Á¦ÇÑ Á¶°ÇÀ» ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ·¯ÇÑ »çÇ×Àº º» ¶óÀ̼¾½ºÀÇ ÀϺηΠ°£ÁֵȴÙ.

 

Á¦ 9 Ç×. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº GNU General Public License¸¦ °³Á¤Çϰųª °»½ÅÇÒ

¼ö ÀÖ´Ù. °³Á¤µÇ°Å³ª º¯µ¿µÇ´Â »çÇ×Àº »õ·Î¿î ¹®Á¦¿Í °ü½É¿¡ µû¶ó¼­ ¼¼ºÎÀûÀ¸·Î Á¶Á¤

µÇ°ÚÁö¸¸ ±× ±Ùº» Á¤½ÅÀº ¹Ù²îÁö ¾ÊÀ» °ÍÀÌ´Ù.

GNU General Public LicenseÀÇ ¸ðµç ¹öÀüÀº ´Ù¸¥ ¹öÀü ¹øÈ£·Î ±¸º°µÉ °ÍÀÌ´Ù. ¾çµµ¹Þ

Àº ÇÁ·Î±×·¥ÀÌ Æ¯Á¤ ¹öÀüÀÇ ¶óÀ̼¾½º¸¦ ¸í½ÃÇÏ°í ÀÖ´Ù¸é ÇØ´ç ¹öÀü ¶Ç´Â ±× ÀÌÈÄÀÇ

¶óÀ̼¾½º°¡ Àû¿ëµÇ¸ç ¹öÀüÀ» ¸í½ÃÇÏÁö ¾ÊÀº °æ¿ì´Â ¾î¶°ÇÑ ¹öÀüÀÇ ¶óÀ̼¾½º¸¦ Àû¿ëÇØ

µµ ¹«¹æÇÏ´Ù.

 

Á¦ 10 Ç×. ÇÁ·Î±×·¥ÀÇ ÀϺθ¦ º» ¶óÀ̼¾½º¿Í ¹èÆ÷ ±âÁØÀÌ ´Ù¸¥ ÀÚÀ¯ ÇÁ·Î±×·¥°ú ÇÔ²²

¹èÆ÷ÇÒ °æ¿ì, ÇØ´ç ÇÁ·Î±×·¥ÀÇ ÀúÀÛÀڷκÎÅÍ ¼­¸éÀ» ÅëÇÑ ½ÂÀÎÀ» ¹Þ¾Æ¾ß ÇÑ´Ù. ÀÚÀ¯

¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÌ ÀúÀÛ±ÇÀ» °®°í ÀÖ´Â ¼ÒÇÁÆ®¿þ¾î¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ÀÚÀ¯ ¼ÒÇÁÆ®

¿þ¾î Àç´ÜÀÇ ½ÂÀÎÀ» ¾ò¾î¾ß ÇÑ´Ù. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº ½ÂÀÎ ¿ä°Ç¿¡ ´ëÇؼ­ ¿¹¿Ü

±ÔÁ¤À» µÑ ¼ö ÀÖ´Ù. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÇ 2Â÷Àû ÀúÀÛ¹°µéÀ» ¸ð

µÎ ÀÚÀ¯·Î¿î »óÅ·ΠÀ¯Áö½ÃÅ°·Á´Â ¸ñÀû°ú ¼ÒÇÁÆ®¿þ¾îÀÇ ÀϹÝÀûÀÎ °øÀ¯¿Í ÀçÈ°¿ëÀ» Áõ

Áø½ÃÅ°·Á´Â ±âÁØ¿¡ ±Ù°ÅÇؼ­ ½ÂÀÎ ¿©ºÎ¸¦ °áÁ¤ÇÒ °ÍÀÌ´Ù.

 

º¸ÁõÀÇ °á¿©

 

Á¦ 11 Ç×. º» ¶óÀ̼¾½º¿¡ ÀÇÇÑ ÇÁ·Î±×·¥Àº ¹«»óÀ¸·Î ¾çµµµÇ¹Ç·Î °ü·Ã ¹ýÀÌ Çã¿ëÇÏ´Â

Çѵµ ³»¿¡¼­ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ Á¦°øÇÏÁö ¾Ê´Â´Ù. ´Ü, ÇÁ·Î±×·¥ÀÇ ÀúÀÛ±ÇÀÚ¿Í Á¦

3ÀÇ ¹èÆ÷ÀÚ¿¡ ÀÇÇؼ­ °øµ¿ ¶Ç´Â °³º°ÀûÀ¸·Î ƯÁ¤ ¸ñÀû¿¡ ´ëÇÑ ÇÁ·Î±×·¥ÀÇ ÀûÇÕ¼º ¿©

ºÎ¸¦ °ËÁõÇϱâ À§ÇÑ °æ¿ì³ª »ó¾÷Àû ÆǸſ¡ µû¸¥ º°µµÀÇ º¸ÁõÀÌ Á¦°øµÈ´Ù´Â »çÇ×ÀÌ ¼­

¸éÀ¸·Î ¸í½ÃµÇ¾î ÀÖ´Â °æ¿ì´Â ¿¹¿Ü·Î ÇÑ´Ù. ÀÌ °æ¿ìµµ ÇØ´ç ÇÁ·Î±×·¥ ÀÚü°¡ °®°í ÀÖ

´Â ±Ù¿øÀûÀÎ º¸ÁõÀÇ °á¿©¸¦ Á¦ÇÑÇÒ ¼ö´Â ¾ø´Ù. ÇÁ·Î±×·¥°ú ÇÁ·Î±×·¥ÀÇ ½ÇÇà¿¡ µû¶ó ¹ß

»ýÇÒ ¼ö ÀÖ´Â À§ÇèÀº ¸ðµÎ ÇǾ絵ÀÚ¿¡°Ô ÀμöµÇ¸ç ÀÌ¿¡ µû¸¥ º¸¼ö ¹× º¹±¸¸¦ À§ÇÑ Á¦

¹Ý °æºñ ¶ÇÇÑ ¸ðµÎ ÇǾ絵ÀÚ°¡ ºÎ´ãÇÑ´Ù.

 

Á¦ 12 Ç×. ÀúÀÛ±ÇÀÚ³ª Á¦ 3ÀÇ ¹èÆ÷ÀÚ°¡ ÇÁ·Î±×·¥ÀÇ ¼Õ»ó °¡´É¼ºÀ» »çÀü¿¡ ¾Ë°í ÀÖ¾ú´Ù

ÇÏ´õ¶óµµ ¹ß»ýµÈ ¼Õ½ÇÀÌ °ü·Ã ¹ý±Ô¿¡ ÀÇÇؼ­ º¸È£µÇ°í Àְųª ÀúÀÛ±ÇÀÚ³ª ÇÁ·Î±×·¥ ÀÚ

ü¿¡ ´ëÇÑ º¸ÁõÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù´Â ÀüÁ¦·Î ÇÁ·Î±×·¥°ú °³ÀÛµÈ ÇÁ·Î±×·¥À» ÇÔ²² ¶Ç´Â

°³º°ÀûÀ¸·Î °ø±ÞÇÑ ¹èÆ÷ÀÚ°¡ ¼­¸éÀ¸·Î º°µµÀÇ º¸ÁõÀ» ¼³Á¤ÇÑ °æ¿ì°¡ ¾Æ´Ï¶ó¸é ÇÁ·Î±×

·¥ÀÇ »ç¿ëÀ̳ª »ç¿ë»óÀÇ ¹Ì¼÷À¸·Î ÀÎÇؼ­ ¹ß»ýµÈ ¼Õ½ÇÀº ¸ðµÎ ÇǾ絵ÀÚÀÇ Ã¥ÀÓÀÌ´Ù.

¹ß»ýµÈ ¼Õ½ÇÀÇ ÀϹݼºÀ̳ª Ư¼ö¼º »Ó¸¸ ¾Æ´Ï¶ó ¿øÀÎÀÇ ¿ì¹ß¼º ¹× ÇÊ¿¬¼ºµµ °í·ÁµÇÁö

¾Ê´Â´Ù.

 

º¹Á¦¿Í °³ÀÛ, ¹èÆ÷¿¡ °üÇÑ Á¶°Ç°ú ±ÔÁ¤ÀÇ ³¡.

 

±ÔÁ¤µéÀ» ½Ç¹«¿¡ Àû¿ëÇÏ´Â ¹æ¹ý

 

°³¹ßÇÑ ÇÁ·Î±×·¥ÀÌ º¸´Ù ¸¹Àº »ç¶÷µé¿¡°Ô À¯¿ëÇÏ°Ô »ç¿ëµÇ±â¸¦ ¿øÇÑ´Ù¸é ±× ÇÁ·Î±×·¥

ÀÌ º» ¶óÀ̼¾½ºÀÇ ±ÔÁ¤¿¡ µû¶ó¼­ ÀÚÀ¯·Ó°Ô ¼öÁ¤µÇ°í ¹èÆ÷µÉ ¼ö ÀÖµµ·Ï ÀÚÀ¯ ¼ÒÇÁÆ®¿þ

¾î·Î ¸¸µå´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æ¹ýÀÌ´Ù.

´ÙÀ½°ú °°Àº »çÇ×µéÀ» ÇÁ·Î±×·¥¿¡ ÷°¡ÇÔÀ¸·Î½á ÇØ´ç ÇÁ·Î±×·¥À» ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î·Î

¸¸µé ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥¿¡ ´ëÇÑ º¸ÁõÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù´Â »ç½ÇÀ» °¡Àå È¿°úÀûÀ¸·Î Àü

´ÞÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¼Ò½º Äڵ尡 Æ÷ÇԵǾî ÀÖ´Â ¸ðµç ÆÄÀÏÀÇ ½ÃÀÛ ºÎºÐ¿¡ ÀÌ·¯ÇÑ »ç

Ç×µéÀ» ¸í½ÃÇÏ´Â °ÍÀÌ´Ù. °¢°¢ÀÇ ÆÄÀϵéÀº ÃÖ¼ÒÇÑ ÀúÀ۱ǰú GPLÀ» ÃëµæÇÒ ¼ö ÀÖ´Â ¹æ

¹ýÀ» ¸í½ÃÇؾ߸¸ ÇÑ´Ù.

 

ÇÁ·Î±×·¥ÀÇ À̸§°ú ¿ëµµ¿¡ ´ëÇÑ ¼³¸íÀ» À§Çؼ­ ÇÑ ÁÙÀ» »ç¿ëÇÑ´Ù.

Copyright (C) 19yy ÇÁ·Î±×·¥ ÀúÀÛÀÚÀÇ À̸§

 

ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÌ´Ù. ¼ÒÇÁÆ®¿þ¾îÀÇ ÇǾ絵ÀÚ´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü

ÀÇ GNU General Public LicenseÀÇ ±ÔÁ¤¿¡ ÀÇÇؼ­ ÀÌ ÇÁ·Î±×·¥À» °³ÀÛµÈ 2Â÷Àû ÇÁ·Î±×

·¥°ú ÇÔ²² ¶Ç´Â °³º°ÀûÀ¸·Î ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.

 

ÀÌ ÇÁ·Î±×·¥Àº º¸´Ù À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖÀ¸¶ó´Â Èñ¸Á¿¡¼­ ¹èÆ÷µÇ°í ÀÖÁö¸¸ Á¦Ç°¿¡

´ëÇÑ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ ÇÏÁö ¾Ê´Â´Ù. º¸´Ù ÀÚ¼¼ÇÑ »çÇ׿¡ ´ëÇؼ­´Â GNU General

Public License¸¦ Âü°íÇϱ⠹ٶõ´Ù.

 

GNU General Public License´Â ÀÌ ÇÁ·Î±×·¥°ú ÇÔ²² Á¦°øµÈ´Ù.

 

¸¸¾à, ÀÌ ¹®¼­°¡ ´©¶ôµÇ¾î ÀÖ´Ù¸é ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü¿¡ ¹®ÀÇÇϱ⠹ٶõ´Ù(ÀÚÀ¯ ¼ÒÇÁ

Æ®¿þ¾î Àç´Ü: Free Software Foundation, Inc., 59 Temple Place - Suite 330, Bost-

on, MA 02111-1307, USA)

 

¶ÇÇÑ, ÇÁ·Î±×·¥ ÀúÀÛÀÚ¿Í ¼­¸é ¶Ç´Â ÀüÀÚ ¸ÞÀÏÀ» ÅëÇؼ­ ¿¬¶ôÇÒ ¼ö ÀÖ´Â Á¤º¸¸¦ ±âÀç

ÇØ¾ß ÇÑ´Ù.

 

¸¸¾à, ÀÌ ÇÁ·Î±×·¥ÀÌ ¸í·É¾î ÀÔ·Â ¹æ½Ä¿¡ ÀÇÇÑ ´ëÈ­Çü ±¸Á¶¸¦ ÅÃÇÏ°í ÀÖ´Ù¸é ÇÁ·Î±×·¥

ÀÌ ´ëÈ­Çü ¹æ½ÄÀ¸·Î ½ÇÇàµÇ´Â Ãʱ⠻óÅ¿¡¼­ ´ÙÀ½°ú °°Àº ÁÖÀÇ »çÇ×À» Ãâ·Â½ÃÄÑ¾ß ÇÑ

´Ù.

 

Gnomovision version 69, Copyright (C) 19yyÇÁ·Î±×·¥ ÀúÀÛÀÚÀÇ À̸§

GnomovisionÀº Á¦Ç°¿¡ ´ëÇÑ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ Á¦°øµÇÁö ¾Ê´Â´Ù.

 

º¸´Ù ÀÚ¼¼ÇÑ »çÇ×Àº 'show w' ¸í·É¾î¸¦ ÀÌ¿ëÇؼ­ °ü·ÃµÈ »çÇ×À» Ãâ·ÂÇØ º¸±â ¹Ù¶õ´Ù.

º» ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀ̸ç ƯÁ¤ ±ÔÁ¤µéÀ» ¸¸Á·½ÃÅ°´Â Á¶°ÇÇÏ¿¡¼­ Àç¹èÆ÷µÉ

¼ö ÀÖ´Ù. ¹èÆ÷¿¡ ´ëÇÑ ÇØ´ç ±ÔÁ¤Àº 'show c' ¸í·É¾î¸¦ ÅëÇؼ­ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

'show w'¿Í 'show c'´Â General Public LicenseÀÇ ÇØ´ç ºÎºÐÀ» ÂüÁ¶Çϱâ À§ÇÑ °¡»óÀÇ

¸í·É¾îÀÌ´Ù. µû¶ó¼­, ÀÌ ¸í·É¾îµéÀº ¸¶¿ì½º¸¦ ÀÌ¿ëÇϰųª ¸Þ´º ¹æ½ÄÀ» ±¸¼ºÇÏ´Â µîÀÇ

ÇÁ·Î±×·¥¿¡ ÀûÇÕÇÑ ¿©·¯ °¡Áö ÇüÅÂÀ¸·Î º¯ÇüµÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à, ÇÁ·Î±×·¥ ÀúÀÛ

ÀÚ°¡ Çб³³ª ±â¾÷°ú °°Àº ´Üü³ª ±â°ü¿¡ °í¿ëµÇ¾î ÀÖ´Ù¸é ÇÁ·Î±×·¥ÀÇ ÀÚÀ¯·Î¿î ¹èÆ÷¸¦

À§Çؼ­ °í¿ëÁÖ³ª ÇØ´ç ±â°üÀåÀ¸·Î ºÎÅÍ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÀúÀÛ±ÇÀ» Æ÷±âÇÑ´Ù´Â µ¿ÀǸ¦

¾ò¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½°ú °°Àº Çü½ÄÀÌ µÉ ¼ö ÀÖ´Ù.

 

º»»ç´Â James Hacker¿¡ ÀÇÇؼ­ ÀÛ¼ºµÈ

'Gnomovision' ÇÁ·Î±×·¥¿¡ °ü°èµÈ ¸ðµç ÀúÀÛ±ÇÀ» Æ÷±âÇÑ´Ù.

1989³â 4¿ù 1ÀÏ

Yoyodye, Inc., ºÎ»çÀå: Ty Coon

¼­¸í: Ty CoonÀÇ ¼­¸í

 

º» ¶óÀ̼¾½º´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î·Î ¼³Á¤µÈ ÇÁ·Î±×·¥À» µ¶Á¡ ¼ÒÇÁÆ®¿þ¾î¿Í ÇÔ²² »ç¿ëÇÏ

´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê´Â´Ù. ¸¸¾à, ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÌ ¶óÀ̺귯¸® ¼­ºê·çƾ°ú °°Àº ÇÁ·Î

±×·¥ÀÏ °æ¿ì¿¡´Â À̸¦ µ¶Á¡ ¼ÒÇÁÆ®¿þ¾î ÇüÅÂÀÇ ÀÀ¿ë ÇÁ·Î±×·¥°ú ÇÔ²² »ç¿ëÇÔÀ¸·Î½á º¸

´Ù È¿°úÀûÀ¸·Î È°¿ëµÉ ¼ö ÀÖ´Ù°í »ý°¢ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â º» ¶óÀ̼¾

½º ´ë½Å¿¡ GNU Library General Public License¸¦ »ç¿ëÇÔÀ¸·Î½á ¼Ò±âÀÇ ¸ñÀûÀ» ÃæÁ·½Ã

ų ¼ö ÀÖÀ» °ÍÀÌ´Ù.