Apa yang sebenarnya terjadi pada perangkat keras PC modern yang di-boot dalam mode MBR BIOS warisan 16-bit ketika Anda menyimpan byte seperti '1'
(0x31) ke dalam teks VGA (mode 03) framebuffer pada alamat linear fisik B8000
? Seberapa lambat mov [es:di], eax
toko dengan MTRR untuk wilayah itu disetel ke UC? ( Pengujian eksperimental pada satu laptop Kaby Lake iGPU menunjukkan bahwa clflushopt pada WC kira-kira sama kecepatannya dengan UC untuk memori VGA. Tetapi tanpa clflushopt, mov
toko ke memori WC tidak pernah meninggalkan CPU dan tidak memperbarui layar sama sekali, berjalan sangat cepat .)
Jika itu bukan SMI untuk setiap toko, apakah ada cara untuk memperkirakan biaya ini pada sepotong memori WB di ruang pengguna, untuk percobaan kinerja tanpa benar-benar me-reboot ke mode nyata? (misalnya menggunakan halaman BSS sebagai framebuffer pura-pura yang tidak benar-benar ditampilkan di mana pun).
Mesin terbang font yang sesuai muncul di layar di refresh berikutnya, tetapi apakah pemindaian perangkat keras benar-benar membaca bahwa ASCII char dari VRAM (atau DRAM untuk iGPU) dan memetakan ke bitmap mesin terbang font dengan cepat? Atau ada beberapa intersepsi perangkat lunak di setiap toko atau sekali per vblank sehingga perangkat keras yang sebenarnya hanya perlu menangani framebuffer yang dipetakan?
Boot BIOS lama dikenal menggunakan System Management Mode (SMM) untuk meniru USB kbd / mouse sebagai perangkat PS / 2. Saya bertanya-tanya apakah itu juga digunakan untuk framebuffer mode teks VGA. Saya menganggap itu adalah digunakan untuk VGA port I / O untuk mode-setting tapi itu masuk akal bahwa framebuffer teks dapat didukung oleh perangkat keras. Namun, sebagian besar komputer menghabiskan seluruh waktu mereka dalam mode grafis sehingga meninggalkan dukungan HW untuk mode teks sepertinya sesuatu yang mungkin ingin dilakukan vendor. (OTOH blog ini menunjukkan bahwa pengontrol VGA homebrew Verilog dapat mengimplementasikan mode teks dengan cukup sederhana.)
Saya secara khusus tertarik pada sistem yang menggunakan iGPU di Intel Skylake, tetapi akan tertarik pada iGPU awal / nanti dari Intel dan AMD, dan GPU diskrit baru atau lama.
(Termasuk vendor selain AMD dan NVidia; ada beberapa motherboard Skylake dengan slot PCI, bukan PCIe. Jika driver firmware GPU modern meniru mode teks, mungkin ada beberapa kartu video PCI lama dengan hardware VGA mode teks. Dan mungkin kartu semacam itu dapat membuat toko hanya menjadi transaksi PCI dan bukan SMI.)
Desktop saya sendiri adalah i7-6700k di mobo Asus Z170 Pro Gaming, tidak ada kartu tambahan hanya iGPU dengan monitor 1920x1200 pada output DVI-D. Saya tidak tahu detail sistem Kaby Lake i5-7300HQ yang sedang diuji pada @Eldan, hanya model CPU.
Saya menemukan paten Phoenix BIOS US20120159520 dari 2011 ,
Mengemulasi video lawas menggunakan uefi . Alih-alih meminta vendor perangkat keras video untuk memasok driver opsi-mode UEFI asli dan 16-bit asli, mereka mengusulkan driver VGA mode-nyata ( int 10h
fungsi dan sebagainya) yang memanggil driver video UEFI yang disediakan vendor melalui kait SMM.
Abstrak
[...] ROM opsi video umum memberi tahu driver SMM video generik tentang permintaan layanan video. Pemberitahuan tersebut dapat dilakukan menggunakan interupsi manajemen sistem perangkat lunak (SMI). Setelah pemberitahuan, driver SMM video generik memberi tahu driver video UEFI pihak ketiga tentang permintaan layanan video. Driver video pihak ketiga menyediakan layanan video yang diminta ke sistem operasi. Dengan cara ini, driver grafis UEFI pihak ketiga dapat mendukung berbagai sistem operasi, bahkan yang tidak mendukung protokol tampilan UEFI.
Sebagian besar deskripsi mencakup penanganan int 10h
panggilan dan hal-hal seperti yang sudah jelas menjebak melalui IVT, sehingga dapat dengan mudah menjalankan kode khusus yang memicu SMI sengaja. Bagian yang relevan adalah apa yang mereka gambarkan untuk penyimpanan langsung ke framebuffer mode-teks yang perlu bekerja bahkan untuk kode yang tidak memicu gangguan perangkat lunak atau perangkat keras apa pun. (Selain HW memicu SMI di toko-toko tersebut, yang mereka katakan dapat mereka gunakan jika didukung.)
Dukungan Penyangga Teks
[0066] Dalam perwujudan tertentu, aplikasi dapat memanipulasi buffer teks VGA secara langsung . Dalam perwujudan seperti itu, driver SMM video generik 130 mendukung ini dalam salah satu dari dua cara, tergantung pada apakah perangkat keras tersebut menyediakan perangkap SMI pada akses baca / tulis ke wilayah memori 740 KB-768 KB (tempat buffer teks berada).
[0067] Ketika penjebak SMI tersedia, perangkat keras menghasilkan SMI pada setiap akses baca atau tulis. Menggunakan alamat jebakan dari perangkap SMI, kolom dan baris teks yang tepat dapat dihitung dan baris serta kolom yang sesuai di layar teks virtual diakses.
Secara bergantian, memori normal diaktifkan untuk wilayah ini dan, menggunakan SMI berkala, driver SMM video umum 130 memindai perubahan buffer teks perangkat keras yang diemulasi dan memperbarui layar teks virtual terkait yang dipelihara oleh driver video. Dalam kedua kasus, ketika perubahan terdeteksi, karakter digambar ulang di layar teks virtual.
Ini hanya satu paten vendor BIOS, dan tidak memberi tahu kami ke arah mana sebagian besar perangkat keras bekerja, atau jika vendor lain melakukan hal yang berbeda. Itu pada dasarnya mengkonfirmasi bahwa ada beberapa perangkat keras yang dapat menjebak di toko dalam kisaran itu, meskipun. (Kecuali kalau itu hanya kemungkinan hipotetis yang mereka putuskan untuk dicakup dalam paten mereka.)
Untuk kasus penggunaan yang ada dalam pikiran saya, menjebak hanya pada refresh layar akan jauh lebih cepat daripada menjebak di setiap toko jadi saya ingin tahu perangkat keras / firmware mana yang bekerja dengan cara itu.
Motivasi untuk pertanyaan ini
Mengoptimalkan penghitung desimal ASCII yang bertambah dalam RAM video pada gen ke-7 Intel Core - berulang kali menyimpan digit baru untuk penghitung teks ASCII ke dalam beberapa byte RAM video yang sama.
Saya menguji versi kode dalam ruang pengguna 32-bit di Linux, pada memori WB, berharap untuk memperkirakan situasi dengan movnti
dan berbagai cara untuk mendapatkan CPU untuk menyinkronkan buffer WC ke video RAM setelah setiap toko (atau mungkin kadang-kadang dalam pengatur waktu). Tapi ini tidak realistis jika situasi bootloader real-mode tidak hanya menyimpan ke DRAM, tetapi malah memicu SMI.
Pada memori WB, flushing movnti
store dengan a lock xor byte [esp], 0
agak lebih cepat daripada flushing with clflushopt
. Tapi @Eldan melaporkan tidak ada peningkatan kecepatan bagi mereka yang menggunakan memori VGA setelah memprogram MTRR untuk membuatnya menjadi WC. (Dan kecepatan yang sama dengan aslinya melakukan toko normal, menunjukkan bahwa secara default VGA framebuffer adalah UC. Beberapa BIOS yang lebih tua memiliki pilihan untuk membuat WC memori VGA , yang mereka sebut USWC = Uncached Speculative Write Combining.)
Ini bukan masalah dunia nyata jadi saya tidak mencari solusi yang sebenarnya ; meskipun akan menarik untuk mengetahui apakah secara manual menyimpan byte pixel ke mode grafis VGA bisa lebih cepat.
Ringkasan
- Apakah ada / semua sistem modern yang nyata memicu SMI di setiap toko ke framebuffer mode teks?
- Jika tidak, dapatkah kita memperkirakan WC store + clflush ke framebuffer, menggunakan movnti + sesuatu di ruang pengguna pada memori WB? Jadi kita dapat dengan mudah membuat profil
perf
untuk penghitung kinerja. - Jika BIOS dan / atau perangkat keras yang berbeda menggunakan strategi yang berbeda, apa strategi itu? (Saya tidak ingin detail, hanya tingkat tinggi seperti "SMI setiap vblank untuk menyinkronkan framebuffer VGA ke framebuffer perangkat keras yang sebenarnya")
- Apakah kartu video PCIe atau PCI dengan hardware VGA textmode akan lebih cepat daripada GPU terintegrasi apa pun sebenarnya? Saya menduga transaksi penulisan PCIe yang sebenarnya akan lebih lambat daripada menunggu toko untuk menekan DRAM, tetapi bahwa penulisan PCIe akan lebih murah daripada SMI di setiap toko. Rata-rata perbandingan besarnya akan menarik.
Semua pertanyaan ini sangat terkait, tetapi saya dapat membaginya jika tidak ada banyak tumpang tindih seperti yang saya harapkan.
perf
karena Linux belum di-boot. Mengevaluasi latensi SMI (System Management Interrupt) pada mesin Linux-CentOS / Intel memiliki beberapa detail tentang bagaimana Anda dapat menghitung IKM.
MSR_SMI_COUNT=0x34
tanpa harus memprogram counter terlebih dahulu.