Можем ли мы установить memset того же размера, что и malloc? - PullRequest
1 голос
/ 13 февраля 2012

Ubuntu 10,04 LTS (универсальный 2.6.32-38) i686 - intel i7 - 16 ГБ

Я получил ошибку 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,...), то он возвращает правильный адрес.Я не уверен, если эта проблема из-за размера.

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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

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

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

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

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

0 голосов
/ 13 февраля 2012

Ваш memset на самом деле имеет ошибку off-by-one.Вы использовали malloc 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.
...