从标准输出到我的电脑屏幕



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

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

我有一些具体的问题是:

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

谢谢

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

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

在视频驱动程序方面,该系统的两个部分使用视频驱动程序:Xwindows和OpenGL。视频驱动程序由配置文件和硬件发现设置,其中操作系统(或BIOS)探测系统以找到所有可用的硬件和加载驱动程序。

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

让我们看看第一种情况。所有的视频卡都在段地址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端口,是驱动程序参与的地方。因为什么端口和向它们写入什么是图形卡相关的,所以我不举一个例子,但你可以研究一下。

最新更新