免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: dremi
打印 上一主题 下一主题

【疑问】在suse11中断(INT3)处理函数中获取本进程ID问题 [复制链接]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
11 [报告]
发表于 2010-06-29 22:10 |只看该作者
主要是怕跟某个全局变量名字冲突了
你先试试行不行

论坛徽章:
0
12 [报告]
发表于 2010-06-30 09:16 |只看该作者
本帖最后由 dremi 于 2010-06-30 09:55 编辑
主要是怕跟某个全局变量名字冲突了
你先试试行不行
openspace 发表于 2010-06-29 22:10



    这个试过了,不是局部变量的问题!

论坛徽章:
0
13 [报告]
发表于 2010-06-30 09:58 |只看该作者
宏current实际是个函数,把SUSE10、11该函数帖上来看看,估计改了什么地方,和中断冲突了。

论坛徽章:
0
14 [报告]
发表于 2010-06-30 11:28 |只看该作者
宏current实际是个函数,把SUSE10、11该函数帖上来看看,估计改了什么地方,和中断冲突了。
zyr-linux 发表于 2010-06-30 09:58
  1. /* suse11: x86_x64*/
  2. static __always_inline struct task_struct *get_current(void)
  3. {
  4.         return read_pda(pcurrent);
  5. }

  6. #define read_pda(field)                pda_from_op("mov", field)

  7. #define pda_from_op(op, field)                        \
  8. ({                                                \
  9.         typeof(_proxy_pda.field) ret__;                \
  10.         switch (sizeof(_proxy_pda.field)) {        \
  11.         case 2:                                        \
  12.                 asm(op "w %%gs:%c1,%0" :        \
  13.                     "=r" (ret__) :                \
  14.                     "i" (pda_offset(field)),        \
  15.                     "m" (_proxy_pda.field));        \
  16.                 break;                                \
  17.         case 4:                                        \
  18.                 asm(op "l %%gs:%c1,%0":                \
  19.                     "=r" (ret__):                \
  20.                     "i" (pda_offset(field)),        \
  21.                     "m" (_proxy_pda.field));        \
  22.                 break;                                \
  23.         case 8:                                        \
  24.                 asm(op "q %%gs:%c1,%0":                \
  25.                     "=r" (ret__) :                \
  26.                     "i" (pda_offset(field)),        \
  27.                     "m" (_proxy_pda.field));        \
  28.                 break;                                \
  29.         default:                                \
  30.                 __bad_pda_field();                \
  31.         }                                        \
  32.         ret__;                                        \
  33. })
复制代码
suse 10:
  1. i386:
  2. static __always_inline struct task_struct * get_current(void)
  3. {
  4.         return current_thread_info()->task;
  5. }

  6. #define current get_current()

  7. static inline struct thread_info *current_thread_info(void)
  8. {
  9.     struct thread_info *ti;
  10.     __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1)));
  11.     return ti;
  12. }
复制代码
suse1086_x64:64位实现
  1. static inline struct thread_info *current_thread_info(void)
  2. {
  3.         struct thread_info *ti;
  4.         ti = (void *)(read_pda(kernelstack) + PDA_STACKOFFSET - THREAD_SIZE);
  5.         return ti;
  6. }
复制代码
suse10内核中64位的实现和suse11 64位实现是不一样的。

还有一个关键问题忘了说了,
就是在suse11上,应用进程是32位,内核模块都是64位,操作系统默认也都是64位的

而在suse10上,内核和应用程序都是32位

论坛徽章:
0
15 [报告]
发表于 2010-06-30 14:51 |只看该作者
内核里面GS寄存器的作用是干什么的?
从内核代码可以看出,获取current相关信息,都是通过GS寄存器来获取的。

论坛徽章:
0
16 [报告]
发表于 2010-07-01 09:17 |只看该作者
本帖最后由 zyr-linux 于 2010-07-01 09:23 编辑

GS应该没什么问题,这里只是用来存放基地址。
但是在中断处理中调用current至少不是一种标准的用法。

只是调一下current不做任何处理会死机吗?
如果会,那就是current的原因了,继续深究下去,恐怕和中断处理机制有关。

还有,死机会出oops啥的不?

论坛徽章:
0
17 [报告]
发表于 2010-07-01 09:29 |只看该作者
GS应该没什么问题,这里只是用来存放基地址。
但是在中断处理中调用current至少不是一种标准的用法。

只 ...
zyr-linux 发表于 2010-07-01 09:17



   1、 只调用current,不做任何处理,同样会死机,去掉的话,就没有问题了。

  2、你说的oops,不太了解。

论坛徽章:
0
18 [报告]
发表于 2010-07-05 21:45 |只看该作者
这个问题搞定了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP