2012-02-13 2 views
1

Ubuntu 10.04 LTS (2.6.32-38-родовой) i686 - Intel i7 - 16GBМожем ли мы установить одинаковый размер с размером, который мы можем malloc?

я получил ошибку 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); 
    } 

Если I mmap меньше размера я попытался выше, как mmap(0, 100,...), то он возвращает правильный адрес. Я не уверен, что эта проблема из-за размера.

У вас есть догадки, почему это произошло?

ответ

0

У вашего memset действительно есть ошибка «один за другим». Вы имеете malloc'd 3,840,000 байт, но ваш диапазон 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. 
0

Ваш пример кода не содержит memset на всех, только malloc и mmap?

Моя догадка, чтобы почемуmmap не удается, что дескриптор файла ссылается фреймбуфером (контекст предполагает так, как от имени переменной frame_buffer и дескриптора файла fb), и у вас есть сочетание «выделено больше чем framebuffer "," выделенные с помощью сочетания разрешения/флага, которые драйвер не любит "и" некоторые другие неясные причины ".

Отображение фреймбуфером или любой другой памяти устройства не столь тривиален, как отображение обычной памяти или файла (ну, вроде есть, но опять же, нет), может быть много более очевидные и менее очевидные причины почему это может закончиться неудачей.

Первое очевидное, что нужно искать, если ваше текущее разрешение экрана с байтами на пиксель составляет до 3840000. Если это не так, вы вне пределов.

Смежные вопросы