一、准备工作

准备工作如何做,这里就不详说了。

a) 首先,你要有一台PC,装好了Linux。

b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。

c) 如果你是为当前PC机开发内核模块,那么准备工作就结束了。

如果你是为嵌入式系统Linux系统开发内核模块,则继续如下两步。

d) 安装好交叉编译工具链。例如,你的目标单板CPU可能是arm或mips等cpu,则安装相应的交叉编译工具链。安装后,需要将工具链路径添加到PATH环境变量中。例如,你安装的是arm工具链,那么你在shell中执行类似如下的命令,假如有类似的输出,就说明安装好了。

[root@localhost linux-2.6.33.i686]# arm-linux-gcc  --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

e) 如果是为嵌入式系统编译模块,则要下载所需的内核源码,配置好,并编译一次。否则,无法编译模块。如果您不熟悉如何配置编译内核,可以参考如下文章:

《linux 内核编译详解》

https://blog.csdn.net/whatday/article/details/101916293

二、编译

编译模块,总得来说,有如下两种方法。

(1)  独立编译

(2)  将模块代码集成到内核源码包中,跟随Linux内核一块编译

由于涉及多种场景,因此下文只介绍独立编译

为了行文方便,这里假定我们要编译的模块名称叫hello,并且模块的C文件所在目录为/root/hello。

(1) 独立编译

首先,在/root/hello中建立一个Makefile。

如果模块只有一个.c文件,那么文件名必须是hello.c。

此时,Makefile内容超级简单,全部内容就如下一行:

obj-m := hello.o

如果模块由多个.c文件构成,例如,main.c,a.c,b.c。

此时,Makefile的全部内容如下:

obj-m := hello.o
hello-objs := main.o a.o b.o

为了适应更通用的情况,这里再对此makefile做点解释。

obj-m是个makefile变量,他的值可以是一串.o文件的表列。

列表中的每一项,代表一个模块。

其实,我们可以通过一个makefile编译出多个模块。

例如,假设hello目录下存放了多个模块的C文件,别是hello、hello2、hello3。

hello模块的构成:main.c  a.c  b.c

hello2模块的构成:main2.c  a2.c  b2.c

hello3模块的构成:hello3.c

此时,Makefile写成如下形式即可。

obj-m := hello.o hello2.o hello3.o
hello-objs := main.o a.o b.o
hello2-objs := main2.o a2.o b2.o

有了Makefile,就可以编译了。

但是,模块与内核总是相配套的。编译模块,总离不开内核源码。

因此,我们首先要确定内核源码的路径。这个分两种情况。

(i)嵌入式系统

既然是自己下载的源码,当然知道路径。

(ii)当前PC机系统

对于当前PC机系统,我们在前面准备工作中并没有为之下载源码。这是为什么呢?因为PC机在安装Linux时,已经安装了一份内核源码树。这个内核源码树,并不是完整的内核源码,但他包含了内核源码头文件,配置文件,以及编译内核模块所需的其他信息。因此,对于编译模块,有这些就足够了。我们可以通过如下方法确定当前PC机内核源码树路径。

首先执行 uname -r 命令,得到当前PC机上运行的内核的版本号。

假设输出是:2.6.33.3-85.fc13.i686.PAE

那么内核源码树的路径就是

/lib/modules/2.6.33.3-85.fc13.i686.PAE/build

同时,可以得知当前PC机系统,所有模块都安装到如下路径中了。

/lib/modules/2.6.33.3-85.fc13.i686.PAE/kernel

那么,有了这些信息,就可以开始编译了。

a) 编译命令:

make -C  /path/to/kernel_src_dir   SUBDIRS=/root/hello   modules

假如只是为当前PC机运行的内核编译模块,且shell的当前工作目录就是/root/hello,那么命令可以简化为(后面的模块安装命令也可做类似的简化):

make  -C  /lib/modules/`uname -r`/build   SUBDIRS=`pwd`    modules

b) 模块安装命令:

假设这个模块是个网卡驱动。

(i)为当前pc安装模块

make -C  /path/to/kernel_src_dir   SUBDIRS=/root/hello   INSTALL_MOD_DIR=kernel/drivers/net    modules_install

上述命令执行后,模块就被安装到/lib/modules/2.6.33.3-85.fc13.i686.PAE/kernel/drivers/net目录中去了。

(ii)为嵌入式系统安装模块。假设kernel release version为x

make -C  /path/to/kernel_src_dir   SUBDIRS=/root/hello   INSTALL_MOD_PATH=/path/to/rootfs_dir  modules_install

上述命令执行后,模块就被安装到/path/to/rootfs_dir/lib/modules/x/kernel/drivers/net目录中去了。

c) 清除命令:

make -C  /path/to/kernel_src_dir   SUBDIRS=/root/hello  clean

最后,为了编译的方便,我们在/root/hello下增加一个easy_make,内容如下。

BASEDIR := /lib/modules/$(shell uname -r)
KERNEL_SRC_TREE ?= $(BASEDIR)/build
PWD :=$(shell pwd)
INSTALL_DIR ?= kernel/drivers/net.PHONY: all
all: clean modules installobj-m := hello.o hello2.o hello3.o
hello-objs := main.o a.o b.o
hello2-objs := main2.o a2.o b2.o.PHONY:modules
modules:
$(MAKE) -C $(KERNEL_SRC_TREE) SUBDIRS=$(PWD) modules
@echo $(abc-y).PHONY:clean
clean:
$(MAKE) -C $(KERNEL_SRC_TREE) SUBDIRS=$(PWD) clean.PHONY:install
install:
$(MAKE) -C $(KERNEL_SRC_TREE) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(INSTALL_DIR) modules_install

这样的话,我们以后只需要cd到/root/hello目录,简单的执行如下命令,就可以完成相应的操作了^_^

make  -f easy_make modulesmake -f easy_make  install make -f easy_make  clean

上述makefile默认是为当前PC机编译模块。如果想用他为嵌入式系统编译模块,则可以修改其中的KERNEL_SRC_TREE与INSTALL_DIR的值,或者直接从命令行传入。

linux 内核模块(驱动) 编译详解相关推荐

  1. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

  2. linux设备驱动总结,《Linux设备驱动开发详解(第3版)》海量更新总结

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux ...

  3. linux设备驱动开发详解 第三版,《Linux设备驱动开发详解(第3版)》进展同步更新...

    2014.8.25 目前初步完成2-11章以及第22章 <Linux设备驱动的调试>,相对于第2版,这几章主要的变更. 本博实时更新<Linux设备驱动开发详解(第3版)>的最 ...

  4. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...

  5. linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

    压缩包 : linux设备驱动开发详解光盘源码.rar 列表 19/busybox源代码/busybox-1.2.1.tar.bz2 19/MTD工具/mtd-utils-1.0.0.tar.gz 1 ...

  6. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  7. linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt

    PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...

  8. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)网购链接

    <Linux设备驱动开发详解:基于最新的Linux 4.0内核> china-pub   天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月 ...

  9. linux设备驱动开发详解孔夫子,Linux设备驱动开发详解

    [内容简介] <Linux设备驱动开发详解(第2版)>是一本介绍linux设备驱动开发理论.框架与实例的书,<Linux设备驱动开发详解(第2版)>基于ldd6410开发板,以 ...

最新文章

  1. ADO.NET 2.0 功能一览 --作者:Bob Beauchemin
  2. element selection选中变颜色_Excel | 聚光灯效果(阅读模式)——改变当前行和列的颜色...
  3. 列表输出循环左移_python 列表推导式(经典代码)(21)
  4. Python 获取 网卡 MAC 地址
  5. python提取xml的所有框坐标_python 提取批量xml文件中的坐标信息存入txt文件 xml文件转txt文件...
  6. Linux下的文件共享全攻略系列之二:NFS快速配置教程与安全策略
  7. Translatium for Mac(多语言在线翻译工具)
  8. 数字图像处理与分析_第一章
  9. 显示 think-cell 用户界面时出现错误
  10. BZOJ 1213 HNOI2004 高精度开根 二分+高(Py)精(thon)度
  11. 关于refresh token的总结
  12. 笔记本ubuntu安装xen之殇
  13. BCset BC set how entry is inserted to Database table when activated
  14. 中国蚁剑下载时,出现“无法成功完成操作,文件包含病毒或潜在的垃圾软件”报错的解决方案
  15. 查看及修改微软Edge浏览器用户数据保存位置(包括详细历史记录(页面停留时间,页面访问次数,最后访问时间,下载历史等),Cookie,书签等)
  16. CobaltStrike 部署
  17. 空压机远程监测及控制系统
  18. Oracle GoldenGate视频教程
  19. html怎么把元素垂直居中显示,分享html css元素垂直居中的几种方法
  20. 盘点欧洲常用的10种外贸收款工具!

热门文章

  1. Socket 网络编程实践经验
  2. 笔记 VRRP基本原理 主备备份 负载均衡
  3. uva10401Injured Queen Problem(递推)
  4. 数据安全(主从复制)
  5. Activiti工作流实战-2
  6. javascript如何判断变量的数据类型
  7. Tushare的安装
  8. SharePoint中的列表(List) 与Content Type 之五
  9. 软件测试工程师面试英语
  10. apache ab压力测试工具-批量压测脚本