对于鼠标、键盘和操纵杆驱动程序,它可以X调用"open",然后使用这些驱动程序。
(当我在VirtualBox中检查CentOS 7(仅限文本模式)时,在执行lsof/dev/input/event2(键盘)后,我没有看到X,但我的键盘仍在工作)
tty_open()怎么样?
根据调用跟踪,我们可以大致知道序列:(至少,我们认识一个叫"sys_open"的人)https://bugzilla.redhat.com/show_bug.cgi?id=630464
然而,我仍然不知道谁叫"开放"?
当我在VirtualBox中检查CentOS 7时,在执行lsof/dev/input/event2(键盘)后,我没有看到X,但我的键盘仍然可以工作
这是因为您使用了虚拟控制台,即/dev/ttyN
设备之一。它们直接连接到内核内部的Linux输入事件子系统(通过vt
模块);基本上所有类似键盘的设备都充当到当前活动的虚拟终端的输入。
X本身使用一个虚拟控制台,这样内核就可以在它和任何基于文本的虚拟控制台之间切换。
tty_open()
怎么样?
如果运行sudo lsof /dev/tty[0-9]
,您可以看到哪些进程正在访问虚拟控制台。
名称中包含getty
的进程是提供登录终端的进程。(与串行终端一起使用的程序非常相似;事实上,许多getty程序可以很好地处理虚拟控制台和串行终端。)登录时,getty启动login
(程序!),然后启动为该用户定义的默认shell(请参阅getent passwd username
;它是最后一个字段,必须是/etc/shells
中列出的字段才能允许)。
内核本身支持通过Ctrl+Alt+FnCtrl+Alt+→通常也可以用于切换到上一个或下一个虚拟控制台。
感谢Nominal Animal提供的信息。
我正在跟踪linux 2.0(https://mirrors.edge.kernel.org/pub/linux/kernel/v2.0/),事情可能有点不同。很抱歉,我找不到可链接参考的在线Linux 2.0源代码。
对于键盘,在文本模式下,我认为没有人在内核中调用"open",在"int tty_init(void)"(tty_io.c)中,它将调用"kbd_init();"然后我们可以看到:
request_irq(KEYBOARD_IRQ, keyboard_interrupt, 0, "keyboard", NULL);
因此键盘HW可以与该IRQ&回调('keyboard_interrupt')。
对于tty_open(),我终于在main.c 中看到了它
open("/dev/tty1",O_RDWR,0);
对于较新版本的内核,我认为这部分迁移到了getty应用程序,这就是为什么我在内核源代码中找不到它的原因。
tty_
*例程是独立于UNIX硬件的代码,用于在内核中实现终端接口。他们负责tty规程、作业控制和字符的行模式处理(例如,包括Ctrl-C
上的信号生成)。他们还实现了tty/pty对等的接口。
这是一个通用代码,可以将终端驱动程序的所有通用功能包含在您可以连接的任何类型的硬件中(控制台键盘/显示器只是一个例子,但您至少有uart RS-232C接口、usb串行加密狗、PCI串行线多路复用器等)
终端功能可以追溯到古老的v7unix,并且有许多改进来自BSDunix(如作业控制)
顺便说一句,linux的串行接口实现不是很好,你应该看看BSD的实现。