IO与显示器、键盘(哈工大李志军)

IO与显示器、键盘(哈工大李志军)_第1张图片

外设的工作:

IO与显示器、键盘(哈工大李志军)_第2张图片
外设的寄存器的地址、内容格式都不统一,操作系统要给用户一个简单的视图方便管理 ——文件视图
驱动外设概括起来就是:创建文件视图,CPU向外设发出指令(out指令),外设执行完毕后发出中断,再读数据到内存。

一段操纵外设的程序

IO与显示器、键盘(哈工大李志军)_第3张图片
在 linux 中一切设备皆文件。

文件视图

IO与显示器、键盘(哈工大李志军)_第4张图片

printf()

IO与显示器、键盘(哈工大李志军)_第5张图片

  • wirte()是系统调用,调用sys_write(),传入参数为文件指针fd等于一,为显示,以及缓冲区buf
    IO与显示器、键盘(哈工大李志军)_第6张图片
    系统初始化时init()打开了终端设备,dup()是复制,tty0是终端设备。
    open:
    IO与显示器、键盘(哈工大李志军)_第7张图片
    open()把设备信息(dev/tty0)的读进来备用。
    open_namei根据文件名字读入inodeinode是存放在磁盘上的设备信息。
    flip存储在进程的PCB中。
    IO与显示器、键盘(哈工大李志军)_第8张图片
    判断inode中的信息是字符设备,调用rw_char,显示器是写设备传入WRITE,传入主设备号4,和从设备号0,找到对应的处理函数(crw_table[]是函数表)。
    IO与显示器、键盘(哈工大李志军)_第9张图片
    crw_table[]找到并调用rw_ttyx,又调用tty_write(),通过sleep_if_full往队列(缓冲区)中去写,如果队列满了则 sleep,如果没满:
    IO与显示器、键盘(哈工大李志军)_第10张图片
    从用户缓冲区中读取出一个字符(get_fs_byte()),将字符放入队列中PUTCH(),再调用tty_write()
    IO与显示器、键盘(哈工大李志军)_第11张图片
    这里从tty_table[]调用con_write(),从刚刚的缓冲区队列中取出字符输出到屏幕,接下来是汇编代码,如果显存和内存独立编址则用out,这里显存和内存混合编址则用mov ax, pos
    IO与显示器、键盘(哈工大李志军)_第12张图片
    IO与显示器、键盘(哈工大李志军)_第13张图片

键盘

IO与显示器、键盘(哈工大李志军)_第14张图片
IO与显示器、键盘(哈工大李志军)_第15张图片
IO与显示器、键盘(哈工大李志军)_第16张图片
键盘是输入设备,所以键盘中断处理程序里面对应着inb
IO与显示器、键盘(哈工大李志军)_第17张图片
IO与显示器、键盘(哈工大李志军)_第18张图片
IO与显示器、键盘(哈工大李志军)_第19张图片

IO与显示器、键盘(哈工大李志军)_第20张图片
IO与显示器、键盘(哈工大李志军)_第21张图片

你可能感兴趣的:(OS)