Linux驱动入门必须get的知识点-01.基本框架与操作

2023-11-09

0. 编写编译驱动的Makefile

#指定驱动的测试的路径
ROOM_DIR = /nfs/rootfs/home/2.study/

#指定测试Demo的交叉编译工具链
DEMO_DIR = /home/linux/1-DataShare/0.交叉编译工具链/0.exynos-4412/gcc-4.6.4/bin/arm-arm1176jzfssf-linux-gnueabi-
GCC = $(DEMO_DIR)gcc

#$(KERNELRELEASE)是内核Makefile里的一个变量,但我们没有定义这个变量
ifeq ($(KERNELRELEASE), )

#所以该Makefile第一执行的时候会执行这里,在这里首先指定内核路径和当前路径
KERNEL_DIR = /home/linux/1-DataShare/1-系统移植/2-内核移植/1.完成版1_3.14.28/
CUR_DIR = $(shell pwd)

#该目标为Makefile的第一个目标,所以也是默认目标
all:
	#进入内核目录编译内核目录以外的一个目标,该目标通过M参数指定。此时内核目录中的Makefiel会调用该Makefile
    make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
    #编译测试文件
    $(GCC) ./main.c -o main 
    
#清除掉所有的编译文件    
clean:
    make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
    
#移动驱动和测试文件到板子上
install:
    sudo cp -raf *.ko main $(ROOM_DIR)
        
else

#当该Makefile被内核Makefiel调用的时候会执行这里,-m 表示编译成模块
obj-m += led.o

endif
//运行驱动基本操作
insmod	xxx.ko	//加载模块
lsmod	xxx.ko	//查看已加载模块
rmmod	xxx		//注意没有.ko,卸载已加载的模块

1.Linux 驱动基本框架

//3个最基本的头文件,几乎是所有驱动编写时必备的玩意儿
#include <linux/init.h>		//包含了入口函数init_module 和出口函数 cleanup_module 的原型声明
#include <linux/kernel.h>	//包含了printk的原型声明
#include <linux/module.h>	//现在没用,但后面会用到

//为避免重名问题,驱动所有函数要尽可能声明为静态
//__init 和 __exit表示该代码被调用一次后,所在的存储空间将被释放掉
static int __init led_dev_init(void)		
{
	// __FUNCTION__ 这个宏表示的是当前的函数名
	printk("_____%s_____\n", __FUNCTION__);
	return 0;
}
static void __exit led_dev_exit(void){
	printk("_____%s_____\n", __FUNCTION__);
}

//下面两个宏的作用是为默认的入口函数和出口函数取别名
module_init(led_dev_init);		//入口函数 init_module 的别名为 led_dev_init
module_exit(led_dev_exit);		//出口函数 cleanup_module 的别名为 led_dev_exit
MODULE_LICENSE("GPL");			//开源协议声明

//上面三个声明是一个驱动不可缺少的部分,下面这一堆根据需求而定,可有可无
MODULE_AUTHOR("Dallan");		//作者声明
MODULE_DESCRIPTION("Demo");		//模块功能声明
MODULE_ALIAS("First");			//给模块取一个更合适的别名

2.外部函数的调用

/**************************************math.h***************************************/
#ifndef __MATH_H__
#define __MATH_H__

int my_add(int a, int b);

#endif

/**************************************math.c***************************************/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

int my_add(int a, int b)
{
	return a+b;
}
//导出声明
EXPORT_SYMBOL(my_add);

MODULE_LICENSE("GPL");

/***************************************led.c***************************************/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include "math.h"

static int id = 1;

//调用外部函数和应用编程时区别在于,在函数实现的位置需要进行导出声明
static int __init led_dev_init(void)
{
	printk("_____%s_____\n", __FUNCTION__);
	printk("id+1 = %d \n", my_add(id, 1));
	return 0;
}
static void __exit led_dev_exit(void){
	printk("_____%s_____\n", __FUNCTION__);
}

module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");

3.内核模块传参

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

static int id = 88;
static char *name = "Dream";

