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

printk的意思?

    来源: 互联网  发布时间:2016-02-11

    本文导语:  底下的組合語言代表著什麼意思呢? 是否有人能詳細說明thx static char buf[1024]; int printk(const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); __asm__("push %%fsnt" "push %%dsnt" "pop %%...

底下的組合語言代表著什麼意思呢?
是否有人能詳細說明thx

static char buf[1024];
int printk(const char *fmt, ...)
{
va_list args;
int i;

va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
__asm__("push %%fsnt"
"push %%dsnt"
"pop %%fsnt"
"pushl %0nt"
"pushl $_bufnt"
"pushl $0nt"
"call _tty_writent"
"addl $8,%%espnt"
"popl %0nt"
"pop %%fs"
::"r" (i):"ax","cx","dx");
return i;
}

|
"push %%fsnt"                  #fs寄存器值入栈, (4字节32位)
"push %%dsnt"                  #ds寄存器值入栈,
"pop %%fsnt"                   #ds出栈保存到fs寄存器
"pushl %0nt"                   #%0对应第一个操作数, 即下面的"r"(i), 也就是i的值保存到一个寄存器中, 然后入栈. 
                                 #i的值是vsprintf的返回值, 也就是写到buf中的字节数.(参数, 4字节32位)
"pushl $_bufnt"                #buf的地址入栈(参数, 4字节32位)
"pushl $0nt"                   #入栈一个空值(分隔?4字节32位)
"call _tty_writent"            #调用写终端函数, 这个函数会按照栈内的数作为参数进行执行, 写到终端上.
"addl $8,%%espnt"              #栈顶指针esp移动8字节, 移动到buf的前面, 相当于两次pop弹出空值和buf地址.
"popl %0nt"                    #恢复变量i.
"pop %%fs"                       #恢复fs寄存器值.
::"r" (i):"ax","cx","dx");       #输入参数i, "r"表示该变量要与寄存器关联, 另外ax cx dx 3个寄存器值在此过程中保持不变.

这里的空值意义我不明白.

|
楼上的赞一个

va_start(args, fmt); 
i=vsprintf(buf,fmt,args); 
va_end(args); 

就表示把printk()里面要打印的字符串保存在buf中。

下面的汇编把buf传进寄存器中,call调用内核函数打印出来。

|
" "pushl $0nt"                   #入栈一个空值(分隔?4字节32位)"
应该就是作为 _tty_write的参数,需要看一下使用调用tty_write的实现,
我猜测这里应该值得是loff_t *ppos,也就是从buf的偏移几位开始打印输出
这里应该就是从buf的启示地址开始打印输出

    
 
 

您可能感兴趣的文章:

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












  • 相关文章推荐
  • [求助]indep_printk(char *fmt,...)重新封装了一下printk,可怎么出错呢?
  • 我的printk在ubuntu中没有输出,怎么回事?
  • printk的问题
  • 请教printk函数的问题
  • printf和printk的区别?
  • printk求助~~~
  • 请教printk问题
  • echo 8 > /proc/sys/kernel/printk
  • printK打印信息在哪里
  • printk顯示問題
  • 在线等!大哥们,printk函数到底怎么看他输出的结果?马上给分
  • 请问printk怎么使用?
  • 请教关于syslogd和printk的几个问题
  • 高分相送 unresolved symbol printk 出错~,在线等待
  • 如何控制printk信息写往哪些控制台?
  • 小问题:用printk如何直接打印出u64类型的大数??
  • printk日志打印问题、、、、??
  • printf和printk的诡异现象,有强人进来解释下的吗?
  • #define PCI9054_MSG(fmt, args...) printK("kERN_WARNING:"fmt,##args)
  • 大喝一声, 请问printk()是c中的函数吗?


  • 站内导航:


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

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

    浙ICP备11055608号-3