I/O输入输出——I/O设备(块设备与字符设备)
无论是块设备还是字符设备,都是属于IO硬件,在整个硬件到软件层之前的了解,有助于我们理解。
I/O设备
块设备
是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。
这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以安装文件系统的方式使用的——这也是块设备的一般访问方式。
字符设备
另一种基本的设备类型是字符设备。是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读写是实时的。
字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。
如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。
设备控制器
无论是块设备还是字符设备,都是硬件的一部分,为了能把这些如 键盘,磁盘盘等的输入输出设备统一管理,就引出了设备控制器的概念,它也是硬件层的部分。
那设备控制器有什么组成,有什么功能呢?
控制器是有三类寄存器,它们分别是状态寄存器(Status Register)、 命令寄存器(Command Register)以及数据寄存器(Data Register)
内存映射
每个控制器有几个寄存器用来与CPU通信,通过写入这些寄存器操作系统可以命令设备发送数据,接收数据,开启或关闭,或者其他操作。通过读取这些寄存器,操作系统可以了解设备的状态,是否准备好接受一个新的命令。
和字符设备不同,块设备,比如我们知道的硬盘,它通常传输的数据量会非常大,于是控制器设立了一个可读写的数据缓冲区。
- CPU 写入数据到控制器的缓冲区时,当缓冲区的数据囤够了一部分,才会发给设备。
- CPU 从控制器的缓冲区读取数据时,也需要缓冲区囤够了一部分,才拷贝到内存。
这个数据缓冲区和寄存器同层。
接下来,我们又了解到,为了满足外设的IO请求或者CPU通知了设备的一个指令,当完成的时候,怎么通知CPU呢?
存在两个可选方法:
在第一个方法,每个控制寄存器被分配一个I/O端口号,这个是一个8/16位的整数。所有I/O端口形成I/O端口空间,并且受到保护使得普通的用户程序不能访问。CPU可以通过特殊的I/O指令读取控制寄存器的内容并存入CPU寄存器REG中。
第二个方法是PDP-11引入的,它将所有控制寄存器映射到内存空间,每个控制寄存器被分配唯一的内存地址,这样的系统称为内存映射I/O。
直接存储器存取
我们就有外部中断,这是通过中断控制器实现。,中断有两种,一种软中断,例如代码调用 INT
指令触发,一种是硬件中断,就是硬件通过中断控制器触发的。
但中断的方式对于频繁读写数据的磁盘,并不友好,这样 CPU 容易经常被打断,会占用 CPU 大量的时间。对于这一类设备的问题的解决方法是使用 DMA(Direct Memory Access) 功能,它可以使得设备在 CPU 不参与的情况下,能够自行完成把设备 I/O 数据放入到内存。那要实现 DMA 功能要有 「DMA 控制器」硬件的支持。
总结
I/O硬件提到了,再往上就进入了I/O软件,比如为了屏蔽不同设备控制器的差异,Linux系统中,设备驱动程序就发挥作用了。
设备控制器不属于操作系统范畴,它是属于硬件,而设备驱动程序属于操作系统的一部分,操作系统的内核代码可以像本地调用代码一样使用设备驱动程序的接口,而设备驱动程序是面向设备控制器的代码,它发出操控设备控制器的指令后,才可以操作设备控制器。
这只是简单的举例。
I/O软件层次
了解块设备和字符设备在键盘输入一个字符时,操作系统发生了什么
I/O输入输出——I/O设备(块设备与字符设备)相关推荐
- 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)
目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...
- linux 编译字符设备驱动错误,linux字符设备驱动框架及编写流程
流程: init { } exit { } 申请设备号 (动态注册/静态注册) 创建一个字符设备 cdev_alloc 初始化字符设备 cdev_init 设备号和字符设备关联 cdev_add 销毁 ...
- 设备树下的字符设备驱动框架
设备树下的字符设备驱动框架 没有引入设备树时,相关寄存器物理地址是直接定义在驱动文件中的,通过地址映射成为虚拟地址后,再操作虚拟地址完成GPIO的初始化.设备树的本质也是操作寄存器,只不过寄存器的相关 ...
- Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
阅读目录 1,以阻塞方式运行: 2,以非阻塞方式运行: 转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章 ...
- linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化
因为Linux字符设备驱动主要依赖于struct cdev结构,原型为: 所以我们需要对所使用到的结构成员进行配置,驱动开发所使用到的结构成员分别为:[unsigned int count;].[de ...
- linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点
嵌入式Linux字符设备驱动开发流程--以LED为例 前言 留空 头文件 #include 查看系统设备类 ls /sys/class 设备类结构体 文件(路径):include/linux/devi ...
- Linux设备驱动入门----globalmem字符设备驱动
1.什么是globalmem虚拟设备 (1).globalmem字符设备驱动中,分配一片内存大小为GLOBALMEM_SIZE(4K)的空间 (2).提供对该片内存的读写.控制和定位函数 (3).用户 ...
- 获取另一个驱动的设备结构体_字符设备驱动的另一种写法
字符设备驱动的另一种写法 在Linux2.6内核中,使用cdev结构体描述一个字符设备; cdev结构体(include/linux/cdev.h)定义如下: struct cdev { struct ...
- 【Android 逆向】Linux 文件分类 ( 普通文件 | 目录文件 | 链接文件 | 字符设备文件 | 管道文件 | 块设备文件 )
文章目录 一.Linux 文件分类 1.普通文件 2.链接文件 3.字符设备文件 4.管道文件 5.块设备文件 一.Linux 文件分类 Linux 文件分类 : " - " 表示 ...
- 字符设备和块设备的区别
设备文件分为Block Device Driver和Character Device Drive两类.Character Device Drive又被称为字符设备或裸设备raw devices; Bl ...
最新文章
- 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理
- 二十八、顺序存储二叉树
- 批处理如何做到等待用户输入一个值(dos命令行)
- HDU4686 Arc of Dream —— 矩阵快速幂
- 快速完全删除node_modules
- 学习Java的深拷贝和浅拷贝
- jQuery.Callbacks之demo
- 取出客户端卸载CKEditor中的内容,放入数据库中的方案
- 创建链路状态状态数据包
- c语言 乱序字符,C语言中两种结构体成员初始化方式:顺序和乱序
- 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(1)
- 共享文件夹加密专家_文件加密_公司如何防止员工内部泄密?
- CentOS7创建桌面快捷方式
- 职业发展,选择大都市还是回老家?
- 晶体DSX321G被公认的车载晶振在无人货车上也将功能发挥的淋漓精致
- MATLAB 手把手教你如何将视频水彩风格化(简易版)
- 【辗转反侧不得眠,心中疑惑何时解】---前段时间安装了showdoc,由于停电忘记怎么安装的了--稀里糊涂的重启showdoc
- 【ArcGIS错误异常100问】之002:Error 000735 简化容差:值是必需的(简化线、简化面工具)
- 13个SpringBoot优秀学习项目
- 学习 | 遗传力与田间试验设计