· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linux Kernel Coding Style

¸®´ª½º Ä¿³Î ÄÚµù ½ºÅ¸ÀÏ

¹ø¿ª: ±è³²Çü(pastime)

ÀÌ ¹®¼­´Â ¸®´ª½º Ä¿³Î Æ®¸®¿¡ Æ÷ÇÔµÈ CodingStyle ¹®¼­¸¦ ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù.



ÀÌ ¹®¼­´Â ¸®´ª½º Ä¿³Î¿¡¼­ ÁÖ·Î »ç¿ëµÇ´Â ÄÚµù ½ºÅ¸ÀÏÀ» ¼³¸íÇÑ °£·«ÇÑ ¹®¼­ÀÌ´Ù. ÄÚµù ½ºÅ¸ÀÏÀº ¸Å¿ì °³ÀÎÀûÀÎ ³»¿ëÀ̸ç Á¦ ÀÇ°ßÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô °­¿äÇÏ°í ½ÍÁö´Â ¾ÊÁö¸¸, ÀÌ°ÍÀº ³»°¡ °ü¸®ÇØ¾ß ÇÒ ºÎºÐÀÌ¸ç ´Ù¸¥ °÷¿¡¼­µµ À̸¦ Áñ°Ü »ç¿ëÇÑ´Ù. (FIXME!) ÃÖ¼ÒÇÑ ¿©±â¼­ ¼³¸íÇÑ ³»¿ëµéÀ» ÇÑ ¹ø °í·ÁÇØ º¸±â¶óµµ ÇØ ÁÖ±æ ¹Ù¶õ´Ù.

¸ÕÀú, GNU ÄÚµù Ç¥ÁØ ¹®¼­¸¦ Ãâ·ÂÇÏ±æ ¹Ù¶õ´Ù. ±×¸®°í ±× ¹®¼­¸¦ ÀÐÁö ¸»°í Å¿ö¹ö·Á¶ó! ÀÌ°Ç ¸Å¿ì »ó¡ÀûÀÎ ÇൿÀÌ´Ù.

¾î·µç ½ÃÀÛÇغ¸ÀÚ:


1. µé¿©¾²±â


ÅÇ Å©±â´Â 8 ±ÛÀÚÀÌ°í, µû¶ó¼­ µé¿©¾²±â ´ÜÀ§µµ 8 ±ÛÀÚÀÌ´Ù. µé¿©¾²±â¸¦ 4 ±ÛÀÚ (½ÉÁö¾î´Â 2 ±ÛÀÚ!) ´ÜÀ§·Î ÇÏ·Á´Â ¹Ý´ë ¿îµ¿ÀÌ ÀÖÁö¸¸, ÀÌ°ÍÀº PI (¿øÁÖÀ²) °ªÀ» 3À¸·Î Á¤ÀÇÇÏ´Â °Í°ú °°´Ù.

³í¸®: µé¿©¾²±â¿¡ ´ëÇÑ ¾ÆÀ̵ð¾î´Â Á¦¾î ºí·°ÀÇ ½ÃÀÛ°ú ³¡À» ¸íÈ®È÷ Á¤ÀÇÇϱâ À§ÇÑ °ÍÀÌ´Ù. ƯÈ÷ ¿©·¯ºÐÀÌ 20 ½Ã°£µ¿¾È °è¼Ó ½ºÅ©¸°À» º¸°í ÀÖÀ» ¶§´Â, Å« µé¿©¾²±â¸¦ ÀÌ¿ëÇÒ ¶§°¡ ÈξÀ ÆíÇÏ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.

ÀÌÁ¦, ¾î¶² »ç¶÷µéÀº 8 ±ÛÀÚ µé¿©¾²±â¸¦ Çϸé Äڵ尡 ³Ê¹« ¿À¸¥ÂÊÀ¸·Î °¡¹ö·Á¼­ 80 ±ÛÀÚ Å©±âÀÇ Å͹̳Πȭ¸é¿¡¼­ Äڵ带 ÀбⰡ Èûµé´Ù°í ºÒÆòÇÒ °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ´ë´äÀº, ÇÁ·Î±×·¥¿¡¼­ 3 ´Ü°è¸¦ ³Ñ¾î°¡´Â µé¿©¾²±â°¡ ÇÊ¿äÇÑ °æ¿ì¶ó¸é ÀÌ¹Ì ÇÁ·Î±×·¥ÀÌ À߸øµÈ °ÍÀ̹ǷΠÀ̸¦ °íÃÄ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.

°£´ÜÈ÷ ¸»ÇØ 8 ±ÛÀÚ µé¿©¾²±â´Â Äڵ带 Àбâ ÆíÇÏ°Ô ÇØÁÖ¸ç, ÇÔ¼ö°¡ ³Ê¹« ±íÀÌ ÀÛ¼ºµÈ °æ¿ì °æ°í¸¦ ÇØ ÁÖ´Â ÀÌÁ¡À» °¡Áø´Ù. ÀÌ °æ°í¿¡ À¯ÀÇÇϵµ·Ï ÇÏÀÚ.

switch ¹®¿¡¼­ µé¿©¾²±â¸¦ ÇÏ´Â ¹æ½ÄÀº, "switch" ¿Í ±×¿¡ µû¸¥ "case" ·¹À̺íµéÀ» ÀÌÁß µé¿©¾²±â ÇÏÁö ¾Ê°í ´ÙÀ½°ú °°ÀÌ µ¿ÀÏÇÑ ¿­¿¡ ¹èÄ¡ÇÏ´Â °ÍÀÌ´Ù:

         switch (suffix) {
         case 'G':
         case 'g':
                 mem <<= 30;
                 break;
         case 'M':
         case 'm':
                 mem <<= 20;
                 break;
         case 'K':
         case 'k':
                 mem <<= 10;
                 /* fall through */
         default:
                 break;
         }

¹«¾ð°¡¸¦ ¼û±â°í ½ÍÀº °æ¿ì°¡ ¾Æ´Ï¶ó¸é, ÇÑ ÁÙ¿¡ ¿©·¯ ¹®ÀåÀ» ÇÔ²² ¾²Áö ¸»ÀÚ:

         if (condition) do_this;
           do_something_everytime;

¿©·¯ °³ÀÇ ÇÒ´ç¹®À» ÇÑ ÁÙ¿¡ °°ÀÌ ¾²Áö ¾Êµµ·Ï Ç϶ó. Ä¿³Î ÄÚµù ½ºÅ¸ÀÏÀº ¸Å¿ì ´Ü¼øÇÏ´Ù. È¥µ¿µÇ±â ½¬¿î(tricky) Ç¥ÇöÀ» »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ´Ù.

ÁÖ¼®À̳ª ¹®¼­ (KConfig ´Â ¿¹¿Ü) ÀÌ¿Ü¿¡¼­´Â °ø¹é ¹®ÀÚ·Î µé¿©¾²±â¸¦ Çؼ­´Â ¾ÈµÈ´Ù. À§ÀÇ ¿¹Á¦´Â ÀϺη¯ À߸øµÈ °æ¿ì¸¦ º¸¿©ÁØ °ÍÀÌ´Ù.

ÁÁÀº ÆíÁý±â¸¦ »ç¿ëÇÏ°í, ÁÙÀÇ ³¡ ºÎºÐ¿¡ °ø¹é ¹®ÀÚ¸¦ ³²±âÁö ¾Êµµ·Ï ÇÏÀÚ.


2. ±ä ÁÙ°ú ¹®ÀÚ¿­ ³ª´©±â


ÄÚµù ½ºÅ¸ÀÏÀº ³Î¸® »ç¿ëµÇ´Â µµ±¸¸¦ ÀÌ¿ëÇØ °¡µ¶¼º°ú À¯Áö º¸¼öÀÇ ¿ëÀ̼ºÀ» ³ôÀÌ´Â °ÍÀ» ¸ñÇ¥·Î ÇÑ´Ù.

ÇÑ ÁÙÀÇ ±æÀÌ´Â 80 ±ÛÀÚ·Î Á¦ÇѵǸç, ÀÌ´Â ÇʼöÀûÀÎ Á¦ÇÑ »çÇ× (hard limit) ÀÌ´Ù.

80 ±ÛÀÚ ÀÌ»óÀÇ ¹®ÀåÀº Àû´çÇÑ ´ÜÀ§·Î ³ª´©¾î Áú °ÍÀÌ´Ù. ³ª´©¾îÁø ºÎºÐÀº Ç×»ó ¿ø·¡ÀÇ ¹®À庸´Ù ª°í, ¿À¸¥ÂÊ¿¡ À§Ä¡ÇÑ´Ù. ÀÌ´Â ±ä ¸Å°³º¯¼ö ¸ñ·ÏÀ» °¡Áö´Â ÇÔ¼ö¿¡µµ ¶È°°ÀÌ Àû¿ëµÈ´Ù. ±ä ¹®ÀÚ¿­µµ ¸¶Âù°¡Áö·Î ª°Ô ³ª´©¾îÁø´Ù.

void fun(int a, int b, int c)
{
        if (condition)
                printk(KERN_WARNING "Warning this is a long printk with "
                                                "3 parameters a: %u b: %u "
                                                "c: %u \n", a, b, c);
        else
                next_statement;
}

3. °ýÈ£¿Í °ø¹é ¹®ÀÚ À§Ä¡


C ÄÚµù ½ºÅ¸ÀÏ¿¡¼­ Ç×»ó ³ª¿À´Â À̽´·Î´Â Áß°ýÈ£({ })ÀÇ À§Ä¡¿¡ ´ëÇÑ ¹®Á¦°¡ ÀÖ´Ù. µé¿©¾²±â Å©±â¿Í´Â ´Þ¸® ¾î¶² ¹æ½ÄÀ» ¼±ÅÃÇÏ´Â °Í¿¡ ´ëÇÑ ¸î °¡Áö ±â¼úÀûÀÎ ÀÌÀ¯°¡ ÀÖ´Ù. ÇÏÁö¸¸ (Ä¿³Î¿¡¼­) ÁÖ·Î »ç¿ëµÇ´Â ¹æ½ÄÀº ¼±ÁöÀÚ Kernighan °ú Ritchie °¡ »ç¿ëÇÑ, ´ÙÀ½°ú °°ÀÌ ¿©´Â Áß°ýÈ£¸¦ °°Àº ÁÙ¿¡ ¾²°í, ´Ý´Â Áß°ýÈ£´Â ´ÙÀ½ ÁÙÀÇ Ã³À½¿¡ ¾²´Â °ÍÀÌ´Ù:

        if (x is true) {
                we do y
        }

ÀÌ°ÍÀº (ÇÔ¼ö°¡ ¾Æ´Ñ) ¸ðµç ¹®Àå (if, switch, for, while, do µî) ¿¡ ´ëÇØ Àû¿ëµÈ´Ù. Áï:

        switch (action) {
        case KOBJ_ADD:
                return "add";
        case KOBJ_REMOVE:
                return "remove";
        case KOBJ_CHANGE:
                return "change";
        default:
                return NULL;
        }

