高人请进,有关实现多启动问题。。。
POLOM 2003-08-20 09:05:41 有个很紧急的任务,要实现一个多启动系统,象lilo那样的,不过更复杂些,其中还要进行PCI等操作。目前任务由于技术原因不得不停下来了,有请高手专家助我!!!!
要求:
硬盘共分3个区,C和D分别安装一个操作系统,E是公共区,要求启动系统时提供一个菜单选择进入C操作系统还是进入D操作系统,当进入C时D不可见,E变为D;当进入D时C不可见,这时D变为C,E变为D。另外还要提供一个菜单,这个菜单的功能是读磁盘数据然后写到某个PCI对应的配置空间上(这时系统还没启动)。
我的思路:
写一个启动代码,然后把启动代码嵌入到磁盘的第一、二、三、四个扇区上,然后BIOS系统装载第一个扇区到系统内存并把系统控制权交给它后,由它把第2、3、4个扇区再装载到系统相应内存中,然后由这所装载的四个扇区代码完成象读写PCI、硬盘等任务。
我是这样装载扇区的:
第一扇区--由BIOS系统装载到---0000:0600h 第一内存块
第二扇区--由我的代码装载到---0000:0800h 第二内存块
第三扇区--由我的代码装载到---0000:0A00h 第三内存块
第四扇区--由我的代码装载到---0000:0C00h 第四内存块
目前状况:
启动代码已经写得差不多了,已经可以在系统启动时装载四个扇区内容到内存中了,菜单我也测试OK了,但是,问题出现了:
1、当我由第一块内存用jmp语句跳转到其他块时,出现一些奇怪的问题
cmp m_sel1,3
je L_GO_SET ;设置公共区属性
mov ax,0800h ;offset L_BEGIN_SECTOR_2
jmp ax ;=L_BEGIN_SECTOR_2,转0800h处,准备读LBA、写PCI、启动系统等操作(这个跳转没问题,好得很!!!)
...
...
L_GO_SET:
mov ax,0A00h ;offset L_BEGIN_SECTOR_3
jmp ax ;转0A00h处,准备设置公共区属性(但是这个跳转就有问题了,即使我把0A00h改为0800h也不行,不过我改为0600h就可以,很疑惑的地方????)
2、实现多启动有问题(都是windows系统)
启动代码提供三个菜单,一个是进入C区的操作系统,第二个是进入D区的系统,第三个是配置PCI。
代码中当选第一个菜单进入C区时我把C区设置为活动分区,然后装载逻辑C区的第一个扇区到内存0000:7C00h,然后控制权交由它,由它启动操作系统;当选择第二个菜单进入D区时,设置D为活动分区,然后象上面的处理一样装载逻辑D区第一扇区到。。。。。
我在C区装windows98、D区装WindowsXP。
当我选第一个菜单希望进入Windows98时,不成!还是出现了windows98和windowsXP选择界面,就像我们装lilo时一样!!!!
当选第二个菜单希望进入WindowsXP时,系统不能启动,停在黑屏中。。。。。。
这个问题我想是不是Mirosoft把多操作启动的信息写到逻辑C区第一扇区上?????如果是这样我该怎么解决????或者如何安装这两个操作系统来保证其真正的互相分开????
3、如何进入C时屏蔽D并把E盘符改为D?如何进入D时屏蔽C并把D盘符改为C,E改为D?这些操作对已安装的操作系统路径会不会有影响?
4、还有一个问题是因为在启动代码是在DOS下编译的,“好像”不能用双字操作,如eax寄存器等,现在我是用单字来代替,但是这样还能读写PCI的配置空间吗????
小弟刚接触这些深奥的东东,能力极为欠缺,真希望有高人指点指点迷津,在此先为谢过!!!!!!
问题的确有难度,愿以1000分相送,有建议者有份~~~~~~~~~~~~~~~~~~~~~~~
如有必要可源代码相送讨论!!!!