私はLinuxカーネルにまったく慣れていないので、おそらく物事を混乱させます。しかし、どんなアドバイスも私を助けます;)
PCIeSATAカードを介してSATAHDDを接続していて、ブロックデバイスで使用read
して好きにしようとしています。write
また、データ電源の停電をHDDに保存したいのですが、キャッシュされません。そして最後に、各Linuxスタック層でどれだけの時間を失うかを分析する必要があります。しかし、一度に一歩。
現時点ではopen
、*O_DIRECT*を使用してデバイスを試してみます。しかし、デバイスがどこにあるのかよくわかりません。として表示され/dev/sdd
、1つのパーティションを作成しまし/dev/sdd1
た。
open
とread
パーティションで/dev/sdd1
動作します。write
* O_DIRECT *で失敗します(ただし、適切なブロックサイズがあると確信しています)open
read
とwrite
呼ばれる/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カーネルを使用しています-これが重要な場合。
ファビアン、お時間をありがとうございました