為什麼啟用AHCI還要分裝系統前和裝系統後?
為什麼在AHCI模式下裝系統就能自然地啟用AHCI,裝系統後再啟用AHCI就要修改註冊表,下載驅動,不然就會藍屏什麼的?
對於NT內核的系統,引導程序是找一個類似 xx磁碟控制器xx標識磁碟的第xx個分區上的windows。
而對於SATA控制器來說,為了兼容性,通常起碼有IDE和AHCI兩種工作模式,不同的工作模式需要不同的驅動程序。另外,原來是ide主通道上的master硬碟,切換成AHCI模式後變成了sata控制器埠0上的硬碟,引導程序還按照原來的地址去找windows自然就找不到了,而且默認引導過程只載入原來的ide控制器驅動,連AHCI驅動都不會載入。
所以需要手工強制安裝AHCI驅動程序,讓引導程序載入AHCI驅動。同時還要改註冊表,讓引導程序知道是去找SATA控制器埠0上的硬碟。
這種問題只有在混合內核和微內核的系統上才比較明顯,原因就是驅動和內核是分離的,內核文件本身不包含驅動。
在微內核(這裡包括混合內核,下同)里,引導程序需要知道內核在什麼位置(哪個物理設備,哪個分區),內核的啟動參數是什麼,以及支撐內核運行的基本驅動在哪(主要是IO相關的)。因為內核功能很弱,所以引導程序需要載入一些必要的驅動才行。
於是這裡存在這一個難題:引導程序該做多大?(多複雜?)
理論上說引導程序的功能類似於一個簡化版本的操作系統:有基本的IO、內存、設備管理,有基本的文件系統,以及一個載入器。其中的代碼量最多的就是設備驅動。
Win2K-WinXP時代(一直延續到Win7)都支持使用NTLDR作為引導程序啟動系統,但這個東西非常小,只有幾百KB大小,不可能集成很多功能。
那麼引導程序能不能做大呢?答案是可以,但維護性會變得很差。
NTLDR是通過引導扇區載入的,引導扇區只有幾百個位元組的彙編指令,無法完成內存初始化等複雜的操作,所以NTLDR自己要實現從實模式到保護模式的轉換,這種情況下,NTLDR的尺寸就限制在了640KB以下,實際上只有500多KB,所以NTLDR的功能就非常有限了。
有限的後果就是:NTLDR里無法集成磁碟設備驅動(因為種類太多了),於是AHCI這類驅動必須跟引導程序分離。
對於Windows來說,NTLDR選擇的是用INT 13H中斷來讀磁碟,省去了自己實現硬碟驅動的工作量。
沒有輔助的驅動,就意味著引導程序要去讀內核配置(在註冊表裡),要知道內核運行時需要的基本設備驅動在哪,並且為內核準備好這些驅動。
我前面已經說過了,引導程序不能太複雜,有些只能用INT 13之類的BIOS中斷,而一台電腦上可能存在著多個操作系統,引導程序需要知道自己要找的操作系統在哪。
因此引導程序需要有一張映射表,這張映射表能告訴引導程序:內核安裝在分區X上,X分區對應的物理設備是Y,通過這種映射關係,引導程序才能正確地找到內核對應的設備(分區)並正確載入驅動。
那麼,就會有題主遇到的問題,如果從IDE模式改成AHCI模式,那麼這種映射表就會被破壞了,因為設備名變了。並且因為是用戶在BIOS里改的,操作系統和引導程序是不知道這種變化的,所以一旦改變,就意味著要手動修改系統配置(註冊表),操作系統和引導程序才能正確的載入。
這種情況在Linux一類的宏內核系統上並不常見,原因是內核里可以同時集成AHCI和IDE驅動,並且整個內核文件只有一個,只要這一個內核文件被載入到內存以後,關鍵的驅動已經被載入了,內核代碼可以自己去probe設備,不存在找不到設備或者設備訪問失敗的情況下。
對於微內核的操作系統,要解決這個問題,只要把AHCI和IDE之類的驅動在引導程序階段都載入到內存里即可。但這樣就意味著引導程序要做很多事情,因為AHCI/IDE並非是兩個驅動,AHCI的控制器種類很多,非標準設備也很多,都在引導程序階段載入的話,驅動的「必要性」就不明顯了,也不太符合微內核的設計思路,所以Windows最終也沒採用這種方案。
推薦閱讀: