FrameBuffer 에 대한 하룻밤 hack

유 닉 스 / 리 눅 스 시스템 은 명령 에 의 해 작 동 되 는 것 으로 알려 져 있다.그러면 가장 기본 적 인 시스템 은 명령 행 입 니 다.X - Window - System 은 Unix / Linux 의 그래 픽 시스템 으로 X - Server 를 통 해 하드웨어 를 제어 합 니 다.그러나 일부 리 눅 스 의 발행 판 은 안내 할 때 화면 에 도형 이 나타 나 는데 이때 의 도형 은 X 로 완성 할 수 없다. 그것 은 어떤 메커니즘 일 까?정 답 은 FrameBuffer.FrameBuffer 는 그래 픽 시스템 이 아니 라 창 시스템 도 아니다.그것 은 X 보다 저급 하 다. 쉽게 말 하면 FrameBuffer 는 메커니즘 의 실현 이다.이 기 제 는 화면의 모든 점 을 선형 메모리 공간 으로 표시 하 는 것 입 니 다. 프로그램 은 이 메모리 의 값 을 간단하게 바 꾸 어 화면의 특정한 색 을 바 꿀 수 있 습 니 다.X 의 고도 이식 성 은 바로 이런 메커니즘 에서 비롯 된 것 이다. 그런 도형 환경 에서 든 이런 메커니즘 이 실현 되면 X 를 운행 할 수 있다.그래서 거의 모든 플랫폼 에 해당 하 는 X 버 전의 이식 이 있 습 니 다.자, 잡담 은 그만 하고 FrameBuffer 를 이용 해 무엇 을 할 수 있 는 지 살 펴 보 자.먼저 드라이브 가 있 는 지 확인 하 십시오. / dev / 아래 에 fb * 이 장치 파일 이 있 는 지 찾 아 보 세 요. 이것 은 문자 류 의 특수 파일 입 니 다.
코드:

   
   
   
   
ls -l /dev/fb0 (Enter) crw-rw---- 1 root video 29, 0 Jan 27 15:32 /dev/fb0

이 파일 이 없 으 면 다른 것 도 찾 아 볼 수 있 습 니 다. 예 를 들 어 / dev / fb1, / dev / fb2... 이 파일 들 을 찾 지 못 하면 커 널 을 다시 컴 파일 해 야 합 니 다.다음은 이 파일 / dev / fb0 이 존재 한다 고 가정 합 니 다. 이것 이 바로 FrameBuffer 의 장치 파일 입 니 다.이거 있 으 면 우리 플레이 with Frame Buffer 할 수 있어.(다음 동작 은 반드시 X 아래 가 아니 라 FrameBuffer 가 시 작 된 가상 콘 솔 아래 에서 할 수 있 습 니 다)
코드:

   
   
   
   
cat /dev/fb0 > sreensnap ls -l sreensnap -rw-r--r-- 1 wsw wsw 6291456 Jan 27 21:30 sreensnap

우 리 는 마침 6M 의 파일 을 얻 었 고 다음 작업 을 했다.
코드:

   
   
   
   
clear /* */ cat sreensnap > /dev/fb0

이상 한 일이 생 긴 거 아니 야?바이러스 에 걸 린 것 같은 데?화면 이 다시 이전 상태 로 돌 아 왔 습 니까?조급해 하지 마 세 요.
코드:

   
   
   
   
clear

이렇게 하면 화면 이 정상 입 니 다.이상 의 조작 을 통 해 나 는 너 도 알 아 맞 혔 다 고 생각한다.파일 / dev / fb0 은 화면의 모든 색상 을 제어 하 는 파일 입 니 다.우 리 는 프로그램 을 써 서 이 파일 의 내용 을 바 꿀 수 있 습 니 다. 화면 에 그림 을 편리 하 게 그 릴 수 있 습 니 다. -) 제 가 아래 에 작은 프로그램 을 써 서 화면의 속성 을 탐지 하 겠 습 니 다.
코드:

   
   
   
   
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h> int main () { int fp=0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; fp = open ("/dev/fb0",O_RDWR); if (fp < 0){ printf("Error : Can not open framebuffer device/n"); exit(1); } if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){ printf("Error reading fixed information/n"); exit(2); } if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){ printf("Error reading variable information/n"); exit(3); } printf("The mem is :%d/n",finfo.smem_len); printf("The line_length is :%d/n",finfo.line_length); printf("The xres is :%d/n",vinfo.xres); printf("The yres is :%d/n",vinfo.yres); printf("bits_per_pixel is :%d/n",vinfo.bits_per_pixel); close (fp); }
struct fb_var_screenfo 와 struct fbfix_screenfo 두 데이터 구 조 는 / usr / include / linux / fb. h 에서 정 의 된 것 으로 재 미 있 는 값 이 있 습 니 다. (모두 부호 없 는 32 비트 의 정수 입 니 다)
fb 에서fix_screen info 에 있 습 니 다.
__u32 smem_len 은 이 / dev / fb0 의 크기, 즉 메모리 크기 입 니 다.
__u32 line_length 는 화면 에 있 는 한 줄 의 점 이 메모리 에 있 는 공간 이지 한 줄 의 포인트 가 아 닙 니 다.
fb 에서var_screen info 에 있 습 니 다.
__u32 xres ,__u32 yres 는 x 와 y 방향의 해상도 로 두 방향의 포인트 입 니 다.
__u32 bits_per_pixel 은 모든 점 에서 차지 하 는 메모리 공간 입 니 다.
위의 프로그램 을 컴 파일 한 후에 실행 합 니 다. 제 기계 에서 의 결 과 는 다음 과 같 습 니 다.
코드:

    
    
    
    
