了解printf的硬件

时间:2010-03-16 19:59:10

标签: c hardware

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

5 个答案:

答案 0 :(得分:27)

Linux:

  

printf()---> C库中的printf()--->在C库中写() - >在内核中写入()系统调用。

要理解用户空间和内核空间之间的接口,您需要了解system calls的工作原理。

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

Linux system call quick reference (pdf链接)可能很有用,因为它可以识别您可能开始查看内核源代码的位置。

答案 1 :(得分:4)

某些喜欢 printf,还是具体的printf?这有点模糊。

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

处停止

"%"意味着有一个转换参数(参数的形式为char,int,long,float,double或string)。它将其转换为字符串并附加到输出缓冲区。如果参数是字符串,那么它会执行字符串复制。

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