【Linux驱动开发 ---- 2_深入理解内核模块】

Linux驱动开发 ---- 2_深入理解内核模块

目录

  • Linux驱动开发 ---- 2_深入理解内核模块
        • 学习目标
        • 时间安排建议
      • 理论学习
        • 1. 什么是内核模块?
        • 2. 模块加载与卸载
        • 3. 内核模块开发基础
      • 实践任务
        • 任务1:准备开发环境
        • 任务2:编写简单内核模块
        • 任务3:编写Makefile
        • 任务4:编译和测试模块
        • 任务5:清理环境
      • 代码详解
        • `hello_module.c`详解
        • `Makefile`详解
      • 注意事项
      • 总结

学习目标
  • 理解Linux内核模块的基本概念和工作原理。
  • 掌握模块的加载(insmod)、卸载(rmmod)和参数传递。
  • 编写并测试一个简单的内核模块。
时间安排建议
  • 理论学习(1-2小时):学习内核模块的基础知识。
  • 实践(1小时):编写、编译和测试内核模块。

理论学习

1. 什么是内核模块?
  • 内核模块是Linux内核的可加载扩展,可以动态加载到内核中,无需重启系统。
  • 优点:提高灵活性,减少内核体积。
  • 文件后缀:.ko(Kernel Object)。
  • 示例:USB驱动、网络驱动通常以模块形式存在。
2. 模块加载与卸载
  • insmod:加载模块到内核。
    • 用法:insmod module.ko [参数]
  • rmmod:卸载模块。
    • 用法:rmmod module_name
  • lsmod:查看已加载的模块。
  • 模块参数:可以在加载时传递参数给模块。
    • 示例:insmod my_module.ko my_param=5
3. 内核模块开发基础
  • 基本结构:
    • 初始化函数(加载时调用)。
    • 退出函数(卸载时调用)。
  • 常用头文件:<linux/module.h><linux/kernel.h>
  • 编译:需要内核源码和Makefile

实践任务

任务1:准备开发环境
  1. 检查内核版本

    uname -r
    
    • 示例输出:5.15.0-73-generic(Ubuntu 22.04默认版本)。
      在这里插入图片描述
  2. 安装内核头文件和开发工具

    sudo apt install linux-headers-$(uname -r) build-essential
    

在这里插入图片描述

  1. 创建工作目录
    mkdir ~/kernel_modules && cd ~/kernel_modules
    
    在这里插入图片描述
任务2:编写简单内核模块
  1. 创建文件hello_module.c
    nano hello_module.c
    
  2. 输入以下代码:
#include <linux/module.h>    // 内核模块必需头文件
#include <linux/kernel.h>    // 提供printk等内核函数
#include <linux/init.h>      // 定义模块初始化和退出宏// 定义一个模块参数
static int my_param = 0;
module_param(my_param, int, S_IRUGO); // S_IRUGO表示参数可读// 模块初始化函数,加载时调用
static int __init hello_init(void) {printk(KERN_INFO "Hello, World! Parameter: %d\n", my_param);return 0; // 返回0表示成功
}// 模块退出函数,卸载时调用
static void __exit hello_exit(void) {printk(KERN_INFO "Goodbye, World!\n");
}// 注册初始化和退出函数
module_init(hello_init);
module_exit(hello_exit);// 模块元信息
MODULE_LICENSE("GPL");           // 许可证
MODULE_AUTHOR("Your Name");      // 作者
MODULE_DESCRIPTION("A simple hello world module"); // 描述

在这里插入图片描述

任务3:编写Makefile
  1. 创建文件Makefile

    nano Makefile
    
  2. 输入以下内容:

    obj-m += hello_module.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    
任务4:编译和测试模块
  1. 编译模块

    make
    
    • 输出文件:hello_module.ko
  2. 加载模块

    sudo insmod hello_module.ko my_param=42
    
  3. 查看日志

    dmesg | tail
    
    • 预期输出:Hello, World! Parameter: 42
  4. 检查已加载模块

    lsmod | grep hello
    
  5. 卸载模块

    sudo rmmod hello_module
    
  6. 再次查看日志

    dmesg | tail
    
    • 预期输出:Goodbye, World!
任务5:清理环境
make clean

代码详解