//模块参数声明,可以驱动加载时进行外部赋值。
//参数分别为 变量名,变量类型,变量权限。charp 等价于 char *。
//权限 UGO 分别为用户权限、组权限、外部权限,值 RWX 分别为4、2、1,权限的宏的命名就是这么来的。 
module_param(a, int, 0644);
module_param(buf, charp, S_IRUGO | S_IWUSR);

static int __init led_dev_init(void)
{
	printk("_____%s_____\n", __FUNCTION__);
	printk("%s:id+1 = %d \n", name, my_add(id, 1));
	return 0;
}
static void __exit led_dev_exit(void){
	printk("_____%s_____\n", __FUNCTION__);
}

module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
//运行时指定参数,替换变量原本的值
insmod xxx.ko a=1 name="Mark"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux驱动入门必须get的知识点-01.基本框架与操作 的相关文章

  • 结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

    文章目录 1 前言 1 1 环境准备 1 2 登录流程图 2 小程序代码 2 1 RuoYi App编辑api login js 2 4 新增按钮微信授权登录 2 6 新增wxHandleLogin方法获取code 2 9 创建sendWx
  • 重置计算机的本地策略,Win10怎样重置组策略/安全策略

    很多windows10系统用户都会使用注册表或组策略来深度调试系统 这些系统自带工具虽然能够实现一些表面上没有的功能 但也可能会让我们 翻车 对于注册表来说 修改之前做好备份是硬道理 恢复起来也很方便 但对于组策略和安全策略 要如何才能恢复
  • wxPython 菜单栏 工具栏 状态栏

    coding utf 8 Created on Mon Jun 10 03 56 09 2019 QQ群 476842922 欢迎加群讨论学习 author Administrator coding utf 8 import wx impo
  • RN_iOS项目部署流程实例

    文章目录 1 环境配置 1 1 安装node 1 2 安装Watchman 1 3 安装npm 1 4 安装cocoapods 2 百家云demo下载 3 运行百家云demo 3 1 顺利的话 3 2 踩过的坑 按这个目录流程走 3 2 1
  • 如何使用Flask包构建网页

    最近接到的任务是用Flask构建简单的算法成果展示网页 所以才来研究如何用flask构建网页 因为要求展示 对前端页面的美化不做要求 所以这篇博客的重点在于页面之间的跳转及前后端的数据传输 1 Flask运行HTML代码 默认情况下 Fla
  • C语言例题总结一

    目录 一 两数交换的多种方法 二 比较两数大小的多种方法 三 在重复的数字中找出不同的数字 1 在重复的数字中找出一个不同的数字 2 在重复的数字中找出两个不同的数字 一 两数交换的多种方法 第一种 引入第三方变量 利用了指针将地址传进去
  • solidworks大型装配体慢卡顿怎么办?来看专业的装配设计与仿真工作站是怎么解决的!

    相信很多CAD专业领域的设计工程师都或多或少的遇到慢 卡 顿的情况 按照网上各种设置一通问题依旧 换成昂贵的双路品牌图形工作站依然得不到改善 那么问题到底出在哪儿 下面就依Solidworks为例 从三维设计与仿真的特点来分析软件如何与硬件
  • IEEE Transactions的模板中,出现subfig包和fontenc包冲突的问题,怎么解决?

    IEEE Transactions的模板中 出现subfig包和fontenc包冲突的问题 怎么解决 本文章记录如何在IEEE Transactions的模板中 出现了subfig包和fontenc包冲突的问题 该怎么解决 目录 IEEE
  • 【C#排序算法】(三)希尔排序

    希尔排序 核心 定义增量序列 不断递减增量至1 做插入排序 public void ShellSort int arr 增量h 等于1时最后一次排序 int h arr Length 2 while h gt 1 这里开始是简单插入排序算法
  • C# 整套视觉开发(VisionAndMotionPro)

    实例截图 文件 590m com f 25127180 488329759 5989d1 访问密码 551685 核心代码 VisionAndMotionPro sln vs VisionAndMotionPro v14 v15 Serve
  • 为了对抗内卷,我去阿里“偷了”五套最新Java学习笔记

    最近整理了阿里五套最新的笔记 分别是Java后端30大核心知识点总结 2022最近金三银四面试题总结 阿里巴巴Java开发规范手册 2022版 Spring Cloud Alibaba全解 阿里巴巴机器学习算法集合 今天分享的内容很多 老师
  • 01.03第一篇之数据生成模块

    第3 章数据生成模块 3 1 埋点数据基本格式 公共字段 基本所有安卓手机都包含的字段 业务字段 埋点上报的字段 有具体的业务类型 下面就是一个示例 表示业务字段的上传 下面就是一个示例 表示业务字段的上传 ap xxxxx 项目数据来源
  • Audio Moth代码总结

    1 HFLE的定义 HFLE是指高频时钟分频器 预分频器 High Frequency Low Energy Clock Divider Prescaler 在低功耗模式下 为了节省能量 系统需要使用低频时钟 LFCLK 来驱动一些模块 如
  • linux 线程局部存储,tls_windows

    线程局部存储 线程局部存储 thread local storage TLS 是一个使用很方便的存储线程局部数据的系统 利用TLS机制可以为进程中所有的线程关联若干个数据 各个线程通过由TLS分配的全局索引来访问与自己关联的数据 这样 每个
  • v-model绑定checkbox无法动态更新视图

    在vue2中使用v model绑定checkbox
  • Python爬虫(入门+进阶)学习笔记 1-6 浏览器抓包及headers设置(案例一:爬取知乎)

    爬虫的一般思路 抓取网页 分析请求 解析网页 寻找数据 储存数据 多页处理 本节课主要讲授如何通过谷歌浏览器开发者工具分析真实请求的方法 寻找真实请求的三个步骤 分析 使用谷歌浏览器开发者工具分析网页的请求 测试 测试URL请求中每个参数的
  • echarts实现颜色渐变的环状图(包括自定义各种配置项的属性)

    实现效果 实现代码 option color new echarts graphic LinearGradient 1 1 0 0 offset 0 color F2A635 offset 0 9 color ffffff new echa

