
我已經學習了一些基本的作業系統課程、影片系列等,並且有關於作業系統驅動程式與 BIOS 驅動程式的問題。基本作業系統如何知道每個硬體的記憶體位址?作業系統如何在任何電腦上開箱即用。是否有一個大家都知道的標準設備記憶體佈局?或者作業系統會重新定向其 IVT 以指向 BIOS 裝置驅動程式嗎?請為我指出一些有關該主題的閱讀材料。
答案1
基本作業系統如何知道每個硬體的記憶體位址?作業系統如何在任何電腦上開箱即用。
CPU只知道要執行的首地址。 BIOS/韌體應「應答」此位址,以便 CPU 進行引導。
對於內存和 I/O(我希望您知道 x86 中有 2 個空間:內存和 I/O,對吧?)有很多標準。
第一個個人電腦時代
記憶體中有一個半官方區域,稱為BIOS DATA AREA。它有一些關於 COM 和 LPT 連接埠數量、軟碟機控制器、它們的基本 I/O 位址等資訊。作業系統也使用 BIOS 呼叫(記錄在案中斷)來存取硬體。主機板供應商硬編碼的該地址指向 BIOS。某些設備已正式記錄 I/O 位址。
像 ISA 這樣的擴充卡沒有任何工具可以檢測,除了擴展卡 BIOS:系統 BIOS 掃描記憶體中的特殊模式,以找到擴展卡 BIOS 並運行它。卡 BIOS 可以將其安裝為「影子」BIOS 功能的中斷向量,以啟用網路引導等。
在許多情況下,使用者有責任使用跳線配置卡並向軟體提供資訊(例如BLASTER
Sound Blaster 參數的環境變數等)。
即插即用時代
PnP 是一組有關硬體偵測的規格。有 ISA PNP、COM PORT PNP、LPT PNP 等。有些匯流排(例如 PCI)具有內建的 PNP 功能。軟體可以列舉 PCI 上的所有卡片並詢問它們所需的資源、它們的供應商和類別(以查找驅動程式)等,然後對它們進行配置。 USB 也可以進行枚舉。
在這種情況下,「軟體」可以是 PNPBIOS 或啟用 PNP 的作業系統。因此,BIOS 使用該規格來查找啟動設備和PCI 主機橋(PCI 匯流排的「根」),並將這些資訊儲存在記憶體中的特殊表中(根據PNPBIOS 規範),作業系統讀取它們並使用PCI 和USB 功能來列舉和啟用裝置(PCI 和 USB 協定已記錄)。
ACPI時代
ACPI 表由主機板供應商填寫並儲存在韌體中(現代韌體是不是”BIOS,但它可以模擬它)。
稱為 DSDT 的特殊表描述了任何系統設備,包括特殊的筆記型電腦按鈕、筆記型電腦電池、風扇、PCI-Express 根聯合體等。
設備是用 AML 語言描述的,作業系統應該有它的解釋器。 DSDT 可以描述記憶體、IO 和「方法」(也寫在 AML 上)來執行「更改亮度」等操作。
ACPI 是一個龐大的規範。作業系統使用DSDT 來填充其內部“設備樹”,一旦獲得對“PCI-Express 根聯合體”或根USB 的存取權限,它就會使用PCI-Express 和USB 協定進行進一步的枚舉和配置:卡可能會報告它支援記憶體範圍 A 和 B,作業系統將其配置為使用“B”。
答案2
大多數作業系統由各種元件組成,例如記憶體管理器、輸入輸出、檔案系統管理員等。大多數現代作業系統都有某種方法動態地更改各種組件的進出。一些作業系統,微內核,只具有作業系統的基本管理功能,而大多數附加元件(例如檔案系統)是添加在部件上的。
現代作業系統也是建構在一系列層中,有點像網路堆疊的 OSI 模型(請參閱https://en.wikipedia.org/wiki/OSI_model),以便盡可能獨立於它們運行的實際硬體。
因此,作業系統基本上是一個抽象機器,其中插入了具體的硬體特定模組。有一些介面規範,往往是某種抽象的機器描述,描述了硬體特定模組要提供給作業系統的控制、資料和服務。
因此,特定設備驅動程式堆疊的安裝程式知道其特定的特定硬體需求和設備接口,但作業系統不知道這些特定的特定硬體需求。作業系統將所有複雜的裝置特定內容委託給裝置驅動程式堆疊。
我使用“堆疊”這個詞是因為執行實際設備通訊的功能通常由一系列層組成。您可以透過大多數裝置的 Windows 裝置管理員看到這一點,其中顯示一組用於特定裝置的驅動程式檔案。
因此,有各種軟體組件實際上可能來自不同的供應商。
因此,如果作業系統想要了解有關硬體的詳細信息,它會向設備驅動程式詢問這些詳細資訊。
作業系統可以在各種硬體平台上開箱即用,因為組成平台的特定硬體的供應商提供了作業系統在具體和特定硬體上工作所需的驅動程式堆疊。
不同的作業系統對於作業系統設計所使用的裝置驅動程式有不同的介面規格。因此對於Linux,您必須擁有提供Linux驅動程式介面的Linux作業系統相容的驅動程式。對於 Windows,您必須有 Windows 介面驅動程式。
由於存在驅動程式堆疊,因此只要使用相同的硬件,堆疊中的某些軟體元件在不同作業系統之間可能是相同的。直接與硬體設備通訊的層部分可能是相同的,但堆疊的上層(必須與實際作業系統介面的部分)將有所不同,因為不同的作業系統具有不同的設備驅動程式介面。
有大量有關作業系統的書籍,並且有大量針對各種作業系統的開源專案。
看看這個討論https://www.quora.com/What-is-the-best-book-on-operating-systems
有許多免費的線上書籍,例如http://pages.cs.wisc.edu/~remzi/OSTEP/
看看這個關於開源作業系統的 github 頁面https://github.com/showcases/open-source-operating-systems
答案3
在現代 PC 上,每個硬體都會在被詢問時報告一些有關其自身的基本資訊。例如,許多周邊設備連接到PCI匯流排。當作業系統想要知道哪些週邊連接到 PCI 匯流排時,它會在總線上發送一條指令,要求每個週邊裝置發送描述。這就是所謂的列舉()總線上的設備。此描述使用數字代碼來標識每個設備型號,稱為PCI ID。當作業系統發現具有特定 PCI ID 的裝置存在時,它會嘗試載入該 PCI ID 的驅動程式;如果作業系統沒有驅動程序,它可以嘗試下載一個驅動程序,或向使用者報告存在未知設備。
例如,在Linux上,您可以執行該命令lspci
來列出PCI裝置。它有多種選項來顯示不同類型的信息,如果您好奇的話可以嘗試一下。我描述了 Linux 用於載入 PCI 裝置驅動程式的機制這個答案。這只是一個例子;其他 PC 作業系統具有執行相同操作的機制,但該機制可能完全不同。
作業系統如何知道有 PCI 總線,以及如何存取該匯流排?我認為如果你為 PC 架構建立它,那就是硬編碼的。請注意,「PC 架構」比「x86 CPU」更具體 — 您可以在 x86 CPU 周圍放置一組不同的匯流排,但這樣它就不會被稱為(現代)PC。
不同的機器架構可能有也可能沒有方法來列舉存在的驅動程式。例如,直到 20 世紀 90 年代中期的 PC 還沒有這樣的方法。在 PCI 總線出現之前,有ISA匯流排。在 ISA 總線上,如果您想知道某個裝置是否存在於某個位址,您可以向它發送命令。如果您得到您理解的答案,那就太好了。如果該命令鎖定了計算機,或者由於存在完全不同的外圍設備而導致意外的影響,那就很難了。在1908 年代的PC 上,作業系統確實向BIOS 詢問了已配置的設備(但BIOS 並未列出所有設備,僅列出了BIOS 知道的設備類型),安裝擴展卡的用戶需要提供其擴展卡的資訊。 BIOS 包括一些鍵盤和螢幕的基本驅動程序,DOS 等作業系統調用這些驅動程式;其他作業系統(或應用程式)可能會直接存取硬體(尤其是顯示器,因為 BIOS 驅動程式速度緩慢且有限)。
即使在今天,大多數嵌入式系統也沒有辦法列舉內建週邊。許多設備(尤其是基於 ARM 的設備,但不僅限於這些)在稱為設備樹。此資料結構儲存在 ROM 或快閃記憶體中,並且引導程式(相當於 BIOS)將資料傳送給作業系統。這樣,作業系統就不必為一組特定的設備構建,它會在啟動時讀取此資訊。