1.makefile

1.1.modules模块上层makefile

1.2.内核模块makefile

2. makefile解析

2.1 定义变量:

KERNELDIR内核top makefile所在路径。

CURRENT_PATH模块所在的文件夹路径。

ATOS_KCROSS_COMPILE定义编译工具链。

ATOS_ARCH定义当前的目标架构平台。

INCLUDE内核中应用的头文件所在的路径。

EXTRA_CFLAGS表示在编译模块时,需要添加的目录。编译器会从这些目录中找到所需要的头文件。

补充:如果在模块中引用了其他模块导出到内核符号表的函数,则需要包含该模块产生的符号表文件Module.sysvers。例如,modules模块中如果引用了同级文件夹中另一模块的函数则需要在modules模块makefile增加这一行定义:KBUILD_EXTRA_SYMBOL=$(obj)/../add_sub/Module.symvers

2.2 指定编译的目标文件

obj-m:=peripheral_modules.o表示把文件peripheral_modules.o作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 "peripheral_modules.ko" 文件;

如果有一个模块名为 peripheral_modules.ko, 是来自多个源文件(如 file1.c 和 file2.c ), 正确的书写应当是:

obj-m := peripheral_modules.o

peripheral_modules-objs := file1.o file2.o

第19行即是定义模块peripheral_modules.ko 。

2.3 模块编译

第10行 ~ 11行,编译模块。

2.4 模块装载

第12行 ~ 13行,modules_install指令是把编译的ko拷贝到根目录下的/lib/modules/4.1.15/目录中。指定的安装目录主要是为了放置需要安装的镜像和map(符号表)文件,系统的启动需要这些文件的参与。

2.5 清除编译中间文件和编译结果

第15行 ~ 16行,modules_install指令是清除编译中间文件和编译结果。相当于以下指令:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

2.6 PHONY

.PHONY是一个伪目标,可以防止在Makefile中定义的目标和工作目录下的实际文件出现名字冲突,提高执行makefile时的效率。

2.6 makefile执行逻辑

这个 makefile 在一次执行中要被读 2 次。

KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读入、执行ifeq之后的内容,如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KERNELDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(CURRENT_PATH) 表明返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,make将继续读取else之后的内容。else之后的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名,kbuild被启动去解析kbuild语法的语句。obj-m := peripheral_modules.o表示编译连接后将生成peripheral_modules.ko模块。

3. obj-m等在/kbuild/modules.txt中的定义

3.1  obj-m := <module_name>.o

在modules.txt中提到:

The kbuild system will build <module_name>.o from <module_name>.c,

and, after linking, will result in the kernel module <module_name>.ko.

The above line can be put in either a "Kbuild" file or a "Makefile."

When the module is built from multiple sources, an additional line is

needed listing the files:

<module_name>-y := <src1>.o <src2>.o ...

3.2  -C $KDIR and M=$PWD

-C $KDIR

The directory where the kernel source is located.

"make" will actually change to the specified directory

when executing and will change back when finished.

M=$PWD

Informs kbuild that an external module is being built.

The value given to "M" is the absolute path of the

directory where the external module (kbuild file) is

located.

3.3  modules

When building an external module, only a subset of the "make"targets are available.

make -C $KDIR M=$PWD [target]

The default will build the module(s) located in the current

directory, so a target does not need to be specified. All

output files will also be generated in this directory. No

attempts are made to update the kernel source, and it is a

precondition that a successful "make" has been executed for the

kernel.

modules

The default target for external modules. It has the

same functionality as if no target was specified. See

description above.

3.4  modules_install

Install the external module(s). The default location is

/lib/modules/<kernel_release>/extra/, but a prefix may

be added with INSTALL_MOD_PATH (discussed in section 5).

3.5  clean

Remove all generated files in the module directory only.

3.6  help

List the available targets for external modules.

参考:https://blog.csdn.net/u012247418/article/details/83684214

