Bagaimana komputer menampilkan teks dan gambar mentah tingkat rendah

46

Ketertarikan saya terhadap komputer yang terus meningkat membuat saya mengajukan pertanyaan yang lebih dalam, yang sepertinya tidak perlu kami tanyakan lagi. Komputer kami, saat boot, sejauh yang saya mengerti, berada dalam mode teks , di mana karakter dapat ditampilkan menggunakan perangkat lunak interupsi 0x10ketika AH=0x0e. Kita semua telah melihat font booting terkenal yang selalu terlihat sama, terlepas dari apa yang boot komputer.

Jadi, bagaimana mungkin komputer menghasilkan grafik pada level terendah, katakanlah, di bawah OS? Dan juga, tentunya grafis tidak menghasilkan piksel pada suatu waktu menggunakan interupsi perangkat lunak, karena kedengarannya sangat lambat?

Apakah ada standar yang mendefinisikan keluaran dasar dari simpul, poligon, font, dll. (Di bawah OpenGL misalnya, yang OpenGL mungkin gunakan)? Yang membuat saya bertanya adalah mengapa OS 'sering kali baik-baik saja tanpa driver resmi diinstal; bagaimana mereka melakukannya?

Mohon maaf jika asumsi saya salah. Saya akan sangat berterima kasih atas uraian tentang topik-topik ini!

Doddy
sumber
Tidak semua komputer, itu tergantung pada perangkat keras layar. PC yang didasarkan pada garis evolusi IBM awalnya hanya memiliki mode teks, kemudian berbagai mode grafis ditambahkan. Kami masih memiliki warisan itu. Komputer lama sering hanya memiliki mode teks. Komputer lain hanya memiliki mode grafis, seperti Amiga dan Macintosh asli.
hippietrail

Jawaban:

25

Itulah (sebagian) peran BIOS.

Sistem Output Input Dasar komputer bertanggung jawab untuk menyediakan antarmuka umum untuk sistem operasi, meskipun terdapat perbedaan di antara komputer yang sebenarnya.

Yang mengatakan, untuk grafis secara khusus, ada berbagai cara menggambar ke layar. Ada perintah TTY yang dapat Anda kirim ke BIOS, tetapi itu hanya dalam mode nyata. Jika Anda ingin menggambar sesuatu dalam mode terproteksi, Anda perlu menggunakan VGA untuk menggambar sesuatu. Saya tidak dapat menjelaskannya lebih baik daripada OSDev, jadi lihat di sini untuk info lebih lanjut - tetapi pada dasarnya, Anda dapat menulis ke memori (memori video adalah memori yang dipetakan) mulai dari alamat 0xB8000untuk menggambar sesuatu di layar.

Jika Anda membutuhkan resolusi lebih tinggi dari VGA, Anda perlu menggunakan ekstensi VESA BIOS; Saya tidak terbiasa dengan itu, tetapi cobalah melihat kode sumber GRUB untuk info lebih lanjut.

Beberapa referensi yang bermanfaat:


Jika Anda terbiasa dengan D - saya menulis sedikit boot loader beberapa waktu lalu yang bisa menulis ke layar (hanya teks). Jika Anda tertarik, inilah kodenya:

align(2) struct Cell { char ch; ubyte flags = 0x07; }

@property Cell[] vram()
{ return (cast(Cell*)0xB8000)[0 .. CONSOLE_WIDTH * CONSOLE_HEIGHT]; }

void putc(char c)
{
    if (isBochs) { _outp(0xE9, c); }  // Output to the Bochs terminal!

    bool isNewline = c == '\n';
    while (cursorPos + (isNewline ? 0 : 1) > vram.length)
    {
        for (short column = CONSOLE_WIDTH - 1; column >= 0; column--)
        {
            foreach (row; 0 .. CONSOLE_HEIGHT - 1)
            {
                uint cell = column + cast(uint)row * CONSOLE_WIDTH;
                vram[cell] = vram[cell + CONSOLE_WIDTH];
            }
            vram[column + (CONSOLE_HEIGHT - 1) * CONSOLE_WIDTH].ch = ' ';
        }
        cursorPos = cast(ushort)(cursorPos - CONSOLE_WIDTH);
    }
    if (isNewline)
        cursorPos = cast(ushort)
            ((1 + cursorPos / CONSOLE_WIDTH) * CONSOLE_WIDTH);
    else vram[cursorPos++].ch = c;
}

