linux进程的task_struct和内核堆栈是放在同一个4K页面中的。如下
include/linux/sched.h 2.4.18
union task_union{
struct task_struct task;
unsigned long stack[INIT_TASK_SIZE/sizeof(long)]
};
我在这个地方有一点不解,不是task_struct和内核堆栈都应该存在吗?那为什么用union呢?这样在内存上不是覆盖了吗?
但是在书上的图中画的一个在这块空间的上面,一块在这块空间的下面。请问这又是怎么实现的呢?
于 2013-04-09 18:07:14发表:
task_union是进程0创建进程1时用到的,这个位置是经过精确计算的,task_union正好4K,task_strut占据956B,栈指针esp从高地址开始压栈绝对用不了4K-956B的空间。参考 杨力祥 linux内核设计的艺术
释梵 于 2009-09-16 20:57:38发表:
从内核解析的意思看很明显,它们处于同一个4k区域里的不同部分,是一种从两端向中间的生长。
貌似仅仅是Union并不能达到这个效果,union会使它们重叠~~~~
wang7131984 于 2009-09-16 15:38:31发表:
你应该好好看看C语言,<>。你没完全理解我的意思,我说的是车厢与座位这个单位之间的关系,无论单位的大小,实际上指的都是同一个区域。这种通过union来对内存进行不同粒度的访问在内核中随处可见。
释梵 于 2009-09-16 15:05:43发表:
恐怕不是这个意思吧~~~
在linux中,使用task_struct来表示一个进程,
内核堆栈可能是每一个进程对应的内核调用使用的堆栈,
在2.4及之前的版本这两项放在一个4K的页面中,但是出现了隐患,因为他们是在空间的两端向中间发展的,所以有互相重合的隐患。所以2.6中这部分空间的默认值从原来的4K增大到了8K,而且抽象出了一个thread_info的结构代替原来的task_Struct, 其中放置了一个指针,指向task_struct.
显然不是座位和旅客的关系。
wang7131984 于 2009-09-16 14:28:39发表:
对内存区域的不同划分而已,就好像火车一样,你可以说一个车子有多少车厢一个车厢有少人,也可以说一个火车有多少个座位一个座位有多少个人。但是无论你怎么看,它都是同一辆车。
释梵 于 2009-09-16 14:22:21发表:
那就是说task结构和内核堆栈不是同时存在的喽?
wang7131984 于 2009-09-16 14:07:34发表:
这表示你可以用task结构的形式来访问这块内存区域,也可以用堆栈指针来访问。