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.