|
本帖最后由 不点 于 2013-7-3 00:56 编辑
2011yaya2007777 发表于 2013-7-2 10:14
是的。错误源于判断原 0x2000 处的内核头部 4 字节 EA 70 82 00 。现在 0x2000-0x33ff 插入 usb 驱动代码 ...
为何要插入到内核头部之前?在 asm.S 中实现,不是更好吗?
挪动内核头部,只怕会带来一连串的不兼容问题。
给 0.4.5c 打补丁,那么老版本就放弃支持了?这个思路是不对头的。假如实在没有办法了,只好这么做。问题是,我很怀疑这是 “实在没办法” 了。
幸亏原来的代码检查内核头部,否则你这个改动所带来的混乱,不知道会等到何时才能发现。
当我们能够保持兼容性的时候,就不要破坏兼容性。除非是做不到,或者代价太高。
这个 USB 驱动也属于内核吧?那么他就应该放在内核头部之后。
grldr 的头部只有 8K 是可以被 NTLDR 加载的。你的 0x2000-0x33ff 的代码,不可能被 ntldr 加载到。所以,它放在这里没有意义,不如放在内核头部之后好。
背景:
内核起始于 grldr 偏移 0x2000,是固定的。内核头部有很多控制变量,是用户可以读写的。用户甚至在启动 grldr 之前可以动态修改内核头部中的变量,比如,启动盘的 drive number 以及启动盘的 chs 信息。你把头部一挪动,那原来的外部程序就要写错位置,失效了。
内核头部还记录了 preset menu 的位置。外部程序可以读出内核头部的指针,计算出 preset menu 的位置。头部被挪动到 0x2000 之后,那些外部程序都要泡汤了。
甚至 grldr 自己的头部代码(位于 grldr 第2扇区的代码)也写内核头部信息(有关 PXE 启动的控制信息)。头部一挪动,就好像没有坐标了,所有的东西都得改。
我们的文档早都公开过了(虽然是零零散散公开的),内核头部起始于 grldr 的偏移 0x2000 处。头部的变量也公布了。外部程序都把这当成依据了。此时再挪动,那不就是自乱阵脚吗?连文档也得修改了。
现在忽然想起,论坛上报告 bootice 写 preset menu 竟然会导致程序死锁,写入的结果 grldr 文件竟然达 4G 之多!我感到很疑惑:怎么会呢?这下子终于可以猜到原因了:内核头部被挪动造成的。
|
|