驱动开发1 概念、内核模块编程、内核消息打印函数printk函数的使用、内核模块传参、内核导出符号

news2024/9/22 3:56:48

1 驱动相关概念

2 内核模块编程

内核模块编写实例代码+注释

#include <linux/init.h>
#include <linux/module.h>

//入口函数,安装内核模块时执行
static int __init mycdev_init(void)
{
    //static 修饰当前函数只能在本文件使用
    //int 函数的返回值类型,如果函数规定返回值但是没有加返回值,编译会报错
    //mycdev_init函数名,可以自己起名字
    //void表示函数无参数,当没有参数时void一定要加,不然报错
    //__init的作用是用来告诉编译器当前代码保存在.init.text段中
    //#define __init        __section(".init.text")  
    //linux内核也会有自己的链接脚本  vmlinux.lds,这个链接脚本里规定了不同的内容在
    //内存中的什么位置
    return 0;
}
//出口函数,卸载内核模块时执行
static void __exit mycdev_exit(void)
{
    //#define __exit        __section(".exit.text")
    //__exit指定出口函数保存在.exit.text段中

}
//用于声明入口函数
module_init(mycdev_init);
//用于声明出口函数
module_exit(mycdev_exit);
//声明当前内核模块遵循GPL协议
MODULE_LICENSE("GPL");

内核模块编译(外部编译Makefile)

#保存UBUNTU内核源码路径
KERNELDIR := /lib/modules/$(shell uname -r)/build
#KERBELDIR保存开发板内核源码路径
#KERNELDIR := /home/ubuntu/linux-5.10.61/
#PWD保存当前内核模块的路径
PWD := $(shell pwd)
all:
#make modules是模块化编译命令
#make -C $(KERNLEDIR) 执行make之前先切换到KERNELDIR对应的路径
#M=$(PWD)表示进行模块化编译的路径是PWD保存的路径
    make -C $(KERNELDIR) M=$(PWD) modules
clean:
#编译清除
    make -C $(KERNELDIR) M=$(PWD) clean
#将obj-m保存的文件单独链接为内核模块
obj-m :=  demo.o

通用版本的Makefile

modname ?= demo
arch ?= arm
ifeq ($(arch),arm)  #通过命令行传过来的架构决定怎么编译
#KERBELDIR保存开发板内核源码路径
KERNELDIR := /home/ubuntu/linux-5.10.61/
else
#保存UBUNTU内核源码路径
KERNELDIR := /lib/modules/$(shell uname -r)/build
endif

#PWD保存当前内核模块的路径
PWD := $(shell pwd)
all:
#make modules是模块化编译命令
#make -C $(KERNLEDIR) 执行make之前先切换到KERNELDIR对应的路径
#M=$(PWD)表示进行模块化编译的路径是PWD保存的路径
    make -C $(KERNELDIR) M=$(PWD) modules
clean:
#编译清除
    make -C $(KERNELDIR) M=$(PWD) clean
#将obj-m保存的文件单独链接为内核模块
obj-m :=  $(modname).o

3 内核消息打印函数printk函数的使用

代码示例

#include <linux/init.h>
#include <linux/module.h>

// 入口函数,安装内核模块时执行
static int __init mycdev_init(void)
{
    // static 修饰当前函数只能在本文件使用
    // int 函数的返回值类型,如果函数规定返回值但是没有加返回值,编译会报错
    // mycdev_init函数名,可以自己起名字
    // void表示函数无参数,当没有参数时void一定要加,不然报错
    //__init的作用是用来告诉编译器当前代码保存在.init.text段中
    // #define __init       __section(".init.text")
    // linux内核也会有自己的链接脚本  vmlinux.lds,这个链接脚本里规定了不同的内容在
    // 内存中的什么位置
    printk(KERN_ERR "hello world\n");
    int a=10;
    printk(KERN_ERR "%d\n",a);
    return 0;
}
// 出口函数,卸载内核模块时执行
static void __exit mycdev_exit(void)
{
    // #define __exit       __section(".exit.text")
    //__exit指定出口函数保存在.exit.text段中
}
// 用于声明入口函数
module_init(mycdev_init);
// 用于声明出口函数
module_exit(mycdev_exit);
// 声明当前内核模块遵循GPL协议
MODULE_LICENSE("GPL");

