1

欢迎。我在为 WRITE SECTOR(S) EXT - 34h、PIO Data-Out(对于 WRITE DMA EXT - 35h、DMA 相同结果)执行 SCSI 命令 ATA PASS-THROUGH(16) 时遇到问题。我使用内核 2.6.39。我有一个由 SCSI 控制的 HDD(SAT​​A)。我想将数据写入该驱动器的特定扇区。为了实现这个目标,我使用了 SCSI 命令 ATA PASS_THROUGH(16)。在源代码中,它可以像这样执行 ioctl:

sg_io_hdr_t command;
//hear goes a code that sets proper values to command structure
int fd = open("/dev/sda", O_RDWR);
int result = ioctl(fd, SG_IO, command);
//I know that there is no error checking but it isn't a case at this moment

当 ATA 命令的 LBA 小于 0xFE2600 时,此操作可以正常工作。数据写入驱动器,可以读取,重启后仍然存在。但是,当 LBA >= 0xFE2600 时执行此 ATA 命令时,将显示以下消息:

[5127.415214]ata1.00:异常Emask 0x0 SAct 0x0 SErr 0x0动作0x0

[5127.421751]ata1.00:irq_stat 0x40000001

[5127.425737]ata1.00:命令失败:写入 DMA EXT

[5127.430659] ata1.00: cmd 35/00:01:ff:ff:00/00:00:ff:00:00/40 标签 0 dma 512 输出

[5127.430664] res 51/10:01:ff:ff:00/00:00:ff:00:00/40 Emask 0x81(无效参数)

[5127.446389]ata1.00:状态:{DRDY ERR}[5127.450446]ata1.00:

错误:{ IDNF }

一开始我在想内核可能有问题,它只支持LBA 24位,不支持LBA 48位,但是这个理论与阈值0xFE2600并不完全一致(我认为如果阈值为 0x1000000)。从 IDENTIFY DEVICE - ECh, PIO Data-In 返回的数据中,我可以读到最大 LBA 为 0x2542EAB0,并且该驱动器支持 LBA 48 位。现在真的不要在哪里统计调查这个问题。如果有人有一些想法,请与我分享。如果您希望我提供其他信息,请告诉我,我会尽快提供。

4

0 回答 0