Linux驱动概述

本文介绍了Linux设备驱动的基础概念,包括设备驱动的分类、设备文件的作用及属性、设备驱动的编程框架等内容,并详细解释了如何创建和操作字符设备驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设备驱动分类:字符设备,块设备,网络设备
在/dev目录下使用ls –l 命令可以查看各个设备的类型,主从设备号
cat /proc/devices可以查看系统中所有设备对应的主设备号

设备文件:
设备类型、主从设备号是内核与设备驱动程序通信时使用的
应用程序使用设备文件节点访问对应设备
Linux 2.4引入了设备文件系统(devfs)所有的设备文件作为一个可以挂载的文件系统
每个主从设备号确定的设备都对应一个文件节点
每个设备文件都有其文件属性(c或者b)
每个设备文件都有2个设备号:
主设备号:用于标识驱动程序
从设备号:用于标识同一驱动程序的不同硬件
设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致
系统调用是内核与应用程序之间的接口
设备驱动程序是内核与硬件之间的接口

驱动程序没有main函数,它以一个模块初始化函数作为入口。
驱动程序完成初始化之后不再运行,等待系统调用
驱动程序不能使用标准C库
驱动程序是内核的一部分,工作在内核态
无法通过指针直接将驱动程序和应用程序的数据地址进行传递
系统提供一系列函数帮助完成数据空间转换
get_user
put_user
copy_from_user
copy_to_user

Linux驱动程序功能:
对设备初始化和释放
把数据从内核传送到硬件和从硬件读取数据
读取应用程序传送给设备文件的数据和回送应用程序请求的数据
检测和处理设备出现的错误

字符设备驱动框架:
定义file_operations结构体,规定了驱动程序向应用程序提供的操作接口
  该结构体的成员是文件指针,把驱动函数赋给相应的文件指针,当应用程序使用系统调用(如read, wrtie)时,就能对应到这个驱动函数
static struct file_operations demo_fops = {
    owner: THIS_MODULE,
    write: demo_write,
    read: demo_read,
    ioctl: demo_ioctl,
    open: demo_open,
    release: demo_release,
};
demo_fops就是file_operations类型的结构体变量,在中括号中为成员赋值

open的操作
当应用程序打开设备时对设备进行初始化
  static int demo_open(struct inode *inode, struct file *file)
  {
        MOD_INC_USE_COUNT;
}
使用MOD_INC_USE_COUNT增加驱动程序的使用次数
release操作
当应用程序关闭设备时处理设备的关闭操作
  static int demo_open(struct inode *inode, struct file *file)
  {
        MOD_DEC_USE_COUNT;
}
使用MOD_DEC_USE_COUNT减少驱动程序的使用次数

write的操作
static ssize_t demo_write(struct file *filp, const char *buf, size_t count)
{
    char drv_buf[];
    copy_from_user(drv_buf, buf, count);
    ……
}
u_long copy_from_user(void *to, const void *from, u_long len);
把buf的内容写入到drv_buf, 从应用程序接收数据到硬件

read的操作
static ssize_t demo_read(struct file *filp, const char *buf, size_t count)
{
    char drv_buf[];
    copy_to_user(buf, drv_buf, count);
    ……
}
u_long copy_to_user(void * to, const void *from, u_long len);
把drv_buf的内容写入到buf, 从硬件读取数据交给应用程序

ioctl的操作
static int eint_key_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    switch(cmd)
    {
        case A命令:处理A命令;break;
        case B命令:处理B命令;break;
}
}

驱动程序初始化函数
Linux在加载内核模块时会调用初始化函数:
初始化驱动程序本身
使用register_chrdev向内核注册驱动程序
  static int __init demo_int(void)
  {
        register_chrdev(MAJOR_NR, DEVICE_NAME, &test_fops);
}
  第一个参数代表要注册的主设备号,写“0”表示系统自动分配
  第二个参数代表设备的名称,可以用一个宏定义
第三个参数指向包含有驱动程序接口函数信息的file_operations结构体

驱动程序退出函数
Linux在卸载内核模块时会调用退出函数
释放驱动程序使用的资源
使用unregister_chrdev从内核中卸载驱动程序
  static void __exit demo_exit(void)
{
        unregister_chrdev(MAJOR_NR, DEVICE_NAME);
}

将驱动程序模块注册到内核
内核需要知道模块的初始化函数和退出函数,才能将模块放入自己的管理队列中
向内核声明当前模块的初始化函数module_init()
向内核声明当前模块的退出函数module_exit()
module_init(demo_init);
module_exit(demo_exit);

加载驱动程序:
  insmod 内核模块文件名  如:insmod gpio.o
  执行这个命令后,就调用module_init,完成对设备的初始化
卸载驱动程序:
  rmmod 内核模块文件名(不带.o)如:rmmod gpio
  执行这个命令后,就调用modult_exit,对设备释放
查看系统已安装的驱动:
  lsmod
建立设备文件:
  mknod 文件路径 c 主设备号 从设备号
  文件名随便起,c代表是字符设备,主设备号是设备注册时的主设备号,一定要对应,从设备号随便写。用cat /proc/devices 查看主设备号

以上完成了设备驱动的加载,应用程序可以使用标准C文件函数对设备操作


转载于:https://www.cnblogs.com/qinkai/archive/2012/04/03/2431525.html

### 嵌入式 Linux 驱动程序开发概述 嵌入式 Linux 设备驱动程序作为连接硬件与操作系统内核的关键组件,在整个系统架构中扮演着重要角色。它负责屏蔽底层硬件的具体实现细节,提供统一的操作接口供应用程序调用[^1]。 #### 1. 驱动程序的角色 驱动程序的主要职责是对特定硬件设备进行初始化、配置和控制,并管理数据的输入输出流程。在嵌入式 Linux 中,驱动程序充当了硬件抽象层 (HAL),使得上层软件无需关心具体的硬件差异即可完成任务[^2]。 #### 2. 工作原理 嵌入式 Linux驱动程序遵循模块化设计理念,通常以内核模块的形式存在。这些模块可以动态加载到运行中的内核或者静态编译进内核镜像文件之中。当某个外设被接入时,相应的驱动会检测并识别该设备,随后建立通信链路来执行必要的操作。这一过程涉及到多个核心机制: - **设备模型**:定义了一套标准化的数据结构用于描述各种类型的物理装置及其属性。 - **I/O 子系统**:提供了访问内存映射寄存器或端口的方法论支持。 - **中断服务例程**:用来响应来自外部世界的事件信号,确保实时性和效率最大化。 另外还包括但不限于字符设备驱动、块设备驱动等方面的知识点讲解[^3]。 #### 示例代码展示 下面给出一段简单的字符设备驱动框架示例: ```c #include <linux/module.h> #include <linux/kernel.h> static int __init my_driver_init(void){ printk(KERN_INFO "My Driver Initialized\n"); return 0; } static void __exit my_driver_exit(void){ printk(KERN_INFO "My Driver Exited\n"); } module_init(my_driver_init); module_exit(my_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Example Author"); MODULE_DESCRIPTION("A Simple Example of Character Device Driver."); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值