0

sys_writeSCSI デバイス上の がどのように機能するかを理解したいです。したがって、簡単なテスト プログラムをissue作成し、デバイス ドライバーの関数にデバッグprintk()を追加して、ata_queued_cmd->scsicmd->cmnd.

int main() {
    int w;
    char buffer[512] = "test string with 512 byte";

    // OPEN
    int fd = open("/dev/sdd", O_WRONLY | O_SYNC);

    // WRITE
    w = write(fd,buffer,sizeof(buffer));

    return 0;
}

では/var/log/messages、次の発行されたコマンドを確認できます。

  scsicmd->cmnd
------------------------------
 0x28 | READ(10)
 0x2A | WRITE(10)
 0x35 | SYNCHRONIZE CACHE (10)

書き込みたい 512 バイトがブロックサイズである必要があります。これは私がこの値を取得する方法です:

root$ blockdev --getsize /dev/sdd # returns size in sectors
488397168
root$ blockdev --getsize64 /dev/sdd # returns size in sectors
250059350016
root$ python -c "print 250059350016.0/488397168"
512.0

データが電源障害に安全に書き込まれていることは、私にとって非常に重要です。それが私が帰りを待ちたい理由ですO_SYNC。今、私はいくつかの質問があります:

  • READの前にがあるのはなぜWRITEですか?
  • SYNCHRONIZE CACHEデータがドライブの内部キャッシュにある場合、保証されますか? または、安全な書き込みを行うためにできることは他にありますか?

どうもありがとうございました :)

4

1 に答える 1

0

OK、私は今それを理解しました。それらはそれを読み取ってデータを内部カーネルバッファーにロードするため、複数の書き込み/読み取りがある場合、データは既にバッファーされています。

于 2012-07-13T08:21:10.980 に答える