2012-02-13 3 views
1

우분투 10.04 LTS (2.6.32-38 제네릭)는 i686 - 인텔 I7 - malloc 할 수있는 크기로 동일한 크기를 memset 할 수 있습니까?

16기가바이트

나는 메모리의 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 오류가 있습니다. malloc'd는 3,840,000 바이트이지만 메쎄 범위는 총 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

귀하의 코드 예제는 전혀에만 mallocmmapmemset를 포함하지 않는해야 하는가?

내 생각으로 에 왜mmap가 실패 파일 기술자 (문맥 변수 이름 frame_buffer 및 파일 기술자 fb에서 모두, 그래서 제안) 프레임 버퍼를 의미한다는 것입니다, 당신은 더 큰 할당 "의 조합이 프레임 버퍼보다 ​​","드라이버가 좋아하지 않는 권한/플래그 조합으로 할당 됨 "및"일부 다른 모호한 이유 "가 있습니다. 프레임 버퍼 또는 다른 장치 메모리 매핑

(물론,이 종류의 IS, 그러나 다시,하지), 더 많은 명백하고 덜 분명 이유가있을 수 매핑 일반 메모리 나 파일과 같은 사소한하지입니다 왜 이것이 실패할지 모른다.

가장 먼저 알아야 할 사항은 현재 화면 해상도와 픽셀 당 바이트 수를 합하면 3840000입니다. 그렇지 않은 경우, 범위를 벗어납니다.

관련 문제