void putc(char c, ubyte attrib) { vram[cursorPos] = Cell(c, attrib); }

void memdump(void* pMem, size_t length)
{
    foreach (i; 0 .. length)
        putc((cast(char*)pMem)[i]);
}

void clear(char clear_to = '\0', ubyte attrib = DEFAULT_ATTRIBUTES)
{
    foreach (pos; 0 .. vram.length)
        vram[pos] = Cell(clear_to, attrib);
    cursorPos = 0;
}

@property ushort cursorPos()
{
    ushort result = 0;
    _outp(0x3D4, 14);
    result += _inp(0x3D5) << 8;
    _outp(0x3D4, 15);
    result += _inp(0x3D5);
    return result;
}

@property void cursorPos(ushort position)
{
    _outp(0x3D4, 14);
    _outp(0x3D5, (position >> 8) & 0xFF);
    _outp(0x3D4, 15);
    _outp(0x3D5, position & 0xFF);
}
Mehrdad
sumber
Terima kasih atas jawabannya. Mengapa kode sumber GRUB? Saya tidak tahu GRUB terlibat dengan grafik itu sendiri.
Doddy
2
@panic Grub2 dapat melakukan beberapa hal menarik, termasuk menampilkan gambar sebagai latar belakang saat berada di menu pilihan OS. Tidak yakin tentang grub.
Izkata
@panic: Saya tidak yakin apakah itu GRUB atau GRUB2 (saya menggunakan "GRUB" secara umum), tetapi mereka pasti dapat beralih ke resolusi 1600x900 asli pada monitor saya, jadi saya yakin mereka memiliki hal-hal yang dapat Anda lihat. (Saya telah melihat mereka beberapa waktu lalu, dan saya ingat mereka sangat membantu, tapi saya sudah lama jadi saya tidak ingat persis file mana yang harus Anda cari.)
Mehrdad
apakah istilah tersebut memory-mappedberarti ada area "buffer" di RAM tempat CPU (atau ada unit DMA lain?) dapat membaca dan menulis atas nama kartu grafis dan program yang mencoba menulis ke layar?
n611x007
1
@naxa: Pertanyaan bagus ... biasanya, perangkat keras yang dipetakan dengan memori berarti ada alamat di memori yang tidak benar-benar sesuai dengan RAM. Sebaliknya, membaca atau menulis sesuai dengan melakukan beberapa tindakan pada beberapa perangkat keras. Yang mengatakan, saya tidak yakin bagaimana Anda bisa membedakan antara RAM yang sebenarnya dan perangkat keras yang membuat blok memori terlihat seperti RAM ... bisa jadi itu adalah RAM yang sebenarnya dalam kasus ini, tetapi kesan saya adalah bahwa membaca dan menulis dicegat oleh perangkat keras.
Mehrdad
25

Dari masa-masa awal PC IBM dan klon-klonanya, perangkat keras adaptor layar sangat sederhana: satu blok memori kecil didedikasikan untuk kisi-kisi sel karakter (80x25 karakter dalam mode standar), dengan dua byte memori untuk setiap sel . Satu byte memilih karakter, dan yang lainnya memilih "atribut" - warna foreground dan background ditambah kontrol kedip untuk adapter warna; tebal, bergaris bawah, berkedip, atau membalikkan video untuk adaptor monokrom. Perangkat keras mencari piksel dari tabel ROM bentuk karakter sesuai dengan isi memori karakter.

Untuk menawarkan tingkat kemandirian perangkat keras tertentu, antarmuka BIOS ke peta karakter memerlukan interupsi perangkat lunak untuk dieksekusi untuk mengatur sel karakter tunggal pada layar. Ini lambat dan tidak efisien. Namun, memori karakter juga dapat dialamatkan oleh CPU, jadi jika Anda tahu perangkat keras apa yang ada, Anda dapat langsung menulis ke memori. Either way, setelah diatur, karakter akan tetap di layar sampai berubah, dan total memori karakter yang Anda butuhkan untuk bekerja adalah 4000 byte - sekitar ukuran tekstur tunggal 32x32 penuh warna!

