我试图从OS X上的数据CD中读取普通的2048字节大小的数据扇区。
但是当我打开诸如“/ dev / disk8”之类的设备时,我得到的扇区大小为2352,在每个扇区的实际Mode1数据之前有一个16字节的标头。
即使使用hexdump等BSD工具,在阅读Apple制作的旧CD时也可以看到:
$ hexdump -n 512 -C /dev/disk8
00000000 00 ff ff ff ff ff ff ff ff ff ff 00 00 02 00 01 |................|
00000010 45 52 08 00 00 05 00 00 00 01 00 01 00 00 00 00 |ER..............|
00000020 00 04 00 00 00 10 00 05 00 01 00 00 00 1e 00 19 |................|
00000030 ff ff 00 00 00 41 00 05 07 01 00 00 00 4f 00 1f |.....A.......O..|
00000040 f8 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
实际扇区的数据从偏移量0x10开始,带“ER”。但“ER”应该偏移0。
如何在我自己的应用程序中完成此工作,而无需在单独的步骤中删除额外的数据?
我查看了“IOCDMediaBSDClient.h”和“IOCDTypes.h”中的各种ioctl
函数,但我找不到一个允许我指定我只想从扇区获取纯数据内容的函数
我也相信我15年前编写的现有代码能够按照需要处理这个问题,但是从那时起OS X中出现了一些变化,破坏了我的旧代码。现在我无法弄清楚如何解决这个问题。该代码使用ioctl
与DKIOCCDREAD
,参数sectorArea=kCDSectorAreaUser
和sectorType=kCDSectorTypeMode1
。但是这给了我16字节的标题,就像普通的read
调用一样,即使Mode1意味着我应该得到2048字节的扇区,没有任何标题,据我所知。
答案 0 :(得分:1)
如评论部分所述,答案似乎是使用字符设备(rdisk),而不是块设备(磁盘)节点。据我所知,这种区别没有很好的记录,对于硬盘驱动器和SSD实际上非常小 - 在大多数情况下,你可以使用其中之一。对于光盘来说,无论出于什么原因,它都会有很大差异。
不久前我对此进行了调查,但不幸的是,我忘记了它的细节。如果您对此感兴趣,可以在Apple的https://opensource.apple.com/站点上的“IOStorageFamily”和“IOCDStorageFamily”源代码包中找到实现。
您所关注的代码文件是与“BSD客户端”相关的代码文件 - IOStorageFamily中的IOMediaBSDClient.cpp / .h,以及专门用于CD的IOMediaBSDClient.cpp / .h。块(“磁盘”)设备的ioctl首先在dkioctl_bdev()
中处理,然后转发到通用dkioctl()
,后者又调用IOCDMediaBSDClient::ioctl()
方法。字符设备(“rdisk”)改为使用dkioctl_cdev()
。