main.c里面就一个kernel_start()函数。到这可以用c语言写了。接下来的问题是解决打印。否则只能通过单步调试才能知道当前运行到kernel_start()函数了。
先实现一个简单的main.c:
void kernel_start(void)
{
printk_string(0,0,"kenel_start()\n", DISP_FG_GREEN);
while(1);
}
打印字符串只需要VGA Chroma Text Video模式,bios在启动后会初始化前面的1Mbyte内存,其中就包括MDA ChromaText Video模式,地址范围:0xb8000 ~ 0xc0000
每2个字节表示打印一个字符,第一个字节表示要打印的内容,第二个字节表示要打印的颜色。
printk.h源代码:
#ifndef __PRINTK_H__
#define __PRINTK_H__
/*Frontground color*/
#define DISP_FG_BLACK 0x00
#define DISP_FG_BLUE 0x01
#define DISP_FG_GREEN 0x02
#define DISP_FG_CYAN 0x03
#define DISP_FG_RED 0x04
#define DISP_FG_PURPLE 0x05
#define DISP_FG_BROWN 0x06
#define DISP_FG_LIGHT_GRAY 0x07
#define DISP_FG_DARK_GRAY 0x08
#define DISP_FG_LIGHT_BLUE 0x09
#define DISP_FG_LIGHT_GREEN 0x0A
#define DISP_FG_LIGHT_CYAN 0x0B
#define DISP_FG_LIGHT_RED 0x0C
#define DISP_FG_LIGHT_PURPLE 0x0D
#define DISP_FG_YELLOW 0x0E
#define DISP_FG_WHITE 0x0F
/*backgraund color*/
#define DISP_BG_BLACK 0x00
#define DISP_BG_BLUE 0x10
#define DISP_BG_GREEN 0x20
#define DISP_BG_CYAN 0x30
#define DISP_BG_RED 0x40
#define DISP_BG_PURPLE 0x50
#define DISP_BG_BROWN 0x60
#define DISP_BG_LIGHT_GRAY 0x70
#define DISP_BLINK 0x80
#define MAX_PRINT_BUF 1024
#endif