高人请进,有关实现多启动问题。。。

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分相送,有建议者有份~~~~~~~~~~~~~~~~~~~~~~~
如有必要可源代码相送讨论!!!!
...全文
51 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiangua 2003-12-30
  • 打赏
  • 举报
回复
learn
Tiangua 2003-12-30
  • 打赏
  • 举报
回复
learn
POLOM 2003-09-17
  • 打赏
  • 举报
回复
已经埋了一单
http://expert.csdn.net/Expert/topic/2172/2172832.xml?temp=.3729669

还有四单没埋:
http://expert.csdn.net/Expert/topic/2172/2172862.xml?temp=.272381
http://expert.csdn.net/Expert/topic/2172/2172880.xml?temp=.261059
http://expert.csdn.net/Expert/topic/2172/2172814.xml?temp=.2321588
http://expert.csdn.net/Expert/topic/2172/2172851.xml?temp=.3876764

等待大家来取分中。。。
jackyspy 2003-09-15
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2254/2254529.xml?temp=.1711084
msdn001 2003-09-11
  • 打赏
  • 举报
回复
gz
POLOM 2003-09-08
  • 打赏
  • 举报
回复
又忙了一阵子,我的东东基本差不多了,虽然产品现在还没出来,但先买单吧,请andywolf(山楂果酱) 兄和W32API(李诚) 兄到以下帖子领分:

http://expert.csdn.net/Expert/topic/2172/2172832.xml?temp=.3729669
http://expert.csdn.net/Expert/topic/2172/2172862.xml?temp=.272381
http://expert.csdn.net/Expert/topic/2172/2172880.xml?temp=.261059
http://expert.csdn.net/Expert/topic/2172/2172814.xml?temp=.2321588
http://expert.csdn.net/Expert/topic/2172/2172851.xml?temp=.3876764

to ikao(我要好好学习学习) 兄:没及时看到你的消息,抬慢了! 我是正在打工中。。。

to andywolf(山楂果酱) :由于产品还没出来现在不便传阅,SOrry了,以后方便了再给你发一份,不过不是拜读!:)
ikao 2003-09-02
  • 打赏
  • 举报
回复
就当我没说吧!
ikao 2003-08-29
  • 打赏
  • 举报
回复
楼上的各位兄台,你们都已经工作啦?
andywolf 2003-08-28
  • 打赏
  • 举报
回复
恭喜恭喜!可不可以把程序发过来拜读一下!好久没有写这样的大程序了?~~~对了,李诚兄,你知道怎么让光驱弹出和关闭否?中断Int2Fh是否经常用?指点小弟一下!
W32API 2003-08-28
  • 打赏
  • 举报
回复
呵呵
我现在不是在 INTEL 系统下面编写这些程序,所以不用 INT 2FH。
其实也就是 ATAPI 接口的控制问题,只是系统不同。
当然,我也有不通过 ATAPI 控制光驱的时候,那就多辛苦一点咯。。
你要用 2F,那还是查下中断比较快。
POLOM 2003-08-26
  • 打赏
  • 举报
回复
经过周末的折腾,基本上搞定了,谢谢大家!

1、跳转问题是我犯了一个愚蠢问题,我装载扇区时
...
mov ax,0201h ;AH=2读磁盘,AL读的扇区数(蠢啊!这句应该放到循环之内!!!!int13h之前!,这是我的一个朋友发现的!)
...
L_NEXT_SECT:
int 13h
cmp ah,0 ;是否成功
jne L_ERRREAD234
...
cmp di,0
jne L_NEXT_SECT

2、把硬盘分两个主分区后,独立安装操作系统即可实现多启动功能了。原先我的硬盘主分区表只包括两个分区信息,一个主分区一个扩展分区。虽然要把硬盘表分为两个主分区并不是很完美,不过目前将就吧,以后有时间再深研。
3、隐藏分区已经OK,就是把分区类别改为操作系统不认识的类型。
4、用.386编译后可用eax等32位寄存器了,这个可缩短了不少代码,要知道写这些东东要惜代码如今!

再次感谢大家,特别是andywolf(山楂果酱) 兄和 W32API(李诚)兄。

等我把程序整理得差不多了就埋单!!!
misshome 2003-08-23
  • 打赏
  • 举报
回复
跳转失败很多情况是IPL在调用SPL时,堆栈设置的不是很正确, 在进入SPL之前最好设置下堆栈, 注意关闭中断.
W32API 2003-08-23
  • 打赏
  • 举报
回复
TO:POLOM(北岸WUS)兄
在没有操作系统的文件操作支持的情况下,自己去访问文件会使你的代码的体积增加很多。。。而且要做很多工作(在你手上没有现成案例的情况下)。
所以我还是建议你安装各自独立的操作系统比较好。。。

另,如是已安装独立操作系统而还是无法正常工作,是否可以发源代码过来看看。。。

li@sml-intl.com
andywolf 2003-08-23
  • 打赏
  • 举报
回复
push cs
push ip
retf
retf是这样用的,你是不是没有用对?
W32API 2003-08-22
  • 打赏
  • 举报
回复
我的分区表信息
8001010007FEFFFE3F000000BDC93801
0000C1FF07FEFFFFFCC938014D12A000
0000C1FF0FFEFFFF49DCD80178B5CF02
00000000000000000000000000000000
现在两个主分区都是 NTFS,第一个安装了 2K ADV SVR,
只要改为
0001010007FEFFFE3F000000BDC93801
8000C1FF0BFEFFFFFCC938014D12A000
0000C1FF0FFEFFFF49DCD80178B5CF02
00000000000000000000000000000000
就可以独立安装 WIN98
在使用 2K 的时候把分区信息改为
0001010007FEFFFE3F000000BDC93801
0000C1FF55FEFFFFFCC938014D12A000
0000C1FF0FFEFFFF49DCD80178B5CF02
00000000000000000000000000000000
那么98 系统分区是看不见的,但是要自己引导 2K 的引导信息
改为
0001010007FEFFFE3F000000BDC93801
0000C1FF0BFEFFFFFCC938014D12A000
0000C1FF0FFEFFFF49DCD80178B5CF02
00000000000000000000000000000000
则可引导 98 且看不见 2K 的 NTFS 分区。
关键在于你自己的引导代码去实现这个变换,并引导系统。。。
W32API 2003-08-22
  • 打赏
  • 举报
回复
TO:Areslee(易水)
不用的。。。两个系统独立安装就不会有问题
Areslee 2003-08-22
  • 打赏
  • 举报
回复
要处理NT/2000/XP的话还要修改BOOT.INI
你这个东西是很不容易实现的
cnzhzy 2003-08-22
  • 打赏
  • 举报
回复
.386
就可以使用EAX等32位寄存器了

跳转指令为什么不试试这样?
db 0eah
dw 0a00h,00h
sun_wyz 2003-08-22
  • 打赏
  • 举报
回复
太深了,学习。。。。。。。。。。。。
ylgoodman 2003-08-22
  • 打赏
  • 举报
回复
本人能力有限,不能提供技术上的支持,不过我建议你参考参考BOOTSTAR,好像他就能实现这个功能
加载更多回复(15)

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