docbook_kernel_module_programing here
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼­

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!-- http://www.tldp.org/LDP/lkmpg/x277.html --> 
<articleinfo> 
    <title>¸®´ª½º Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö - 2.4</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>dreamyun@yahoo.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
    <revhistory> 
        <revision> 
            <revnumber>0.8</revnumber> 
            <date>2003³â 10¿ù 15ÀÏ 23½Ã</date> 
            <revremark>ÃÖÃÊ ¹®¼­ÀÛ¼º</revremark> 
        </revision> 
    </revhistory> 
</articleinfo> 
 
 
<!--                                                                 --> 
<!-- ¼½¼Ç ½ÃÀÛ                                                       --> 
<!--                                                                 --> 
<section> 
    <title>¼Ò°³</title> 
    <section> 
        <title>ÀÌ ¹®¼­¿¡ ´ëÇØ¼­</title> 
        <para> 
            ÀÌ ¹®¼­´Â <ulink url=http://www.tldp.org/LDP/lkmpg/index.html>The Linux Kernel Module Programming Guide</ulink>À» Âü°íÇßÀ¸¸ç,  
            ¸¹Àº ºÎºÐ ¿ø¹®À» ±×´ë·Î ¹ø¿ªÇÏ¿´´Ù. ±×·¯³ª º»¹®À» ½ÇÁ¦ Å×½ºÆ®  
            Çϸ鼭 ³»¿ëÀÌ ¹ÌÈíÇÑ ºÎºÐÀ» º¸¿ÏÇÏ¿´À¸¸ç, ¸î¸î Ʋ¸° ºÎºÐ¿¡ ´ëÇÑ  
            ¼öÁ¤µµ ÀÌ·ç¾îÁ³´Ù.  
        </para> 
    </section> 
    <section> 
        <title>Ä¿³Î ¸ðµâÀ̶õ ?</title>  
        <para> 
            Ä¿³Î ¸ðµâ¿¡ ´ëÇØ¼­ ÀÌÇØÇϰí ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§Çؼ­ ´ç¿¬È÷  
            ¿©·¯ºÐÀº C¾ð¾î¿Í ¸®´ª½º ½Ã½ºÅÛ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ Ç졒  
            ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ¹®¼­´Â ¸®´ª½º(À¯´Ð½º) ½Ã½ºÅÛ°ú C¿¡ ´ëÇÑ  
            ±âº» ÀÌÇØ¸¦ Çϰí ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÀÛ¼ºµÉ °ÍÀÌ´Ù.  
        </para> 
        <para> 
            Ä¿³Î ¸ðµâÀ̶õ Çʿ信 µû¶ó Ä¿³Î¿¡ ·ÎµåÇϰųª ¾ð·Îµå ÇÒ ¼ö ÀÖ´Â  
            ƯÁ¤ÇÑ ±â´ÉÀ» ¼öÇàÇÏ´Â ÄÚµå(ÇÁ·Î±×·¥)ÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¹Ç·Î½á  
            ½±°Ô Ä¿³ÎÀÇ ±â´ÉÀ» È®ÀåÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ¿î¿µÃ¼Á¦¸¦ ¸®ºÎÆÃ  
            ÇÏÁö ¾Ê°íµµ ¿øÇÏ´Â ±â´ÉÀ» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ¸¸µé ¼ö ÀÖ´Ù.   
        </para> 
        <para> 
            ¿¹¸¦ µé¾î¼­ ¾î¶² Çϵå¿þ¾î¸¦ Á¦¾îÇϱâ À§ÇÑ ¹®ÀÚ ÀåÄ¡(device drive)¸¦ 
            ÀÛ¼ºÇØ¾ß ÇÑ´Ù°í »ý°¢Çغ¸ÀÚ. ¸¸¾à ¸ðµâ±â´ÉÀ» Á¦°øÇÏÁö ¾Ê´Â  
            Ä¿³ÎÀ̶ó¸é Ä¿³ÎÀ» Á÷Á¢¼öÁ¤ÇÏ´Â ¹æ½ÄÀ» µ¿¿øÇؼ­ Ä¿³Î¿¡ ÇÊ¿äÇÑ  
            ±â´ÉÀ» Ãß°¡½ÃÄÑ¾ß ÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ ÀÚü°¡ ¾î·Á¿öÁö´Â °ÍÀº  
            ¹°·ÐÀÌ°í ±â´ÉÀ» Å×½ºÆ® Çϱâ À§Çؼ­´Â °è¼ÓÀûÀÎ ¸®ºÎÆÃ ÀÛ¾÷ÀÌ  
            ÇÊ¿äÇÏ°Ô µÇ¹Ç·Î °³¹ß±â°£ ¿ª½Ã ±ØÀûÀ¸·Î ´Ã¾î³¯ ¼ö ¹Û¿¡ ¾øÀ» °ÍÀÌ´Ù.  
            ¶ÇÇÑ Ä¿³Î¿¡ ÇÊ¿äÇÑ ±â´ÉÀÌ Ãß°¡µÉ ¶§¸¶´Ù Ä¿³Î¿¡ °è¼ÓÇØ¼­ Äڵ尡  
            Ãß°¡ µÊÀ¸·Î Ä¿³ÎÀÇ Å©±âµµ ¸Å¿ì Ä¿Áö°Ô µÉ°ÍÀÌ´Ù. »ç¿îµåÄ«µå¸¦  
            À§ÇÑ ±â´ÉÀ» Ãß°¡Çߴµ¥ ÇØ´ç »ç¿îµåÄ«µå¸¦ °¡ÁöÁö ¾Ê´Â À¯Àúµµ  
            ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·² °æ¿ì´Â ±×¾ß¸»·Î ¾µµ¥ ¾ø´Â  
            ÀÚ¿ø³¶ºñ°¡ µÇ´Â ¼ÀÀÌ´Ù.     
