每个进程都有一个内核栈吗
那这个内核栈里存放着什么呢? 这个进程调用的函数分配的数据? 书上说内核栈的底部存放有thread_info这个结构体,然后又说这个栈是向下增长的,还给了个图
union thread_union { struct thread_info thread_info; unsigned long stack[2048]; /* 对4K的栈数组下标是1024 */};
说这个栈是向下增长的,意思就是栈是向低地址增长的。当进程陷入内核的时候,内核就是使用这个栈来存储局部变量。这个栈很小,x86平台一般只有8KB,因为底部还存放了一个thread_info{},因此只有 8192-sizeof(sturct thread_info)=8140个字节可以使用。
请问是不是像我说的那样一开始是在栈底部放了thread_info结构体,然后从顶部开始使用? 是的没错。
那是不是有一种检查机制看看是否越界? 没有,在内核中如果内核栈溢出,后果自负,因此一般不会在内核态下使用大的局部变量。
感觉最后一个问题怪怪的。。无论是用户态还是内核态,局部变量都存在栈中,因此应该是B把。
|