一段小代码分析
最近要去面试了,把以前写的代码翻出来看了看,可惜悲剧了,没看多远就给堵住了,求高手讲解。
int i = 0;
printk("addr is %x\n", &i);
struct thread_info *p = NULL;
p=(struct thread_info *)((unsigned long)&i & 0xffffe000);
printk("name is %s\n", p->task->comm);
return 0;
module_init()内的具体内容,打印当前进程名,可惜纠结在第四句,为什么要把 &i的后13位给清0后再转成p的地址,求大神讲解。
[解决办法]
以8K为单位,让P的地址取在能够被8K整除的位置上?
[解决办法]
进程内核堆栈底部存放着struct thread_struct.该结构中有一个成员指向当前进程的task_struct.在内核中有一个获取当前进程的thread_struct 的宏。它的定义如下:
#define GET_THREAD_INFO(reg)
movl $THREAD, reg;
andl %esp, reg
THREAD_SIZE定义如下:
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
#else
#define THREAD_SIZE (8192)
#endif
我们讨论常规的8K栈的情况。-THREAD_SIZE即为:0xFFFFE000.
因为栈本身是页面对齐的.所以只要把低13位屏弊掉就是thread_struct.的地址.