Як комп’ютери відображають сирий, низький рівень тексту та графіки


46

Мій постійно зростаючий інтерес до комп'ютерів змушує мене задавати глибші запитання, які, здається, нам більше не доведеться задавати. Наші комп'ютери під час завантаження, наскільки я розумію, знаходяться в текстовому режимі , в якому персонаж може відображатися за допомогою програмного переривання, 0x10коли AH=0x0e. Всі ми бачили відомий завантажувальний шрифт, який завжди виглядає однаково, незалежно від завантаження комп'ютера.

Отже, як на землі комп'ютери виводять графіку на найнижчому рівні, скажімо, нижче ОС? А також, напевно графіка не виводить піксель одночасно за допомогою програмних переривань, як це звучить дуже повільно?

Чи існує стандарт, який визначає базовий вихід вершин, полігонів, шрифтів тощо (нижче, наприклад, OpenGL, який OpenGL може використовувати)? Що змушує мене запитати, чому ОС часто може бути нормальною без встановлення офіційних драйверів; як вони це роблять?

Вибачте, якщо мої припущення невірні. Я був би дуже вдячний за опрацювання цих тем!


Це не всі комп'ютери, це залежить від апаратного забезпечення дисплея. ПК, засновані на еволюційній лінії IBM, спочатку просто мали текстовий режим, потім були додані різні графічні режими. У нас є ця спадщина. Старіші комп’ютери часто мали лише текстовий режим. Інші комп’ютери мали лише графічні режими, як Аміга та оригінальний Macintoshes.
hippietrail

Відповіді:


25

Ось (частково) роль BIOS.

Базова система вводу виводу комп'ютера відповідає за надання загального інтерфейсу операційним системам, незважаючи на такі відмінності між фактичними комп'ютерами.

Але, зокрема, для графіки існують різні способи малювання на екрані. Є команди TTY, які ви можете відправити в BIOS, але це лише в реальному режимі. Якщо ви хочете намалювати що-небудь у захищеному режимі, вам потрібно використовувати VGA для малювання речей. Я не можу пояснити це краще, ніж OSDev, тому шукайте тут додаткову інформацію - але в основному ви можете записувати в пам'ять (відеопам'ять відображається на карті), починаючи з адреси, 0xB8000щоб малювати речі на екрані.

Якщо вам потрібна більш висока роздільна здатність, ніж VGA, вам потрібно використовувати розширення BIOS VESA; Я не знайомий з цим, але спробуйте переглянути вихідний код GRUB для отримання додаткової інформації.

Деякі корисні посилання:


Якщо ви знайомі з D - я трохи пізніше написав завантажувач, який міг записати на екран (лише текст). Якщо вас цікавить, ось код:

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

Дякую за відповідь. Чому вихідний код GRUB? Я не знав, що GRUB займається самою графікою.
Додді

2
@panic Grub2 може зробити щось цікаве, включаючи показ зображення як фонового зображення в меню вибору ОС. Не впевнений у відношенні грибів.
Ізката

@panic: Я не впевнений, чи це GRUB чи GRUB2 (я загалом використовував "GRUB"), але вони точно можуть переключитися на рідну роздільну здатність 1600x900 на моєму моніторі, тому я впевнений, що у них є речі, на які ви можете заглянути. (Я заглянув у них деякий час назад, і пам’ятаю, що вони були корисними, але я пройшов деякий час, тому не пам’ятаю, у який саме файл (-и) ви повинні заглянути.)
Мехрдад

чи означає цей термін, memory-mappedщо в оперативній пам’яті є область «буфера», де ЦП (чи є ще один блок DMA?) може читати і писати від імені як відеокарти, так і програми, яка намагається записати на дисплей?
n611x007

1
@naxa: Добре питання ... Зазвичай, апаратне забезпечення, яке відображається на пам'яті, означає, що в пам'яті є адреса, яка фактично не відповідає оперативній пам'яті. Швидше за все, читання чи запис до нього відповідає виконанню певної дії на певному апаратному забезпеченні. Тим НЕ менше, я не знаю , як ви могли розрізняти фактичне ОЗУ і апаратного забезпечення , що робить блок пам'яті виглядати як RAM ... це може бути , що це фактична RAM в даному випадку, але моє враження , що читання і запис перехоплених апаратними засобами.
Мехрдад

25

