当前位置: 代码迷 >> 驱动开发 >> 一段小代码分析,该如何处理
  详细解决方案

一段小代码分析,该如何处理

热度:17   发布时间:2016-04-28 10:37:27.0
一段小代码分析
最近要去面试了,把以前写的代码翻出来看了看,可惜悲剧了,没看多远就给堵住了,求高手讲解。

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.的地址. 
  相关解决方案