不寻常的内核行为
我正在研究一个基本的内核。我跟随了一些在线课程,并开始从头开始写这个。但是,我在编写这个内核时看到了不寻常的行为。不寻常的内核行为
让我给出一个简单的背景。我正在编写内核,C和引导程序。源代码可用here。
问题:
在打印为const char *,在一些垃圾值,而真正的串0的索引结果只从指数1。现在看到了,我决定坚持这个黑客和继续编码内核,希望稍后解决这个问题。
所以今天早上我正在写更新光标位置的例程。在打印例程中,我更新了代码,将光标位置作为偏移量与我以前使用的x-y坐标一起使用。令我惊讶的是,索引现在从2开始,而不是1.
我不知道哪里出错了。
/** print msg at (x,y) or cursor */ void print_at(const char* msg, int x, int y){
unsigned char *video = (unsigned char *)VIDEO_ADDRESS;
unsigned int offset = 0, i = 1; // i=1?
// decide offset value
if(x>=0||y>=0){
// get offset from coordinates
offset = get_offset(x,y);
}else{
// get cursor
offset = get_cursor();
i+=1; // i=2?
}
while(1){
char c = msg[i];
if(c==0){
// end of string
break;
}else if(c=='\n'||(offset/(2*MAX_ROWS)==MAX_COLS)){
// go to next line
offset = get_offset((offset/(2*MAX_COLS)),MAX_COLS-1);
}else{
// print the character
video[offset] = c;
video[offset+1] = WHITE_ON_BLUE;
}
offset+=2;i++;
}
update_cursor(offset);
}
而且,在我get_offset(INT行,诠释山口)程序,代码异常行为。正常的抵消计算应该是(row*MAX_COLS+col)*2
。
然而,这会导致这样的事情: Screenshot-1
如果我做公式(row*MAX_COLS+col)*2+1
,打印功能是否正常工作:Screenshot-2
我试图寻找到处问我的同事,但我无法得到任何帮助。我如何开始调试它?
回答:
offset/(2 * MAX_COLS)
计算在整数算术。除非正数offset
大于或等于2 * MAX_COLS
,否则表达式的值将为零。
(row * MAX_COLS + col) * 2 + 1
是一个更好的方式来写这个,因为它避免了分割,虽然这可能容易受到int
溢出。
以上是 不寻常的内核行为 的全部内容, 来源链接: utcz.com/qa/264398.html