2009년 9월 8일 화요일

가상 프레임 버퍼 - wxvfb

프레임 버퍼(리눅스 프레임 버퍼)는 이름 그대로 프레임(화면)을 위한 버퍼(메모리) 입니다.


예로, 한 픽셀에 3byte(RGB888)가 필요한경우 1024*768 해상도를 위해 필요한(준비된) 버퍼의 크기는;



1024*768*3 = 2359296 byte



로 약 2M 정도가 되겠습니다.


메모리 복사는 꽤 비싸므로, 특히 동영상이나, 게임과 같이 높은 프레임레이트가 필요하다면 더욱 한번에 -그래픽 카드로- 복사하는게 좋겠죠. 프레임버퍼의 존재 이유가 바로 그것입니다.


리눅스의 경우 프레임 버퍼 장치가 보통 /dev/fb 패스에 연결되어 있습니다.



파일? 메모리라고 하지 않았던가요?



이 장치 파일을 메모리에 사상시키기 위해 mmap 함수를 사용하면 됩니다. 아흑 눈물겹게 직관적이에요. 감동 T-T


데스크탑 리눅스에선 이제 X윈도가 꽤 빠른데다, 도트노가다에 비할 수 없이 쉽기 때문에, 사용자가 프레임 버퍼를 직접 쓸 일이 거의 없어졌지만, 임베디드에서는(안드로이드!) 가볍고 빠르기 때문에 꾸준히 사랑받고 있습니다.


예로, falinux forum의 장길석 님이 관리하시는 gxLib 도 프레임버퍼를 위한 라이브러리죠.



최근 falinux 공개 세미나 (세미나의 내용은 너무나 훌륭했습니다. 다시 한번 감사드립니다) 에서 gxLib의 개발 환경을 엿볼 수 있었는데,


그리 편해 보이지 않더군요:



vmware 가상환경에서 프레임버퍼로 부팅한 후 개발(테스트) -_-;



제가 아는 리눅스에서의 개발은 그렇게 불편하지 않기에 우분투 리눅스 위에  gxLib의 개발환경을 꾸며봤습니다.


우분투 9.04 그놈 환경입니다. 실제 프레임버퍼 장치는 사용하지 않습니다. (말도 탈도 많더군요)


1. 필요한 라이브러리 설치


jpeg, png 이미지 처리를 위해 이들 라이브러리를 우선 설치해야 합니다. 다음명령:



$ sudo apt-get install zlib1g-deb libjpeg62-deb libpng12-dev



타겟용이 아닌 이상 굳이 각 라이브러리들을 소스부터 빌드할 필요가 없습니다. 한줄로 뚝딱


 


2. gxLib 소스 다운로드


이 링크로 부터 gxLib 0.7.1 소스를 다운 받아 적당한 곳에 풀고,


패치를 적용합니다.



$ cd gxLib-0.7.1


$ patch -p1 < gxLib_b24_suapapa_20090826_1.patch


 



3. 빌드


위 패치에는 scons 빌드 스크립트가 포함되어 있습니다.



$ scons


...


scons: done building targets.



이제 같은 디렉토리에 gxLib의 라이브러리 파일 libgx.a 이 생성되고, sample/sample 바이너리가 생성될 것 입니다.


 


4. 가상 프레임버퍼에서 테스트


불행히도, 제가 테스트한 넷북(GMA500)에서는  frame buffer장치가 제대로 동작하지 않았습니다. 된다 하더라도 프레임버퍼를 시험해 보려고 X윈도를 벋어나는건 번거롭겠죠.


해서 가상 프레임 버퍼 프로그램을 만들어 봤습니다.



파이썬으로 생각처럼! 간단하게 만들 수 있었는데, 더미 파일을 하나 만들어 mmap으로 사상시키고 주기적으로 바뀐내용을 갱신하는 구조 입니다. 리눅스에서 장치를 파일처럼 다룰 수 있기 때문에, 반대로 파일을 장치처럼 여기고 에뮬레이션 하는 것이죠.


실제 장치가 아니기 때문에 fb specific한 ioctl들(해상도, bpp)이 동작하지 않으므로, gxlib에서 해당 ioctl 대신 미리 정해진 값들로 하드코딩해야 되며, 위 패치 중 USE_VIRTUAL_FRAME_BUFFER define으로 구분해 두었습니다.


적당한 곳에 -두 파일을- 받은 후 실행합니다.



$ python wxvfb.py



640x480 24bpp의 프레임 버퍼를 만들며, 같은 디렉토리에 가상 장치인 dummy.vfb 파일이 생성됩니다.


이제 이 파일을 인자로 전달하여 gxLib 샘플을 실행시켜 봅니다.



$ cd sample


$ ./sample ../../dummy.vfb



그러면.. 짜잔~



 


5. 더해서...


사실 윈도에서도 파일을 메모리에 사상시켜 사용하기 위한 함수들이 준비되어 있습니다. 또 관대한 Gnu 께서 윈도에게도 차별없이 내려주신 축복 덕에 이미지 압축 라이브러리들도 쉽게 구할 수 있더군요.


또 제가 만든 가상 프레임버퍼 또한 멀티 플렛폼 GUI 위젯인 wx를 사용하는 터라, 윈도에서도 동일하게 프레임 버퍼 환경을 에뮬레이션 하는게 가능합니다.


QT나 안드로이드 같은 플렛폼뿐아니라 거의 모든  상용 SDK가 윈도 에뮬레이터를 지원하니까, gxLib도 윈도에서 개발가능한게 공평하죠.


해서.. gxLib를 윈도로 포팅을 하다가. 그만...



성격 버렸습니다. -_-^



허경영을 세번 외쳤는데도 안되요.


윈도로 포팅해 보이겠노라고 약속은 해 뒀는데 이것참 난감하네요. $|