Linux中有多种栈,很容易弄晕,简单说明一下:
1、用户态栈:在进程用户态地址空间底部,跟平时我们简单和理解的一样,就是虚拟地址空间中的一段,不多说~
2、内核栈:
跟用户态栈是独立的,在用户态和内核态切换时,需要进行切换。
默认8k,可以通过内核配置项修改
跟thread_info结构放在一起,公用一个union:thread_union,
-
union thread_union {
-
struct thread_info thread_info;
-
unsigned long stack[THREAD_SIZE/sizeof(long)];
-
};
放在特殊的段中:__(".data.init_task")))
-
union thread_union init_thread_union
-
__attribute__((__section__(".data.init_task"))) =
-
{ INIT_THREAD_INFO(init_task) };
-
ENTRY(stack_start)
-
.long init_thread_union+THREAD_SIZE
-
.long __BOOT_DS
默认跟中断栈共享,可以通过内核配置项修改
属于进程,即每个进程都有自己的内核栈
3、中断栈:
默认跟内核栈共享
与内核栈中的内容独立,相互不可见
中断、异常、软中断使用此栈
使用被打断的进程的内核栈
阅读(4650) | 评论(0) | 转发(0) |