获取当前进程指针
2011-07-18 20:03
302 查看
/**2011年4月8日22:49:50*作者:张超*email:uestczhangchao@gmail.com*Linux2.6.32.25中如何获得当前进程的指针?*///Thread_info.h//申明per_cpu_kernel_stack变量,它在其它位置定义,见下文内容.DECLARE_PER_CPU(unsignedlong,kernel_stack); staticinlinestructthread_info*current_thread_info(void) { structthread_info*ti;//存放thread_info的指针 ti=(void*)(percpu_read_stable(kernel_stack)+ KERNEL_STACK_OFFSET-THREAD_SIZE); returnti; } .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
//Percpu.h#definepercpu_read_stable(var)percpu_from_op("mov",per_cpu__##var,\ "p"(&per_cpu__##var)) .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
#definepercpu_from_op(op,var,constraint)\ .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
DEFINE_PER_CPU(unsignedlong,kernel_stack)= .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} thread_union是一个联合体,里面定义了thread_info结构和堆栈结构,THREAD_SIZE在32位平台上一般定义为4K,所以stack的大小其实就是4KB,这就是初始任务在核心里所拥有的所有空间,除去thread_info和KERNEL_STACK_OFFSET占用的空间后,就是任务在核心里实际拥有堆栈的大小。KERNEL_STACK_OFFSET定义为5*8,由于是unsignedlong,所以堆栈底部以上还有5*8*4B=200B的空间用来存放程序运行时相关的环境参数。 //Init_task.c23 /* *Initialthreadstructure. * *WeneedtomakesurethatthisisTHREAD_SIZEalignedduetothe *wayprocessstacksarehandled.Thisisdonebyhavingaspecial *"init_task"linkermapentry.. *///Init_task.c structtask_structinit_task=INIT_TASK(init_task); .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
/* *INIT_TASKisusedtosetupthefirsttasktable,touchat *yourownrisk!.Base=0,limit=0x1fffff(=2MB) */ #defineINIT_TASK(tsk)\ .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
#defineINIT_THREAD_INFO(tsk)\ .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
//宏定义展开过后的结果structthread_info*ti; ti=(void*)(({typeof(per_cpu__kernel_stack)ret__; switch(sizeof(per_cpu__kernel_stack)){ case1:__asm("movb%%fs:%P1,%0":"=q"(ret__):"p"(&per_cpu__kernel_stack));break; case2:__asm("movw%%fs:%P1,%0":"=r"(ret__):"p"(&per_cpu__kernel_stack));break; case4:__asm("movl%%fs:%P1,%0":"=r"(ret__):"p"(&per_cpu__kernel_stack));break; case8:__asm("movq%%fs:%P1,%0":"=r"(ret__):"p"(&per_cpu__kernel_stack));break; default:__bad_percpu_size();}ret__;})+KERNEL_STACK_OFFSET-THREAD_SIZE); .csharpcode,.csharpcodepre { font-size:small; color:black; font-family:consolas,"CourierNew",courier,monospace; background-color:#ffffff; /*white-space:pre;*/ } .csharpcodepre{margin:0em;} .csharpcode.rem{color:#008000;} .csharpcode.kwrd{color:#0000ff;} .csharpcode.str{color:#006080;} .csharpcode.op{color:#0000c0;} .csharpcode.preproc{color:#cc6633;} .csharpcode.asp{background-color:#ffff00;} .csharpcode.html{color:#800000;} .csharpcode.attr{color:#ff0000;} .csharpcode.alt { background-color:#f4f4f4; width:100%; margin:0em; } .csharpcode.lnum{color:#606060;} |
相关文章推荐
- Linux内核获取当前进程指针
- Linux内核获取当前进程指针
- 解析Linux内核获取当前进程指针的方法 [原]
- 获取当前进程指针!
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 获取当前进程的task_struct指针------current宏
- mfc下创建多文档应用程序时获取当前被选中的子窗体指针
- 获取当前进程名称
- 64位环境下32位进程获取64位进程的命令行参数和当前目录
- C语言ftell()函数:获取文件读写指针的当前位置
- viewpager获取当前view报空指针的解决方法
- 获取当前进程描述符地址 -- current
- 获取当前进程ID和子线程的线程ID
- 获取当前进程的寄存器内容
- java获取当前tomcat进程(linux)
- java获取当前进程ID