linux 线程栈,Linux线程之线程栈

中间嵌入了一段汇编代码,代码的本意是取出GS指示的段(对GS不了解的可以查看这篇博文,touch me)。我们看下输出:

linux 线程栈,Linux线程之线程栈_第1张图片

我们惊奇的发现对于child1

1 pthread_create第一参数返回pthread_t类型的值为0xb75ccb40

2 pthread_self返回的pthread_t类型的值为0xb75ccb40

3 GS指示的段(GDT的第六个段)存储的内容还是 0xb75ccb40

对于child2也有类似的情况,三者返回同一个值,what is the magic number mean?只能求助glibc。幸好我们有了源码。首先从pthread_create搞起。

代码在nptl目录下的pthread_create.c下面,比较有意思的是居然没有一个函数叫pthread_create。

__pthread_create_2_0

__pthread_create_2_1

compat_symbol (libpthread, __pthread_create_2_0, pthread_create, GLIBC_2_0)

七度黑光对这个问题有一篇专门的博文解释(touch me),我就不纠缠细节了,总之,pthread_create_2_0调用了pthread_create_2_1,而后者才是真正干活的函数,参数都一样:

int

__pthread_create_2_1 (newthread, attr, start_routine, arg)

pthread_t *newthread;

const pthread_attr_t *attr;

void *(*start_routine) (void *);

void *arg

{

...

struct pthread *pd = NULL;

int err = ALLOCATE_STACK (iattr, &pd);

....

/* Pass the descriptor to the caller. */

*newthread = (pthread_t) pd;

/* Start the thread. */

return create_thread (pd, iattr, STACK_VARIABLES_ARGS);

}

看到了,newthread就是我们传入的地址,它在最后被赋值为pd,pd是在ALLOTCATE_STACK里面赋的值。

ALLOCATE_STACK,我的智商不高,我也看出来它老人家用处是给线程分配栈的。比较下图,ALLOCATE_STACK之前和之后,虚拟地址空间变化。最主要的变化是多了8200KB的一块内存空间。这块区域是在allocate_stack(ALLOCATE_STACK是个宏,本质是allocate_stack函数)函数里面分配的。

你可能感兴趣的:(linux,线程栈)