首页 > 其他分享 >2 - 第一个驱动

2 - 第一个驱动

时间:2024-02-19 21:01:53浏览次数:23  
标签:GPL 第一个 module KERN MODULE world 驱动 hello

First Linux Device Driver

原文链接

我的博客

预备环境

在原文链接中给出了 ubuntu 环境、树莓派环境、比格板环境的搭建指南,可以参考搭建,最好使用推荐的比格板,因为后面会涉及到设备驱动,比格板嵌入式平台方便扩展。

第一个 Linux 设备驱动

模块信息

  • 证数
  • 作者
  • 模块描述
  • 模块版本

证书

GPL: GNU General Public License,是软件的一种开源证数。如果你的软件具有 GPL 证书,那么它是自由软件。自由软件并不意味着是免费的软件,它也可以是付费软件。下面的证书是当前可以用来表明软件是自由软件的证书。

GPL: GNU Public License v2 or Later

GPL v2: GNU Public License v2

GPL and additional rights: GNU Public License v2 rights and more

Dual BSD/GPL: GNU Public License v2 or BSD license choice

Dual MIT/GPL: GNU Public License v2 or MIT license choice

Dual MPL/GPL: GNU Public License v2 or Mozilla license choice

上面的一些证书是双证书,但是在 Linux 下运行时,它就是 GPL 证书。证书存在有多重意义:

  1. 用户可以使用 modinfo 展示证书信息,表示这个软件是自由软件
  2. 社区可以用它来避免侵权
  3. 供应商可以按照自己的意愿来提供软件

我们可以按照下面的方式指定模块的证书,实现下面的操作,首先要包含 Linux/module.h 头文件:

MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("Dual BSD/GPL");

证书并不是强制要求的,不过还是建议在自己的软件中使用证书。

作者

使用这个宏,我们可以知道软件是由谁写的,这样使用 modinfo 就能够将作者名称展示出来:

MODULE_AUTHOR("Author");

同样的,需要包含 linux/module.h 头文件,我们可以将自己的邮件写到这个位置,如果有多个作者,可以使用多个 MODULE_AUTHOR 宏来展示。

模块描述

使用这个宏,我们可以展示软件的一些详细信息,这样使用 modinfo 就能够将模块的描述信息展示出来:

MODULE_DESCRIPTION("A sample driver");

同样的,需要包含 linux/module.h 头文件。

模块版本

使用这个宏,我们可以展示软件的版本信息,使用 modinfo 将会展示这一信息:

MODULE_VERSION("2:1.0");

简单内核模块编程

所有的程序都需要有入口点与退出点。在编写内核程序时,入口点与退出点分别是如下两个函数:

  • 初始化函数
  • 退出函数

需要注意的是,内核模块使用的头文件与用户空间程序头文件有所区别。内核模块代码不能调用用户空间库/API/系统调用。

初始化函数

当设备驱动加载到内核中时,比如使用 insmod 插入内核时,会首先执行这个函数。下面是这类函数的形式:

static int __init hello_world_init(void)
{
    return 0;
}

module_init(hello_world_init);

这个函数通过 module_init 宏注册。

退出函数

当卸载设备驱动时,比如使用 rmmod 卸载模块时,会在收尾阶段执行这个函数,下面是这类函数的形式:

void __exit hello_world_exit(void)
{
}

module_exit(hello_world_exit);

这个函数通过 module_exit 宏注册。

printk

在内核中,可以使用 printk 接口打印不同等级的日志信息,下面是这个函数的使用方式:

printk(KERN_INFO "Test printk %dst time", 1);

可以使用的打印等级有:

  • KERN_EMERG
  • KERN_ALERT
  • KERN_CRIT
  • KERN_ERR
  • KERN_WARNING
  • KERN_NOTICE
  • KERN_INFO
  • KERN_DEBUG

在较新版本的内核中,除 printk 外,可以使用下面的接口打印日志:

  • pr_info,打印一个 KERN_INFO 等级的日志信息
  • pr_cont,在同一行打印日志信息
  • pr_debug,打印一个 KERN_DEBUG 等级的日志信息
  • pr_err,打印一个 KERN_ERR 等级的日志信息
  • pr_warn,打印一个 KERN_WARN 等级的日志信息

第一个设备驱动

下面是我们第一个设备驱动:

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

static int __init hello_world_init(void)
{
    printk(KERN_INFO "Welcome to Linux Kernel Module\n");
    return 0;
}

