Bilgisayarlar ham, düşük düzeyli metin ve grafikleri nasıl görüntüler?


46

Bilgisayarlara olan ilgim gittikçe artan ilgim, daha fazla soru sormamı, artık sormak zorunda olmadığımız anlamına geliyor. Bilgisayarlarımız, açılışta, anladığım kadarıyla, metin kipinde , 0x10ne zaman kesintiye uğrayan yazılım kullanılarak bir karakter gösterilebilir AH=0x0e. Hangi önyüklemeden bağımsız olarak, hep aynı görünen ünlü önyükleme yazı tipini hepimiz gördük.

Öyleyse, dünyadaki bilgisayarlar nasıl işletim sistemi altında en düşük seviyede grafik çıktısı veriyor? Ve ayrıca, kesinlikle grafikler yazılım kesintilerini kullanarak bir seferde piksel çıkarmıyor, çünkü bu çok yavaş geliyor?

Köşelerin, çokgenlerin, yazı tiplerinin vs. temel çıktısını tanımlayan bir standart var mı (örneğin OpenGL'nin altında, hangi OpenGL'nin kullanabileceği)? Beni sormaya iten şey, OS'nin neden resmi sürücüler kurulmadan sık sık iyi olabileceğidir; bunu nasıl yapıyorlar?

Varsayımlarım yanlışsa özür dilerim. Bu konulardaki detaylandırma için minnettar olurum!


Tüm bilgisayarlar değil, ekran donanımına bağlı. IBM'in evrimsel hattını temel alan bilgisayarlar aslında sadece metin moduna sahipti, daha sonra çeşitli grafik modları eklendi. Hala bu mirasımız var. Eski bilgisayarlarda genellikle sadece metin modu vardı. Diğer bilgisayarlarda yalnızca Amiga ve orijinal Macintosh gibi grafik modları vardı.
hippietrail

Yanıtlar:


25

BIOS'un (kısmen) rolü budur.

Bilgisayarın Temel Giriş Çıkış Sistemi, gerçek bilgisayarlar arasındaki farklara rağmen, işletim sistemlerine ortak bir arayüz sağlamaktan sorumludur.

Bununla birlikte, özellikle grafikler için ekrana çizim yapmanın farklı yolları vardır. BIOS'a gönderebileceğiniz TTY komutları var, ancak bu yalnızca gerçek modda. Korumalı modda herhangi bir şey çizmek istiyorsanız, bir şey çizmek için VGA kullanmanız gerekir. Bunu OSDev'den daha iyi açıklayamıyorum, bu yüzden daha fazla bilgi için buraya bakın - fakat temelde, 0xB8000ekranda bir şeyler çizmek için adresten başlayarak belleğe yazabilirsiniz (video belleği bellek haritalıdır) .

VGA'dan daha yüksek bir çözünürlüğe ihtiyacınız varsa, VESA BIOS uzantılarını kullanmanız gerekir; Buna aşina değilim, ama daha fazla bilgi için GRUB kaynak koduna bakmayı deneyin.

Bazı yararlı referanslar:


Eğer D ile aşina olursanız - ben bir süre önce ekrana yazabilen küçük bir açılış yükleyicisi yazdım (sadece metin). Eğer ilgileniyorsanız, kod burada:

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);
}

Cevap için teşekkürler. Neden GRUB kaynak kodu? GRUB'un grafiklerle uğraştığını bilmiyordum.
Doddy

2
@ Spanish Grub2, işletim sistemi seçim menüsünde görüntüyü arka plan olarak göstermek de dahil olmak üzere bazı ilginç şeyler yapabilir. Grub hakkında kesin değil.
Izkata

@panic: GRUB veya GRUB2 olup olmadığından emin değilim (genel olarak "GRUB" kullandım), ancak kesinlikle monitörümde yerel bir 1600x900 çözünürlüğe geçebiliyorlar, bu yüzden bakabileceğiniz bir şeyleri olduğundan eminim. (Bir süre önce onlara baktım ve onların yardımcı olduklarını hatırlıyorum, ancak uzun zaman oldu, bu yüzden hangi dosyalara bakmanız gerektiğini tam olarak hatırlamıyorum.)
Mehrdad

terimi memory-mapped, RAM’de CPU’nun (veya başka bir DMA birimi var mı?) hem grafik kartı hem de ekrana yazmaya çalışan program adına okuyabildiği ve yazabildiği “tampon” bir alan olduğu anlamına mı geliyor?
n611x007 08:13

1
@ naxa: Güzel soru ... genellikle hafıza eşlemeli donanım, bellekte aslında RAM ile uyuşmayan bir adres olduğu anlamına gelir. Aksine, okumak veya yazmak, bazı donanımlarda bazı işlemlerin gerçekleştirilmesine karşılık gelir. Bununla birlikte, RAM ile bellek gibi görünen bir bellek bloğunu oluşturan donanım ile gerçek RAM arasındaki farkı nasıl ayırt edebileceğinizden emin değilim ... bu durumda gerçek RAM olabilir, ancak izlenim benim okuduğum ve yazdığımın ele alınmasıydı. donanım tarafından.
Mehrdad

25

