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

标签 io kernel cpu drivers motherboard

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

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

我的一些具体问题是:

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

谢谢!

最佳答案

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

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

对于视频驱动程序,本系统的两个部分使用视频驱动程序:X windows 和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 端口,这是驱动程序涉及的地方。因为哪些端口以及写入内容取决于显卡,所以我不会给出示例,但您可以查看它。

关于io - 从标准输出到我的电脑屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207515/

相关文章:

performance - L2 TLB丢失后会发生什么?

language-agnostic - 详尽描述 cpu 体系结构以编写可重定向编译器的文件

performance - SQL Server 2008 大表性能

io - 飞思卡尔处理器中焊盘控制功能的解释?

Python 不从文件读取

unix - 使用 strace 修复挂起的内存问题

c - 如何将测试用例添加到 ltp

cpu - 如何在硬件层面上实现转变?

c++ - 将 std::ostringstream 写入文件而不进行复制?

python - 我已经为 GCSE Computing 创建了一个食谱程序,但我缺少一个步骤