嵌入式Linux:简单的模块源码分析

2023-10-28

目录

1.常用命令:

2.insmod与module_init宏

这里还有一个知识点:函数修饰符

3.模块的版本信息查看:

模块中常用宏

 printk函数:(调试程序是可以用到)

打印机别:0-7

关于驱动模块中的头文件


1.常用命令:

lsmod(list module,将模块列表显示):功能是打印出当前内核中已经安装了哪些模块

分别为:模块名、大小以及被谁所使用。

insmod(install module,安装模块):功能是向当前内核中去安装一个模块,用法是insmod xxx.ko

modinfo(module information,模块信息):功能是打印出一个内核模块的自带信息。,用法是modinfo xxx.ko

rmmod(remove module,卸载模块):功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,不能加.ko后缀)

modprobe和depmod以后再说

2.insmod与module_init宏

module_int宏的作用是:将这个代码里的chrdev_init函数与insmod进行绑定,也就是说,当我们执行insmod xxx.ko时,实际上就是进行调用chrdev_init函数。

按照这样子的分析:那insmod时就应该能看到chrdev_init中使用printk打印出来的一个chrdev_init字符串,但是实际没看到。原因是ubuntu中拦截了,要怎么才能看到呢?在ubuntu中使用dmesg命令就可以看到了。 

其次呢这里有一点:static的作用是将函数的连接属性从全局变为内部链接属性(防止在其他文件中出现同名的函数造成的冲突)(一般一个项目里,一个函数不被外界使用,只在内部使用,加上static)

这里还有一个知识点:函数修饰符

  • __init,本质上是个宏定义
  • __exit

3.模块的版本信息查看:

(1)使用modinfo查看模块的版本信息

(2)内核zImage中也有一个确定的版本信息

(3)insmod时模块的vermagic必须和内核的相同,否则不能安装,报错信息为:insmod: ERROR: could not insert module module_test.ko: Invalid module format

(4)模块的版本信息是为了保证模块和内核的兼容性,是一种安全措施

(5)如何保证模块的vermagic和内核的vermagic一致?编译模块的内核源码树就是我们编译正在运行的这个内核的那个内核源码树即可。说白了就是模块和内核要同出一门。

4.模块中常用宏

(1)MODULE_LICENSE,模块的许可证。一般声明为GPL许可证,而且最好不要少,否则可能会出现莫名其妙的错误(譬如一些明显存在的函数提升找不到)。

(2)MODULE_AUTHOR  模块的作者

(3)MODULE_DESCRIPTION   模块介绍

(4)MODULE_ALIAS  模块别名

5.printk函数:(调试程序是可以用到)

和printk函数是在内核源码钟用来打印学习的函数,用法和printf非常像

但是有区别:

1.

  • printf是C库函数,是在应用层编程中使用的,不能在linux内核源代码中使用;
  • printk是linux内核源代码中自己封装出来的一个打印函数,是内核源码中的一个普通函数,只能在内核源码范围内使用,不能在应用编程中使用。

2.

  • printk相比printf多了一个“打印级别的设置”,用来控制printk打印的这条信息是否在终端上显示
  • 在应用程序中,调试信息要么全都打开,要么全都关闭。(一般用DEBUG宏来实现)
  • 但是在内核中,因为内核非常庞大,打印信息非常多,有时候整体调试内核时打印信息要么太多找不到想要的要么一个没有,没法调试。所以才有了打印级别这个概念。

 打印机别:0-7

查看:

cat /proc/sys/kernel/printk

修改:

echo 4 >/proc/sys/kernel/printk

 PS:修改的时候如果出现:bash: /proc/sys/kernel/printk: Permission denied的错误

原因分析:因为重定向符号 “>” 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,
但是没有让 “>” 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。

解决:提升shell 权限。

sudo -s        //提到root 权限。提示符为#

当你觉得该退回到普通权限时

sudo su username //退回到username 权限,提示符为$

好啦~~,回到正题:

操作系统的命令行中也有一个打印信息级别属性,值为0-7。当前操作系统中执行printk的时候会去对比printk中的打印级别和我的命令行中设置的打印级别,小于我的命令行设置级别的信息会被放行打印出来,大于的就被拦截的。譬如我的ubuntu中的打印级别默认是4,那么printk中设置的级别比4小的就能打印出来,比4大的就不能打印出来。

但是,ubuntu中这个printk的打印级别控制没法实践,ubuntu中不管你把级别怎么设置都不能直接打印出来,必须dmesg去查看。

6.关于驱动模块中的头文件

我们编写驱动时,包含的头文件和应用程序中包含的头文件不是一个概念。

应用编程中包含的头文件是应用层的头文件,是应用程序的编译器带来的(譬如gcc的头文件路径在 /usr/include下,这些东西是和操作系统无关的)。驱动源码属于内核源码的一部分,驱动源码中的头文件其实就是内核源代码目录下的include目录下的头文件。

比如:

 如果需要mmc,我们就#include<linux/mmc/mmc.h>

总的来说就是要去内核文件中找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux:简单的模块源码分析 的相关文章

