.mod.c 是什么文件

我们可以为代码清单4.1的模板编写一个简单的Makefile:

obj-m := hello.o

并使用如下命令编译Hello World模块:

       make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

       如果当前处于模块所在的目录,则以下命令与上述命令同等:

         make –C /usr/src/linux-2.6.15.5 M=$(pwd) modules

       其中-C后指定的是Linux内核源代码的目录,而M=后指定的是hello.c和Makefile所在的目录,编译结果如下:

[root@localhost driver_study]# make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

make: Entering directory `/usr/src/linux-2.6.15.5'

CC [M] /driver_study/hello.o

/driver_study/hello.c:18:35: warning: no newline at end of file

Building modules, stage 2.

MODPOST

CC      /driver_study/hello.mod.o

LD [M] /driver_study/hello.ko

make: Leaving directory `/usr/src/linux-2.6.15.5'

从中可以看出,编译过程中,经历了这样的步骤:先进入Linux内核所在的目录,并编译出hello.o文件,运行MODPOST会生成临时的hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录。

       中间生成的hello.mod.c文件的源代码如代码清单4.7所示。

代码清单4.7 模块编译时生成的.mod.c文件

1    #include <linux/module.h>

2    #include <linux/vermagic.h>

3    #include <linux/compiler.h>

4   

5    MODULE_INFO(vermagic, VERMAGIC_STRING);

6   

7    struct module __this_module

8    __attribute__((section(".gnu.linkonce.this_module"))) = {

9    .name = KBUILD_MODNAME,

10    .init = init_module,

11    #ifdef CONFIG_MODULE_UNLOAD

12    .exit = cleanup_module,

13    #endif

14    };

16    static const char __module_depends[]

17    __attribute_used__

18    __attribute__((section(".modinfo"))) =

19    "depends=";

hello.mod.o产生了ELF(Linux所采用的可执行/可连接的文件格式)的2个节,即modinfo和.gun.linkonce.this_module。

如果一个模块包括多个.c文件(如file1.c、file2.c),则应该以如下方式编写Makefile:

obj-m := modulename.o

modulename-objs := file1.o file2.o   

-----------------------------------------------------------------

http://blog.csdn.net/zhaokugua/archive/2007/11/02/1862500.aspx

4.9模块的编译

----------------------------------------------------------------------

2.4内核中,模块的编译只需内核源码头文件;需要在包含linux/modules.h之前定义MODULE;编译、连接后生成的内核模块后缀为.o。

2.6内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀为.ko;编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。

清单2:2.4 内核模块的Makefile模板

#Makefile2.4
KVER=$(shell uname -r)
KDIR=/lib/modules/$(KVER)/build
OBJS=mymodule.o
CFLAGS=-D__KERNEL__ -I$(KDIR)/include -DMODULE -D__KERNEL_SYSCALLS__ -DEXPORT_SYMTAB-O2 -fomit-frame-pointer  -Wall  -DMODVERSIONS -include $(KDIR)/include/linux/modversions.h
all: $(OBJS)
mymodule.o: file1.o file2.old -r -o $@ $^
clean:rm -f *.o

在2.4 内核下,内核模块的Makefile与普通用户程序的Makefile在结构和语法上都相同,但是必须在CFLAGS中定义-D__KERNEL__- DMODULE,指定内核头文件目录-I$(KDIR)/include。有一点需注意,之所以在CFLAGS中定义变量,而不是在模块源码文件中定义,一方面这些预定义变量可以被模块中所有源码文件可见,另一方面等价于将这些预定义变量定义在源码文件的起始位置。在模块编译中,对于这些全局的预定义变量,一般在CFLAGS中定义。


清单3:2.6 内核模块的Makefile模板

# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := file1.o file2.o
obj-m := mymodule.o 
else
PWD  := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:$(MAKE) -C $(KDIR) M=$(PWD) 
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
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语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o与file2.o 连接生成。obj-m := mymodule.o表示编译连接后将生成mymodule.o模块。

补充一点,"$(MAKE) -C $(KDIR) M=$(PWD)"与"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是较老的使用方法。推荐使用M而不是SUBDIRS,前者更明确。

