小编Sea*_*ean的帖子

在 Linux 内核中如何处理键盘按下?

我目前正在学习 Linux 内核和操作系统,虽然我发现了很多关于 IRQ、驱动程序、调度和其他重要操作系统概念的优秀资源,以及与键盘相关的资源,但我很难把它们放在一起Linux 内核如何处理键盘上的按钮按下的全面概述。在这个阶段,我并没有试图理解每一个细节,而是试图将概念联系起来,有点全面。

我想到了以下场景:

  1. 我在一台只有一个处理器的 x64 机器上。
  2. 有几个进程正在运行,特别是 Editor VIM( Process #1) 和 say LibreOffice( Process #2)。
  3. 我在里面VIM按 -a键。但是,当前正在运行的进程是Process #2VIM下一个计划)。

这就是我想象现在事情会发生的方式:

  1. 键盘通过一系列步骤生成一个电信号(USB 协议编码),并通过 USB 线发送。
  2. 信号由 USB 控制器处理,并通过 PCI-e(可能还有其他控制器/总线?)发送到中断控制器 ( APIC)。处理器的APIC触发器INT Pin
  3. 处理器切换到Kernel ModeIRQ-Number从 中请求APIC,它用作Interrupt Descriptor Table Register( IDTR)的偏移量。获取描述符,然后用于获取中断处理程序例程的地址。据我了解,这个中断处理程序最初是由键盘驱动程序注册的?
  4. 中断处理程序(在本例中为键盘处理程序)被调用。

这让我想到了我的主要问题:中断处理程序通过哪种机制将按下的键传达给正确的进程 ( Process #1)?它是否真的这样做呢,还是简单的写(通过提供一个被按下的按键到缓冲区char-device?),在某时刻为只读到一个进程(目前“附加”Process #1)?我不明白什么时候 …

drivers keyboard interrupt linux-kernel

2
推荐指数
1
解决办法
2530
查看次数

标签 统计

drivers ×1

interrupt ×1

keyboard ×1

linux-kernel ×1