ÇÏÁö¸¸ (ÁÖ·Î) ÇÔ¼öÀÇ °æ¿ì¿¡ ´ëÇؼ­´Â ¿¹¿ÜÀÌ´Ù. À̵éÀº ¾Æ·¡¿Í °°ÀÌ ¿©´Â Áß°ýÈ£¸¦ ´ÙÀ½ ÁÙÀÇ Ã³À½¿¡ ¾´´Ù:

int function(int x)
{
        body of function
}

Àü¼¼°èÀÇ ¹Ý·ÐÀÚµéÀº ÀÌ·¯ÇÑ ºÒÀÏÄ¡¸¦ ... À½ ... ¸ð¼øÀ̶ó°í ºÒÆòÇÏÁö¸¸, ¸ðµç ¿Ã¹Ù¸¥ »ç°í ¹æ½ÄÀ» °¡Áø »ç¶÷µéÀº K&R ÀÌ ¿ÇÀ½À» ¾Ë°í ÀÖ´Ù. (FIXME!!) ¾î·µç ÇÔ¼ö´Â Ưº°ÇÏ°Ô Ã³¸®µÈ´Ù. (C ¿¡¼­´Â ÇÔ¼ö¸¦ ÁßøÇؼ­ Á¤ÀÇÇÒ ¼ö ¾ø´Ù)

´Ý´Â Áß°ýÈ£´Â ±× ÀÚü·Î ÇÑ ÁÙÀ» Â÷ÁöÇÏÁö¸¸, if ¹®ÀÇ "else" ºÎºÐÀ̳ª do ¹®ÀÇ "while" ºÎºÐ°ú °°ÀÌ µ¿ÀÏÇÑ ¹®ÀåÀÌ ¿¬¼ÓµÇ´Â °æ¿ì¿¡´Â ¾Æ·¡¿Í °°ÀÌ ´Ý´Â Áß°ýÈ£ µÚ¿¡ ´Ù¸¥ ³»¿ëÀÌ ¿Ã ¼ö ÀÖ´Ù:

        do {
                body of do-loop
        } while (condition);

¶Ç´Â

        if (x == y) {
                ..
        } else if (x > y) {
                ...


        } else {
                ....
        }

³í¸®: K&R

¶ÇÇÑ, ÀÌ·¯ÇÑ Áß°ýÈ£ À§Ä¡´Â °¡µ¶¼ºÀ» ¶³¾î¶ß¸®Áö ¾ÊÀ¸¸é¼­, ºó ÁÙ (ȤÀº °ÅÀÇ ºó ÁÙ) ÀÇ ¼ö¸¦ ÃÖ¼ÒÈ­ ½ÃÄÑ ÁØ´Ù. µû¶ó¼­ ÁÙ¹Ù²Þ ¹®ÀÚ(\n)·Î ÀÎÇØ È­¸éÀ» °»½ÅÇÏÁö ¾Ê¾Æµµ µÇ¸ç (¿©±â¼­´Â 25Á٠¥¸® Å͹̳Π½ºÅ©¸°À» °í·ÁÇÏ¿´´Ù) ÁÖ¼®À» ´Þ ¼ö ÀÖ´Â ºó ÁÙÀ» È®º¸ÇÏ°Ô µÈ´Ù.

ÇÑ ¹®ÀåÀ¸·Î °¡´ÉÇÑ °÷¿¡´Â ºÒÇÊ¿äÇÏ°Ô Áß°ýÈ£¸¦ »ç¿ëÇÏÁö ¸»ÀÚ.

if (condition)
        action();

ÀÌ°ÍÀº ¿©·¯ ºÐ±âÁ¡¿¡¼­ Çϳª ¸¸ÀÌ ÇØ´çÇÒ ¶§´Â Àû¿ëµÇÁö ¾Ê´Â´Ù. ÀÌ °æ¿ì¿¡´Â ¸ðµÎ Áß°ýÈ£¸¦ ÀÌ¿ëÇÑ´Ù.

if (condition) {
        do_this();
        do_that();
} else {
        otherwise();
}

3.1. °ø¹é ¹®ÀÚ


¸®´ª½º Ä¿³Î¿¡¼­ °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏ´Â ¹æ½ÄÀº (ÁÖ·Î) ÇÔ¼ö¿Í Å°¿öµåÀÇ »ç¿ë¿¡ µû¶ó ´Þ¶óÁø´Ù. (´ëºÎºÐÀÇ) Å°¿öµå µÚ¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÑ´Ù. ÀÌ¿¡ ´ëÇÑ ¸î °¡Áö ¿¹¿Ü´Â sizeof, typeof, alignof, attribute À̸ç À̵éÀº ´Ù¼Ò ÇÔ¼ö¿Í °°ÀÌ º¸ÀδÙ. (À̵éÀº ¶ÇÇÑ ¸®´ª½º ³»¿¡¼­ °ýÈ£¿Í ÇÔ²² »ç¿ëµÈ´Ù. ÇÏÁö¸¸ C ¾ð¾î ÀÚü¿¡¼­´Â °ýÈ£ÀÇ »ç¿ëÀÌ ÇʼöÀûÀÌÁö´Â ¾Ê´Ù. Áï, "struct fileinfo info" °¡ ¼±¾ðµÈ ÈÄ¿¡´Â "sizeof info" ¿Í °°Àº ÇüÅ·Π»ç¿ëÇÒ ¼ö ÀÖ´Ù.)

Á¤¸®ÇÏ¸é ´ÙÀ½ Å°¿öµå µÚ¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÀÚ:

if, switch, case, for, do, while

ÇÏÁö¸¸ sizeof, typeof, alignof, attribute ¿¡¼­´Â »ç¿ëÇÏÁö ¸»ÀÚ. Áï:

s = sizeof(struct file);

°ýÈ£·Î µÑ·¯½ÎÀÎ ½Ä (³»ºÎ) ¿¡¼­´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ¾Æ·¡ÀÇ ¿¹Á¦´Â ¿Ã¹Ù¸£Áö ¾ÊÀº °ÍÀÌ´Ù:

s = sizeof( struct file );

Æ÷ÀÎÅÍ µ¥ÀÌÅÍ È¤Àº Æ÷ÀÎÅÍ Å¸ÀÔÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ '*' ±âÈ£¸¦ ŸÀÔ À̸§ÀÌ ¾Æ´Ñ µ¥ÀÌÅÍ È¤Àº ÇÔ¼ö À̸§¿¡ ºÙ¿©¾²´Â ¹æ½ÄÀÌ »ç¿ëµÈ´Ù:

char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);

´ÙÀ½°ú °°Àº ÀÌÇ× ¹× »ïÇ× ¿¬»êÀÚÀÇ (¾çÂÊ) ÁÖÀ§¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÑ´Ù:

= + - < > * / % | & ^ <= >= == != ? :

ÇÏÁö¸¸ ´ÜÇ× ¿¬»êÀÚÀÇ µÚ¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù:

& * + = ~ ! sizeof typeof alignof __attribute__ defined

Á¢¹Ì Áõ°¡/°¨¼Ò ´ÜÇ× ¿¬»êÀÚÀÇ ¾Õ¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù:

++ --

Á¢µÎ Áõ°¡/°¨¼Ò ´ÜÇ× ¿¬»êÀÚÀÇ µÚ¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù:

++ --

±¸Á¶Ã¼ ¸â¹ö ¿¬»êÀÚÀÎ '.' °ú "->" ÁÖÀ§¿¡´Â °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

ÁÙÀÇ ³¡ ºÎºÐ¿¡ °ø¹é ¹®ÀÚ¸¦ ³²°ÜµÎÁö ¾Êµµ·Ï Ç϶ó. ¶È¶ÈÇÑ µé¿©¾²±â (smart indentation) ±â´ÉÀ» Áö¿øÇÏ´Â ¸î¸î ÆíÁý±âµéÀº »õ ÁÙÀÇ Ã¹ ºÎºÐ¿¡ ÀûÀýÈ÷ °ø¹é ¹®ÀÚ¸¦ Ãß°¡ÇØ ÁֹǷÎ, ÀûÀýÇÑ ÁöÁ¡¿¡¼­ ¹Ù·Î ÄÚµùÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ·¯ÇÑ ÆíÁý±âµéÀº ¿©±â¿¡ ¾Æ¹«·± Äڵ嵵 ÀÛ¼ºÇÏÁö ¾Ê°í ºó Á٠ó·³ ³²°ÜµÐ °æ¿ì¿¡´Â °ø¹é ¹®ÀÚ¸¦ Áö¿öÁÖÁö ¾Ê´Â´Ù. µû¶ó¼­ ÁÙÀÇ ³¡ ºÎºÐ¿¡ °ø¹é ¹®ÀÚ°¡ ³²¾ÆÀÖ°Ô µÈ´Ù.

git ´Â ¿©·¯ºÐÀÇ ÆÐÄ¡¿¡ ÀÌ·¯ÇÑ °ø¹é ¹®ÀÚ°¡ Æ÷ÇԵǾî ÀÖ´Â °æ¿ì¿¡ °æ°í¸¦ º¸¿©ÁÖ¸ç, À̸¦ »èÁ¦ÇÏ´Â ±â´Éµµ Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÇÏÁö¸¸ ¿©·¯ °³ÀÇ ÆÐÄ¡¸¦ ÇÑ ¹ø¿¡ º¸³»´Â °æ¿ì¿¡´Â ÀÌ´Â º¯°æ »çÇ×À¸·Î ÀÎÇØ µÞ ºÎºÐÀÇ ÆÐÄ¡µéÀÌ ½ÇÆÐÇÏ°Ô µÉ ¼öµµ ÀÖ´Ù.

4. À̸§Áþ±â


C ¾ð¾î´Â °£¼ÒÇÑ(Spartan) ¾ð¾îÀ̹ǷÎ, À̸§Áþ±â ±ÔÄ¢µµ À̸¦ µû¶ó¾ß ÇÑ´Ù. Modula-2 ³ª ÆĽºÄ® ÇÁ·Î±×·¡¸Ó¿Í´Â ´Þ¸®, C ÇÁ·Î±×·¡¸ÓµéÀº ThisVariableIsATemporaryCounter ¿Í °°Àº ±Í¿©¿î(?) À̸§À» »ç¿ëÇÏÁö ¾Ê´Â´Ù. C ÇÁ·Î±×·¡¸ÓµéÀº "tmp" ¿Í °°ÀÌ, ¾²±â ½±°í ÀÌÇØÇϱ⵵ ±×¸® ¾î·ÆÁö ¾ÊÀº À̸§ÀÇ º¯¼ö¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.

