ºìÁªLinuxÃÅ»§
Linux°ïÖú

linuxÄں˱à³Ì³õ̽£¡

·¢²¼Ê±¼ä:2011-09-18 15:54:53À´Ô´:ºìÁª×÷Õß:ÎÒÀ´³ÙÁË
´ËÎÄÕÂÀ´×ÔÎÒµÄһƪ²©¿Í£¡
http://blog.chinaunix.net/space.php?uid=26281173&do=blog&id=2856305
»¶Ó­´ó¼Ò·ÃÎÊ£¡

ÕâЩÌìÔÚѧϰlinuxÄں˱à³Ì£¬¾ÍÔÚÕâÀïССµÄshowÒÔÏ¡£
Ê×ÏȱàдÈçϵÄlinux´úÂë¡£²¢ÃüÃûΪhello.c
ÕâÀïÄãÓ¦¸Ã×¢ÒâÁÁµã£º
µÚÒ»¡¢linuxÄں˱à³Ì£¬²»Í¬ÓÚÆÕͨµÄÓû§Ì¬Ïµıà³Ì£»ÓÐÒ»¸öÈë¿ÚµÄmainº¯Êý£»ÕâÀïµÄ¡°main¡±º¯ÊýÊÇmodule_init();ͬʱ»¹ÓÐÒ»¸öÉƺó´¦ÀíµÄº¯Êý£ºmodule_exit()¡£
µÚ¶þ¡¢linuxÄں˱à³ÌÔÚ±àÒëµÄʱºò£¬²»Í¬ÓÚÓû§Ì¬Ïµıà³Ì£»¿ÉÒÔÖ±½ÓʹÓÃgcc±àÒëÆ÷±àÒëÁ´½Ó£¬¾ÍÄܹ»³ÉΪ¿ÉÖ´Ðеģ»¶øÊÇÐèÒª±àдһ¸öMakefileÎļþ£¬²»ÊÇmakefile£¡£¡ÕâÀïÇ£³¶µ½ºÜ¶àµÄÄÚºË̬ϵĶ«Î÷£¬¾ßÌåµÄÎÒҲûŪÇå³þ£¡ÏêϸµÄ»áÔÚºóÃæºÍ´ó¼Ò·ÖÏí¡£

hello.c Îļþ
1 #include
2 #include
3 #include
4 static int __init lkp_init(void);
5 static int __init lkp_exit(void);
6
7
8 static int __init lkp_init(void)
9 {
10 printk("<1>Hello ,Word!\n");
11 return 0;
12 }
13
14 static int __exit lkp_exit(void)
15 {
16 printk("<2>Hello,Word exit\n");
17 }
18 module_init(lkp_init);
19 module_exit(lkp_exit);

²¢ÔÚhello.cµÄͬһĿ¼Ï½¨Á¢MakefileÎļþ¡£
MakefileÎļþ£º
1 ifneq ($(KERNELRELEASE),)
2 mymodule-objs:= hello.c
3 obj-m += hello.o
4
5 else
6 PWD :=$(shell pwd)
7 KVER := $(shell uname -r)
8 KDIR :=/lib/modules/$(KVER)/build
9
10 all:
11 $(MAKE) -C $(KDIR) M=$(PWD)
12 clean:
13 rm -rf *.o *.mod.c *.ko *.symvers *order *.markers *-
14 endif
˵Ã÷£º
µ±ÃüÁîÔÚÖ´ÐÐmakeʱ£¬½«µ÷ÓÃMakefileÎļþ¡£KERNELRELEASE ÊÇÔÚÄÚºËÔ´´úÂëµÄ¶¥²ã/usr/src/linux-headers-2.6.32-33/Makefile ÎļþÖж¨ÒåµÄÒ»¸ö±äÁ¿¡£¶ÁÕßÈç¹ûÏÂÔصÄÊÇlinux-3.0µÄÄں˵Ļ°ÔÚ**/linux-3.0/Makefile¡£µ±ÖеÄ380ÐС£ÈçÏ£º