Dalam mode grafis, situasinya mirip; setiap piksel pada layar dikaitkan dengan lokasi tertentu dalam memori, dan ada antarmuka set-piksel BIOS tetapi pekerjaan berkinerja tinggi diperlukan untuk menulis langsung ke memori. Kemudian standar seperti VESA memungkinkan sistem melakukan beberapa permintaan berbasis BIOS yang lambat untuk mempelajari tata letak memori perangkat keras, kemudian bekerja secara langsung dengan memori. Beginilah cara OS dapat menampilkan gambar tanpa driver khusus, meskipun OS modern juga menyertakan driver dasar untuk setiap perangkat keras produsen GPU utama. Bahkan kartu NVidia terbaru akan mendukung beberapa mode kompatibilitas yang berbeda, mungkin sepanjang jalan kembali ke IBM CGA.

Satu perbedaan penting antara grafik 3D dan 2D adalah bahwa dalam 2D ​​Anda biasanya tidak perlu menggambar ulang seluruh layar setiap frame. Dalam 3D, jika kamera bergerak sedikit pun, setiap piksel pada layar mungkin berubah; dalam 2D, jika Anda tidak menggulir, sebagian besar layar tidak akan berubah bingkai-ke-bingkai, dan bahkan jika Anda menggulir, Anda biasanya dapat melakukan salinan memori-ke-memori yang cepat alih-alih menyusun ulang seluruh adegan. Jadi tidak ada artinya harus mengeksekusi INT 10j untuk setiap piksel setiap bingkai.

Sumber: Saya sangat tua

Russell Borogove
sumber
Sangat informatif, terima kasih. Saya berharap dapat menerima lebih dari satu!
Doddy
8

Selama boot, BIOS sistem mencari adaptor video. Secara khusus, ia mencari adaptor video yang tertanam dalam program BIOS dan menjalankannya. BIOS ini biasanya ditemukan di lokasi C000h dalam memori. Sistem BIOS menjalankan BIOS video , yang menginisialisasi adaptor video.

Level atau mode video / grafik mana yang BIOS dapat tampilkan secara asli, tanpa OS atau driver, terutama tergantung pada Video BIOS itu sendiri.

Sumber / Info Lebih Lanjut Di Sini - "Urutan Booting Sistem"

Ƭᴇcʜιᴇ007
sumber
6

Komputer kami, saat boot, sejauh yang saya mengerti, berada dalam mode teks, di mana karakter dapat ditampilkan menggunakan perangkat lunak interupsi 0x10 ketika AH = 0x0e

Anda sedang berbicara tentang fungsi-fungsi warisan BIOS. Bahkan Anda tidak perlu menggunakan fungsi seperti itu sama sekali. Anda langsung menuliskannya ke dalam memori video.

bagaimana mungkin komputer menghasilkan grafik pada level terendah, katakanlah, di bawah OS?

Ini sangat berkaitan dengan bagaimana OS beroperasi. Lagi pula, operasinya sama pada tingkat perangkat keras: kartu video memiliki RAM video, yang menyimpan (menyederhanakan) gambar berikutnya untuk digambar di layar. Anda dapat berpikir bahwa setiap alamat adalah byte yang mewakili piksel (sebenarnya umumnya Anda membutuhkan lebih dari satu byte per piksel). Kemudian pengontrol video menangani menerjemahkan ini menjadi sinyal yang dimengerti monitor.

Apakah ada standar yang mendefinisikan keluaran dasar dari simpul, poligon, font, dll. (Di bawah OpenGL misalnya, yang OpenGL mungkin gunakan)?

AFAIK, tidak. Tidak ada standar tentang representasi grafik logis.

Yang membuat saya bertanya adalah mengapa OS 'sering kali baik-baik saja tanpa driver resmi diinstal; bagaimana mereka melakukannya?

Karena sudah ada driver yang sudah dibundel dengan OS.

m0skit0
sumber