Linux驱动模块编译相关推荐

  1. linux驱动模块编译(初学者)

    linux 模块编译步骤(转) 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花 ...

  2. Linux驱动模块编译进内核中

    BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在 ...

  3. linux驱动模块编译入内核,Linux内核驱动模块编译

    内核模块的构建有两种主要方式:放在内核源码树中或者放在内核代码外. 一.放在内核源码树中 在内核的drivers/文件夹下创建好驱动模块文件夹,并完成驱动文件之后,需要编辑和修改相应的Kconfig和 ...

  4. Linux驱动模块编译报错 ‘init_module‘ specifies less restrictive attribute than its target

    在学习写Linux模块驱动的时候写了个demo,分别在自己的电脑和RockPi4B上分别尝试运行,在自己电脑上能顺利运行,但是在RockPi4B上编译时却发生如下报错 编译报错 include/lin ...

  5. 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理

    第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...

  6. Linux下编译build的命令,Linux内核编译中build目录设置

    配置参数 最近在分析yocto中名为poky的嵌入式自动构建系统.在对内核进行定制的时候,看到了一个在进行内核编译时挺有用的特性,之前(作为野生程序员的我)一直没有发现. 该特性就是将源码与编译工作目 ...

  7. Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)

    对树莓派内核源码进行配置后,下一步要进行树莓派Linux内核编译 以下步骤均在PC端虚拟机上完成 准备材料:PC端虚拟机.树莓派交叉编译工具.树莓派内核(交叉编译工具.内核下载步骤见树莓派内核源码) ...

  8. 树莓派-linux内核编译

    树莓派-linux内核编译 装虚拟机[^1] 配置共享文件夹 配置交叉编译工具 下载树莓派linux系统内核[^3] 树莓派等芯片带操作系统的启动过程 树莓派linux源码目录树 树莓派linux源码 ...

  9. linux的驱动模块,ubuntu linux 驱动模块的使用

    ubuntu linux 驱动模块的使用 发布时间:2007-05-07 00:50:16来源:红联作者:Bnciwoz linux是基于模块的,所有的驱动都是模块化的: 管理模块的命令: 1. 列出 ...

最新文章

  1. RDKit | 基于RDKit从分子中提取3D药效团特征
  2. python如何测试仪器_使用python检测一个设备是否ping的通
  3. everything下载哪个版本_Everything敏感信息泄露
  4. Atitit 软件与互联网理论 attilax总结
  5. 简单介绍小系统车载中控导航上蓝牙模块
  6. 设有单总线结构计算机的cpu数据通路,中央处理器——数据通路之单总线结构
  7. 【科普】当手机遭遇短信验证码轰炸,这几点尤其要注意
  8. 什么是DNS污染?DNS污染的解决方法
  9. 排序算法中的LowB三人组
  10. SDN网络中控制器RYU的安装
  11. 2401C可解RFX2401C缺货的燃眉之急,也可直接诶替代CC2592/CC2591
  12. python爬取京东商品代码_Python简单爬取京东商品列表
  13. 线上tomcat服务器假死排查
  14. 关于手机设置高对比度文字对app的影响及解决方案
  15. 简单而有韵味,让你get最浪漫的表白编程代码大全
  16. Redis String命令大全
  17. PTA 1056 Mice and Rice (25分)
  18. Mac 环境下 Java JDK 的安装与环境变量配置详解(已完美解决)
  19. TCP/IP四层模型及功能
  20. 媒体盘点春晚奥斯卡 各个获奖人物

热门文章

  1. 钢板弹簧的设计(说明书+9张CAD图纸)
  2. 【数据科学赛】大规模细粒度建筑分类 #图像分类 #建筑分割和高度预估 #$1,6000
  3. 粗加工时必须尽量选用大直径的R6刀具(如63R6)
  4. 农村土地确权之数据入库 —— 苍穹软件数据入库说明
  5. QEMU模拟器启arm64 ATF(arm trust firmware) BL1, uboot方法
  6. Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调
  7. VC----实现汉字简繁转换
  8. Ubuntu小小白的碎碎记录【conda篇】
  9. 2023春季美赛(MCM/ICM)问题Y:了解二手帆船的价格
  10. OWASP ZAP mac版Chrome代理配置