Cách máy tính hiển thị văn bản và đồ họa thô, cấp thấp


46

Mối quan tâm ngày càng tăng của tôi đối với máy tính đang khiến tôi hỏi những câu hỏi sâu hơn, mà dường như chúng ta không phải hỏi nữa. Máy tính của chúng tôi, khi khởi động, theo như tôi hiểu, ở chế độ văn bản , trong đó một ký tự có thể được hiển thị bằng cách sử dụng phần mềm ngắt 0x10khi AH=0x0e. Chúng ta đều đã thấy phông chữ khởi động nổi tiếng luôn trông giống nhau, bất kể máy tính nào đang khởi động.

Vì vậy, làm thế nào trên trái đất làm máy tính xuất đồ họa ở mức thấp nhất, giả sử, bên dưới HĐH? Ngoài ra, chắc chắn đồ họa không xuất ra một pixel tại một thời điểm sử dụng các phần mềm bị gián đoạn, vì điều đó nghe có vẻ rất chậm?

Có một tiêu chuẩn xác định đầu ra cơ bản của các đỉnh, đa giác, phông chữ, v.v. (ví dụ bên dưới OpenGL, OpenGL nào có thể sử dụng)? Điều khiến tôi hỏi là tại sao HĐH 'thường có thể ổn nếu không cài đặt trình điều khiển chính thức; Làm thế nào để họ làm điều đó?

Xin lỗi nếu giả định của tôi là không chính xác. Tôi sẽ rất biết ơn cho công phu về các chủ đề này!


Nó không phải là tất cả các máy tính, nó phụ thuộc vào phần cứng màn hình. Các PC dựa trên dòng tiến hóa của IBM ban đầu chỉ có chế độ văn bản, sau đó các chế độ đồ họa khác nhau đã được thêm vào. Chúng tôi vẫn có di sản đó. Máy tính cũ thường chỉ có chế độ văn bản. Các máy tính khác chỉ có chế độ đồ họa, như Amiga và Macintosh gốc.
hippietrail

Câu trả lời:


25

Đó là (một phần) vai trò của BIOS.

Hệ thống đầu ra đầu vào cơ bản của máy tính chịu trách nhiệm cung cấp giao diện chung cho các hệ điều hành, mặc dù có sự khác biệt như vậy giữa các máy tính thực tế.

Điều đó nói rằng, đối với đồ họa cụ thể, có nhiều cách khác nhau để vẽ lên màn hình. Có các lệnh TTY mà bạn có thể gửi tới BIOS, nhưng đó chỉ ở chế độ thực. Nếu bạn muốn vẽ bất cứ thứ gì trong chế độ được bảo vệ, bạn cần sử dụng VGA để vẽ mọi thứ. Tôi không thể giải thích điều đó tốt hơn OSDev, vì vậy hãy xem ở đây để biết thêm thông tin - nhưng về cơ bản, bạn có thể ghi vào bộ nhớ (bộ nhớ video được ánh xạ bộ nhớ) bắt đầu từ địa chỉ 0xB8000để vẽ mọi thứ trên màn hình.

Nếu bạn cần độ phân giải cao hơn VGA, bạn cần sử dụng các phần mở rộng BIOS VESA; Tôi không quen với nó, nhưng hãy thử xem mã nguồn GRUB để biết thêm thông tin.

Một số tài liệu tham khảo hữu ích:


Nếu bạn tình cờ quen thuộc với D - Tôi đã viết một bộ tải khởi động nhỏ một lúc trước có thể ghi vào màn hình (chỉ văn bản). Nếu bạn quan tâm, đây là mã:

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

Cảm ơn câu trả lời. Tại sao mã nguồn GRUB? Tôi không biết GRUB có liên quan đến đồ họa.
Doddy

2
@panic Grub2 có thể thực hiện một số điều thú vị, bao gồm hiển thị hình ảnh làm nền khi trên menu chọn hệ điều hành. Không chắc chắn về grub.
Izkata

@panic: Tôi không chắc đó là GRUB hay GRUB2 (tôi đã sử dụng "GRUB" một cách tổng quát), nhưng họ chắc chắn có thể chuyển sang độ phân giải 1600x900 trên màn hình của tôi, vì vậy tôi chắc chắn họ sẽ có những thứ bạn có thể xem xét. (Tôi đã xem xét chúng một lúc trước và tôi nhớ chúng rất hữu ích, nhưng tôi đã có một thời gian vì vậy tôi không nhớ chính xác tập tin nào bạn nên xem.)
Mehrdad

thuật ngữ này memory-mappedcó nghĩa là có một vùng "đệm" trong RAM mà CPU (hoặc có một đơn vị DMA nào khác không?) có thể đọc và ghi thay mặt cho cả card đồ họa và chương trình cố ghi vào màn hình không?
n611x007

1
@naxa: Câu hỏi hay ... thông thường, phần cứng được ánh xạ bộ nhớ có nghĩa là có một địa chỉ trong bộ nhớ không thực sự tương ứng với RAM. Thay vào đó, đọc hoặc viết cho nó tương ứng với việc thực hiện một số hành động trên một số phần cứng. Điều đó nói rằng, tôi không chắc làm thế nào bạn có thể phân biệt giữa RAM thực tế và phần cứng làm cho một khối bộ nhớ trông giống như RAM ... có thể đó là RAM thực tế trong trường hợp này, nhưng ấn tượng của tôi là đọc và ghi bị chặn bằng phần cứng.
Mehrdad

25

