获取当前进程描述符地址 -- current

在内核代码中当需要访问当前进程的task_struct结构时使用的指针current实际上是个宏定义,它是根据当前进程的堆栈指针ESP计算出来的。

#define  current get_current()

static  inline  struct  task_struct  *  get_current( void )
{
    
return current_thread_info()->task;
}

static  inline  struct  thread_info  * current_thread_info( void )
{
    
struct thread_info *ti;
    __asm__(
"andl %%esp,%0":"=r" (ti) : "0" (~(THREAD_SIZE - 1)));
    
return ti;
}

#define  THREAD_SIZE     (8192)
注:
(1)THREAD_SIZE(8K)即thread_info结构体的大小
(2)"andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))
将内核堆栈栈顶ESP指针和 (~(THREAD_SIZE - 1)相与:获得的结果为内核堆栈最底端地址(也就是结构体thread_info的地址)
struct  thread_info  {
    
struct task_struct      *task;           
    
struct exec_domain      *exec_domain;  
    unsigned 
long           flags;           
    unsigned 
long           status;          
    __u32                   cpu;                 
    __s32                   preempt_count;
    mm_segment_t            addr_limit;    
    
struct restart_block    restart_block;
    unsigned 
long           previous_esp;  
    __u8                    supervisor_stack[
0];
}
;

struct  task_struct  {
    
volatile long      state; 
    
struct thread_info *thread_info;
    atomic_t           usage;
    unsigned           
long flags;


ESP、thread.info、task_struct、task_struct.thread的关系结构示意图

            |------------|<---0x015fbfff
            |  kernel |  |
            |  stack  |  |
            |         |  |
            |         |  |
            |        /|/ |        current--+--->|--------------|
            |            |                 |    |              |
            |            |<---%%esp        |    |--------------|
            |            |    (ESP)        |    | *thread_info |
            |            |                 |    |--------------|
            |            |                 |    |              |
            |            |                 |    |              |
 -----------|------------|<---0x015fa030   |    |              |
    /|/     |    *task   |-----------------+    |--------------|
     |      |------------|                      |              |
  thread_info|            |                      |    thread    |
     |      |            |                      |              |
    /|/     |            |                      |--------------|
 -----------|------------|<---0x15fa000         |              |
                                                |              |
                                                |--------------|
                                                  task_struct






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值