/dev/fb0
Linux에서 제공하는 다른 파일을 사용하고 싶습니다 .
이는 GUI 프레임 버퍼 기반 장치 파일을 시스템별 방식으로 가능한 한 낮게 읽고/쓰고/해석합니다.
키보드 이벤트에 액세스하는 것과 같은 낮은 수준의 재미를 위해 이 작업을 수행하고 싶습니다.
답변1
프레임버퍼 장치의 파일 디스크립터를 열고 ioctl()
, FBIOGET_FSCREENINFO
및 를 사용합니다 FBIOGET_VSCREENINFO
. 반환된 구조에서 X 해상도, Y 해상도, 단계 크기 및 픽셀당 비트 수를 직접 확인할 수 있습니다.
프레임 버퍼가 커널의 내장 터미널 에뮬레이터와 공유되고 커널 가상 터미널을 표시하는 데 사용되는 경우 해당 하위 시스템과 액세스를 협상해야 하며 프로그램이 이 작업을 수행하고 KVT를 협상하는 동안 프레임 버퍼에 문자를 그리지 말라고 지시해야 합니다. 다른 프로세스로 전환합니다.
픽셀을 그리는 것은 픽셀 주소, 원하는 색상 및 위의 값을 사용하여 계산을 수행하고 바이트 오프셋과 쓸 바이트 값을 가져오는 문제입니다. 이는 시스템 호출을 통해 수행될 수 있지만 pwrite()
프레임 버퍼 장치를 프로세스의 주소 공간에 메모리 매핑하고 메모리 매핑된 영역을 간단히 찌르면 더 효율적으로 수행될 수 있습니다.
이를 기반으로 구축하는 방법에 대한 전체 책이 있습니다.
ioctl()
사용 중인 그래픽 모드에서 사전 제공된 프레임 버퍼를 사용하지 않고 대신 모드 설정을 사용하여 하나 이상의 프레임 버퍼를 동적으로 생성하면 상황이 더 복잡해집니다.
추가 읽기
- https://unix.stackexchange.com/a/178807/5132
- 프레임 버퍼를 사용한 커널 모드 설정?
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.cpp
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.h
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.h#L34
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.cpp#L12
답변2
fb0에서 마우스/키보드 입력을 받는 것이 가능한지 확실하지 않습니다. 그래도 재미있습니다. 그리고 Unix 세계에서 일이 어떻게 작동하는지에 대해 많은 것을 배우게 될 것입니다.
먼저 open 시스템 호출을 사용하여 파일 설명자를 연 다음 ioctl을 사용하여 필수 매개변수를 설정합니다. 그런 다음 기본적으로 fb를 일반 파일로 읽고 씁니다.
매핑 파일을 살펴보고 싶을 수도 있지만 배열로 액세스할 수도 있습니다!
ioctl이 수행하는 작업은 매뉴얼 페이지에서 확인하거나 /usr/include에 있는 파일을 읽어보면 알 수 있습니다.
키보드와 마우스 입력을 읽으려면 개발 파일 시스템에 있는 입력 장치를 사용해야 합니다.
이 모든 것이 이상하게 보일 수도 있지만 입력 시스템은 매우 강력합니다.
즐거운 해킹되세요!
답변3
물론 Linux 장치를 읽고, 쓰고, 해석하는 방법에 대한 많은 문서와 기사가 있습니다. 예를 들어 프레임 버퍼의 경우 콘솔의 명령을 사용하여 콘솔 cat
에서 데이터를 작성하여 물을 테스트할 수도 있습니다.tty
# cat /dev/urandom >/dev/fb0
읽다이것예를 들어 작동 방식을 이해하고 다음을 사용하십시오.C/C++ 언어또는 뭔가를 더 복잡하게 만드는 것.