Linux 下不经过BIOS重启(i386)(3)

问题二:计时有问题

  Linux支持多个时钟源(clock source),在多核或多cpu构架下,Linux一般会使用APIC内的时钟,此时它会将传统的8253/8254(PIT)关掉。从此系统不再计时。在单核单cpu构架下,Linux也会设置PIT为一种慢速状态,因此不经BIOS重启后,时钟会变慢。

  因此还得按照实模式下AT构架的计算机来设置PIT的0通道,使之产生一个约为18.3Hz的脉冲通向IRQ0。

  解决了这两个问题,估计我的Linux重启再也用不上BIOS了。但是,尝试着重启到Windows却出现问题了——启动时蓝屏,而且错误为IRQL_NOT_EQUAL_OR_LESS。为了解决这个问题,我翻阅了大部分Linux启动、关机相关的代码,查阅了Windows资料(微软这方面资料一般是说设备或驱动有问题,让你去找Manufacturer)。期间又发现了两个看似无关、其实相关的问题:无法重启进入带CDROM驱动的DOS,而且进入了不带CDROM的DOS后CPU速度相当慢。

问题三:不经BIOS重启后CPU速度超级慢

  我在重启后的DOS下用speed测速软件测,CPU的主频相当于只有60MHz左右,而真实情况是我的CPU是2GHz双核。翻阅了大量Intel的资料也没找出问题所在。而且发现重启后Linux解压内核的时间很长,一般是瞬间闪过的解压提示,要在那停留20多秒,但是过了那道坎Linux的速度就恢复了。

  后来一次偶然的机会,我将GRUB由0.4.2升级为0.4.4,居然可以启动Windows和带CDROM的DOS,而且CPU速度恢复了!比较了GRUB源码,发现了问题所在。

  原来那段real_mode_swich代码是这样来切入实模式的:andl  $0x00000011,%eax;orl   $0x60000000,%eax ;movl  %eax,%cr0,注释中也有类似的说明:“ Sets CD and NW, to disable the cache on a 486, and invalidates the cache.”。以往从来没注意,那条粗体指令居然禁用了CD和NW两个位,而这两位是用来控制缓存的。也就是说,缓存被禁用后,CPU读写内存数据是直接操纵内存,测得的60MHz是禁用了整台计算机的缓存系统后的核心系统速度。去掉这段黑体指令就万事OK了。

  GRUB0.4.2和Windows只开启PE和PG,而无视其他的位。Linux很聪明,将CD和NW都恢复成0了所以Linux基本不受影响,除了解压内核。

五、其他注意事项

  解决了上面几个问题后,基本上再没发现什么问题了。在解决问题的时候还补充了多个环节,比如关掉A20等。A20只影响实模式系统,运行于保护模式的操作系统都会在启动的时候把它打开。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24642.html