작동 방식(Gnu/Linux + X11)

작동 방식(Gnu/Linux + X11)

저는 기본적으로 Linux 커널과 C 프로그래밍만 사용하여 처음부터 GUI를 만드는 방법을 알아내려고 노력하고 있습니다.

GUI 데스크탑 환경을 처음부터 만들고 싶지는 않지만 일부 데스크탑 애플리케이션을 만들고 싶은데, 지식 검색에서 찾을 수 있는 모든 정보는 GUI API 및 툴킷에 관한 것입니다. 최소한 Linux GUI를 만드는 방법에 대한 기본적인 이해부터 API나 툴킷을 사용하지 않고 GUI 환경이나 GUI 응용 프로그램을 만드는 방법을 알고 싶습니다.

예를 들면 다음과 같습니다.

  1. 기존 API 및 툴킷은 커널에 대한 시스템 호출을 통해 작동합니다(커널은 가장 낮은 수준에서 픽셀 단위 등의 GUI 이미지 구축을 담당합니다).

  2. 이러한 툴킷에 의해 수행되는 시스템 호출은 단순히 정보를 화면 드라이버에 전달합니다(모든 화면 드라이버가 준수하는 이 정보를 보내기 위한 표준 형식이 있습니까, 아니면 GUI API가 특정 화면에 따라 여러 형식으로 출력할 수 있어야 합니까) /driver 이 정보는 무엇입니까?) 대략적으로 이것이 맞다면 원래 Linux 커널은 일반적으로 8비트 문자 형식으로만 정보를 화면에 전송합니까?

저는 단지 Linux 커널 사이에서 무슨 일이 일어나는지, 화면에 보이는 것(아신다면 소프트웨어와 하드웨어를 통한 제어/정보의 흐름, 정보의 형식 등)을 이해하고 싶습니다. 세세한 설명 정말 감사하고, 자세하게 설명하기 어려울 수도 있다는 걸 알지만, 이런 설명이 궁금하고 배우고 있는 다른 분들에게는 좋은 자료가 될 것 같아요. 맥락을 말하자면, 저는 최근 시스템 프로그래밍 과정에서 C 프로그래밍을 시작한 컴퓨터 과학 3학년 학생입니다. 그리고 Linux와 프로그래밍에 대해 어느 정도 지식을 갖고 있습니다(또는 그렇게 설명하겠습니다). 저를 도와주신 모든 분들께 다시 한 번 감사드립니다!

답변1

작동 방식(Gnu/Linux + X11)

개요

이렇습니다(크기에 맞게 그려지지 않음).

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

그림에서 우리는 X11이 주로 하드웨어와 통신하는 것을 볼 수 있습니다. 그러나 처음에 하드웨어에 액세스하려면 커널을 통한 통신이 필요합니다.

세부 사항에 대해 조금 모호합니다(마지막으로 조사한 이후 변경된 것 같습니다). 전체 메모리(물리적 메모리)에 액세스할 수 있는 장치가 있으며 /dev/mem대부분의 그래픽 하드웨어는 메모리 매핑되어 있으므로 파일을 사용하여 액세스할 수 있습니다(모든 것이 파일임 참조). X11은 파일을 연 다음(커널은 파일 권한을 사용하여 이를 수행할 수 있는지 확인) X11을 사용하여 mmap파일을 가상 메모리에 매핑하고(메모리처럼 보이게 함) 이제 메모리가 메모리처럼 보입니다. 그 후에 mmap는 커널이 더 이상 관련되지 않습니다.

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

(이는 변경될 수 있습니다. 특히 보안 모델에 따라 더 이상 액세스가 허용되지 않을 수 있습니다.모두메모리. )

리눅스

가장 낮은 수준은 Linux(커널)로 시스템의 작은 부분입니다. 하드웨어에 대한 액세스를 제공하고 보안을 구현합니다.

게누

그 다음에는 Gnu(라이브러리, bash, 도구: ls 등, C 컴파일러 등)가 있습니다. 대부분의 운영 체제.

X11 서버(예:xorg)

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

X11 라이브러리

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

그래픽 사용자 인터페이스 라이브러리

다음은 qt, gtk, sdl과 같은 라이브러리입니다. X11 작업을 더 쉽게 만들고 wayland, Microsoft Windows 또는 MacOS와 같은 다른 시스템에서도 작동합니다.

적용분야

애플리케이션은 라이브러리 상단에 위치합니다.

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

