欢迎。 对于WRITE SECTOR(S)EXT执行SCSI命令ATA PASS-THROUGH(16)时出现问题 - 34h,PIO数据输出(对于WRITE DMA EXT - 35h,DMA结果相同)。我使用内核2.6.39。我有一个由SCSI控制的HDD(SATA)。我想将数据写入此驱动器的特定扇区。为了实现这个目标,我使用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
当LBA for ATA命令小于0xFE2600时,此操作正常。数据写入驱动器,可以读取,重新启动后仍然存在。但是当执行此ATA命令时LBA> = 0xFE2600时,将显示以下消息:
[5127.415214] ata1.00:异常Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[5127.421751] ata1.00:irq_stat 0x40000001
[5127.425737] ata1.00:命令失败:WRITE DMA EXT
[5127.430659] ata1.00:cmd 35/00:01:ff:ff:00/00:00:ff:00:00/40标签0 dma 512 out
[5127.430664] res 51/10:01:ff:ff:00/00:00:ff:00:00/40 Emask 0x81(无效参数)
[5127.446389] ata1.00:status:{DRDY ERR} [5127.450446] ata1.00:
错误:{IDNF}
一开始我认为内核可能存在问题,它只支持LBA 24位且不支持LBA 48位,但这个理论与阈值0xFE2600并不完全一致(我认为如果阈值是0x1000000则会。从IDENTIFY DEVICE返回的数据 - ECh,PIO Data-In我可以读到最大LBA是0x2542EAB0,并且驱动器支持LBA 48位。 现在不要在哪里统计调查这个问题。如果有人有一些想法请求与我分享。如果您希望我提供其他信息,请告诉我,我会尽快完成。