2017-12-04 5 views
-4
여기

는 C 언어로 프로그램이다 (나는 단순히 VGA_COLOUR 변수를 초기화하는 코드의 일부를 제거)다음 프로그램의 작동 방식을 설명하십시오.

static inline uint8_t vga_entry_color(enum vga_color fg, 
enum vga_color bg) { 
    return fg | bg << 4; 
} 

static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { 
    return (uint16_t) uc | (uint16_t) color << 8; 
} 

size_t strlen(const char* str) { 
size_t len = 0; 
while (str[len]) 
    len++; 
return len; 
} 

static const size_t VGA_WIDTH = 80; 
static const size_t VGA_HEIGHT = 25; 

size_t terminal_row; 
size_t terminal_column; 
uint8_t terminal_color; 
uint16_t* terminal_buffer; 

void terminal_initialize(void) { 
    terminal_row = 0; 
    terminal_column = 0; 
    terminal_color = 
    vga_entry_color(VGA_COLOR_LIGHT_GREY, 
    VGA_COLOR_BLACK); 
    terminal_buffer = (uint16_t*) 0xB8000; 
    for (size_t y = 0; y < VGA_HEIGHT; y++) { 
     for (size_t x = 0; x < VGA_WIDTH; x++) { 
      const size_t index = y * VGA_WIDTH + x; 
      terminal_buffer[index] = vga_entry(' ', terminal_color); 
     } 
    } 
} 

void terminal_setcolor(uint8_t color) { 
    terminal_color = color; 
} 

void terminal_putentryat(char c, uint8_t color, size_t x, 
size_t y) { 
    const size_t index = y * VGA_WIDTH + x; 
    terminal_buffer[index] = vga_entry(c, color); 
} 

void terminal_putchar(char c) { 
    terminal_putentryat(c, terminal_color, terminal_column, terminal_row); 
    if (++terminal_column == VGA_WIDTH) { 
     terminal_column = 0; 
     if (++terminal_row == VGA_HEIGHT) 
      terminal_row = 0; 
    } 
} 

void terminal_write(const char* data, size_t size) { 
    for (size_t i = 0; i < size; i++) 
     terminal_putchar(data[i]); 
} 

void terminal_writestring(const char* data) { 
    terminal_write(data, strlen(data)); 
} 

#if defined(__cplusplus) 
extern "C" /* Use C linkage for kernel_main. */ 
#endif 
void kernel_main(void) { 
    /* Initialize terminal interface */ 
    terminal_initialize(); 

    /* Newline support is left as an exercise. */ 
    terminal_writestring("Hello, kernel World!\n"); 
} 

그것은 OSdev 위키에서이고, 나는이 프로그램의 일부를 이해 할 수 있지만 - 실제로 커널 .c - 함수 "terminal_initilialize", "terminal_putentryat", "terminal_putchar"에 문제가 있습니다. 어떤 설명도 환영합니다.

+1

당신이 생각하는 것이 무엇을 의미하는지 설명하는 것은 어떻습니까? – Unh0lys0da

+0

VGA 보드는'terminal_buffer = (uint16_t *) 0xB8000;'에 자체 메모리를 가지고 있습니다. 해당 메모리에 문자를 쓰면 화면에 나타납니다. 계산은 어떤 메모리 위치가 화면상의 위치에 해당하는지 결정하는 것입니다. –

+0

그러나 나는이 기능에서 "x"와 "y"가 무엇을 의미하는지 이해하지 못합니다. 또한 VGA_WIDTH 및 VGA_HEIGHT는 무엇입니까? – Yahya

답변

-1

이 설명을 통해 몇 가지 힌트를 얻을 수 있기를 바랍니다. 코드 함수를 분석하여 나머지를 파악할 수 있어야합니다.

VGA_WIDTH - 화면의 너비; VGA_HEIGHT - 스크린의 높이

x - 화면에 문자의 수평 위치

y - VGA 카드 선형 메모리의 모든 문자를 유지하기 때문에, 화면

에 문자의 수직 위치 그것 적절한 메모리 위치에 문자를 저장하기위한 내부 버퍼의 색인을 계산하려면 x, y,
VGA_WIDTHVGA_WIDTH을 사용해야합니다.

void terminal_initialize -이 함수는 터미널을 초기화합니다. 화면 전체에 공백을 넣기 만하면됩니다.

void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) 

는 위치 (x, y)에 화면에, 문자 c을 둔다.

void terminal_putchar(char c) - 화면에 문자 c을 넣습니다.

이 함수는 현재 터미널 열과 행을 추적하는 변수가 terminal_columnterminal_row입니다.

관련 문제