확장 라이브러리

xlib를 사용하는 것은 X11에 대해 배우는 좋은 방법입니다. 하지만 먼저 X11에 대해 조금 읽어보시기 바랍니다.

삼나무

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/

답변2

ctrl-alt-delor의 답변은 전체 아키텍처에 대한 좋은 개요를 제공합니다. 좀 더 실용적인 접근을 위해 "리눅스 커널과 C 프로그래밍 외에"에 대한 답변을 드리겠습니다.

나는 때때로 프레임 버퍼에 직접 쓰는 것을 좋아합니다. 프레임 버퍼 장치 드라이버는 하드웨어에 가까운 지루한 "이것이 어떻게 화면에 표시될 것인가" 작업을 모두 수행합니다. 이제 루트 셸을 사용하여 이 작업을 수행할 수 있습니다.

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

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

왼쪽 상단에 빨간색 픽셀이 있는 프레임 버퍼의 스크린샷

/dev/fb0을 열고 바이트를 쓰면 C 내에서 이 작업을 완전히 수행할 수 있습니다. 메모리 매핑은 당신의 친구가 될 수 있습니다. 이는 X 서버나 가상 콘솔 없이만 작동합니다. 액세스하려면 Ctrl+Alt+F1을 누르세요.

추신: 무작위 데이터(예: 마우스 움직임)를 시각화하는 것도 재미있습니다.

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

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

답변3

에서 시작하는 것을 강력히 권장합니다.저주.

더 복잡한 그래픽 시스템과 달리 이는 순전히 텍스트 기반이므로 화면 드라이버 및 그래픽 라이브러리의 세부 사항에 얽매일 필요가 없습니다. 그러나 화면에 창을 배치하고 창 간에 초점을 이동하는 기본 원칙은 여전히 ​​적용됩니다. 단일 문자 블록 및 ASCII 아트 수준에서 일부 그림을 계속 그릴 수 있습니다.

물론 아직은 도서관 위에 짓고 있지만, 쉽게 이해할 수 있는 도서관이다. 게다가 무료 소스 코드가 포함된 라이브러리이고, 문서화도 잘 되어 있어서 읽고 싶을 때 크게 헷갈리지도 않습니다. 원한다면 직접 수정할 수도 있습니다. 또는 필요한 API를 찾기 위해 모든 라이브러리 함수를 살펴본 다음 해당 디자인을 기반으로 처음부터 직접 작성할 수도 있습니다.

답변4

SunOS 5에는 SPARC 시스템에서 DOOM을 지원하는 다양한 cg[3,6,14], TCX 또는 LEO 그래픽 어댑터에 대한 장치 독립적인 액세스를 제공하는 DGA 라이브러리가 있습니다.

cg6은 8비트이고 의사 색상 시각적 개체를 위해 X11에서 일반적으로 사용되지만 8비트 트루 컬러도 제공할 수 있는 반면 tcx 및 leo는 24비트 가속 3D 디스플레이 프레임 버퍼입니다(의사 색상 = videoram의 1바이트는 a 대형 인덱스) 테이블은 3x8 RGB 값을 제공하며 테이블의 내용을 쉽게 변경할 수 있습니다. ) cg3는 거의 동일한 기능을 가지고 있었지만 속도 향상은 없었습니다. (cg6 디자이너는 이후에 nVidia라는 다른 회사를 설립했습니다.)

ATI Rage Pro 칩셋 기반 PGX와 같은 최신 장치는 트루 컬러와 가색을 모두 지원할 수 없지만 이전 장치는 지원합니다. 이로 인해 사용자는 의사 색상 모델용으로 작성된 레거시 응용 프로그램(또는 가능하면 소프트웨어 업그레이드)과 트루컬러 지향 응용 프로그램만 실행 중에서 선택해야 합니다.

가색상이 존재한 이유는 1980년대 중반부터 1992년경까지 비디오 가격이 매우 비쌌기 때문입니다. 사용 가능한 워크스테이션 유형 해상도를 지원하는 컬러 모니터도 상당히 비쌉니다(1984년의 Sun 2는 흑백에서 1152x864의 해상도를 가졌으나 1989년경의 MG1은 1600x1280의 해상도를 가졌으나 흑백이었습니다.)

나는 X11이 지원해야 하는 다양한 요구 사항을 보여주고 싶었기 때문에 이 기사를 썼습니다.

관련 정보