内核模块3 | 学习笔记

简介: 快速学习内核模块3

开发者学堂课程【物联网开发-Linux 驱动开发实操演练:内核模块3】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/657/detail/10871


内核模块3


内容介绍:

一、编译工具

二、如何进行编译

三、内核编译的几种方法

四、外部编译

五、编译说明文档的介绍

六、编译 Makefile,并进行编译


一、编译工具

c 语言是一种编译型语言,c 语言源码写完之后,需要进行编译。在 Linux 里面,使用的是 gcc 编译器或交叉编译工具。

 

二、如何进行编译

编译内核代码需要使用内核的构建方法来构建内核模块,因为内核模块是基于内核来编写。

内核模块里面调用的函数,涉及的内容是由内核提供的,因此需要用到编写编译内核模块的 Makefile。

 

三、内核模块编译的几种方法

1. 内部编译

写的内核模块的源文件放在内核源码中进行编译。

2. 外部编译

将内核模块的源文件放在外面进行编译

3. 动态编译

编译生成动态模块xxx.ko

4. 静态编译

将内核模块编译进uImage中

5、几种方法的对比

用的较多的为外部编译,因为现在正处于开发阶段,编写完之后的理想状态是可以动态的加载和卸载。

如果将编译放在 uimage 里面,当需要进行调试的时候,就需要用到 uimage 倾向,操作更加繁琐。

如果编译生成一个模块,这样会更加灵活。例如,在调试的时候加载到内核,将内核卸载出来,再重新对这个内核进行编译,编译完在插入到内核里面,进行测试,更加符合当前的实际。

静态编译和内部编译需要修改里面的 Kconfig Makefile。修改完成后,需要去配置make menuconfig。

编译内核模块:

编译器:gcc 交叉编译工具

编写编译内核模块的 Makefile

内部编译:将内核模块源文件放在内核源码中进行编译

静态编译:将内核模块编译进 uImage 中

外部编译:将内核模块源文件放在内核源码外进行编译

动态编译:编译生成动态模块 xxx.ko

 

四、外部编译

关于内核如何编写,提供了一个说明文档,即内核源码:

进入内核源码之后,进入 document 之后,有一个文档目录:

image.png

文档里面有一个 kbuilds ls 的目录,有一个 modules.txt 文档:

此文档描述的是,在外部构建时,如何构建一个内核模块:

l Building External_Modules

3This document describes how to build an out-of-tree kernel module.

5 ===Table of Contents

7 === 1 Introduction

8 === 2 How to Build External Modules

9 --- 2.1 Command Syntax

0 --- 2.2 Options

1 --- 2.3 Targets

2 --- 2.4 Building Separate Files

3 === 3. Creating a Kbuild File for an External Module

4 --- 3.1 Shared Makefile

5 --- 3.2 Separate Kbuild file and Makefile

6 --- 3.3 Binary Blobs

7 --- 3.4 Building Multiple Modules

8 === 4. Include Files

9 --- 4.1 Kernel Includes

0 --- 4.2 Single Subdirectory

1 --- 4.3 Several Subdirectories

2 === 5. Module Installation

34 --- 5.1 INSTALL MOD PATH

--- 5.2 INSTALL MOD DIR

5 === 6. Module Versioning

6 --- 6.1 Symbols From the Kernel (vmlinux + modules)

78 --- 6.2 Symbols and External Modules

--- 6.3Symbols From Another External Module

9 ===7.Tips & Tricks

里面包含了介绍和每个命令的说明,最后也列举了一些例子。因此,可以根据说明文档去编译一个内核模块

 

五、编译说明文档的介绍

例如语句:

54 NOTE:"modules prepare" will not build Module.symvers even if

55 CONFIG MODVERSIONSis set;therefore, a full kernel build needs to be

56executed to make module versioning work.

57

58---2.1 Command Syntax

59

10 The command to build an external module is:

$ make -Ckpath to_kernel Src> M=SPWD

13

74 The kbuild system knows that an external module is being built

15 due to the "M=" option given in the command.

16

17 To build against the running kernel use:

18

