그것이 BIOS의 역할입니다.
컴퓨터의 기본 입력 출력 시스템은 실제 컴퓨터 간의 차이에도 불구하고 운영 체제에 공통 인터페이스를 제공합니다.
즉, 그래픽의 경우 화면에 다른 방법으로 그리는 방법이 있습니다. BIOS로 보낼 수있는 TTY 명령이 있지만 이는 실제 모드에서만 가능합니다. 보호 모드에서 무언가를 그리려면 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);
}