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 0xB8000
untuk 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);
}