哈工大-操作系统L26

I/O与显示器

一.设备的功工作

cpu向外设的寄存器发送命令,cpu去执行其它命令,当外设完成之后向cpu发出中断,cpu处理中断,读取数据到内存

二.文件视图

直接向设备控制器的寄存器写,需要做活动操作,很麻烦

open("/dev/xxx")打开不同设备对应的设备文件

根据设备属性数据分析出是什么设备,根据分析向对应设备的控制发送命令,完成命令之后,返回信息

file=current->filp[fd] 当前PCB的filp数组的1下标赋给file

inode=file->f_inode将file的f_inode赋给inode

PCB是由fork中来的,所以fd=1从init()中来,open("dev/tty0",o_RDWR,0)打开设备并拷贝两个dup(0)dup(0) open("dev/tty0",o_RDWR,0)是1,dup(0)是2,dup(0) 是3,所以fd=1也是open("dev/tty0",o_RDWR,0)(终端设备)

inode是文件存放在磁盘上的设备信息

cuurent->filp[fd]=f,filp与f连接f->f_inode=inde,file_table与inode连接,将dev/tty0的设备信息(inode)赋给f_inode

主设备号是4,副设备号0

if(S_ISCHR(inode->i_mode))判断是什么类型的设备 ,

字符设备执行rw_char(WRITE,inode->i_zone[0],buf,cnt),inode->i_zone[0],是哪个字符设备

rw_char,crw_table存放的是函数指针,dev是主设备号

键盘是读的,显示器是写的

rw是WRITE ,return(rw==READ)执行tty_write(minor,buf)

tty_write,tty=channel+tty_table,找出对应的设备

tty->write_q往队列上写,如果队列满了就睡眠,就是往缓冲区里面写平衡速度问题

tty_write是队列没有满向队列写内容

buf工作在用户态内存,从用户态内存取一个字符将这个字符PUTCH(c,tty->write_q)

tty_write(tty)输出到显示器上

movb _attr,%%ah,attr属性赋给ah

"a"(c),字符赋给al

pos显卡的寄存器,mov POS,ax,统一变址用MOV,独立变址用OUT,显存比较大所以是MOV,MOV和OUT功能一样

0x90000,0x90000设备地址

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值