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设备地址