在读取损坏的CD时,有没有办法绕过扇区级CRC?


3

我正试图成像受损的CD,其中一些在重要领域有坏道。我知道有很多软件可以创建磁盘映像,即使它们遇到坏扇区。我的问题是那些坏扇区只是被跳过(复制为零)。是否有任何方法可以指示或强制驱动器返回它在损坏的扇区中读取的内容,无论扇区的CRC是否正常 - 几乎强迫它的行为就好像它正在读取音频CD一样?我没有找到任何关于此的信息,所以如果有人有任何相关信息,我将非常感激。我不怕写一些汇编代码或做一些焊接,所以任何提示都是受欢迎的。

以下是我已经尝试过的一些事情:

  • 使用不同的成像/复制软件,包括ddrescue,imgburn和winhex。 CD被读取为数据磁盘,驱动器不返回坏扇区。
  • 以原始访问模式读取CD。

一些想法(如果您知道其中任何一个将会/不会起作用,请发布):

  • 发出一些低级ATA命令来禁用CRC /强制驱动器进入音频CD模式?
  • 自定义固件?
  • 插入音频CD然后交换到所需的数据CD而不打开托盘?

欢迎任何其他想法,无论多么疯狂:)


简短的回答:我确信这是可能的。我认为这发生在您使用bin / cue图像或以“原始”模式读取时,但即使它没有,我仍然确定它是可能的,但不知道如何。
Daniel H

我尝试过使用原始模式 - 在好的扇区中,我得到了所有东西 - 帧计数器,扇区数据本身和纠错相关数据。但在坏道 - 没什么,只是一个错误。
Duke Nukem

Answers:


1

我没有当前的规范,但较旧的ATA文件没有提到获得不可读部门的能力。

请注意,您无法无条件检索磁盘数据的经验驳斥了一种普遍的误解,即磁盘数据直接从读取头传输到驱动器接口并传输到主机PC。如果这种误解实际上是真的,那么PC内存缓冲区将具有“原始”数据,然后才能应用任何错误检测和纠正。

这种误解通常被用来“证明”读头的“慢”比特率会降低SATA总线上的数据比特率,然后错误地认为快速SATA传输速率几乎没有什么好处(除非扇区数据来自驱动器缓存)。

但是,扇区数据总是从头部读入扇区缓冲区。
读入整个扇区后,将验证扇区数据。
只有当扇区数据被认为“好”(或可纠正)时才会开始转移到PC主机。
如果命令允许,检测到不可纠正的读取错误将触发重试。
否则,主机PC将收到命令中止状态。

注意,“不可读扇区”还包括控制器无法“找到”扇区的情况(实际上是其ID记录)。


谢谢(你的)信息!这至少证明没有可以禁用硬件CRC的标准ATA命令。但是,我遇到了在不执行硬件CRC的情况下读取音频CD的驱动器。我以后想要尝试的是用音频CD初始化驱动器,然后将其与我想要恢复的数据CD交换,而不是弹出托盘。这项工作可能还是会浪费我的时间?我担心像这样交换媒体类型只会导致后续寻求失败。
Duke Nukem

ATAPI(例如SATA分组)使用CRC。磁盘扇区使用 ECC ,纠错码。 HDD过去常常使用基于汉明码的11字节ECC。 CD-ROM使用基于Reed-Solomom代码的276字节ECC。看看294+线 CD-ROM部门信息 。我不知道你是否可以欺骗驱动器/控制器的读取逻辑/处理。 CD-ROM的格式或模式在扇区头中编码。您必须确保在读入扇区后驱动器始终忽略该说明符,以避免/跳过错误检测/处理。
sawdust

只是一个快速更新 - 前一段时间,我实际上有一个CD驱动器通过磁盘交换技巧读取数据CD作为音频。当我有更多时间时,我会研究逆转数据编码。
Duke Nukem

1

我想我应该回去自己回答这个问题,因为我在这个问题上经验丰富。事实上,我在原始问题中想到的两个想法确实有效!

发出一些低级ATA命令来禁用CRC /强制驱动器进入音频CD模式?

这确实可以在某些驱动器上实现(我测试过的2个驱动器中有1个支持这个)。您需要能够将通用数据包发送到驱动器。这可以通过使用CDROM_SEND_PACKET ioctl调用(可能)在任何Linux发行版中完成。首先,您需要向页面代码为1的驱动器发出MODE_SENSE_10命令(读写错误恢复)。使用页面控制值0(当前值),您将能够看到驱动器对坏扇区的行为,并使用页面控制值1(可更改的值)查看哪些可以更改。如果您的驱动器支持更改该页面的TB(传输块)设置,则应将TB设置为1并使用MODE_SELECT_10命令将修改后的设置发送到驱动器。 Et voila - 即使存在EDC / ECC / CIRC错误,您现在也可以从驱动器中取回扇区!最好的部分是驱动器在向您发送扇区之前执行扇区解扰以及它可以进行的任何纠错。 (未经测试:还有一个DCR设置,可能完全禁用纠错尝试。)

如果你觉得这很有意思,可以去linux livecd和Mt.富士规格!以上信息可在Mt.第752页找到。富士规范v.9修订版1.00。

Bonus:现在您可以将通用数据包发送到驱动器,您应该使用READ CD(0xBE)命令自己获取原始扇区。然后,您可以自己检查所有标题,EDC / ECC数据甚至子通道数据,如果您正在进行此类操作。当驱动器为您提供损坏的扇区时,您可以使用EDC / ECC数据来检查扇区的损坏程度,并在重新读取时确定要保留的两次尝试中的哪一种。

插入音频CD然后交换到所需的数据CD而不打开托盘?

信不信由你真的有效! (至少在我曾经测试的一些非常老的cdrom驱动器上)。您可以从字面上获得一个音频CD播放器来“播放”您的数据,记录它,并在纠正任何扇区漂移(通过查找数据扇区的同步头)和解扰数据(查看ECMA 130加扰查找表)后,获取原始数据,无需任何纠错。我很确定上面的第一种方法已经废弃了这种方法,但是时间会证明 - 我仍然只是开始实际的数据恢复。

我正在开发一些软件来自动化我刚写的东西,并且完美地(意思是包括任何控制头和子通道数据)归档旧的,损坏的CD。如果有人对这项工作感兴趣,请告诉我。另外,请告诉我,如果这种软件已经存在 - AFAIK它没有。


0

ddrescue 是一种数据恢复工具。它将数据从一个文件或块设备(硬盘,光盘等)复制到另一个,在读取错误时努力挽救数据。

AFAIK仅适用于Linux


我前段时间尝试过使用ddrescue,并且几乎有相同的结果。 CD通常作为数据磁盘读取,并且驱动器根本不返回任何坏扇区。谢谢你的回答:)
Duke Nukem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.