Từ những ngày đầu của PC IBM và các bản sao của nó, phần cứng bộ điều hợp hiển thị rất đơn giản: một khối bộ nhớ nhỏ được dành riêng cho một lưới các ô ký tự (80x25 ký tự ở chế độ tiêu chuẩn), với hai byte bộ nhớ cho mỗi ô . Một byte đã chọn ký tự và cái còn lại chọn "thuộc tính" của nó - màu nền trước và màu nền cộng với điều khiển nhấp nháy cho bộ điều hợp màu; video đậm, gạch chân, nhấp nháy hoặc đảo ngược cho bộ điều hợp đơn sắc. Phần cứng nhìn lên các pixel từ bảng ROM có hình dạng ký tự theo nội dung của bộ nhớ ký tự.

Để cung cấp một mức độ độc lập phần cứng nhất định, giao diện BIOS cho sơ đồ ký tự yêu cầu phải thực hiện ngắt phần mềm để đặt một ô ký tự duy nhất trên màn hình. Điều này là chậm và không hiệu quả. Tuy nhiên, bộ nhớ ký tự cũng được CPU xử lý trực tiếp, vì vậy nếu bạn biết phần cứng nào có mặt, bạn có thể ghi trực tiếp vào bộ nhớ. Dù bằng cách nào, một khi được đặt, ký tự sẽ vẫn ở trên màn hình cho đến khi thay đổi và tổng bộ nhớ ký tự bạn cần để làm việc là 4000 byte - tương đương với kích thước của một kết cấu đủ màu 32x32!

Trong các chế độ đồ họa, tình huống tương tự; mỗi pixel trên màn hình được liên kết với một vị trí cụ thể trong bộ nhớ và có giao diện pixel set-pixel nhưng công việc hiệu suất cao cần phải ghi trực tiếp vào bộ nhớ. Các tiêu chuẩn sau này như VESA cho phép hệ thống thực hiện một vài truy vấn dựa trên BIOS chậm để tìm hiểu bố cục bộ nhớ của phần cứng, sau đó làm việc trực tiếp với bộ nhớ. Đây là cách một HĐH có thể hiển thị đồ họa mà không cần trình điều khiển chuyên dụng, mặc dù các HĐH hiện đại cũng bao gồm các trình điều khiển cơ bản cho mọi phần cứng của nhà sản xuất GPU chính. Ngay cả thẻ NVidia mới nhất cũng sẽ hỗ trợ một số chế độ tương thích ngược khác nhau, có thể là tất cả các cách trở lại IBM CGA.

Một điểm khác biệt quan trọng giữa đồ họa 3D và 2D là ở chế độ 2D, bạn thường không cần vẽ lại toàn bộ màn hình ở mọi khung hình. Ở chế độ 3D, nếu máy ảnh di chuyển dù chỉ một chút xíu, mọi pixel trên màn hình có thể thay đổi; ở chế độ 2D, nếu bạn không cuộn, hầu hết màn hình sẽ không thay đổi theo từng khung hình và ngay cả khi bạn đang cuộn, bạn thường có thể thực hiện sao chép bộ nhớ nhanh vào bộ nhớ thay vì tổng hợp lại toàn bộ cảnh. Vì vậy, không có gì giống như phải thực hiện INT 10h cho mỗi pixel mỗi khung hình.

Nguồn: Tôi thực sự già


Rất nhiều thông tin, cảm ơn. Tôi ước tôi có thể chấp nhận nhiều hơn một!
Doddy

8

Trong quá trình khởi động, BIOS hệ thống sẽ tìm bộ điều hợp video. Cụ thể, nó tìm kiếm chương trình BIOS tích hợp sẵn của bộ điều hợp video và chạy nó. BIOS này thường được tìm thấy tại vị trí C000h trong bộ nhớ. BIOS hệ thống thực thi BIOS video , khởi tạo bộ điều hợp video.

Các cấp độ hoặc chế độ video / đồ họa mà BIOS có thể hiển thị nguyên bản, không có HĐH hoặc trình điều khiển, chủ yếu phụ thuộc vào chính BIOS Video.

Nguồn / Thông tin thêm tại đây - "Trình tự khởi động hệ thống"


6

Theo như tôi hiểu thì máy tính của chúng tôi đang ở chế độ văn bản, trong đó một ký tự có thể được hiển thị bằng phần mềm ngắt 0x10 khi AH = 0x0e

Bạn đang nói về các chức năng BIOS kế thừa. Trong thực tế, bạn không cần phải sử dụng các chức năng như vậy cả. Bạn trực tiếp ghi chúng vào bộ nhớ video.

Làm thế nào trên trái đất làm máy tính xuất đồ họa ở mức thấp nhất, giả sử, bên dưới HĐH?

Điều này mạnh mẽ phải làm về cách hệ điều hành hoạt động. Dù sao, hoạt động là như nhau ở cấp độ phần cứng: thẻ video có RAM video, lưu trữ (đơn giản hóa) hình ảnh tiếp theo sẽ được vẽ trên màn hình. Bạn có thể nghĩ rằng mỗi địa chỉ là một byte đại diện cho một pixel (thực ra nhìn chung bạn cần nhiều hơn một byte cho mỗi pixel). Sau đó, bộ điều khiển video đảm nhiệm việc dịch điều này thành tín hiệu mà màn hình hiểu.

Có một tiêu chuẩn xác định đầu ra cơ bản của các đỉnh, đa giác, phông chữ, v.v. (ví dụ bên dưới OpenGL, OpenGL nào có thể sử dụng)?

AFAIK, không. Không có tiêu chuẩn về biểu diễn đồ họa logic.

Điều khiến tôi hỏi là tại sao HĐH 'thường có thể ổn nếu không cài đặt trình điều khiển chính thức; Làm thế nào để họ làm điều đó?

Bởi vì nó có trình điều khiển đã được đóng gói với HĐH.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.