一、Linux进程切换深入分析#defineCLONE_KERNEL(CLONE_FS|CLONE_FILES|CLONE_SIGHAND)创建内核线程时使用的CLONE标志
1.#defineunlikely(x)__builtin_expect(
(x),0)编译器优化,实际返回值x是整型表达式,0表示并不预期该事件发生,也就是说x为0的可能性很小,这是为了让编译器对下面得语句进行优化
2.进程内核态堆栈结构:进程是动态实体,进程描述符是存放在动态内存中的
在一块进程内存区上,Linux存放了两个数据结构:指向task_struct得thread_info和内核态的进程栈
大小一般2页8K,这要求页面帧对齐2的13次幂,在X86上编译时可以配置大小为4K
thread_info在内存区开始处,内核栈从内存尾向下增长
在C语言中可以用union结构表示:图1
8K内核栈和进程描述符task_struct及thread_info的相互关系unionthread_union{structthread_infothread_info;unsignedlongstack[2048];/*1024for4KBstacks*/};CPU的esp寄存器用于执行堆栈的顶部指针,当从用户态转向内核态时,进程内核栈总是空的,所以esp就会执行堆栈底部
使用alloc_thread_info和free_thread_info用于分配和释放一个存放thread_info结构和内核堆栈的内存区
内核通过当前esp指针可以很方便的得到thread_info结构的地址
current_thread_info(void)的原理即如下:movl$0xffff2000,%ecx/*or0xfffff000for4KBstacks*/andl%esp,%ecxmovl%ecx,pthread_info中ta