没有合适的资源?快使用搜索试试~ 我知道了~
7.第七周课件--IO方式和内核空间IO软件1
需积分: 0 0 下载量 102 浏览量
2022-08-03
23:55:06
上传
评论
收藏 701KB PDF 举报
温馨提示
试读
33页
① CPU处于开中断状态 ② 在一条指令执行完 ③ 至少要有一个未被屏蔽的中断请求 ① 关中断(“中断允许位” 清0):使CPU处于“禁止中断”状态,以防止 ②
资源详情
资源评论
资源推荐
三种基本I/O方式
° 程序直接控制方式(最简单的I/O方式)
• 无条件传送:对简单外设定时(同步)进行数据传送
• 条件传送:CPU主动查询,也称程序查询或轮询(Polling)方式
° I/O Interrupt (中断I/O方式): 几乎所有系统都支持中断I/O方式
• 若一个I/O设备需要CPU干预,它就通过中断请求通知CPU
• CPU中止当前程序的执行,调出OS(中断处理程序)来执行
• 处理结束后,再返回到被中止的程序继续执行
° Direct Memory Access (DMA方式): 磁盘等高速外设所用的方式
• 磁盘等高速外设成批地直接和主存进行数据交换
• 需要专门的DMA控制器控制总线,完成数据传送
• 数据传送过程无需CPU参与
以hello程序为例说明
#include <stdio.h>
int main()
{
printf("hello, world\n");
}
假定以下用户程序对应的进程为p
main()
{
…
printf();
…
}
用户程序
printf()
{
…
xxxx();
…
}
system_call()
{
…
xxxx();
…
}
系统调用
封装函数
系统调用
处理程序
用户空间、运行在用户态
内核空间、运行在内核态
write()
{
…
int $0x80
…
}
I/O 标 准
库函数
sys_write()
{
…
…
…
}
系统调用
服务例程
字符串输出最终是由内核中的
sys_write系统调用服务例程实现
sys_write可用三种I/O方式实现:
程序查询、中断 和 DMA
程序查询(Polling)方式
° I/O设备(包括设备控制器)将自己的状态放到状态寄存器中
• 打印缺纸、打印机忙、未就绪等都是状态
° OS阶段性地查询状态寄存器中的特定状态,以决定下一步动作
• 如:未“就绪”时,则一直“等待”
° 例如:sys_write进行字符串打印的程序段大致过程如下:
copy_string_to_kernel ( strbuf, kernelbuf, n); // 将字符串复制到内核缓冲区
for (i=0; i < n; i++) { // 对于每个打印字符循环执行
while ( printer_status != READY); // 等待直到打印机状态为“就绪”
*printer_data_port=kernelbuf[i]; // 向数据端口输出一个字符
*printer_control_port=START; // 发送“启动打印”命令
}
return_to_user ( ); // 返回用户态
如何判断“就绪”?如何“等待”?
读取状态寄存器,判断特定位(1-就绪;0-未就绪)是否为1
等待:读状态、判断是否为1;不是,则继续读状态、判断、…….
程序查询(Polling)方式
举例:控制打印输出
设置计数值
读接口状态
输出一个字符
就绪否
启动打印
修改内存地址
修改计数值
完成否
结束
N
Y
N
Y
N
设置内存缓冲区首址
这里“就绪”的含义是什么?
打印机控制器的数据缓冲中内容已被
取走,现为“空”,可接受新的打印
字符。由打印控制器自动设置
功能:打印AL寄存器中的字符。
PRINT PROC NEAR
PUSH AX ; 保留用到的寄存器
PUSH DX ; 保留用到的寄存器
MOV DX, 378H ; 数据锁存器口地址送DX
OUT DX, AL ; 输出要打印的字符到数据锁存器
MOV DX, 379H ; 状态寄存器口地址送DX
WAIT: IN AL, DX ; 读打印机状态位
TEST AL, 80H ; 检查忙位
JE WAIT ; 等待直到打印机不忙
MOV DX, 37AH ; 命令(控制)寄存器口地址送DX
MOV AL, 0DH ; 置选通位=1(表示启动打印)
OUT DX, AL ;使命令寄存器中选通位置1
POP DX
POP AX ; 恢复寄存器
RET
PRINT ENDP
打印输出标准子程序
回顾:过程/函数/子程序中的开始总是先
要保护现场,最后总是要恢复现场!
SKIP
剩余32页未读,继续阅读
开眼旅行精选
- 粉丝: 12
- 资源: 327
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0