外設的工作:
外設的寄存器的地址、內容格式都不統一,操作系統要給用戶一個簡單的視圖方便管理 ——文件視圖
驅動外設概括起來就是:創建文件視圖,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
。