it-swarm-korea.com

리눅스 GUI는 어떻게 가장 낮은 수준에서 작동합니까?

나는 기본적으로 리눅스 커널과 C로 프로그래밍하는 것만으로 GUI를 절대 처음부터 만드는 방법을 알아 내려고 노력하고 있습니다.

GUI 데스크탑 환경을 처음부터 작성하지는 않지만 일부 데스크탑 애플리케이션을 작성하고 지식을 검색 할 때 찾은 모든 정보는 GUI API 및 툴킷에 있습니다. 최소한 리눅스 GUI의 기본 원리를 이해하고 API 또는 툴킷을 사용하지 않고 GUI 환경 또는 GUI 응용 프로그램을 만드는 방법에 대해 알고 싶습니다.

예를 들어 궁금합니다.

  1. 기존 API 및 툴킷은 커널에 대한 시스템 호출을 통해 작동합니다 (그리고 커널은 GUI 이미지를 픽셀 등으로 구성하는 가장 낮은 수준의 책임입니다)

  2. 이 툴킷은 단순히 정보를 화면 드라이버로 전달하는 syscall을 수행합니다 (모든 화면 드라이버가 준수하거나 GUI API가 특정 화면/드라이버에 따라이 정보를 여러 형식으로 출력 할 수 있어야하는이 정보를 보내기위한 표준 형식이 있습니까? ) 그리고 이것이 대략 사실이라면, 원시 리눅스 커널은 보통 8 비트 문자 형태로 정보를 화면에 보내는가?

나는 리눅스 커널 사이에서 일어나는 일과 내 화면에 나타나는 것을 이해하고 싶다. (알고 있다면 소프트웨어와 하드웨어를 통해 제어/정보 흐름, 정보의 형식 등) 나는 자세한 설명을 대단히 감사하게 생각하며, 이것이 충분히 자세하게 설명하는 데 도움이 될 수 있음을 이해하지만 호기심이 많고 배우는 다른 사람들에게는 그러한 설명이 큰 도움이 될 것이라고 생각합니다. 맥락에서 나는 최근 시스템 프로그래밍 과정을 위해 C로 프로그래밍을 시작한 3 학년 compsci 학생이며 리눅스와 프로그래밍에 대한 중급 (또는 설명 할 것입니다)이 있습니다. 다시 나를 도와주는 사람에게 다시 감사합니다 !!!

46
poopoopeepee123

작동 방식 (Gnu/Linux + X11)

개요

다음과 같이 보입니다 (확대 할 수 없음)

┌───────────────────────────────────────────────┐
│                       User                    │
│     ┌─────────────────────────────────────────┤
│     │             Application                 │
│     │            ┌──────────┬─────┬─────┬─────┤
│     │            │      ... │ SDL │ GTK │ QT  │
│     │            ├──────────┴─────┴─────┴─────┤
│     │            │            xLib            │
│     │            ├────────────────────────────┤
├─────┴───┬────────┴──┐         X11             │
│   Gnu   │ Libraries │        Server           │
│   Tools │           │                         │
├─────────┘           │                         │ 
├─────────────────────┤                         │
│   Linux (kernel)    │                         │
├─────────────────────┴─────────────────────────┤
│                    Hardware                   │
└───────────────────────────────────────────────┘

다이어그램에서 X11이 주로 하드웨어와 통신한다는 것을 알 수 있습니다. 그러나 처음에이 하드웨어에 액세스하려면 커널을 통해 대화해야합니다.

나는 세부 사항에 약간 흐릿하다 (그리고 마지막으로 살펴본 후에 변경되었다고 생각한다). 기기가 있습니다 /dev/mem 그것은 대부분의 그래픽 하드웨어가 메모리 매핑되어 있기 때문에 전체 메모리에 액세스 할 수있게합니다 (물리적 메모리라고 생각합니다).이 파일 (모든 것이 파일 임)을 사용하여 액세스 할 수 있습니다. X11은 파일을 열고 (커널은 파일 권한을 사용하여이 작업을 수행 할 수 있는지 확인) mmap를 사용하여 파일을 가상 메모리에 매핑합니다 (메모리처럼 보이게 함). 이제 메모리는 메모리처럼 보입니다. mmap 이후에는 커널이 관여하지 않습니다.

X11은 메모리를 통해 직접 액세스 할 때 다양한 그래픽 하드웨어에 대해 알아야합니다.

