
據我了解,與 Linux 核心進行基於文字的互動時,init
會啟動一個名為 的程式getty
(或agetty
),該程式連接到下面的 TTY 裝置之一併/dev
提示輸入使用者名稱。此後,login
執行一個名為 的程序,提示使用者輸入密碼,如果正確,則啟動使用者首選的 shell(例如bash
或csh
)。此時,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設定環境用於剛剛通過身份驗證的使用者。