IBM PC'nin ve klonlarının ilk günlerinden itibaren ekran bağdaştırıcısı donanımı çok basitti: küçük bir bellek bloğu, her hücre için iki bayt bellek içeren bir karakter hücreleri ızgarasına (standart modda 80x25 karakter) ayrılmıştı. . Bir bayt karakteri seçti, diğeri "niteliklerini" seçti - ön plan ve arka plan renkleri artı renk adaptörleri için göz kırpma kontrolü; monokrom adaptörleri için koyu, altı çizili, yanıp sönen veya ters video. Donanım, karakter belleğinin içeriğine göre ROM karakter karakter tablosundan pikselleri aradı.

Belirli bir donanım bağımsızlığı derecesi sunmak için, karakter haritasına giden BIOS arayüzü, ekranda tek bir karakter hücresi ayarlamak için bir yazılım kesintisinin gerçekleştirilmesini gerektiriyordu. Bu yavaş ve verimsizdi. Bununla birlikte, karakter hafızası CPU tarafından da doğrudan adreslenebilirdi, bu nedenle hangi donanımın bulunduğunu biliyorsanız, doğrudan belleğe yazabilirsiniz. Her iki durumda da, bir kez ayarlandıktan sonra karakter değişene kadar ekranda kalır ve çalışmak için gereken toplam karakter belleği 4000 byte'tır - tek bir 32x32 tam renkli doku boyutu!

Grafik modlarında durum benzerdi; Ekrandaki her piksel bellekteki belirli bir konumla ilişkilendirilir ve bir BIOS set-piksel arayüzü vardı ancak doğrudan belleğe yazmak için yüksek performanslı bir çalışma gerekiyordu. VESA gibi daha sonraki standartlar, sistemin donanımın bellek düzenini öğrenmek için birkaç yavaş BIOS-tabanlı sorgu yapmasını ve ardından doğrudan bellekle çalışmasını sağlar. Modern işletim sistemlerinde ayrıca her büyük GPU üreticisinin donanımı için temel sürücüler de bulunmasına rağmen, işletim sisteminin özel bir sürücü olmadan grafikleri görüntülemesi budur. En yeni NVidia kartı bile, muhtemelen IBM CGA'ya geri dönecek şekilde birkaç farklı geriye dönük uyumluluk modunu destekleyecektir.

3B grafiklerle 2B arasındaki önemli bir fark, 2B'de genellikle her kareyi ekranın tamamını yeniden çizmenize gerek kalmamasıdır. 3D olarak, kamera küçük bir parça bile hareket ederse, ekrandaki her piksel değişebilir; 2B'de, kaydırma yapmıyorsanız, ekranın çoğu kareden kareye değişmeyecektir ve kaydırma yapıyor olsanız bile, genel olarak tüm sahneyi yeniden oluşturmak yerine hızlıca bellekten belleğe bir kopya yapabilirsiniz. Bu yüzden her karede her piksel için INT 10h'yi çalıştırmak zorunda kalmak gibisi yoktur.

Kaynak: Gerçekten yaşlıyım


Çok bilgilendirici, teşekkürler. Keşke birden fazla kabul edebilseydim!
Doddy

8

Önyükleme sırasında sistem BIOS , video adaptörünü arar. Özellikle, BIOS programındaki yerleşik video adaptörünü arar ve çalıştırır. Bu BIOS normalde bellekte C000h konumunda bulunur. Sistem BIOS'u , video adaptörünü başlatan video BIOS'unu yürütür .

Bir işletim sistemi veya sürücüler olmadan, BIOS'un hangi düzeylerde video / grafik modlarını görüntüleyebileceği temel olarak Video BIOS'un kendisine bağlıdır.

Kaynak / Daha Fazla Bilgi Burada - "Sistem Önyükleme Sırası"


6

Bilgisayarlarımız, açılışta, anlayabildiğim kadarıyla, AH = 0x0e olduğunda, 0x10 yazılım kesintisini kullanarak bir karakterin görüntülenebileceği bir metin modundadır.

Eski BIOS işlevlerinden bahsediyorsunuz. Aslında bu tür işlevleri hiç kullanmanıza gerek yok. Onları doğrudan video belleğine yazıyorsun.

Bilgisayarlar dünya üzerinde OS’in altında en düşük seviyede grafik çıktısını nasıl alıyorlar?

Bu, işletim sisteminin nasıl çalıştığını güçlü bir şekilde yapmak zorunda. Yine de, işlem donanım düzeyinde aynıdır: ekran kartında, ekranda çizilecek bir sonraki görüntüyü saklayan (basitleştiren) bir video RAM vardır. Her adresin bir pikseli temsil eden bir bayt olduğunu düşünebilirsiniz (aslında genellikle piksel başına birden fazla bayta ihtiyacınız vardır). Ardından, video denetleyici bunu monitörün anladığı bir sinyale dönüştürür.

Köşelerin, çokgenlerin, yazı tiplerinin vs. temel çıktısını tanımlayan bir standart var mı (örneğin OpenGL'nin altında, hangi OpenGL'nin kullanabileceği)?

AFAIK, hayır. Mantıksal grafik gösterimlerle ilgili standartlar yoktur.

Beni sormaya iten şey, OS'nin neden resmi sürücüler kurulmadan sık sık iyi olabileceğidir; bunu nasıl yapıyorlar?

Çünkü zaten işletim sistemi ile birlikte gelen sürücüleri var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.