随机推荐

  • 为Qt应用程序的用户添加帮助文档

    qt5 简单文本查看器例子 Qt Assistant支持交互式帮助 并使您能够向Qt应用程序的用户显示客户文档 以下示例说明如何将Qt Assistant用作应用程序的帮助查看器 使用Qt Assistant作为应用程序的自定义help查看
  • Oracle V$SESSION详解

    V SESSION是APPS用户下面对于SYS V SESSION 视图的同义词 在本视图中 每一个连接到数据库实例中的session都拥有一条记录 包括用户session及后台进程如DBWR LGWR arcchiver等等 V SESS
  • 大数据环境下的“隐形隐私”保护问题

    导语 隐形隐私 泄漏问题一直我们乃至全球最难解决的问题 数据安全不止是一个企业发展的核心关键 更关系到企业单位的生死存亡 企业单位重要客户信息泄露并在市面上大肆流通发生之后我们在想尽各种方法亡羊补牢 可是我们数据安全难道不是要从最一开始就做
  • 针对初学者,解决一些问题【Kali】手把手教你设置Kali源地址以及更新源和安装所有工具命令

    文章目录 一 设置添加修改源地址 1 首先在命令提示符中输入以下命令打开源列表文件 2 按i进入编辑模式 3 在下面源地址中至少选择一个复制粘贴进去 4 添加进入以后按ESC键退出编辑模式 按 输入wq保存退出 二 更新源命令 三 软件包操
  • TCP为什么需要三次握手

    tcp为什么要第三次握手 time wait是做什么的 tcp有几种状态 画出所有的状态转换图 晚上看到的面试题 TCP三次握手的印象很深 但为什么需要3次握手 还是想不起来了 简单而言 如果不是三次握手的话 那么到底需要几次握手最佳呢 2
  • 关于毕业求职的就业经验-写给我亲爱的校友们

    提示 希望下面的文章对大家能有所帮助 文章目录 前言 一 毕业季的几种选择 1 考研 2 就业 3 其他 二 到了毕业季应该怎么去找到自己心怡的工作 三 需要掌握的基本技能 以我嵌入式开发角度 四 该怎么去跳槽到更好的公司 五 未来规划 1
  • SPARK安装

    首先是结论 最终我没能在win10上运行起来spark 官方给的quickstart http spark apache org docs latest api python getting started quickstart html
  • Matlab学习1.0

    1 Matlab通用命令 1 常用命令 cd 显示 or改变当前文件夹 dir 显示当前文件夹下的文件 clc 清空工作窗中显示的内容 load 加载指定文件的变量 diary 日志文件命令 调用DOS命令 home 光标移动到窗口最左上角
  • 网络安全知识库

    0x00 前言 本篇用来整理所有的零散的知识 作为一个技能树或者技能表来进行引导 CTF 加解密合集 CTF Web合集 0x01 Http 1 http头 1 1 本地访问识别 如何伪造http头 让后端认为是本地访问 0x02 Web
  • Python爬虫反反爬:CSS反爬加密彻底破解!

    刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战 听的时候也没感觉到特别 但是经过了一段时间的练习之后 深以为然 每个网站不一样 每次爬取都是重新开始 所以 爬之前谁都不敢说会有什么结果 前两天 应几个小朋友的邀请 动心思玩了一下大众点评的数据
  • css动画效果之transition(动画过渡效果属性)

  • pandas dataframe 读取 xlsx 文件

    refer to https medium com kasiarachuta reading and writingexcel files in python pandas 8f0da449cc48 dframe pd read excel
  • github代码推送总是失败

    github代码推送问题 因为github仓库代码的推送总是失败 所以改了一个方案采用ssh的方式来进行代码的推送 并记录操作步骤 方案 https方式换成ssh方式 git ssh 生成 假如已经生成的话 可以略过此步骤 ssh keyg
  • Android启动service的方法

    在 Android 中启动 service 的方法如下 创建 service 的类 并在 AndroidManifest xml 文件中注册该 service 使用 Intent 类来启动 service 例如 Intent intent
  • [转]公司管理混乱,从哪里入手?

    案例分析 我们是一个40人左右的小公司 规模虽小 但管理起来感觉力不从心 经常碰到工人抵抗 情绪化 上班迟到 旷工 不服从管理 即使勉强接受 也不会用心去做 草草应付了事 每次都提议是否弄个规章制度 但也是白纸一张 到了月底 实施不了 因为
  • 使用OpenGL 立方体贴图

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 OpenGL 立方体贴图 二 使用步骤 1 代码 2 着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景 通常可以通过在地平线上创造一些逼真的效果 来
  • SpringBoot利用AOP写一个日志管理(Log)

    1 需求 目前有这么个问题 有两个系统CSP和OMS 这俩系统共用的是同一套日志操作 Log 目前想区分下这俩系统的日志操作 那没办法了 只能重写一份Log的日志操作 你也可以参照若依框架的日志系统实现 2 新建一张日志表 sys oper
  • libevent学习篇之一:libevent快速入门

    https www jianshu com p 8ea60a8d3abb LibEvent快速入门 简介 基本的socket变成是阻塞 同步的 每个操作除非已经完成 出错 或者超时才会返回 这样对于每一个请求 要使用一个线程或者单独的进程去
  • 岁月划过生命线(16.02 ~ 10 -提前转正)

    岁月划过生命线 16 02 10 提前转正 标签 coder 10月9号收到了提前转正通知后就想写些总结 总结在微店的一年里见过的人 读过的书 做过的事儿 不然怕很多有意思的细节以后都忘了 但一直找借口迟迟懒得动笔 这篇总结断断续续竟写了一
  • Linux驱动入门必须get的知识点-01.基本框架与操作

    0 编写编译驱动的Makefile 指定驱动的测试的路径 ROOM DIR nfs rootfs home 2 study 指定测试Demo的交叉编译工具链 DEMO DIR home linux 1 DataShare 0 交叉编译工具链