19 s make -C /1ib/modules/`uname -r /build M=SPWD

30

31 Then to install the module(s) just built, add the target

32 "modules_install" to the command:

33

34 s make -C /lib/modules/ uname -r /build M=SPWD modules_install

35

36---2.2 Options

37

38 (SKDIR refers to the path of the kernel source directory.)

19

例如语句“”72    $ make -e  M=$pwd”

此语句是要执行一个 Makefile,-c 指的是到指定的路径下,去执行该路径的Makefile,M=$pwd 指向的是当前的路径。                                                

79   $ make -c /lib/modules/uname -r/build > M=$pwd

lib/modules/uname -r/build 为一个命令置换。将此条语句执行完之后,将输出结果放在此处。

3.2.0-29是当前版本,进入3.2.0-29,发现里面有一个 build。进入 build 之后,里面有一个目录:

image.png

上面为内核的目录结构。

如果需要将其编译到具体的平台上,用得到的内核源码,应该指定 /kernel-3.4-3.9

该文档中,还有许多的内核源码,都做了详细的说明。


六、编写Makefile,并进行编译

进行编译之后,生成一个.ko的模块,并测试能否使用。

1. 编写Makefile

编写一个目标,相当于一个伪目标,接下来编写规则,指定内核的路径:kernel.dir,制定M=$(PWD),执行PWD的命令,将结果赋值给当前变量。

编译目标,这个目标为 modules 的目标和一个 clear 的目标,使用内核的目录下去清除,即在 kernel 的命令去执行。

指定.to 是依赖于哪一个.o生成。此处为依赖于 demo.o 生成的文件。

1

2KERNDIR:= /lib/modules/3.2.0-29-generic-pae/build/

3 PWD:=$(shell pwd)

5 obi-m:=demo.o

7 all:

8 make -C $(KERNDIR) M=$(PWD) modules

10 clean:

11 make -C $(KERNDIR) M=$(PWD) clean

12

2. 编译Makefile

将 demo.c 复制后进行编译:

edu@edu-T:~/work/test$ 1s

demo.c Makefile

edu@edu-T:-/work/test make

make -C /lib/modules/3.2.0-29-generic-pae/build/ M=/home/edu/work/test modulesmake[1]:

正在进入目录

/usr/src/linux-headers-3.2.0-29-generic-pae

CC [M]/home/edu/work/test/demo.o

Building modules, stage 2.

MODPOST 1 modules

CC /home/edu/work/test/demo.mod.o

LD [M] /home/edu/work/test/demo.ko

make 1]:正在离开目录

/usr/src/iinux-headers-3.2.0-29-generic-pae'

edu@edu-T:~/work/test$

在当前目录下查看 demo.ko 的文件:

edu@edu-T:~/work/test 15:39  edu

edu@edu-T:-/work/test$ 1s

demo.c demo.ko demo.mod.c demo.mod.o demo.o Makefile modules.order Module.symvers

edu@edu-T:-/work/test$

对于当前的 demo.ko 来说,可以插入到当前乌班图的内核里面,和乌班图形成整体来运行。

相关文章
|
5月前
|
存储 监控 Cloud Native
云原生监控实战:Prometheus+Grafana打造RDS多维度预警体系
本方案构建了基于Prometheus与Thanos的云原生RDS监控体系,涵盖数据采集、存储、可视化与告警全流程。支持10万+QPS采集、90%存储压缩,具备<30秒告警延迟能力。通过自定义指标与智能预警策略,显著提升故障发现效率,实现分钟级响应。
449 5
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
《揭开DeepSeek神秘面纱:复杂逻辑推理背后的技术机制》
DeepSeek是一款基于Transformer架构的大语言模型,以其在复杂逻辑推理任务上的卓越表现成为行业焦点。它通过自注意力机制高效捕捉长距离依赖关系,结合强化学习优化推理策略,利用思维链技术拆解复杂问题,并经过多阶段训练与精调提升推理能力。此外,DeepSeek融合知识图谱和外部知识,拓宽推理边界,使其在处理专业领域问题时更加准确和全面。这些先进技术使DeepSeek能够像人类一样思考和推理,为解决复杂问题提供强大支持。
801 11
|
人工智能 自然语言处理 算法
人工智能与创意写作:未来文学的新篇章
本文探讨了人工智能在创意写作领域的应用及其对传统文学创作的影响。通过分析AI技术如何辅助作者生成文本、提升创作效率以及开拓新的文学形式,我们揭示了AI与人类作家之间的协作关系,并讨论了这种合作对未来文学作品风格和内容的可能影响。同时,文章也考虑了AI技术在文学创作中可能带来的挑战和伦理问题,为读者提供了关于科技与艺术融合的深入思考。
561 5
|
11月前
|
Java 数据库连接 Maven
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
1681 1
最新版 | SpringBoot3如何自定义starter(面试常考)
|
9月前
|
机器学习/深度学习 编解码 算法
《探秘目标检测算法:YOLO与Faster R-CNN的原理及发展之旅》
目标检测是计算机视觉的重要任务,旨在识别图像或视频中的目标及其类别。早期依赖滑动窗口和人工特征(如HOG、SIFT),结合SVM等分类器,但计算量大、精度有限。随着深度学习兴起,R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN)逐步引入CNN和区域提议网络(RPN),显著提升速度和精度。YOLO系列(v1-v8)将检测视为回归问题,直接预测边界框和类别,以速度快著称。近年,基于Transformer的DETR等模型崭露头角,利用自注意力机制捕捉全局信息。未来,目标检测将在精度、速度和泛化能力上取得更大突破。
498 16
|
10月前
|
数据采集 机器学习/深度学习 数据挖掘
清洗数据的魔法:让你的数据干净又整洁
清洗数据的魔法:让你的数据干净又整洁
752 2
|
11月前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
人工智能 小程序 搜索推荐
餐饮类小程序开发定制需要多少钱,费用是怎样的
餐饮小程序开发费用因需求、规模和复杂性而异。基础版约几千到万元,含菜品展示、在线点餐等功能;界面设计费几千到几万;服务器租赁年费几千到几万;维护更新费同水平。总成本通常在几万到几十万之间。选择开发商时要考虑实际需求、合同条款及付款方式。
如何制作Win10启动U盘启动盘iso镜像文件
如何制作Win10启动U盘启动盘iso镜像文件
如何制作Win10启动U盘启动盘iso镜像文件