ÇÏÁö¸¸, (´ë¼Ò¹®ÀÚ¸¦ ¼¯¾î¾²´Â °ÍÀº º¸±â ¾ÈÁÁÁö¸¸) Àü¿ª º¯¼ö¿¡ ´ëÇؼ­´Â ¹Ýµå½Ã ÃæºÐÇÑ ¼³¸íÀÌ µÉ ¸¸ÇÑ À̸§À» ºÙ¿©¾ß ÇÑ´Ù. Àü¿ª ÇÔ¼öÀÇ À̸§À» "foo" ¶ó°í Áþ´Â °ÍÀº ¹üÁË ÇàÀ§(shooting offense) ÀÌ´Ù (FIXME!)

Àü¿ª º¯¼ö´Â (Á¤¸»·Î ÇÊ¿äÇÑ °æ¿ì¿¡¸¸ »ç¿ëÇÏÀÚ) ÃæºÐÇÑ ¼³¸íÀÌ µÉ ¸¸ÇÑ À̸§À» °¡Á®¾ß Çϸç, ÀÌ´Â Àü¿ª ÇÔ¼ö¿¡ ´ëÇؼ­µµ ¸¶Âù°¡ÁöÀÌ´Ù. ¸¸¾à È°µ¿ ÁßÀÎ »ç¿ëÀÚÀÇ ¼ö¸¦ ¼¼´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇß´Ù¸é ÀÌ ÇÔ¼öÀÇ À̸§Àº "count_active_users()" ȤÀº ÀÌ¿Í ºñ½ÁÇÑ ÇüÅ°¡ µÉ °ÍÀ̸ç, "cntusr()" °ú °°Àº ÇüÅ°¡ µÇ¾î¼­´Â ¾È µÈ´Ù.

ÇÔ¼öÀÇ À̸§¿¡ ŸÀÔÀ» Æ÷ÇÔ½ÃÅ°´Â ¹æ½Ä ("Çë°¡¸®¾È Ç¥±â¹ý"À̶ó°í ÇÑ´Ù) Àº ¸ÛûÇÑ ÁþÀÌ´Ù. ÄÄÆÄÀÏ·¯´Â ŸÀÔÀ» ¾Ë°í üũÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ Ç¥±â¹ýÀº ´ÜÁö ÇÁ·Î±×·¡¸Ó¸¦ È¥µ¿½º·´°Ô ÇÒ »ÓÀÌ´Ù. MicroSoft ¿¡¼­ ¹ö±×°¡ ¸¹Àº ÇÁ·Î±×·¥µéÀ» ¸¸µé¾î ³»´Â °ÍÀ» º¸¸é ´ç¿¬ÇÏ´Ù.

Áö¿ª º¯¼ö´Â ª°Ô Çٽɸ¸À» ³ªÅ¸³»´Â À̸§À» »ç¿ëÇÑ´Ù. ¸¸¾à ¾î¶² ÀÓÀÇÀÇ Á¤¼ö ·çÇÁ Ä«¿îÅÍ°¡ ÇÊ¿äÇÏ´Ù¸é ±× À̸§Àº "i" °¡ µÉ °ÍÀÌ´Ù. À̸¦ "loop_counter" ¶ó°í Ç¥±âÇÏ´Â °ÍÀº ¿ÀÇظ¦ »ì ¸¸ÇÑ ¿©Áö°¡ ¾ø´Â °æ¿ì¿¡´Â »ý»êÀûÀÌÁö ¾Ê´Ù. ¸¶Âù°¡Áö·Î, "tmp" ÀϽÃÀûÀÎ °ªÀ» °¡Áö´Â ¾î¶² ŸÀÔÀÇ º¯¼ö¿¡µµ »ç¿ëµÉ ¼ö ÀÖ´Ù.

Ȥ½Ã ¿©·¯ºÐÀÌ Áö¿ª º¯¼ö À̸§ÀÌ ¸¹¾ÆÁ® µÚ¼¯ÀÌÁö ¾ÊÀ»±î °ÆÁ¤ÇÏ°í ÀÖ´Ù¸é, ¿©·¯ºÐÀº ÇÔ¼ö-¼ºÀå-È£¸£¸ó-ºÒ±ÕÇü ÁõÈıºÀ̶ó´Â ´Ù¸¥ ¹®Á¦¸¦ °¡Áö°í ÀÖ´Â °ÍÀÌ´Ù. 6Àå (ÇÔ¼ö) ºÎºÐÀ» º¸±â ¹Ù¶õ´Ù.

5. ŸÀÔ Á¤ÀÇ


Á¦¹ß "vps_t" ¿Í °°Àº °ÍÀ» »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÏÀÚ.

±¸Á¶Ã¼¿Í Æ÷ÀÎÅÍ¿¡ ´ëÇØ typedef ¸¦ »ç¿ëÇÏ´Â °ÍÀº ½Ç¼öÀÌ´Ù. ¸¸¾à ¼Ò½º¿¡¼­ ´ÙÀ½°ú °°Àº ³»¿ëÀ» º¸¾Ò´Ù¸é

vps_t a;

ÀÌ°ÍÀÌ ¹«½¼ ÀǹÌÀÎÁö ¾Ë ¼ö Àְڴ°¡?

ÇÏÁö¸¸ ´ÙÀ½°ú °°Àº °æ¿ì¶ó¸é
struct virtual_container *a;

"a" °¡ ¹«¾ùÀÎÁö È®½ÇÈ÷ ¸»ÇØ ÁÙ ¼ö ÀÖ°Ô µÈ´Ù.

¸¹Àº »ç¶÷µéÀÌ typedef °¡ "°¡µ¶¼º¿¡ µµ¿òÀ» ÁØ´Ù"¶ó°í »ý°¢ÇÏ°í ÀÖÁö¸¸, ±×·¸Áö ¾Ê´Ù. typedef ´Â ¿ÀÁ÷ ´ÙÀ½°ú °°Àº °æ¿ì¿¡¸¸ À¯¿ëÇÏ´Ù:


  1. ¿ÏÀüÈ÷ ºÒÅõ¸íÇÑ(opaque) °´Ã¼ (typedef °¡ ½ÇÁ¦ °´Ã¼¸¦ ¼û±â±âÀ§ÇØ ÁÖ·Î »ç¿ëµÇ´Â ¹æ½Ä) ¿¹: "pte_t" µî. ºÒÅõ¸í °´Ã¼´Â ¿ÀÁ÷ ÀûÀýÇÑ Á¢±Ù ÇÔ¼ö¸¦ ÅëÇؼ­¸¸ Á¢±ÙµÇ¾î¾ß ÇÑ´Ù.

    ÁÖÀÇ! ºÒÅõ¸í¼º°ú "Á¢±Ù ÇÔ¼ö"´Â ±× ÀÚü·Î´Â ÁÁÁö ¾Ê´Ù. ¿ì¸®°¡ pte_t µî¿¡¼­ ÀÌ·¯ÇÑ ¹æ½ÄÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â ¿©±â¿¡´Â ½ÇÁ¦·Î À̽ļºÀÖ°Ô Á¢±ÙÇÒ ¼ö ÀÖ´Â Á¤º¸°¡ ¾ø±â ¶§¹®ÀÌ´Ù.

  2. Á¤¼öÇüÀÇ ¸íÈ®ÇÑ ±¸ºÐ. Ãß»óÈ­´Â ÇØ´ç µ¥ÀÌÅÍ°¡ "int" ÀÎÁö "long" ÀÎÁö È¥¶õ½º·´Áö ¾Ê°Ô µµ¿ÍÁØ´Ù.

    u8/u16/u32 ´Â ¿ÏÀüÈ÷ ¿Ã¹Ù¸¥ typedef ÀÇ ¿ë·ÊÀÌ´Ù. (»ç½Ç À̵éÀº ¿©±âº¸´Ù 4¹ø Ç׸ñ¿¡ ´õ Àß ºÎÇյȴÙ)

    ÁÖÀÇ! ¿©±â¿¡´Â ÇÕ´çÇÑ ÀÌÀ¯°¡ ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à ¾î¶² µ¥ÀÌÅÍ°¡ "unsigned long" À̶ó¸é À̸¦
    typedef unsigned long myflags_t;
    À̶ó°í Á¤ÀÇÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÇÏÁö¸¸ ÀÌ µ¥ÀÌÅÍ°¡ ƯÁ¤ »óȲ¿¡¼­´Â "unsigned int" °¡ µÇ°í, ´Ù¸¥ »óȲ¿¡¼­´Â "unsigned long" ÀÌ µÈ´Ù¸é, typedef ¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ.

  3. sparse ¸¦ ÀÌ¿ëÇÏ¿© ŸÀÔ Ã¼Å©¸¦ Çϱâ À§ÇØ »õ·Î¿î ŸÀÔÀ» ¸¸µå´Â °æ¿ì. (°ËÅä ÇÊ¿ä!)

  4. ƯÁ¤ÇÑ ¿¹¿ÜÀûÀΠȯ°æ¿¡¼­ C99 Ç¥ÁØ°ú µ¿ÀÏÇÑ »õ·Î¿î ŸÀÔ.

    ºñ·Ï 'uint32_t' ¿Í °°Àº Ç¥ÁØ Å¸ÀÔ¿¡ Àͼ÷ÇØ Áö´Â µ¥´Â ±×¸® ¿À·£ ½Ã°£ÀÌ ÇÊ¿äÇÑ °ÍÀº ¾Æ´ÏÁö¸¸, ¸î¸î »ç¶÷µéÀº ¾î·µç ÀÌ¿Í °°Àº ŸÀÔÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.

    µû¶ó¼­ Ç¥ÁØ°ú µ¿ÀÏÇÑ Àǹ̸¦ °¡ÁöÁö¸¸ ¸®´ª½º¿¡¼­¸¸ »ç¿ëµÇ´Â 'u8/u16/u32/u64' ŸÀÔ ¹× ÀÌ¿¡ ´ëÀÀÇÏ´Â ºÎÈ£ÀÖ´Â (signed) ŸÀÔÀ» »ç¿ëÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. ÇÏÁö¸¸ ÀÌ°ÍÀº ¿©·¯ºÐÀÌ »õ·Î¿î Äڵ带 ÀÛ¼ºÇÒ ¶§ ¹Ýµå½Ã ÁöÄÑ¾ß ÇÏ´Â »çÇ×Àº ¾Æ´Ï´Ù.

    ±âÁ¸ÀÇ Äڵ带 ÀÛ¼ºÇÒ ¶§´Â ÀÌ¹Ì ¼±ÅÃÇÏ¿© »ç¿ëÇÏ°í Àִ ŸÀÔÀ» µû¶ó¼­ »ç¿ëÇØ¾ß ÇÑ´Ù.

  5. »ç¿ëÀÚ ¿µ¿ª¿¡¼­ ¾ÈÀüÇÏ°Ô »ç¿ëÇÒ ¼ö Àִ ŸÀÔ.

    »ç¿ëÀÚ °ø°£¿¡¼­ Á¢±ÙÇÒ ¼ö Àִ ƯÁ¤ ±¸Á¶Ã¼µéÀº C99 ŸÀÔÀ» ¿ä±¸Çϰųª À§¿¡¼­ ¸»ÇÑ 'u32' ÇüÅÂÀÇ Å¸ÀÔÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. µû¶ó¼­ »ç¿ëÀÚ °ø°£°ú °øÀ¯ÇÒ ¼ö ÀÖ´Â ¸ðµç ±¸Á¶Ã¼ ³»ÀÇ µ¥ÀÌÅ͵éÀº __u32 ¿Í ºñ½ÁÇÑ Å¸ÀÔÀ» »ç¿ëÇÑ´Ù.