З перших днів роботи комп'ютера IBM та його клонів апаратне забезпечення адаптера дисплея було дуже простим: невеликий блок пам'яті був виділений сітці символьних комірок (80x25 символів у стандартному режимі), з двома байтами пам'яті для кожної комірки . Один байт вибрав символ, а інший обрав його "атрибути" - кольори переднього плану та фону, а також контроль моргання для кольорових адаптерів; жирне, підкреслене, миготливе або зворотне відео для монохромних адаптерів. Апаратні засоби шукали пікселі з таблиці ПЗУ символьних фігур відповідно до вмісту пам'яті символів.

Для того, щоб запропонувати певну ступінь апаратної незалежності, інтерфейс BIOS до карти символів вимагав виконання програмного переривання для встановлення на екрані однієї символьної комірки. Це було повільно і неефективно. Однак пам'ять символів також була безпосередньо адресована процесором, тому, якщо ви знали, яке обладнання присутнє, ви можете замість цього записати безпосередньо в пам'ять. У будь-якому випадку, після встановлення персонаж залишатиметься на екрані до зміни, а загальна пам'ять символів, з якою вам потрібно було працювати, становила 4000 байт - приблизно розміром однієї повнокольорової текстури 32x32!

У графічних режимах ситуація була схожа; кожен піксель на екрані асоціюється з певним місцем в пам'яті, і був інтерфейс BIOS із встановленим пікселем, але робота з високою продуктивністю вимагала запису безпосередньо в пам'ять. Пізніші стандарти, як VESA, дозволяють системі виконати кілька повільних запитів на основі BIOS, щоб дізнатися компонування пам'яті апаратного забезпечення, а потім працювати безпосередньо з пам'яттю. Ось так ОС може відображати графіку без спеціалізованого драйвера, хоча сучасні ОС також містять базові драйвери для кожного основного виробника GPU. Навіть найновіша карта NVidia підтримуватиме декілька різних режимів сумісності, можливо, аж до IBM CGA.

Важлива відмінність 3D-графіки від 2D полягає в тому, що в 2D вам взагалі не потрібно переробляти весь екран кожного кадру. У 3D-режимі, якщо камера рухається навіть крихітним шматочком, кожен піксель на екрані може змінюватися; у 2D, якщо ви не прокручуєте, більша частина екрану буде незмінною кадр в кадр, і навіть якщо ви прокручуєте, ви, як правило, можете зробити швидку копію пам'яті на пам'ять замість того, щоб переробляти всю сцену. Тож це не що інше, як виконувати INT 10 год на кожен піксель у кожному кадрі.

Джерело: Я справді старий


Дуже інформативно, дякую. Я б хотів, щоб я міг прийняти більше одного!
Додді

8

Під час завантаження система BIOS шукає відеоадаптер. Зокрема, він шукає вбудований у програму BIOS відеоадаптер і запускає його. Цей BIOS зазвичай знаходиться в пам'яті місця C000h. Система BIOS виконує відео BIOS , який ініціалізує відеоадаптер.

Який рівень або режими відео / графіки BIOS може відображати в оригінальному режимі, без ОС або драйверів, в першу чергу залежить від самого відео BIOS.

Джерело / Детальніше тут - "Послідовність завантаження системи"


6

Наші комп'ютери під час завантаження, наскільки я розумію, знаходяться в текстовому режимі, в якому персонаж може бути відображений за допомогою програмного переривання 0x10, коли AH = 0x0e

Ви говорите про застарілі функції BIOS. Насправді вам взагалі не потрібно використовувати такі функції. Ви безпосередньо записуєте їх у відеопам'ять.

як на землі комп'ютери виводять графіку на найнижчому рівні, скажімо, нижче ОС?

Це дуже важливо для роботи ОС. У будь-якому випадку операція однакова на апаратному рівні: відеокарта має відео оперативну пам’ять, яка зберігає (спрощує) наступне зображення, яке буде намальовано на екрані. Можна подумати, що кожна адреса - це байт, який представляє піксель (насправді, як правило, потрібно більше одного байта на піксель). Потім відеоконтролер дбає про переведення цього сигналу в сигнал, який розуміє монітор.

Чи існує стандарт, який визначає базовий вихід вершин, полігонів, шрифтів тощо (нижче, наприклад, OpenGL, який OpenGL може використовувати)?

AFAIK, ні. Не існує стандартів щодо логічних графічних зображень.

Що змушує мене запитати, чому ОС часто може бути нормальною без встановлення офіційних драйверів; як вони це роблять?

Тому що в ньому вже є драйвери, які вже в комплекті з ОС.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.