379 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
380 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
381 KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL) ,.$(SUBLEVEL)))$(EXTRAVERSION)
ÔÚµÚÒ»´Î¶ÁÈ¡Ö´ÐдËMakefileʱ£¬±äÁ¿$(KERNELRELEASE) ²¢Ã»Óб»ÉèÖã¬Òò´ËµÚÒ»ÐÐifneqµÄÌõ¼þʧ°Ü£¬´ÓelseºóÃæµÄ¿ªÊ¼Ö´ÐУ¬ÉèÖÃPWD¡¢KVER¡¢KDIRµÈ±äÁ¿¡£
µ±makeÓöµ½±êºÅallʱ£¬-C$(KDIR)Ö¸ÃûÌøתµ½ÄÚºËÔ´ÂëĿ¼Ï¶ÁÈ¡ÄÇÀïµÄMakefile¡£M=$(PWD)£¬±íÃ÷·µ»Øµ½µ±Ç°µÄĿ¼½øÐмÌÐø¶ÁÈ룬ִÐе±Ç°µÄMakefile£¬Ò²¾ÍÊǵڶþ´Îµ÷ÓÃmake¡£ÕâʱµÄ±äÁ¿$(KERNELRELEASE) ÒѾ­±»¶¨Ò壬Òò´Ëifneq³É¹¦£¬make½«¼ÌÐø¶ÁÈ¡½ô½ÓÔÚifneqºóÃæµÄÄÚÈÝ¡£ifneqµÄÄÚÈÝΪkbuildÓï¾ä£¬Ö¸ÃûÄ£¿éÔ´ÂëÖиöÎļþÖ®¼äµÄÒÀÀµ¹ØϵºÍÒªÉú³ÉµÄÄ¿±êÄ£¿é
Óï¾ä 2 mymodule-objs:= hello.c ±íÊÇmymodule.o ÓÉhello.cÉú³É¡£ Óï¾ä3 obj-m += hello.o±íÊÇÁ´½Óºó½«Éú³Émymodule.koÄ£¿é£¬Õâ¸öÎļþ¾ÍÊÇÒª²åÈëÄں˵ÄÄ£¿éÎļþ¡£
Èç¹ûmakeµÄÄ¿±êÊÇclean£¬Ö±½ÓÖ´ÐÐclean±êºÅÖ®ºóµÄ²Ù×÷£¬É¾³ý Ò»´ó¶ÑµÄ¶«Î÷£¡Ö´ÐÐÎÄcleanºóÃæµÄrmÃüÁîÖ®ºó£¬makeÕû¸ö¹¤×÷¾Í½áÊøÁË£¡