¾Æ¸¶µµ ´Ù¸¥ °æ¿ìµéµµ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ±âº»ÀûÀÎ ±ÔÄ¢Àº À§ÀÇ °æ¿ì ÁßÀÇ Çϳª¿Í Á¤È®È÷ ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù¸é Àý´ë·Î typedef ¸¦ »ç¿ëÇÏÁö ¸»¶ó´Â °ÍÀÌ´Ù.

ÀϹÝÀûÀ¸·Î Æ÷ÀÎÅͳª ÀûÀýÈ÷ Á¢±Ù °¡´ÉÇÑ ¿ä¼Ò¸¦ Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼´Â typedef ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.


6. ÇÔ¼ö


ÇÔ¼ö´Â ª°í, ¸ÚÁö°í, ¿ÀÁ÷ ÇÑ °¡Áö Àϸ¸ ¼öÇàÇϵµ·Ï ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù. ÇÔ¼ö´Â (80x24 Å©±â¸¦ °¡Áö´Â ISO/ANSI ½ºÅ©¸°¿¡¼­) Çϳª ȤÀº µÎ ÆäÀÌÁö ³»¿¡ Ç¥½ÃµÉ ¼ö ÀÖ¾î¾ß Çϸç, ÇÑ °¡Áö ÀÏ ¸¸À» Àß Çس»¾ß ÇÑ´Ù.

ÇÔ¼öÀÇ ÃÖ´ë ±æÀÌ´Â ÇÔ¼öÀÇ º¹Àâµµ¿Í µé¿©¾²±â ¼öÁØ¿¡ ¹Ýºñ·Ê(Çؾß) ÇÑ´Ù. µû¶ó¼­ ¸¸¾à °³³äÀûÀ¸·Î °£´ÜÇÑ ÇÔ¼öÀÇ °æ¿ì¿¡´Â (ÀÌ ÇÔ¼ö´Â ÇϳªÀÇ ±ä (ÇÏÁö¸¸ ´Ü¼øÇÑ) case ¹®À» °¡Áö¸ç, °¢ case ¿¡ µû¶ó ªÀº ÀÛ¾÷À» ¼öÇàÇÑ´Ù°í °¡Á¤ÇÑ´Ù) ±æ°Ô ÀÛ¼ºÇÏ´Â °ÍÀÌ Çã¿ëµÈ´Ù.

ÇÏÁö¸¸ º¹ÀâÇÑ ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â °æ¿ì¿¡ ÀÖ¾î, º¸ÅëÀÇ (less-than-gifted) °íµîÇб³ 1Çгâ»ýÀÌ ÀÌ ÇÔ¼ö°¡ ¹«¾ùÀ» ÇÏ´Â °ÍÀÎÁö ÀÌÇØÇÏ°í Èûµé °ÍÀ̶ó°í »ý°¢µÈ´Ù¸é º¸´Ù ¾ö°ÝÈ÷ ±âº» ±ÔÄ¢À» µû¶ó¾ß ÇÑ´Ù. ÃæºÐÇÑ ¼³¸íÀÌ µÉ ¸¸ÇÑ À̸§À» °¡Áö´Â º¸Á¶ ÇÔ¼ö¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ. (¸¸¾à ÀÌ ÇÔ¼öÀÇ ¼º´ÉÀÌ Áß¿äÇÑ ¿µÇâÀ» ¹ÌÄ£´Ù¸é ÄÄÆÄÀÏ·¯¿¡°Ô À̸¦ in-line ½ÃÅ°µµ·Ï ¿äûÇÏÀÚ. ¾Æ¸¶µµ ¿©·¯ºÐÀÌ ÇÏ´ø °Íº¸´Ù ´õ ³ªÀº °á°ú¸¦ °¡Á®¿Ã °ÍÀÌ´Ù.)

ÇÔ¼öÀÇ (º¹Àâµµ¸¦ ÃøÁ¤ÇÏ´Â) ¶Ç ´Ù¸¥ ôµµ´Â Áö¿ª º¯¼öÀÇ °³¼öÀÌ´Ù. Áö¿ª º¯¼öÀÇ ¼ö´Â 5~10 °³¸¦ ³Ñ¾î¼­´Â ¾È µÇ¸ç, ±×·¸Áö ¾Ê´Ù¸é ÀÌ¹Ì À߸øµÈ °ÍÀÌ´Ù. ÇÔ¼ö¸¦ ´Ù½Ã »ý°¢Çغ¸°í ´õ ÀÛÀº ºÎºÐÀ¸·Î ³ª´©µµ·Ï ÇÏÀÚ. »ç¶÷ÀÇ ³ú´Â ÀϹÝÀûÀ¸·Î 7 °¡Áö ´Ù¸¥ »ý°¢Àº ½±°Ô ±â¾ïÇÒ ¼ö ÀÖÁö¸¸, ±× ÀÌ»óÀÌ µÇ¸é È¥¶õ½º·¯¿ö Áø´Ù. ¾Æ¸¶µµ ¿©·¯ºÐÀº ÀÚ½ÅÀÌ ¶È¶ÈÇÏÁö ¾Ê´Ù´Â °ÍÀ» ¾Ë°í ÀÖ°ÚÁö¸¸, 2ÁÖ Àü¿¡ Çß´ø ÀÏÀ» ÀÌÇØÇÏ°í ½Í¾îÇÒ °ÍÀÌ´Ù.

¼Ò½º ÆÄÀÏ¿¡¼­, °¢ ÇÔ¼öµéÀ» ÇϳªÀÇ ºó ÁÙÀ» ÀÌ¿ëÇØ ±¸ºÐÇØ µÎÀÚ. ¸¸¾à ÇÔ¼ö°¡ export µÈ´Ù¸é, ÇÔ¼öÀÇ ´Ý´Â Áß°ýÈ£ ¹Ù·Î ¾Æ·¡¿¡ EXPORT* ¸ÅÅ©·Î¸¦ ³Ö¾îµÎµµ·Ï ÇÑ´Ù. ¿¹¸¦ µé¸é:

int system_is_up(void)
{
        return system_state == SYSTEM_RUNNING;
}
EXPORT_SYMBOL(system_is_up);

ÇÔ¼ö ¿øÇü¿¡¼­ ¸Å°³ º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔ°ú ÇÔ²² º¯¼ö À̸§À» Æ÷ÇÔ½ÃŲ´Ù. ºñ·Ï C ¾ð¾î¿¡¼­´Â À̸¦ ²À »ç¿ëÇÏÁö ¾Ê¾Æµµ µÇÁö¸¸, ¸®´ª½º¿¡¼­´Â Äڵ带 Àд »ç¶÷¿¡°Ô º¸´Ù Áß¿äÇÑ Á¤º¸¸¦ Á¦°øÇϱâ À§Çؼ­ À̸¦ »ç¿ëÇÑ´Ù.


7. ´ÜÀÏÈ­µÈ ÇÔ¼ö Á¾·á


ºñ·Ï ¾î¶² »ç¶÷µéÀº »ç¿ëÇÏÁö ¾ÊÁö¸¸, goto ¹®°ú µ¿ÀÏÇÑ ¹®ÀåÀº ÄÄÆÄÀÏ·¯¿¡¼­ ¹«Á¶°Ç Á¡ÇÁ ¸í·ÉÀÇ ÇüÅ·ΠÀÚÁÖ »ç¿ëµÈ´Ù.

goto ¹®Àº ÇÔ¼ö°¡ ¿©·¯ À§Ä¡¿¡¼­ Á¾·áµÇ°í, ¸î °¡Áö °øÅëÀûÀÎ Á¤¸®(cleanup) ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.

³í¸®ÀûÀ¸·Î´Â:

  • ¹«Á¶°Ç Á¡ÇÁ ¸í·ÉÀº ÀÌÇØÇÏ°í µû¶ó°¡±â ½±´Ù
  • ÁßøµÈ ÀÛ¾÷ÀÌ °¨¼ÒµÈ´Ù
  • ÇÔ¼ö º¯°æ ½Ã °³º°ÀûÀÎ Á¾·á ÁöÁ¡¿¡ ´ëÇÑ °»½ÅÀ» ÇÏÁö ¾Ê¾Æ »ý±æ ¼ö ÀÖ´Â ¿¡·¯¸¦ ¹æÁöÇÑ´Ù
  • Áߺ¹µÈ Äڵ带 ÃÖÀûÈ­ ÇØ¾ß ÇÏ´Â ÄÄÆÄÀÏ·¯ÀÇ ÀÛ¾÷À» ÁÙ¿©ÁØ´Ù

int fun(int a)
{
        int result = 0;
        char *buffer = kmalloc(SIZE);


        if (buffer == NULL)
                return -ENOMEM;


        if (condition1) {
                while (loop1) {
                        ...
                }
                result = 1;
                goto out;
        }
        ...
out:
        kfree(buffer);
        return buffer;
}


8. ÁÖ¼®´Þ±â


ÁÖ¼®Àº ÁÁÁö¸¸, °úµµÇÑ ÁÖ¼®¿¡ ÀÇÇÑ ¹®Á¦µµ ÀÖÀ» ¼ö ÀÖ´Ù. Àý´ë·Î ÁÖ¼® ³»¿¡¼­ Äڵ尡 ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ ¼³¸íÇÏÁö ¾Êµµ·Ï ÇÏÀÚ. Äڵ尡 ÇÏ´Â ÀÏÀ» ¸íÈ®È÷ ³ªÅ¸³¾ ¼ö ÀÖµµ·Ï ÀÛ¼ºÇÏ´Â °ÍÀÌ ÈξÀ ÁÁÀ¸¸ç, Àß ¸ø ÀÛ¼ºµÈ Äڵ带 ¼³¸íÇÏ´Â °ÍÀº ½Ã°£ ³¶ºñÀÌ´Ù.

