ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>kernel_module_programing
![]()
Tweet
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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|