Ö´ÐÐЧ¹û£º
[#35#caopeng@laptop:~]$cd kernel/
[#36#caopeng@laptop:~/kernel]$ls
hello.c Makefile
[#37#caopeng@laptop:~/kernel]$make
make -C /lib/modules/2.6.32-33-generic/build M=/home/caopeng/kernel
make[1]: ÕýÔÚ½øÈëĿ¼ `/usr/src/linux-headers-2.6.32-33-generic'
LD /home/caopeng/kernel/built-in.o
CC [M] /home/caopeng/kernel/hello.o
/home/caopeng/kernel/hello.c: In function ¡®lkp_exit¡¯:
/home/caopeng/kernel/hello.c:17: warning: no return statement in function returning non-void
/home/caopeng/kernel/hello.c: In function ¡®__exittest¡¯:
/home/caopeng/kernel/hello.c:19: warning: return from incompatible pointer type
Building modules, stage 2.
MODPOST 1 modules
CC /home/caopeng/kernel/hello.mod.o
LD [M] /home/caopeng/kernel/hello.ko
make[1]:ÕýÔÚÀ뿪Ŀ¼ `/usr/src/linux-headers-2.6.32-33-generic'
[#38#caopeng@laptop:~/kernel]$
±àÒë³É¹¦£¡£¡
²é¿´µ±Ç°Ä¿Â¼ÏµÄÎļþ£¬»á·¢ÏÖ¶àÁ˺ܶණÎ÷£¡ÈçÏ£º
[#38#caopeng@laptop:~/kernel]$ls
built-in.o hello.ko hello.mod.o Makefile Module.symvers
hello.c hello.mod.c hello.o modules.order
[#39#caopeng@laptop:~/kernel]$
ÕâÀï²»ÖªµÀΪʲôÉú³ÉµÄÎļþ¶¼Ã»ÓÐxȨÏÞ£¡ÕâÀïÒªÓõ½µÄ¾ÍÊÇhello.ko¸øÆä¼ÓÉÏ¿ÉÖ´ÐÐȨÏÞ¡£²¢Ê¹ÓÃinsmod½«Æä²åÈ룡ȻºóÓÃÃüÁî²é¿´½á¹û£¡
[#47#caopeng@laptop:~/kernel]$sudo rmmod hello.ko
[#48#caopeng@laptop:~/kernel]$sudo insmod hello.ko
[#49#caopeng@laptop:~/kernel]$dmesg -c
klogctl: ²»ÔÊÐíµÄ²Ù×÷
[#50#caopeng@laptop:~/kernel]$sudo dmesg -c
[14651.331364] Hello,Word exit
[14658.553284] Hello ,
[#51#caopeng@laptop:~/kernel]$
×îºóÒª¼ÇµÃrmmod£¡£¡£¡
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 67 ÌõÆÀÂÛ

  1. dzctuser ÓÚ 2012-02-14 13:25:31·¢±í:

    ÎÒÒª»ý·Ö¡£¡£¡£

  2. qwyan456 ÓÚ 2012-02-06 23:59:53·¢±í:

    ѧϰÖÐ

  3. awen_ls ÓÚ 2012-01-18 17:07:42·¢±í:

    importent knowledge for me!! thanks

  4. ÎíÔÂOÇïË® ÓÚ 2012-01-03 17:07:32·¢±í:

    ¶¥ÏÂ

  5. wangxkk ÓÚ 2011-12-17 00:15:02·¢±í:

    xuexi

  6. haiwawa ÓÚ 2011-12-16 16:04:55·¢±í:

    ³¬¼¶ÓÐÓÃ

  7. jjmhere ÓÚ 2011-12-06 19:19:15·¢±í:

    Ôõôȥ¶ÁMAKEFILEÎļþ°¡£¬¶Á²»¶®°¡¡£¡£¡£
    ²ËÄñ°¡¡£¡£¡£

  8. ×·Ñ°ÃÎÍÁ ÓÚ 2011-12-02 14:30:15·¢±í:

    ûÓп´¶®Ñ½,ÎØÎز»»áÓÃgcc

  9. jianxin_pan_00 ÓÚ 2011-11-19 23:13:16·¢±í:

    ºÜ²»´í ÖµµÃѧϰһÏ£¡

  10. °¬ÏþÝÕ ÓÚ 2011-11-18 07:27:35·¢±í:

    ѧϰÁË¡£¡£¡£

  11. guwujian ÓÚ 2011-11-17 23:36:00·¢±í:

    дµÄÌ«ºÃÁË£¬ÊÕÏÂÁË

  12. hlaker ÓÚ 2011-11-12 00:58:19·¢±í:

    [i=s] ±¾Ìû×îºóÓÉ hlaker ÓÚ 2011-11-12 00:59 ±à¼­ [/i]

    ´úÂëÀïдµÄÊÇ 8 static int __init lkp_init(void) ¶ÔÓ¦ printk("<1>Hello ,Word!\n");
    static int __exit lkp_exit(void) ¶ÔÓ¦ printk("<2>Hello,Word exit\n");
    ΪºÎ×îºó´ÓÔËÐнá¹û¿´·´¶øÊÇint __exit lkp_exit(void) ±È static int __init lkp_init(void)ÏÈÖ´ÐÐÄØ£¿
    ÄѵÀ²»ÊÇÏȳõʼ»¯ÔÙÍ˳öô£¿

  13. ystianyu ÓÚ 2011-11-08 10:31:50·¢±í:

    (e:e2s ²»´í£¬ÊܽÌ

  14. lanlanlangzi ÓÚ 2011-11-03 14:28:20·¢±í:

    ѧϰѧϰ{:3_115:}

  15. zhongyue ÓÚ 2011-11-03 13:32:59·¢±í:

    ѧϰÁË

  16. ai0909 ÓÚ 2011-10-21 15:37:00·¢±í:

    ·¹ý¡£¡£¡£

  17. njp1949 ÓÚ 2011-10-20 10:21:45·¢±í:

    :0wmjh(1

  18. wang_tao_223 ÓÚ 2011-10-11 15:48:27·¢±í:

    ѧϰ

  19. sdphome ÓÚ 2011-10-10 17:16:54·¢±í:

    ºÜ¼òµ¥µÄÀý×Ó

  20. ÇïÖ®ÎïÓï ÓÚ 2011-10-08 22:36:37·¢±í:

    ¶àлÁË¡£

  21. 556983 ÓÚ 2011-10-01 11:37:52·¢±í:

    ºÃÇ¿£¬°Ý¶ÁÁË

  22. Byron_Wang ÓÚ 2011-09-30 17:06:57·¢±í:

    ÊǸöºÃ·¶±¾

  23. viataa ÓÚ 2011-09-29 20:55:52·¢±í:

    ѧϰ

  24. blindcat ÓÚ 2011-09-25 16:43:04·¢±í:

    лл·ÖÏí£º£©

  25. newenter ÓÚ 2011-09-22 16:21:04·¢±í:

    ÊǸöºÃ·¶±¾

  26. GrowthÕ× ÓÚ 2011-09-19 09:35:44·¢±í:

    ¸ÐлÎÒÀ´³ÙÁ˵ķÖÏí£¬±¾Ìù¼ÓÈëµ½ÂÛ̳¶¥ÖõÄLinuxÓ¦ÓÃÌùÖÐ

  27. Whikla ÓÚ 2011-09-18 16:18:32·¢±í:

    ÊܽÌÁË