2012-02-13 55 views
1

的Ubuntu 10.04 LTS(2.6.32-38-通用)的i686 - 英特爾酷睿i7 - 16GB我們可以用我們可以malloc的大小來memset相同的大小嗎?

我有一個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,...)尺寸越小,則返回正確的地址。我不確定這個問題是否因爲大小。

你有什麼猜測它爲什麼會發生?

回答

0

你的memset實際上有一個錯誤的錯誤。你已經malloc'd 3,840,000字節,但你的meset範圍指定總共設置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

你的代碼示例不包含memset可言,只有mallocmmap

我的猜測,爲什麼mmap失敗是文件描述符指的是幀緩衝(上下文暗示所以,無論是從變量名frame_buffer和文件描述符fb),並且您分配較大的」組合比「framebuffer」「,」分配了驅動程序不喜歡的權限/標誌組合「和」其他一些不明確的原因「。

映射幀緩衝器或任何其他裝置的存儲器是作爲映射正常存儲器或文件(當然,它種是,但隨後又,未),可以有更多的明顯且不太明顯理由瑣碎爲什麼這可能會失敗。

尋找第一個顯而易見的事情是,如果您當前的屏幕分辨率每像素字節數增加到3840000根本。如果不是這樣,你就會出界。

相關問題