首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

一段小代码分析解决方案

2012-09-27 
一段小代码分析最近要去面试了,把以前写的代码翻出来看了看,可惜悲剧了,没看多远就给堵住了,求高手讲解。in

一段小代码分析
最近要去面试了,把以前写的代码翻出来看了看,可惜悲剧了,没看多远就给堵住了,求高手讲解。

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.的地址.

热点排行