这种问题只有在混合内核和微内核的系统上才比较明显,原因就是驱动和内核是分离的,内核文件本身不包含驱动。
在微内核(这里包括混合内核,下同)里,引导程序需要知道内核在什么位置(哪个物理设备,哪个分区),内核的启动参数是什么,以及支撑内核运行的基本驱动在哪(主要是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最终也没采用这种方案。
和很多人想象的不同,这个问题十分常见,就算是Win10也是这样。不但是IDE模式变成AHCI模式会蓝屏,AHCI切到RAID也会蓝屏。有些同学原理在IDE模式的机械硬盘上装了操作系统,想不重装而用软件迁移到SSD的固态硬盘上,只要设置了AHCI模式,就会蓝屏。它的原因也很简单,也十分好解决,完全不要重装,我们今天来一起详细看一下。
作为BIOS工程师,在SATA硬盘刚刚流行的时候经常被测试人员骚扰:你的BIOS有bug,蓝屏了!
看到这个Stop code是7B的蓝屏,我就问他们:”你们是不是改磁盘控制器模式了?“
十有八九都会收到肯定或者模棱两可的”可能吧“这样的答案。我总是客气(没好气)地让他们安装用啥模式,启动就用啥模式。那么为什么这样呢?
原因很简单,Windows为了替大家”节省“硬盘空间,并没有把所有安装光盘带的驱动在安装时,都放到目标硬盘驱动列表中去。安装用IDE,就只有IDE的驱动在其中,安装用AHCI,就只有AHCI的驱动。换了硬盘控制器的模式,再次启动操作系统就找不到控制器的驱动程序了,这就是蓝屏的原因,找不到启动设备!这就是7B的意思:"STOP 0x0000007B INACCESSABLE_BOOT_DEVICE".
当然再装一遍就行了,也有种改注册表的方式。我有个更简单的方法。
1. 先该回去,正常启动后。在run里面运行msconfig,在boot(启动)里面选择安全模式safe mode启动。
2. 重启。先进入BIOS,改mode。接着继续安全模式启动Win10。Win10会从它的”私密小金库“中找到驱动并装好。
3. 在安全模式中打开msconfig,关掉safe mode,并重启。
4. 正常启动。live happily ever after.
欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!