`

Linux 字符设备文件 简介

阅读更多

P { MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px }

设备号

创建设备文件

设备注册

重要数据结构

设备操作

 

设备号

用ls -l查看,设备文件项中有两个数(中间有逗号),是为主次设备编号

 

字符设备文件调用字符设备驱动访问硬件

 

主设备号用来标识驱动程序,次设备号被驱动程序用来辨别操作的是那个设备

 

主设备号反映设备类型,次设备号用来区分同类型的设备

 

内核中使用dev_t这个类型描述设备号,为unsigned int 32位,其中高12位为主设备号,低20位为次设备号

 

MAJOR(dev_t dev)提取主设备号

MINOR(dev_t dev)提取次设备号

 

内核采用静态申请、动态申请的方法给设备分配主设备号

 

静态申请

根据documenta/devices.txt,找出没有使用的主设备号,使用regist_chrdev_region函数注册设备号

可能导致冲突

 

int register_chrdev_region(

dev_t from,       希望申请的设备号

unsigned count,  设备数量

const char *name 设备名称,体现在/proc/devices

)

 

动态申请

alloc_chrdev_region分配设备号

优点:易于推广

缺点:是无法在安装驱动前创建设备文件(还没分配主设备号)

解决办法:

安装驱动后,从/proc/devices中查询设备号

 

int alloc_chrdev_region(

dev_t *dev, 无需传值,写入

unsigned baseminor, 起始次设备号

unsigned count, 设备数目

const char *name 设备名称

)

 

设备注销

不再使用设备时,应注销掉设备号

 

void unregistor_chrdev_region( dev_t from, unsigned count)

 

创建设备文件

 

1、使用mknod命令手工创建

 

mknod filename type major minor

参数:文件名、类型、主设备号、次设备号

如:mknod serial0 c 100 0

 

2、自动创建

在驱动程序中,通过函数调用

 

设备文件的作用

设备文件本身无任何内容,只是在应用程序与设备驱动之间建立桥梁,帮助应用程序

 

文件数据结构

 

Struct file 代表一个打开的文件。每个打开的文件在内核空间都有一个关联的struct file,记录文件读写位置。一个文件打开10次,则有10个Struct file。内核打开文件时创建,关闭后释放

主要成员:

loff_t f_pos 文件读写位置

struct file_operations *f_op

 

Struct inode 记录文件物理上的信息

Struct file_operations 一个函数指针的集合,定义能在设备上进行的操作 。结构中的成员指向驱动中的函数

 

strunct file_operations mem_fops = {

.owner = THIS_MODULE,

.llseek = mem_seek,

.read = mem_read,

.write = mem_write,

.ioctl = mem_ioctl,

.open = mem_open,

.release = mem_release,

};

 

字符设备的注册

在linux 2.6内核中,字符设备使用struct cdev这个结构来描述:

1、分配 cdev

struct cdev *cdev_alloc(void)

2、初始化 cdev

void cdev_init(struct cdev *cdev, const struct file_operations *fops)

3、添加 cdev

init cdev_add(struct cdev *p, dev_t dev, unsigned count)

参数:设备、设备号、数目

 

实现file_operations里面注册的函数

int (*open)(struct inode *, struct file *)

打开这个设备,并不要求驱动程序一定要实现, open = NULL表示设备永远打开,不需要手动打开

 

void (*release)(struct inode *, struct file *)

关闭设备

 

read 读

write 写

poll 对应select系统调用

ioctl 控制设备

mmap 将设备映射到进程虚拟地址空间

llseek 修改文件的当前读写位置,并将新位置作为返回值

 

 

open函数

int (*open)(struct inode *, struct file *)

初始化设备、标明次设备号

 

读和写

ssize_t xxx_read(struct file * filp, char __user * buff, size_t count, loff_t * offp);

ssize_t xxx_write(struct file * filp, char __user * buff, size_t count, loff_t * offp);

filp=文件指针,(正在操纵的文件)

count=请求传输的数据量,对应系统调用里传入的count

buff = 参数指向数据缓存 ,对应系统调用里传入的fuff, 是用户空间指针,不能被内核代码直接引用(用户空间指针在内核空间可能是无效的,没有那个地址的映射)

offp = 指出文件的当前访问位置(字节索引) 内核会把Struct file里面的loff_t f_pos 植入这个参数

 

内核提供了专门的函数访问用户空间指针

int copy_from_user(void *to, const void_user *from, int n)  == write 数据从用户流向驱动

int copy_to_user(void __user *to, const void *from, int n) ==read 数据从驱动流向用户

 

设备注销

int cdev_del(struct cdev *p)

 

字符设备驱动程序 memdev.c

 

module_init() 内核模块的入口

分享到:
评论

相关推荐

    linux字符设备驱动实例

    在Linux中,字符设备驱动通常基于字符设备文件模型,它由设备号(major和minor number)标识,用于区分不同的设备。驱动程序通过注册到内核的字符设备接口来提供服务,包括打开、关闭、读取、写入等操作。 1. **...

    linux字符设备驱动程序学习笔记

    Linux 字符设备驱动程序...Linux 字符设备驱动程序学习笔记中还介绍了驱动程序的分类、字符设备驱动程序的设计、驱动程序的安装方式、设备文件的概念等知识点,为读者提供了系统的 Linux 字符设备驱动程序学习资源。

    Linux字符设备驱动总结

    Linux字符设备驱动是操作系统与硬件交互的关键部分,它允许用户空间程序通过标准的文件操作接口与硬件设备进行通信。在Linux系统中,字符设备通常处理流数据,如键盘输入、串口通信或打印机输出,这些设备以字符为...

    Linux字符设备驱动实现

    总之,编写Linux字符设备驱动是一项技术性极强的任务,它涉及到内核编程、同步机制和设备驱动模型的理解。通过实现一个简单的聊天程序,我们可以直观地看到字符设备驱动如何在用户空间和内核空间之间搭建桥梁,提供...

    Linux字符设备驱动(转载)

    字符设备在文件系统中表现为特殊的文件,它们有自己的i节点,文件类型标记表明它们是字符设备文件。这些设备文件可以像普通文件一样被打开、关闭、读取和写入。字符设备驱动主要负责以下三个方面的工作: 1. 定义`...

    Linux 字符设备驱动程序的设计

    通过以上内容,我们可以看出Linux字符设备驱动程序的设计主要围绕着设备文件的创建、初始化过程以及基本入口点的设置展开。掌握这些基础知识对于理解和编写高效的Linux字符设备驱动程序至关重要。

    Linux 字符设备驱动(一).pdf

    Linux字符设备驱动是Linux内核中用于管理各种字符型输入输出设备的软件组件,其主要负责数据传输操作。字符设备驱动在操作系统与硬件设备之间起到了桥梁的作用,它能够将复杂的硬件操作抽象成一系列统一的接口,供...

    深入浅出 Linux字符设备驱动程序解析

    本篇文章将深入讲解Linux字符设备驱动程序的原理和实现方法。 首先,Linux将设备分为两类:字符设备和块设备。字符设备以字符流的形式传输数据,例如键盘、串口等;而块设备则是以块为单位进行数据传输,如硬盘、...

    linux字符设备驱动程序

    ### Linux字符设备驱动程序详解 #### 一、概述 在Linux系统中,设备驱动程序是操作系统与硬件设备之间的重要桥梁,负责实现操作系统对硬件设备的访问。根据设备数据传输方式的不同,Linux设备主要分为三类:字符...

    Linux字符设备驱动实验代码

    简单的字符设备的驱动程序,并对所编写的设备驱动程序进行测试,了解Linux操作系统如何管理字符设备。由于网上许多资源不完整,本资源整合了许多内容。包括驱动程序memdev.c,memdev.h,app-mem.c,MakeFile文件。...

    linux 字符设备驱动例程

    总的来说,编写Linux字符设备驱动和平台驱动需要理解内核接口、设备模型以及硬件交互机制。这个例程提供了一个基础的起点,通过对其实现的分析,开发者可以进一步学习和实践Linux驱动编程,从而掌握更多高级特性和...

    基于Linux字符设备驱动程序的设计与实现

    Linux字符设备驱动程序是一种在Linux操作系统中,为特定硬件设备提供的软件程序,它为用户层的应用程序提供了一组标准化的接口,使得这些程序能够控制硬件而无需了解硬件工作细节。Linux内核中的驱动程序运行在内核...

    Linux增加字符设备驱动实验

    在Linux系统中,字符设备驱动是操作系统与硬件设备交互的核心组件之一。字符设备驱动程序处理来自用户空间的应用程序对特定设备的I/O请求,并通过内核接口与硬件进行通信。本实验旨在帮助你理解如何为Linux添加一个...

    操作系统课程设计—linux字符设备驱动程序

    操作系统课程设计—Linux字符设备驱动程序是学习操作系统底层机制的重要实践环节,特别是对那些希望深入理解Linux内核的开发者来说,具有极高的学习价值。字符设备驱动程序是连接硬件和操作系统之间的桥梁,它负责...

    linux字符设备驱动代码,副实验报告(很详细)

    这篇副实验报告详细探讨了如何编写Linux字符设备驱动程序,这对于理解和开发此类驱动至关重要。 首先,字符设备驱动的主要任务是处理数据的读写操作,以及设备的打开、关闭、中断处理等。在Linux中,驱动程序通常...

    最简单的linux字符设备驱动

    一个最简单的字符设备驱动程序,包括LDD第三版前三章的内容。 关键是书中并未讲的太细,关于mknod以及如何自己写一个程序使用自己的驱动,我的代码中有详细的过程,也在blog中写明了驱动模块的思路以及常见问题的...

    linux 字符设备驱动程序 示例代码

    本示例代码提供了关于如何编写Linux字符设备驱动程序的详细教程,包含8个文件,涵盖了从基础到进阶的不同方面。 首先,我们来看`01静态分配设备号`。在Linux中,每个设备都有一个唯一的设备号,由主设备号和次设备...

    linux设备文件和驱动

    Linux 设备文件和驱动 Linux 设备文件是 Linux 操作系统中的一种特殊文件,它们用来访问和控制硬件设备。设备文件可以是字符设备、块设备或网络设备,每种设备文件都有其特定的文件属性和设备号。字符设备和块设备...

Global site tag (gtag.js) - Google Analytics