ÀϹÝÀûÀ¸·Î ÁÖ¼®¿¡¼­´Â Äڵ尡 ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö°¡ ¾Æ´Ñ ¹«¾ùÀ» ÇÏ´Â Áö¸¦ ¼³¸íÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ¶ÇÇÑ ÇÔ¼ö ³»ºÎ¿¡ ÁÖ¼®À» ´ÞÁö ¾Êµµ·Ï ÇÏÀÚ. ¸¸¾à ÇÔ¼ö°¡ ³Ê¹« º¹ÀâÇؼ­ º°µµÀÇ ÁÖ¼®À» ºÎºÐÀûÀ¸·Î ´Þ°í ½Í´Ù¸é, Àá½Ã 6ÀåÀ¸·Î µ¹¾Æ°¡¼­ ´Ù½Ã ÇÑ ¹ø Àо±â ¹Ù¶õ´Ù. ÇÔ¼öÀÇ ÀϺκп¡¼­ ¶È¶ÈÇÑ (ȤÀº ¸ÛûÇÑ) ÀÏÀ» ¼öÇàÇÒ ¶§ ÀÌ¿¡ ´ëÇÑ ÂªÀº ¸Þ¸ð³ª °æ°í ¹®±¸¸¦ Ãß°¡ÇÏ´Â °ÍÀº °¡´ÉÇÏÁö¸¸, ³Ê¹« ¸¹¾Æ ÁöÁö ¾Êµµ·Ï ÁÖÀÇÇÑ´Ù. ´ë½Å ÁÖ¼®À» ÇÔ¼öÀÇ ½ÃÀÛ ºÎºÐ¿¡ ´Þ°í, ÀÌ Äڵ尡 ¹«¾ùÀ» ÇÏ´ÂÁö ±×¸®°í °¡´ÉÇÏ´Ù¸é ¿Ö ÇÏ´ÂÁö¿¡ ´ëÇÑ ³»¿ëÀ» ¼³¸íÇϵµ·Ï ÇÑ´Ù.

Ä¿³Î API ÇÔ¼ö¿¡ ´ëÇÑ ÁÖ¼®À» ´Þ ¶§´Â kernel-doc Çü½ÄÀ» µû¸£±â ¹Ù¶õ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº Documentation/kernel-doc-nano.txt ¿Í scripts/kernel-doc ÆÄÀÏÀ» Âü°íÇÏÀÚ.

¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â ÁÖ¼®Àº C89 Çü½ÄÀÎ "/* ... */" ½ºÅ¸ÀÏÀÌ´Ù. C99 Çü½ÄÀÇ "// ..." ÁÖ¼®À» »ç¿ëÇÏÁö ¸»ÀÚ.

±ä (¿©·¯ ÁÙ¿¡ °ÉÄ£) ÁÖ¼®Àº ÁÖ·Î ´ÙÀ½°ú °°Àº ÇüÅ°¡ µÈ´Ù:

/*
 * This is the prefered style for multi-line
 * comments in the Linux kernel source code.
 * Please use it consistently.
 *
 * Description:  A column of asterisks on the left side,
 * with beginning and ending almost-blank lines.
 */

µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÁÖ¼®À» (±âº» ŸÀÔÀÎÁö ÆÄ»ý ŸÀÔÀÎÁö) ´Ù´Â °Íµµ Áß¿äÇÏ´Ù. À̸¦ À§Çؼ­´Â ÇÑ ÁÙ¿¡ ÇϳªÀÇ µ¥ÀÌÅÍ ¸¸À» ¼±¾ðÇϵµ·Ï ÇÑ´Ù (Äĸ¶¸¦ ÀÌ¿ëÇÏ¿© ¿©·¯ µ¥ÀÌÅ͸¦ ÇÑ ÁÙ¿¡ ¼±¾ðÇÏÁö ¾Êµµ·Ï ÇÏÀÚ.) ±×·¯¸é °¢ Ç׸ñÀ» À§ÇÑ ÂªÀº ÁÖ¼®À» (µ¥ÀÌÅÍ°¡ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö) ´Þ ¼ö ÀÖ´Â °ø°£À» È®º¸ÇÒ ¼ö ÀÖ´Ù.


9. ½ºÅ¸ÀÏÀ» ¸ÁÃĹö¸° °æ¿ì


±¦Âú´Ù. ´Ùµé ±×·±´Ù. ¾Æ¸¶µµ ¿©·¯ºÐÀº ¿À·¡ÀüºÎÅÍ À¯´Ð½º¸¦ »ç¿ëÇØ ¿Ô´ø »ç¶÷µéÀÌ "GNU À̸ƽº(emacs)" ´Â ÀÚµ¿À¸·Î C ¼Ò½º ÆÄÀÏÀÇ Çü½ÄÀ» ¸ÂÃçÁØ´Ù°í ¾ê±âÇß´ø °ÍÀ» µé¾îºÃÀ» °ÍÀÌ´Ù. ±×·¸´Ù, À̸ƽº´Â ÀÌ·¯ÇÑ ÀÛ¾÷À» ÇØ ÁØ´Ù. ÇÏÁö¸¸ À̸ƽºÀÇ ±âº» ¼³Á¤Àº »ý°¢Çß´ø °Í°ú´Â ´Ù¸£°Ô µ¿ÀÛÇÒ °ÍÀÌ´Ù (»ç½Ç, ÀÌ°ÍÀº ¹«ÀÛÀ§ ŸÀÌÇκ¸´Ù ³ª»Ú´Ù - ¹«¼öÈ÷ ¸¹Àº ¿ø¼þÀ̵éÀÌ À̸ƽº¸¦ ÀÌ¿ëÇØ Å¸ÀÌÇÎÇÑ´Ù°í Çصµ Àý´ë·Î ÁÁÀº ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö´Â ¾ø´Ù.)

µû¶ó¼­ ¿©·¯ºÐÀº À̸ƽº¸¦ »ç¿ëÇÏÁö ¾Ê°Å³ª, ¿Ã¹Ù¸¥ ¼³Á¤À» »ç¿ëÇϵµ·Ï º¯°æÇÒ ¼ö ÀÖ´Ù. ÈÄÀÚ¸¦ ¼±ÅÃÇÑ´Ù¸é ´ÙÀ½ ³»¿ëÀ» ¿©·¯ºÐÀÇ .emacs ÆÄÀÏ¿¡ ÀÔ·ÂÇϵµ·Ï ÇÏÀÚ:

(defun linux-c-mode ()
  "C mode with adjusted defaults for use with the Linux kernel."
  (interactive)
  (c-mode)
  (c-set-style "K&R")
  (setq tab-width 8)
  (setq indent-tabs-mode t)
  (setq c-basic-offset 8))

ÀÌ°ÍÀº M-x linux-c-mode ¸í·ÉÀ» Á¤ÀÇÇÒ °ÍÀÌ´Ù. ¾î¶² ¸ðµâÀ» ÇØÅ·ÇÒ ¶§, ÆÄÀÏÀÇ Ã¹ µÎ ÁÙ ³»ÀÇ ¾îµò°¡¿¡ -*- linux-c -*- ¶ó´Â ¹®ÀÚ¿­À» ³Ö¾îµÎ¸é ÀÌ ¸ðµå°¡ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. ȤÀº ´ÙÀ½ ³»¿ëÀ» .emacs ÆÄÀÏ¿¡ ³Ö¾îµÎ¸é /usr/src/linux ¾Æ·¡ÀÇ ¼Ò½º ÆÄÀϵéÀ» ÆíÁýÇÒ ¶§ ÀÚµ¿À¸·Î linux-c-mode °¡ È£ÃâµÉ °ÍÀÌ´Ù.

(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode)
                        auto-mode-alist))

ÇÏÁö¸¸ À̸ƽº¸¦ ÅëÇØ ¿Ã¹Ù¸¥ ¼³Á¤À» Çϵµ·Ï ÇÏ´Â ÀÏ¿¡ ½ÇÆÐÇß´õ¶óµµ, ¸ðµç °ÍÀÌ ³¡³­ °ÍÀº ¾Æ´Ï´Ù: ÀÌ ¶§´Â "indent" ¸¦ ÀÌ¿ëÇØ º¸ÀÚ.

ÀÚ ´Ù½Ã, GNU Àε§Æ®(indent)´Â GNU À̸ƽº°¡ °¡Áø °Í°ú µ¿ÀÏÇÑ ¸ÛûÇÑ ¼³Á¤µéÀ» °¡Áö°í ÀÖÀ¸¸ç, µû¶ó¼­ ¿©·¯ºÐÀº À̸¦ ¸í·ÉÇà ¿É¼ÇÀ¸·Î ³Ñ°ÜÁà¾ß ÇÑ´Ù. ÇÏÁö¸¸ ±×·¸°Ô ³ª»Û °Í ¸¸Àº ¾Æ´Ï´Ù. Àε§Æ®¸¦ ÀÛ¼ºÇÑ »ç¶÷µéµµ K&RÀÇ ±ÇÀ§¸¦ ÀÎÁöÇÏ°í Àֱ⠶§¹®¿¡ (GNU Ãø »ç¶÷µéÀÌ ³ª»Ú´Ù´Â °ÍÀÌ ¾Æ´Ï´Ù, ±×µéÀº ´ÜÁö ÀÌ ¹®Á¦¿¡ ´ëÇØ ¿ÏÀüÈ÷ Àß ¸ø ÆÇ´ÜÇÏ°í ÀÖ´Â °Í »ÓÀÌ´Ù) ´ÜÁö "-kr -i8" À̶ó´Â ¿É¼Ç (ÀÌ°ÍÀº "K&R ½ºÅ¸ÀÏ¿¡ 8 ±ÛÀÚ µé¿©¾²±â"¸¦ ÀǹÌÇÑ´Ù) ¸¸À» ÀÌ¿ëÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. ¾Æ´Ï¸é ÃֽŠ½ºÅ¸ÀÏ·Î µé¿©¾²±â¸¦ »ç¿ëÇÏ´Â 'scripts/Lindent" ¸¦ »ç¿ëÇÏÀÚ.

Àε§Æ®´Â ¸¹Àº ¿É¼ÇÀ» °¡Áö°í ÀÖÀ¸¸ç, ƯÈ÷³ª ÁÖ¼®ÀÇ Çü½ÄÀ» º¯°æÇÏ°í ½ÍÀº °æ¿ì¶ó¸é man ÆäÀÌÁö¸¦ Àо±â ¹Ù¶õ´Ù. ÇÏÁö¸¸ ±â¾ïÇØ¾ß ÇÒ °ÍÀº Àε§Æ®´Â Àß ¸ø ÀÛ¼ºµÈ ÇÁ·Î±×·¥À» ¼öÁ¤ÇØ ÁÖÁö´Â ¾Ê´Â´Ù´Â °ÍÀÌ´Ù.


10. Kconfig ¼³Á¤ ÆÄÀÏ


¼Ò½º Æ®¸® ³»ÀÇ ¸ðµç Kconfig* ¼³Á¤ ÆÄÀϵ鿡¼­ »ç¿ëµÇ´Â µé¿©¾²±â ±ÔÄ¢Àº ¾à°£ ´Ù¸£´Ù. "config" Á¤ÀÇ ¾Æ·¡¿¡ ÀÖ´Â ÁÙµéÀº ÇϳªÀÇ ÅÇÀ¸·Î µé¿©¾²°í, ÀÌ¿¡ ´ëÇÑ µµ¿ò¸»Àº °Å±â¿¡ µÎ °³ÀÇ °ø¹é ¹®ÀÚ°¡ ´õ ºÙ´Â´Ù. ¿¹¸¦ µé¸é ¾Æ·¡¿Í °°´Ù:

