設備驅動、虛擬地址

1.爲什麼要引入設備驅動

     操作系統作爲硬件的上層,它是對硬件的管理和抽象。對於操作系統上面的運行庫和應用程序來說,它們希望看到的是一個統一的硬件訪問模式。我們不希望在開發應用程序的時候直接讀寫硬件端口、處理硬件中斷等這些複雜的事情,由於硬件之間千差萬別,它們的操作方式和訪問方式都有區別。比如我們再寫一個畫直線 的程序,我們希望不管我們使用 的是何種顯示器、什麼顯卡,有多大分辨率,我們都只要調用一個統一的LineTo()函數,具體的實現由操作系統來完成。試想:如果一個程序員要關心具體的硬件,那麼結果會是:對於A 型號的顯卡來說要往I/O端口0X1001寫一個命令0X1111,然後在端口0X1002裏面讀取一個4字節的顯存地址,然後逐個地在顯存上面畫點……如果是B型號的顯卡,可能是另一種方式。這簡直就是災難。不過在操作系統成熟之前,的確存在這樣的情況,就是應用程序的程序員要直接跟硬件打交道。

        當操作系統成熟後,硬件逐漸被抽象成一系列概念。在UNIX裏面,硬件設備的訪問形式和普通文件一樣。WINDOWS裏面圖像硬件被抽象成GDI,聲音和多媒體設備被抽象成DirectX對象,等等。程序員逐漸從硬件細節中解放出來,可以更多關注應用程序本身開發。這些繁瑣的硬件細節全部交給操作系統來完成,即是操作系統的硬件驅動程序(Device Driver)來完成。硬件驅動程序可以看作是操作系統的一部分,運行在特權模式下。因爲PC的硬件很多,所以操作系統開發者不可能爲每種硬件都寫一個驅動程序,這些驅動程序的開發通常由硬件開發者來完成。操作系統開發者爲硬件生產商提供一系列框架和接口,只要按照這種接口和框架開發的驅動程序都可以在該操作系統上使用。


2.爲什麼要用虛擬內存

   *地址空間的隔離

   *程序運行的地址不確定 

      因爲程序每次需要裝入運行時,我們都要給它從內存分配一塊足夠大的空閒區域,這個空閒區間位置的不確定性,給程序的編寫造成了一定的麻煩,因爲程序在編寫的時候訪問數據和指令跳轉時的目標地址很多都是固定的。


    我們的解決辦法是:增加中間層。即使用一種間接的地址訪問方法。整個想法是這樣的:我們把程序給出的地址看成是虛擬地址(Virtual Address ),然後通過某種映射的方法,將這個虛擬地址轉化成實際的物理地址,這樣,只要我們能夠處理好這個映射過程,就可以保證任意一個程序所能訪問的物理空間和另一個程序相互不重疊,以達到地址空間相隔離的效果。


3. 分段和分頁

     分段的思想是把程序所需要的內存空間大小的虛擬空間映射到某個地址空間。虛擬空間段大小和物理空間大小相同。















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