- 论坛徽章:
- 0
|
因为current 只是个宏,在Linux kernel 2.6.8 中current定义由下列代码实现:
static inline struct thread_info *current_thread_info(void)
{
register unsigned long sp asm ("sp");
return (struct thread_info *)(sp & ~0x1fff);
}
static inline struct task_struct *get_current(void)
{
return current_thread_info()->task;
}
#define current (get_current())
因此current 就是内核当前执行的进程的struct task_struct 结构的指针, 能够理解下面两行代码就可以理解这个原理
register unsigned long sp asm ("sp");
return (struct thread_info *)(sp & ~0x1fff);
sp 是寄存器变量,始终等于ARM 当前模式的Stack pointer(r13)的值, Linux内核才创建进程的时候,为每个process 都分配2个连续
的物理页(8KB), 8KB的顶部位descending的stack. 8KB底部存放struct thread_info 结构,thread_info 结构是进程的一个数据结构,
这个结构主要用于任务切换时状态判断和上下文保存(包括进程是否需要被调度出去,抢占计时器,是否有未处理的信号等)这个结构中用个task
指针在进程创建的时候已经初始化指向进程的struct task_struct .
说到调试:
宏是预处理阶段识别的名字,编译后根本就没有宏了,也就是说程序符号表中根本就找不到宏, 所以调试的时候用current 是不行的
调试的时候你只能让gdb告诉你符号(symbol), |
|