hello_module.c详解
  • #include <linux/module.h>:提供模块相关宏和函数。
  • printk(KERN_INFO ...):内核日志函数,KERN_INFO表示信息级别,输出到/var/log/kern.logdmesg
  • module_param:定义可传递的参数,my_param是整数类型,S_IRUGO表示全局可读。
  • __init__exit:标记初始化和退出函数,__init函数在加载后释放内存。
  • MODULE_LICENSE("GPL"):声明模块遵循GPL许可证,避免内核污染警告。
Makefile详解
  • obj-m += hello_module.o:指定目标模块。
  • -C /lib/modules/...:指向内核源码目录。
  • M=$(PWD):指定当前目录为模块构建路径。

注意事项

  • 权限问题:加载模块需要sudo,否则会提示权限不足。
  • 日志查看dmesg可能包含大量信息,用tail筛选最新日志。
  • 内核版本匹配:确保linux-headers版本与当前内核一致(uname -r)。
  • 实践巩固:尝试修改my_param值或日志内容,重新编译测试。

总结

完成以上内容后,您将:

  • 理解内核模块的作用和基本结构。
  • 掌握模块的编写、编译、加载和卸载。
  • 成功运行一个打印“Hello, World!”的模块,并传递参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85021.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux SUID提权 案例以及知识点提高分析

目录 &#x1f4da; Linux SUID 提权原理与红队实践 &#x1f680; 概述 &#x1f6e0;️ SUID 提权原理 核心机制 技术栈 &#x1f50d; 案例背景&#xff1a;sudo -l 与 .monit 脚本 案例信息 脚本内容 &#x1f9ea; 提权步骤分解 &#x1f4cb; 1. 检查 sudo 权限…

S参数与串扰-信号完整性分析

S参数与串扰: 四端口网络S参数中&#xff0c;仍表示反射&#xff0c;表示信号的传输。根据S参数的定义&#xff0c;和两个参数的含义为 当只有端口1有正弦信号激励源时&#xff0c;从端口3和端口4出来的正弦信号只能是互连结构内部耦合过来的&#xff0c;因此表示的是近端串扰…

Android OkHttp 框架超时设置详解

OkHttp 提供了四种不同的超时设置&#xff0c;每种针对网络请求的不同阶段&#xff1a; 1. callTimeout (调用超时) 作用&#xff1a;控制整个调用从开始到结束的总时间&#xff0c;包括所有重定向和重试 默认值&#xff1a;0 (不超时) 场景&#xff1a;当你希望限制整个请求…

如何让LLM通过反思来提升生成sql的正确率 - 以Gemini生成sql为例

什么是Agent Reflection 通常指 “智能体反思”&#xff0c;即让 AI 系统通过自我反思机制优化决策或任务处理过程&#xff0c;类似人类通过复盘改进策略。 创建一个 SQL Agent 导入相关的库 import openai import pandas as pd import sqlite3 from util.get_schema impor…

数字IC学习笔记(二)

数字IC学习笔记&#xff08;二&#xff09; 宏定义&#xff0c;异步FIFO, 时钟来源&#xff0c;复位信号 文章目录 数字IC学习笔记&#xff08;二&#xff09;1. define宏定义的使用2&#xff0c;异步FIFO原理3&#xff0c;时钟来源4&#xff0c;复位参考资料 1. define宏定义的…

日志输出功能

当程序运行出现问题时&#xff0c;日志记录是一种非常有用的工具&#xff0c;它可以帮助我们追踪和定位问题。在 MicroPython 中&#xff0c;可以使用 log 模块来记录程序运行中的信息。本文将介绍 log 模块的使用方法和常见功能。 日志级别 log.DEBUG 常量&#xff0c;用来…

【JVM】- 类加载与字节码结构1

类文件结构 ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constant_pool_count-1];u2 access_flags;u2 this_class;u2 …

Android及Harmonyos实现图片进度显示效果

鸿蒙Harmonyos实现&#xff0c;使用ImageKnife自定义transform来实现图片进度效果 import { Context } from ohos.abilityAccessCtrl; import { image } from kit.ImageKit; import { drawing } from kit.ArkGraphics2D; import { GrayScaleTransformation, PixelMapTransform…

linux 中的自动化之systemd

