今晚花了8个小时1杯咖啡调试sgos2一个bug,最终还是解决了。
在时间消耗上很不划算,不过总算学到东西。
昨晚出现了一个怪问题,尽管我把代码改了又改,还是不知道问题出在哪里。怪问题如下:
我开始怀疑是printf里面溢出了。但是printf经历了那么多次考验,不会有问题的呀。我再想想我之前修改了什么,后来发现是在堆栈上申请了一个buf[4096],我把长度改为1024时没问题。为何会这样呢?
用了各种方法调试,还是很无奈。
到了夜深人静的时候,突然发现反汇编上的alloca函数,这时我才意识到它的作用。
原来,在堆栈上申请大内存,使用的就是这个函数,而当时我写crt的时候忽略了,只是假惺惺地:
extern “C” void _alloca()
{
}
什么事情都没有做。
后来在网上查了一下这个函数需要做的工作,写了以下代码,解决问题!
/*
The better way to do this is to touch every page
while we decrement the stack pointer.
Note: gcc will store the size in eax.
*/
.global __alloca
__alloca:
pushl %edx
movl %esp, %edx
addl $0x8, %edx
subl %eax, %edx
movl %esp, %eax
movl %edx, %esp
movl (%eax), %edx
movl 4(%eax), %eax
jmp *%eax
等待解决问题的时候,我已经把代码改得一团糟了。
现在startup.xml也不用了,用startup.txt,里面的每一行代表一个需要启动的程序。悲剧!
给截图:
SF!Support Only!
小虾, 我真的不是变量名..
To ForeverBell,
FILEBUF * fb = NULL;
我这里经常是i,j,k,fb…
通常,我也是在写算法的时候,才用i j k m n的字母变量名。
在写sgos2的代码中,很少这样做,因为可读性不好。
八错 关注中~
extern "C" void _alloca()
{
}
这是在C++里那么写的嘛?
to shindow, 我只知道在g++里,是这么写C函数的声明的。