无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3433|回复: 7
打印 上一主题 下一主题

[已解决] 问个grub4dos中CDROM的问题

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-18 22:01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在执行命令
cdrom --init
map --hook
后,
在GRUB4DOS中存取CRROM是通过INT13中断吗?

请问(cd0)的号码是多少?(类似hd0的号码是0x80)

求高手解答!

[ 本帖最后由 2011qf020124 于 2011-8-24 09:24 编辑 ]
2#
发表于 2011-8-19 10:35:35 | 只看该作者
一般来说,grub4dos 访问设备,都是通过 BIOS 提供的 INT13 软中断调用。但也有少数几个例外。比如说,PXE 规范里面,不存在 INT13 调用,那么访问 PXE 网络服务器上的文件,就无法利用 INT13,只能利用 BIOS 提供的其他接口(属于 PXE 规范)来实现。

当 BIOS 不提供 CDROM 的 int13 接口的时候,grub4dos (在内核中)访问 CDROM 就必须用 grub4dos 自己的驱动程序来访问。这个 CDROM 硬件驱动程序,类似于 PXE 设备驱动程序,都是设法访问设备上存储的内容。

PXE 和 CDROM 又有一些本质的差别。在 PXE 规范中没有确定扇区访问的方法,直接给出的是 PXE 服务器上文件的访问方法。因此,PXE 不符合传统的磁盘设备的理念。在 CDROM 规范中,CDROM 有 “扇区” 这样的概念。对于 No-emulation 模式的 CDROM 盘片来说,当机器用它启动以后,BIOS 还提供了 INT13 接口,用来访问这个 CDROM 的扇区。

由于 CDROM 有 int13 规范(就是说,世界上存在这样的规范),因此,当 grub4dos 能够用硬件驱动程序访问 CDROM 扇区的时候,也顺便把这个访问方法用 int13 包装起来,供其他操作系统(或应用程序)使用。例如 DOS下的 eltorito.sys 就是利用 int13 来访问 CDROM的。其他(任何一个)操作系统的 CDROM 安装程序也都要使用 int13,例如 Windows、Linux 的安装光盘,或者某个杀毒软件的安装光盘。

cdrom --init 探测是否存在 CDROM 硬件,识别出 CDROM 的个数,把这些基本的数据保存起来备用。map --hook 把驱动程序的代码挂上,使 grub4dos 以及其他操作系统都可以用 int13 来访问 CDROM。此时,int13 代码扮演的是 CDROM 驱动程序的角色,而不是纯粹的“仿真”。“仿真”这个概念,是说原来 BIOS 没有某个设备,需要 “假造” 一个出来。而此处的 CDROM 则不同,因为 CDROM 是系统中存在了的设备,只是 BIOS “眼瞎”,看不见它。我们这里的 CDROM 驱动程序是给 BIOS 戴上一副眼镜,是帮助了 BIOS,让 BIOS 能够看见 CDROM。也可以认为是 BIOS 的 “补丁”。如果 BIOS 不 “眼瞎” 的话,根本就不需要这个 “补丁”。当你的机器是用 no-emulation 模式的光盘启动的时候,BIOS 被迫提供 int13 接口,因为这是规范要求的。当机器不是从 no-emulation 模式光盘启动的时候,BIOS 可以不提供 int13 接口(绝大多数的 BIOS 都不提供),因为规范没要求它必须这么做。这规范本身就是有问题的(我认为是恶意的),它故意这么设计。参与设计的人,一定有 “利益” 在里面。

我认为 BIOS 是故意这么 “眼瞎” 的。这是有历史原因的。一般来说,“利益” 是靠 “制造障碍” 而体现的。不制造障碍,就没有利益,也就没有商业的动力了。制造障碍的目的是使自己的利益最大化。这就如同你家的门为什么要上锁?那就是为了保护你的利益,那制造的障碍就是让别人进不去。Windows 不开放源代码,以及商业软件需要加密狗的道理也都是一样的。不再展开论述了,已经离题很远了。不明白的人,自己动脑筋使劲想吧,相信你能找到答案的。

