X11如何与内核交互/执行登录

X11如何与内核交互/执行登录

据我了解,与 Linux 内核进行基于文本的交互时,init会启动一个名为 的程序getty(或agetty),该程序连接到下面的 TTY 设备之一/dev并提示输入用户名。此后,login运行一个名为 的程序,提示用户输入密码,如果正确,则启动用户首选的 shell(例如bashcsh)。此时,bash 通过 TTY 设备与内核进行交互。

X11 的登录流程如何? X11 是否通过 TTY 与内核交互?

答案1

shell 使用 TTY 设备(如果已连接到该设备)来获取用户输入并生成输出,仅此而已。 shell 连接到 TTY 的事实由 确定getty(并由 保存login);大多数时候 shell 并不关心它是否连接到 TTY。它与内核的交互发生通过系统调用。

X11 服务器不知道登录(就像 shell 一样)。 X11 中的登录过程有两种工作方式:

  • 用户登录终端,然后启动 X(通常使用startx);
  • 或者 X 服务器使用“显示管理器”启动,提示用户输入登录名和密码(或任何需要的身份验证信息)。

与 shell 相比,X11 服务器获取输入和产生输出的方式非常不同。在输入方面,X 知道 shell 不知道的设备,从鼠标开始;它通常使用自己的驱动程序直接管理这些。即使对于键盘,X 也有自己的驱动程序来补充内核的处理(据我所知,在 Linux 上,例如 X 使用 TTY 驱动程序从键盘读取原始输入,然后使用自己的驱动程序解释该输入)。在输出端,X 直接驱动显示设备,无论有或没有内核的帮助,并且不通过 TTY 设备。

许多系统上的 X11 服务器不过,使用 TTY 设备来与内核同步:在支持虚拟终端的系统上,X 需要“保留”它正在运行的 VT,并处理 VT 切换。在此过程中还有一些其他的微妙之处;因此,在 Linux 上,X 调整 TTY 以禁用 GPM(允许以文本模式使用鼠标的程序)。 X也可以共享一个VT...

在过去的一些工作站上,与内核没有太多明确的同步;如果你没有运行xconsole,你最终可能会在 X11 显示屏的顶部以“文本模式”显示内核消息。

答案2

内核完全没有登录的概念,或者谁登录的概念——它只关心是否有进程在某个用户 ID 下运行(这也与内核无关!)。登录程序,无论是终端上的 getty 还是 X11 显示管理器,都以 root 身份运行,然后使用 setuid() 和相关调用来为本地解析器(NSS 和 libc 的东西 - 也不是内核业务)建议的任何 UID 设置环境用于刚刚通过身份验证的用户。

相关内容