Hello, world!/n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

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

3天内不再提示

Linux内核模块介绍,使用Linux模块的优点

嵌入式单片机 来源:未知 作者:李倩 2018-03-30 15:53 次阅读

1.1Linux内核模块介绍1.1.1Linux内核模块概述

嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性——用户只需要拿到相关驱动模块,再插入到用户的内核中,即可灵活地使用你的设备。

1.1.2使用Linux模块的优点

1. 用户可以随时扩展Linux系统的功能。

2. 当要修改当前Linux系统的驱动时,只需要卸载旧模块,编译目标驱动模块,重新安装插入即可。

3. 系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可。

4. 减小Linux内核的体积,节省flash。

1.2Linux模块入门1.2.1模块相关命令1.2.1.1 Linux模块命令详细介绍

1. 模块安装命令:insmod

insmod xxxx.ko

2. 查看当前已经安装模块:lsmod

lsmod 不需要参数

3. 模块卸载命令:rmmod

rmmod xxxxx.ko

4. 查看模块信息:modinfo

在X86上操作:

[root@zhifachen linux-3.5]# modinfo/root/work/rootfs/home/mod/tiny4412_hello_module.ko

filename: /root/work/rootfs/home/mod/tiny4412_hello_module.ko

license: GPL

depends:

intree: Y

vermagic: 3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8

[root@zhifachen linux-3.5]#

1.2.1.2 Linux模块命令测试示例

注意:模块的编译是依赖具体一份源码,并且这份被编译过,并且没有使用mrproper,distclean清除的源码工程。

1.2.2使用makemodules编译内核源码树中的模块

1. 添加内核菜单

2. make menuconfig 配置为 M

3. 在顶层目录终端输入makemodules

直接make 也可生成模块文件(.ko),也会生成zImage,当你只想编译模块而不想编译zImage时候使用 make modules 命令会更加快速。

1.2.3把内核源码树中模块源文件编译到内核映像中

如果不需要配置菜单只想编译代码到内核zImage,Makefile可以这样写obj-y += xxxx.o

如果不需要配置菜单只想编译代码为外部模块,Makefile可以这样写 obj-m+= xxxx.o

1.2.4在内核源码中添加自定义的模块并且编译1.2.5外部独立Makefile编译模块

在驱动开发阶段,接触到新驱动机率非常高,如果都要去修改内核源码Makefile, 太过于繁杂,也不利于移植,实际开发中会使用另外一种方法来编译模块文件。

1.2.5.1 Linux内核模块代码文件模板

可以直接复制内核源码中自带的示例模板来测试:drivers/char/tiny4412_hello_module.c

1.2.5.2 Linux内核模块编译Makefile模板

编译模块Makefile文件:

obj-m += xyd_hello_module.o
all:
@make -C /root/work/linux-3.5/ M=$(PWD) modules
@rm -rf *.o *.mod.c modules.order Module.symvers *~ *.bak
clean:
@rm -rf *.o *.mod.c modules.order Module.symvers *.ko *~ *.bak

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

M=选项让该Makefile在构造modules目标之前返回到模块源代码目录,然后modules目标指向obj-m变量中设定的模块;在上面的例子中,我们将该变量设置成了module.o。

上面的清除规则是自己写的,也可利用内核Makefile清除规则来清编译生成目标文件,改进后代码:

obj-m += xyd_hello_module.o
# x86 编译时候使用: uname -r 得到当前内核的版本号
#KDIR := /lib/modules/`uname -r`/build
#arm 编译时候使用
KDIR :=/root/work/linux-3.5
all:
@make -C $(KDIR) M=$(PWD) modules
clean:
@make -C $(KDIR) M=$(PWD) modules clean
@rm -f *.ko.unsigned *~

1.1.1Linux内核printk函数

内核中不能使用printf函数输出信息,要使用printk函数,这个函数有输出等级控制的。

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6>Hello, world!/n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。

#defineKERN_EMERG "<0>" /* system is unusable 系统不可用*/

#defineKERN_ALERT "<1>" /* action must be takenimmediately警报,必须立即采取行动*/

#define KERN_CRIT "<2>" /*critical conditions临界状态 */

#defineKERN_ERR "<3>" /* error conditions 错误状态*/

#defineKERN_WARNING "<4>" /* warningconditions警告状态*/

#defineKERN_NOTICE "<5>" /* normal but significant正常的,但引人注目*/

#define KERN_INFO "<6>" /*informational 信息*/

#defineKERN_DEBUG "<7>" /* debug-level messages调试等级信息 */

可以通过查看/proc/sys/kernel/printk文件内容知道设置信息。

[root@ChenZhiFa/]# cat /proc/sys/kernel/printk

7 4 1 7

可以通过echo命令修改种个等级:

[root@ChenZhiFa/]# echo 4 4 1 7 > /proc/sys/kernel/printk

说明:直接使用printk( “kkkk”);这样没有指明等级,这种未明确指定。