4 内核模块传参

#include <linux/init.h>
#include <linux/module.h>
int a=10;
module_param(a,int,0664);//声明变量a可以进行命令行传参
MODULE_PARM_DESC(a,"this is a int value");//添加要传参的变量描述
static int __init mycdev_init(void)
{
    printk("a=%d\n",a);
    return 0;
}
static void __exit mycdev_exit(void)
{


}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

5 内核导出符号

1 定义demo1.c,demo1.c中完成函数的定义

#include <linux/init.h>
#include <linux/module.h>
int add(int i,int j)
{
    return i+j;
}
//生成add的符号表文件
EXPORT_SYMBOL(add);
static int __init mycdev_init(void)
{
    
    return 0;
}
static void __exit mycdev_exit(void)
{


}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

2 创建demo2.c,里面完成demo1.c里面函数的调用

#include <linux/init.h>
#include <linux/module.h>

extern int add(int i,int j);
static int __init mycdev_init(void)
{
    printk("调用模块1函数执行结果为:%d",add(3,5));
    return 0;
}
static void __exit mycdev_exit(void)
{


}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

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

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

相关文章

063:mapboxGL常见错误:Style is not done loading(原因及解决办法)

第063个 点击查看专栏目录 作者在做vue+mapbox的项目,将geojson的数据加载到地图上来,形成的效果图如下 但是在处理的时候,遇到过这个一个错误,提示信息如下: vue.runtime.esm.js:3049 Error: Style is not done loadingat Qt._checkLoaded (mapbox-gl.js:36:1)at Qt.…

《计算机视觉中的多视图几何》笔记(14)

14 Affine Epipolar Geometry 本章主要是在仿射摄像机的情况下重新考虑对极几何&#xff0c;也就是仿射对极几何。 仿射摄像机的优点是它是线性的&#xff0c;所以很多最优化算法可以用线性代数的知识解决。如果是一般的投影摄像机&#xff0c;很多算法就不是线性的了&#x…

[架构之路-241]:目标系统 - 纵向分层 - 企业信息化与企业信息系统(多台企业应用单机组成的企业信息网络)

目录 前言&#xff1a; 一、什么是信息系统&#xff1a;计算机软件硬件系统 1.1 什么是信息 1.2 什么是信息系统 1.3 什么是信息技术 1.4 什么是信息化与信息化转型 1.5 什么是数字化与数字化转型&#xff08;信息化的前提&#xff09; 1.6 数字化与信息化的比较 1.7 …

Android 10.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在10.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

基于nodejs+vue市民健身中心网上平台mysql

市民健身中心网上平台分为用户界面和管理员界面&#xff0c; 用户信息模块&#xff1a;管理员可在后台添加、删除普通用户&#xff0c;查看、编辑普通用户的信息。 课程表管理模块&#xff1a;管理员可对课程表进行修改任课教师、新增某一堂课、删除某一堂课、查找课程、修改…

论文导读|9月MSOM文章精选:智慧城市运筹

推文作者&#xff1a;郭浩然 编者按 本期论文导读围绕“智慧城市运筹”这一话题&#xff0c;简要介绍并分析了近期的三篇MSOM文章&#xff0c;分别涉及了最后一公里配送中的新模式&#xff1a;“司机辅助”&#xff0c;易腐库存管理的新策略&#xff1a;“截断平衡”&#xff0…

Openssl数据安全传输平台004:套接字C语言API封装为C++类 / 客户端及服务端代码框架和代码实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

性能测试LoadRunner02

本篇主要讲&#xff1a;通过Controller设计简单的测试场景&#xff0c;可以简单的分析性能测试报告。 Controller 设计场景 Controller打开方式 1&#xff09;通过VUG打开 2&#xff09;之间双击Controller 不演示了&#xff0c;双击打开&#xff0c;选择Manual Scenario自…

