1

ubuntu 10.04 LTS(2.6.32-38-generic) i686 - インテル i7 - 16GB

一定量のメモリにmap failedエラーが発生しました。memset何か考えはありますか?追加情報は、私は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上記のように試したサイズよりも小さい場合は、正しいmmap(0, 100,...)アドレスが返されます。この問題がサイズによるものかどうかはわかりません。

なぜそれが起こったのか推測できますか?

4

2 に答える 2

0

memset には、実際にはオフバイワン エラーがあります。3,840,000 バイトを malloc しましたが、meset 範囲では合計 3,840,001 バイトを設定するように指定されています。引数は

if((pdev->frame_buffer = (uint16_t *)mmap(0, 3839999, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){
                                             ^^^^^^^---note the change.
于 2012-02-13T17:33:14.980 に答える
0

あなたのコード例にはまったく含まmemsetれてmallocいませmmapん。

失敗する理由について の私の推測mmapは、ファイル記述子がフレームバッファーを参照していることです (コンテキストは、変数名frame_bufferとファイル記述子の両方からそう示唆していますfb)。ドライバーが好まない/フラグの組み合わせ」および「その他のあいまいな理由」。

フレームバッファまたはその他のデバイス メモリのマッピングは、通常のメモリまたはファイルのマッピングほど簡単ではありません(まあ、そうではありますが、そうではありません)。これが失敗する可能性がある理由は、より明白であり、それほど明白ではありません。

最初に確認すべきことは、現在の画面解像度にピクセルあたりのバイト数を掛けたものが 3840000 になるかどうかです。そうでない場合は、範囲外です。

于 2012-02-14T10:40:11.760 に答える