คอมพิวเตอร์แสดงข้อความและกราฟิกระดับต่ำแบบดิบได้อย่างไร


46

ความสนใจที่เพิ่มขึ้นเรื่อย ๆ ของฉันในคอมพิวเตอร์ทำให้ฉันถามคำถามที่ลึกกว่าเดิมซึ่งดูเหมือนว่าเราจะไม่ต้องถามอีกต่อไป คอมพิวเตอร์ของเราที่บูตเท่าที่ฉันเข้าใจว่ามันอยู่ในโหมดข้อความซึ่งในตัวสามารถแสดงผลโดยใช้การขัดจังหวะซอฟต์แวร์เมื่อ0x10 AH=0x0eเราทุกคนได้เห็นแบบอักษรสำหรับการเริ่มระบบที่มีชื่อเสียงซึ่งดูเหมือนกันเสมอโดยไม่คำนึงว่าคอมพิวเตอร์กำลังทำการบูทอะไร

ดังนั้นคอมพิวเตอร์จะทำกราฟิกเอาต์พุตในระดับต่ำสุดได้อย่างไรพูดต่ำกว่าระบบปฏิบัติการ และแน่นอนว่ากราฟิกจะไม่ถูกนำออกพิกเซลในเวลาเดียวกันโดยใช้การขัดจังหวะโดยซอฟต์แวร์เพราะฟังดูช้ามาก?

มีมาตรฐานที่กำหนดเอาท์พุทขั้นพื้นฐานของจุดยอด, รูปหลายเหลี่ยม, แบบอักษร, ฯลฯ (ด้านล่าง OpenGL เช่นซึ่ง OpenGL อาจใช้) สิ่งที่ทำให้ฉันถามคือทำไมระบบปฏิบัติการ 'มักจะดีโดยไม่ต้องติดตั้งไดรเวอร์อย่างเป็นทางการ พวกเขาทำอย่างนั้นได้อย่างไร

ขออภัยหากสมมติฐานของฉันไม่ถูกต้อง ฉันจะขอบคุณมากสำหรับรายละเอียดในหัวข้อเหล่านี้!


มันไม่ใช่คอมพิวเตอร์ทุกเครื่องมันขึ้นอยู่กับฮาร์ดแวร์ของจอแสดงผล พีซีที่ใช้สายวิวัฒนาการของ IBM เดิมมีเพียงโหมดข้อความจากนั้นเพิ่มโหมดกราฟิกต่างๆ เรายังมีมรดกนั้นอยู่ คอมพิวเตอร์ที่เก่ากว่ามักมีโหมดข้อความเท่านั้น คอมพิวเตอร์เครื่องอื่นมีเพียงโหมดกราฟิกเช่น Amiga และ Macintoshes ดั้งเดิม
hippietrail

คำตอบ:


25

นั่นคือ (ส่วนหนึ่ง) บทบาทของ BIOS

ระบบอินพุตเอาต์พุตพื้นฐานของคอมพิวเตอร์มีหน้าที่จัดหาอินเตอร์เฟสทั่วไปให้กับระบบปฏิบัติการแม้ว่าจะมีความแตกต่างระหว่างคอมพิวเตอร์จริงก็ตาม

ที่กล่าวว่าสำหรับกราฟิกโดยเฉพาะมีวิธีการวาดที่แตกต่างกันไปที่หน้าจอ มีคำสั่ง TTY ที่คุณสามารถส่งไปยัง BIOS ได้ แต่นั่นเป็นเพียงโหมดจริง หากคุณต้องการวาดอะไรก็ได้ในโหมดที่ได้รับการป้องกันคุณต้องใช้ VGA เพื่อวาดสิ่งต่าง ๆ ฉันไม่สามารถอธิบายได้ดีกว่า OSDev จึงมองนี่สำหรับข้อมูลเพิ่มเติม - แต่โดยทั่วไปคุณสามารถเขียนไปยังหน่วยความจำ (หน่วยความจำวิดีโอเป็นหน่วยความจำที่แมป) เริ่มต้นที่อยู่0xB8000ในการวาดสิ่งที่อยู่บนหน้าจอ

หากคุณต้องการความละเอียดสูงกว่า VGA คุณต้องใช้ส่วนขยาย VESA BIOS ฉันไม่คุ้นเคย แต่ลองดูซอร์สโค้ดของ 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 เกี่ยวข้องกับกราฟิคเอง
Doddy

2
@panic Grub2 สามารถทำสิ่งที่น่าสนใจรวมถึงการแสดงภาพเป็นพื้นหลังเมื่ออยู่ในเมนูการเลือกระบบปฏิบัติการ ไม่แน่ใจเกี่ยวกับด้วง
Izkata

