中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区 » 请教grub 在有硬盘保护卡的情况下的使用问题!(急)
« [1] [2] »
作者:
标题: 请教grub 在有硬盘保护卡的情况下的使用问题!(急) 上一主题 | 下一主题
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『楼 主』:  请教grub 在有硬盘保护卡的情况下的使用问题!(急)

1、运行环境:
      我用的grub 版本是grub4dos-0.4.3-src-2007-03-28,硬盘保护卡是联想硬盘保护卡,保护软件版本是V1.0。我的机子装了msdos7.0和WindowsXP(都在同一分区)。
2、要实现的功能和实现方法
         我要实现的功能是系统先引导到DOS后运行一个dos程序再引导XP操作系统。我的做法是:修改BOOT.ini使系统默认进入MSDOS。然后在DOS下修改Boot.ini是XP成为默认的启动项后运行grub。
3、运行中出现的情况
        在硬盘保护卡保护的情况下运行grub后,探测中断并恢复时挂起。在硬盘保护卡没有保护的情况下运行grub后,运行程序成功,但保护卡失去了保护的作用。我这两天看了下dosstart.s源程序,可能是因为恢复中断向量表时出现了错误。我知道硬盘保护卡是修改了INT13中断。
4、我的问题
     1、我用读写硬盘扇区程序读MBR时发现在硬盘保护与没有保护的情况下只有少量标志位不同。如果后面引导XP时没有写硬盘的操作的话(我不清楚有没有写操作)是不是不要恢复中断向量表就可以引导系统了。
    2、如果后面一定要用原始中断向量int 13,可不可以在probe_ini中用原始int 13 中断向量替换现在的13中断,再在pre_stage中最后跳转时改过来位现在的int 13中断 ,实现硬盘的保护,并能否告诉怎样实现。      
   3、从上面的运行结果看,修改过的INT13 中断服务程序应该在硬盘上,并且应该在硬盘的隐藏扇区,不知是否正确。另外原始INT13 的服务程序在BIOS 系统ROM的位置是固定的吗?
   4、能否提供其他的方法实现相同的功能,我想自己编写代码,读取XP引导扇区到内存的相应位置,然后跳转执行能否实现相应的功能。还是要做一些环境保护。

2007-5-9 22:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 2 楼』:  



  Quote:
我要实现的功能是系统先引导到DOS后运行一个dos程序再引导XP操作系统。我的做法是:修改BOOT.ini使系统默认进入MSDOS。然后在DOS下修改Boot.ini是XP成为默认的启动项后运行grub。

目前我觉得你有一个选择,就是改变行车路线。可以这样做:修改 BOOT.ini 使系统默认进入 GRUB。然后在 GRUB 下编写一个 GRUB 程序用来修改 BOOT.INI,这样不仅达到了目的,而且步骤也简化了许多。

如果你不想编写 GRUB 程序来修改 BOOT.INI,你还有一个选择。就是,你把 NTLDR 加以改造,使它不用 BOOT.INI 而是用另外一个配置文件(比如说叫做 BOOT.001),修改后的 NTLDR 的文件名不要改动,让它仍然叫做 NTLDR(网上可以找到修改 NTLDR 的相应文章)。而你把原始的 NTLDR 保存为 NTLDR.ORG,目的就是将来利用它来引导 BOOT.INI 中的操作系统。

机器启动时,NTLDR 是你改造过的,它将寻找 BOOT.001 并启动到 GRUB4DOS,然后,再用 chainloader (...)/ntldr.org 来启动原来的 Windows XP。

当然,此时如果你仍然想运行某个 DOS 程序,则还是不行的。因此仍然需要你把你想运行的那个 DOS 程序的功能,用 GRUB 程序来实现。



因为我们亲手创建,这个世界更加美丽。
2007-5-11 09:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 3 楼』:  



  Quote:
在硬盘保护卡保护的情况下运行grub后,探测中断并恢复时挂起。在硬盘保护卡没有保护的情况下运行grub后,运行程序成功,但保护卡失去了保护的作用。我这两天看了下dosstart.s源程序,可能是因为恢复中断向量表时出现了错误。我知道硬盘保护卡是修改了INT13中断。

你怎么不贴出出错时的屏幕显示呢?根据出错显示,我甚至有可能帮你排除障碍,让 GRUB 在保护卡下运行。注意,应该用最新的测试版来报告问题。报告问题时,请在 DOS 下用 debug 来测试,并贴出测试结果。步骤如下:

敲入 debug 回车,进入 debug 的命令提示符之下。
敲入 d 0:0 回车。
敲入 d 0:540 回车。
敲入 q 回车,退出 debug 并返回到 DOS。



因为我们亲手创建,这个世界更加美丽。
2007-5-11 09:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 4 楼』:  



  Quote:
1、我用读写硬盘扇区程序读MBR时发现在硬盘保护与没有保护的情况下只有少量标志位不同。如果后面引导XP时没有写硬盘的操作的话(我不清楚有没有写操作)是不是不要恢复中断向量表就可以引导系统了。

