Io 从标准输出到我的电脑屏幕
在任何入门课程中,您首先要了解的是System.out.println、printf等打印到标准输出并弹出到屏幕上。我想知道这一过程中的所有详细步骤。简言之,我知道其中涉及以下内容,但我不知道所有细节:Io 从标准输出到我的电脑屏幕,io,kernel,cpu,drivers,motherboard,Io,Kernel,Cpu,Drivers,Motherboard,在任何入门课程中,您首先要了解的是System.out.println、printf等打印到标准输出并弹出到屏幕上。我想知道这一过程中的所有详细步骤。简言之,我知道其中涉及以下内容,但我不知道所有细节: 对内核进行系统调用 文本已光栅化 CPU执行程序指令(使用共享库对吗?) 涉及屏幕的驱动程序 CPU与主板上的某些总线(PCI?或PCIe?)通信 总线将数据发送到屏幕 我有一些具体问题: 计算机如何知道标准输出方式放在屏幕上?如果连接了多个屏幕怎么办?它如何从硬盘驱动器或以太网插孔识别屏
- 对内核进行系统调用
- 文本已光栅化
- 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的从属控制器。然后,终端仿真器(主控制器)接收输出李>
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:当然!很高兴我能帮忙。只要不断地询问和好奇组装!(没有多少人是这样的)。