Windows一般都用系統進程來載入核心模組

來源:互聯網
上載者:User

無處不在的核心模組

本文節選自《寒江獨釣》一書

 

    位於高2G空間內的作業系統核心,並非做死的一個巨大程式。因為電腦硬體種類繁多,不可能做出一個能支援所有硬體的巨大核心。
    核心是有介面的,微軟提供規定的格式,讓硬體驅動的編程人員,能按照規定的格式編寫“驅動程式”。這些驅動程式能夠作為模組載入到核心中,成為核心的一部分,這樣核心只要簡單地安裝驅動程式,就可以適應各種不同的硬體了。
    本書中的大部分例子都是編譯成核心模組的,實際上也可以稱為驅動程式(Driver)。但是它們大部分並不驅動任何硬體,有人稱之為“軟體驅動”。但是筆者認為這不夠貼切,所以本書使用Linux程式員們的叫法,稱之為核心模組(Kernel module)。也許這樣要更貼切一些,驅動程式可以看成核心模組的一種(少量的應用程式層驅動程式除外)。
    核心模組已經位於核心空間,作為R0代碼執行,所以不受任何限制,可以任意修改核心。因此許多使用應用程式無法實現的功能,可以通過編寫核心模組來實現。
    起初的Windows,似乎並沒有打算讓應用軟體的編程人員來提供核心模組。但是,一些特殊的應用軟體的編程人員首先自己突破了這些限制,他們編寫了虛擬光碟機、防毒軟體的即時監控、防火牆等特殊的不驅動任何硬體的核心模組。最終微軟也意識到了核心編程對軟體也是很有用的,因此在核心中又提供了更多的介面,比如方便進行檔案過濾、網路過濾等的新介面,這些是專門提供給非硬體驅動開發的軟體編程人員使用的。
    WDK是微軟目前提供的最新的驅動開發包,同時也包括了給軟體核心編程提供的所有介面和例子。硬體驅動與軟體的核心編程這二者目前並沒有嚴格分開,雙方的技術和許多代碼都是相通的。
初學者在編寫一個核心模組時,常常有的一個疑問就是:這些代碼運行在哪個進程的空間中呢?
    核心模組位於核心空間,而核心空間又被所有的進程共用。因此,核心模組實際上位於任何一個進程空間中。但是任意一段代碼的任意一次執行,一定是位於某個進程空間中的。這個進程是哪一個?這取決於請求的來源、處理的過程等。PsGetCurrentProcessId函數能得到當前進程的進程號,這個函數的原型如下:
HANDLE
      PsGetCurrentProcessId(
            );   
    這個函數返回的HANDLE,實際上是一個進程ID。這個數字和我們開啟工作管理員時,看到的PID是一樣的。
    有些讀者會誤以為所有核心代碼都運行在系統進程內。
    Windows的所謂系統進程是一個名為“System”的進程,是Windows自身產生的一個特殊進程,這個進程在Windows XP下PID始終為4。讀者只要調用PsGetCurrentProcessId就會發現核心模組中分發函數調用時,當前進程一般都不是System進程。但是DriverEntry函數被調用時,一般都位於系統進程中。這是因為Windows一般都用系統進程來載入核心模組,並不說明核心代碼始終運行在System進程裡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.