【发布时间】:2012-07-03 12:58:10
【问题描述】:
我正在尝试使用 C 制作一个简单的内核。一切都加载并正常工作,我可以访问视频内存和显示字符,但是当我尝试实现一个简单的 puts 函数时,由于某种原因它不起作用。我已经尝试过自己的代码和其他代码。此外,当我尝试使用在函数外部声明的变量时,它似乎不起作用。这是我自己的代码:
#define PUTCH(C, X) pos = putc(C, X, pos)
#define PUTSTR(C, X) pos = puts(C, X, pos)
int putc(char c, char color, int spos) {
volatile char *vidmem = (volatile char*)(0xB8000);
if (c == '\n') {
spos += (160-(spos % 160));
} else {
vidmem[spos] = c;
vidmem[spos+1] = color;
spos += 2;
}
return spos;
}
int puts(char* str, char color, int spos) {
while (*str != '\0') {
spos = putc(*str, color, spos);
str++;
}
return spos;
}
int kmain(void) {
int pos = 0;
PUTSTR("Hello, world!", 6);
return 0;
}
spos(起始位置)的东西是因为我无法创建全局位置变量。 putc 工作正常,但 puts 不行。我也试过这个:
unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
i=(line*80*2);
while(*message!=0)
{
if(*message=='\n') // check for a new line
{
line++;
i=(line*80*2);
*message++;
} else {
vidmem[i]=*message;
*message++;
i++;
vidmem[i]=7;
i++;
};
};
return(1);
};
int kmain(void) {
k_printf("Hello, world!", 0);
return 0;
}
为什么这不起作用?我尝试将我的 puts 实现与我的原生 GCC 一起使用(没有颜色和 spos 数据并使用printf("%c")),它运行良好。
【问题讨论】:
-
问题在哪里?您对您尝试做的某事给出了模糊的指示,但没有提供足够的细节让我们帮助您,也没有提供问题让我们回答。什么是故障模式?你试过什么?
-
PUTCH(strlen("Hi\0")+48, 6);您似乎正在打印一个字符,其值为字符串"Hi\0"+ 48 的长度,这可能是 '2' 的 ASCII 字母(假设您的内核strlen功能是标准的)。你确定这是你想要打印的吗? -
您发布的代码中没有任何内容实际调用 puts()。请完整示例
-
@ugoren 他使用的是 0xb8000,这是自 1981 年以来 IBM PC 中文本模式屏幕的地址(CGA)。 CUDA 还很遥远……
-
您应该将函数宏的所有参数都括起来以避免副作用。像这样:
#define PUTCH(C, X) (pos = putc((C), (X), (pos)))
标签: c pointers x86 kernel osdev