static void __exit hello_world_exit(void)
{
    printk(KERN_INFO "Linux Kernel Module Bye\n");
}

module_init(hello_world_init);
module_exit(hello_world_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("^_^");
MODULE_DESCRIPTION("First Linux Kernel Module");
MODULE_VERSION("1:1.0");

编译驱动

可以使用下面的 Makefile 直接编译:

obj-m += hello_world_module.o

KDIR = /lib/modules/$(shell uname -r)/build

all:
	make -C $(KDIR) M=$(shell pwd) modules

clean:
	make -C $(KDIR) M=$(shell pwd) clean

加载/卸载驱动

加载

sudo insmod hello_world_module.ko

列出模块

lsmod | grep hello

卸载

sudo rmmod hello_world_module

获取模块详细信息

modinfo hello_world_module.ko

标签:GPL,第一个,module,KERN,MODULE,world,驱动,hello
From: https://www.cnblogs.com/arvin-blog/p/18021942

相关文章

  • 软件架构模式之第五章:事件驱动架构
     第五章:事件驱动架构近年来,事件驱动架构风格显著增长并广泛应用,我们对其理解方式也发生了改变。这种高采用率并不令人意外,因为事件驱动架构能够解决复杂的非确定性工作流和高度反应和响应的系统等难题。此外,新技术、工具、框架和基于云的服务使得事件驱动架构比以往更易访问......
  • RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • 防干扰LCD显示液晶驱动VK2C23A/B 适用于胎压监测器,胎压仪表,胎压显示,胎压检测器等仪表
    VK2C23A/B概述:      VK2C23A/B是一个点阵式存储映射的LCD驱动器,可支持最大224点(56SEGx4COM)或者最大416点(52SEGx8COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也可通过指令进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。特点:•......
  • 《AI驱动下的开发者新生态》-2024长沙.NET技术社区活动-诚邀大家报名
    回顾2019年初,在.NET中文社区及包括苏州、广州、深圳等地区社区等大力推动、在众多企业的大力支持下,长沙地区的开发者们发起成立了长沙.NET技术社区,并组织了《2019年长沙开发者技术大会》,当时参会人数超过200多人,会上宣讲的约6个话题,也一度成为长沙地区比较热门的技术话题,在社区激......
  • 迈从AX5 PRO MAX拆解以及驱动说明
    迈从黑武士AX5PROMAX拆解图看到拆解可以了解以下:编码器是防尘的、鼠标微动是TTC的光微动,是免焊接的,后续更换方便。鼠标正面涂了三防漆,背面无。按键柱的两个贴片目测至少0.7MM以上 鼠标微动手感:脆闷AX5PROMAX型号: 602535500MA 电池数据:长36MM、宽24.5MM、厚度5.8MM电......
  • Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试
    2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研究。到了2024年2月,已经有了一个用于时间序列预测的开源......
  • Linux之驱动管理
    一、相关概念驱动概念驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁。将驱动程序载入内核,应用程序可以通过系统调用接口来访问(驱动)底层的硬件设备。驱动功能对设备初始化和释放把数据从内核传送到硬件和从硬件读取数据读取应用程序传送给设备文件的数据......
  • 驱动相关
    1.什么是驱动程序?驱动程序是允许Microsoft?Windows?(或其它操作系统)与系统中的硬件设备进行通信的软件。如显卡、声卡、调制解调器之类的设备都需要驱动程序才能在Windows中正常工作。有时Windows附带设备驱动程序,但一般情况下,需要单独下载和安装驱动程序。2.应该以什么顺序安装......
  • 【驱动】块设备驱动(二)-通用块层
    前言通用块层是一个内核组件,处理来自系统其他组件发出的块设备请求。换句话说,通用块层包含了块设备操作的一些通用函数和数据结构,如通用磁盘结构gendisk,请求队列结构request_queue、请求结构request、块设备I/O操作结构bio和块设备操作结构block_device_operations等。关键数据......
  • 领域驱动设计(Domain-Driven Design,简称DDD)【简介 个人学习笔记】
    找到了第1篇资料:领域驱动设计详解:是什么、为什么、怎么做?-知乎找到了第2篇资料:领域驱动架构(DDD)建模中的模型到底是什么?-知乎找到了第3篇资料:一文看懂DDD领域驱动设计-知乎找到了第4篇资料:什么是DDD(领域驱动设计)?这是我见过最容易理解的...找到了第5篇资料:领......