通过以上比较可以看到,从Makefile编写来看,在2.6内核下,内核模块编译不必定义复杂的CFLAGS,而且模块中各文件依赖关系的表示简洁清晰。


清单4: 可同时在2.4 与 2.6 内核下工作的Makefile

#Makefile for 2.4 & 2.6
VERS26=$(findstring 2.6,$(shell uname -r))
MAKEDIR?=$(shell pwd)
ifeq ($(VERS26),2.6)
include $(MAKEDIR)/Makefile2.6
else
include $(MAKEDIR)/Makefile2.4
endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web Jersey_使用CXF和Jersey框架来进行Java的WebService编程

CXFCXF是在xfire的基础上实现的。1)首先呢&#xff0c;还是包的问题&#xff0c;在http://cxf.apache.org/download.html这里可以下到最新版的CXF&#xff0c;当然&#xff0c;我用的是最新版的。接下来还是那句废话&#xff0c;建WEB项目&#xff0c;放入JAR包。而JAR包我们就…

Binding是WPF的核心,WPF的常用数据源绑定有四种

Binding是WPF的核心&#xff0c;WPF的数据源有以下几种&#xff1a; 1、ADO.NET中的DataTable 2、xml数据源 3、object数据源 4、元素控件属性 详细说明见链接&#xff1a;http://www.cnblogs.com/linlf03/archive/2011/09/06/2168440.html 转载于:https://www.cnblogs.com/jun…

对 Linux 新手非常有用的 20 个命令

你打算从Windows换到Linux上来&#xff0c;还是你刚好换到Linux上来&#xff1f;哎哟&#xff01;&#xff01;&#xff01;我说什么呢&#xff0c;是什么原因你就出现在我的世界里了。从我以往的经验来说&#xff0c;当我刚使用Linux&#xff0c;命令&#xff0c;终端啊什么的…

java float什么类型数据类型_Java中的Float和double数据类型

浮点数据类型是单精度32位IEEE 754浮点数,双数据类型是双精度64位IEEE 754浮点数.这是什么意思&#xff1f;什么时候应该使用float而不是double,反之亦然&#xff1f;解决方法:总结一下&#xff1a;> float以32位表示,带有1个符号位,8位指数和23位有效数字(或者从科学数字符…

S3C2440与SDRAM的地址连线分析

S3C2440有27根地址线ADDR[26:0]&#xff0c;8根片选信号ngcs0-ngcs7,对应bank0-bank7&#xff0c;当访问bankx的地址空间&#xff0c;ngcsx引脚为低电平&#xff0c;选中外设。 2^272^7 * 2^10 * 2^10 128Mbyte 8*128Mbyte 1Gbyte 所以S3C2440总的寻址空间是1Gbyte。 市面…

java方法有excel实现_Java实现EXCEL操作(1)

Java实现EXCEL操作(1)1、实现方法&#xff1a;现在有三种方法去实现&#xff1a;jxl 、poi 、 FastExcel&#xff1a;97~2003在这里只讲poi实现方法。poi的包可以去Apache官网上去下载&#xff1a;http://poi.apache.org/download.html2、poi实现【1】低版本的导入导出方法&…

maven生成javadoc【原创】

1.命令模式&#xff1a; mvn javadoc:javadoc 2.eclipse下&#xff1a; 转载于:https://www.cnblogs.com/caiyuanzai/archive/2012/03/30/2425780.html

S3C2440_MMU

MMU,全称Memory Manage Unit, 中文名——存储器管理单元。 许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以 …

某单位会java_Java核心API -- 4(日期类)

1. Date类(Java.utilDate)java.util.Date类用于封装日期及时间信息&#xff0c;一般仅用它显示某个日期&#xff0c;不对他作任何操作处理&#xff0c;作处理用Calendar类&#xff0c;计算方便。//创建一个Date实例&#xff0c;默认的构造方法创建的日期代表当前系统时间Date d…

图片加到json中,提交到服务器端处理异常问题。

