我理解之windows的內核對象

作爲一個程序員,其實任何東西我都想從程序的角度去思考它.因此,在我看來,內核對象就是一個結構體,一個struct.但它又不是普通的結構體,說它不普通是因爲:

    1.它是由內核維護的.

    2.它只能被運行在內核模式下的代碼訪問,從寫代碼的角度而言,就是隻能通過windows提供的API來訪問它.

我們編寫一個程序時,有時需要通過一些全局的變量來達到各個函數共享的目的,其實內核對象在一定程度上就相當於這個全局變量,把操作系統看作一個主程序,操作系統內核通過管理這些內核對象來使各個進程正常運作.綜上,內核系統的作用有以下幾個:

    (1)爲系統資源提供可識別的名字。
    (2)在進程之間共享資源和數據。
    (3)保護資源不會被未經認可的代碼訪問。
    (4)跟蹤對象的引用情況。這使得系統知道什麼時候一個對象不再被使用了,以便釋放

要更好地理解內核對象的作用,就需要多動手編寫WINDOWS方面的多線程程序,個人認爲這樣理解起來更容易些

下面通過一個內核管理的線程內核對象來進一步理解內核對象的意義和作用:

  線程內核對象就是一個包含了線程狀態信息的數據結構。每一次對CreateThread 函數的成功調用,系統都會在內部爲新的線程分配一個內核對象。系統提供的管理線程的函數其實就是依靠訪問線程內核對象來實現管理的。下面列出了這個結構的基本成員:
           線程內核對象(Thread Kernel Object)
   CONTEXT (上下文,即寄存器的狀態)
   EAX
   EBX
   其他CPU 寄存器
   Usage Count 使用計數(2)
   Suspend Count 暫停次數(1)
   Exit Code 退出代碼(STILL_ACTIVE)
   Signaled 是否受信(FALSE)

創建線程內核對象的時候,系統要對它的各個成員進行初始化,上面括號裏的值就是各個成員的初始值.系統就是通過這個內核對象的各個成員來管理線各的.

  下面通過講述上下文和使用計數這兩個成員的作用來說明內核對象的作用

1.線程上下文CONTEXT
每個線程都有他自己的一組CPU 寄存器,稱爲線程的上下文。這組寄存器的值保存在一
個CONTEXT 結構裏,反映了該線程上次運行時CPU 寄存器的狀態。
2.使用計數Usage Count
Usage Count 成員記錄了線程內核對象的使用計數,這個計數說明了此內核對象被打開的
次數。線程內核對象的存在與Usage Count 的值息息相關,當這個值是0 的時候,系統就認爲
已經沒有任何進程在引用此內核對象了,於是線程內核對象就要從內存中撤銷。

 

通過以上分析,可以很容易理解內核對象就是一個系統定義的用來管理各種資源的使系統正常運行的數據結構而已.

   

  

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