只有等级比较当前终端等级高才会在终端上显示出来。

以下进行X86 系统上的测试(在纯字符界面下测试有效,在图形界面中是无效)

在图形界面系统中按Ctl + Alt + F2(F2~F6键其中一个,不同电脑可能不同),可以进入到纯字符界面,要返回按Ctl +Alt + F1(不同电脑可能不同)

printk --- 不支持浮点数,实际上驱动程序也不支持浮点运算。所有浮点运算应该放在用户空间。

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

    关注

    7

    文章

    2439

    浏览量

    46390
  • Linux
    +关注

    关注

    87

    文章

    10942

    浏览量

    206545

原文标题:1.1 Linux内核模块介绍1.1.1 Linux内核模块概述

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

收藏 人收藏

    评论

    相关推荐

    Linux 内核模块工作原理及内核模块编译案例

    一个内核模块至少包含两个函数,模块被加载时执行的初始化函数init_module()和模块被卸载时执行的结束函数cleanup_module()。
    发表于 09-23 09:39 2277次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>内核模块</b>工作原理及<b class='flag-5'>内核模块</b>编译案例

    详解Linux内核模块的编写方法

    Linux 系统为应用程序提供了功能强大且容易扩展的 API,但在某些情况下,这还远远不够。与硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块
    的头像 发表于 05-11 08:55 3502次阅读

    Linux内核模块间通讯方法

    Linux内核模块间通讯方法非常的多,最便捷的方法莫过于函数或变量符号导出,然后直接调用。默认情况下,模块模块之间、模块
    发表于 06-07 16:23 1535次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核模块</b>间通讯方法

    RZ/G2L Linux系统如何添加新的内核模块

    RZ/G2L Linux系统的镜像基于yocto构建,本篇介绍如何添加新的内核模块
    的头像 发表于 01-04 12:19 886次阅读
    RZ/G2L <b class='flag-5'>Linux</b>系统如何添加新的<b class='flag-5'>内核模块</b>

    Linux内核模块程序结构

    Linux设备驱动会以内核模块的形式出现,因此,学会编写Linux内核模块编程是学习Linux设备驱动的先决条件。一个
    发表于 05-27 09:36

    Linux内核模块简介

    Linux内核模块简介http://bbs.edu118.com/forum.php?mod=viewthread&tid=388&fromuid=204(出处: 信盈达IT技术社
    发表于 08-22 09:22

    高效学习Linux内核——内核模块编译

    内核是世界上最大的开源项目之一,但是内核是什么,它用于什么?一、什么是linux内核模块内核是与计算机硬件接口的易替换软件的最低级别。它负
    发表于 09-24 09:11

    Linux内核模块的相关资料分享

    这里给出一个Linux内核模块的最简单的示例程序,当然,真实的驱动程序要比这个复杂。#include #include static int xxx_init(void){ printk(KERN_INFO "Hello Linux
    发表于 12-20 07:29

    Linux设备驱动开发详解》第4章、Linux内核模块

    Linux设备驱动开发详解》第4章、Linux内核模块
    发表于 10-27 14:15 0次下载
    《<b class='flag-5'>Linux</b>设备驱动开发详解》第4章、<b class='flag-5'>Linux</b><b class='flag-5'>内核模块</b>

    什么是内核模块?如何编写一个简单的模块

    内核模块Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块
    发表于 08-24 17:15 20次下载

    什么是 Linux 内核模块?

    lsmod 命令能够告诉你当前系统上加载了哪些内核模块,以及关于使用它们的一些有趣的细节。
    的头像 发表于 08-09 17:01 2958次阅读

    嵌入式LINUX系统内核内核模块调试教程

    本文档的主要内容详细介绍的是嵌入式LINUX系统内核内核模块调试教程。
    发表于 11-06 17:32 21次下载
    嵌入式<b class='flag-5'>LINUX</b>系统<b class='flag-5'>内核</b>和<b class='flag-5'>内核模块</b>调试教程

    如何在Petalinux创建Linux内核模块

    --enable”,能创建Linux内核模块,包括c源代码文件,Makefile,Yocto的bb文件。相关文件放在目录“ project-spec / meta-user / recipes-modules
    的头像 发表于 03-02 11:10 3874次阅读

    嵌入式LINUX系统内核内核模块调试

    嵌入式LINUX系统内核内核模块调试(嵌入式开发和硬件开发)-嵌入式LINUX系统内核内核模块
    发表于 07-30 13:55 9次下载
    嵌入式<b class='flag-5'>LINUX</b>系统<b class='flag-5'>内核</b>和<b class='flag-5'>内核模块</b>调试

    Linux内核模块参数传递与sysfs文件系统

    函数传参的内核传参机制,编写内核程序时只要实现传参接口,用户在加载内核模块时即可传入指定参数,使得内核模块更加灵活。
    发表于 06-07 16:23 1255次阅读