輸入輸出系統與裝置管理

輸入輸出連接埠(an I/O port)

想像一間辦公室,記憶體是一個有編號的大檔案櫃,但那些機器(影印機、傳真機)各自在另一面牆上有自己獨立、有編號的小信箱。要操作一台機器,你不會把文件歸檔進櫃子;你會用另一種動作,按編號去拿它的信箱。輸入輸出連接埠就是那些獨立有編號的小信箱之一:一個有編號的小格子,住在一個與記憶體截然不同的特殊位址空間裡,CPU 透過它與裝置控制器的暫存器交換位元組。

具體來說,在像 x86 家族這樣的架構上,存在兩個並列的位址空間。一般的載入與儲存(mov 到某個記憶體位址)通往 RAM。但要碰觸某個裝置的連接埠,你必須使用特殊指令——IN 從某個埠號讀入一個位元組,OUT 寫出一個。所以驅動程式可能會做 OUT 0x3F8, 0x41,把位元組 0x41 送到位於埠號 0x3F8 的序列埠。這些埠號形成它們自己的小空間(通常只有 65536 個埠),與數十億個記憶體位址完全分開,這也是為什麼這種方式又稱為連接埠映射輸入輸出(port-mapped I/O)。這是另一種做法——記憶體映射輸入輸出——在歷史上的對應方案;後者讓裝置暫存器以普通記憶體位址的樣貌出現。

為什麼重要:連接埠映射輸入輸出讓裝置暫存器不會吃掉寶貴的記憶體位址空間,而且特殊的 IN/OUT 指令天生就是特權指令,所以使用者程式無法直接戳裝置——只有核心能。代價是你不能對連接埠使用豐富的一般記憶體指令;你只能用那少數幾個特殊的輸入輸出指令。現代系統大幅偏向記憶體映射輸入輸出,而許多架構(例如 ARM)根本沒有獨立的輸入輸出連接埠空間。

傳統 PC 鍵盤控制器位於輸入輸出連接埠 0x60(資料)與 0x64(狀態/命令)。驅動程式用 IN 0x64 讀取狀態,當有一個鍵就緒時,再用 IN 0x60 讀出掃描碼。

埠號是一個獨立的位址空間,只能用特殊的輸入輸出指令觸及。

輸入輸出連接埠不是記憶體:埠號 0x60 與記憶體位址 0x60 是完全不同的地方。把這兩個位址空間搞混,是初學者的經典錯誤。

又称
port-mapped I/OPMIOI/O address連接埠位址