微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > glibc中的printf如何输出到串口

glibc中的printf如何输出到串口

时间:11-22 来源:互联网 点击:

r_的FD = 2。FILEBUF_LITERAL用于初始化_IO_FILE,定义如下(glibc-2.3.6/libio/libioP.h):

[plain]view plaincopyprint?

  1. #defineFILEBUF_LITERAL(CHAIN,FLAGS,FD,WDP)\
  2. {_IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS,\
  3. 0,0,0,0,0,0,0,0,0,0,0,0,(_IO_FILE*)CHAIN,FD,\
  4. 0,_IO_pos_BAD,0,0,{0},0,_IO_pos_BAD,\
  5. 0}

其中,FD赋值给了_fileno。我们回到vfprintf的分析,vfprintf的具体实现本文就不详细讲解,主要原理是格式化字符串,最后将字符串输出到文件中,也就是stdout中。至于如何输出,则和_IO_file_jumps关系密切,_IO_file_jumps的定义如下:

[plain]view plaincopyprint?

  1. conststruct_IO_jump_t_IO_file_jumps=
  2. {
  3. JUMP_INIT_DUMMY,
  4. JUMP_INIT(finish,INTUSE(_IO_file_finish)),
  5. JUMP_INIT(overflow,INTUSE(_IO_file_overflow)),
  6. JUMP_INIT(underflow,INTUSE(_IO_file_underflow)),
  7. JUMP_INIT(uflow,INTUSE(_IO_default_uflow)),
  8. JUMP_INIT(pbackfail,INTUSE(_IO_default_pbackfail)),
  9. JUMP_INIT(xsputn,INTUSE(_IO_file_xsputn)),
  10. JUMP_INIT(xsgetn,INTUSE(_IO_file_xsgetn)),
  11. JUMP_INIT(seekoff,_IO_new_file_seekoff),
  12. JUMP_INIT(seekpos,_IO_default_seekpos),
  13. JUMP_INIT(setbuf,_IO_new_file_setbuf),
  14. JUMP_INIT(sync,_IO_new_file_sync),
  15. JUMP_INIT(doallocate,INTUSE(_IO_file_doallocate)),
  16. JUMP_INIT(read,INTUSE(_IO_file_read)),
  17. JUMP_INIT(write,_IO_new_file_write),
  18. JUMP_INIT(seek,INTUSE(_IO_file_seek)),
  19. JUMP_INIT(close,INTUSE(_IO_file_close)),
  20. JUMP_INIT(stat,INTUSE(_IO_file_stat)),
  21. JUMP_INIT(showmanyc,_IO_default_showmanyc),
  22. JUMP_INIT(imbue,_IO_default_imbue)
  23. };

至于怎么跳转到这些函数,以及如何跳转到linux内核,由于涉及到glibc的一些细节,这里简单介绍一下进入内核后的情况:进入linux内核后,调用write(),在write之前所有的代码都是C库的代码,可以说是和平台无关的。而涉及到具体输出,就要调用操作系统提供给的接口。调用write()后,通过系统调用进入内核空间,首先是sys_write(),这个函数代码位于fs/read_write.c中。一进入sys_write(),就要根据传进来的fd描述符找到相应的file结构。对于标准输出,fd= 1,每个进程的进程控制块都有一个打开文件的数组files。file结构就是根据fd在这个数组中查找到相应的结构。找到结构后,就会调用file->write()来向外输出。具体输出到哪里,就要看file结构对应的设备驱动是什么。

通过本文可以理解:文件描述符0、1和2和stdout、stdin和stderr对应,如果要修改linux内核中文件描述符相关代码,一定要注意文件描述符0、1和2的分配和回收,否则会导致终端没有输出信息,也无法和内核输入信息。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top