框架&#xff1a;phonegap.利用phonegap 的plungin 取到图片数据 &#xff0c;加到json中&#xff0c;利用jquery的ajax提交到服务器端&#xff0c;在服务器端解析并保存图片。但打开图片时&#xff0c;出现图片已被破坏的提示。或者有时候&#xff0c;提示json中有特殊字符。试…

s3c2440的内存管理机制

1. Nand Flash、Nor Flash、SDRAM地址区别 Nand Flash&#xff1a;ROM&#xff0c;容量大&#xff0c;适用于数据存储&#xff0c;ARM不能从Nand中直接启动&#xff0c;需要把程序从Nand的前4k空间中拷贝到SDRAM&#xff0c;然后再从SDRAM中启动。 Nor Flash&#xff1a;…

java阴阳师抽卡概率_《阴阳师》公布抽卡概率!看到数字我哭了

随着《文化部关于规范网络游戏运营加强事中事后监管工作的通知》(以下简称“通知”)的正式生效&#xff0c;网游与手游似乎也迎来了一个全新的时代&#xff0c;除了我们之前关注的游戏帐号实名制认证之外&#xff0c;道具的合成以及氪金抽卡概率问题也非常值得玩家注意&#xf…

基于easyX的颜色侵略小游戏

是挺久以前做的一个东西&#xff0c;突然想到放上来分享一下俺的拙作&#xff0c;纯原创。 利用二维数组对齐进行划分&#xff0c;并讲状态分为被侵略与未被侵略两种状态来记录。 在旧版的easyX可以运行。源码及exe下载 头文件&#xff1a; 1 #include <graphics.h> 2 …

JAVA中返回值为字母时_LeetCode#524通过删除字母匹配到字典里最长单词-java中CompareTo方法用法以及Comparator中Compare方法返回值...

import java.util.Collections;import java.util.Comparator;import java.util.List;/*524. 通过删除字母匹配到字典里最长单词给定一个字符串和一个字符串字典&#xff0c;找到字典里面最长的字符串&#xff0c;该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止…

记一次 IIS 7.0 身份验证相关的问题解决

今天项目发布到外网服务器后&#xff0c;由于项目需要读写图片&#xff0c;就需要读写图片服务器&#xff0c;上传图片时&#xff0c;老是报“没有权限”。于是&#xff0c;咨询专家后&#xff0c;找到了解决方案。 IIS 项目的属性 > 身份验证 > ASP.NET 模拟 > 启用 …

找了个学习uboot makefile的好地方 不过不让转载 那就把网址分享一下吧

http://haoyeren.blog.sohu.com/86590116.html http://blog.chinaunix.net/uid-20564848-id-3947194.html http://blog.sina.com.cn/s/articlelist_2314879471_0_1.html

关于JS中的constructor与prototype

在学习JS的面向对象过程中&#xff0c;一直对constructor与prototype感到很迷惑&#xff0c;看了一些博客与书籍&#xff0c;觉得自己弄明白了&#xff0c;现在记录如下&#xff1a; 我们都知道&#xff0c;在JS中有一个function的东西。一般人们叫它函数。比如下面的代码&…

java二级缓存技术_Java二级缓存

第一步所需导入架包log4j-api-2.10.0.jarlog4j-core-2.10.0.jarmybatis-3.4.1.jarmysql-connector-java-5.1.38.jar第二步开始配置数据库的连接br> "http://mybatis.org/dtd/mybatis-3-config.dtd">第三步(文件放在src根目录问件下)日志配置第四步&#xff…

resolv.conf

文件/etc/resolv.conf配置DNS客户&#xff0c;它包含了主机的域名搜索顺序和DNS服务器的地址&#xff0c;每一行应包含一个关键字和一个或多个的由空格隔开的参数。下面是一个例子文件&#xff1a; search mydom.edu.cnnameserver 210.34.0.14nameserver 210.34.0.2合法的参数及…

php mvc 路由,PHP手写MVC (五)—— 路由

路由是一个框架中必不可少的组件&#xff0c;其作用是把 URL 按照预定规则解析到特定控制器中。我们在这里定义了两种路由规则&#xff1a;查询字符串。在路径后面使用问号加参数&#xff0c;多个参数用 & 分隔。在配置文件使用 querystring 表示#控制器/方法?参数1值1&am…