了解printf的硬件

我想知道是否有任何在线资源可以解释什么会发生什么事情,比如printf of C,它解释了在非常低级别发生的事情(BIOS /内核调用)

Linux的:

printf()—>在C库中的printf()—> C库中的write()—>内核中的write()系统调用。

要了解用户空间和内核空间之间的接口,您需要了解系统调用的工作方式。

要了解最低级别的内容,您需要分析内核中的源代码。

Linux系统调用快速参考 (pdf链接)可能很有用,因为它可以识别内核源中您可能开始查找的位置。

有点 printf或printf吗? 这有点模糊。

printf输出到stdout FILE *流; 与之相关的是依赖于系统的,并且还可以被重定向到OS为其提供合适的设备驱动程序的任何其他流设备。 我在嵌入式系统中工作,并且大多数情况下stdout默认情况下是针对串行I / O的UART – 通常是唯一支持的流I / O设备,并且无法重定向。 在用于控制台模式应用程序的GUI OS中,输出以图形方式在系统定义的终端字体中“绘制”到窗口,在Windows中,例如,这可能涉及GDI或DirectDraw调用,后者又访问video硬件的设备驱动程序。 在现代桌面操作系统上,除了初始引导之外,控制台字符输出不涉及BIOS。

简而言之,printf()调用与输出它的硬件之间通常存在大量软件。

这是特定于平台的。 从硬件角度来看,printf()的后端实现可以指向串行端口,非串行LCD等。你真的要问两个问题:

  1. printf()如何解释参数和格式化字符串以生成正确的输出?

  2. 输出如何从printf()传递到目标设备?

您必须记住,应用程序不需要操作系统,内核和BIOS。 嵌入式应用程序通常将printf()和其他IO例程写入字符环缓冲区。 然后,中断可以轮询该缓冲区并操纵输出硬件(LCD,串行端口,激光显示等)以将缓冲的输出发送到正确的目的地。

根据定义,BIOS和内核调用是特定于平台的。 您对哪个平台感兴趣? 已经发布了几个与Linux相关的信息的链接。

另请注意, printf甚至可能不会导致任何BIOS或内核调用,因为您的平台可能没有内核或BIOS(嵌入式系统就是一个很好的例子)。

printf()接受多个参数(可变长度参数函数)。 用户提供字符串和输入参数。

printf()函数创建一个内部缓冲区来构造输出字符串。 现在,printf()遍历用户字符串的每个字符,并将字符复制到输出字符串。 Printf()仅在“%”处停止。

“%”表示存在转换参数(参数的forms为char,int,long,float,double或string)。 它将其转换为字符串并附加到输出缓冲区。 如果参数是字符串,那么它会执行字符串复制。

最后,printf()可能会在用户sting结束时到达,并将整个缓冲区复制到stdout文件。