@ พานิช: ฉันไม่แน่ใจว่ามันเป็นด้วงหรือด้วง 2 (ฉันใช้ "ด้วง" โดยทั่วไป) แต่พวกเขาสามารถเปลี่ยนเป็นความละเอียด 1600x900 ดั้งเดิมบนจอภาพของฉันได้ดังนั้นฉันจึงมั่นใจว่าพวกเขาจะมีสิ่งที่คุณสามารถมองเห็น (ฉันได้ตรวจดูพวกเขาซักพักแล้วและฉันก็จำได้ว่ามันมีประโยชน์ แต่ฉันก็จำได้ไม่นานว่าไฟล์ไหนที่คุณควรจะดู)
Mehrdad

คำนี้memory-mappedหมายความว่ามีพื้นที่ "บัฟเฟอร์" ใน RAM ที่ CPU (หรือมีหน่วย DMA อื่นหรือไม่) สามารถอ่านและเขียนในนามของทั้งกราฟิกการ์ดและโปรแกรมที่พยายามเขียนไปยังจอแสดงผล?
n611x007

1
@naxa: คำถามที่ดี ... โดยปกติแล้วฮาร์ดแวร์ที่แมปหน่วยความจำหมายความว่ามีที่อยู่ในหน่วยความจำที่ไม่สอดคล้องกับ RAM จริง ค่อนข้างอ่านหรือเขียนมันสอดคล้องกับการดำเนินการบางอย่างกับฮาร์ดแวร์บางอย่าง ที่กล่าวว่าฉันไม่แน่ใจว่าคุณจะแยกแยะความแตกต่างระหว่าง RAM จริงและฮาร์ดแวร์ที่ทำให้บล็อกหน่วยความจำดูเหมือน RAM ได้หรือไม่อาจเป็นได้ว่า RAM จริงในกรณีนี้ แต่ความประทับใจของฉันคือการอ่านและเขียนถูกดัก โดยฮาร์ดแวร์
Mehrdad

25

ตั้งแต่วันแรก ๆ ของพีซี IBM และโคลนการ์ดแสดงผลของฮาร์ดแวร์อะแดปเตอร์แสดงผลนั้นง่ายมาก: หน่วยความจำขนาดเล็กถูกสร้างขึ้นเพื่อกริดเซลล์อักขระ (80x25 อักขระในโหมดมาตรฐาน) โดยมีหน่วยความจำสองไบต์สำหรับแต่ละเซลล์ . หนึ่งไบต์เลือกอักขระและอีกอันเลือก "คุณสมบัติ" - สีพื้นหน้าและสีพื้นหลังพร้อมการควบคุมการกะพริบสำหรับอะแดปเตอร์สี ตัวหนาขีดเส้นใต้กะพริบหรือย้อนกลับวิดีโอสำหรับอะแดปเตอร์ขาวดำ ฮาร์ดแวร์ค้นหาพิกเซลจากตาราง ROM ของรูปร่างอักขระตามเนื้อหาของหน่วยความจำอักขระ

เพื่อให้มีความเป็นอิสระในระดับหนึ่งของฮาร์ดแวร์อินเตอร์เฟส BIOS ไปยังตัวอักษรแผนที่จำเป็นต้องมีซอฟต์แวร์ขัดจังหวะเพื่อดำเนินการเพื่อตั้งค่าเซลล์อักขระเดี่ยวบนหน้าจอ นี่ช้าและไม่มีประสิทธิภาพ อย่างไรก็ตามหน่วยความจำตัวละครสามารถระบุตำแหน่งได้โดยตรงจาก CPU เช่นกันดังนั้นหากคุณรู้ว่ามีฮาร์ดแวร์ใดอยู่คุณสามารถเขียนลงหน่วยความจำโดยตรงได้ ไม่ว่าจะด้วยวิธีใดก็ตามเมื่อตั้งค่าแล้วตัวละครจะยังคงอยู่บนหน้าจอจนกว่าจะมีการเปลี่ยนแปลงและหน่วยความจำตัวอักษรทั้งหมดที่คุณต้องใช้ในการทำงานคือ 4000 ไบต์ - ขนาดของพื้นผิวสีเต็ม 32x32!

ในโหมดกราฟิกสถานการณ์คล้ายกัน แต่ละพิกเซลบนหน้าจอสัมพันธ์กับตำแหน่งเฉพาะในหน่วยความจำและมีอินเทอร์เฟซชุดพิกเซล BIOS แต่งานที่มีประสิทธิภาพสูงจำเป็นต้องเขียนลงในหน่วยความจำโดยตรง มาตรฐานที่ใหม่กว่าเช่น VESA ปล่อยให้ระบบทำการสืบค้นด้วยไบออสช้า ๆ เพื่อเรียนรู้เลย์เอาต์หน่วยความจำของฮาร์ดแวร์จากนั้นทำงานกับหน่วยความจำโดยตรง นี่คือวิธีที่ระบบปฏิบัติการสามารถแสดงกราฟิกโดยไม่ต้องใช้ไดรเวอร์พิเศษถึงแม้ว่าระบบปฏิบัติการที่ทันสมัยจะมีไดรเวอร์พื้นฐานสำหรับฮาร์ดแวร์ของผู้ผลิต GPU รายใหญ่ทุกราย แม้แต่การ์ด NVidia รุ่นใหม่ล่าสุดยังรองรับโหมดความเข้ากันได้แบบย้อนกลับหลายแบบซึ่งอาจเป็นทางกลับไปที่ IBM CGA

