那这个内核栈里存放着什么呢?
这个进程调用的函数分配的数据?
书上说内核栈的底部存放有thread_info这个结构体,然后又说这个栈是向下增长的,还给了个图,我不是很明白这点。
难道说在创建这个内核栈之后,会在栈底创建thread_info结构体,然后esp指向栈顶,并开始使用这个栈?
内核栈和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个字节可以使用。
linux一但创建进程就会立刻分配8K,两个页框用来存放栈和thread_info.
请问是不是像我说的那样一开始是在栈底部放了thread_info结构体,然后从顶部开始使用?
是的没错。
那是不是有一种检查机制看看是否越界?
没有,在内核中如果内核栈溢出,后果自负,因此一般不会在内核态下使用大的局部变量。
感觉最后一个问题怪怪的。。无论是用户态还是内核态,局部变量都存在栈中,因此应该是B把。