Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247503
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-03-07 11:47:35

Linux中有多种栈,很容易弄晕,简单说明一下:
1、用户态栈:在进程用户态地址空间底部,跟平时我们简单和理解的一样,就是虚拟地址空间中的一段,不多说~
2、内核栈:
    跟用户态栈是独立的,在用户态和内核态切换时,需要进行切换。
    默认8k,可以通过内核配置项修改
    跟thread_info结构放在一起,公用一个union:thread_union,

点击(此处)折叠或打开

  1. union thread_union {
  2.     struct thread_info thread_info;
  3.     unsigned long stack[THREAD_SIZE/sizeof(long)];
  4. };
放在特殊的段中:__(".data.init_task")))

点击(此处)折叠或打开

  1. union thread_union init_thread_union
  2.  __attribute__((__section__(".data.init_task"))) =
  3.   { INIT_THREAD_INFO(init_task) };


点击(此处)折叠或打开

  1. ENTRY(stack_start)
  2.     .long init_thread_union+THREAD_SIZE
  3.     .long __BOOT_DS

    默认跟中断栈共享,可以通过内核配置项修改
    属于进程,即每个进程都有自己的内核栈 
3、中断栈:
    默认跟内核栈共享
    与内核栈中的内容独立,相互不可见
    中断、异常、软中断使用此栈
    使用被打断的进程的内核栈


阅读(4650) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~