config AUDIT
        bool "Auditing support"
        depends on NET
        help
          Enable auditing infrastructure that can be used with another
          kernel subsystem, such as SELinux (which requires this for
          logging of avc messages output). Does not do system-call
          auditing without CONFIG_AUDITSYSCALL.

¾ÆÁ÷ ºÒ¾ÈÁ¤ÇÏ´Ù°í »ý°¢µÇ´Â ±â´ÉµéÀº "EXPERIMENTAL" ¿¡ ÀÇÁ¸Çϵµ·Ï Á¤ÀÇÇØ¾ß ÇÑ´Ù:

config SLUB
        depends on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT
        bool "SLUB (Unqueued Allocator)"
        ...

ÇÏÁö¸¸ (¾î¶² ÆÄÀÏ ½Ã½ºÅÛ¿¡ ´ëÇÑ ¾²±â Áö¿ø°ú °°Àº) ¸Å¿ì À§ÇèÇÑ ±â´ÉµéÀº ÇÁ·ÒÇÁÆ® ¹®ÀÚ¿­ ³»¿¡ È®½ÇÈ÷ °æ°íÇØ¾ß ÇÑ´Ù:

config ADFS_FS_RW
        bool "ADFS write support (DANGEROUS)"
        depends on ADFS_FS
        ...

¼³Á¤ ÆÄÀÏ¿¡ ´ëÇÑ ¿ÏÀüÇÑ ¹®¼­´Â Documentation/kbuild/kconfig-lanaguae.txt ÆÄÀÏÀ» º¸±â ¹Ù¶õ´Ù.

11. ÀÚ·á ±¸Á¶


ÀÚ½ÅÀÌ »ý¼ºµÇ°í ¼Ò¸êµÇ´Â ´ÜÀÏ ¾²·¹µå ȯ°æÀÇ ¿ÜºÎ¿¡¼­µµ Á¢±ÙÇÒ ¼ö ÀÖ´Â ÀÚ·á ±¸Á¶´Â ¾ðÁ¦³ª ÂüÁ¶ Ƚ¼ö¸¦ °ü¸®ÇØ¾ß ÇÑ´Ù. Ä¿³Î ³»¿¡´Â °¡ºñÁö Ä÷º¼ÇÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸ç (Ä¿³Î ¿ÜºÎÀÇ °¡ºñÁö Ä÷º¼ÇÀº ´À¸®°í È¿À²ÀûÀÌÁö ¾Ê´Ù) µû¶ó¼­ ¿©·¯ºÐÀº ¹Ýµå½Ã ÂüÁ¶ Ƚ¼ö¸¦ ½º½º·Î °ü¸®ÇØ¾ß ÇÑ´Ù.

ÂüÁ¶ Ƚ¼ö¸¦ °ü¸®ÇÏ¸é ¶ôÅ·(locking)À» »ç¿ëÇÏÁö ¾Ê°í ¿©·¯ »ç¿ëÀÚ°¡ ÇØ´ç ÀÚ·á ±¸Á¶¸¦ µ¿½Ã¿¡ ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ¸ç, ´©±º°¡°¡ Àá½Ã sleep µÇ¾ú°Å³ª ´Ù¸¥ ÀÛ¾÷À» ¼öÇàÇÏ°í ¿Â °æ¿ì¿¡µµ ÇØ´ç ÀÚ·á ±¸Á¶°¡ »ç¶óÁ® ¹ö¸± °ÆÁ¤Àº ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

¶ôÅ·Àº ÂüÁ¶ Ƚ¼ö °ü¸®¸¦ ´ëüÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù¶ó´Â »ç½Ç¿¡ ÁÖÀÇÇÏÀÚ. ¶ôÅ·Àº ÀÚ·á ±¸Á¶¸¦ ÀÏ°ü¼ºÀÖ°Ô °ü¸®Çϱâ À§ÇÑ ±â¹ýÀÌ°í, ÂüÁ¶ Ƚ¼ö °ü¸®´Â ¸Þ¸ð¸® °ü¸®¿¡ ´ëÇÑ ±â¹ýÀÌ´Ù. º¸ÅëÀº ÀÌ µÎ °¡Áö°¡ ¸ðµÎ ÇÊ¿äÇϸç, ¼­·Î È¥µ¿µÇÁö ¾Ê´Â´Ù.

»ç½Ç, ¸¹Àº ÀÚ·á ±¸Á¶´Â ¼­·Î ´Ù¸¥ "Ŭ·¡½º"ÀÇ »ç¿ëÀÚµéÀÌ ÀÖ´Â °æ¿ì µÎ ´Ü°èÀÇ ÂüÁ¶ Ƚ¼ö¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Ù. ÇÏÀ§ Ŭ·¡½º ÂüÁ¶ Ƚ¼ö´Â ÇÏÀ§ Ŭ·¡½º »ç¿ëÀÚµéÀÇ ¼ö¸¦ À¯ÁöÇϸç, ÇÏÀ§ Ŭ·¡½º »ç¿ëÀÚ ¼ö°¡ 0 ÀÌ µÇ¸é Àü¿ª ÂüÁ¶ Ƚ¼ö¸¦ Çϳª °¨¼Ò½ÃŲ´Ù.

ÀÌ·¯ÇÑ "´Ù ´Ü°è ÂüÁ¶ Ƚ¼ö °ü¸®"´Â ¸Þ¸ð¸® °ü¸® ("struct mm_struct": mm_users ¿Í mm_count) ¹× ÆÄÀÏ ½Ã½ºÅÛ ÄÚµå ("struct super_block": s_count ¿Í s_active) ¿¡¼­ ã¾Æº¼ ¼ö ÀÖ´Ù.

±â¾ïÇÏÀÚ: ¸¸¾à ´Ù¸¥ ¾²·¹µå°¡ ¿©·¯ºÐÀÇ ÀÚ·á ±¸Á¶¸¦ ãÀ» ¼ö ÀÖ°í, ¿©·¯ºÐÀÌ ÇØ´ç ÀÚ·á ±¸Á¶¿¡ ´ëÇÑ ÂüÁ¶ Ƚ¼ö¸¦ °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é, °ÅÀÇ ´ëºÎºÐÀº ¹ö±×¸¦ °¡Áö°í ÀÖ´Â °ÍÀÌ´Ù.

12. ¸ÅÅ©·Î, ¿­°ÅÇü, RTL


»ó¼ö¸¦ Á¤ÀÇÇÏ´Â ¸ÅÅ©·Î¿Í ¿­°ÅÇü ³»ÀÇ ·¹À̺íµéÀº ´ë¹®ÀڷΠǥ±âÇÑ´Ù.

#define CONSTANT 0x12345

¿©·¯ °³ÀÇ °ü·ÃµÈ »ó¼ö¸¦ Á¤ÀÇÇÒ ¶§´Â ¿­°ÅÇüÀ» ¾²´Â °ÍÀÌ ÁÁ´Ù.

¸ÅÅ©·ÎÀÇ À̸§Àº ´ë¹®ÀڷΠǥ±âÇÏ´Â °ÍÀÌ ¿øÄ¢ÀÌÁö¸¸, ÇÔ¼ö¸¦ Èä³»³½ ¸ÅÅ©·ÎÀÇ À̸§¿¡´Â ¼Ò¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÀϹÝÀûÀ¸·Î, ¸ÅÅ©·Î·Î ÇÔ¼ö¸¦ Èä³»³»´Â °Í º¸´Ù´Â ÀζóÀÎ(inline) ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.

¿©·¯ ¹®ÀåÀ¸·Î ÀÌ·ç¾îÁø ¸ÅÅ©·Î´Â do-while ºí·°À¸·Î °¨½Î¾ß ÇÑ´Ù:

#define macrofun(a, b, c)                       \
        do {                                    \
                if (a == 5)                     \
                        do_this(b, c);          \
        } while(0)

¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â °æ¿ì ´ÙÀ½°ú °°Àº °æ¿ì¸¦ Á¶½ÉÇØ¾ß ÇÑ´Ù:

12.1. Á¦¾î È帧¿¡ ¿µÇâÀ» ÁÖ´Â ¸ÅÅ©·Î


#define macrofun(a, b, c)                       \
        do {                                    \
                if (a == 5)                     \
                        return -EBUGGERED;      \
        } while(0)

À§¿Í °°Àº °æ¿ì´Â ¸Å¿ì ÁÁÁö ¾Ê´Ù. ÀÌ°ÍÀº ÇÔ¼öó·³ º¸ÀÌÁö¸¸ È£ÃâÇÏ´Â ÇÔ¼ö¸¦ Á¾·á½ÃÄÑ ¹ö¸°´Ù. Äڵ带 Àд »ç¶÷ÀÇ ±¸¹® ºÐ¼®ÀÇ È帧À» ±úÁö ¸¶¶ó.

12.2. Ưº°ÇÑ À̸§À» °¡Áö´Â Áö¿ª º¯¼ö¿¡ ÀÇÁ¸ÇÏ´Â ¸ÅÅ©·Î


#define FOO(val)  bar(index, val)

À§ÀÇ ¸ÅÅ©·Î´Â ±¦Âú¾Æ º¸ÀÌÁö¸¸, Äڵ带 Àд »ç¶÷¿¡°Ô Å« È¥¶õÀ» ÁÙ ¼ö ÀÖÀ¸¸ç °ÑÀ¸·Î º¸±â¿¡´Â ¹«°üÇÑ ³»¿ëÀ» º¯°æÇßÀ» ¶§¿¡µµ ÇÁ·Î±×·¥ÀÌ µ¿ÀÛÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù.


12.3. ¸Å°³ º¯¼ö¸¦ °¡Áö´Â ¸ÅÅ©·Î¸¦ Áº¯°ª(l-value)À¸·Î »ç¿ë


FOO(x) = y

À§ÀÇ ÄÚµå´Â ¸¸¾à ´©±º°¡°¡ FOO ¸¦ ÀζóÀÎ ÇÔ¼ö·Î ¹Ù²Û´Ù¸é ¹®Á¦°¡ µÉ °ÍÀÌ´Ù.


12.4. ¿ì¼± ¼øÀ§¸¦ °í·ÁÇÏÁö ¾ÊÀº ¸ÅÅ©·Î


½Ä(expression)À» »ç¿ëÇؼ­ »ó¼ö¸¦ Á¤ÀÇÇÏ´Â ¸ÅÅ©·Î´Â ¹Ýµå½Ã ÇØ´ç ½ÄÀ» °ýÈ£·Î °¨½Î¾ß ÇÑ´Ù. ¸Å°³ º¯¼ö¸¦ ÀÌ¿ëÇÏ´Â ¸ÅÅ©·Î¿¡¼­µµ ÀÌ¿Í °°Àº ¹®Á¦¿¡ ½Å°æ½á¾ß ÇÑ´Ù.

