当前位置:  技术问答>linux和unix

struct task_struct * get_current(void)函数的解释--help!!

    来源: 互联网  发布时间:2015-03-02

    本文导语:  static inline struct task_struct * get_current(void) { struct task_struct *current; __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); return current;  } 堆栈指针寄存器esp与“~8191UL"相与可以得到当前进程的起始地址。 请问esp里是什...

static inline struct task_struct * get_current(void)
{
struct task_struct *current;
__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));
return current;
 }
堆栈指针寄存器esp与“~8191UL"相与可以得到当前进程的起始地址。
请问esp里是什么内容? ~8191UL 如何解释?UL?
谢谢!

|
get_current() is a routine for getting access to the task_struct of the currently executing task. It uses the often confusing inline assembly features of GCC to perform this, as follows : 

| __asm__( 

This signifies a piece of inline assembly that the compiler must insert into its output code. The __asm__ is the same as asm, but can't be disabled by command line flags. 

| "andl %%esp,%0 

"%%" is a macro that expands to a "%".
"%0" is a macro that expands to the first input/output specification. 

So in this case, it takes the stack pointer (register %esp) and ANDs it into a register that contains 0xFFFFE000, leaving the result in that register. 

Basically, the task's task_struct and a task's kernel stack occupy an 8KB block that is 8KB aligned, with the task_struct at the beginning and the stack growing from the end downwards. So you can find the task_struct by clearing the bottom 13 bits of the stack pointer value. 

| ; " 

The semicolon can be used to separate assembly statements, as can the newline character escape sequence ("n"). 

| :"=r" (current) 

This specifies an output constraint (all of which occur after the first colon, but before the second). The '=' also specifies that this is an output. The 'r' indicates that a general purpose register should be allocated such that the instruction can place the output value into it. The bit inside the brackets - 'current' - is the intended destination of the output value (normally a local variable) once the C part is returned to. 

| : "0" (~8191UL)); 

This specifies an input constraint (all of which occur after the second colon, but before the third). The '0' references another constraint (in this case, the first output constraint), saying that the same register or memory location should be used for both. The '~8191UL' inside the brackets is a constant that should be loaded into the register allocated for the output value before using the instructions inside the asm block. 

See also the gcc info pages, Topic "C Extensions", subtopic "Extended Asm". 


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于select函数中struct timeval问题
  • insert_vm_struct 函数问题请教
  • linux内核tcp_sendmsg函数的struct kiocb *iocb的作用和,相关打印信息的问题(分值有点少,就这么点了,等赚了再加分)
  • java命名空间java.sql类types的类成员方法: struct定义及介绍
  • linux 下结构struct ethhdr,struct iphdr在那个头文件下;谢谢!!
  • java命名空间java.sql接口struct的类成员方法: getsqltypename定义及介绍
  • typedef_struct与struct之间的区别
  • java命名空间java.sql接口struct的类成员方法: getattributes定义及介绍
  • struct sock *sk和 struct sk_buff *skb之间的关系
  • 知道TCP/UDP的包头,如何判断其应用层协议类型,struct tcphdr和 struct udphdr结构中那个变量能判断应用层协议类型。
  • 任意struct問題
  • Linux内核中work_struct的定义
  • struct 也有构造器吗?
  • struct dirent的问题
  • 关于struct timespec的一个问题
  • 没有名字的struct
  • struct in_addr 和 unsigned long的转换
  • 求解struct的大小
  • Python struct.unpack
  • 请教struct sembuf的结构是怎样,急!急!急!!!!!!!!
  • 请问:从哪个header文件中看struct tty_driver的定义
  • 用g++开发,怎么设置结构(struct)1字节对齐?
  • struct timeval结构体的作用是什么呢?谢谢
  • 在Qt中,不知道如何定义结构变量-struct?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3