นั่นคือ (ส่วนหนึ่ง) บทบาทของ 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);
}