Windows boot transition

Boot transition 分成四個 phase: BIOSInitialization/OSLoader/MainPathBoot/PostBoot



BIOSInitialization


即是 BIOS POST 的動作。這個階段結束於當 BIOS 讀出 disk MBR 並啟動 Bootmgr.exe 之後。Bootmgr.exe 會接著執行 Winoad.exe 進入 OSLoader phase。


影響這階段速度的部份在於 extended memroy 的測試。通常開啟如 Fast POST 的設定就可以 skip 這個測試。


OSLoader


這個階段 loader 會先由磁碟讀取一些 kernel 要執行所需的資料,如一些 system driver。當 kernel 開始跑的時候,loader 會將 system registry hive 及 mark 為 BOOT_START 的 driver 載入記憶體 (只載入,尚未初始化)。在實際開機中,這階段大約介於 BIOS 的 diagnostic screen 結束後,到 "Loading Windows" 的 splash screen 出現之前。


由於 BOOT_START driver 需要檢查 signature。因此 sign 的方式是內嵌在 driver 或是位於獨立的 catalog file 對效能就有影響了,因為 read catalog file 還需要有額外的 disk I/O。然而 catalog fle 是所有 driver 共用,因此這個影響僅僅是一次而已,並不是檢查每個 driver signature 時都會有的 overhead。


MainPathBoot


它可再細分成四個 subphase: PreSMSS/SMSSInit/WinLogonInit/ExplorerInit



PreSMSS subphase

顧名思義就是在 SMSS.exe 執行前的動作。在這階段 kernel 初始化一些它的資料結構跟元件,並且啟動 PnP manager,並初始化在 OSLoader phase 所載入記憶體的 BOOT_START driver。


PnP manager 也是在這兒開始偵測 PnP device,它在偵測到裝置後,會將對應的 driver 載入並且檢查 signature。接著呼叫 DriverEntry 讓 driver 開始執行,並 IRP_MN_START_DEVICE 這個 IRP 給 river,通知 driver 可以啟動裝置了。PnP manager 再來會送 IRP_MN_QUERY_DEVICE_RELATIONS 來查詢裝置之前的相依性,相依裝置的 driver 在這時候也會被執行。上面的動作會一直執行下去,直到 PnP manager 找完並初始化所有的 device tree。


在 PnP manager 下 IRP_MN_START_DEVICE/IRP_MN_QUERY_DEVICE_RELATIONS IRP 給 driver 時,如果 driver 能夠在處理 IRP 時返回 STATUS_PENDING 的狀態給 PnP manager,讓它能夠接著處理其它事,而不是空空地等待 IRP 處理完成的話,對效能也是有改進。


SMSSInit subphase

這階段開始於 kernel 將執行權交給 smss.exe。smss.exe 會初始化 registry,載入並執行沒有被標示為 BOOT_START 的 driver,並啟動 (win32) subsystem process。這個階段結束於當 smss.exe 將控制權交給 Winlogon.exe。


WinlogonInit subphase

在這階段,使用者登入視窗出現,SCM 開始啟動服務,也開始套用 group policy。Winlogon.exe 再來會呼叫 explorer.exe 進入下一個 subphase。這階段大概從出現登入視窗開始,到桌面出現之間。


ExplorerInit subphase

這階段 explorer.exe 產生 DWM 並且初始化桌面。這階段很耗 CPU resource,因為 DWM 跟 desktop 在前景執行,而背景有 SCM 在啟動 service 跟 memory manager prefetcher 在 prefetch 資料。這階段通常是開機速度的瓶頸。


PostBoot


這階段大概就是桌面已經 ready 可以給 user 使用時作為開始,不過這時仍有一些 service 或者 application 在背景執行。xperf 使用檢查 idle level 的方法來判斷這個階段的結束。


在這階段 xperf 每間隔 100ms 會 sample 一次,假如在一個 sample 中有 80% 以上是 idle 的,那它就會認為這個 100ms sample 是 idle。如果這個 idle 一直持續累加到 10 秒後,xperf 就認為認為 PostBoot 階段結束。也由於這個 10 秒僅僅只是一個判斷標準,因此真正 PostBoot 的時間出來後記得要再減掉這 10 秒。


Summary


在 speed up boot transition 中,有幾樣需要去注意:


* 使用 Windows Performance Toolkit 來評估系統效能
* 使用 WDF 來寫 driver
* 啟動 BIOS fast POST
* 確認所有 BOOT_START driver 都是 embedded-signed
* 只有在確定使用到時才將 driver 標示為 BOOT_START
* 確認不必要的 service 在開機時不會執行,將它們改為 demand start or trigger start
* 降低 application resource 需求
* 降低放在 registry Run or RunOnce 的 application 數量
* Testing baseline 應該儘量在 pure environment 中產生,然後一次加入一個 device/service/application,這樣才能知道每次的加入對效能的影響


 


留言

熱門文章