第一章
Windows NT系列和Windows 95系列的區別:
- Windows NT支援多處理器,Windows 95不支援。
- Windows NT檔案系統支援安全性(例如自主存取控制),Windows 95不支援。
- Windows NT是完全32位,而Windows 95從Windows 3.1和MS-DOS繼承了大量的16位代碼。
- Windows NT是完全可重新進入的,Windows 95有一部分是不可重新進入的。
- Windows NT可以讓16位應用程式運行在它們自己的地址空間中,而Windows 95總是在一個共用的地址空間中運行16位Windows應用程式,在這個共用的地址空間中,這些程式相互影響,甚至一個程式破壞(或掛起)別的程式。
- Windows NT進程共用的記憶體只對哪些影射了這一共用記憶體的進程才是可見的,在Windows 95上,所有的共用記憶體都是可見的,而且在任何一個進程內都可以寫這些記憶體,因此任何一個進程都可以改寫或者破壞其他協作進程所使用的共用記憶體。
- 在Windows 95中,有一些關鍵的作業系統頁面在使用者模式下是可寫的,從而允許一個使用者程式破壞系統,或者使系統崩潰。
Windows API:Windows 應用編程介面是針對Microsoft Windows作業系統家族的系統編程介面,每個作業系統實現了Windows API不同的子集。
Windows API可以分成以下幾個大類:
- 基本服務
- 元件服務
- 使用者介面服務
- 圖形和多媒體服務
- 訊息和協作
- 網路
- Web服務
程式和進程的關係:程式是指一個靜態指令序列,而進程則是一個容器,其中包括了當執行一個程式的特定執行個體時所使用的各種資源。
一個Windows進程由以下幾個元素構成:
- 一個私人的虛擬位址空間
- 一個可執行檔程式
- 一個已開啟控制代碼的列表,這些控制代碼指向各種系統資源
- 一個被稱為存取權杖的安全環境,它標識了與該進程相關的使用者、安全性群組和特權。
- 一個被稱為進程ID的唯一識別碼
- 至少一個執行線程
每個進程也指向它的父進程或者建立者進程,但是,如果父進程推出的話,子進程中的父進程資訊並不會被更新,因此,一個進程有可能指向一個已經不存在的父進程。
線程是一個進程內的實體,也是Windows執行此進程時的調度實體。如果沒有線程,進程的程式是不可能啟動並執行。
一個線程包括以下內容:
- 一組代表處理器狀態的CPU寄存器中的記憶體
- 兩個棧,一個用於當前線程在核心模式下執行的時候,一個使用者線程在使用者模式下執行的時候。
- 一個被稱為線程局部儲存區(TLS)的私人儲存地區,各個子系統、運行庫和DLL都會用到該儲存地區。
- 一個被稱為線程ID的唯一識別碼
- 有時線程也有他們自己的安全環境,如果多線程伺服器應用程要類比其客戶的安全環境,則往往可以利用線程的安全環境。
寄存器、棧和私人的儲存地區合在一起被稱為線程的環境。
纖程與線程:纖程使得一個應用程式可以調度它自己的“線程”的執行過程,而不必依賴於Windows內建的基於優先順序的調度機制。纖程常常被稱為輕量級的線程。從調度的角度來看,它們對於核心是不可見的,因為它們是在使用者模式下實現的。
一個進程內的所有線程可以讀或者寫另一個線程的記憶體,然而,一個進程中的線程是不可能直接引用另一個進程的地址空間的。
虛擬位址描述符(VAD,virtual address descriptor)是指一些資料結構,記憶體管理區利用這些資料結構來記錄一個進程所使用的虛擬位址。
Windows實現了一個基於線性地址空間的虛擬記憶體系統,每個進程感覺自己獨立擁有一個很大的私人地址空間。虛擬記憶體提供了一個記憶體邏輯視圖,它可能並不對應於記憶體的物理布局。在啟動並執行時候,記憶體管理器藉助於硬體的支援,將虛擬位址翻譯或者映射成真正存放資料的物理地址。作業系統通過控制這一層保護或者映射機制,可以保證一個進程不會闖入另一個進程中,也不會改寫作業系統的資料。
為了避免使用者應用程式訪問或者修改關鍵的作業系統資料,Windows使用了兩種處理器訪問模式:使用者模式和核心模式。使用者程式碼運行在使用者模式下,而作業系統代碼運行在核心模式下。核心模式允許訪問所有的系統記憶體和所有的CPU指令,處理器讓作業系統軟體比應用軟體有更高的特權級,從而為作業系統設計者提供了一層保護的基礎,確保一個行為不正常的應用程式不會破壞系統整體的穩定性。
Intel x86處理器的體繫結構定義了四種特權級,Windows使用特權級0(或者0環)作為核心模式,特權級3(或者3環)作為使用者模式。
虛擬記憶體中的每一個頁面都被標記了處理器必須在什麼訪問模式下才可以讀和/或寫該頁面,系統空間中的頁面只能在核心模式下才可以訪問,而使用者地址空間中的所有頁面在使用者模式下都是可以訪問的,唯讀頁面在任何模式下都是不可寫的。
從使用者模式到核心模式的轉換本身並不會影響線程的調度——模式轉換並不是環境切換。因此對於一個使用者線程來說,它的一部分時間在使用者模式下執行,令部分時間在核心模式下運行,這是很正常的。
終端服務是指Windows為了在單個系統中支援多個可互動的使用者會話而提供的能力。利用Windows終端服務,一個遠端使用者可以在另一個機器上建立一個會話,並且登陸進去,在該伺服器上運行應用程式,伺服器把圖形介面傳送到客戶機,客戶機把使用者的輸入傳回到伺服器上。
在Windows作業系統中,對象指某一個靜態定義的物件類型的單個運行時的執行個體,物件類型包含了一個系統定義的資料類型、在該資料類型的執行個體上進行操作的一些函數,以及一組對象屬性,在Windows中,任何一個進程都是進程物件類型的一個執行個體。
對象屬性是對象中的資料域,每個對象屬性定義了對象的一部分狀態。
對象和普通資料結構之間最根本的區別:對象的內部結構是被隱藏的,必須調用一個物件服務才能獲得對象內部的資料,或者把資料置到對象內部,這樣很好的將對象的底層實現和哪些僅僅使用該對象的代碼隔離開。
Windows核心安全功能包括
- 針對所有可共用對象的自主保護
- 安全審計
- 登入時口令認證
- 一個使用者釋放了某一資源後,另一個使用者無法通過訪問未初始化的資源的方法來看到前一個使用者留下的資源。
Windows提供了兩種存取控制機制
- 自主訪問機制。由對象的所有者授權或者拒絕其他人訪問這些對象。當使用者登入到系統中,他們會得到一組安全憑證,或者一個安全環境,當他們視圖訪問對象的時候,系統會將他們的安全環境與他們要訪問的對象上的存取控制清單進行比較,以確定他們是否允許執行鎖清秋的操作。
- 特權存取控制。即使無法連絡到對象的所有者,某些人也可以訪問被保護的對象。
Windows作業系統區別與其他大多數作業系統的特點之一是它的大多數內部文本串是以16為寬度的Unicode字元來儲存和處理的。接受字串參數的Windows函數一般都有兩個進入點:一個Unicode和一個ANSI。如果你調用一個Windows的窄字元版本,則輸入的字串參數在被系統處理之前,先轉成Unicode,而輸出的參數則在被返回給應用程式之前,從Unicode轉成ANSI字串。