LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 926|回复: 8

请教:在系统空间得到当前进程task_struct结构的起始地址

[复制链接]
发表于 2005-8-28 11:01:40 | 显示全部楼层 |阅读模式
static inline struct task_struct * get_current()
{
   struct task_struct *current;
  __asm__("andl %%esp,%0; ":"=r" (current):"0" (~8191));
  return current;
}

看得不是太明白,请兄弟们帮忙分析一下!
发表于 2005-8-28 21:10:06 | 显示全部楼层
内核栈是8k,也就是8192个字节,在栈顶(最低地址)处存放了一个指向当前进程的task struct的指针,而esp就是当前的内核态堆栈指针,把他和~8191与一下,就把最后13位都清0了,就是栈顶的地址,再把里面的值赋给current,这样current就得到了当前task struct的指针
回复 支持 反对

使用道具 举报

发表于 2005-8-29 07:45:06 | 显示全部楼层
Post by wuweidaiyi
static inline struct task_struct * get_current()
{
   struct task_struct *current;
  __asm__("andl %%esp,%0; ":"=r" (current):"0" (~8191));
  return current;
}

看得不是太明白,请兄弟们帮忙分析一下!


过时的代码
回复 支持 反对

使用道具 举报

发表于 2005-8-29 08:44:36 | 显示全部楼层
Post by daemeon
过时的代码

呵呵,那我来帖个不过时的吧:


  1.       8 static inline struct task_struct * get_current(void)
  2.       9 {
  3.      10     return current_thread_info()->task;
  4.      11 }
  5.      12
  6.      13 #define current get_current()

  7.      88 static inline struct thread_info *current_thread_info(void)
  8.      89 {
  9.      90     struct thread_info *ti;
  10.      91     __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1)));
  11.      92     return ti;
  12.      93 }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 08:56:40 | 显示全部楼层
谢谢,这是2.4.20-8里面的代码。现在大致明白了,每个进程都要分配8k的系统空间(其中task_struct结构占1k,系统栈7k)。我还有个问题,系统栈里放的是哪些东西?进程另外分配了用户空间,那么在用户空间怎么得到当前进程task_struct结构的起始地址?不好意思,我刚研究内核,见笑了!
回复 支持 反对

使用道具 举报

发表于 2005-8-29 09:04:44 | 显示全部楼层
Post by wuweidaiyi
我还有个问题,系统栈里放的是哪些东西?

系统栈里面放的东西当然就是进程在进入内核以后所使用的局部变量之类(当然还有刚进入内核时压栈的一些寄存器)
Post by wuweidaiyi

进程另外分配了用户空间,那么在用户空间怎么得到当前进程task_struct结构的起始地址?

用户空间不能,也不应该得到这个结构的地址,就算知道了这个地址,也没办法对齐操作,包括读取里面的内容和写入一些数据.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 09:16:30 | 显示全部楼层
谢谢rickxbx 兄。进程运行在用户空间的时候不能操作器系统空间的数据,是吧?请问,进程何时运行在系统空间(内核态),何时运行在用户空间(内核态)?
回复 支持 反对

使用道具 举报

发表于 2005-8-29 09:32:41 | 显示全部楼层
Post by wuweidaiyi
谢谢rickxbx 兄。进程运行在用户空间的时候不能操作器系统空间的数据,是吧?

呵呵,不谢.嗯,是的

Post by wuweidaiyi

请问,进程何时运行在系统空间(内核态),何时运行在用户空间(用户态)?

进程一般情况下运行在用户态,当需要内核服务时(比如要读文件,创建子进程等等)会通过系统调用(所有的系统调用可以在 $(srcdir)/arch/i386/kenel/entry.S 文件中找到)进入内核态
回复 支持 反对

使用道具 举报

发表于 2005-8-29 18:57:21 | 显示全部楼层
esp在8K中指向堆站的站顶指针,把esp的最后13位清零,其余位不变,就得到这8K的起始地址,这个超始地址就是当前进程的描述符task_struct的地址,andl指令就是把esp的后13位清零,%0代表current,也就是把andl的结果放到current中,于是就得到了当前进程的地址。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表