計算機與操作系統啓動原理(我也還沒詳讀)

      最近由於學習操作系統原理,加上自己對底層的興趣,查閱了不少資料,現結合《INSIDE WINDOWS NT》以及網上不少網友的文章,以及自己的粗略理解,整理出關於操作系統啓動的詳細資料,以資共享,當然這其中有不少是摘錄的文字,請原文作者原諒,如果有錯誤,還請各位指正:


  在剛開機加電時,根據X386CUP的特性,代碼段(CS,CODE SEGMENT)寄存器的值爲全1,指令計數器(IP,INSTRUCTION POINTER)的值爲全0,既CS=FFFF、IP=0000。這時CPU根據CS和IP 的值執行FFFF0H處的指令。由於FFFF0H已經到了基本內存的高地址頂端,所以,FFFF0H處的指令一般總是一個JMP指令,jump到另一個位於ROM BIOS中的位置(就是執行BIOS中的系統測試代碼,隨着製作BIOS廠商的不同而會有些許差異 )它負責開機自檢。如檢查內存,鍵盤等。在自檢過程中,ROM BIOS會在上位內存(UMB,UPPERMEMORY BLOCK)中進行掃描,看看是否存在合法的設備控制卡ROM BIOS(如:SCSI卡上的ROM),如果有,就執行其中的一些初始化代碼。緊接着系統測試碼之後,控制權會轉移給ROM中的啓動程序(ROM bootstrap routine),這個程序會將磁盤上的第零軌第零扇區讀入內存中(這就是一般所謂的boot sector,如果你曾接觸過電腦病毒,就大概聽過它的大名。假定硬盤是系統的啓動磁盤。硬盤的第一扇區稱爲主引導記錄(MBR, MASTER BOOTRECORD)。

      MBR 的長度爲512字節。可分爲兩部分:

      第一部分爲引導(PRE-BOOT)區,佔了446個字節;第二部分爲分區表(PARTITION PABLE),共有66個字節,記錄硬盤的分區信息。預引導區的作用之一是找到標記爲活動(ACTIVE)的分區,並將活動分區的引導區讀入內存。

      如果用軟盤啓動計算機,ROM BIOS 讀入的是軟盤的引導區,既軟盤的第一個扇區。),至於被讀到內存的哪裏呢? --絕對位置07C0:0000(即07C00h處),這是IBM系列PC的特性。經過一系列複雜操作後,最後將控制權轉移給操作系統。
  對於linux而言,開機磁盤的boot sector上的正是linux的bootsect程序,也就是說,bootsect是第一個被讀入內存中並執行的程序。(鑑於大家研究linux不多,linux有源代碼可參,bootsect.S->setup.S->head.S ->main.c,所以我就將linux以後的啓動略去,主要看Windows的啓動,且主要對於NT而言,2k類似。--因爲9X已成爲歷史)對於NT而言,boot sector上的正是Windows引導扇的引導代碼(他是在Windows安裝時被寫入的). 當引導扇區被引導後,他首先查找NTLDR.(該文件必須存在於根目錄下,否則系統提示:
  BOOT:Couldn't find NTLDR.或A kernel file is missing from the disk.NT.接着該死機了)NTLDR首先將CPU從實模式轉換到保護模式下.當NTLDR將所有的1M以下的內存頁描述符創建好後,NTLDR再開啓頁映射功能,現在NT可以訪問4G內存了.然後,NTLDR通過內建的文件系統代碼來查找根目錄下的BOOT.INI並根據BOOT.INI(這也是我們可以修改啓動選項的地方)的內容提示用戶可選的操作系統.當用戶在缺省的時間內沒有選擇.NTLDR就引導缺省的操作系統.然後NTLDR加載NTDECT.COM.調用INTxx來執行一大堆的BIOS系統調用.用來進行系統配置的檢測.所有檢測到的東西將被存到系統註冊表的HKLM/HARDWARE/DESCRIPTION項下. 接下來被加載的2個文件組成了WINDOWS NT的核心.那就是:HAL.DLL,NTOSKRNL.EXE.這2個文件在裝載時將被檢測PE校驗和,如果有問題或找不到.NT又要死機了.加載完這2個文件後,NTLDR再加載所有引導必須的驅動程序,然後加載HKEY_LOCAL_MACHINE/SYSTEM/Services裏的值SERVICE_BOOT_START的

        讀到這裏~~~……^_^

DRIVER.(此時不初始化.)然後NTLDR就會鎖定NTOSKRNL.EXE的main()函數,然後將控制轉移給NTOSKRNL.EXE. 接下來NT開始了自己複雜的OS核心初始化.首先調用ExpInitializeExecutive,而該函數則調用HAL.DLL裏引出的函數HallnitSystem().這時.NT就完成了對中斷控制器的初始化和時間片的設定.當HallnitSystem()返回,接下來進行的就是對內存管理器,安全引用監視器,對象管理器,進程管理器的初始化.在內存管理器完成初始化後,NT才顯示Microsoft (R) Windows NT (TM) Version 4.0 (Build 1381)之類的.而後面的SERVICE PACK號碼則是從註冊表裏HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Windows/CSDVersion取出.當進程管理器初始化完成後(進程管理器是NTOSKRNL.EXE裏最後被初始化的一個管理器),進程管理器產生2個進程.一個,乃是IDLE進程.一個,乃是SYSTEM進程.而當返回到ExpInitializeExecutive後,ExpInitializeExecutive就變成了IDLE線程.而IDLE線程的優先級是最低的.
  現在調用HAL激活多CPU的功能.然後將依次調用Object Manager, Executive, Kernel, Security Reference Monitor,Memory Manager,Cache Manager,Configuration Manager,I/O Manager, Process Manager.
  其中IO管理器負責完成啓動值爲SERVICE_BOOT_START的驅動程序的初始化,緊接着,啓動註冊表內啓動值爲SERVICE_SYSTEM_START的裝載.
  所有的DRIVER完成初始化後,還沒有任何USER MODE的程序,也沒有任何環境子系統.系統進程將調用核心函數ExInitializeSystem創建SMSS進程.就是SESSION MANAGER進程.SMSS是第一個USER MODE的應用程序.他又是一個真正的NATIVE APPLICATION.他不依賴於任何子系統.SMSS唯一需要的就是NTDLL.DLL.而且就是他創建了WIN32子系統.
  然後SMSS開始工作:
  創建LPC端口對象/SmApiPort.2個線程,等待客戶請求如加載子系統等.
  創建環境變量.
  定義DOS符號聯接.
  創建附加的頁面調度文件.
  從HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Session Manager/BootExecute找出引導時加載的NATIVE APPLICATION. 通常有CHKDSK.EXE等.
  調用CONFIG MANAGER完成對 HKEY_LOCAL_MACHINE/SAM,HKEY_LOCAL_MACHINE/SAM/SECURITY, HKEY_LOCAL_MACHINE/SOFTWARE配置.
  然後加載WIN32K.SYS.這時系統就被切換到圖形狀態.
  啓動WIN32子系統.即CSRSS.EXE.
  啓動WINLOGON.EXE.
  創建用於調試的LPC端口,並創建線程來監視.
  完成了這些工作後,SMSS就永遠等待WINLOGON和CSRSS的進程對象.把自己掛起.
  WINLOGON在被啓動後.啓動SCM(服務管理器).將所有的"自動啓動"的SERVICE啓動起來.當然,WINLOGON並不等待任何SERVICE的完成啓動.很有可能用戶已經登陸而SERVICE沒有啓動出來.當用戶的START組裏有某些應用程序需要依賴於某些SERVICE的存在的話,就有可能出錯.
  當所有的SERVICE啓動無誤後,現在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet就成爲了LAST KNOWN GOOD CONTROL SET.
  當啓動SCM後,WINLOGON就創建個工作站,代表KBD,MOUSE,MONITOR.並確保連SERVICE也不能訪問該工作站,以保證安全性.當工作站創建好後,就打開3個桌面.APP,SCR SAVER,WINLOGON.然後就是建立LSA和LPC聯接.用於登陸.註銷.口令操作.
  通過調用LsaLookupAuthenticationPackage獲取MSV1_0的相關ID,用於驗證身份.創建WINLOGON窗口類.確保SAS序列鍵按下後窗口過程被調用.只有WINLOGON桌面解鎖後才能切換到其他應用程序桌面.
  在LOGON時,WINLOGON調用GINA來確認用戶登陸.(這樣也提供了一個替換NT本身登陸驗證操作的方法)當用戶驗證身份完畢,登陸成功,桌面就被解鎖.並且調用USERINIT.EXE.該程序會查找出用戶的SHELL並啓動他.然後自己就結束生命.
  就這樣,一個操作系統就完全啓動了。

 

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