2、如果后面一定要用原始中断向量int 13,可不可以在probe_ini中用原始int 13 中断向量替换现在的13中断,再在pre_stage中最后跳转时改过来位现在的int 13中断 ,实现硬盘的保护,并能否告诉怎样实现。      

3、从上面的运行结果看,修改过的INT13 中断服务程序应该在硬盘上,并且应该在硬盘的隐藏扇区,不知是否正确。另外原始INT13 的服务程序在BIOS 系统ROM的位置是固定的吗?

4、能否提供其他的方法实现相同的功能,我想自己编写代码,读取XP引导扇区到内存的相应位置,然后跳转执行能否实现相应的功能。还是要做一些环境保护。

问题不一定是 int13 引起的,真遗憾你没有贴出出错信息。



因为我们亲手创建,这个世界更加美丽。
2007-5-11 09:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 5 楼』:  

谢谢不点兄!
1、Quote
当然,此时如果你仍然想运行某个 DOS 程序,则还是不行的。因此仍然需要你把你想运行的那个 DOS 程序的功能,用 GRUB 程序来实现。

因为我必须要运行某个DOS程序,所以你提的那个方案可能实现起来很难。
2、我测试的数据如下,并且改变保护卡的的设置参数时发现D0:0的数据在数据会发生变化而D0:540的数据不会变。
d0:0
9E 0F C9 04 00 00 00 00--16 00 F9 07 6504 70  00
65 04 70 00 54 FF 00 F0--A8 7E 00 F0 16 E8 00 F0
1F 00 F9 07 28 00 F9 07--6F EF 00 F0 6F EF 00 F0
6F EF 00 F0 6F EF 00 F0--9A 00 F9 07 65 04 70 00
DC 03 70 00 4D F8 00 F0--41 F8 00 F0 40 04 D1 08
39 E7 00 F0 40 02 4B 02--2D 04 70 00 28 0A 4B 03
A4 E7 00 F0 2F 00 BA 08--6E FE 00 F0 04 06 4B 03
53 FF 00 F0 A4 F0 00 F0--22 05 00 00 1E 57 00 C0

d 0:540
16 E8 00 F0 16 E8 00 F0--C3 E2 00 F0 16 E8 00 F0
16 E8 00 F0 54 FF 00 F0--A8 7E 00 F0 16 E8 00 F0
B9 08 C0 91 87 E9 00 F0--6F EF 00 F0 6F EF 00 F0
6F EF 00 F0 6F EF 00 F0--57 EF 00 F0 6F EF 00 F0
BC 0D 00 C0 4D F8 00 F0--41 F8 00 F0 1B 00 00 91
39 E7 00 F0 59 F8 00 F0--2E E8 00 F0 D2 EF C0 F0
A4 E7 00 F0 00 00 00 00--6E FE 00 F0 53 FF 00 F0
53 FF 00 F0 A4 F0 00 F0--22 05 00 00 1E 57 00 C0

2007-5-11 12:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 6 楼』:  

没有改动时运行grub屏幕提示如下:
probing ROM INT vector..........
然后以下这些中断探测失败
02 08 09 0E 13 15 16 17 70 74
并且探测到77中断时死机!

2007-5-11 13:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 7 楼』:  

这么多中断都被硬盘保护卡修改得面目全非,我们还是不要继续研究了吧。它修改 int13 也就罢了,可它竟然修改了那么多。太麻烦,放弃它算了。也许厂家正是不希望 grub 能运行呢。



因为我们亲手创建,这个世界更加美丽。
2007-5-12 13:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 8 楼』:  

你能讲讲实现的思路吗?我现在急需要解决这个问题。自己编写代码,读取XP引导扇区到内存的相应位置,然后跳转执行能否实现相应的功能。还是要做一些环境保护。

2007-5-12 13:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 9 楼』:  

引导扇区也无非就是 512 字节。在 DOS 下你当然可以试试把它放在 0000:7C00 去执行,从而进入 XP。



因为我们亲手创建,这个世界更加美丽。
2007-5-12 22:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 10 楼』:  

我编了一个很小的汇编程序想实现把MBR加载到0000:7c00然后跳转到那里执行。因为我现在实际上就是想要重新引导一下系统,但第二次的boot.ini 与第一次的不同 。我考虑还原应该是在系统加电启动后在加载MBR前运行了自己Rom代码恢复了硬盘改动的数据。所以我重新加载一下MBR但跳过了自检。这样能实现我的功能。可我的代码还没有实现我要的功能,请大家帮帮忙!谢谢先

代码如下。
ootLoc equ  7C00h
data segment
erro  db 'Boot failure!','$'
data ends

stack segment stack
       db  255 dup (?)
stack ends

code segment
   assume cs:code,ds:data,ss:stack
start:
          cli
          xor  ax,ax
          mov  sp,7c00h
          mov  si,sp
          push ax
          pop  es
          push ax
          pop  ds
          sti
          mov di,5