(cd0) 的号码是多少?

它不是固定的,它是可变的。在不同的情况下,它的值会不同。由于这个号码是 grub4dos 设定的,grub4dos 就需要为这个 CDROM 选择一个 “合适” 的值。这个值不能够与 BIOS 中可能已经存在的 CDROM 号码相冲突。对于不同的机器,当 BIOS 从 no-emulation 模式的光盘启动时,它给这个光盘赋予的号码 (cd) 也是不同的。因此,(cd0),(cd1),...,(cd7) 就需要躲避 (cd) 的值,保证与 (cd) 不冲突(不重叠)。目前这些 (cd0)...(cd7) 的选取大致都在 (0xC0)...(0xC7) 以及 (0xE0)...(0xE7) 这两个范围中,但不敢保证今后永远如此。
回复

使用道具 举报

3#
 楼主| 发表于 2011-8-19 20:50:38 | 只看该作者

非常感谢你这么详细的解答!!

看了你写的内容,我是这么理解的:

1.无论是PC直接从光盘启动,还是在GRUB4DOS中使用自带的ATAPI驱动,最后都是通过INT13来读取CDROM中的扇区的。

2.若是PC直接从光盘启动,BIOS就必须将CDROM挂接到INT13上,这也就是为什么从光盘中启动GRUB4DOS后能直接使用cd的原因(BIOS帮你挂好了)。

3.凡是支持从CDROM引导的BIOS,其实它都自带了CDROM的驱动,但是当从硬盘启动时,大部分的BIOS都不会去把CDROM挂载到INT13上,所以当DOS或者GRUB4DOS起来后,都必须提供额外的驱动来挂载光驱到INT13上,(这也是你认为恶意的原因,有却不拿出来与人分享)

请指正!!

另:请问有无在GRUB4DOS中查看光驱号码的方法?在DOS中的也行!
回复

使用道具 举报

4#
发表于 2011-8-20 09:52:14 | 只看该作者
原帖由 2011qf020124 于 2011-8-19 20:50 发表
另:请问有无在GRUB4DOS中查看光驱号码的方法?在DOS中的也行!

geometry (cd0)
回复

使用道具 举报

5#
发表于 2011-8-20 13:31:15 | 只看该作者

回复 #3 2011qf020124 的帖子

1.无论是PC直接从光盘启动,还是在GRUB4DOS中使用自带的ATAPI驱动,最后都是通过INT13来读取CDROM中的扇区的。

grub4dos 追求的是一种 “简单” 的设计,它读 CDROM 的理念,就是利用与 CDROM 规范中的 no-emulation 模式类似的方式(int13)来访问。前面说过了,在 BIOS 不提供 int13 的情况下,grub4dos 也要替 BIOS 打补丁,即 “制造” 一个 int13 接口。

DOS 可不是这样的。DOS 访问光盘,不再使用 INT13 接口,即使存在 int13 接口,DOS 都有可能不使用它。但是,DOS 下有一个开源的 CDROM 驱动程序 eltorito.sys,它却正好利用 int13 接口,这填补了 DOS 的不足。但是我个人有可靠证据证明,eltorito.sys 遭到了恶意封杀(我的这一观点以前也公布过,但与公布的其他任何观点一样,永远不强制别人认同,我甚至不能保证我的观点是 “正确” 的。用一句时下流行的话,“至于你信不信,我反正信了”)。


2.若是PC直接从光盘启动,BIOS就必须将CDROM挂接到INT13上,这也就是为什么从光盘中启动GRUB4DOS后能直接使用cd的原因(BIOS帮你挂好了)。

要加上一个限定词,从 no-emulation mode 的光盘启动,主板 BIOS 才可以保证把 int13 挂上。Win98 的安装盘是 floppy-emulation mode 的,因此这个光盘不行。而 WinXP 的安装光盘是 no-emulation mode 的,这个光盘可以。


