0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式Linux模块编译步骤详细概述让你少走弯路

Q4MP_gh_c472c21 来源:未知 作者:易水寒 2018-08-12 10:56 次阅读

今天将直接了当的带你进入linux的模块编译,当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂。之所以要有这篇文章,主要是因为从书本上学的话,可能要花更长的时间才能学会整个过程,因为看书的话是一个学习过程,而本文更像是一个培训。所以实践性和总结性更强。读完本文后你将会学到编译一个模块和模块makefile的基本知识。以及加载(卸载)模块,查看系统消息的一些知识。如果你已经是一个linux模块编译高手,您也可以指点指点哪里说的不足。

第一步:准备源代码

首先我们还是要来编写一个符合linux格式的模块文件,这样我们才能开始我们的模块编译。假设我们有一个源文件mymod.c。它的源码如下:

mymod.c

1. #include /* 引入与模块相关的宏 */

2. #include /* 引入module_init() module_exit()函数 */

3. #include /* 引入module_param() */

4

5. MODULE_AUTHOR("Yu Qiang");

6. MODULE_LICENSE("GPL");

7

8. static int nbr = 10;

9. module_param(nbr, int, S_IRUGO);

10.

11. static int __init yuer_init(void)

12.{

13. int i;

14. for(i=0; i

15. {

16. printk(KERN_ALERT "Hello, How are you. %d ", i);

17. }

18. return 0;

19.}

20.

21.static void __exit yuer_exit(void)

22.{

23. printk(KERN_ALERT"I come from yuer's module, I have been unlad. ");

24.}

25.

26. module_init(yuer_init);

27. module_exit(yuer_exit);

我们的源文件就准备的差不多了,这就是一个linux下的模块的基本结构。第9行是导出我们的符号变量nbr。这样在你加载这个模块的时候可以动态修改这个变量的值。稍后将演示。yuer_init()函数将在模块加载的时候运行,通过输出的结果可以看到我们的模块是否加载成功。

第二步:编写Makefile文件

首先还是来看看我们Makefile的源文件,然后我们再来解释;

Makefile

obj-m := modules.o #要生成的模块名

modules-objs:= mymod.o #生成这个模块名所需要的目标文件

KDIR := /lib/modules/`uname -r`/build

PWD := $(shell pwd)

default:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions

现在我来说明一下这个Makefile。请记住是大写的Makefile而不是小写的makefile;

obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj-m := <模块名>.o

modules-objs :这个变量是说明声称模块modules需要的目标文件 格式要求 <模块名>-objs := <目标文件>

切记:模块的名字不能取与目标文件相同的名字。如在这里模块名不能取成 mymod;

KDIR :这是我们正在运行的操作系统内核编译目录。也就是编译模块需要的环境

M= :指定我们源文件的位置

PWD :这是当前工作路径$(shell )是make的一个内置函数。用来执行shell命令。

第三步:编译模块

现在我们已经准备好了我们所需要的源文件和相应的Makefile。我们现在就可以编译了。在终端进入源文件目录输入make

运行结果:

make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'

CC [M] /home/yuqiang/桌面/mymodule/mymodules.o

LD [M] /home/yuqiang/桌面/mymodule/modules.o

Building modules, stage 2.

MODPOST 1 modules

CC /home/yuqiang/桌面/mymodule/modules.mod.o

LD [M] /home/yuqiang/桌面/mymodule/modules.ko

make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'

第四步:加载/卸载我们的模块

从上面的编译中我可以看到。已经有一个modules.ko生成了。这就是我们的模块了。现在我们就可以来加载了。

首先在终端输入:sudo insmod modules.ko

现在我们来看看我们的模块加载成功没有呢?

在终端输入:dmesg | tail -12 这是查看内核输出信息的意思。tail -12 显示最后12条;

显示结果如下:

[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0

[18046.790019] usb 5-8: USB disconnect, address 9

[19934.224812] Hello, How are you. 0

[19934.224817] Hello, How are you. 1

[19934.224818] Hello, How are you. 2

[19934.224820] Hello, How are you. 3

[19934.224821] Hello, How are you. 4

[19934.224822] Hello, How are you. 5

[19934.224824] Hello, How are you. 6

[19934.224825] Hello, How are you. 7

[19934.224826] Hello, How are you. 8

[19934.224828] Hello, How are you. 9

看到了吧。我们的模块的初始化函数yuer_init();已经成功运行了。说明我们的模块已经加载成功;

现在我们再来卸载模块试试看。

在终端输入:sudo rmmod modules

在终端输入:dmesg | tail -3

[19934.224826] Hello, How are you. 8

[19934.224828] Hello, How are you. 9

[20412.046932] I come from yuer's module, I have been unlad.

可以从打印的信息中看到,我们的模块的退出函数已经被执行了。说明我们的模块已经被成功的卸载了。到目前位置我们就已经算是对模块的编译到编译运行算是有了一个整体上的认识了。对于以后深入的学习还是应该有点帮助的。下面我们将在看看于模块相关的一些简单的操作。

第五步:加载模块时传递参数

在终端输入:sudo insmod module_name.ko nbr=4

在终端输入:dmesg | tail -6

显示结果如下:

[20800.655694] Hello, How are you. 9

[21318.675593] I come from onefile module, I have been unlad.

[21334.425373] Hello, How are you. 0

[21334.425378] Hello, How are you. 1

[21334.425380] Hello, How are you. 2

[21334.425381] Hello, How are you. 3

这样我们就可以看到在模块加载的时候动态设置了我们的一个变量。初始化函数中的循环只执行了4次。

可能你会问我怎么知道一个模块可以设置那些变量呢。当然,你可以先不设变量加载一次。然后可以在终端输入ls /sys/module//parameters/来查看。在这里我们是这样输入的

在终端输入:ls /sys/moedle/modules/parameters/

显示结果:

nbr

如果我们的模块加载成功了。最后我们还可以通过modinfo来查看我们的模块信息。如下

在终端输入:sudo modinfo modules.ko

显示结果:

filename: modules.ko

license: GPL

author: Yu Qiang

srcversion: 20E9C3C4E02D130E6E92533

depends:

vermagic: 2.6.24-24-generic SMP mod_unload 586

parm: nbr:int

总结:

今天介绍的相关知识都好像有一点浅尝辙止的感觉。因为这里主要是通过一条线式方式来讲解了模块编写的相关过程,其实在这个过程中还有很多可以发散的地方。例如:

在写到MODULE_AUTHOR("Yu Qiang")的时候,你应该想到还有

MODULE_DESCRIPTION(模块用途的简单描述);

MODULE_VERSION(模块的版本字符串);

MODULE_ALIAS(模块的别名);

...

在写到module_param(nbr, int, S_IRUGO);的时候,你应该想到还有

EXPORT_SYMBOL(name); 可以导出模块的函数,这也是模块编写的最终目的

...

在用到insmod 和 modinfo的时候。你应该想到还有

depmod 分析可加载模块的依赖性,并生成modules.dep文件和映射文件

modprobe Linux内核添加删除模块

...

如果要成为一名专业的linux模块开发人员,还要走很多的路,就看各位的了,祝大家学习顺利。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303082
  • Linux
    +关注

    关注

    87

    文章

    11222

    浏览量

    208886
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    19161

原文标题:少走弯路系列!嵌入式Linux 模块编译步骤入门

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    <新手求教嵌入式的学习路线>

    本人想从事嵌入式开发,但是自己现在只有C、51单片机、模电、数电、verilog的功底。现在想学习嵌入式,只知道要先从LINUX开始,其他一头雾水。求过来人给点建议,先学什么再学什么,有哪些书,也就是学习路线,好
    发表于 08-15 09:34

    嵌入式工作的前辈带我,小弟想入行,求前辈带

    小弟年龄比较大了,现在自学Linux,和一些基础的嵌入式知识,学习的热情肯定有的,但是我想找一位从事嵌入式的前辈指导下,不胜感谢,希望指导我可以我在学习的道路上
    发表于 03-01 19:18

    嵌入式系统入门需要哪些器材

    嵌入式系统入门需要哪些器材?球高手推荐,希望少走弯路
    发表于 11-05 00:46

    少走弯路Linux编程思想转变

    为基于Linux操作系统编程,讲这个思想转变的书几乎没有,初学者走了很多弯路,撞了很多难墙。笔者因此写上自己的学习心得,希望能给和我一样转变做嵌入式
    发表于 12-30 10:10

    少走弯路系列!嵌入式Linux下 u***驱动开发方法

    嵌入式Linux下的u***属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至少需要个把月的时间,不信?那是没做过。本人做过2年的嵌入式驱动开发,u***占了一大半的时间。期间
    发表于 04-06 11:15

    快速学习C语言的途径,少走弯路

    `快速学习C语言的途径,少走弯路 标准C语言能干什么? 坦白讲,在今天软件已经发展了半个多世纪,单纯的C语言什么都干不了。标准C语言库只提供了一些通用的逻辑运算方法以及字符串处理,当然字符串在C
    发表于 10-19 10:51

    新人来咯,刚刚学labview有什么建议少走弯路吗?

    我刚刚来发烧友,对这不是很熟,刚刚学labview,大家有什么建议少走弯路吗?还有什么办法赚到更多的币,不然下载不了东西
    发表于 03-15 16:30

    少走弯路!分享PCB设计中的布线经验

    少走弯路!分享PCB设计中的布线经验。
    发表于 04-25 09:31

    提高单片机抗干扰能力,的设计少走弯路

    如何提高单片机抗干扰少走弯路 搞过产品的朋友都有体会,一个设计看似简单,硬件设计和代码编写很快就搞定,但在调试过程中却或多或少的意外,这些都是抗干扰能力不够的体现。 下面讨论一下如何
    发表于 10-13 22:21 946次阅读

    热水器安装有窍门 注意这些事项能让少走弯路

    热水器是家庭常备家电之一,不过常听有人抱怨热水器没安装好,叫人上门安装还很贵,这热水器安装到底有什么讲究?今天咱们就一次性来说清楚,大家少走弯路
    发表于 04-16 17:17 1765次阅读

    STM32嵌入式入门必看之文章给你详细的讲解

    STM32嵌入式入门必看之文章-----介绍非常详细!(学习STM32的理由!!!!)为什么要写这篇文章呢?这是一篇关于嵌入式入门的文章,因为我在进入嵌入式这个领域之前,也是遇到过非常
    发表于 06-18 16:52 20次下载

    嵌入式linux编译 ko,嵌入式linux:编译linux驱动模块

    嵌入式系统应用中,嵌入式linux是非常重要的一个方面,而linux驱动编译又是嵌入式
    发表于 11-01 16:31 9次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>编译</b> ko,<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>:<b class='flag-5'>编译</b><b class='flag-5'>linux</b>驱动<b class='flag-5'>模块</b>

    Linux嵌入式Linux系统的移植(上篇:交叉编译器、连接方式)

    的移植要点搭建交叉开发环境bootloader的选择与移植kernel的设置、编译、移植和调试根文件系统的制作嵌入式Linux系统的移植基本步骤确定目标机、主机的连接方式安装交叉
    发表于 11-01 16:57 14次下载
    【<b class='flag-5'>Linux</b>】<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系统的移植(上篇:交叉<b class='flag-5'>编译</b>器、连接方式)

    示波器校准的步骤,熟知10步,少走弯路

    很多人对于示波器校准还不是很清楚,下面安泰维修专业从事仪器仪表维修工程师带大家了解一下关于示波器校准的10个具体步骤少走弯路!有需要的朋友可以阅读全文! 一)测试
    的头像 发表于 11-10 17:04 3.4w次阅读
    示波器校准的<b class='flag-5'>步骤</b>,熟知10步,<b class='flag-5'>让</b><b class='flag-5'>你</b><b class='flag-5'>少走弯路</b>!

    硬件电路设计有这么多坑,如何少走弯路?看大牛怎么说

    硬件电路设计有这么多坑,如何少走弯路?看大牛怎么说
    的头像 发表于 11-27 17:34 606次阅读