获取当前进程描述符地址 -- current
来源:互联网 发布:网络诈骗的存在危险性 编辑:程序博客网 时间:2024/04/29 21:34
在内核代码中当需要访问当前进程的task_struct结构时使用的指针current实际上是个宏定义,它是根据当前进程的堆栈指针ESP计算出来的。
注:
(1)THREAD_SIZE(8K)即thread_info结构体的大小
(2)"andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))
将内核堆栈栈顶ESP指针和(~(THREAD_SIZE - 1)相与:获得的结果为内核堆栈最底端地址(也就是结构体thread_info的地址)
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;
}
{
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;
}
{
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 *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;
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
- 获取当前进程描述符地址 -- current
- 获取当前进程的task_struct指针------current宏
- 获取当前进程/线程的ID、句柄和内核地址
- 获取当前进程/线程的ID、句柄和内核地址
- 136----current 获取指针当前单元
- 获取当前地址
- js 获取当前地址
- 获取当前地址
- 获取当前代码地址
- 获取当前URL地址
- 内核中如何得到进程描述符的地址
- 获取当前进程名称
- 获取当前进程ID
- 获取当前进程指针!
- Android 获取当前进程
- 获取当前地址 JS获取当前URL
- Magento 获取当前货币和货币符How to get current currency in Magento
- linux驱动current,引用当前进程,及task_struct
- 生成真正的随机数!
- 格式化输出
- SMB简介
- 用VFP的眼光来看待常见的关系代数
- AT&T与INTEL的汇编语言语法的区别
- 获取当前进程描述符地址 -- current
- 北京找工作
- GCC内嵌汇编之语法详解
- .net之旅-Substitution(32)
- 美国人对中国的评价
- 一个计算机高手的成长
- 利用Eclipse开发Hibernate应用程序
- kk manage
- GCC内嵌汇编简介