【问题标题】:From Standard Out to My PC Screen [closed]从标准输出到我的电脑屏幕 [关闭]
【发布时间】:2012-08-25 19:25:34
【问题描述】:

在任何入门课程中,您学习的第一件事就是 System.out.println、printf 等打印到标准输出并在您的屏幕上弹出。我想知道该过程中的所有详细步骤。简而言之,我知道涉及以下内容,但我不知道所有细节:

  • 对内核进行系统调用
  • 文本被光栅化
  • CPU 执行程序指令(使用共享库对吗?)
  • 涉及屏幕的驱动程序
  • CPU 与主板上的某些总线(PCI?还是 PCIe?)通信
  • 总线将数据发送到屏幕

我的一些具体问题是:

  • 计算机如何知道标准输出意味着放在屏幕上?如果连接了多个屏幕怎么办?它如何从硬盘驱动器或以太网插孔中识别屏幕?
  • 视频驱动程序如何参与到方程式中?它如何知道使用什么驱动程序?
  • CPU 如何将数据放到总线上?例如,它如何知道要写入哪个地址?该地址如何用于将数据发送到写入位置?您能否提供一些在此过程中使用的示例 CPU 指令?

谢谢!

【问题讨论】:

  • 这个问题真的没用。他们称其为标准输出(简称stdout)是有原因的:它是一种标准的输出方式,意味着它存在于操作系统的任何地方的同一个地方。该位置的确切位置取决于操作系统(您没有指定)。有关更多详细信息,请研究您所询问的特定操作系统的内核,因为 Linux 和 Windows(以及其他操作系统)的实现方式不同。投票结束时“不是一个真正的问题”。
  • 我会以任何操作系统为例。此外,问题不仅限于内核。请不要关闭我的有效问题。
  • @JohnK:虽然这个问题没有结束(这是一个很好的问题),但以后尽量缩小你的问题范围。你看到我的回答有多长,而且只是表面上而已。因此,如果您想详细了解每个步骤的工作原理,请将这些问题作为单独的问题提出。

标签: io kernel cpu drivers motherboard


【解决方案1】:

此外,标准输出就是这样。 “屏幕”的概念是操作系统的抽象。例如,在 Linux 和其他一些 UNIX 中,您的进程与 TTY 或 PTY(电传打字机和伪电传打字机)相关联,这是 stdout 可以指向的地方,但不是必须的。 Stdout 可以指向一个文件,一个网络,任何东西!你必须区分真正的终端(想想 Ubuntu 上的 Ctrl-Alt-F1)和伪终端(想想 Konsole、CMD、Terminal.app)。当您有一个伪终端时,它位于一个窗口中,这会使事情复杂 10 倍。如果你有一个伪终端,这里可能是步骤(Linux):

  1. 进行系统调用 (write) 以将字符串写入 FD 0。
  2. write 将写入与 FD 0 关联的文件,该文件很可能连接到您的 PTY 的从控制器。然后,终端仿真器(主控制器)接收输出。
  3. 它使用某种图形库(GTK、Qt、SDL、OpenGL 等)来渲染到它的窗口缓冲区。这就是字体幻想会发生的地方。
  4. 窗口缓冲区被传递给窗口管理器和 X 窗口系统,它们与所有其他窗口和事物一起绘制它。

至于视频驱动,视频驱动被本系统的两个部分使用:X windows 和 OpenGL。视频驱动程序由配置文件和硬件发现设置,其中操作系统(或 BIOS)探测系统以查找所有可用的硬件并加载驱动程序。

CPU 是如何将数据放入总线的? (据我所知,以下是特定于 x86 和 Linux 的)。好吧,数据必须以某种方式到达显卡。它可以通过几种方式发生。视频卡将一些视频内存映射到 CPU 内存,或者您使用 x86 I/O 端口(@98​​7654323@ 和out 指令)。

让我们看看第一种情况。所有视频卡都在段地址 0xb800 处映射一个文本视频缓冲区(有些还在某处映射某种 3d 数据缓冲区,但我不确定)。因此,如果我想将字符串 "Hello, world" 写入视频缓冲区,这里有一些 x86 ASM:

mov es, B800H ;Set the extra segment to the video buffer
mov ds, cs ;Set the data segment
mov esi, hellomsg ;Set the source index to the hellomsg
mov edi, 0 ;Video buffer offset
mov ecx, [hellolen] ;How many characters
rep movsb ;Copy

;;Data
hellomsg db "Hello, world!" ;Null terminated hello world
hellolen dw 13

顺便说一句,这是驱动程序或操作系统级别的 ASM —— 它需要直接访问视频缓冲区,或者至少需要将视频缓冲区映射到您的地址空间。另一个选项,I/O 端口,是驱动程序参与的地方。因为什么端口和写什么取决于显卡,我不会举例,但你可以看看。

【讨论】:

  • 感谢您非常详细的解释。这给了我很多参考资料,我可以查找更多的了解。再次感谢您的时间和精力。
  • @JohnK:当然!很高兴我能帮助你。只是不断地询问和对组装感到好奇! (没有多少人)。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多