|
最近浏览linux-2.6.0-test9版内核,其中do_exit函数有一个地方我总觉得有问题,当然一定是我
没有理解编写者的意图,请大家帮我分析分析,问题如下:
NORET_TYPE void do_exit(long code)
{
.
.
.
if (tsk->exit_signal == -1 && tsk->ptrace == 0)
release_task(tsk); /* pay attention to this line! */
schedule();
BUG();
/* Avoid "noreturn function does return". */
for (;;) ;
}
上面的release_task函数会对当前进程的task_struct结构调用put_task_struct函数,
而在当前进程的引用数usage减为0时会而调用__put_task_struct函数来释放进程
的核心栈与tast_struct数据结构。而此时内核抢占并没有被禁止,也就是说刚才
释放的核心栈有可能在调用schedule之前被别的进程分配并使用,而等到再调度
刚才那个进程的时候,核心栈已经不可用了,但调用schedule函数本身就要使用
堆栈,那么这不就会出问题吗?请问内核版的高手们,我到底错在哪? |
|