外设的工作:
外设的寄存器的地址、内容格式都不统一,操作系统要给用户一个简单的视图方便管理 ——文件视图
驱动外设概括起来就是:创建文件视图,CPU向外设发出指令(out
指令),外设执行完毕后发出中断,再读数据到内存。
一段操纵外设的程序
在 linux 中一切设备皆文件。
文件视图
printf()
wirte()
是系统调用,调用sys_write()
,传入参数为文件指针fd
等于一,为显示,以及缓冲区buf
。
系统初始化时init()
打开了终端设备,dup()
是复制,tty0
是终端设备。
open:
用open()
把设备信息(dev/tty0
)的读进来备用。
open_namei
根据文件名字读入inode
,inode
是存放在磁盘上的设备信息。
flip
存储在进程的PCB中。
判断inode
中的信息是字符设备,调用rw_char
,显示器是写设备传入WRITE
,传入主设备号4
,和从设备号0
,找到对应的处理函数(crw_table[]
是函数表)。
由crw_table[]
找到并调用rw_ttyx
,又调用tty_write()
,通过sleep_if_full
往队列(缓冲区)中去写,如果队列满了则 sleep,如果没满:
从用户缓冲区中读取出一个字符(get_fs_byte()
),将字符放入队列中PUTCH()
,再调用tty_write()
:
这里从tty_table[]
调用con_write()
,从刚刚的缓冲区队列中取出字符输出到屏幕,接下来是汇编代码,如果显存和内存独立编址则用out
,这里显存和内存混合编址则用mov ax, pos
。
键盘
键盘是输入设备,所以键盘中断处理程序里面对应着inb
。