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内核模块编译相关推荐

  1. c需要实现安装卸载Linux模块,Linux内核模块编译与加载

    Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用所需要的组件? 方法一: 把所有的组件都编译进内核文件,即Zlmage或bzlmage,但会导致两个问题:一是生成的内核文件过大:二是如 ...

  2. LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译

    本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用.功能及基本编程方法,以便于读者能快速理解什么是Linux内核,能看懂Linux内核. 拥有超过1300万行的代码,Linux ...

  3. 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: ...

  4. linux内核编译ccflag,Linux内核模块编译失败

    我的上一次内核开发是在2.6~版本中 现在我尝试编译一个模块,在内核树外编译时出现以下错误. /bin/sh: 1: /home/blabla/workspace/kernel35/linux-3.5 ...

  5. 杭电操作系统实验二---linux内核模块编译(完整实验报告)

    一 题目介绍 题目内容: (1)当模块被载入内核时会向系统日志文件中写入"hello,world":当被卸载时,会向系统写入"goodbye". (2)设计一个 ...

  6. linux内核模块编译出现找不到include/generated/asm/unistd_32.h” 问题解决

    模块编译的时候出现该错误,Makefile如下,结果是M= 赋值出错(空值或者有空格).更改之后没问题. $(MAKE) -C $(KERNEL_DIR) M=${PWD} modules

  7. linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点

    描述 1.1 Linux内核模块介绍1.1.1 Linux内核模块概述 嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性--用户只需要拿到相关驱动模块,再插入到用户的内 ...

  8. linux 内核模块(驱动) 编译详解

    一.准备工作 准备工作如何做,这里就不详说了. a) 首先,你要有一台PC,装好了Linux. b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的).make.ncurse ...

  9. linux内核编译与内核模块

    linux内核简介.配置编译与内核模块 Linux系统架构 主要分为用户空间和内核空间.用户空间包括应用程序和C库等.内核空间包括系统调用接口,linux内核以及体系结构相关代码.关于linux要区分 ...

最新文章

  1. HarmonyOS之AI能力·文档检测校正
  2. Python 的字符串转int
  3. ui和ux的区别_UI和UX之间的区别
  4. 工作145:vue里面取消console和debugger
  5. 冈萨雷斯《数字图像处理》读书笔记(九)——形态学图像处理
  6. 终于看到这么贱的星座分析了
  7. 项目管理工具project软件学习(一) - 项目信息设置
  8. 02.C(数据类型与运算符)
  9. Hadoop笔记整理(二):HDFS
  10. 看某帖有感(敬告我,以及我亲爱的朋友们)
  11. phpdesigner 的配置
  12. operating system not found的问题的解决办法 ---设置活动分区
  13. html 手机底部广告,手机网站被UC浏览器强制嵌入推荐广告解决方案
  14. 时间管理Smart法则,一个在高盛工作的学姐总结的12个时间管理妙招
  15. 4G模块ME909S-821调试记录
  16. 文档级关系抽取:A Densely Connected Criss-Cross Attention Network for Document-level Relation Extraction
  17. RPC VS REST
  18. C++Primer第五版 第十二章习题答案(1~10)
  19. HTMLcss怎样让文字覆盖在图片上面,图片上加字
  20. 从rookie到基佬~009:无密码卸载Symantec

热门文章

  1. maven学习十之myEclipse搭建maven项目总结
  2. 2019年值得关注的八大DevOps趋势
  3. Windows 环境下安装redis 及其PHP Redis扩展
  4. Spring Boot(四):利用devtools实现热部署,改动代码自动生效
  5. 技术控必看: RSA 2017 信息安全大会技术议程一览 | RSA 2017
  6. (五十九)自动存储、静态存储、动态存储
  7. F3PlotStrip
  8. SWFLibrary类加载外部资源库
  9. POJ-2584 T-Shirt Gumbo 最大流
  10. Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化