FrameBuffer 에 대한 하룻밤 hack
코드:
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 에 대한 초보적인 연구 입 니 다. 급 하 게 글 을 쓰 는 것 이 문장 이 되 지 않 고 앞으로 좀 더 고 급 스 러 운 함수 의 실현 을 써 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.