`            Ä¿³Î ¸ðµâ·Î½á ÀÛµ¿Çϵµ·Ï ¸¸µé¾ú´Ù¸é ¾µµ¥¾ø´Â ±â´ÉÀ» ÇÏ´Â ¸ðµâÀº  
            ¾ð·Îµå ½ÃŰ¸é ±×¸¸ÀÌ´Ù. 
        </para> 
        <para> 
            ÀÌ ¹®¼­´Â ¸®´ª½º <emphasis>Ä¿³Î 2.4</emphasis>¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù.  
        </para> 
    </section> 
</section> 
 
<section> 
    <title>Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹ÖÀÇ ±âº»</title> 
    <section> 
        <title>Ä¿³Î¿¡ ¸ðµâ ÀûÀç½Ã۱â</title> 
        <para> 
            ÇöÀç Ä¿³Î¿¡¼­ ÀÛµ¿ÁßÀÎ ¸ðµâÀÇ ¸ñ·ÏÀº <emphasis>lsmod</emphasis> 
            ¸í·ÉÀ» ÅëÇØ¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.  
            <screen> 
# lsmod 
Module                  Size  Used by    Tainted: P   
via82cxxx_audio        18304   1  (autoclean) 
uart401                 6560   0  (autoclean) [via82cxxx_audio] 
ac97_codec              9504   0  (autoclean) [via82cxxx_audio] 
sound                  59052   0  (autoclean) [via82cxxx_audio uart401] 
soundcore               4324   4  (autoclean) [via82cxxx_audio sound] 
autofs                 10948   0  (autoclean) (unused) 
ne2k-pci                5568   1  
8390                    6736   0  [ne2k-pci] 
ipchains               37704   0  
ide-scsi                8192   0  
scsi_mod               95848   1  [ide-scsi] 
ide-cd                 27360   0  (autoclean) 
cdrom                  28480   0  (autoclean) [ide-cd] 
usb-uhci               21764   0  (unused) 
usbcore                51744   1  [usb-uhci] 
ext3                   61568   4  
            </screen> 
            lsmod´Â /proc/modules ÆÄÀÏÀÇ ³»¿ëÀ» ±×´ë·Î Ãâ·ÂÇÑ´Ù.  
        </para> 
        <para> 
            ±×·³ Ä¿³ÎÀº ÀÌ·¯ÇÑ ¸ðµâÀ» ¾î¶»°Ô ã¾Æ¼­ ÀûÀç½ÃŰ´Â °É±î.  
            Ä¿³ÎÀÌ ¾î¶² ¸ðµâÀ» Æ÷ÇÔÇϰíÀÚ ÇÒ¶§ ÇØ´ç ¸ðµâÀÌ ¾ÆÁ÷ Ä¿³Î¿¡  
            ÀûÀçµÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸ðµâ µ¥¸ó(daemon)ÀÎ <emphasis>kmod</emphasis>°¡  
            <emphasis>modprobe</emphasis>¸¦ ½ÇÇà½ÃÄѼ­ ¸ðµâÀ» ÀоîµéÀÌ°Ô µÈ´Ù.  
            À̶§ modprobe´Â ´ÙÀ½Áß  
            ÇϳªÀÇ ¹æ¹ýÀ» ÀÌ¿ëÇØ¼­ Àоîµé¿©¾ßÇÒ ¸ðµâÀ» ã°Ô µÈ´Ù.   
            <itemizedlist> 
                <listitem> 
                    <para> 
                        softdog, ppp¿Í °°Àº ¸ðµâÀ̸§À» Á÷Á¢ ã´Â´Ù.  
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        char-major-10-30 °ú °°Àº ÀϹÝÀûÀÎ  
                        ½Äº°ÀÚ(generic identifier)¸¦ ÀÌ¿ëÇÑ´Ù.  
                    </para> 
                </listitem> 
            </itemizedlist> 
        </para> 
        <para> 
            ¸¸¾à modprobe°¡ ½Äº°ÀÚ¸¦ ÀÌ¿ëÇÒ °æ¿ì, ÇØ´ç ½Äº°ÀÚ¿¡ ´ëÇÑ ÁøÂ¥  
            ¸ðµâÀ̸§À» ¾Ë¾Æ¿Í¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ Á¤º¸´Â /etc/modules.conf¿¡  
            ÀúÀåµÇ¾î ÀÖ´Ù.  
            <screen> 
alias char-major-10-30 softdog 
            </screen> 
            º°Äª¸ñ·ÏÀ» È®ÀÎÇÔÀ¸·Î½á ½Äº°ÀÚ¸¦ À§Çؼ­ softdog.o¸ðµâÀ» ÀûÀç½ÃÄÑ¾ß  
            µÈ´Ù´Â Á¤º¸¸¦ ¾òÀ» ¼ö ÀְԵȴÙ. 
        </para> 
        <para> 
            ´ÙÀ½ modprobe´Â /lib/modules/version/module.depÆÄÀÏÀ» °Ë»çÇÑ´Ù.  
            ¿©±â¿¡´Â ÇØ´ç¸ðµâÀÌ ½ÇÇàµÇ±âÀ§ÇØ ÇÊ¿äÇÑ ´Ù¸¥ ¸ðµâµé Áï  
            ¸ðµâÀÇÁ¸¼º¿¡ °üÇÑ Á¤º¸µéÀÌ À־ softdog.o¸¦ ÀûÀçÇϱâ À§Çؼ­  
            ´Ù¸¥ ¸ðµâÀÌ ÇÊ¿äÇÑÁö È®ÀÎÇÏ°í ¹Ì¸® ÀûÀç½ÃŲ´Ù. ÀÌ ÆÄÀÏÀº  
            <emphasis>depmod -a</emphasis>¸í·ÉÀ¸·Î »ý¼º½Ãų ¼ö ÀÖ´Ù.  
            ¿¹¸¦ µé¾î msdos.o ¸ðµâÀº fat.o¸ðµâÀÌ ¿ì¼±ÀûÀ¸·Î ÀûÀçµÇ¾î ÀÖ¾î¾ß¸¸  
            ÇÑ´Ù. modprobe´Â modeule.depÆÄÀÏÀ» ÂüÁ¶Çؼ­ ÀÇÁ¸¼ºÀ»  
            °Ë»çÇÏ°Ô µÈ´Ù.   
        </para> 
        <para> 
            ¸¶Áö¸·À¸·Î modprobe´Â insmod¸¦ ÀÌ¿ëÇØ¼­ ¿øÇÏ´Â ¸ðµâÀ» ÀûÀçÇ챉  
            À§Çؼ­ ¿ì¼±ÀûÀ¸·Î ÇÊ¿äÇÑ ¸ðµâÀ» ÀûÀç½ÃŰ°Ô µÈ´Ù.  
            insmod´Â /lib/modules/version/À» Á÷Á¢ÂüÁ¶Çؼ­ ¸ðµâÀ» ÀûÀçÇÑ´Ù.  
            ÃÖÁ¾ÀûÀ¸·Î ¿©·¯ºÐÀÌ msdos ¸ðµâÀ» ¿Ã¸®±â¸¦ ¿øÇÑ´Ù¸é ´ÙÀ½°ú  
            °°ÀÌ ÇÏ¸é µÈ´Ù. 
            <screen> 
# insmod /lib/modules/2.5.1/kernel/fs/fat/fat.o 
# insmod /lib/modules/2.5.1/kernel/fs/msdos/msdos.o 
            </screen> 
            ±×·¯³ª À§¿Í °°ÀÌ ÇÒ°æ¿ì ¸ðµâ ÀÇÁ¸¼ºÀ» Á÷Á¢ °Ë»çÇØÁà¾ß Çϴµ¥,  
            ÀÌ·² °æ¿ì modprobe¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.  
            <screen>  
# modprobe -a msdos 
            </screen>  
        </para> 
        <para> 
            ¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â modprobe, insmod, depmod¿Í °°Àº ÇÁ·Î±×·¥Àº  
            modutils(ȤÀº mod-utils) ÆÐŰÁö¿¡ Æ÷ÇԵȴÙ. 
        </para> 
        <para> 
            ±×·³ /etc/modules.conf¸¦ °£·«ÇÏ°Ô »ìÆìº¸°í À̹øÀåÀ»  
            ³¡¸¶Ä¡µµ·Ï ÇϰڴÙ.   
            <screen> 
# This file is automatically generated by update-modules 
 
path[misc]=/lib/modules/2.4.?/local 
alias eth0 ne2k-pci 
alias eth1 ne2k-pci 
            </screen> 
            '#'Àº ÁÖ¼®À» À§Çؼ­ »ç¿ëµÇ¸ç °ø¹é¶óÀÎÀº ¹«½ÃµÈ´Ù. 
        </para> 
        <para> 
            path[misc]´Â misc¸ðµâÀ» ãÀ» °æ·ÎÀÇ ÁöÁ¤À» À§Çؼ­ »ç¿ëµÈ´Ù.     
        </para> 
        <para> 
            alias ´Â kmode°¡ ½Äº°ÀÚ eth0À» È£Ãâ ÇßÀ» ¶§ ne2k-pci¸¦ È£ÃâÇϵµ·Ï  
            ÇÑ´Ù. alias´Â ²Ï Áß¿äÇÏ°Ô »ç¿ëµÉ ¼ö Àִµ¥ ÇϳªÀÇ ½Ã½ºÅÛ¿¡  
            µ¿ÀÏÇÑ ÀåÄ¡°¡ 2°³ ÀÌ»ó ºÙ¾î ÀÖÀ»¶§ À̸¦ ½Äº°ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.  
        </para> 
    </section> 
    <section id="simplemodule"> 
        <title>Ãʰ£´Ü ¸ðµâÁ¦ÀÛ : Hello World</title>   
        <para> 
            ¾î¶² ¿ª»çÀûÀÎ ÀÌÀ¯°¡ ÀÖ´ÂÁö ¸ð¸£°ÚÁö¸¸ ´ëºÎºÐ ÇÁ·Î±×·¡¹ÖÀÔ¹®  
            À» Çϴµ¥ À־ °¡Àå ¸ÕÀú "Hello World"¸¦  
            Ãâ·ÂÇÏ´Â Äڵ带 À强ÇÏ´Â µ¥¿¡¼­ ºÎÅÍ ½ÃÀÛÇÑ´Ù. Hello World 
            Ãâ·Â ÄÚµå¿Í °ü·ÃµÈ Àç¹ÌÀÖ´Â ±ÛÀÌ Àִµ¥ Çѹø ÀÐ¾î º¸±â  
            ¹Ù¶õ´Ù. <ulink url=http://www.joinc.co.kr/modules.php?op=modload&name=Forum&file=viewtopic&topic=28363&forum=2&1>Hello WorldÀÇ º¯Ãµ»ç</ulink> 
        </para> 
        <para> 
            ¿©±â¿¡¼­µµ "Hello World"¸¦ Ãâ·ÂÇÏ´Â Äڵ带 ¸¸µå´Â °ÍÀ¸·Î  
            ¸ðµâ ÇÁ·Î±×·¡¹ÖÀ¸·ÎÀÇ ¹ß°ÉÀ½À» ³»µóµµ·Ï ÇϰڴÙ.  
            À̰ÍÀº ¸Å¿ì °£´ÜÇÑ ¸ðµâÀε¥, ¾ÆÁ÷ ÄÄÆÄÀÏ ¹æ¹ýÀ» ´Ù·çÁö´Â  
            ¾ÊÀ» °ÍÀÌ´Ù. ¸ðµâ ÄÄÆÄÀÏÀº <xref linkend="compile">¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.     
            <screen> 
#include <linux/module.h> 
#include <linux/kernel.h> 
 
int init_module(void) 
{ 
    printk("<1>Hello World 1.\n"); 
    return 0; 
} 
 
void cleanup_module(void) 
{ 
    printk(KERN_ALERT "Goodbye world 1.\n"); 
} 
            </screen> 
            Ä¿³Î¸ðµâÀº ÃÖ¼ÒÇÑ 2°³ÀÇ ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù.  
            Çϳª´Â init_module()¶ó´Â À̸§ÀÇ ½ÃÀÛ(ÃʱâÈ­)ÇÔ¼ö·Î½á  
            insmod¿¡ ÀÇÇØ¼­ Ä¿³Î·Î ÀûÀçµÉ¶§ È£ÃâµÈ´Ù. ´Ù¸¥ Çϳª´Â  
            cleanup_module()¶ó´Â À̸§ÀÇ Á¾·áÇÔ¼ö·Î½á rmmod¸¦  
            È£ÃâÇØ¼­ ¸ðµâÀ» »èÁ¦ÇÒ¶§ È£ÃâµÈ´Ù.   
        </para> 
        <section> 
            <title>printk()¿¡ ´ëÇØ¼­</title> 
            <para> 
                ÀϹÝÀûÀ¸·Î printk¸¦ ÀÌ¿ëÇϸé (ÇÔ¼öÀ̸§ÀÇ ¾î°¨ ¶§¹®¿¡) 
                ƯÁ¤ÇÑ ¸Þ½ÃÁö¸¦ Ç¥ÁØÃâ·ÂÇÒ °ÍÀ¸·Î  
                »ý°¢ÇÏ´Â °æ¿ì°¡ ¸¹Àºµ¥ printk´Â À¯Àú¸¦ À§ÇÑ ¾î¶² Ãâ·Âµµ  
                ÇÏÁö ¾Ê´Â´Ù. À̸§°ú´Â ´Þ¸® ·Î±×³ª °æ°í ¸Þ½ÃÁö¸¦ ³²±â±â  
                À§ÇÑ Ä¿³Î·Î±ë ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.  
            </para> 
            <para> 
                ÀϹÝÀûÀÎ ·Î±×°ü·Ã ¶óÀ̺귯¸®³ª ÇÔ¼öµéÀÌ ±×·¸µíÀÌ printkµµ  
                ¿ì¼±¼øÀ§(priority)¸¦ °¡Áø´Ù. ¸ðµÎ 8´Ü°èÀÇ ¿ì¼±¼øÀ§¸¦ °¡Áö¸ç  
                <1> KERN_ALERT ¿Í °°Àº ¹æ½ÄÀ¸·Î °áÁ¤ÇÒ ¼ö ÀÖ´Ù.  
                ÀÌµé ¿ì¼±¼øÀ§¿¡ ´ëÇÑ ¼±¾ðÁ¤º¸´Â linux/kernel.h¿¡¼­ È®ÀÎÇÒ  
                ¼ö ÀÖ´Ù. ¸¸¾à ¿ì¼±¼øÀ§¸¦ Á¤Çϱ⠱ÍÂú°Å³ª Á¤ÇÒ ¼ö ¾ø´Ù¸é  
                ±âº» ¿ì¼±¼øÀ§ DEFAULT_MESSAGE_LOGLEVELÀ» »ç¿ëÇÏ¸é µÈ´Ù.  
            </para> 
            <para> 
                ¸¸¾à <emphasis>syslogd</emphasis>¿Í <emphasis>klogd</emphasis>°¡ 
                ½ÇÇàÁßÀ̶ó¸é ¸Þ½ÃÁö´Â /var/log/messages¿¡ Ãß°¡ µÈ´Ù. ´ÙÀ½Àº  
                ½ÇÁ¦ ÀúÀåµÈ ·Î±×µéÀÌ´Ù.      
                <screen> 
Oct  6 01:15:39 localhost kernel: Hello World 1. 
Oct  6 01:16:11 localhost kernel: Goodbye world 1. 
                </screen> 
            </para> 
        </section> 
    </section> 
    <section id="compile"> 
        <title>Ä¿³Î ¸ðµâ ÄÄÆÄÀÏ Çϱâ</title> 
        <para> 
            Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â Ưº°ÇÑ gcc ¿É¼Ç°ú ´õºÒ¾î ¸î°¡Áö  
            °ªµéÀÇ Á¤ÀÇ(symbols define)°¡ ÇÊ¿äÇÏ´Ù. ÀÌÀ¯´Â Ä¿³Î¸ðµâ ÄÄÆÄÀϽà  
            »ç¿ëµÇ´Â Ä¿³Î Çì´õµéÀÌ  
            Ä¿³Î¹öÁ¯¿¡ ¸Å¿ì ÀÇÁ¸ÀûÀÏ ¼ö Àֱ⠶§¹®ÀÌ´Ù.      
        </para> 
        <para> 
            ÀÌ·¯ÇÑ Á¤ÀÇ´Â gccÀÇ -D¿É¼ÇÀ» ÀÌ¿ëÇϰųª ȤÀº #define ¼±Çàó¸®ÀÚ¸¦  
            ÀÌ¿ëÇÏ¸é µÈ´Ù. À̹ø Àå¿¡¼­´Â Ä¿³ÎÄÄÆÄÀÏÀ» Çϱâ À§Çؼ­ ÇÊ¿äÇÑ  
            ³»¿ëµé¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÌ´Ù.    
        </para> 
        <para> 
            <itemizedlist> 
                <listitem> 
                    <para> 
                        -c : Ä¿³Î¸ðµâÀº µ¶¸³ÀûÀ¸·Î ½ÇÇàµÇÁö ¾ÊÀ¸¸ç 
                        (mainÇÔ¼ö ÀÚü¸¦ Æ÷ÇÔÇϰí ÀÖÁö ¾Ê´Ù) objectÆÄÀÏ  
                        ÇüÅ·ΠĿ³Î¿¡ ¸µÅ©µÇ¾î¼­ ½ÇÇàµÈ´Ù. °á°úÀûÀ¸·Î -c ¿É¼ÇÀ»                         ÀÌ¿ëÇØ¼­ ¿ÀºêÁ§Æ® ÇüÅ·Π¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù.   
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        -O2 : Ä¿³ÎÀº inlineÇÔ¼ö¸¦ ¸Å¿ì ¸¹ÀÌ »ç¿ëÇϸç,  
                        ±×·± ÀÌÀ¯·Î ¸ðµâÀº ¹Ýµå½Ã ÃÖÀûÈ­(optimization) 
                        ¿É¼ÇÀ» »ç¿ëÇØ¼­ ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù.  
                        ÃÖÀûÈ­ ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì ¾î¼Àºí·¯ ¸ÅÅ©·ÎµîÀ»  
                        »ç¿ëÇϴµ¥ À־ ¹®Á¦°¡ »ý±æ¼ö ÀÖ´Ù.  
                        ÀÌ·²°æ¿ì ¸ðµâÀÇ ÀûÁ¦°¡ ½ÇÆÐÇÏ°Ô µÉ°ÍÀÌ´Ù.    
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        -D__KERNEL__ : ÀÌ Äڵ尡 À¯Àú ÇÁ·Î¼¼½º°¡ ¾Æ´Ñ 
                        Ä¿³Î¸ðµå¿¡¼­ ÀÛµ¿ÇÒ °ÍÀ̶ó´Â°É Ä¿³ÎÇì´õ¿¡ ¾Ë·ÁÁØ´Ù.  
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        -W -Wall : ¸ðµâ ÇÁ·Î±×·¥Àº Ä¿³Î¿¡ ¸Å¿ì ¹Î°¨ÇÑ ¿µÇâÀ»  
                        ³¢Ä¥ ¼ö ÀÖÀ¸¸ç Ä¿³ÎÀ» ´Ù¿î ½Ãų ¼öµµ ÀÖ´Ù.  
                        ±×·¯¹Ç·Î °¡´ÉÇÑÇÑ ¸ðµç Á¾·ùÀÇ °æ°í¸Þ½ÃÁö¸¦ °Ë»çÇØ¾ßÇÒ  
                        Çʿ䰡 ÀÖ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé ÄÄÆÄÀÏ·¯°¡ ¹ß»ý½Ãų¼ö  
                        ÀÖ´Â ¸ðµç °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.      
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        -DMODULE : Ä¿³Î¸ðµâ·Î ÀÛ¼ºµÇ´Â ÄÚµå¶ó´Â°É ¾Ë·ÁÁÖ±â  
                        À§Çؼ­ »ç¿ëÇÑ´Ù.  
                    </para> 
                </listitem> 
            </itemizedlist> 
            À̿ܿ¡µµ ÄÄÆÄÀÏ¿¡ »ç¿ëµÉ Çì´õÆÄÀÏÀ» ã±â À§Çؼ­ -I´ë½Å¿¡ -isystemÀ» 
            »ç¿ëÇϸç "unused varaiable"°ú °°Àº °æ°í ¸Þ½ÃÁöÀÇ Ãâ·ÂÀ» À§Çؼ­  
            -W -WallÀ» ÀÌ¿ëÇÒ °ÍÀÌ´Ù. -isystemÀº gcc-3.xÀ̻󿡼­ Áö¿øµÇ´Â  
            ¿É¼ÇÀÌ´Ù.  
            <note> 
                <para> 
                    -isystem µµ -I ó·³ Çì´õÆÄÀÏÀÇ °æ·Î ÁöÁ¤À» À§Çؼ­  
                    »ç¿ëµÈ´Ù´Â Á¡¿¡¼­ ºñ½ÁÇÏ´Ù. -IÀÇ °æ¿ì Ç¥ÁØ  
                    (Çì´õÆÄÀÏ_½Ã½ºÅÛ °æ·Î¸¦ °Ë»çÇϱâ Àü¿¡ -I·Î ÁöÁ¤µÈ  
                    °æ·Î¸¦ ¸ÕÀú °Ë»çÇÏ´Â ¹Ý¸é -isystemÀº °¡Àå ¸¶Áö¸·¿¡  
                    ÁöÁ¤µÈ °æ·Î¿¡ ´ëÇÑ °Ë»ç¸¦ ÇÑ´Ù.  
                </para> 
            </note> 
        </para> 
        <para> 
            ´ÙÀ½Àº Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏÇϱâ À§ÇÑ ÀüÇüÀûÀÎ MakefileÀÌ´Ù. 
            <screen> 
TARGET  := hello 
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes 
INCLUDE := -isystem /lib/modules/`uname -r`/build/include 
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} 
CC      := gcc 
     
${TARGET}.o: ${TARGET}.c 
 
.PHONY: clean 
 
clean: 
    rm -rf ${TARGET}.o 
            </screen> 
            ½±°Ô ÀÌÇØ °¡´ÉÇÒ °ÍÀÌ´Ù. make¸¦ ½ÇÇàÇϸé hello.c¸¦ ÄÄÆÄÀÏÇ졒  
            ±×°á°ú Ä¿³Î ¸ðµâ(¿ÀºêÁ§Æ®) ÆÄÀÏÀÎ hello.o¸¦ »ý¼ºÇس½´Ù. »ý¼ºµÈ  
            Ä¿³Î ¸ðµâÀº <emphasis>insmod ./hello.o</emphasis>¸¦ ÅëÇØ¼­ ÀûÀç 
            ÇÒ ¼ö ÀÖ´Ù. À̰ɷΠ´ç½ÅÀº ÃÖÃÊÀÇ Ä¿³Î ¸ðµâÀÛ¼º¿¡ ¼º°øÇß´Ù.  
            ¿¹»ó¿Ü·Î °£´ÜÇÏÁö ¾ÊÀº°¡ ? ÀûÀçµÈ Ä¿³Î¸ðµâÀº  
            <emphasis>rmmod hello</emphasis>·Î Á¦°ÅÇÒ ¼ö ÀÖ´Ù. printk()Ãâ·ÂÀº  
            /var/log/message¿¡ ½×ÀÏ °ÍÀÌ´Ù. È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.   
        </para> 
        <para> 
            <xref linkend="simplemodule">¿¡ ÀÖ´Â ¿¹Á¦¸¦ º¸¸é init_module()¿¡¼­  
            0À» ¸®ÅÏÇϰí ÀÖ´Ù. ±×·±µ¥ ´Ù¸¥ °ªÀ» ¸®ÅÏÇϵµ·Ï ÇÏ¸é ¾î¶»°Ô µÉ±î ?   
            Áö±ÝÇѹø Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.  
        </para> 
    </section> 
    <section> 
        <title>Hello World 2</title> 
        <para> 
            initÇÔ¼ö¿Í cleanupÇÔ¼öÀÇ À̸§ÀÌ ¹Ýµå½Ã  
            init_module()¿Í cleanup_module()·Î ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀº  
            (ºñ·Ï È¥µ¿À» ÁÙ¿©ÁÖ±ä ÇϰÚÁö¸¸) ¿ØÁö ÀÌÄ¡¿¡ ¸ÂÁö ¾Ê´Â°Í °°´Ù.  
        </para> 
        <para> 
            ¸®´ª½º Ä¿³Î 2.4ºÎÅÍ´Â ÀÌµé °íÁ¤µÈ À̸§´ë½Å ´Ù¸¥ À̸§À¸·Î  
            »ç¿ë°¡´ÉÇϸç, À̸¦ À§Çؼ­ module_init()¿Í module_exit()ÇÔ¼ö¸¦  
            Á¦°øÇÑ´Ù.  
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : hello_re.c</emphasis> 
            <screen> 
#include <linux/module.h> 
#include <linux/tty.h> 
#include <linux/init.h> 
#include <linux/kernel.h> 
 
int hello_init(void) 
{ 
    printk(KERN_ALERT "HELLO, World\n"); 
    return 0; 
} 
 
void hello_exit(void) 
{ 
    printk(KERN_ALERT "bye bye\n"); 
} 
 
module_init(hello_init); 
module_exit(hello_exit); 
            </screen> 
        </para> 
    </section> 
    <section> 
        <title>Hello World 3 : ¶óÀ̼¾½º¿Í ¸ðµâ¿¡ ´ëÇÑ Á¤º¸</title> 
        <para> 
            Ä¿³Î¸ðµâÀº ´Ù¸¥ ½Ã½ºÅÛ/À¯ÀúÇÁ·Î±×·¥¿¡ ºñÇØ ¿î¿µÃ¼Á¦¿¡ ´õ¿í¹Î°¨ÇÑ  
            ¿µÇâÀ» ³¢Ä¥ ¼ö ÀÖ´Ù. ±×·±ÀÌÀ¯·Î ÃÖ¼ÒÇÑ Ä¿³Î¸ðµâ¿¡´Â Ä¿³ÎÀÛ¼ºÀÚ¿¡  
            ´ëÇÑ Á¤º¸°¡ µé¾î°¡µµ·Ï ÀÛ¼ºÇÏ´Â°Ô ÁÁÀ» °ÍÀÌ´Ù.     
        </para> 
        <para> 
 
            ¸®´ª½º Ä¿³Î 2.4À̻󿡼­ Áö±Ý±îÁö ¿ì¸®°¡ ÀÛ¼ºÇÑ Ä¿³Î  
            ¸ðµâÀ» ÀûÀçÇÏ·Á°í ÇÏ¸é ´ÙÀ½°ú °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.   
            <screen> 
# insmod ./hello.o 
Warning: loading ./hello.o will taint the kernel: no license 
See http://www.tux.org/lkml/#export-tainted for information about tainted modules 
            </screen> 
            <note> 
                <para> 
                ¶óÀ̼¾½ºÁ¤º¸°ü·Ã °æ°í¸Þ½ÃÁö Ãâ·ÂÀº Ä¿³Î ¿É¼ÇÀ» ¾î¶»°Ô  
                ÁÖ°í ÄÄÆÄÀÏ Çß´À³Ä¿¡ µû¶ó Ãâ·ÂµÇÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.  
                ¸î¸î ¹èÆ÷ÆÇÀÇ °æ¿ì °æ°í¸Þ½ÃÁö°¡ Ãâ·ÂµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.    
                </para> 
            </note> 
            ƯÈ÷ ¸¹Àº °³¹ßÀÚµéÀº ÇØ´ç ¸ðµâÀÌ GPL(ȤÀº ÀÌ¿Í ºñ½ÁÇÑ)°ú °°Àº  
            °ø°³µÈ ¶óÀ̽ºÁ¤Ã¥À» µû¸£´ÂÁö ±×·¸Áö ¾ÊÀºÁö¿¡ ´ëÇØ¼­ ¹Î°¨ÇÒ ¼ö  
            Àִµ¥, MODULE_LICENSE() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇØ¼­ ¶óÀ̼¾½º¸¦ ¸í½ÃÇÒ  
            ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¶óÀ̼¾½º¿¡ ´ëÇÑ ¸ÞÄ¿´ÏÁòÀº linux/module.h¿¡  
            Á¤ÀǵǾî ÀÖ´Ù.     
        </para> 
        <para> 
            ÀÌ¿Í ºñ½ÁÇÏ°Ô MODULE_DESCRIPTION()°ú MODULE_AUTHOR()¸ÅÅ©·Î¸¦  
            ÀÌ¿ëÇØ¼­ ¸ðµâÀÇ ¿øÀúÀÛÀÚ¿Í ¸ðµâ¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ» °çµéÀÏ  
            ¼öµµ ÀÖ´Ù.       
        </para> 
        <para> 
            ÀÌ·¯ÇÑ ¸ðµç ¸ÅÅ©·Î´Â linux/module.h¿¡ Á¤ÀÇ µÇ¾îÀÖ´Ù. ÀÌµé  
            ¸ÅÅ©·Î °ªµéÀº Ä¿³Î¿¡ ÀÇÇØ¼­ Á÷Á¢ ÀÌ¿ëµÇÁö´Â ¾ÊÁö¸¸    
            <emphasis>objdump</emphasis>¿Í °°Àº µµ±¸¸¦ ÀÌ¿ëÇÒ¶§  
            ¸ðµâ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò´Âµ¥ µµ¿òÀ» ÁØ´Ù.   
            <screen> 
# objdump -s hello_li.o  
... 
 0000 6b65726e 656c5f76 65727369 6f6e3d32  kernel_version=2 
 0010 2e342e32 30006c69 63656e73 653d4750  .4.20.license=GP 
 0020 4c000000 00000000 00000000 00000000  L............... 
 0030 00000000 00000000 00000000 00000000  ................ 
 0040 61757468 6f723d79 756e6472 65616d20  author=yundream  
 0050 3c79756e 64726561 6d406a6f 696e632e  <yundream@joinc. 
 0060 636f2e6b 723e0064 65736372 69707469  co.kr>.descripti 
 0070 6f6e3d41 2073696d 706c6520 64726976  on=A simple driv 
 0080 65720064 65766963 653d7465 73746465  er.device=testde 
 0090 76696365 00                          vice.            
            </screen> 
            ´ÙÀ½Àº ÀÌµé ¸ÞÅ©·Î¸¦ Æ÷ÇÔ½ÃŲ ¿¹ÀÌ´Ù. 
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : hello_li.c</emphasis> 
            <screen> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#define DRIVER_AUTHOR "yundream <yundream@joinc.co.kr>" 
#define DRIVER_DESC   "A simple driver" 
 
int init_hello_3(void); 
void cleanup_hello_3(void); 
 
 
static int init_hello_4(void) 
{ 
   printk("<2>Hello, world 4\n"); 
   return 0; 
} 
 
 
static void cleanup_hello_4(void) 
{ 
   printk("<2>Goodbye, world 4\n"); 
} 
 
 
module_init(init_hello_4); 
module_exit(cleanup_hello_4); 
 
MODULE_LICENSE("GPL"); 
 
MODULE_AUTHOR(DRIVER_AUTHOR); 
MODULE_DESCRIPTION(DRIVER_DESC); 
MODULE_SUPPORTED_DEVICE("testdevice"); 
            </screen> 
        </para> 
    </section> 
    <section> 
        <title>¸í·ÉÇà ÀÎÀÚÀÇ Ã³¸®</title> 
        <para> 
            Ä¿³Î ¸ðµâµµ ¸í·ÉÇà ÀÎÀÚ¸¦ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î  
            ÀÌ¿ëÇÏ´Â argc/argv ±â¹ýÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù.  
        </para> 
        <para> 
            ¸ðµâ·ÎÀÇ ¾Æ±Ô¸ÕÆ® Àü´ÞÀº MODULE_PARM()¸ÅÅ©·Î¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. 
            MODULE_PARM()¸ÅÅ©·Î´Â 2°³ÀÇ ÀÎÀÚ¸¦ °¡Áø´Ù. ù ¹øÂ° ÀÎÀÚ´Â  
            °ªÀÌ ÀúÀåµÉ º¯¼ö¸íÀ̰í, µÎ¹øÂ° ÀÎÀÚ´Â ÀúÀåµÉ µ¥ÀÌÅÍÀÇ Å¸ÀÔÀ»  
            ³ªÅ¸³½´Ù. µ¥ÀÌÅÍ Å¸ÀÔÀº "b" : ¹ÙÀÌÆ®, "h": short int, "i": integer, 
            "l": long int, "s":string(¹®ÀÚ¿­)°¡ ÀÖ´Ù. ¹®ÀÚ¿­Àº char * ŸÀÔÀÌ¸ç  
            insmod·Î È£ÃâµÉ¶§ ¸Þ¸ð¸®°¡ ÇÒ´çµÈ´Ù. ´ÙÀ½Àº °£´ÜÇÑ È°¿ë¿¹ÀÌ´Ù.   
            <screen> 
int myint = 3; 
char *mystr; 
 
MODULE_PARM (myint, "i"); 
MODULE_PARM (mystr, "s"); 
            </screen> 
        </para> 
        <para> 
            ¹è¿­µµ Áö¿øµÇ´Âµ¥, '-'¸¦ ÀÌ¿ëÇØ¼­ ¹è¿­ÀÇ ÃÖ¼ÒÅ©±â¿Í ÃÖ´ëÅ©±â¸¦  
            ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ÁÖ¾îÁú¼ö ÀÖ´Â ÀÎÀÚÀÇ ÃÖ¼Ò¿Í  
            ÃÖ´ë °¹¼ö¸¦ Á¤ÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.  
            <screen> 
int myshortArray[4]; 
MODULE_PARM(myintArray, "2-4i"); 
            </screen> 
        </para> 
        <para> 
            ÀÌÁ¦ ½ÇÁ¦ ¸ðµâÀ» ½ÇÇà½ÃŰ¸é¼­ ÀÎÀÚ¸¦ ³Ñ±â´Â ¹æ¹ýÀ» ¾Ë¾Æº¸µµ·Ï  
            ÇÏÀÚ. ÀÎÀÚ´Â [º¯¼ö¸í]=[°ª]ÀÇ ÇüÅ·Π³Ñ¾î°£´Ù.  
            ¸¸¾à ¸ðµâ ÄÚµå»ó¿¡ MODULE_PARM(myint, "i"); ·Î µÇ¾î ÀÖ´Ù¸é  
            ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÀÎÀÚ¸¦ ³Ñ±ä´Ù.  
            <screen> 
# insmod ./hello.o myint=50 
            </screen> 
            ²Ï³ª µ¶Æ¯ÇÑ ¹æ¹ýÀ¸·Î ³Ñ±â°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.       
        </para> 
        <para> 
            ¹è¿­ÀÇ °æ¿ì¿¡´Â ÀÎÀÚ°¡ ÁöÁ¤ÇÑ ÃÖ´ë/ÃÖ¼ÒÀÇ ¹üÀ§¸¦ ¹þ¾î³¯  
            °æ¿ì ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸ç ¸ðµâÀÌ ÀûÀçµÇÁö ¾Ê´Â´Ù.  
            ÀÏ¹Ý ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ¼öÇàÇÏ´Â argc¸¦ ÅëÇÑ ¾Æ±Ô¸ÕÆ® °¹¼ö  
            °Ë»ç¿Í ºñ½ÁÇÑ ÇüŶó°í º¸¸é µÈ´Ù. ¹è¿­ÀÇ °¢ ¿ä¼Ò´Â ','¸¦  
            ÅëÇØ¼­ ±¸ºÐµÇ¾î Áø´Ù.  
            <screen> 
int myarray[4]; 
 
MODULE_PARM(myarray, "2-4"); 
            </screen> 
            ¿Í °°ÀÌ µÇ¾î ÀÖ´Ù°í ÇÒ¶§, ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î °ªÀ»  
            ³Ñ±æ ¼ö ÀÖ´Ù.  
            <screen> 
# insmod ./hello.o myarray=1,4,3 
            </screen> 
            ´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÄÚµåÀÌ´Ù. 
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : hello_arg.c</emphasis> 
            <screen> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("yundream@joinc.co.kr"); 
 
static short int myshort = 1; 
static int myint = 420; 
static long int mylong = 9999; 
static char *mystring = "blah"; 
 
MODULE_PARM (myshort, "h"); 
MODULE_PARM (myint, "i"); 
MODULE_PARM (mylong, "l"); 
MODULE_PARM (mystring, "s"); 
 
 
static int __init hello_5_init(void) 
{ 
   printk(KERN_ALERT "Hello, world 5\n=============\n"); 
   printk(KERN_ALERT "myshort is a short integer: %hd\n", myshort); 
   printk(KERN_ALERT "myint is an integer: %d\n", myint); 
   printk(KERN_ALERT "mylong is a long integer: %ld\n", mylong); 
   printk(KERN_ALERT "mystring is a string: %s\n", mystring); 
   return 0; 
} 
 
 
static void __exit hello_5_exit(void) 
{ 
   printk(KERN_ALERT "Goodbye, world 5\n"); 
} 
 
 
module_init(hello_5_init); 
module_exit(hello_5_exit); 
            </screen> 
        </para> 
    </section> 
    <section> 
        <title>¸ðµâº° ºÐÇÒ ÄÄÆÄÀÏ</title> 
        <para> 
            º¸Åë Á¶±ÝÀÌ¶óµµ ±Ô¸ð°¡ ÀÖ´Â ½Ã½ºÅÛ/À¯Àú ¾ÖÇø®ÄÉÀ̼ÇÀ»  
            ÀÛ¼ºÇÒ ¶§´Â ¼Ò½ºÀÇ °ü¸®¸¦  
            À§Çؼ­ ÇÔ¼ö/±â´Éº°·Î ¼Ò½º¸¦ ºÐÇÒÇØ¼­ ÄÄÆÄÀÏÇÑ´Ù.   
        </para> 
        <para> 
            Ä¿³Î ¸ðµâ¿ª½Ã ÀÌ·¯ÇÑ ºÐÇÒ ÄÄÆÄÀÏÀ» Áö¿øÇϴµ¥, ¾Æ·¡ÀÇ  
            Çü½ÄÀ» µû¶óÁÖ¾î¾ß ÇÑ´Ù.  
            <orderedlist> 
                <listitem> 
                    <para> 
                        ¸ðµç ¼Ò½ºÆÄÀÏ È¤Àº Çϳª ÀÌ»óÀÇ ¼Ò½ºÆÄÀÏ¿¡  
                        <emphasis>#define _NO_VERSION__</emphasis>  
                        ÀÌ Æ÷ÇԵǾî ÀÖ¾î¾ß ÇÑ´Ù. ¸ðµâ ÄÄÆÄÀÏÀ»  
                        À§Çؼ­ Æ÷ÇÔ½ÃŰ´Â module.h ³»¿¡ Ä¿³Î ¹öÁ¯Á¤º¸°¡  
                        Æ÷ÇԵǾî ÀÖÀ¸¸ç ÀÌ Á¤º¸´Â ¸ðµâ¿¡ Àü¿ªÀûÀ¸·Î »ç¿ëµÇ¹Ç·Î  
                        _NO_VERSION__ÀÇ »ç¿ëÀº ²Ï³ª Áß¿äÇØÁø´Ù. ¸¸¾à¿¡  
                        version.h¸¦ Á÷Á¢ Æ÷ÇÔ½ÃÄÑ¾ß µÇ´Â °æ¿ì°¡ »ý±ä´Ù¸é  
                        _NO_VERSION__À» Á¤ÀÇÇϱ⠹ٶõ´Ù. module.h¿¡´Â  
                        ÀÌ°Ô Á¤ÀǵǾî ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù.  
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î ÄÄÆÄÀÏÇÑ´Ù. 
                    </para> 
                </listitem> 
                <listitem> 
                    <para> 
                        ¸¸µé¾îÁø ¿©·¯°³ÀÇ ¿ÀºêÁ§Æ®ÆÄÀÏÀ» Çϳª·Î ¸¸µé¾î Áà¾ß ÇÑ´Ù. 
                        x86ÇÏ¿¡¼­´Â  
                        <emphasis>d -m elf_i386 -r -o <module name.o> <1st src file.o> <2nd src file.o></emphasis>  
                    </para> 
                </listitem> 
            </orderedlist> 
            ´ÙÀ½Àº ¸ðµâºÐÇÒ ¹æ½ÄÀ¸·Î ÀÛ¼ºµÈ Ä¿³Î ¸ðµâ ¿¹Á¦µéÀÌ´Ù.  
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : start.c</emphasis> 
            <screen> 
#include <linux/kernel.h>       /* We're doing kernel work */ 
#include <linux/module.h>       /* Specifically, a module */ 
 
int init_module(void) 
{ 
  printk("Hello, world - this is the kernel speaking\n"); 
  return 0; 
} 
            </screen> 
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : stop.c</emphasis> 
            <screen> 
#if defined(CONFIG_MODVERSIONS) && ! defined(MODVERSIONS) 
   #include <linux/modversions.h> /* Will be explained later */ 
   #define MODVERSIONS 
#endif         
#include <linux/kernel.h>  /* We're doing kernel work */ 
#include <linux/module.h>  /* Specifically, a module  */ 
#define __NO_VERSION__     /* It's not THE file of the kernel module */ 
#include <linux/version.h> /* Not included by module.h because of 
                                          __NO_VERSION__ */ 
     
void cleanup_module() 
{ 
   printk("<1>Short is the life of a kernel module\n"); 
} 
            </screen> 
        </para> 
        <para> 
            ´ÙÀ½Àº ÄÄÆÄÀÏÀ» À§ÇÑ MakefileÀÌ´Ù.  
            <screen> 
CC=gcc 
MODCFLAGS := -O -Wall -DMODULE -D__KERNEL__ 
hello.o:    start.o stop.o 
    ld -m elf_i386 -r -o hello.o start.o stop.o 
 
start.o: start.c 
    ${CC} ${MODCFLAGS} -c start.c 
 
stop.o: stop.c 
    ${CC} ${MODCFLAGS} -c stop.c 
            </screen> 
        </para> 
    </section> 
</section> 
<section> 
    <title>¸ðµâÇÁ·Î±×·¡¹Ö¿¡ ¾Õ¼­</title> 
    <section> 
        <title>¸ðµâ°ú ÀÏ¹Ý ÇÁ·Î±×·¥ÀÇ Â÷ÀÌ</title> 
        <para> 
            º¸Åë ÇÁ·Î±×·¥Àº main()ÇÔ¼ö·Î ½ÃÀÛÇϸç, Á¾·á¿ª½Ã (ÀϹÝÀûÀ¸·Î)mainÇÔ¼ö¿¡¼­  
            ºüÁ®³ª¿À´Â °É·Î ÀÌ·ç¾îÁø´Ù. ±×·¯³ª Ä¿³Î ¸ðµâÀº ¾à°£ ´Ù¸£°Ô ÀÛµ¿ÇÑ´Ù.     
            ¸ðµâÀº init_module ¶Ç´Â module_init·Î ÁöÁ¤µÈ ÇÔ¼öÀÇ È£Ãâ·Î ½ÇÇàµÈ´Ù.  
            ÀÌ ÇÔ¼öµéÀº ¸ðµâÀÇ ÁøÀÔÇÔ¼ö·Î »ç¿ëµÈ´Ù. ÁøÀÔÀº Ä¿³Î¿¡°Ô ¾î¶²±â´ÉÀ» ÇϱâÀ§ÇÑ  
            ÇÔ¼öµéÀÌ ÁغñµÇ¾úÀ¸´Ï ÇÊ¿äÇÒ¶§ ½ÇÇà½Ã۶ó´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. ÁøÀÔÇÔ¼ö¿¡¼­  
            ¸®ÅÏÇÏ°Ô µÇ¸é Ä¿³Î¿¡°Ô ¸ðµâÀÇ ±â´ÉÀÌ ´õÀÌ»ó ÇÊ¿ä ¾øÀ½À» ÅëÁöÇÏ°Ô µÇ°í  
            Ä¿³ÎÀº ¸ðµâÀÇ ½ÇÇàÀ» ÁßÁö ½ÃŲ´Ù.     
        </para> 
        <para> 
            ¸ðµç ¸ðµâÀº Á¾·áÇÒ ¶§ cleanup_module³ª module_exit¿¡ ÁöÁ¤µÈ  
            ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. À̰ÍÀº ¸ðµâ Á¾·áÇÔ¼öµé·Î ÁøÀÔÇÔ¼ö¿¡ ÀÇÇØ µî·ÏµÈ 
            ÇÔ¼öµéÀ» Á¦°ÅÇÏ´Â ÀϵéÀ» ÇÑ´Ù. 
        </para> 
        <para> 
            ¸ðµâÀº ¹Ýµå½Ã ÁøÀÔÇÔ¼ö(entry function)¿Í Á¾·áÇÔ¼ö(exit function)À»  
            °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.    
        </para> 
    </section> 
    <section> 
        <title>¸ðµâ¿¡¼­ ÇÔ¼ö »ç¿ëÇϱâ</title> 
        <para> 
            ÀÏ¹Ý ÇÁ·Î±×·¥¿¡¼­ ÇÔ¼ö¸¦ ÀÌ¿ëÇϱâ À§Çؼ­ ¾ðÁ¦³ª ÇÔ¼öÁ¤ÀǸ¦ ÇØ¾ßÇÏ´Â °Ç ¾Æ´Ï´Ù. 
            printf()¿Í °°Àº °æ¿ì °æ¿ìÀε¥, ÀÌ·¯ÇÑ ÇÔ¼öµéÀº Ç¥ÁØ C ¶óÀ̺귯¸®¿¡¼­ Á¦°øµÇ´Â 
            °ÍµéÀ» ÀÌ¿ëÇϱ⠶§¹®ÀÌ´Ù. ÀÌ·¸°Ô ¿ÜºÎ¶óÀ̺귯¸®¿¡ ÀÇÇØ¼­ Á¤ÀÇµÈ ÇÔ¼ö´Â ÇÁ·Î±×·¥ÀÌ 
            ¸µÅ©¿µ¿ª¿¡ ÀÌÀü±îÁö´Â Á¤ÀǵǾîÀÖÁö ¾Ê°í, È£ÃâÇÏ¸é ±×¶§ ¿ÜºÎ¶óÀ̺귯¸®¿¡¼­  
            Á¤ÀÇµÈ ÇÔ¼ö¸¦ Àоî¿Í¼­ ¼öÇàÇÑ´Ù. °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ  
            óÀ½¿£ Àßµ¹´Ù°¡ (ÇØ´ç °øÀ¯¶óÀ̺귯¸®°¡ ¾øÀ»°æ¿ì) Áß°£¿¡ ¿¡·¯¸¦ ³»°í  
            Á¾·áÇÏ´Â°Ô ÀÌ·¯ÇÑ ÀÌÀ¯¿¡¼­ÀÌ´Ù. 
        </para> 
        <para> 
            Ä¿³Î¸ðµâÀº À̿ʹ ´Ù¸£´Ù. hello world¿¹Á¦¸¦ º¸¸é printk()¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇ졒  
            Àִµ¥ ÀÌ ÇÔ¼ö´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. ÀÌ´Â ÀÌ·¯ÇÑ  
            ÇÔ¼öµé¿¡ ´ëÇÑ Á¤ÀÇµÈ ½Éº¼À» Ä¿³Î¿¡¼­ Á÷Á¢°ü¸®Çϱ⠶§¹®ÀÌ´Ù. ¸¸¾à Ä¿³Î¿¡¼­  
            Á¦°øÇÏ´Â ÇÔ¼öÀÇ ½Éº¼À» ã±â ¿øÇÑ´Ù¸é /proc/kallsyms  
            (Ä¿³Î¹öÁ¯¿¡ µû¶ó¼­ /proc/ksyms)¸¦ È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù. 
        </para>  
        <para>  
            ÀÌ·¯ÇÑ ¸ðµâÇÔ¼ö¿Í ÀϹÝÇÔ¼öÀÇ Â÷ÀÌÁ¡Àº ¶óÀ̺귯¸® ÇÔ¼ö¿Í ½Ã½ºÅÛÄÝÀÇ °üÁ¡¿¡¼­ 
            º¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Ù. ¶óÀ̺귯¸® ÇÔ¼ö´Â ³ôÀº ¼öÁØÀÇ ÀÎÅÍÆäÀ̽º¸¦  
            Á¦°øÇϸç À¯Àú ¿µ¿ª(user space)¿¡¼­ ÀÛµ¿ÇÑ´Ù. ÀÎÅÍÆäÀ̽º ¾ÈÀ¸·Î µé¾î°¡¸é  
            ½ÇÁ¦ ÀÏÀº system callµéÀÌ ´ã´çÇÏ°Ô µÈ´Ù.     
        </para>  
    </section> 
</section> 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.