获取当前进程描述符地址 -- current
2007-01-10 16:43
393 查看
在内核代码中当需要访问当前进程的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
#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
相关文章推荐
- 获取当前进程文件所在目录,用于替代GetCurrentDirectory
- 获取当前进程/线程的ID、句柄和内核地址
- 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()
- 获取当前进程/线程的ID、句柄和内核地址
- 获取当前进程/线程的ID、句柄和内核地址
- 根据经纬度获取当前地址
- PHP获取当前完整URL地址的函数
- 使用cmd命令里的 tasklist 和 netstat 获取当前各进程的网络连接
- 系统进程信息的获取和当前进程的终止
- C#:获取当前时间的总毫秒值(类似于Java中:System.currentTimeMillis() )
- java使用System.currentTimeMillis()获取当前时间戳而不要用new Date()
- iOS. 原生获取当前经度 纬度。 地址
- asp.net获取当前页面的url地址
- 在windows里通过进程控制块获取所有当前所有进程-其实非常简单
- 通过进程ID获取基地址
- Current_Path 获取脚本所在路径(当前路径),取当前时间做文件名(uformat)
- WinAPI: GetCurrentPositionEx - 获取当前的画笔位置
- 获取系统当前的进程及模块信息
- PHP获取当前页面完整URL地址
- 获取当前打开剪贴板的进程的ID