Windows boot process
Bootloader phase
- BIOS 做 POST
- BIOS 讀 MBR,NTLDR 存在第一個 sector。將 NTLDR 載入記憶體,並轉移控制權至 NTLDR 的 entry point(NTLDR 包含兩個部份:StartUp module 跟 OSLoader。StartUp module 負責將 CPU 切換為 protected mode,以便之後能夠建立 IDT、GDT、page tables 跟啟動 paging)
- NTLDR 中的 StartUp 切換 CPU 至 protect mode,產生足夠的 page table 讓 16MB 以下記憶體能夠存取後,啟用 paging
- OSLoader 初始化 IDE-based system 跟 display。如果是 SCSI 介面的話,則載入 NTBOOTDD.SYS 來做磁碟存取
- 讀取 boot.ini,根據裡頭的內容到 active partition 載入 NTDETECT.COM。NTDETECT.COM 是一隻 16 bits real mode 的程式,故 NTLDR 切至 real mode
- NTDETECT.COM 呼叫 BIOS 來取得/偵測
* 放在 CMOS 裡的日期時間資訊
* Bus 種類,以及在 bus 上的裝置
* 磁碟數目、大小及型式
* 系統上 mouse input device 的種類
* 系統上 parallel port
* Video adapter - NTLDR 切回 protect mode
- 載入 NTOSKRNL.EXE 跟 HAL.DLL,進入 kernel loading phase
Kernel loading phase
- ntoskrnl.exe -> hal.dll -> kdcom.dll -> bootvid.dll
- 讀取 registry
- NTLDR 呼叫 NTOSKRNL.EXE 的 main function,準備環境來跑 win32 native application
- 初始化 interrupt controller、memroy manager(產生 system cache、paged/non-paged memory pool)、object memroy,接著 process manager assign security token 給系統第一個 process 跟它自己。第一個 process 為 system idel process 跟 System process(pid 都為 0)
- 載入所需要的 device driver。注意這邊只載入,但不初始化 driver。這階段使用者在 XP 會看到 progress bar 在跑,在 Vista/7 會看到 animation
- NTOSKRNL.EXE 呼叫 session manager, SMSS.EXE
- SMSS.EXE 載入 windows subsystem (win32k.sys) 以及 CSRSS.EXE 並啟動WINLOGON.EXE
- WINLOGON.EXE 啟動 SCM,啟動 LSASS.EXE,並呼叫 GINA 來顯示出一個 logon dialog box
- SCM 初始化 auto-start device driver 跟 windows service
- 使用者登入
Logon process
- GINA 將使用者的 username/password/domain 傳回給 Winlogon,Winlogon 將此資料傳給 LSASS.EXE
- LSASS.EXE 套用 local security policy,使用者成功登入
- Winlogon 更新 LastKnownGood control set
- 套用 user group policy
- 啟動 explorer.exe
- 啟動在 RunOnce/Run 的程式。Local machine 比 current user 還早跑,RunOnce 比 Run 還早跑
留言
張貼留言