系列文章 : [6.1810] 跟著 MIT 6.1810 學習基礎作業系統觀念
這邊只針對 xv6 有用到的部分,稍微閱讀一下。
雖然閱讀 spec 可能會是個枯燥的過程,但是想要用軟體操控硬體的話,仔細地閱讀 spec 又是不可避免的過程。幸好現在有 AI 的輔助,尤其是 notebookLM,對於閱讀 spec 的幫助很大。把 spec 丟給 notebookLM 之後,忘記了 spec 某部份的細節,都可以向 notebookLM 諮詢。但要注意的是,AI 還是有機會犯錯,我還是習慣會大概地 review AI 產生的結果。
UART 在收到 讀 跟 寫 的 memory transaction 的時候,就算寫入的位址相同,也可以導向不同的 register。
例如 RHR 跟 THR 的 offset 都是 0x0,但是當我們對 UART 進行讀取的時候,會導向 RHR,當我們進行寫入的時候,會導向 THR。
- RHR ( RECEIVER HOLDING REGISTER )
- addr : 0 ( read )
- 讀取來自外面的資訊
- 假如有開 FIFO mode 的話,會得到 16 bytes 的緩衝。
- THR ( TRANSMITTER HOLDING REGISTER )
- addr : 0 ( write )
- 通過 UART 傳訊息給外面
- 假如有開 FIFO mode 的話,會得到 16 bytes 的緩衝。
- IER ( INTERRUPT ENABLE REGISTER )
- addr : 1 ( write )
- bit 0 ( IER_RX_ENABLE ) : 當我們 assert 這個 bit,當有資料進來的時候,會 interrupt 通知 CPU。
- bit 1 ( IER_TX_ENABLE ) : 當我們 assert 這個 bit,當我們寫資料出去,並且資料傳到外面 ( THR empty ),會 interrupt 通知 CPU。
- ISR ( INTERRUPT STATUS REGISTER )
- addr : 2 ( read )
- 閱讀這個 register 可以知道 interrupt 發生的原因,但在 xv6-riscv 似乎不會去看 interrupt 的原因是什麼。
- FCR ( FIFO CONTROL REGISTER )
- LCR
- addr : 3 ( write )
- bit 0, 1 (word length)
- val : 0b00 代表 character 的 word length 是 5 bits
- val : 0b01 : word length == 6 bits
- val : 0b10 : word length == 7 bits
- val : 0b11 : word length == 8 bits
- bit 7 (Divisor Latch Access Bit (DLAB)) : 當這個 bit 被 assert 的時候,16550a 的 register 的意義會改變。
- addr : 0 會從 RHR/THR 變成 DLL
- addr : 1 會從 IER 變成 DLM
- 設定 baud rate 的時候會用到
- LSR ( Line Status Register )
- 功能 : 目前 uart 的狀態
- addr : 5 ( read )
- bit 0 ( receive data ready ) : 當這個 bit 的值為 1 的時候,代表我們可以透過 RHR 閱讀來自外面的資訊。
- bit 5 ( transmit holding empty ) : 當這個 bit 的值為 1 的時候,代表我們可以透過 THR 傳輸資訊給外面。
- DLL, DLM ( DIVISOR LATCH )
Reference
- UART 16550a spec
- 16550 UART Registers