(이것은 변경 사항, 특히 보안 모델이 더 이상 메모리의 [~ # ~] all [~ # ~] 에 액세스하지 못하게 할 수 있습니다. )

리눅스

맨 아래에는 시스템의 작은 부분 인 Linux (커널)가 있습니다. 하드웨어에 대한 액세스를 제공하고 보안을 구현합니다.

암소 비슷한 일종의 영양

그런 다음 Gnu (라이브러리; bash; 도구 : ls 등; C 컴파일러 등). 대부분의 운영 체제.

X11 서버 (예 : x.org)

그런 다음 기본 GUI 하위 시스템 인 X11 (또는 Wayland 또는 ...). 이것은 커널 외부의 사용자 영역에서 실행됩니다. 일부 권한이있는 다른 프로세스 일뿐입니다. 하드웨어에 대한 액세스 권한을 부여하는 것을 제외하고 커널은 관여하지 않습니다. 다른 프로세스가 X11 서버와 통신 할 수 있도록 프로세스 간 통신을 제공합니다.

X11 라이브러리

X11 용 코드를 작성할 수있는 간단한 추상화입니다.

GUI 라이브러리

Qt, gtk, sdl과 같은 라이브러리는 다음에 있습니다. X11을보다 쉽게 ​​사용하고 wayland, Microsoft의 Windows 또는 MacOS와 같은 다른 시스템에서 작업 할 수 있습니다.

응용

응용 프로그램은 라이브러리 위에 있습니다.

프로그래밍을위한 일부 저급 진입 점

xlib

Xlib를 사용하면 X11에 대해 배울 수 있습니다. 그러나 X11에 대해 먼저 읽으십시오.

SDL

SDL은 낮은 수준의 액세스를 제공하며 비트 플레인으로 직접 연결하여 직접 그릴 수 있습니다.

더 낮아짐

낮추고 싶다면 현재의 좋은 옵션이 무엇인지 잘 모르겠지만 여기 몇 가지 아이디어가 있습니다.

연결

X11

https://en.wikipedia.org/wiki/X_Window_System

현대적인 방법

이 글을 쓰면서 관심을 갖게되었으므로 현대적인 빠른 방법이 무엇인지 살펴 보았습니다. 다음은 몇 가지 링크입니다.

https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/

62
ctrl-alt-delor

ctrl-alt-delor의 답변은 일반적인 아키텍처에 대한 좋은 개요를 제공합니다. 좀 더 실제적인 접근 방식을 위해 "Linux 커널과 C의 프로그래밍 외에는 아무것도 없다"는 대답을 드리겠습니다.

나는 매번 프레임 버퍼에 직접 쓰는 것을 좋아합니다. 프레임 버퍼 장치 드라이버는 지루한 하드웨어에 가까운 모든 "어떻게하면 화면에 나타나는지"모든 작업을 수행합니다. 루트 셸을 사용하여 즉시 그렇게 할 수 있습니다.

echo -n -e '\x00\x00\xFF' > /dev/fb0

32 비트 프레임 버퍼에서 첫 번째 (왼쪽 상단) 픽셀을 빨간색으로 설정합니다.

Screenshot of the framebuffer with the top left pixel red

/ dev/fb0을 열고 바이트를 작성하여 C 내에서 완전히 수행 할 수 있습니다. 메모리 매핑은 친구가 될 수 있습니다. 이것은 X 서버가 없거나 가상 콘솔에서만 작동합니다. Ctrl + Alt + F1을 눌러 액세스하십시오.

추신 : 마우스 움직임과 같은 임의의 데이터를 시각화하는 것도 재미있을 수 있습니다.

cat /dev/input/mouse0 > /dev/fb0

PPS : 거의 모든 실제 데스크톱 응용 프로그램은 그리기, 3D 및 비디오 렌더링을위한 하드웨어 가속과 같은 멋진 기능을 위해 하드웨어에 더 직접 액세스하기를 원합니다. 간단한 프레임 버퍼 장치는이 작업을 수행하지 않습니다.

30
Hermann

ncurses 로 시작하는 것이 좋습니다.

보다 복잡한 그래픽 시스템과 달리 텍스트는 순수하게 텍스트를 기반으로하기 때문에 화면 드라이버 및 그래픽 라이브러리의 세부 사항에 얽매일 필요가 없습니다. 그러나 창을 화면에 배치하고 창간에 포커스를 이동하는 등의 기본 원칙은 여전히 ​​유효합니다. 그리고 단일 문자 블록과 ASCII art) 수준에서 여전히 일부 그림을 그릴 수 있습니다.

물론 여전히 라이브러리 위에 이것을 구축하고 있지만 쉽게 이해할 수있는 라이브러리입니다. 그리고 그 이상으로, 소스 코드를 자유롭게 사용할 수 있고, 문서화가 잘되어 있으며, 읽고 싶을 때 뚫을 수없는 라이브러리입니다. 원하는 경우 직접 수정할 수도 있습니다. 또는 API가 필요한 것을 찾기 위해 모든 라이브러리 함수를 살펴보고 해당 디자인을 기반으로 처음부터 직접 작성할 수 있습니다.

6
Graham

SunOS 5에는 다른 cg [3,6,14], TCX 또는 LEO 그래픽 어댑터에 대한 장치 독립적 액세스를 제공하는 DGA 라이브러리가있었습니다. 또한 SPARC 기계.

cg6은 8 비트로 보통 X11에서 의사 색 비주얼로 사용되지만 tcx와 leo는 24 비트 가속 3D 디스플레이 프레임 버퍼 인 반면 (pseudocolor = videoram의 바이트는 큰 인덱스입니다) 3x8 RGB 값을 제공하는 표는 표의 내용을 쉽게 변경할 수 있습니다.) cg3의 기능은 거의 같지만 가속되지 않았습니다 (cg6 디자이너는 나중에 다른 회사 인 nVidia를 시작했습니다).

ATI Rage Pro 칩셋을 기반으로 한 PGX와 같은 최신 장치는 이전 장치와 동시에 트루 컬러와 의사 색을 지원할 수 없었습니다. 이로 인해 사용자는 의사 색 모델 용으로 작성된 이전 응용 프로그램 중에서 선택하거나 가능한 경우 sw를 업그레이드하고 트루 컬러 지향 응용 프로그램 만 실행해야했습니다.

Pseudocolor는 기본적으로 존재했습니다. 비디오 램이 80 년대 중반 1992 년까지 엄청나게 비 쌌기 때문입니다. 사용 가능한 워크 스테이션 유형 해상도를 지원하는 컬러 디스플레이도 다소 비쌉니다 (1984 Sun 2 흑백 해상도는 1152x864, 1989 년 정도 MG1은 1600x1280이지만 흑백이었습니다).

X11이 지원 해야하는 다른 요구 사항을 보여주고 싶기 때문에 이것을 작성합니다.

2
Stefan Skoglund