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