linux | 自动化之systemd linux 中的自动化之systemd 学习总是循序渐进的。 linux 中程序的自动化&#xff0c;包括早期手动启动&#xff0c;查看启动后的日志、分析启动情况&#xff0c;再到后面封装脚本(大致要求启动后检查是否挂了&#xff0c;挂了拉起&#xff0c;没挂跳过…

【编译工具】CodeRider 2.0:驭码 CodeRider 2.0 全流程智能研发协作平台深度技术测评报告

目录 前言&#xff1a;CodeRider 2.0 简介 &#xff08;1&#xff09;核心功能 &#xff08;2&#xff09;适用场景 &#xff08;3&#xff09;优势 一、产品概述与技术架构 &#xff08;1&#xff09;产品定位与核心价值 &#xff08;2&#xff09;技术架构解析 &…

抓包 TCP 四次挥手报文

文章目录 抓包 TCP 三次握手报文一、第一次挥手二、第二次挥手三、第三次挥手四、第四次挥手 抓包 TCP 三次握手报文 抓包 TCP 三次握手报文 一、第一次挥手 二、第二次挥手 三、第三次挥手 四、第四次挥手

KMP(Kotlin Multiplatform)发布Web版本乱码

一、背景 最近用KMP尝试运行在Android、iOS、desktop都成功了&#xff0c;网络数据访问也正常。 可是当运行wasmJs的时候遇到了2个较大的问题。 中文字体出现乱码。 出现了跨域问题。 首先贴一下每个平台的运行截图&#xff1a; Android iOS Desktop 二、问题 当web跑起…

一个应用程序或移动网站项目提供最佳UI解决方案

一个应用程序或移动网站项目提供最佳UI解决方案 此套件是用大量的爱和辛勤工作制作的&#xff0c;为您的下一个应用程序或移动网站项目提供最佳解决方案。120个完全可编辑的界面&#xff0c;分为10个类别和2种文件格式&#xff0c;Photoshop和AI。简单易用的结构将允许您以所…

Android studio打包生成jar包文件

Android studio打包生成jar包文件 一 项目配置1.修改 app/build.gradle2.修改 AndroidManifest.xml 二 打 Jar 包1.修改 app/build.gradle2.编译生成 Jar 包 一 项目配置 1.修改 app/build.gradle 将com.android.application改成com.android.library注释掉applicationId 2.…

JAVA类加载机制(jdk8)

三句话总结JDK8的类加载机制&#xff1a; 类缓存&#xff1a;每个类加载器对他加载过的类都有一个缓存。双亲委派&#xff1a;向上委托查找&#xff0c;向下委托加载。沙箱保护机制&#xff1a;不允许应用程序加载JDK内部的系统类。 JDK8的类加载体系 类加载器的核心方法 //…

更进一步深入的研究ObRegisterCallBack

引入 我们如果想hook对象的回调,在上篇文章里我们已经知道了对象回调函数存在一个列表里面&#xff0c;我们通过dt可以看见&#xff0c;这里他是一个LIST_ENTRY结构&#xff0c;但是实际调用的时候&#xff0c;这样是行不通的&#xff0c;说明它结构不对 0: kd> dt _OBJEC…

Nginx-3 Nginx 的负载均衡策略

Nginx-3 Nginx 的负载均衡策略 Nginx 的负载均衡其实就是指将请求按照一定的策略转发给服务集群中的一台&#xff0c;提高了服务集群的可用性&#xff0c;解决数据流量过大、网络负荷过重的问题。 AKF 扩展立方体 分为 3 个方向负载&#xff1a; x 轴&#xff1a;增加实例数…

Wiiu平台RetroArch全能模拟器美化整合包v1.18

这款WiiU平台RetroArch全能模拟器美化整合包v1.18的亮点包括&#xff1a; 1. 18款平台完美兼容&#xff1a;无论你是喜欢NES时代的经典游戏&#xff0c;还是钟爱SNES、GBA等平台的大作&#xff0c;这款整合包都能满足你的需求&#xff0c;让你尽情畅玩游戏。 2. 三款自制主题&a…

MyBatis原理

Mybatis执行过程为&#xff1a;接口代理->sqlSession会话->executor执行器->JDBC操作 一、接口代理 Mybatis根据Mapper接口&#xff0c;动态生成相应实现类 二、SqlSession介绍 MyBatis核心对象SqlSession介绍 - MyBatis中文官网 三、Executor执行器介绍 精通My…