1

いらっしゃいませ。SCSI コマンド ATA PASS-THROUGH(16) for WRITE SECTOR(S) EXT - 34h、PIO Data-Out (WRITE DMA EXT - 35h、DMA 同一の結果) の実行中に問題が発生しました。カーネル 2.6.39 を使用しています。SCSI によって制御される HDD (SATA) が 1 台あります。このドライブの特定のセクターにデータを書き込みたいです。その目標を達成するために、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 未満の場合に正常に機能します。データはドライブに書き込まれ、読み取ることができ、再起動後も存在します。ただし、この ATA コマンドの実行中に LBA >= 0xFE2600 になると、次のメッセージが表示されます。

[ 5127.415214] ata1.00: 例外 Emask 0x0 SAct 0x0 SErr 0x0 アクション 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 アウト

[ 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