自己動手從零寫桌面操作系統GrapeOS系列教程——18.外設和IO

學習操作系統原理最好的方法是自己寫一個簡單的操作系統。


一、外設和I/O接口

前面我們介紹過馮·諾依曼結構包含5部分,其中輸入設備和輸出設備統稱爲外部設備,簡稱外設。常見的外設有鼠標、鍵盤、顯示器、硬盤等。由於外設種類多、差異大、速度慢等原因,導致CPU無法直接與外設溝通。於是在CPU和外設之間產生了“中間人”,這個“中間人”就是I/O接口。如下圖:

CPU與外設的信息交流都是通過I/O接口來間接實現的。比如我們前面向屏幕輸出字符,並不是CPU直接將數據傳遞給屏幕,而是先傳遞給顯卡,顯卡再去操控屏幕。顯卡就是一種I/O接口。後面我們將要學習如何讀寫硬盤,同樣CPU無法直接讀寫硬盤,而是通過“中間人”硬盤控制器來間接實現讀寫硬盤。硬盤控制器也是一種I/O接口。上圖中只舉了顯示器和硬盤兩個例子,實際還有很多,圖中用省略號代表了,後面我們學到哪個再講哪個。

二、I/O端口和端口訪問

我們知道在CPU內部有一些寄存器,而在每個I/O接口上面也都有一些寄存器,通常叫做I/O端口。CPU與I/O接口的交流,主要就是讀寫這些I/O端口,也叫端口訪問。
CPU訪問I/O端口有兩種方式,一種是通過內存地址訪問,另一種是通過端口號來訪問。

1.通過內存地址訪問端口

這種方式就是將一部分內存地址映射到相應的端口上,CPU讀寫這些端口就和讀寫內存的指令是一樣的。

2.通過端口號訪問端口

這種方式是爲每一個端口分配一個唯一的編號,叫端口號,然後通過端口號就可以讀寫這個端口。我們後面主要用這種。
我們需要注意2點:

  • 在x86架構中端口號的最大取值範圍是0~65535,也就是2個字節表示的範圍。
  • 端口作爲一種寄存器,它的數據寬度有的是8位,也有的是16位。具體是多少位,我們用到的端口都會介紹。

三、端口訪問代碼

1.讀端口代碼

讀端口總共有4種方式,代碼如下:

in al,dx
in ax,dx
in al,立即數
in ax,立即數

以上4行代碼,每一行都表示從指定端口讀取數據到al或ax寄存器中。
這裏需要注意2點:

  • 源操作數就是端口號,只能用dx或立即數表示,而且立即數只能在0~255範圍內。
  • 目的操作數只能是al或ax,如果端口是8位的就用al,如果端口是16位的就用ax。

2.寫端口代碼

寫端口也有4種方式,代碼如下:

out dx,al
out dx,ax
out 立即數,al
out 立即數,ax

以上4行代碼,每一行都表示將al或ax中的數據寫入到指定的端口中。
同樣需要注意2點:

  • 目的操作數就是端口號,只能用dx或立即數表示,而且立即數只能在0~255範圍內。
  • 源操作數只能是al或ax,如果端口是8位的就用al,如果端口是16位的就用ax。

本講視頻版地址:https://www.bilibili.com/video/BV1ig4y1b7cs/
配套的代碼與資料在:https://gitee.com/jackchengyujia/grapeos-course
GrapeOS操作系統交流QQ羣:643474045

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章