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

Io 从标准输出到我的电脑屏幕,io,kernel,cpu,drivers,motherboard,Io,Kernel,Cpu,Drivers,Motherboard,在任何入门课程中,您首先要了解的是System.out.println、printf等打印到标准输出并弹出到屏幕上。我想知道这一过程中的所有详细步骤。简言之,我知道其中涉及以下内容,但我不知道所有细节: 对内核进行系统调用 文本已光栅化 CPU执行程序指令(使用共享库对吗?) 涉及屏幕的驱动程序 CPU与主板上的某些总线(PCI?或PCIe?)通信 总线将数据发送到屏幕 我有一些具体问题: 计算机如何知道标准输出方式放在屏幕上?如果连接了多个屏幕怎么办?它如何从硬盘驱动器或以太网插孔识别屏

在任何入门课程中,您首先要了解的是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倍。如果您有psuedo终端,以下可能是步骤(Linux):

  • 进行系统调用(
    write
    )以向FD 0写入字符串
  • write
    将写入与FD 0关联的文件,该文件很可能连接到PTY的从属控制器。然后,终端仿真器(主控制器)接收输出
  • 它使用某种图形库(GTK、Qt、SDL、OpenGL等)渲染到它的窗口缓冲区。这就是字体幻想将发生的地方
  • 窗口缓冲区被传递给窗口管理器和X窗口系统,它们与所有其他窗口和对象一起绘制
  • 对于视频驱动程序,本系统的两个部分使用了视频驱动程序:xwindows和OpenGL。视频驱动程序由配置文件和硬件发现设置,其中操作系统(或BIOS)探测系统以查找所有可用硬件和加载驱动程序

    CPU如何将数据放入总线?(据我所知,以下内容是针对x86和Linux的)。嗯,数据必须以某种方式进入显卡。它可以通过几种方式发生。视频卡将一些视频内存映射到CPU内存,或者使用x86 I/O端口(
    in
    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端口,是驱动程序参与的地方。因为什么端口以及向它们写入什么取决于图形卡,所以我不会给出示例,但您可以研究一下

    这个问题真的没有用。他们称之为标准输出(简称stdout)的原因是:它是一种标准的输出方式,意味着它在操作系统的任何地方都存在。具体位置取决于操作系统(您没有指定)。有关更多详细信息,请研究您要了解的特定操作系统的内核,因为Linux和Windows(以及其他操作系统)的实现方式不同。投票结束“不是一个真正的问题”。我会举一个任何操作系统的例子。此外,问题不仅仅局限于内核。请不要关闭我的有效问题。@JohnK:虽然这个问题没有关闭(这是一个好问题),但以后尽量缩小你的问题范围。你看到了我的回答有多长,它只是触及了表面。所以,如果你想知道每一步是如何详细工作的,可以单独提问。谢谢你的详细解释。这给了我很多参考资料,我可以查找更多的了解。再次感谢您的时间和努力。@JohnK:当然!很高兴我能帮忙。只要不断地询问和好奇组装!(没有多少人是这样的)。