IMX6LL|内核模块

这篇具有很好参考价值的文章主要介绍了IMX6LL|内核模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内核模块基本概念

作用

解决linux内核可扩展性和可维护性相对较差的缺陷

现代内核派系

宏内核:关键功能和服务功能均在内核空间提供

  • 运行效率高
  • 扩展性较差

微内核:内核空间只提供关键功能,服务功能在用户空间提供

  • 运行效率较低
  • 安全性、扩展性较高

IMX6LL|内核模块,嵌入式硬件,linux

内核模块加载/卸载
  • 使用insmod命令加载

  • 使用rmmod命令卸载

内核模块入口/出口
  • module_init():加载模块式该函数自动执行,进行初始化操作
  • module_exit():卸载模块时函数自动执行,进行清理操作
内核模块信息声明
  • MODULE_LICENSE():表示模块代码接受的软件许可协议,Linux内核遵循GPL V2开源协议,内核模块与linux内核保持一致即可。
  • MODULE_AUTHOR():描述模块的作者信息
  • MODULE_DESCRIPTION():对模块的简单介绍
  • MODULE_ALIAS():给模块设置一个别名

内核模块实验1

实验环境
  • 开发板烧录好Debian镜像
  • 启动开发板,搭建好nfs客户端,挂载共享文件夹
  • 获取Debian镜像的内核源码并编译
编译4.19.71版本内核

内核模块的功能需要依赖内核提供的各种底层接口

1.下载linux内核源码

​ github:

git clone https://github.com/Embedfire/ebf-buster-linux.git

​ gitee:

git clone https://gitee.com/Embedfire/ebf-buster-linux.git

2.安装必要环境工具库

sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop

3.一键编译内核

sudo ./make_deb.sh

4.获取编译出来的内核相关文件

/home/pi/build
内核模块头文件
- #include <linux/module.h>:包含内核模块信息声明的相关函数
- #include <linux/init.h>:包含了 module_init()和 module_exit()函数的声明
-  #include <linux/kernel.h>:包含内核提供的各种函数,如printk
内核模块打印函数
  • printf:glibc实现的打印函数,工作于用户空间

  • printk:内核模块无法使用glibc库函数,内核自身实现的一个类printf函数,但是需要指定打印等级。

    - #define KERN_EMERG 	"<0>" 通常是系统崩溃前的信息
    - #define KERN_ALERT          "<1>" 需要立即处理的消息
    - #define KERN_CRIT             "<2>" 严重情况
    - #define KERN_ERR              "<3>" 错误情况
    - #define KERN_WARNING   "<4>" 有问题的情况
    - #define KERN_NOTICE       "<5>" 注意信息
    - #define KERN_INFO            "<6>" 普通消息
    - #define KERN_DEBUG        "<7>" 调试信息
    

查看当前系统printk打印等级:cat /proc/sys/kernel/printk

  • 当前控制台日志级别
  • 默认消息日志级别
  • 最小的控制台级别
  • 默认控制台日志级别

打印内核所有打印信息:dmesg

  • 内核log缓冲区大小有限制,缓冲区数据可能被冲掉
Makefile分析
  • KERNEL_DIR:指向linux内核具体路径

  • export:导出变量给子Makefile使用

  • obj-m := <模块名>.o:定义要生成的模块

  • $(MAKE):Makefile的默认变量,值为make

  • 选项”-C”:让make工具跳转到linux内核目录下读取顶层Makefile

  • M=:表示内核模块源码目录

  • $(CURDIR):Makefile默认变量,值为当前目录所在路径

  • make modules:执行Linux顶层Makefile的伪目标,它实现内核模块的源码读取并编译为.ko文件

编译内核模块
make
把生成的内核模块拷贝到nfs共享目录
make copy
开发板加载内核模块
insmod xxx.ko

内核模块实验2

mobaxterm设置窗口行数、列数

Linux终端窗口

  • 查询终端窗口的行列数:stty size
  • 设置终端窗口列数:stty cols xx
  • 设置终端窗口行数:stty rows xx

mobaxterm窗口

  • 右击会话窗口,选择“edit session ”->“Terminal settings”->“Terminial font settings”->“Terminal size”
模块参数

根据不同应用场合给内核模块传递不同参数,提高内核模块灵活性

  • 定义一个常见变量
  • 使用module_param宏把传参值赋给变量
module_param(name, type, perm)
  • name:参数名
  • type:参数类型,如int、byte、bool、charp…
  • perm:读写权限
    • 不允许设置可执行权限
    • 在“/sys/module/模块名/parameters”目录下,会生成该参数对应的文件名
符号共享

内核模块可以共享导出的符号表

  • 变量共享
  • 函数共享
EXPORT_SYMBOL(sym)
  • sym:变量名或者函数名
查看符号表
cat /proc/kallsyms | grep xxx
Makefile修改
  • 有依赖关系的模块,放在一起进行编译
  • clean伪目标增加清除共享文件夹指令
模块手动加载
  • 加载时,必须先加载相关依赖模块
  • 卸载时,顺序相反
