敲击键盘到屏幕上打印字符计算机都做了什么

embedded/2024/9/24 1:06:05/

当你在 Linux 系统上按下键盘的 x 键并看到屏幕上打印出字母 x 时,Linux 系统内部发生了很多过事情,涉及硬件、操作系统内核和用户空间的多个层次。下面是一个大致的流程:

1. 硬件层

  • 键盘硬件捕获按键:当你按下 x 键,键盘会通过键盘控制器检测到按键动作。
  • 生成扫描码:键盘硬件会生成一个与按键对应的扫描码(Scan Code),表示你按下了哪个键(对于 x 键,会生成特定的扫描码)。这个扫描码通过键盘控制器发送到 CPU。

2. 中断处理

  • 键盘中断(IRQ 处理):扫描码通过中断请求(IRQ 1,专门为键盘保留)通知操作系统键盘事件发生。CPU 暂停当前任务,调用中断处理程序(Interrupt Handler)。
    • CPU 寄存器:为了处理中断,CPU 会保存当前正在运行的程序状态,包括通用寄存器的内容和程序计数器(Program Counter,PC)。这些状态通常会被保存到内存中的中断栈(Interrupt Stack),以便中断处理程序完成后能够恢复。
  • 中断服务程序(Interrupt Service Routine, ISR):内核中的中断服务程序会接收扫描码,并将其翻译成键值(Keycode),然后将其传递到内核的输入子系统。
    • 扫描码转换:扫描码由键盘中断处理程序接收,并通过内核中的键盘驱动程序进行处理。此时,键值会被存储在内核空间的某些数据结构中。
    • 内核使用内存:键值和扫描码会被存储在内核的输入缓冲区中,通常位于内存中的一个环形缓冲区(ring buffer)里,用于暂时存储输入数据。

3. 输入子系统

  • 内核输入处理:Linux 内核的输入子系统会处理键值,将其作为字符输入,并判断应该将其发送到哪个终端(TTY)。
  • TTY(终端)驱动程序:TTY 是 Linux 的虚拟终端。输入子系统将字符发送到相应的 TTY 驱动程序(你的终端模拟器实际上就是通过 TTY 与系统通信)。TTY 驱动程序处理字符并准备输出到终端设备。

4. 用户空间与终端模拟器

  • 终端模拟器接收字符:TTY 驱动程序将字符传递给终端模拟器(例如 gnome-terminalxterm),终端模拟器负责在屏幕上显示字符。
  • 字符显示:终端模拟器根据你当前的字符编码和显示设置,将 x 以图形方式显示在屏幕上。

5. 图形系统(如果使用)

  • 如果你在 X Window 系统或 Wayland 上运行图形终端,终端模拟器会与图形显示服务器(如 Xorg 或 Wayland)进行交互,图形服务器负责在显示器上绘制窗口和字符。

6. 屏幕更新

  • 最终,字符 x 被绘制到显示屏的指定位置,你就会看到屏幕上显示的字母 x

总结

整个过程从按下键盘的 x 键到显示在屏幕上大致包括以下步骤:

  • 键盘检测按键并生成扫描码
  • 通过中断请求传递扫描码到 CPU
  • 内核输入子系统将扫描码翻译为键值
  • TTY 驱动将键值传递到终端模拟器
  • 终端模拟器在屏幕上显示字母 x

这个过程涉及到硬件中断、内核处理和用户空间应用的协调与交互。

在整个按键到显示的过程中,内存和寄存器在多个步骤中发挥了关键作用:

  • 寄存器:用于中断处理、数据传递、程序计数、字符处理等。
  • 内存:用于存储键值、传递字符数据、管理缓冲区、以及图形渲染的显示缓冲区。

寄存器负责处理快速、短暂的数据传输,而内存用于存储较大的数据块,并在内核与用户空间、图形显示等模块之间进行协调。


http://www.ppmy.cn/embedded/112549.html

相关文章

php 实现JWT

在 PHP 中,JSON Web Token (JWT) 是一种开放标准 (RFC 7519) 用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证系统,如 OAuth2 或基于令牌的身份验证。 以下是一个基本的 PHP 实现 JWT 生成和验证的代码示例。 JWT 的组成部分 JWT …

[数据集][目标检测]高铁受电弓检测数据集VOC+YOLO格式1245张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1245 标注数量(xml文件个数):1245 标注数量(txt文件个数):1245 标注…

\section*{References}为什么需要加*

在 LaTeX 中,\section 命令用于创建带有编号的章节标题,比如 “1. Introduction”, “2. Methods” 等。而 \section* 则是创建一个不带编号的章节标题。 为什么需要加 *? 当你使用 \section*{References} 时,添加 * 表示这是一…

国内人工智能产业发展现状及对策研究

一、引言 人工智能作为新时代科技革命和产业变革的核心力量,正深刻改变着全球经济格局。我国政府高度重视人工智能产业发展,将其列为国家战略性新兴产业。在此背景下,本文旨在分析我国人工智能产业发展现状,探讨面临的挑战&#x…

C++ | Leetcode C++题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> count;int ans 0;for (char c : s)count[c];for (auto p : count) {int v p.second;ans v / 2 * 2;if (v % 2 1 and ans % 2 0)ans;}retur…

基于zabbix实现监控Jenkins过程---超详细

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

注意!Facebook已移除细分定位排除受众的功能

上月&#xff0c;Meta发布更新将移除细分定位排除受众的功能&#xff0c;1月31前现有的使用细分定位排除条件的广告仍可继续投放&#xff0c;但新建广告无法使用细分定位排除功能&#xff0c;1月31后所有使用细分定位排除条件的广告都将无法投放&#xff0c;这就意味着广告主们…

VoNR 主要场景的信令与媒体路由总结 VoNR 主要场景总结

目录 1. VoNR主要场景的信令与媒体路由总结 场景 1 主叫都是 VoNR 1.1 VoNR 打 VoNR 的路由 1.2 VoNR 打 VoNR@4G 的路由 1.3 VoNR 打 VoNR@2/3G 的路由 主叫都是 VoNR@4G 1.4 VoNR@4G 打 VoNR 的路由 1.5 VoNR@4G 打 VoNR@4G 的路由 1.6 VoNR@4G 打 VoNR@2/3G 的路由…