ความแตกต่างที่สำคัญอย่างหนึ่งระหว่างกราฟิก 3D กับ 2D คือใน 2D คุณไม่จำเป็นต้องวาดหน้าจอทั้งหมดใหม่ทุกเฟรม ในแบบ 3 มิติถ้ากล้องเคลื่อนที่แม้เพียงเล็กน้อยทุกพิกเซลบนหน้าจออาจเปลี่ยนไป ในแบบ 2 มิติหากคุณไม่ได้เลื่อนหน้าจอส่วนใหญ่จะไม่มีการเปลี่ยนแปลงแบบเฟรมต่อเฟรมและแม้ว่าคุณจะเลื่อนก็ตามโดยทั่วไปคุณสามารถทำสำเนาหน่วยความจำต่อหน่วยความจำได้อย่างรวดเร็วแทนการแนะนำทั้งฉาก ดังนั้นจึงไม่มีอะไรที่จะต้องเรียกใช้ INT 10h สำหรับทุกๆพิกเซลในทุกเฟรม

ที่มา: ฉันแก่มาก


ให้ข้อมูลมากขอบคุณ ฉันหวังว่าฉันจะยอมรับได้มากกว่าหนึ่ง!
Doddy

8

ระหว่างการบู๊ตBIOS ของระบบจะค้นหาอะแดปเตอร์วิดีโอ โดยเฉพาะอย่างยิ่งจะมองหาโปรแกรม BIOS ของการ์ดแสดงผลในตัวและเรียกใช้งาน โดยปกติไบออสนี้จะอยู่ที่ตำแหน่ง C000h ในหน่วยความจำ BIOS ของระบบดำเนินการวิดีโอ BIOSซึ่งเริ่มต้นอะแดปเตอร์วิดีโอ

ระดับหรือโหมดใดของวิดีโอ / กราฟิกที่ BIOS สามารถแสดงได้โดยไม่ต้องใช้ OS หรือไดรเวอร์นั้นขึ้นอยู่กับ Video BIOS เป็นหลัก

แหล่งข้อมูลเพิ่มเติมที่นี่ - "ลำดับการบูตระบบ"


6

คอมพิวเตอร์ของเราตอนบูตเท่าที่ฉันเข้าใจอยู่ในโหมดข้อความซึ่งตัวละครสามารถแสดงโดยใช้ซอฟต์แวร์ขัดจังหวะ 0x10 เมื่อ AH = 0x0e

คุณกำลังพูดถึงฟังก์ชั่น BIOS รุ่นเก่า ในความเป็นจริงคุณไม่จำเป็นต้องใช้ฟังก์ชั่นดังกล่าวเลย คุณเขียนลงในหน่วยความจำวิดีโอโดยตรง

คอมพิวเตอร์จะแสดงผลกราฟิกอย่างไรในระดับต่ำสุดพูดต่ำกว่าระบบปฏิบัติการ

สิ่งนี้ต้องทำอย่างมากเกี่ยวกับวิธีการที่ระบบปฏิบัติการทำงาน อย่างไรก็ตามการดำเนินการจะเหมือนกันในระดับฮาร์ดแวร์: การ์ดวิดีโอมี RAM วิดีโอซึ่งจัดเก็บ (ลดความซับซ้อน) ภาพถัดไปที่จะวาดบนหน้าจอ คุณสามารถคิดว่าที่อยู่แต่ละรายการเป็นไบต์ซึ่งแทนพิกเซล (โดยทั่วไปแล้วคุณต้องมีมากกว่าหนึ่งไบต์ต่อพิกเซล) จากนั้นคอนโทรลเลอร์วิดีโอจะดูแลการแปลนี้เป็นสัญญาณที่มอนิเตอร์เข้าใจ

มีมาตรฐานที่กำหนดเอาท์พุทขั้นพื้นฐานของจุดยอด, รูปหลายเหลี่ยม, แบบอักษร, ฯลฯ (ด้านล่าง OpenGL เช่นซึ่ง OpenGL อาจใช้)

AFAIK เลขที่ ไม่มีมาตรฐานเกี่ยวกับการนำเสนอกราฟิกเชิงตรรกะ

สิ่งที่ทำให้ฉันถามคือทำไมระบบปฏิบัติการ 'มักจะดีโดยไม่ต้องติดตั้งไดรเวอร์อย่างเป็นทางการ พวกเขาทำอย่างนั้นได้อย่างไร

เพราะมันมีไดรเวอร์ที่มาพร้อมกับ OS อยู่แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.