我一直想知道这个问题,但仍然没有找到答案。每当我们使用 "cout" 或 "printf" 时,它们是如何在屏幕上打印出来的呢?文本是如何呈现的...(可能是一个相当模糊的问题,我会尽力回答你的问题)。因此,这些函数是如何制作的呢?..是汇编吗?如果是,那么从哪里开始呢?这又引发了更多的问题,比如openGL/directx函数是如何制作的...
把它分解开来吧。
我一直想知道这个问题,但仍然没有找到答案。每当我们使用 "cout" 或 "printf" 时,它们是如何在屏幕上打印出来的呢?文本是如何呈现的...(可能是一个相当模糊的问题,我会尽力回答你的问题)。因此,这些函数是如何制作的呢?..是汇编吗?如果是,那么从哪里开始呢?这又引发了更多的问题,比如openGL/directx函数是如何制作的...
把它分解开来吧。
以下是一个使用缩写的情景:
printf
或 cout
将字符放入用户程序内存空间中的缓冲区。printf
要求尽早清空缓冲区。无论哪种情况,I/O库都会调用操作系统,将缓冲区内容复制到操作系统自己的空间。这只熊能跳舞真是太神奇了。
I dig up my old 286 from under the dust and fire up MS-DOS; I compile and run the following program in real mode:
void main(void) {
far long* pTextBuf = (far long*)0xb8000L;
/* Poor man's gotoxy+cprintf imitation -- display "C:" (0x43,0x3a) in
silver-on-black letters in the top-left corner of the screen */
*pTextBuf = 0x073a0743L;
}
I am connecting with my laptop's Windows HyperTerminal to my serial port, which is hooked up with a cable to the back of a SUN box, through which I can access my SUN box's console. From that console I ssh into another box on the network, where I run my program which does printf
, piping its output through more
. The printf
information has traveled through a pipe through more
, then through an SSH pseudo-tty through the network to my SUN box, from there through the serial cable onto my laptop, through Windows' GDI text drawing functions before finally appearing on my screen.
在Norman's answer的基础上增加更多细节,希望能更接近你最初的问题:
printf
和cout<<
通常会在stdout
上执行写入操作,通常是缓冲写入,但不总是如此。cprintf
这样的函数,它们可以直接写入视频内存而不进行任何系统调用,类似于memcpy
风格(参见我上面的286示例)--更多信息请看下文。stdout
是一个系统调用,无论是*nix下的write
,Windows下的WriteFile
或WriteConsole
,还是DOS下的INT 21, 9等。stdout
抽象的优点是它允许操作系统进行一些内部管道连接并执行重定向(无论是到tty描述符、管道、文件、串口、通过套接字连接到另一台机器等)。rxvt
控制台窗口应用程序、PuTTY telnet/ssh客户端、Windows控制台等会:stdout
:rxvt
的情况cprintf
实现还是操作系统),都将写入更小的80x25或80x50等文本缓冲区数组,其中(例如在VGA的情况下)仅需要两个字节来编码每个字符值,例如A
或▒
或♣
(1字节)以及其颜色属性(1字节)--也就是说,它的前景(4位或3位+亮度位)和背景颜
debug
命令。在 -
提示符处,输入 f b800:0000 640 23 2e
命令,以黄色底绿色字的 # 符号填充前10行。 - vladr真正的魔力发生在设备驱动程序中。操作系统提供了一个接口,供应用程序员挂钩。这个接口会被稍微处理一下(例如缓冲),然后发送到设备。设备会将通用表示转换为特定设备可以理解的信号。因此,ASCII以适合该设备的形式显示在控制台上,或者显示在PDF文件、打印机或磁盘上。尝试使用驱动程序不理解的其他内容(而不是UTF8),您将看到我所说的内容。
对于操作系统无法处理的事物(例如特殊的图形卡),应用程序直接将数据写入设备内存。这就是类似DirectX的东西如何工作的(过度简化)。
每个设备驱动程序都是不同的。但至少对于每种设备类别(磁盘、NIC、键盘等),它们与操作系统的接口方式是相同的。