2012-02-13 12 views
1

のUbuntu 10.04 LTS(2.6.32-38-ジェネリック)のi686 - インテルi7の - 16ギガバイトmallocできるサイズで同じサイズをmemsetできますか?

私は、メモリのmemset一定量にmap failedエラーを得ました。あなたは何か考えていますか?追加情報はmalloc同じサイズです。ここに私のコードです。

//Here I could malloc successfully 
    pdev->frame_buffer = (uint16_t *)malloc(3840000); 
    //Then, I got map_failed error here and message from compiler is "Invalid argument" 
    if((pdev->frame_buffer = (uint16_t *)mmap(0, 3840000, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){ 
     perror("Error: cannot mmap frame buffer"); 
     exit(1); 
    } 

は私がmmap(0, 100,...)ように上記しようとしたサイズより小さいI mmap場合、それは右のアドレスを返します。この問題がサイズのせいかどうか分かりません。

なぜ起こったのでしょうか?

答えて

0

あなたのmemsetは実際にはoff-by-oneエラーがあります。あなたは3,840,000バイトのmallocを持っていますが、あなたのメット範囲は合計3,840,001バイトを設定します。 argsが

if((pdev->frame_buffer = (uint16_t *)mmap(0, 3839999, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){ 
              ^^^^^^^---note the change. 
0

あなたのコード例では、全くのみmallocmmapmemsetが含まれていないすべきですか?

私の推測としてになぜmmapが失敗したファイルディスクリプタは、(コンテキスト変数名frame_bufferとファイルディスクリプタfbの両方から、そう示唆)フレームバッファを参照することで、あなたは、より大きな割り当てられた「の組み合わせを持っています「フレームバッファよりも」、「ドライバが好きではないパーミッション/フラグの組み合わせで割り当てられた」、「他の何らかの理由がありません」などです。

フレームバッファまたは他のデバイスメモリのマッピングは、ではありません。は通常のメモリまたはファイルにマッピングされているようなものではありませんが、もっと明白であまり明らかではありませんなぜこれが失敗するのか。

最初の明白なことは、現在の画面解像度とピクセルあたりのバイト数が合計して3840000になった場合です。そうでなければ、あなたは限界です。

関連する問題