The mem is :6291456 The line_length is :4096 The xres is :1024 The yres is :768 bits_per_pixel is :32

메모리 길 이 는 마침 6M 이 고 줄 당 4M 의 공간 을 차지 하 며 해상 도 는 1024 x768 이 고 색채 깊이 는 32 비트 이다.세심 한 너 는 이미 뭔 가 잘못 되 었 다 는 것 을 알 았 을 것 이다.화면의 점 은 1024 x768 = 786432 개 로 점 당 32 비트 를 차지한다.스크린 의 총 점유 메모리 수 는 32x 786432 = 25165824 는 3145728 바이트 로 마침 3M 이지 만 위의 프로그램 은 우리 에 게 6M 의 저장 공간 이 있다 는 것 을 알려 준다.이것 은 현대 의 도형 시스템 에서 대부분 버퍼 기술 이 있 고 디 스 플레이 에 두 페이지 의 스크린 데이터 가 저장 되 어 있 기 때문에 스크린 내용 을 신속하게 바 꾸 어 애니메이션 을 실현 하 는 데 편리 하 다 는 비교적 높 은 요구 이다.이런 완충 기술 에 관 해 서 는 좀 복잡 하 니, 우 리 는 현재 먼저 토론 하지 않 는 다.이 화면의 색상 데 이 터 를 저장 하기 위해 서 는 이 3M 메모리 만 있 습 니 다.
자, 이제 FrameBuffer 에 대해 대충 알 고 있 겠 지.그럼 이제 스크린 에 뭔 가 를 그 리 려 고 할 거 야. 우리 점 부터 그 려 보 자.먼저 제 생각 을 말씀 드 리 겠 습 니 다. 유 닉 스 시스템 에 서 는 모든 것 이 파일 입 니 다.우 리 는 화면 에 대한 읽 기와 쓰기 가 / dev / fb0 의 읽 기와 쓰기 로 바 뀔 수 있다.그러면 / dev / fb0 을 open 으로 열 고 lseek 로 읽 고 쓸 위 치 를 정 하고 마지막 으로 read 나 write 를 호출 합 니 다.이렇게 큰 단락 의 조작 을 통 해 우 리 는 한 점 에 대한 읽 거나 쓰 기 를 완성 했다.이런 방법 은 비용 이 너무 많이 든다.프로그램 프로 세 스 의 메모리 공간 에 / dev / fb0 을 매 핑 한 다음 에 이 저장 공간 을 가리 키 는 지침 을 얻 으 면 편리 하 게 읽 고 쓸 수 있 습 니 다.그러나 우 리 는 얼마나 비 출 수 있 는 지, 얼마나 비 출 수 있 는 지 알 아야 한다. 이것 은 위의 프로그램 에서 얻 은 매개 변 수 를 편리 하 게 결정 할 수 있다.
다음은 프로그램 코드 입 니 다.
코드:

    
    
    
    
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h> int main () { int fp=0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long screensize=0; char *fbp = 0; int x = 0, y = 0; long location = 0; fp = open ("/dev/fb0",O_RDWR); if (fp < 0){ printf("Error : Can not open framebuffer device/n"); exit(1); } if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){ printf("Error reading fixed information/n"); exit(2); } if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){ printf("Error reading variable information/n"); exit(3); } screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; /* fp screensize , */ fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0); if ((int) fbp == -1) { printf ("Error: failed to map framebuffer device to memory./n"); exit (4); } /* ,(0,0) */ x = 100; y = 100; location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length; *(fbp + location) = 100; /* */ /* */ *(fbp + location + 1) = 15; /* */ *(fbp + location + 2) = 200; /* */ *(fbp + location + 3) = 0; /* */ munmap (fbp, screensize); /* */ close (fp); /* */ return 0; }

이것 은 선형 저장 공간 에 대한 읽 기와 쓰기 이기 때문에 코드 가 약간 명확 하지 않 고 이해 하기 어렵다.그러나 이 기본 적 인 코드 가 실현 되면 우 리 는 DrawPoint 와 같은 함 수 를 쉽게 써 서 저층 의 선형 저장 공간 에 대한 읽 기와 쓰 기 를 포장 할 수 있다.그러나 점 을 그 리 는 프로그램 이 생 겨 서 선 을 그리고 원 을 그 리 는 함 수 를 쓰 는 것 은 그리 어렵 지 않다.
이것들 은 바로 제 가 FrameBuffer 에 대한 초보적인 연구 입 니 다. 급 하 게 글 을 쓰 는 것 이 문장 이 되 지 않 고 앞으로 좀 더 고 급 스 러 운 함수 의 실현 을 써 야 합 니 다.
 

좋은 웹페이지 즐겨찾기