3.凡是支持从CDROM引导的BIOS,其实它都自带了CDROM的驱动,但是当从硬盘启动时,大部分的BIOS都不会去把CDROM挂载到INT13上,所以当DOS或者GRUB4DOS起来后,都必须提供额外的驱动来挂载光驱到INT13上,(这也是你认为恶意的原因,有却不拿出来与人分享)

差不多就是这样吧。
回复

使用道具 举报

6#
 楼主| 发表于 2011-8-21 23:37:16 | 只看该作者

回复#5号的帖子

打破砂锅问到底!!

那如果是 floppy-emulation mode 的启动光盘,当从光盘启动时,启动步骤是否如下:
1.BIOS使用内部自带的光驱驱动,通过读写端口及DMA方式,将光盘上的软盘映像读入内存,做成虚拟内存盘


2.然后在BIOS内部做映射,将(fd0)映射到虚拟内存盘上,物理软驱则变成(fd1)

3.从虚拟软盘启动,当软盘中的DOS系统启动时,自动加载软盘中自带的光驱驱动,将光驱挂到某个盘符(比如E:)上


在以上过程中,大部分BIOS都不会将光驱挂接到INT13上(不开放此接口)

请问,是这样吗?

“DOS 访问光盘,不再使用 INT13 接口”--就是说DOS访问光盘,使用了其他软中断号(21H或之后的空闲中断号)?是吗?
回复

使用道具 举报

7#
发表于 2011-8-22 00:15:23 | 只看该作者

回复 #6 2011qf020124 的帖子

差不多是像你说的那样的。只有一点微小的偏差。BIOS 并不把软盘拷贝到内存。除了 floppy-emulation 之外,还有一种光盘格式:harddisk-emulation,这个显然比 floppy 大很多,而在1990 年代,那时的内存还很小,不足以把虚拟硬盘也放在内存中。因此,虚拟软盘也不在内存中。规范要求虚拟软盘和虚拟硬盘都 “就地” 仿真,都在 cdrom 介质上进行仿真。这可以节约内存。

就是说,在这种情况下,BIOS 需要为 512 字节大小的扇区访问提供 int13 接口。这个接口就是 floppy 和 hard disk 所需要的。但是规范并不要求提供整个光盘(扇区大小 2048 字节)的访问接口。所以,此时用 int13 接口,也只能访问光盘上的一部分扇区,就是 floppy 或者 hard disk 的映像。光盘上的其他扇区无法通过 int13 来访问。

dos 当然可以用 int13 来访问光盘上的软盘或者硬盘的映像了,因为这是 BIOS 提供的接口。否则,DOS 就无法启动。但是,DOS 访问整个光盘 iso9660 上的全部内容,只能通过 DOS 的驱动程序来实现。所以,可以认为,DOS 无法利用 int13 来访问光盘,它只不过是能够用 int13 来访问光盘上的软盘映像或者硬盘映像罢了(这是访问虚拟的软盘或者虚拟的硬盘,这不等于说是在访问光盘),要想访问整个光盘,还得靠 DOS 下的驱动。

这里你也再次看到了,通过 int13 可以访问光盘上的一部分扇区,而且是以 512 字节的扇区大小来访问的。这就证明了,BIOS 中不仅存在着 2048 字节的光盘扇区访问代码,而且同时也存在着 512 字节的扇区访问代码。换句话说,你需要的,它都有(甚至你不需要的,它也有了)。但是在你需要的时候,它却不提供给你,非得让你使用驱动。
回复

使用道具 举报

8#
 楼主| 发表于 2011-8-23 22:51:36 | 只看该作者

回复#7的帖子

非常感谢你的指点!!

我试验过了,floppy-emulation 的光盘启动后虚拟的软盘是只读的!
而且在虚拟盘起来后,将光盘拿走,就会出现读盘失败!!
这两点证明了确实是直接读取光盘上的镜像,而不是读取内存虚拟盘!


光盘启动的原理我基本上弄明白了!这个帖子可以结了!!再次感谢你的帮助,节约了我很多时间!其他问题会发新帖再问!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-30 20:50

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表