Helloworld模块之内核makefile详解

Hello World 模块以及对应的内核makefile详解

hello.c:
#include <linux/module.h> //所有模块都需要的头文件
#include <linux/init.h>   // init&exit相关宏

MODULE_LICENSE("GPL");
MODULE_AUTHOR("feifei");
MODULE_DESCRIPTION("hello world module");

static int __init hello_init(void){
      printk(KERN_ERR "hello world");
      return 0;
}

static void __exit hello_exit(void){
      printk(KERN_EMERG "hello exit!");
}

module_init(hello_init);
module_exit(hello_exit);

/*注释:这个模块定义了两个函数, 一个在模块加载到内核时被调用( hello_init )以及一个在模块被去除时被调用( hello_exit ).
moudle_init 和 module_exit 是比较特别的内核宏来指出这两个函数的角色
宏 (MODULE_LICENSE) 是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨
printk 函数在 Linux 内核中定义并且对模块可用;
它与标准 C 库函数 printf 的行为相似. 内核需要它自己的打印函数, 因为它靠自己运行, 没有 C 库的帮助.
字串 KERN_EMERG 是消息的优先级,可以用 <1>,等对应的数字代替来前缀于 printk 格式串之前. 注意如果用 KERN_ALERT ,之后要缺少一个逗号
*/

Makefile:

ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR :=/lib/modules/&(shell uname -r)/build
all:
      make -C $(KDIR) M=$(PWD) modules
clean:
      rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
~
/*注释:
上面的这一行不是一个传统的 makefile 的样子,是kbuild makefile语法
obj-m :=hello.o表明有一个模块要从目标文件 hello.o 建立. 在从目标文件建立后结果模块命名为 hello.ko
扩展一点: 如果你有一个模块名为 module.ko, 是来自 2 个源文件( 姑且称之为, file1.c 和 file2.c ), 正确的书写应当是:
obj-m := module.o
module-objs := file1.o file2.o
make -C $(KDIR):这个命令开始是改变它的目录到用 -C 选项提供的目录下( 就是说, 你的内核源码目录 )
它在那里会发现内核的顶层 makefile。
这个 M= 选项使 makefile 在试图建立模块目标前, 回到你的模块源码目录。
M=$(PWD) 作为参数传给Makefile,内核中的解释是:make M=dir modules Make all modules in specified dir
目标, 是指在 obj-m 变量中发现的模块列表, 在我们的例子里设成了 hello.o
&(shell uname -r):是调用shell命令,在我系统上是2.6.18-92.el5,所以KDIR :=/lib/modules/&(shell uname -r)/build:
/lib/modules/2.6.18-92.el5/build/是内核源码.
内核源码Makefile中350行有关于KERNELRELEASE定义:
#KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)

下面,全面的解释一下这个makefile的执行流程:
这个 makefile 在一次典型的建立中要被读 2 次. 在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,
所以make将读取执行else之后的内容,如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,
-C $(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、
执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,
make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
obj-m := hello.o表示编译连接后将生成param.ko模块。

这种建立模块的机制你可能感觉笨拙模糊. 一旦你习惯了它, 但是, 你很可能会欣赏这种已经编排进内核建立系统的能力.
注意, 上面的不是一个完整的 makefile; 一个真正的 makefile 包含通常的目标类型来清除不要的文件,
安装模块等等. 一个完整的例子可以参考例子代码目录的 makefile.
*/
三。加载模块
[root]# ls
hello.c hello.mod.c hello.o Module.markers Module.symvers
hello.ko hello.mod.o Makefile modules.order

root# insmod hello.ko
Hello, world
root# rmmod hello
hello exit!
时间: 2024-12-18 05:11:41

Helloworld模块之内核makefile详解的相关文章

LINUX下ORACLE相关的内核参数详解

ORACLE相关的内核参数详解 1.kernel.sem [[email protected] ~]# cat /proc/sys/kernel/sem 250         32000    100         142 [[email protected] ~]#  ipcs -sl ------ Semaphore Limits -------- max number of arrays = 142 max semaphores per array = 250 max semaphor

day01_linux中与Oracle有关的内核参数详解

linux中与Oracle有关的内核参数详解 在安装Oracle的时候需要调整linux的内核参数,但是各参数代表什么含义呢,下面做详细解析. Linux安装文档中给出的最小值: fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 4294967295 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip

Linux 内核 hlist 详解

在Linux内核中,hlist(哈希链表)使用非常广泛.本文将对其数据结构和核心函数进行分析. 和hlist相关的数据结构有两个:hlist_head 和 hlist_node //hash桶的头结点 struct hlist_head { struct hlist_node *first;//指向每一个hash桶的第一个结点的指针 }; //hash桶的普通结点 struct hlist_node { struct hlist_node *next;//指向下一个结点的指针 struct hl

微赞微擎手动增加模块数据库表结构详解

微赞微擎手动增加模块数据库表结构详解 有时候微擎或微赞的模块没有安装模块的xml文件,那我们先想安装到自己的系统上,要怎么处理呢,下面我们详细的介绍下步骤,个人能力有限,如有不正确之处,敬请谅解~ 1.模块的代码复制 这个就不用多说了吧,当然需要把相应的addons文件夹里的模块复制到自己系统的目录里,不然不要做一下的事情了 2.数据库表结构修改 代码复制过来,如果有相应的xml安装包或者install.php文件,可以直接安装,但是我们这里讲的是没有,那只能把原来要复制的表结构记录复制过来,插

Makefile详解--隐含规则

Makefile详解--隐含规则(转) Makefile系列文章,这里有个前辈连续洗了一个系列来介绍,共有26篇博客文章. http://www.cppblog.com/ivenher/archives/2007/04.html Makefile隐含规则 ———— 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译 C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件).本章讲述的就是一些在Makefile中的“

linux中与Oracle有关的内核参数详解

工作当中遇到oracle运行时CPU占用率达到90%以上,调小以下参数值后恢复正常. fs.file-max = 65536 net.core.rmem_default=262144 net.core.rmem_max=262144 net.core.wmem_default=262144 net.core.wmem_max=262144 在安装Oracle的时候需要调整linux的内核参数,但是各参数代表什么含义呢,下面做详细解析. Linux安装文档中给出的最小值: fs.aio-max-n

python异步并发模块concurrent.futures入门详解

concurrent.futures模块详解 Executor对象 class concurrent.futures.Executor Executor是一个抽象类,它提供了异步执行调用的方法.它不能直接使用,但可以通过它的两个子类ThreadPoolExecutor或者ProcessPoolExecutor进行调用. 2.1.1 Executor.submit(fn, *args, **kwargs) fn:需要异步执行的函数 *args, **kwargs:fn参数 2.1.2 Execut

Linux内核编译详解

学习了网上的一些资料,自己试着摸索了一下,整理出这篇文章. 不当之处,还请大家批评指正.谢谢. 重要的参考资料有: http://raspberrypi.stackexchange.com/questions/192/how-do-i-cross-compile-the-kernel-on-a-ubuntu-host http://blog.csdn.net/xdw1985829/article/details/6833319 好了,下面进入正题. 一.准备工作 准备工作如何做,这里就不详说了.

linux源码Makefile详解(完整)【转】

转自:http://www.cnblogs.com/Daniel-G/p/3286614.html 随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核.这就需要了解 Linux 的内核配置系统. 众所周知,Linux 内