每个进程都有一个内核栈吗

songxueyu 2013-12-07 06:01:03
如题。
那这个内核栈里存放着什么呢?
这个进程调用的函数分配的数据?
书上说内核栈的底部存放有thread_info这个结构体,然后又说这个栈是向下增长的,还给了个图,我不是很明白这点。
难道说在创建这个内核栈之后,会在栈底创建thread_info结构体,然后esp指向栈顶,并开始使用这个栈?
...全文
1578 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dhgao38 2015-04-24
  • 打赏
  • 举报
回复
引用 1 楼 nwcfafniw 的回复:
内核栈和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个字节可以使用。
请问当进程陷入内核后,比如使用驱动,在驱动中定义的全局变量。在别的进程进入同样的驱动以后,这个内核全局变量对于两个进程来说是不是都是可见的。 我是想指导进程在自己的内存空间里定义一个全局变量别的进程是不可见的,但是到了内核以后呢。驱动不就是代表这个进程,当驱动定义一个全局变量,别的进程是否可见。
Carl_CCC 2013-12-08
  • 打赏
  • 举报
回复
楼上说得很对了,linux一但创建进程就会立刻分配8K,两个页框用来存放栈和thread_info.
songxueyu 2013-12-08
  • 打赏
  • 举报
回复
引用 5 楼 nwcfafniw 的回复:
请问是不是像我说的那样一开始是在栈底部放了thread_info结构体,然后从顶部开始使用? 是的没错。 那是不是有一种检查机制看看是否越界? 没有,在内核中如果内核栈溢出,后果自负,因此一般不会在内核态下使用大的局部变量。 感觉最后一个问题怪怪的。。无论是用户态还是内核态,局部变量都存在栈中,因此应该是B把。
哦,,谢谢!
LFYer 2013-12-08
  • 打赏
  • 举报
回复
请问是不是像我说的那样一开始是在栈底部放了thread_info结构体,然后从顶部开始使用? 是的没错。 那是不是有一种检查机制看看是否越界? 没有,在内核中如果内核栈溢出,后果自负,因此一般不会在内核态下使用大的局部变量。 感觉最后一个问题怪怪的。。无论是用户态还是内核态,局部变量都存在栈中,因此应该是B把。
songxueyu 2013-12-08
  • 打赏
  • 举报
回复
引用 2 楼 Idle_Cloud 的回复:
楼上说得很对了,linux一但创建进程就会立刻分配8K,两个页框用来存放栈和thread_info.
谢谢! 请问是不是像我说的那样一开始是在栈底部放了thread_info结构体,然后从顶部开始使用?那是不是有一种检查机制看看是否越界? 还有一个问题是我笔试的时候问到的,题目说覆盖以下哪些数据会导致内核栈溢出? A.全局变量 B.局部变量 C.静态变量 D.malloc分配的内存空间 答案是不是B? 不好意思,问题有点多,,,多谢赐教!
songxueyu 2013-12-08
  • 打赏
  • 举报
回复
引用 1 楼 nwcfafniw 的回复:
内核栈和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结构体,然后从顶部开始使用?那是不是有一种检查机制看看是否越界? 还有一个问题是我笔试的时候问到的,题目说覆盖以下哪些数据会导致内核栈溢出? A.全局变量 B.局部变量 C.静态变量 D.malloc分配的内存空间 答案是不是B? 不好意思,问题有点多,,,多谢赐教!
LFYer 2013-12-07
  • 打赏
  • 举报
回复
内核栈和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个字节可以使用。

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