#define CONSTANT  0x4000
#define CONSTEXP  (CONSTANT | 3)

cpp ¼³¸í¼­´Â ¸ÅÅ©·Î¿¡ ´ëÇؼ­ ÀÚ¼¼È÷ ´Ù·ç°í ÀÖ´Ù. gcc ³»ºÎ ¼³¸í¼­¿¡¼­´Â Ä¿³Î¿¡¼­ ¾î¼Àºí¸® ¾ð¾î¿Í ÀÚÁÖ »ç¿ëµÇ´Â RTL¿¡ ´ëÇؼ­µµ ´Ù·ç°í ÀÖ´Ù.

13. Ä¿³Î ¸Þ½ÃÁö Ãâ·ÂÇϱâ


Ä¿³Î °³¹ßÀÚµéÀº ÅؽºÆ®·Î º¸±æ ÁÁ¾ÆÇÑ´Ù. ÁÁÀº ÀλóÀ» ½É¾îÁÖ·Á¸é Ä¿³Î ¸Þ½ÃÁöÀÇ Ã¶ÀÚ¿¡ ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÑ´Ù. "dont" ¿Í °°Àº ¾à¾î(crippled word)¸¦ »ç¿ëÇÏÁö ¸»°í, "do not" ȤÀº "don't" ¿Í °°Àº Ç¥ÇöÀ» »ç¿ëÇÏÀÚ. ¸Þ½ÃÁö´Â °£°áÇÏ°í ¸í·áÇÏ°í ¸ðÈ£ÇÏÁö ¾Êµµ·Ï ÀÛ¼ºÇÑ´Ù.

Ä¿³Î ¸Þ½ÃÁö´Â ¸¶Ä§Ç¥·Î ³¡³ªÁö ¾Ê¾Æ¾ß ÇÑ´Ù.

°ýÈ£ ¾È¿¡ ¼ýÀÚ¸¦ Ãâ·ÂÇÏ´Â °ÍÀº (%d) ¾Æ¹«·± °¡Ä¡°¡ ¾øÀ¸¸ç ÀÌ·¯ÇÑ Ç¥ÇöÀº »ï°¡Çϵµ·Ï ÇÏÀÚ. (FIXME!)

<linux/device.h> ÆÄÀÏ¿¡´Â µå¶óÀ̹ö ¸ðµ¨ Áø´ÜÀ» À§ÇÑ ¿©·¯ ¸ÅÅ©·ÎµéÀÌ ÀÖÀ¸¸ç, ¸Þ½ÃÁö°¡ ¿Ã¹Ù¸¥ ÀåÄ¡ ¹× µå¶óÀ̹ö¿Í ÀÏÄ¡ÇÏ´ÂÁö¿Í ÀûÀýÇÑ ¼öÁØÀ¸·Î Ç¥½ÃµÇ´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù. (¿¹¸¦ µé¾î, dev_err(), dev_warn(), dev_info() µî) ƯÁ¤ÇÑ ÀåÄ¡¿Í °ü·ÃÀÌ ¾ø´Â ¸Þ½ÃÁöµéÀº <linux/kernel.h> ÆÄÀÏ¿¡ Á¤ÀÇµÈ pr_debug() ¿Í pr_info() ¸¦ ÀÌ¿ëÇϵµ·Ï ÇÑ´Ù.

µð¹ö±ë ¸Þ½ÃÁö¸¦ Àß »ðÀÔÇÏ´Â °ÍÀº ²Ï³ª Èûµç ÀÛ¾÷ÀÌ µÉ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀÏ´Ü À̸¦ ¿Ï·áÇϸé, ÀÌÈÄ¿¡ ¹®Á¦°¡ ¹ß»ýÇßÀ» ¶§ Ä¿´Ù¶õ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¸Þ½ÃÁöµéÀº DEBUG ½Éº¼ÀÌ Á¤ÀǵÇÁö ¾ÊÀº °æ¿ì¿¡´Â (±âº»ÀûÀ¸·Î´Â Æ÷ÇÔµÇÁö ¾Ê´Â´Ù) ÄÄÆÄÀϵÇÁö ¾Ê¾Æ¾ß (compiled out) ÇÑ´Ù. ÀÌ´Â dev_dbg() ȤÀº pr_debug() µîÀ» ÀÌ¿ëÇÏ´Â °æ¿ì¿¡´Â ÀÚµ¿À¸·Î 󸮵ȴÙ. ¸¹Àº ¼­ºê ½Ã½ºÅÛ µéÀº -DDEBUG ¸¦ ÄÓ ¼ö ÀÖ´Â Kconfig ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù. ÀÌ¿Í °ü·ÃµÈ ±â´ÉÀ¸·Î VERBOSE_DEBUG ¸¦ »ç¿ëÇϸé DEBUG °¡ Á¤ÀÇµÈ °æ¿ì µð¹ö±ë ¸Þ½ÃÁö¿¡ dev_vdbg() ¸Þ½ÃÁö¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

14. ¸Þ¸ð¸® ÇÒ´ç


Ä¿³ÎÀº ´ÙÀ½°ú °°Àº ¹ü¿ë ¸Þ¸ð¸® ÇÒ´ç ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù:

kmalloc(), kzalloc(), kcalloc(), vmalloc()
ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â API ¹®¼­¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

±¸Á¶Ã¼ÀÇ Å©±â¸¦ Àü´ÞÇÏ´Â ±âº»ÀûÀÎ ¹æ½ÄÀº ´ÙÀ½°ú °°´Ù:

p = kmalloc(sizeof(*p), ...):
´Ù¸¥ ¹æ½ÄÀº ±¸Á¶Ã¼ÀÇ À̸§À» ¸ðµÎ Àû´Â °ÍÀε¥, ÀÌ´Â °¡µ¶¼ºÀ» ÇØÄ¥ »Ó¸¸ ¾Æ´Ï¶ó Æ÷ÀÎÅÍ º¯¼ö ŸÀÔÀÌ º¯°æµÇ¾úÁö¸¸ ¸Þ¸ð¸® ÇÒ´ç ÇÔ¼ö·Î ³Ñ°ÜÁö´Â Å©±â´Â º¯°æµÇÁö ¾ÊÀº °æ¿ì ÀáÀçÀûÀÎ ¹ö±×¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù.

void Æ÷ÀÎÅÍÀÎ ¹Ýȯ°ªÀ» ij½ºÆÃÇÏ´Â °ÍÀº ºÒÇÊ¿äÇÑ (redundant) ÀÛ¾÷ÀÌ´Ù. void Æ÷ÀÎÅ͸¦ ´Ù¸¥ Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î º¯È¯ÇÏ´Â °ÍÀº C ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼­ º¸ÀåÇÑ´Ù.

15. inline Áßµ¶


»ç¶÷µé »çÀÌ¿¡¼­´Â gccÀÇ "inline" ±â´ÉÀÌ ÇÁ·Î±×·¥À» "´õ ºü¸£°Ô ½ÇÇàÇ϶ó"¶ó´Â ¿É¼ÇÀÎ °ÍÀ¸·Î »ý°¢ÇÏ´Â À߸øµÈ ÀνÄÀÌ ÆÛÁ® ÀÖ´Â µí ÇÏ´Ù. inline ±â´ÉÀº (¿¹¸¦ µé¾î ¸ÅÅ©·Î¸¦ ´ëüÇÏ´Â ¼ö´Ü À¸·Î »ç¿ëµÇ´Â °æ¿ì, 12Àå ÂüÁ¶) ÀûÀýÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖÁö¸¸, ¸¹Àº °æ¿ì¿¡ ÀÖ¾î ±×·¸Áö ¾Ê´Ù.

inline ±â´ÉÀÇ ¹«ºÐº°ÇÑ »ç¿ëÀº Ä¿³ÎÀÇ Å©±â¸¦ Áõ°¡½ÃÅ°°í, ±×¿¡ µû¶ó (ÃÖ¾ÇÀÇ °æ¿ì) ½Ã½ºÅÛÀ» °ÅÀÇ ¸ØÃß°Ô ¸¸µé Á¤µµ·Î ´À·ÁÁö°Ô ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ´Â CPUÀÇ icache »ç¿ë·®ÀÌ Áõ°¡ÇÏ¿©, ´Ü¼øÈ÷ ½Ã½ºÅÛ¿¡ ÆäÀÌÁö ij½Ã¸¦ À§ÇÑ ¸Þ¸ð¸®°¡ ºÎÁ·ÇØ Áö±â ¶§¹®ÀÌ´Ù. »ý°¢ÇØ º¸ÀÚ. ÇÑ ¹øÀÇ ÆäÀÌÁö ij½Ã ¹Ì½º°¡ ¹ß»ýÇÏ¸é µð½ºÅ© Ž»öÀÌ ÀÌ·ç¾î Áö°í ÀÌ´Â ¾à 5ms Á¤µµÀÇ ½Ã°£À» ¼Ò¸ðÇÑ´Ù. ÀÌ 5ms ³»¿¡´Â ¸Å¿ì ¸¹Àº cpu »çÀÌŬÀÌ ÁøÇàµÉ ¼ö ÀÖ´Ù.

À̼ºÀûÀÎ ±ÔÄ¢Àº 4ÁÙ ÀÌ»óÀÇ Äڵ带 Æ÷ÇÔÇÏ´Â ÇÔ¼ö¿¡´Â inline Å°¿öµå¸¦ ¾²Áö ¾Ê´Â °ÍÀÌ´Ù. ÀÌ ±ÔÄ¢ÀÇ ¿¹¿Ü°¡ µÇ´Â °æ¿ìµéÀº ÇÔ¼öÀÇ ÀÎÀÚ°¡ ÄÄÆÄÀÏ ½Ã¿¡ »ó¼ö·Î ó¸®ÇÒ ¼ö ÀÖ´Â °æ¿ì³ª, ÀÌ·¯ÇÑ »ó¼öÈ­(constantness)ÀÇ °á°ú·Î ÇÔ¼öÀÇ ´ëºÎºÐÀÌ ÄÄÆÄÀÏ ½Ã¿¡ ÃÖÀûÈ­ µÉ °ÍÀ̶ó°í ¾Ë°í ÀÖ´Â °æ¿ìÀÌ´Ù. ÈÄÀÚÀÇ ÁÁÀº ¿¹·Î´Â kmalloc() ÀζóÀÎ ÇÔ¼ö¸¦ º¸±â ¹Ù¶õ´Ù.

