linux内核模块编译
1 Makefile编写
ifneq ($(KERNELRELEASE),)
obj-m := mytest.o
mytest-objs := file1.o file2.o file3.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules//到linux源码所在的目录执行主Makefile 并当前路径传给主Makefile,告诉主Makefile执行完后返回到当前目录,执行Makefile
endif
解释为:
KERNELRELEASE
是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,
所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C
$(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)
表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去
解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,
指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mytest-objs := file1.o file2.o
file3.o表示mytest.o 由file1.o,file2.o与file3.o 连接生成。obj-m :=
mytest.o表示编译连接后将生成mytest.o模块。
2 测试
源文件
1 // 2 //hello.c 3 // 4 #include <linux/init.h> 5 #include <linux/kernel.h> 6 #include <linux/module.h> 7 8 static int hello_init(void) { 9 printk(KERN_WARNING "Module init: Hello world!\n"); 10 return 0; 11 } 12 13 static void hello_exit(void) { 14 printk(KERN_WARNING "Module exit: bye-bye\n"); 15 } 16 17 module_init(hello_init); 18 module_exit(hello_exit);
Makefile文件
1 ifneq ($(KERNELRELEASE),) 2 obj-m:=hello.o 3 else 4 KDIR := /lib/modules/$(shell uname -r)/build 5 6 all: 7 make -C $(KDIR) M=$(PWD) modules 8 clean: 9 make -C $(KDIR) M=$(PWD) clean 10 endif
插入模块到内核
# insmod hello.ko
查看输出
[root@localhost demo]# dmesg | tail -n 5
<span>[ 2445.017321] virbr0: port 2(vif1.0) entering forwarding state
[ 2445.017439] virbr0: port 2(vif1.0) entering disabled state
[ 2494.639683] hello: module license 'unspecified' taints kernel.
[ 2494.639688] Disabling lock debugging due to kernel taint
[ 2494.639841] Module init: Hello world!
转载于:https://www.cnblogs.com/chengxuyuancc/articles/3001119.html
linux内核模块编译相关推荐
- c需要实现安装卸载Linux模块,Linux内核模块编译与加载
Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用所需要的组件? 方法一: 把所有的组件都编译进内核文件,即Zlmage或bzlmage,但会导致两个问题:一是生成的内核文件过大:二是如 ...
- LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译
本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用.功能及基本编程方法,以便于读者能快速理解什么是Linux内核,能看懂Linux内核. 拥有超过1300万行的代码,Linux ...
- linux 内核模块 编译错误 include/linux/mmzone.h:18:26: fatal error: linux/bounds.h: No such file or director
解决方案:内核编译后 不要执行make clean 出现的问题:编译的时候提示缺少头文件 mmzone.h ....bounds.h...等 include/linux/mmzone.h:18:26: ...
- linux内核编译ccflag,Linux内核模块编译失败
我的上一次内核开发是在2.6~版本中 现在我尝试编译一个模块,在内核树外编译时出现以下错误. /bin/sh: 1: /home/blabla/workspace/kernel35/linux-3.5 ...
- 杭电操作系统实验二---linux内核模块编译(完整实验报告)
一 题目介绍 题目内容: (1)当模块被载入内核时会向系统日志文件中写入"hello,world":当被卸载时,会向系统写入"goodbye". (2)设计一个 ...
- linux内核模块编译出现找不到include/generated/asm/unistd_32.h” 问题解决
模块编译的时候出现该错误,Makefile如下,结果是M= 赋值出错(空值或者有空格).更改之后没问题. $(MAKE) -C $(KERNEL_DIR) M=${PWD} modules
- linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点
描述 1.1 Linux内核模块介绍1.1.1 Linux内核模块概述 嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性--用户只需要拿到相关驱动模块,再插入到用户的内 ...
- linux 内核模块(驱动) 编译详解
一.准备工作 准备工作如何做,这里就不详说了. a) 首先,你要有一台PC,装好了Linux. b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的).make.ncurse ...
- linux内核编译与内核模块
linux内核简介.配置编译与内核模块 Linux系统架构 主要分为用户空间和内核空间.用户空间包括应用程序和C库等.内核空间包括系统调用接口,linux内核以及体系结构相关代码.关于linux要区分 ...
最新文章
- HarmonyOS之AI能力·文档检测校正
- Python 的字符串转int
- ui和ux的区别_UI和UX之间的区别
- 工作145:vue里面取消console和debugger
- 冈萨雷斯《数字图像处理》读书笔记(九)——形态学图像处理
- 终于看到这么贱的星座分析了
- 项目管理工具project软件学习(一) - 项目信息设置
- 02.C(数据类型与运算符)
- Hadoop笔记整理(二):HDFS
- 看某帖有感(敬告我,以及我亲爱的朋友们)
- phpdesigner 的配置
- operating system not found的问题的解决办法 ---设置活动分区
- html 手机底部广告,手机网站被UC浏览器强制嵌入推荐广告解决方案
- 时间管理Smart法则,一个在高盛工作的学姐总结的12个时间管理妙招
- 4G模块ME909S-821调试记录
- 文档级关系抽取:A Densely Connected Criss-Cross Attention Network for Document-level Relation Extraction
- RPC VS REST
- C++Primer第五版 第十二章习题答案(1~10)
- HTMLcss怎样让文字覆盖在图片上面,图片上加字
- 从rookie到基佬~009:无密码卸载Symantec
热门文章
- maven学习十之myEclipse搭建maven项目总结
- 2019年值得关注的八大DevOps趋势
- Windows 环境下安装redis 及其PHP Redis扩展
- Spring Boot(四):利用devtools实现热部署,改动代码自动生效
- 技术控必看: RSA 2017 信息安全大会技术议程一览 | RSA 2017
- (五十九)自动存储、静态存储、动态存储
- F3PlotStrip
- SWFLibrary类加载外部资源库
- POJ-2584 T-Shirt Gumbo 最大流
- Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化