23

我一直想知道这个问题,但仍然没有找到答案。每当我们使用“cout”或“printf”时,屏幕上究竟是如何打印的?文本是如何出现的......(这里可能是一个相当模糊的问题,不管你给我什么都不行。)。那么基本上这些功能是如何制作的?..它是组装吗?如果是这样,那从哪里开始?这带来了更多的问题,比如他们到底是如何制作 openGl/directx 函数的。

把它分解人们把它分解。:)

4

5 回答 5

23

这是一种情况,带有缩写:

  1. printf或者cout将字符放入用户程序地址空间的缓冲区中。
  2. 最终缓冲区填满,或者可能printf要求提前清空缓冲区。无论哪种方式,I/O 库都会调用操作系统,操作系统会将缓冲区的内容复制到自己的空间中。
  3. 假设输出文件绑定到终端,操作系统将字符传递给终端应用程序。
  4. 终端应用程序决定对于缓冲区中的每个字符,它需要在屏幕上绘制像素。
  5. 终端应用程序设置像素绘制指令,并要求窗口管理器代表它执行此操作。(在当今的 Unix 上,这通常是 X 服务器。)
  6. 窗口管理器获取像素。如果窗口在屏幕上实际上是可见的,则窗口管理器会更新一个保存可见像素的缓冲区(称为帧缓冲区)。然后窗口管理器可以通知操作系统,或者更可能的是,窗口管理器与操作系统共谋并且它们共享相同的内存。
  7. 下次刷新屏幕时,硬件会看到帧缓冲区中的新位,并以不同的方式绘制屏幕。
  8. 瞧!你在屏幕上有字符。

熊会跳舞真是太神奇了。

于 2010-03-30T02:39:14.740 回答
19
于 2010-03-30T03:42:03.540 回答
2

好吧,他们通过一堆库函数,最终调用了 write() 系统调用,将数据发送到适当的文件描述符,然后在终端仿真器的 read() 调用中出现(或命令窗口外壳,如果这是 Windows)。终端/外壳使数据被绘制在屏幕上,可能是通过更多的系统调用将其发送到图形系统。

Windows 和 Unix/Linux 的术语是完全不同的,尤其是 shell 的概念在两者中根本不是一回事。但是在这两种情况下,read() 和 write() 调用的使用非常相似。

系统调用是使内核做特定事情的特殊函数;它们的实现方式非常神奇,并且非常依赖于您拥有的处理器类型,但通常是通过导致内核必须整理的某种可恢复的处理器错误。

于 2010-03-30T02:00:09.873 回答
0

魔法真的发生在设备驱动程序中。操作系统为应用程序程序员提供了一个接口。这会得到一定程度的按摩(例如缓冲),然后发送到设备。然后,设备采用通用表示并将其转换为特定设备可以理解的信号。因此,ASCII 会以某种合理的格式显示在控制台上、PDF 文件、打印机或磁盘上,以适合该设备的形式显示。尝试驱动程序不理解的 ASCII(或 UTF8)以外的东西,你会明白我在说什么。

对于操作系统无法处理的事情(例如特殊显卡),应用程序会将数据直接写入设备内存。这就是 DirectX 之类的工作方式(过于简单化了)。

每个设备驱动程序都是不同的。但就它们与操作系统的交互方式而言,它们都是相同的,至少对于每一类设备(磁盘、NIC、键盘等)而言。

于 2010-03-30T02:50:02.007 回答
0

破解打开glibc的源代码,自己看看。

简短的回答,大量的 C 代码,偶尔撒上一些汇编程序。

于 2010-03-30T01:32:15.127 回答