2014年7月22日 获取当前进程
linux使用了轻量级进程(lightweight process)来对多线程应用程序有更好的支持,在task_struct里面存放了一个thread_info来表示当前正在执行的线程信息,并且在thread_info里也存了一个反向到task_struct的指针以便获得当前进程。
获取当前进程正在运行的进程这个行为在linux内核中是非常频繁的,所以内核为了效率采用了将thread_info和内核栈存放在一起的策略,使用了这么一个联合体:
union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
这里的THREAD_SIZE是指内核栈的大小,通常是两个页框的大小。
在内核线程时,esp存放的就是内核栈的栈顶指针,由于栈的生长方向是从上到下的,所以只要将esp的值与~(THREAD_SIZE-1)进行按位与操作之后,就可以得到栈顶的thread_info的指针位置了,具体的处理过程:
<