지연된 IO 메커니즘을 사용하여 프레임 버퍼 노드의 변경 사항을 추적하는 Linux 커널 드라이버를 구현했습니다.프레임 버퍼 노드를 사용하여 사용자 공간에서 커널 공간으로 쓰기가 지연되었습니다.
static struct fb_deferred_io fb_defio = {
.delay = HZ/2,
.deferred_io = fb_dpy_deferred_io,
};
등록 된 프레임 버퍼 노드는/dev/graphics/fb1입니다.
이 노드에 액세스 할 수있는 샘플 애플리케이션 코드는 다음과 같습니다
fbfd = open("/dev/graphics/fb1", O_RDWR);
if (!fbfd) {
printf("error\n");
exit(0);
}
screensize = 540*960*4;
/* Map the device to memory */
fbp = (unsigned char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fbfd, 0);
if ((int)fbp == -1) {
printf("Error: failed to start framebuffer device to memory.");
}
int grey = 0x1;
for(cnt = 0; cnt < screensize; cnt++)
*(fbp + cnt) = grey<<4|grey;
이 하나의와 전체 FB1 노드를 채울 것입니다.
다른 위치에서 데이터가 일치하지 않는 전체 버퍼를 읽으려고하면 커널 드라이버에서 문제가 발생합니다.
커널 버퍼
같이 매핑된다 :par->buffer = dma_alloc_coherent(dev, roundup((dpyw*dpyh*BPP/8), PAGE_SIZE),(dma_addr_t *) &DmaPhysBuf, GFP_KERNEL);
if (!par->buffer) {
printk(KERN_WARNING "probe: dma_alloc_coherent failed.\n");
goto err_vfree;
}
최종적 버퍼 register_framebuffer 함수를 통해 등록된다.
원본 버퍼를 읽을 때 임의의 위치에서 이전 데이터가 반영되는 대신 데이터가 기록되지 않습니다. 예를 들어
: 버퍼 위치 3964에서
난 11111111 기대했지만, 난 FF00FF00 알았다. 회색의 값과 동일한 응용 프로그램을 실행하는 방법에
내가 22,222,222 예상 된 버퍼 위치 3964에서 22,222,222
변경하지만, 일부 지연있을 것처럼 11111111 것 같습니다
발견 버퍼에 쓴다. 부분적으로 잘못된 데이터로 인해 이미지가 손상되어이 효과에 대한 해결책이 있습니까?
추가 정보가 필요하면 알려주십시오.
참고 : 매핑 할 수있는 버퍼가 캐시 가능한지 여부와 같습니다. 캐시에서 램으로 데이터를 복사하는 게으른 쓰기. 데이터가 제대로 복사되는지 확인해야하지만 여전히 좋은 생각은 아닙니다. :-(
응용 프로그램 코드에서 msync와 fsync 줄을 모두 추가하려고했습니다. 그러나 데이터가 여전히 올바르지 않습니다. – Anshul