Linux进程内核栈Linux认证考试

文章作者 100test 发表时间 2010:01:08 18:00:03
来源 100Test.Com百考试题网


  在内核2.4中堆栈是这么定义的:

  union task_union {

  struct task_struct task.

  unsigned long stack[INIT_TASK_SIZE/sizeof(long)].

  }.

  而INIT_TASK_SIZE只能是8K。

Linux进程内核栈

  内核为每个进程分配一个task_struct结构时,实际上分配两个连续的物理页面(8192字节),如图所示。底部用作 task_struct结构(大小约为1K字节),结构的上面用作内核堆栈(大小约为7K字节)。访问进程自身的task_struct结构,使用宏操作 current, 在2.4中定义如下:

  #define current get_current()

  static inline struct task_struct * get_current(void)

  {

  struct task_struct *current.

  __asm__("andl %%esp,%0. ":"=r" (current) : "" (~8191UL)).

  return current.

  }

  ~8191UL表示最低13位为0, 其余位全为1。 %esp指向内核堆栈中,当屏蔽掉%esp的最低13后,就得到这个”两个连续的物理页面”的开头,而这个开头正好是task_struct的开始,从而得到了指向task_struct的指针。


相关文章


命令手册:Linux中的ipvsadm命令Linux认证考试
nginx编译openssl版本兼容或排错修复Linux认证考试
使用screen管理你的远程会话Linux认证考试
如何获取linux进程的执行文件路径Linux认证考试
Linux进程内核栈Linux认证考试
一个简单的防止IP攻击的脚本Linux认证考试
solaris10网络配置Linux认证考试
UbuntuLinux系统的分区方案Linux认证考试
如何进入linux单用户模式修改root密码Linux认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