Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当我按下键盘上的一个键,它显示在一个外壳上时,实际发生的动作路径是什么?_Linux_Shell_Encoding - Fatal编程技术网

Linux 当我按下键盘上的一个键,它显示在一个外壳上时,实际发生的动作路径是什么?

Linux 当我按下键盘上的一个键,它显示在一个外壳上时,实际发生的动作路径是什么?,linux,shell,encoding,Linux,Shell,Encoding,我使用的是通用usb键盘,Linux 2.6.27,带有gnome桌面、gnome终端和bash外壳。我很想知道软件中发生了什么。我的键盘上的特殊字符是如何通过对字符的编码来解释的?字符图片从何而来?分层查看。首先是硬件,Linux内核中的设备驱动程序将有特定的方法通过设备和中断处理程序中的状态寄存器来控制和响应键盘 接下来是Linux内核,它将有一些方法为引导时检测到的每个硬件加载适当的驱动程序。一旦加载,设备驱动程序就符合某些内核驱动程序接口,从设备向内核提供数据,反之亦然 在内核之外,在某

我使用的是通用usb键盘,Linux 2.6.27,带有gnome桌面、gnome终端和bash外壳。我很想知道软件中发生了什么。我的键盘上的特殊字符是如何通过对字符的编码来解释的?字符图片从何而来?

分层查看。首先是硬件,Linux内核中的设备驱动程序将有特定的方法通过设备和中断处理程序中的状态寄存器来控制和响应键盘

接下来是Linux内核,它将有一些方法为引导时检测到的每个硬件加载适当的驱动程序。一旦加载,设备驱动程序就符合某些内核驱动程序接口,从设备向内核提供数据,反之亦然

在内核之外,在某种程度上,设备驱动程序和硬件是可见的,通常作为/dev目录中的列表。需要使用设备的软件(如终端仿真器)将通过/dev中的条目访问设备

用户级应用程序和设备之间的通信现在通过一系列读/写和ioctl操作进行。这些陷阱进入内核(有关详细信息,请参阅手册页),此时内核将与上面加载的设备驱动程序通信

终端仿真器将在您键入字符时(在大多数情况下)以及从设备接收字符时(在大多数情况下)显示字符,这些字符可以使用它可以访问的字体,位于不同的位置,具体取决于应用程序。(我在这里只是泛泛而谈,因为我并不特别了解侏儒)


这有帮助吗?

带有USB驱动程序的Linux输入层从键盘获取扫描码(基本上是“键1向下”或“键1向上”)

X使用其键映射将扫描代码转换为键代码和X输入事件

GTK输入法将输入事件序列转换为合成的unicode字符

Gnome终端用UTF-8为外壳编码这些

贝壳不在乎。它只知道它正在处理多字节编码

shell通过TTY将多字节编码的文本回显

Gnome终端对传入文本进行解码并确定unicode代码点

Gnome终端使用GTK+工具绘制字符

GTK+使用Pango渲染文本,并调用X库将像素绘制到屏幕上

X服务器将字符绘制到屏幕缓冲区,视频卡显示字符

以下是我尝试绘制的图表:


哇。根据使用的详细程度,此问题的答案可以很容易地填满书籍,甚至书架上的书籍。@unwind Agreed。这让我想起了我最喜欢的面试问题,有一次在一家网络公司向我提出。打开浏览器并导航到URL时会发生什么情况?图像已关闭,internet上没有副本:(