Linux中I/O设备分为两类:块设备和字符设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。

(1) 字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。

(2) 块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

两种设备本身并没用严格的区分,主要是字符设备和块设备驱动程序提供的访问接口(file I/O API)是不一样的。本文主要就数据接口、访问接口和设备注册方法对两种设备进行比较。

1、数据结构

1.1字符设备数据结构

struct file; 
        struct inode;

file定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 文件结构代表一个打开的文件. 它由内核在 open 时创建, 并传递给在文件上操作的任何函数, 直到最后的关闭. 在文件的所有实例都关闭后, 内核释放这个数据结构。

inode 结构由内核在内部用来表示文件.inode 结构包含大量关于文件的信息其中dev_t i_rdev成员包含实际的设备编号.struct cdev *i_cdev中struct cdev 是内核的内部结构, 代表字符设备。

1.2块设备数据结构

struct gendisk (定义于 <linux/genhd.h>) 是单独一个磁盘驱动器的内核表示. 事实上, 内核还使用 gendisk 来表示分区。

2、设备访问接口

2.1字符设备访问接口

struct file_operations 其中file_operation 结构中的每个成员必须指向驱动中的函数, 这些函数实现一个特别的操作, 或者对于不支持的操作留置为 NULL. 当指定为 NULL 指针时内核的确切的行为是每个函数不同的,该结构中主要函数如下:

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

filp 是文件指针, count 是请求的传输数据大小. buff 参数指向持有被写入数据的缓存, 或者放入新数据的空缓存. 最后, offp 是一个指针指向一个"long offset type"对象, 它指出用户正在存取的文件位置. 返回值是一个"signed size type"。

2.2块设备访问接口

字符设备通过 file_ 操作结构使它们的操作对系统可用. 一个类似的结构用在块设备上; 它是 struct block_device_operations, 定义在 <linux/fs.h>,其主要操作方法如下:

int (*open)(struct inode *inode, struct file *filp); 
        int (*release)(struct inode *inode, struct file *filp);

就像它们的字符驱动对等体一样工作的函数; 无论何时设备被打开和关闭都调用它们. 一个字符驱动可能通过启动设备或者锁住门(为可移出的介质)来响应一个 open 调用. 如果你将介质锁入设备, 你当然应当在 release 方法中解锁。

int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);

实现 ioctl 系统调用的方法. 但是, 块层首先解释大量的标准请求; 因此大部分的块驱动 ioctl 方法相当短。

3、设备注册

3.1字符设备注册

int register_chrdev_region(dev_t first, unsigned int count, char *name) 
        int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name) 
        void unregister_chrdev_region(dev_t first, unsigned int count);

允许驱动分配和释放设备编号的范围的函数. register_chrdev_region 应当用在事先知道需要的主编号时; 对于动态分配, 使用 alloc_chrdev_region 代替.

3.2块设备注册

int register_blkdev(unsigned int major, const char *name); 
        int unregister_blkdev(unsigned int major, const char *name);

register_blkdev 注册一个块驱动到内核, 并且, 可选地, 获得一个主编号. 一个驱动可被注销, 使用 unregister_blkdev。

转载于:https://www.cnblogs.com/youngerchina/p/5624458.html

Linux字符设备与块设备的区别与比较相关推荐

  1. linux 读写设备文件,linux-中块设备文件及字符设备文件的本质区别

    原标题:linux-中块设备文件及字符设备文件的本质区别 在LINUX系统文件类型分类的文章中我们提到了 块设备 和 字符设备文件,那么什么是块设备 字符设备文件呢?他们之间有什么本质上的区别呢? 设 ...

  2. linux mtd 块设备,Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别...

    转:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_a ...

  3. linux字符设备和块设备的区别 以及网络设备

    一.字符设备 1.字符设备以字节为单位.大多数设备是字符设备,因为他们不需要缓冲而且不以固定块大小进行操作. 2.字符设备无需缓冲直接读写. 3.字符设备只能被顺序读写. 二.块设备 1.块设备只能以 ...

  4. linux中I/O设备分为两类:字符设备和块设备。

    Linux中I/O设备分为两类:字符设备和块设备.两种设备本身没有严格限制,但是,基于不同的功能进行了分类. (1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取.相反,此类设备 ...

  5. 字符设备和块设备的区别

    设备文件分为Block Device Driver和Character Device Drive两类.Character Device Drive又被称为字符设备或裸设备raw devices; Bl ...

  6. 字符设备和块设备区别

    字符设备和块设备区别 Linux中I/O设备分为两类:字符设备和块设备.两种设备本身没有严格限制,但是,基于不同的功能进行了分类来. (1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持 ...

  7. linux三大驱动类型:字符设备、块设备、网络设备

    1. 字符设备 字符设备指能够像字节流串行顺序依次进行访问的设备,对它的读写是以字节为单位.字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由字符设备驱动提供 ...

  8. Linux驱动笔记-字符设备,块设备,网络设备

      在Linux设备驱动开发中,粗略的将设备分为三种类型:字符设备,块设备和网络设备. 1.字符设备:指能够像字节流串行顺序依次进行访问的设备,对它的读写是以字节为单位.字符设备的上层没有磁盘文件系统 ...

  9. 字符设备、块设备、网络设备

    字符设备.块设备.网络设备 设备模型 设备驱动的代码量占内核程序的50% 设备模型的意义: 为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理.电源管理等,Linux内核提出了设备 ...

最新文章

  1. SQL,NoSQL优缺点总结
  2. Java开发神器Lombok的使用与原理
  3. 《研磨设计模式》chap25 访问者模式Visitor(3)联合组合模式+总结
  4. Java设计模式分为创建模式, 结构模式, 行为模式 3种类型
  5. java char short区别_java 彻底理解 byte char short int float long double
  6. JDBC 连接Hive 简单样例(开启Kerberos)
  7. linux runqueue定义,Linux中多CPU的runqueue及抢占
  8. python学习之简介
  9. JS === 实现通过点击td 跳转相应的图片
  10. 计算机管理界面截图,电脑网页页面太长怎么截图网页界面滚动截图的三种方法...
  11. 安徽大学线性代数习题册(第三章详细解答)
  12. 云南智慧医院一卡通建设解决方案,昆明数字化医疗办公、就诊、用餐、停车一卡通用
  13. 2018 网易校招题目
  14. signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
  15. 共享文件夹----详细教程
  16. Python基本数据类型-字符串的操作
  17. Python+Excel:批量重命名多个工作簿
  18. php 中字符串长度不正确
  19. python爬取discuz_爬虫技术实践(二)Discuz! 按板块爬取帖子内容实战
  20. ../Libraries/core_cm3.c(445): error: non-ASM statement in naked function is not supported

热门文章

  1. java amqp_AMQP协议
  2. 泰克示波器查眼图_泰克示波器
  3. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
  4. 关于 jsp java servlet 中文汉字乱码的解决方法
  5. Redis源码剖析(六)事务模块
  6. 1032 挖掘机技术哪家强 (20 分)(c语言)
  7. 柱状图中最大的矩形—leetcode84
  8. 最大子序和—leetcode53
  9. Ring3下Inline Hook API
  10. java,验证码base64编码到json字符串出显数据一行一行的问题,关于base64编码函数解释