#001/* setup the idle thread */
#002keinitializethread(initprocess,
#003initthread,
#004null,
#005null,
#006null,
#007null,
#008
null,
#009idlestack);
......
#033
#034/* set up the thread-related fields in the prcb */
#035prcb->currentthread = initthread;
#036prcb->nextthread = null;
#037prcb->idlethread = initthread;
#038
#039/* initialize the kernel executive */
#040expinitializeexecutive(number, loaderblock);
上面這句就是呼叫函式
expinitializeexecutive
來初始化核心執行體的功能,它是核心所有功能管理初始化,比如核心物件管理器,核心記憶體管理,還有硬體抽象層
hal的初始化。具體的部分**如下:
#001void
#002ntapi
#003expinitializeexecutive(in ulong cpu,
# 004
inploader_parameter_block loaderblock)
#005
上面主要檢查引導引數是否正確,如果不正確就進入處理出錯,直接停在出錯位置上,把出錯碼輸出。
#029
#030/* initialize prcb pool lookaside pointers */
#031exinitpoollookasidepointers();
上面是初始化
prcb
裡的後備列表緩衝區指標,那麼什麼是後備列表呢?堆管理器管理著系統和使用者的堆記憶體,它把堆空間分為相同尺寸的塊
(block)
。堆管理器會根據堆分配請求,去選擇乙個合適尺寸的未使用的塊。顯然,這個過程需要點時間。如果你需要固定尺寸的記憶體塊,但是你事先並不知道它的大小和使用頻率,這樣的話為了效能的原因,你還是使用後備列表(
lookaside lists
)的,後備列表是只有核心模式才有的。
後備列表和系統記憶體池的主要的區別是什麼呢?後備列表只可以分配固定大小的事先定義尺寸的記憶體塊。後備列表會快很多,因為它不需要去搜尋可用的未分配的記憶體。
當你剛接觸後備列表,你需要解決的問題不是怎麼建立後備列表,而是管理你要分配的記憶體塊。
後備列表(
lookaside list
)是一組事先分配的相同尺寸的記憶體塊。這些塊有些在使用,有些沒被使用。當有記憶體分配請求的時候,系統會遍歷這個列表尋找最近的未分配的塊。如果未分配的塊找到了,分配請求就很快被滿足了。否則系統必須從分頁或不分頁記憶體池去分配。根據列表中分配行為發生的頻率,系統會自動調整未分配塊的數量來滿足分配請求,分配的頻率越高,會有越多的塊被儲存在後備列表中。後備列表如果總是不被使用,也會自動減少空間大小。
其實後備列表就是儲存一些最近使用的空閒記憶體的記憶體塊。
reactos作業系統實現 178
sendmessagew函式主要用來向視窗傳送訊息。下面就是它的實現 001 lresult winapi 002 sendmessagew hwnd wnd,003 uint msg,004 wparam wparam,005 lparam lparam 006 028 029 填寫訊息結構。03...
reactos作業系統實現 187
隨著全球化的發展,開發軟體都是面向多語言的環境。目前大多數程式都是採用不同字型來顯示不同語言的辦法,那麼有沒有一種更好的辦法,一種字型就可以解決全球語言的顯示呢?答案肯定的,它就是採用邏輯字型ms shell dlg和ms shell dlg2。比如開發應用程式時,就看到在資源裡可以設定ms she...
reactos作業系統實現 193
selectobject函式是將物件選定到指定的裝置場境中。具體實現 如下 001 hgdiobj 002 winapi 003 selectobject hdc hdc,004 hgdiobj hgdiobj 005 016 獲取選擇dc的物件正確的控制代碼。017 hgdiobj gdifixu...