1

私はLinuxカーネルにまったく慣れていないので、おそらく物事を混乱させます。しかし、どんなアドバイスも私を助けます;)

PCIeSATAカードを介してSATAHDDを接続していて、ブロックデバイスで使用readして好きにしようとしています。writeまた、データ電源の停電をHDDに保存したいのですが、キャッシュされません。そして最後に、各Linuxスタック層でどれだけの時間を失うかを分析する必要があります。しかし、一度に一歩。

現時点ではopen、*O_DIRECT*を使用してデバイスを試してみます。しかし、デバイスがどこにあるのかよくわかりません。として表示され/dev/sdd、1つのパーティションを作成しまし/dev/sdd1た。

  • openreadパーティションで/dev/sdd1動作します。write* O_DIRECT *で失敗します(ただし、適切なブロックサイズがあると確信しています)
  • open readwrite呼ばれる/dev/sddは完全に失敗します。
  • /dev/ブロックレイヤー上のデバイスを表す別のファイルはありますか?
  • 私の間違いと間違った仮定は何ですか?

これは私の現在のテストコードです

int main() {
    int w,r,s;
    char buffer[512] = "test string mit 512 byte";

    printf("test\n");

    // OPEN
    int fd = open("/dev/sdd", O_DIRECT | O_RDWR | O_SYNC);
    printf("fd = %d\n",fd);

    // WRITE
    printf("try to write %d byte : %s\n",sizeof(buffer),buffer);
    w = write(fd,buffer,sizeof(buffer));
    if(w == -1) printf("write failed\n");
    else printf("write ok\n");

    // RESET BUFFER
    memset(buffer,0,sizeof(buffer));

    // SEEK
    s = lseek(fd,0,SEEK_SET);   
    if(s == -1) printf("seek failed\n");
    else printf("seek ok\n");

    // READ
    r = read(fd,buffer,sizeof(buffer));
    if(r == -1) printf("read failed\n");
    else printf("read ok\n");

    // PRINT BUFFER
    printf("buffer = %s\n",buffer);

    return 0;
}

編集:私はパワーアーキテクチャで3.2カーネルを使用しています-これが重要な場合。

ファビアン、お時間をありがとうございました

4

1 に答える 1

1

SDD のブロック サイズ (512 ビットまたは 4K) によっては、そのサイズの複数の読み取り/書き込みしかできません。

また、O_DIRECT フラグを使用する場合は、バッファがブロック境界に正しく配置されていることを確認する必要があります。通常の char 配列を使用することを保証することはできません。代わりに memalign を使用してアラインされたメモリを割り当ててください。

于 2012-10-04T03:39:09.340 に答える