¶§·Î »ç¶÷µéÀº static À¸·Î Á¤ÀÇµÇ°í ¿ÀÁ÷ ÇÑ ¹ø¸¸ È£ÃâµÇ´Â (µû¶ó¼­ °ø°£ÀûÀÎ ³¶ºñ°¡ ¾ø´Â) ÇÔ¼ö¿¡ inline Å°¿öµå¸¦ ½á¾ß ÇÑ´Ù°í ÁÖÀåÇϱ⵵ ÇÑ´Ù. ºñ·Ï ÀÌ·¯ÇÑ ÁÖÀåÀÌ ±â¼úÀûÀ¸·Î ¿Ç±ä ÇÏÁö¸¸, gcc´Â ÀÌ·¯ÇÑ °æ¿ì¿¡´Â Ưº°È÷ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ ÀÚµ¿À¸·Î À̸¦ inline È­ ½Ãų ¼ö ÀÖÀ¸¸ç, inlineÀ» »ç¿ëÇÏÁö ¾ÊÀ¸¸é ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ´Ù¸¥ ÇÔ¼ö°¡ »ý±â´Â °æ¿ì¿¡ gcc¿¡°Ô ¾î¶»°Ô ó¸®ÇØ¾ß ÇÒ Áö ÀáÀçÀûÀÎ ÈùÆ®¸¦ ÁÙ ¼ö ÀÖ´Â °ü¸®ÀûÀÎ ¹®Á¦µµ ÀÖ´Ù. (FIXME!)

16. ÇÔ¼öÀÇ ¹Ýȯ°ª°ú À̸§


ÇÔ¼ö´Â ¸Å¿ì ´Ù¾çÇÑ Á¾·ùÀÇ °ªµéÀ» ¹ÝȯÇÒ ¼ö ÀÖÀ¸¸ç, °¡Àå ÈçÇÑ °æ¿ì ÁßÀÇ Çϳª´Â ÇÔ¼ö°¡ ¼º°øÇß´ÂÁö ½ÇÆÐÇß´ÂÁö¸¦ ¾Ë¸®´Â °ªÀ» ¹ÝȯÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ °ªµéÀº ¿¡·¯ Äڵ带 ³ªÅ¸³»´Â Á¤¼öÇü (-Exxx = ½ÇÆÐ, 0 = ¼º°ø) À̳ª ¼º°ø ¿©ºÎ¸¦ ³ªÅ¸³»´Â Âü/°ÅÁþ (0 = ½ÇÆÐ, ±× ¿Ü = ¼º°ø) ÀÌ µÉ ¼ö ÀÖ´Ù.

ÀÌ·¯ÇÑ µÎ Á¾·ùÀÇ Ç¥ÇöÀ» ¼¯¾î¼­ »ç¿ëÇÏ´Â °ÍÀº ã±â ¾î·Á¿î ¹ö±×¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ´Â ±â¹ÝÀÌ µÈ´Ù. ¸¸¾à C ¾ð¾î¿¡ Á¤¼öÇü°ú Âü/°ÅÁþÀ» ¾ö°ÝÇÏ°Ô ±¸ºÐÇØ ÁÖ´Â ±â´ÉÀÌ µé¾î ÀÖ´Ù¸é, ÄÄÆÄÀÏ·¯°¡ ÀÌ·¯ÇÑ ½Ç¼ö¸¦ ã¾ÆÁÙ ¼ö ÀÖ°ÚÁö¸¸... ½Ç»óÀº ±×·¸Áö ¸øÇÏ´Ù. ÀÌ·¯ÇÑ ¹ö±×¸¦ ¹æÁöÇϱâ À§Çؼ­, Ç×»ó ´ÙÀ½°ú °°Àº °ü·Ê¸¦ µû¸£µµ·Ï ÇÏÀÚ:

    ¸¸¾à ÇÔ¼öÀÇ À̸§ÀÌ µ¿ÀÛÀ̳ª ¸í·ÉÀ» ³ªÅ¸³»¸é ¿¡·¯ ÄÚµå Á¤¼öÇüÀ» ¹ÝȯÇÏ°í,
    ¾î¶² »ç½ÇÀ» ¼­¼úÇÏ´Â °æ¿ì(predicate)ÀÌ¸é ¼º°ø ¿©ºÎ¸¦ ³ªÅ¸³»´Â Âü/°ÅÁþÀ» ¹ÝȯÇÑ´Ù.

¿¹¸¦ µé¾î, "add work"´Â ¸í·ÉÇüÀ̹ǷÎ, add_work() ÇÔ¼ö´Â ¼º°ø ½Ã¿¡ 0À», ½ÇÆÐ ½Ã¿¡´Â _EBUSY µîÀ» ¹ÝȯÇÑ´Ù. ¸¶Âù°¡Áö·Î, "PCI device present" ´Â ¼­¼úÇüÀ̹ǷΠpci_dev_present() ÇÔ¼ö´Â ¼º°ø ½Ã¿¡ (ÇØ´ç ÀåÄ¡¸¦ ãÀº °æ¿ì) 1À», ½ÇÆÐ ½Ã¿¡´Â 0À» ¹ÝȯÇÑ´Ù.

¿ÜºÎ·Î °ø°³µÈ (EXPORTed) ¸ðµç ÇÔ¼öµéÀº ¹Ýµå½Ã ÀÌ °ü·Ê¸¦ µû¶ó¾ß Çϸç, ´Ù¸¥ ¸ðµç °ø°³µÈ (public) Àü¿ª ÇÔ¼öµéµµ À̸¦ µû¶ó¾ß ÇÑ´Ù. ³»ºÎÀûÀÎ (static) ÇÔ¼öµéÀº ÀÌ °ü·Ê¸¦ µû¸¦ ÇÊ¿ä´Â ¾øÁö¸¸ À̸¦ µû¸£´Â °ÍÀÌ ÁÁ´Ù.

°è»êÀÌ ¼º°ø Çß´ÂÁö ¿©ºÎ¸¦ ¹ÝȯÇÏ´Â °ÍÀÌ ¾Æ´Ñ, ½ÇÁ¦ °è»ê °á°ú¸¦ ¹ÝȯÇÏ´Â ÇÔ¼öµéÀº ÀÌ ±ÔÄ¢ÀÇ Àû¿ë ´ë»óÀÌ ¾Æ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ ÇÔ¼öµéÀº Á¤»óÀûÀÎ °á°úÀÇ ¹üÀ§¸¦ ³Ñ¾î¼± °ªÀ» ¹ÝȯÇÏ¿© ½ÇÆи¦ ³ªÅ¸³½´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ ÀüÇüÀûÀÎ ¿¹·Î´Â Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ÇÔ¼öµéÀÌ ÇØ´çÇÑ´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµéÀº NULL ȤÀº ERR_PTR ¸ÞÄ¿´ÏÁòÀ» ÅëÇØ ½ÇÆи¦ ¾Ë¸°´Ù.

17. Ä¿³Î ¸ÅÅ©·Î¸¦ ´Ù½Ã ¹ß¸íÇÏÁö ¸»ÀÚ


/linux/kernel.h Çì´õ ÆÄÀÏÀº ¿©·¯ºÐÀÌ »ç¿ëÇØ¾ß ÇÒ ¿©·¯ ¸ÅÅ©·ÎµéÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù.

ÀÌ·¯ÇÑ ¸ÅÅ©·Î¿Í ºñ½ÁÇÑ °ÍµéÀ» Á÷Á¢ Á¤ÀÇÇÏÁö ¸»°í, À̵éÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¹è¿­ÀÇ ±æÀ̸¦ °è»êÇØ¾ß ÇÑ´Ù¸é ´ÙÀ½ ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

¸¶Âù°¡Áö·Î ¾î¶² ±¸Á¶Ã¼ ³»ÀÇ ¸â¹öÀÇ Å©±â¸¦ °è»êÇØ¾ß ÇÑ´Ù¸é ´ÙÀ½À» ÀÌ¿ëÇÏÀÚ.

#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))

¶ÇÇÑ ÇÊ¿äÇÑ °æ¿ì °­·ÂÇÑ Å¸ÀÔ °Ë»ç¸¦ ¼öÇàÇÏ´Â min(), max() ¸ÅÅ©·Îµµ Á¸ÀçÇÑ´Ù. Çì´õ ÆÄÀÏÀ» Àß »ìÆ캸°í ´Ù¸¥ ¾î¶² ¸ÅÅ©·ÎµéÀÌ Á¤ÀǵǾî ÀÖ´ÂÁö ¾Ë¾Æº¸°í, ÀÌ·¯ÇÑ ±â´É°ú ºñ½ÁÇÑ °ÍµéÀ» ¿©·¯ºÐÀÇ ÄÚµå ³»¿¡ ÀçÁ¤ÀÇÇÏÁö ¾Êµµ·Ï ÁÖÀÇÇÏÀÚ.

18. ÆíÁý±â ¸ðµå¶óÀÎ ¹× ¼³Á¤ Á¤º¸


¾î¶² ÆíÁý±âµéÀº ¼Ò½º ÆÄÀÏ ³»¿¡ Ưº°ÇÑ Ç¥½ÄÀ¸·Î ÁöÁ¤µÈ ¼³Á¤ Á¤º¸¸¦ Çؼ®ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î À̸ƽº(emacs)´Â ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµÈ ÁÙÀ» Çؼ®ÇÑ´Ù:

-*- mode: c -*-

ȤÀº ´ÙÀ½°ú °°Àº °Íµµ °¡´ÉÇÏ´Ù:

/*
Local Variables:
compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
End:
*/

vimÀº ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµÈ ÁÙÀ» Çؼ®ÇÑ´Ù:

/* vim:set sw=8 noet */

¼Ò½º ÆÄÀÏ ³»¿¡ ÀÌ·¯ÇÑ °ÍµéÀ» Æ÷ÇÔ½ÃÅ°Áö ¾Êµµ·Ï ÇÏÀÚ. »ç¶÷µéÀº °¢°¢ ÀڽŠ¸¸ÀÇ ÆíÁý±â ¼³Á¤À» °¡Áö°í ÀÖÀ¸¹Ç·Î, ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ ¼Ò½º ÆÄÀÏÀÌ À̸¦ ¹«½ÃÇؼ­´Â ¾È µÈ´Ù. ¿©±â¿¡´Â µé¿©¾²±â¿Í ¸ðµå ¼³Á¤¿¡ ´ëÇÑ Ç¥½Ãµµ ÇØ´çµÈ´Ù. ¾î¶² »ç¶÷µéÀº ÀڽŠ¸¸ÀÇ °íÀ¯ÇÑ ¸ðµå¸¦ »ç¿ëÇϰųª µé¿©¾²±â¸¦ ó¸®Çϱâ À§ÇÑ Æ¯º°ÇÑ ¹æ½Ä(magic method)À» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

19. ºÎ·Ï I: Âü°í ¹®Çå




ÃÖÁ¾ ¼öÁ¤ 2007-07-13.

ÀÌ ¹ø¿ªº»ÀÇ ÃֽŠ¹öÀüÀº http://namhyung.springnote.com/pages/858738 ¿¡¼­ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.


ID
Password
Join
Alimony and bribes will engage a large share of your wealth.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-05-22 11:03:52
Processing time 0.0014 sec