ReadBoot: mov bx,BootLoc
          mov ax,201h
          mov dx,0080h
          mov cx,0001
          push di
          int 13h
          pop di
          jnz Goboot
          xor ax,ax
          int 13h
          dec di
          jnz ReadBoot
          mov dx,offset erro
          mov  ah,09h
          int 21h
          mov ah,4ch
          int 21h
Goboot:  mov si,7c00h//这条语句可能有问题我试过(db  0EA,00h,00h,00h,7ch)
          call word ptr es:[si]
code ends
        end start
我用Debug 看了0:7c00确实就是MBR.

2007-5-15 22:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 11 楼』:  

上面jnz  Goboot  应改为 jnc  Goboot  另外用db 0EA,00h,00h,00h,7ch 可以实现跳跳转到0000:7C00,但程序运行黑屏死机了,不知是什么原因。

2007-5-16 10:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 12 楼』:  

你不熟悉 x86 汇编。得先找资料学学了。从 DOS 的 debug 入手也可以。

db 0EA,00h,00h,00h,7ch 是 jmp 7c00:0000
db 0EA,00h,7ch, 0, 0 才是 jmp 0000:7C00



因为我们亲手创建,这个世界更加美丽。
2007-5-16 11:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 13 楼』:  

不要意思,是我发表文章的时候写错了,我程序里是对的.并且我用Debug指令调试也发现读到的确实是MBR,并且跳转到了0000:7c00执行,然后继续调试也读到了引导扇区.....看似一切都正常.可就是运行时死机.我看了willsort荣誉版主 一篇文章,里面提到IN19的资料. 资料提到用IN19中断重起系统有可能挂起系统,因为我的保护卡修改了08等中断.但我在DEBUG下用
INT 19
ret
指令能实现系统的正常引导.请不点兄再帮帮忙看看问题出在那里,能不能用我上面的编写的代码去试下(最好直接加载系统引导扇区来引导系统).  在此谢谢先!

in19中断资料如下
INT 19 - SYSTEM - BOOTSTRAP LOADER
Desc:        This interrupt reboots the system without clearing memory or restoring
          interrupt vectors.  Because interrupt vectors are preserved, this
          interrupt usually causes a system hang if any TSRs have hooked
          vectors from 00h through 1Ch, particularly INT 08.
Notes:        Usually, the BIOS will try to read sector 1, head 0, track 0 from drive
          A: to 0000h:7C00h.  If this fails, and a hard disk is installed, the
          BIOS will read sector 1, head 0, track 0 of the first hard disk.
          This sector should contain a master bootstrap loader and a partition
          table (see #00650).  After loading the master boot sector at
          0000h:7C00h, the master bootstrap loader is given control
          (see #00653).        It will scan the partition table for an active
          partition, and will then load the operating system's bootstrap
          loader (contained in the first sector of the active partition) and
          give it control.
        true IBM PCs and most clones issue an INT 18 if neither floppy nor hard
          disk have a valid boot sector
        to accomplish a warm boot equivalent to Ctrl-Alt-Del, store 1234h in
          0040h:0072h and jump to FFFFh:0000h.        For a cold boot equivalent to
          a reset, store 0000h at 0040h:0072h before jumping.
        VDISK.SYS hooks this interrupt to allow applications to find out how
          much extended memory has been used by VDISKs (see #00649).  DOS 3.3+
          PRINT hooks INT 19 but does not set up a correct VDISK header block
          at the beginning of its INT 19 handler segment, thus causing some
          programs to overwrite extended memory which is already in use.
        the default handler is at F000h:E6F2h for 100% compatible BIOSes
        MS-DOS 3.2+ hangs on booting (even from floppy) if the hard disk
          contains extended partitions which point at each other in a loop,
          since it will never find the end of the linked list of extended
          partitions
        under Windows Real and Enhanced modes, calling INT 19 will hang the
          system in the same was as under bare DOS; under Windows Standard
          mode, INT 19 will successfully perform a cold reboot as it appears
          to have been redirected to a MOV AL,0FEh/OUT 64h,AL sequence
BUG:        when loading the remainder of the DOS system files fails, various
          versions of IBMBIO.COM/IO.SYS incorrectly restore INT 1E before
          calling INT 19, assuming that the boot sector had stored the
          contents of INT 1E at DS:SI instead of on the stack as it actually
          does

2007-5-16 22:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 14 楼』:  

抱歉,这些事情没有时间去做试验了。



因为我们亲手创建,这个世界更加美丽。
2007-5-17 12:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bolas
初级用户





积分 32
发帖 12
注册 2005-8-24
状态 离线
『第 15 楼』:  

还有人做过这方面的事吗?在重新加载引导代码运行时是不是必须回复中断向量表,或是要卸载掉TSR程序.这是不是就是grubfordos的probe_ini 需要的理由啊.

2007-5-24 14:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: