如何在没有stdio的情况下为我的操作系统在c中创建printf函数?

时间:2017-07-04 12:17:19

标签: c operating-system

我想在c中创建一个基本的操作系统,我想制作一个printf 功能。

void printf(char* str){
    (unsigned short*) VideoMemory = (unsigned short*) 0xb800;
    for(int i = 0; str[i] != '\0'; ++i)
        VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
}

kmain()
{   
    printf("Hello from kernel.");
}

但是当我编译它时,我得到了这个错误:

kernel.c:3:20:错误:'VideoMemory'未声明(首次在此函数中使用)   (unsigned short *)VideoMemory =(unsigned short *)0xb800;

1 个答案:

答案 0 :(得分:3)

您似乎瞄准了真实模式的PC BIOS系统。您对VideoMemory的定义不正确。如果编译器在平面模式下使用32位指针,请尝试以下操作:

void printf(char *str) {
    unsigned short *VideoMemory = (unsigned short*)0xb8000UL;
    for (int i = 0; str[i] != '\0'; ++i)
        VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
}

void kmain() {   
    printf("Hello from kernel.");
}

否则,使用16位整数和分段指针,您可能需要使用far__far关键字,例如:

unsigned short far* VideoMemory = (unsigned short far*)0xb8000000UL;

请注意,使用与标准函数不同的语义定义自己的printf版本是个坏主意。它会在程序员之间造成混淆,编译器可能会执行不正确的优化,例如将printf调用转换为其他内容。调用此函数kputstr,直到您可以使用可变参数列表处理格式化,然后将其重命名为kprintf