谁在 linux 内核中调用 tty_open() ?

who call tty_open() in linux kernel?

对于鼠标、键盘和操纵杆驱动程序,它可能会调用 'open' 然后使用这些驱动程序。

(当我在 VirtualBox 中检查 CentOS 7(仅限文本模式)时,在执行 lsof /dev/input/event2(键盘)后我没有看到 X,但我的键盘仍在工作)

tty_open() 怎么样?

根据调用trace,我们可以大致知道顺序: (至少,我们认识一个叫 'sys_open' 的人) https://bugzilla.redhat.com/show_bug.cgi?id=630464

可是,我还是不知道谁叫'open'?

When I check CentOS 7, text mode only, in VirtualBox, I didn't see X after executed lsof /dev/input/event2 (keyboard), but my keyboard still works

那是因为你当时使用了virtual console,其中一个/dev/ttyN设备。这些直接连接到内核本身内部的 Linux 输入事件子系统(通过 vt 模块);基本上所有类似键盘的设备都充当当前活动虚拟终端的输入。

X 本身使用虚拟控制台,这样内核就可以在它和任何基于文本的虚拟控制台之间切换。

How about tty_open()?

如果您 运行 sudo lsof /dev/tty[0-9],您可以看到哪些进程正在访问虚拟控制台。

名称中带有getty的进程是提供登录终端的进程。 (与串行终端一起使用的那些非常相似;事实上,许多 getty 程序都可以很好地处理虚拟控制台和串行终端。) 当您登录时,getty 会启动 login(程序!),它会依次启动为该用户定义的默认 shell(请参阅 getent passwd username;它是最后一个字段,并且必须是 /etc/shells 中列出的被允许的)。

内核本身支持通过Ctrl+Alt+Fn[=40=切换到不同的虚拟控制台](F1 代表 tty1,F2 代表 tty2,依此类推)。如果您使用合适的图形驱动程序,您甚至可以在 Xorg 和虚拟控制台之间切换。 (通常,Xorg 在 tty6 或 tty7 上是 运行,但这因发行版而异。) Ctrl+Alt+Ctrl+Alt+通常也可以用于切换到上一个或下一个虚拟控制台。

感谢 Nominal Animal 提供的信息。

我正在跟踪 linux 2.0 ( https://mirrors.edge.kernel.org/pub/linux/kernel/v2.0/ ),事情可能有点不同。 抱歉,我找不到在线 Linux 2.0 来源以供 link 参考。

对于键盘,在文本模式下,我认为没有人在内核中调用 'open', 在 'int tty_init(void)' ( tty_io.c ) 中,它将调用 'kbd_init();' 然后我们可以看到:

request_irq(KEYBOARD_IRQ, keyboard_interrupt, 0, "keyboard", NULL);

因此,键盘硬件可以使用此 IRQ 和回调 ('keyboard_interrupt')。

为了tty_open(),终于在main.c看到了

open("/dev/tty1",O_RDWR,0);

对于较新版本的内核,我认为这部分已迁移到getty应用程序,这就是我在内核源代码中找不到它的原因。

tty_* 例程是 UNIX 硬件独立代码,用于在内核中实现终端接口。他们负责 tty 规程、作业控制内容和字符的行模式处理(例如,包括 Ctrl-C 上的信号生成)他们还实现 tty/pty 对等的接口。

这是通用代码,可将终端驱动程序的所有通用功能包含到您可以附加的任何类型的硬件中(控制台 keyboard/display 只是一个示例,但您至少有 uart RS -232C 接口、usb 串行加密狗、PCI 串行线路多路复用器等)

终端功能可追溯到古老的 v7 unix,并有许多来自 BSD unix 的改进(如作业控制)

顺便说一下,linux串行接口的实现不是很好,你应该看看BSD的实现。