GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara kerja GUI linux pada level terendah?

Cara kerjanya (Gnu/Linux + X11)

Ikhtisar

Tampilannya seperti ini (tidak digambar sesuai skala)

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

Kami melihat dari diagram bahwa X11 kebanyakan berbicara dengan perangkat keras. Namun perlu berbicara melalui kernel, untuk awalnya mendapatkan akses ke perangkat keras ini.

Saya agak kabur tentang detailnya (dan saya pikir itu berubah sejak terakhir kali saya melihatnya). Ada perangkat /dev/mem yang memberikan akses ke seluruh memori (menurut saya memori fisik), karena sebagian besar perangkat keras grafis dipetakan memori, file ini (lihat semuanya adalah file) dapat digunakan untuk mengaksesnya. X11 akan membuka file (kernel menggunakan izin file untuk melihat apakah dapat melakukan ini), lalu X11 menggunakan mmap untuk memetakan file ke dalam memori virtual (membuatnya terlihat seperti memori), sekarang memori terlihat seperti memori. Setelah mmap , kernel tidak terlibat.

X11 perlu mengetahui tentang berbagai perangkat keras grafis, karena mengaksesnya secara langsung, melalui memori.

(ini mungkin memiliki perubahan, khususnya model keamanan, mungkin tidak lagi memberikan akses ke SEMUA dari memori.)

Linux

Di bagian bawah adalah Linux (kernel):bagian kecil dari sistem. Ini memberikan akses ke perangkat keras, dan mengimplementasikan keamanan.

Gnu

Kemudian Gnu (Perpustakaan; bash; alat:ls, dll; kompiler C, dll). Sebagian besar sistem operasi.

Server X11 (misalnya x.org)

Kemudian X11 (Atau Wayland, atau ...), subsistem GUI dasar. Ini berjalan di lahan pengguna (di luar kernel):ini hanyalah proses lain, dengan beberapa hak istimewa. Kernel tidak terlibat, kecuali memberikan akses ke perangkat keras. Dan menyediakan komunikasi antar proses, sehingga proses lain dapat berbicara dengan server X11.

Perpustakaan X11

Abstraksi sederhana untuk memungkinkan Anda menulis kode untuk X11.

Perpustakaan GUI

Pustaka seperti qt, gtk, sdl, berikutnya — pustaka ini mempermudah penggunaan X11, dan bekerja di sistem lain seperti wayland, Microsoft Windows, atau MacOS.

Aplikasi

Aplikasi duduk di atas perpustakaan.

Beberapa titik masuk tingkat rendah, untuk pemrograman

xlib

Menggunakan xlib, adalah cara yang baik untuk belajar tentang X11. Namun, baca dulu tentang X11.

SDL

SDL akan memberi Anda akses tingkat rendah, langsung ke bidang bit agar Anda dapat langsung menggambar.

Menurun lebih rendah

Jika Anda ingin lebih rendah, maka saya tidak yakin opsi apa yang bagus saat ini, tetapi berikut adalah beberapa ide.

  • Dapatkan Amiga lama, atau simulator. Dan beberapa dokumentasi yang bagus. misalnya https://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (Saya punya 2 buku, yang ini dan yang serupa).
  • Lihat apa yang bisa dilakukan pada raspberry pi. Saya belum menyelidiki ini.

Tautan

X11

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

Cara modern

Menulis ini menarik minat saya, jadi saya melihat apa cara cepat modern untuk melakukannya. Berikut ini beberapa tautan:

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


jawaban ctrl-alt-delor memberi Anda gambaran umum yang bagus tentang arsitektur umum. Untuk pendekatan yang lebih praktis, saya memberi Anda jawaban tentang "tidak lain adalah kernel linux dan pemrograman dalam C".

Saya suka menulis ke frame-buffer secara langsung sesekali. Frame-buffer device driver akan melakukan semua hal yang membosankan dekat-ke-perangkat keras "bagaimana ini pada akhirnya akan berakhir di layar" untuk Anda. Anda dapat langsung melakukannya dengan shell root:

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

Ini menyetel piksel pertama (kiri atas) menjadi merah pada framebuffer 32 bit saya:

Anda benar-benar dapat melakukannya dari dalam C dengan membuka /dev/fb0 dan menulis byte. Pemetaan memori bisa menjadi teman Anda. Ini hanya berfungsi tanpa server X atau di konsol virtual. Tekan Ctrl+Alt+F1 untuk mengaksesnya.

PS:Memvisualisasikan data acak seperti gerakan mouse Anda juga bisa menyenangkan:

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

PPS:Harap perhatikan juga bahwa hampir semua aplikasi desktop dunia nyata menginginkan lebih banyak akses langsung ke perangkat keras untuk beberapa hal mewah seperti akselerasi perangkat keras untuk menggambar, 3D, dan rendering video. Perangkat buffer bingkai sederhana tidak akan melakukan semua ini dengan baik.


Saya sangat menyarankan untuk memulai dengan ncurses.

Tidak seperti sistem grafis yang lebih kompleks, ini murni berdasarkan teks, jadi tidak perlu terpaku pada detail driver layar dan pustaka grafis. Namun prinsip dasar meletakkan jendela di layar, memindahkan fokus antar jendela, dan seterusnya, masih berlaku. Dan Anda masih dapat menggambar, pada level blok karakter tunggal dan seni ASCII.

Tentu saja Anda masih membuat ini di atas perpustakaan, tetapi ini adalah perpustakaan yang dapat Anda pahami dengan mudah. Dan lebih dari itu, ini adalah perpustakaan tempat kode sumber tersedia secara bebas, didokumentasikan dengan cukup baik, dan tidak terlalu sulit ditembus jika Anda ingin membacanya. Anda bahkan dapat memodifikasinya sendiri jika Anda mau. Atau Anda dapat melihat semua fungsi pustaka di sana untuk menemukan seperti apa API itu, dan menulisnya sendiri dari awal berdasarkan desain tersebut.


Linux
  1. Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

  2. Bagaimana cara mengidentifikasi distro linux yang digunakan?

  3. Bagaimana cara kerja debugger di Linux?

  1. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  2. Bagaimana cara kerja alokasi tumpukan di Linux?

  3. Bagaimana cara kerja antarmuka loopback

  1. Bagaimana Cara Kerja Sticky Bit?

  2. Linux – Bagaimana Cara Memeriksa Informasi Struktur Direktori File Unix/linux?

  3. Bagaimana Perintah Keluar Bekerja Pada Terminal Unix?