buuctf[HCTF 2018]WarmUp 1

题目环境&#xff1a; 发现除了表情包&#xff0c;再无其他F12试试发现source.php文件访问这个文件&#xff0c;格式如下&#xff1a;url/source.php回显如下&#xff1a;PHP代码审计&#xff1a; <?php highlight_file(__FILE__); class emmm {public static function ch…

Linux笔记之diff工具软件P4merge的使用

Linux笔记之diff工具软件P4merge的使用 code review! 文章目录 Linux笔记之diff工具软件P4merge的使用1.安装和配置2.使用&#xff1a;p4merge a.cc b.cc3.配置git 参考博文: Ubuntu Git可视化比较工具 P4Merge 的安装/配置及使用 1.安装和配置 $ wget https://cdist2.per…

分享一下我家网络机柜,家庭网络设备推荐

家里网络机柜搞了几天终于搞好了&#xff0c;非专业的&#xff0c;走线有点乱&#xff0c;勿喷。 从上到下的设备分别是&#xff1a; 无线路由器&#xff08;当ap用&#xff09;:TL-XDR6088 插排&#xff1a;德木pdu机柜插排 硬盘录像机&#xff1a;TL-NVR6108-L8P 第二排左边…

OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)

文章目录 OpenGLGLFW & CMake链接到 Hello OpenGL&#xff01;GLAD运行测试 OpenGL 什么是 OpenGL&#xff0c;OpenGL 能做什么在此不再赘述 运行 OpenGL 需要准备的有&#xff1a; CMake&#xff1a;用于执行编译VS&#xff1a;我使用的是 Visual Studio 17 2022 版本G…

系统架构师备考倒计时13天(每日知识点)

1. 数据仓库四大特点 面向主题的。操作型数据库的数据组织面向事务处理任务&#xff0c;各个业务系统之间各自分离&#xff0c;而数据仓库中的数据是按照一定的主题域进行组织的。集成的。数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整…

[ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

100 # mongoose 的使用

mongoose elegant mongodb object modeling for node.js https://mongoosejs.com/ 安装 mongoose npm i mongoose基本示例 const mongoose require("mongoose");// 1、连接 mongodb let conn mongoose.createConnection("mongodb://kaimo313:kaimo313loc…

python算法

第一章 算法 一系列解决单个或多个问题&#xff0c;或有执行计算机功能的命令集合。人类在解决复杂问题时所采用的一系列特定的方法&#xff0c;即为算法。 算法与程序的区别 程序指一组计算机能识别和执行&#xff0c;并有一定功能的指令。程序是以计算机能理解的各式各样的…

CCF CSP认证 历年题目自练Day37

题目一 试题编号&#xff1a; 201312-3 试题名称&#xff1a; 最大的矩形 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&a…

SLAM ORB-SLAM2(6)系统对象

SLAM ORB-SLAM2(6)系统对象 1. 封装2. 成员变量2.1. 核心数据2.2. 三个对象2.3. 三个线程2.4. 跟踪状态3. 成员函数4. 构造函数5. 数据驱动接口1. 封装 在 《SLAM ORB-SLAM2(5)例程了解》 了解到创建了一个 ORB_SLAM2::System 类型的对象 然后不断的把数据供给该对象就可以…

图论02-【无权无向】-图的深度优先遍历DFS

文章目录 1. 代码仓库2. 深度优先遍历图解3. 主要代码3.1 dfs递归的主要代码 - 先序遍历和后序遍历3.2 dfs非递归的主要代码 - 使用栈3.3 递归与非递归遍历出来的顺序不一致3.4 标记不同的联通分量 4. 完整代码4.1 CC.java4.2 Graph.java 1. 代码仓库 https://github.com/Chufe…

【计算机网络】TCP 协议的相关特性

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的协议。以下是TCP协议的相关特性&#xff1a; 可靠性&#xff1a;TCP通过确认和重传机制保证数据的可靠传输。 面向连接&#xff1a;TCP在传输数据前需要先建立连接。连接的建立过程包括三次握手…