外设的工作:
外设的寄存器的地址、内容格式都不统一,操作系统要给用户一个简单的视图方便管理 ——文件视图
驱动外设概括起来就是:创建文件视图,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。