模块自动加载
  • 所有内核模块统一放到"/lib/modules/内核版本"目录下

    cp *.ko /lib/modules/内核版本
    
  • 建立模块依赖关系:

    depmod -a 
    
  • 查看模块依赖关系

    cat /lib/modules/内核版本/modules.dep
    
  • 加载模块及其依赖模块

    modprobe xxx
    
  • 卸载模块及其依赖模块文章来源地址https://www.toymoban.com/news/detail-808934.html

    modprobe -r xxx
    

到了这里,关于IMX6LL|内核模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式Linux实战开发之项目总体概述(基于IMX6ULL)

    现在越来越多的智能设备融入到我们的生活,然而,丰富的设备之下也是有一套基本的运行框架,只是根据不同的需求增减相应的功能从而满足自身的需要。而电子产品量产工具项目,就是实现基础的功能,可以作为一个基础的模版,学成之后便可进行扩展,根据自身需求,

    2024年02月13日
    浏览(70)
  • 嵌入式linux项目之智能仓储(基于正点原子IMX6ULL开发板)

    提示:该项目根据华清远见智能仓储项目改版,将他的A9开发板换成了自己的IMX6ULL开发板。同时等我将该项目整个流程完成之后,会为大家附上适配正点原子linux开发板的全部代码 (代码资料和视频教程私聊) 视频教程 相应课程配套源码 本人其他项目链接基于linux的智能仓储项

    2024年01月16日
    浏览(89)
  • 【嵌入式Linux内核驱动】内核模块三要素与验证测试

    内核模块 Linux内核模块是一种可以动态加载和卸载的软件组件,用于扩展Linux操作系统的功能。Linux内核本身只包含了必要的核心功能,而内核模块则允许开发者在运行时向内核添加新的功能、驱动程序或文件系统支持,而无需重新编译整个内核或重新启动系统。 内核模块是

    2024年02月06日
    浏览(64)
  • 【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    在Makefile中,变量的赋值可以使用以下几种方式: = :最基本的赋值符号,表示简单的延迟展开(lazy expansion)方式。变量的值将会在使用变量的时候进行展开。 := :立即展开(immediate expansion)的赋值方式。变量的值在赋值的时候立即展开,并且在后续的使用中不再改变。

    2024年02月08日
    浏览(53)
  • IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

    目录 linux开发板启动流程 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用  安装内核和模块到开发板上  Bootloader 介绍 编译 u-boot 镜像 Reset--ROM--bootloader--kernel+dtb--rootfs--AP

    2024年01月22日
    浏览(45)
  • 嵌入式Linux-IMX6ULL开发环境配置

    正点原子的驱动开发指南所使用的是纯净的Ubuntu16.04平台,用户可以按照驱动开发指南的学习路线,一步一步地亲手把Ubuntu平台搭建完成。 但是学习正点原子Linux开发板,个人还是强烈推荐大家安装正点原子提供的虚拟机平台!!!! 可以快速进行体验或者开发,避免学习周

    2024年02月03日
    浏览(47)
  • 嵌入式内核及驱动开发高级

    仅devfs,导致开发不方便以及一些功能难以支持: 热插拔 不支持一些针对所有设备的统一操作(如电源管理) 不能自动mknod 用户查看不了设备信息 设备信息硬编码,导致驱动代码通用性差,即没有分离设备和驱动 uevent机制:sysfs + uevent + udevd(上层app) sysfs用途:(类似于

    2024年02月16日
    浏览(65)
  • 嵌入式开发之linux内核移植

    目录  前言 一、下载内核源码 1.1 下载linux-3.0.1 1.2 解压源码文件 二、 内核添加yaffs2文件系统支持 2.1 下载yaffs2 2.2 内核添加yaffs2文件补丁 三、配置开发板 3.1 修改机器ID 3.2 添加开发板初始化文件 3.3 配置NandFalsh 3.3.1 添加NandFlash设备 3.3.2 添加NandFlash驱动 3.3 修改Kconfig(支持

    2024年02月07日
    浏览(104)
  • 【嵌入式环境下linux内核及驱动学习笔记-(10-内核内存管理)】

    对于包含MMU(内存管理单元)的处理器而言,linux系统以虚拟内存的方式为每个进程分配最大4GB的内存。这真的4GB的内存空间被分为两个部分–用户空间 与 内核空间。用户空间地地址分布为0~3GB,剩下的3 ~ 4GB 为内核空间。如下图。 用户进程通常只能访问用户空间的虚拟地址

    2024年02月11日
    浏览(58)
  • 嵌入式Linux底层系统开发 +系统移植+内核文件系统(基础)

    搭建交叉编译开发环境 bootloader的选择和移植 kernel的配置、编译、移植和调试 根文件系统的制作 前两个要点通常芯片厂家提供。后边两个要点是公司的工作重点。 学习方法:先整体后局部,层层推进 如何编译—如何添加命令和功能—如何定义自己的开发板。 移植的基本步

    2024年02月03日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包