2016-10-11 1 views
0

내가 내 단일 버퍼 코드가 잘 작동 FBIOPAN_DISPLAY ... FD IOCTL을 (사용하여 이중 버퍼를 구현하려고하는 시도에 실패 MMAP는 이중 버퍼 framebufer

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; 

fbp = (char*)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); 

나는 "길이를 증가하려고

매개 변수 "를 사용하여 화면 크기 * 2, mmapEINVAL으로 실패합니다. 내 길이 매개 변수가 마음에 들지 않습니다 .

단일 버퍼의 화면 크기는 6,220,800이고 이중 버퍼의 크기는 12,441600입니다. 임베디드 시스템이지만 RAM은 1 기가비트입니다.

길이 매개 변수는 size_t입니다.이 시스템에서 4 바이트 만 사용할 수있는 최대 크기는 4 메가이지만 아직 6 메가가 잘 작동한다고 생각해서 정말 간단하다고 생각합니다. 방법이 있나요 mmap 버퍼가 size_t보다 큰가요?

+0

'증가'는 무엇을 의미합니까? 다시 매핑하는 거니? – DAG

+0

증가, 즉 다시 컴파일하고 두 번째 매개 변수 (길이) = 스크린 크기 * 2로 실행한다는 의미입니다. 그것은 EINVAL errno – RTC

+0

와 함께 실패합니다. 그냥 const var를 double_screensize = screensize * 2로 만든 다음 mmap에 전달 했습니까? – DAG

답변

1

The man page 길이가 (제 2 매개 변수) 유형이 size_t이므로 더 큰 유형을 전달하는 것이 안전하다고 말합니다.

첫 번째 부분을 매핑 한 다음 두 번째 부분을 in this SO Q&A으로 다시 매핑하는 것이 좋습니다. EINVAL에 관한

: 은 man 페이지에 명시된입니다 : 우리는 요지로, 길이를 좋아하지 않아 EINVAL

또는 (오프셋 예를 들면, 그들은 너무 큰, 또는 페이지에 정렬되지 않은 경우 경계).

EINVAL (리눅스 2.6.12 보낸) 길이 플래그도 MAP_PRIVATE 또는 MAP_SHARED 포함하거나 이들 두 값을 포함 0.

EINVAL이었다.

페이지가 정렬되어 있습니까?

+0

페이지 정렬해야 할 매개 변수는 무엇입니까? 첫 번째 매개 변수와 마지막 매개 변수가 모두 0이기 때문에 나는 생각했지만 페이지 길이로 쪼갤 수 있도록 내 길이 값을 수정해야합니까? 화면 크기가 성공적이어서 페이지가 정렬 된 경우 – RTC

+0

나는 스크린 크기 * 2도 필요할 경우 페이지 정렬 될 것이라고 생각한다. – RTC

+0

그래, 맞아. 하지만 내 마음에 와서 :'screensize * 2 '가'size_t'보다 큰 경우 산술 오버 플로우가 발생하여 정의되지 않은 동작이 발생할 수 있습니다. 그러나 12,441,600이 4,294,967,295보다 훨씬 작기 때문에 (size_t가 uint라고 가정 할 때) 이것이 문제라고 생각하지 않습니다. –

관련 문제