该内容课本也有。
中断器基本结构
响应优先级 A>b>c 处理优先级 C>B>A
当前cpu在执行A的中断服务程序,所以屏蔽寄存器也是A的,则当BC信号同时到达是B,C都不会被屏蔽,INTR输出的BC的中断,同时判优线路会根据BC的响应优先级,判断应该执行B的中断服务程序。
则此时cpu处理的是B的中断服务程序,于是屏蔽寄存器也会变成B的,但是C的处理优先级还是比B高,于是经过和上述相同的过程后开始执行C的中断服务程序。
C执行完后恢复现场和屏蔽字,中断返回,执行B,B之后是A。‘
例题:
printf
A程序输出一个字符后就执行中断服务程序,此时A被中断,B开始运行。B运行的同时在运行中断服务程序。
因为在进程切换后页表也变化,字符串会被覆盖,所以要用到内核空间
DMA
scanf
先键盘输入,将数据送入到内核缓冲区,然后再从内核缓冲区,输出到用户缓冲区。
首先是scanf,进行系统调用并,将进程插入阻塞队列,对应上面的图片 sleep_if_empty;
然后用户在键盘上输入字符,这样键盘的设备控制器就有数据了,有数据之后就要启动中断处理程序;
在中断处理程序取出字符,用驱动程序将取出的字符,送入内核缓冲区;然后再将内核缓存区的字符复制到用户缓存区;
这一步完成后就可以从系统调用返回;
之后就可以将p进程放回就绪队列了。