红联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. ck1212_00 于 2017-02-27 12:37:53发表:

    感谢分享!

  2. han19850618 于 2016-12-29 11:34:28发表:

    看不懂了

  3. Changlobx 于 2014-10-30 10:49:36发表:

    很高兴认识大家,希望一起学习,一起提高,资源不错

  4. poiu125sd 于 2014-03-17 09:42:02发表:

    新手挣积分,请谅解

  5. Tron 于 2014-03-17 09:39:14发表:

    好例子,多谢分享!

  6. hero_71 于 2013-06-18 00:23:42发表:

    还行吧

  7. linux_fzt 于 2013-06-12 10:23:27发表:

    这里,,这里,,,发点好东西。。。西东网。。。http然后是xidong.net,搜索”linux网络编程“”linux内核讲解“”linux入门教程“等相关资源,就会找到很多很好的资源,视频、pdf、mp3等等。。资源丰富,很好的一个网站。。。。

  8. linux_fzt 于 2013-06-12 10:23:22发表:

    这里,,这里,,,发点好东西。。。西东网。。。http然后是xidong.net,搜索”linux网络编程“”linux内核讲解“”linux入门教程“等相关资源,就会找到很多很好的资源,视频、pdf、mp3等等。。资源丰富,很好的一个网站。。。。

  9. linux_fzt 于 2013-06-12 10:23:18发表:

    这里,,这里,,,发点好东西。。。西东网。。。http然后是xidong.net,搜索”linux网络编程“”linux内核讲解“”linux入门教程“等相关资源,就会找到很多很好的资源,视频、pdf、mp3等等。。资源丰富,很好的一个网站。。。。

  10. surarain 于 2013-05-29 09:19:33发表:

    nice

  11. chunpengkai 于 2013-05-09 17:30:18发表:

    学习中,谢谢

  12. longshao221 于 2013-05-03 14:59:31发表:

    不错

  13. shell10000 于 2013-03-14 09:25:07发表:

    谢谢分享

  14. zshxiangni 于 2013-03-11 11:48:05发表:

    感谢分享

  15. shenlonghaha 于 2012-12-31 22:08:52发表:

    摸着石头过河

  16. 月落金陵梦 于 2012-12-14 16:16:49发表:

    {:2_91:}

  17. pythonner 于 2012-12-13 10:31:10发表:

    感谢分享,学到知识了!

  18. freeny 于 2012-12-09 15:03:23发表:

    受教了,感谢分享,支持

  19. gky2009514 于 2012-12-07 13:03:42发表:

    新手完成任务,求下书籍~

  20. alnnawang 于 2012-12-02 23:24:13发表:

    谢谢楼主

  21. alnnawang 于 2012-12-02 23:21:42发表:

    不错的

  22. sunlightboy514 于 2012-12-02 22:56:07发表:

    貌似代码中缺少了MODULE_LICENSE("GPL")声明

  23. preooo 于 2012-11-24 21:45:08发表:

    不错

  24. linux004 于 2012-11-23 09:37:47发表:

    坚持就是胜利。。。。。。。。。。

  25. kyan1991 于 2012-07-26 22:17:25发表:

    收藏了!!!!!!!!

  26. kyan1991 于 2012-07-18 22:28:05发表:

    很受教,请教一下你内核代码阅读,编辑用什么软件啊?

  27. yt20090291 于 2012-07-08 16:25:36发表:

    谢谢分享

  28. 于 2012-05-16 17:46:06发表:

    实践了一下,加深了理解。谢谢。

  29. aslin08 于 2012-05-16 14:52:58发表:

    很好的例子,感谢分享

  30. 5714723 于 2012-05-12 18:24:39发表:

    谢谢楼主啊!

  31. honglianqxw123 于 2012-05-08 08:43:53发表:

    是个好范本,谢谢。

  32. honglianqxw123 于 2012-05-07 07:27:03发表:

    路过,了解。

  33. 口王点 于 2012-05-04 09:41:24发表:

    入门程序,呵呵

  34. conghung2012 于 2012-05-03 20:19:37发表:

    编程干嘛?好好体验ubuntu这个工具给你带来的方便和美感就行了,要做好工作,还是去windows下。不要折腾。

  35. 等候的人 于 2012-05-01 22:35:25发表:

    谢谢楼主啦

  36. tea789a 于 2012-05-01 17:33:32发表:

    好东西,必须顶!!!谢谢分享!!!

  37. liru125504 于 2012-04-12 15:14:08发表:

    学习了

  38. fj97897217 于 2012-04-11 21:55:38发表:

    不错,简单 易懂! 嘻嘻~~~

  39. 云飞1992 于 2012-04-10 20:05:36发表:

    quite good

  40. silentwind 于 2012-03-27 16:44:44发表:

    为了 刷分才留的言