随机推荐

  • stem教育资源

    人生不同阶段都有不同的使命 在学生阶段 学习掌握知识为以后的人生获得成就的能力 就是这个阶段使命 为了这个使命 他们必须要学习忍耐 学会放弃 学会付出 这不仅仅是学习的需要 也是人生的一种修炼 纵观我们身边的人 但凡取得一定成就的都是要经过
  • 用 LangChain 构建基于资料库的问答机器人(三):ReAct

    大家好 我是 Jambo 我们已经学习了如何使用 LangChain 的一些基本功能 解下我们就应该要结合这些功能来做一些复杂的东西了 但在这之前 为了让同学们更好的理解 LangChain 在这其中做了什么 我想先介绍一下关于 GPT 使
  • 修改索引值python_pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多 不单单是某个部分的值的修改 还有一些索引的修改 列名的修改 类型修改等等 我们仅选取部分进行介绍 一 值的修改 DataFrame的修改方法 其实前面介绍loc方法的时候介绍了一些 1 loc方法
  • STM32 IAP Ymodem

    STM32 IAP采用Ymodem协议升级固件 公司最近软件需要通过IAP来升级所有板卡的固件 其中板卡有2块 一块主控板卡 一块子控板卡 其中 主控板卡与子控板卡之间采用RS485通信 PC与主控板卡采用RS232通信 具体框架 一 PC
  • pc817光耦参数_光耦在电子电路中有什么作用?关键参数有哪些?一起了解一下...

    光耦作为一个可以对信号进行电气隔离的电子元器件 常用于开关电源电压反馈隔离 电路隔离控制 光耦在电子电路中有不可或缺的地位 了解光偶的特性对学习电子电路有不少帮助 开关电源电压反馈 光耦隔离控制继电器 今天就一起来了解一下光耦吧 电子元器件
  • linkstack头文件 c语言,链式栈的基本操作——LinkStack(C语言版)

    include stdafx h include define OK 1 define ERROR 0 define TRUE 1 define FALSE 0 define MAXSIZE 20 存储空间初始分配量 typedef int
  • odoo10源码win系统开发环境安装图文教程

    前言 odoo10的源码安装教程不太完整或对新手不够友好 本新手再次整合出一份友好的新手教程 老鸟慎入 准备工作 一个干净的window系统 事先没有其他python环境的系统 如果怕系统污染可以先用虚拟机安装熟悉了再正式安装 亲测wind
  • 【论文写作】——设置中英文字体

    打开文件 点击选项 选择高级 取消中文字体也应用于西文的勾选 然后选中全文 设置中文字体为宋体 设置英文字体为times new Roman
  • flask框架

    flask框架 一 flask简介 二 初体验 三 flask配置 1 开启debug模式 2 如何正确显示中文 2 1 配置文件的优化 四 URL与视图 1 构造URL url for 五 指定HTTP方法 六 页面跳转和重定向 七 模板
  • 【PostMan】postman如何发送并发请求

    1 概述 假设我们有一个接口 单次调用可以调通 然后我们将这个接口加入到集合 也可以复制一个接口或者多个到集合 然后点击 后面点击运行就可以模拟 20个线程 轮训集合中的接口 并发的调用
  • [423]定时任务(saturn)

    项目地址 https github com vipshop Saturn 参考文档 https vipshop github io Saturn zh cn 3 0 https vipshop github io Saturn zh cn
  • 揭秘python函数:编程艺术的核心力量

    文章目录 前言 什么是 python 函数 函数的使用步骤 1 定义函数 2 调用函数 带有参数的函数 函数的返回值 函数的说明文档 函数的嵌套调用 实现简易的计算器 前言 当我们深入研究 Python 的内心深处 我们将会发现 函数是其内
  • c语言的文件末尾没有换行符,为什么文本文件应该以换行符结尾?

    这个答案是一种技术性的回答 而不是意见 如果我们想成为POSIX纯粹主义者 我们定义一条线为 零个或多个非字符加上终止字符的序列 不完整的一行 如 文件末尾一个或多个非字符的序列 文本文件 如 包含组织成零行或多行的字符的文件 这些行不包含
  • 面向对象基础--类和对象

    类和对象的关系 一 对象 用来描述客观事物的一个实体 由一组属性和方法构成 对象是由静态特征和动态特征组成 1 静态特征 属性 2 动态特征 方法 对象的特征 属性 属性 对象具有的各种特征 每个对象的每个属性都拥有特定值 对象的特征 方法
  • npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    npm 无法将 npm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 目录 一 报错 二 解决 1 安装node js node js安装过程中的报错问题 解决nod
  • 五大板块(4)——链表

    参考 五大板块 4 链表 作者 丶PURSUING 发布时间 2021 02 15 09 33 29 网址 https blog csdn net weixin 44742824 article details 114981905 目录 一
  • index=False含义

    index False含义 输出不显示index 索引 值 在输出代码行中 加入 index False 如下 m pred survived to csv clasified csv index False
  • 深度学习(30)随机梯度下降七: 多层感知机梯度(反向传播算法)

    深度学习 30 随机梯度下降八 多层感知机梯度 反向传播算法 1 多层感知机模型 2 多层感知机梯度 3 传播规律小结 tens Recap Chain Rule Multi output Perceptron E
  • Unity--使用Cinemachine Confiner设置摄像机边界

    使用Cinemachine Confiner设置摄像机边界 前提提要 在做这个功能前需要 main camera 另外一个相机 思路 创建一个对象绑定Polygon Collider2D 边界 然后在另外一个相机Cinemachine Co
  • 嵌入式Linux:简单的模块源码分析

    目录 1 常用命令 2 insmod与module init宏 这里还有一个知识点 函数修饰符 3 模块的版本信息查看 模块中常用宏 printk函数 调试程序是可以用到 打印机别 0 7 关于驱动模块中的头文件 1 常用命令 lsmod