2013-12-11 37 views
0

爲了由CPU執行,程序必須加載到RAM中。程序只是處理器可以理解的一系列機器指令(如x86指令集)(因爲它通過邏輯門在物理上實現了它們的語義)。程序如何控制硬件?

我可以或多或少了解本地指令(在CPU的芯片組內執行的指令),諸如「ADD R1,R2,R3」作品。即使通過北橋芯片使用數據總線和地址總線的cpu與ram的接口對我來說也是足夠清晰的。

我正在努力的是大局。

例如文件如何保存到硬盤? 假設主板使用SATA接口與硬盤進行通信。 這是否意味着這個SATA接口有一個指令集可供cpu使用,通過準備以正確格式寫入的SATA指令?

是否也適用於PCI接口,AGP接口等?

(由創建硬件芯片的公司)與指令所有的硬件通信基本上都是通過確定界面參考標準對於某些任務,並執行它來完成設定任何其它硬件組件可以查詢?

我對硬件和軟件交互的正確理解是否正確?

+0

我認爲你的理解是正確的,但我認爲它並不總是像處理器直接與每個設備進行通信一樣簡單。例如,處理器可以與UART設備或一些其他設備進行通信,該設備又與存儲器或網絡或監控器等進行通信。參見http://en.wikipedia.org/wiki/16550_UART作爲示例。更一般地說,現代計算硬件設置也涉及DMA:http://en.wikipedia.org/wiki/Direct_memory_access。 – Brian

回答

1

差不多。它實際上比指令更通用。

的金潤這些細節的特定結構,所以我會堅持的是如何可以做到這一點的高級概述。

CPU可以正確讀寫內存嗎?您可以發出讀取和寫入任何內存地址的指令。因此,硬件製造商不是試圖擴展CPU以瞭解每個可能的硬件接口,而是簡單地將地址空間的各個部分(通常是RAM)映射到硬件。

舉例說,你想將文件保存到硬盤。這是命令的可能的序列將出現:

  1. 硬盤驅動器控制器的命令寄存器是地址0xF00,也就是RAM之外,但到CPU
  2. 訪問編寫指令給指令的地址表示我們要寫入硬盤的寄存器。
  3. 可能有一個地址寄存器在0xF01告訴硬盤驅動器控制器在哪裏保存數據
  4. 告訴硬盤驅動器控制器,我想寫的數據是在RAM的某個地址,並啓動寫序列。

有很多其他的方式可以做到這一點,但重要的是要注意的是,它只是使用CPU已經使用RAM的指令。

所有這一切都可以由CPU來完成,無需CPU側的任何特殊說明,只讀取和寫入到一個地址。您可以想象這將被擴展,USB控制器的地址空間中有一個特殊的地方,它包含USB設備列表,PCI設備列表有一個特殊的位置,每個PCI設備都有幾個寄存器可以讀取寫信指示他們做事情。

本質上,設備驅動程序的作用是知道如何讀取和寫入這些特殊寄存器,設備可以接受哪種類型的命令等。通常,與許多圖形卡一樣,這些寄存器的作用沒有向公衆記錄,所以我們依靠他們的驅動程序來正確運行卡片。

+0

謝謝。你描述了內存映射I/O(我知道),但是你添加了一些我錯過的細節。因此,這些設備驅動程序知道發給物理設備的正確格式(因爲硬件供應商對它們進行了編程)。當操作系統加載一個驅動程序時,它只需要分配一些內存區域來映射到內存(我猜這是動態完成的),並通知設備控制器(在設備芯片組中)應該檢查的內存區域。它可以這樣做,因爲RAM地址總線是共享的。我明白了嗎? – Kami

+0

這完全正確:) – Dougvj