阻塞IO:
阻塞read过程假想:
sys_call read-->新起一个进程调用io驱动程序read; 本进程调用wait_event(),将本进程的状态设置为阻塞,并放入wait队列
-->驱动程序read完成后,发送一个中断请求-->cpu调度程序将wait队列里的阻塞进程设置为就绪状态。
外设接口的访问以前有两种方式:
1.中断
2.程序轮询 --
但是随着外部设备种类的增多、速度差异的加大,这种方式逐渐成为系统性能提高的障碍。
到8位机出现以后,这种外设控制方式(体系结构)被淘汰。
=====================================================================================================
printf函数是c语言函数,它调用了write函数,write是系统调用接口。printf和write都是在用户层执行。
write调用了int 0x80,陷入内核,执行了sys_write。printf->write->int 0x80->sys_write
sys_read的调用层次:
文件系统主要数据结构>>从文件 I/O 看 Linux 的虚拟文件系统
https://www.ibm.com/developerworks/cn/linux/l-cn-vfs/
DMA数据传输可以以两种方式触发:一种
软件请求数据
,另一种
由硬件异步传输
。
a -- 软件请求数据
调用的步骤可以概括如下(以read为例):
(1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。
(2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。
(3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。
b -- 由硬件异步传输
在 DMA 被异步使用时发生的。以数据采集设备为例(例如网卡传输):
(1)硬件发出中断来通知新的数据已经到达。
(2)中断处理程序分配一个DMA缓冲区。
(3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。
(4)处理程序利用DMA分发新的数据,唤醒任何相关进程。
=========================================================================================================