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!
Helloworld模块之内核makefile详解的更多相关文章
- Makefile详解--隐含规则
Makefile详解--隐含规则(转) Makefile系列文章,这里有个前辈连续洗了一个系列来介绍,共有26篇博客文章. http://www.cppblog.com/ivenher/archive ...
- (转)centos7优化内核参数详解
centos7优化内核参数详解 原文:http://blog.csdn.net/xiegh2014/article/details/52132863 cat /etc/sysctl.conf #CTC ...
- linux源码Makefile详解
1.Makefile的作用 (1)决定编译哪些文件 (2)怎样编译这些文件 (3)怎样连接这些文件,最重要的是它们的顺序如何 2.Linux内核Makefile分类 ***************** ...
- python异步并发模块concurrent.futures入门详解
concurrent.futures是一个非常简单易用的库,主要用来实现多线程和多进程的异步并发. 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo. ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- linux中与Oracle有关的内核参数详解
工作当中遇到oracle运行时CPU占用率达到90%以上,调小以下参数值后恢复正常. fs.file-max = 65536 net.core.rmem_default=262144 net.core ...
- Kali linux 2016.2 的 plyload模块之meterpreter plyload详解
不多说,直接上干货! 前期博客 Kali linux 2016.2(Rolling)中的payloads模块详解 当利用成功后尝试运行一个进程,它将在系统进程列表里显示,即使在木马中尝试执行系统命令, ...
- oracle内核参数详解
一.前言 在生产中,我们安装oracle数据库时,为达到最优我们需要对操作系统的内核参数进行一定的调整.主要从内存.cpu.io以及网络等方面,根据实际情况进行调整.以下参数可供大家参考,如有不当之处 ...
- 【转】Linux内核结构详解
Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信. 1.进程调度 (SCHED):控制进程对CPU的访问.当需要选择下一个进程运行时,由调度程序选择最值得运行 ...
随机推荐
- Hadoop的奇技淫巧
(2-6为性能优化)(7-9为函数介绍) 1.在JobHistory里面可以看到job相关的一些信息,用start-all启动Hadoop时便可以进入端口号8088查看查看信息,但是无法进入端口号19 ...
- hadoop的live node为0
1.重新格式化namenode cd ~ rm -rf name mkdir name rm -rf hadoop-2.7.2/logs/ mkdir hadoop-2.7.2/logs/ hadoo ...
- linux 将foo制定n, m之间行的内容, 追加到bar文件
sed -ne '196, 207 p' foo >> bar;把文件foo 196-行207行的内容追加到 bar文件
- hdu 3336【Count the string】(KMP)
一道字符串匹配的题目,仅仅借此题练习一下KMP 因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加 ...
- html5 图片转base64预览显示
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- CentOS 安裝 VMware Workstation / VMware Player
参考:http://www.vixual.net/blog/archives/650 序列号:1F04Z-6D111-7Z029-AV0Q4-3AEH8 注意说明:刚开始有很长的一系列协议信息,可以用 ...
- Android代码写View
1.Java Code package com.fish.helloworld; import android.app.Activity; import android.content.Context ...
- SQLserver2012 修改数据库架构
还原数据库以后,发现有一张表的架构不对,执行sql提示:对象名无效.
- Javascript 命名空间模式
命名空间是通过为项目或库创建一个全局对象,然后将所有功能添加到该全局变量中.通过减少程序中全局变量的数量,实现单全局变量,从而在具有大量函数.对象和其他变量的情况下不会造成全局污染,同时也避免了命名冲 ...
- sqlserver 保留小数方法
1. 使用 Round() 函数,如 Round(@num,2) 参数 2 表示 保留两位有效数字. 2. 更好的方法是使用 Convert(decimal(18,2),@num) 实现转换,dec ...