linux内核编程(一)

这些天在学习linux内核编程,就在这里小小的show以下。
首先编写如下的linux代码。并命名为hello.c
这里你应该注意亮点:
第一、linux内核编程,不同于普通的用户态下的编程;有一个入口的main函数;这里的“main”函数是module_init();同时还有一个善后处理的函数:module_exit()。
第二、linux内核编程在编译的时候,不同于用户态下的编程;可以直接使用gcc编译器编译链接,就能够成为可执行的;而是需要编写一个Makefile文件,不是makefile!!这里牵扯到很多的内核态下的东西,具体的我也没弄清楚!详细的会在后面和大家分享。

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

并在hello.c的同一目录下建立Makefile文件。
Makefile文件:
  1.  1 ifneq ($(KERNELRELEASE),)
  2.   2 mymodule-objs:= hello.c
  3.   3 obj-+= hello.o
  4.   4 
  5.   5 else
  6.   6 PWD :=$(shell pwd)
  7.   7 KVER := $(shell uname -r)
  8.   8 KDIR :=/lib/modules/$(KVER)/build
  9.   9 
  10.  10 all:
  11.  11 $(MAKE) -C $(KDIR) M=$(PWD)
  12.  12 clean:
  13.  13 rm -rf *.*.mod.*.ko *.symvers *order *.markers *-
  14.  14 endif
说明:
当命令在执行make时,将调用Makefile文件。 KERNELRELEASE 是在内核源代码的顶层/usr/src/linux-headers-2.6.32-33/Makefile 文件中定义的一个变量。读者如果下载的是linux-3.0的内核的话在**/linux-3.0/Makefile。当中的380行。如下:

  1.  379 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
  2.  380 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
  3.  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-+= hello.o表是链接后将生成mymodule.ko模块,这个文件就是要插入内核的模块文件。
    如果make的目标是clean,直接执行clean标号之后的操作,删除 一大堆的东西!执行文clean后面的rm命令之后,make整个工作就结束了!

执行效果:
  1. [#35#caopeng@laptop:~]$cd kernel/
  2. [#36#caopeng@laptop:~/kernel]$ls
  3. hello.c Makefile
  4. [#37#caopeng@laptop:~/kernel]$make
  5. make -/lib/modules/2.6.32-33-generic/build M=/home/caopeng/kernel
  6. make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-33-generic'
  7.   LD /home/caopeng/kernel/built-in.o
  8.   CC [M] /home/caopeng/kernel/hello.o
  9. /home/caopeng/kernel/hello.c: In function ‘lkp_exit’:
  10. /home/caopeng/kernel/hello.c:17: warning: no return statement in function returning non-void
  11. /home/caopeng/kernel/hello.c: In function ‘__exittest’:
  12. /home/caopeng/kernel/hello.c:19: warning: return from incompatible pointer type
  13.   Building modules, stage 2.
  14.   MODPOST 1 modules
  15.   CC /home/caopeng/kernel/hello.mod.o
  16.   LD [M] /home/caopeng/kernel/hello.ko
  17. make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-33-generic'
  18. [#38#caopeng@laptop:~/kernel]$
编译成功!!
查看当前目录下的文件,会发现多了很多东西!如下:
  1. [#38#caopeng@laptop:~/kernel]$ls
  2. built-in.o hello.ko hello.mod.o Makefile Module.symvers
  3. hello.c hello.mod.c hello.o modules.order
  4. [#39#caopeng@laptop:~/kernel]$
这里不知道为什么生成的文件都没有x权限!这里要用到的就是hello.ko给其加上可执行权限。并使用insmod将其插入!然后用命令查看结果!
  1. [#47#caopeng@laptop:~/kernel]$sudo rmmod hello.ko
  2. [#48#caopeng@laptop:~/kernel]$sudo insmod hello.ko
  3. [#49#caopeng@laptop:~/kernel]$dmesg -c
  4. klogctl: 不允许的操作
  5. [#50#caopeng@laptop:~/kernel]$sudo dmesg -c
  6. [14651.331364] Hello,Word exit
  7. [14658.553284] Hello ,
  8. [#51#caopeng@laptop:~/kernel]$
最后要记得rmmod!!!

转自:http://blog.chinaunix.net/uid-26281173-id-2856305.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核一直是学习的难点:将近3000万行代码,5万多个源文件,代码庞大繁杂、代码很难看懂。《Linux内核编程》将突破以往传统的学习方式,采取更有效和科学的学习方法,多角度地对内核进行多层次分析,不局限于形式,不拘泥细节,目的只有一个:更轻松、更高效地去理解内核、学习内核。为了更好地让学员掌握内核编程技能,更好地理解内核,本课程将采用并不局限于以下学习方法进行课程的录制:降维分析,化简为繁,将复杂的系统简单化用软件工程的方法分析内核:软件分层、模块化分解、框架迭代多角度立体分析Linux内核,目的只有一个:更好地理解内核利用Linux内核中的面向对象编程思想去分析复杂的子系统、子系统交互利用多任务编程的思想去分析Linux内核本套课程预计分为20个左右的小模块,每个模块一个专题,每个专题会陆续发布。拟录制的模块包括但不限于:模块机制、内核裁剪与配置、内核编译与启动、系统调用、中断、文件系统、调度、内存管理、内核同步、设备模型、字符驱动、块驱动、定时器、input、platform设备驱动、device tree、proc、sysfs、I/O...  本课程是《Linux内核编程》的入门篇,主要给大家介绍一下Linux内核开发、Linux驱动开发的就业行情、行业生态、需要掌握哪些技能、Linux内核的学习方法、如何搭建Linux内核的学习开发环境。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值