驱动开发--【字符设备、块设备简介】【sky原创】

驱动开发

 

字符设备,块设备,网络设备

 

字符设备

以字节流的方式访问,

不能随机访问

有例外,显卡、EEPROM可以随机访问

 

EEPROM可以擦写1亿次,是一种字符设备,可以随机访问

读写是直接访问硬件的

flash 擦写次数有限,一百万次,容易有坏块

 

块设备

能随机访问

以”块“为单位进行访问

块大小一般为512字节

块的大小由硬件决定

是内核进行数据传输的基本单位

 

 

硬盘结构:

格式化分区是以柱面为单位的,即硬盘的柱面

如果有10个盘面,就有十个柱面

 

对于嵌入式设备

如果是flash的话,结构如下:

flash是以块为单位

有些是页为单位,每页又有很多块

 

字符设备和块设备根本使用的接口不同,

即两种架构

块设备也可以用字符设备的驱动程序的架构来驱动,但是这样效率不高

 

字符设备一般可以直接访问硬件来读取数据

 

块设备一般要经过系统缓存来读取数据

比如说以前的老u盘刚传完电影,直接拔下后可能读不出来这个电影,或者运行有问题,这是因为写入的时候是先写在缓存,再异步写入硬件的

 

 

linux万物皆文件有例外,网络设备在linux中不体现为文件

操作方式是以socket套接字的方式进行访问

 

网络设备接收外部世界(本系统之外)的请求

 

驱动程序的安装方法:

1、直接编译内核

2、需要的时候手动安装

 

 

新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua

 

 

 

 

 

时间: 2024-11-06 03:32:53

驱动开发--【字符设备、块设备简介】【sky原创】的相关文章

linux驱动开发--字符设备:静态分配设备号

字符设备(char device)         采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备).系统标准字符设备,例如:字符中断.串口等设备.常见待开发设备驱动的字符设备,例如:触摸屏.键盘.视频捕捉设备.音频设备等. 设备号 主设备号     用于标识设备类型,内核代码根据该号码对应设备文件和对应的设备驱动程序 次设备号     用于标识通类型的不同设备个体,驱动程序根据该号码辨别具体操作的是哪个设备个体. 设备号

linux驱动开发--字符设备:自动创建设备节点

自动创建设备文件 定义在<linux/device.h>中 class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面 device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面 在加载驱动模块时,用户空间中的udev会自动响应device_create()函数,在/sys下寻找对应的类,从而为这个设备在/dev目录下创建设备文件 内核版本问题: 在内核2.4版本中使用devfs_register 在内核2.6早起版本中使用class_device_r

Linux块设备驱动之内存模拟块设备

用内存代替块设备的总结,相对来简单得多,对内存操作想必大家都很熟悉,直接分配一块内存就可以直接读写操作了 /* 参考:  * drivers\block\xd.c  * drivers\block\z2ram.c  */ #define RAMBLOCK_SIZE (1024*1024)//一个扇区是512字节   static struct gendisk *ramblock_disk; static struct request_queue *ramblock_queue; static D

linux驱动开发--字符设备:简单的file_operations示例

字符设备结构struct cdev 内核使用该结构来表示一个字符设备,在<linux/cdev.h>中定义. 重要成员: struct kobject kobj;//设备对象 struct module *owner;//该设备的拥有者驱动模块 struct file_operations *ops;//设备操作集合 struct list_head list;//内核维护的字符设备链表成员 dev_t dev;//字符设备号 unsigned int count;//设备个数 文件结构 st

linux驱动开发--字符设备:动态分配设备号

设备号的动态分配 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);dev:保存分配到的设备号baseminor:希望分配的起始次设备号count:需要分配的设备号数目name:设备名称(出现在/proc/devices)         返回:成功返回0, 失败返回负值 请求内核动态分配count个设备号,且次设备号从baseminor开始 /** *Copyrig

linux驱动开发--字符设备:创建一组设备节点

cdev改进 为设备驱动支持多个设备个体做准备,针对cdev进行改进 将代表字符设备的cdev对象包含在设备驱动定义的私有数据结构体中 对设备驱动私有数据结构体采用内核内存分配方式为其分配内存 将为每个设备添加cdev对象和创建设备节点封装为一个独立函数 支持多个设备个体 为设备驱动支持多个设备个体对驱动进行改进 循环调用为每个设备添加cdev对象和创建设备节点而封装的独立函数实现在系统中添加对多个设备个体的支持 /** *Copyright (c) 2013.TianYuan *All rig

linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用

private_data改进 为设备驱动支持多个设备个体做准备,针对private_data进行改进 在设备打开操作中通过inode中保存的i_cdev获取代表当前设备的cdev对象 通过代表当前设备的cdev对象得到包含该对象的设备私有数据结构体 将设备私有数据结构体指针保存到struct file的private_data成员中 在其它设备操作中直接使用保存在struct file的private_date成员中的当前设备私有数据结构体 /** *Copyright (c) 2013.Tia

linux驱动开发--字符设备:原子操作

解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 访问共享资源的代码区域称谓临界区(critical sections),临界区需要以某种互斥机制加以保护.中断屏蔽.原子操作.自旋锁和信号量是Linux设备驱动中可采用的互斥途径. 原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作. Linux内核停工了一系列函数来实现内核中的原子操作.这些函数分为两类,分别针对位和整型变量进行原子操作.他们的共同点是在任

linux驱动开发--字符设备:添加文件指针偏移的功能

设备移位操作llseek 对应lseek系统调用的设备移位操作为llseek 默认情况为允许设备移位操作 大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义 设备可选择是否支持移位操作 支持设备移位操作loff_t (*llseek)(struct file *filp, loff_t off, int whence);filp:待操作的设备文件file结构体指针off:待操作的定位偏移值(可正可负)whence:待操作的定位起始位置返回:返回移位后的新文

linux驱动开发--字符设备:信号量

信号量的使用 信号量(semaphore)是用于保护临界区的一种常用方法,它的使用和自旋锁类似.与自旋锁相同,只有得到信号量的进程才能执行临界区代码.但是与自旋锁不同的是当获取不到信号量时,进程不会原地打转而是进入休眠等待状态. 关于信号量的操作函数: 1.定义信号量 struct semaphore sem; 2.初始化信号量 sema_init(struct semaphore *sem, int val);//用于初始化信号量并设置sem为val init_MUTEX(struct sem