在UNIX系統中,我們有一個用戶模式和一個內核模式。有一些不能在用戶模式下訪問的指令。但是,當我們執行sudo
時,我們可以訪問我們操作系統的許多關鍵部分,執行重要操作。sudo模式和內核模式有區別嗎?
我的問題是:當程序在sudo
模式下執行時,整個程序是否以內核模式運行?還是這種情況sudo
模式只是一個管理用戶,其權力僅僅是內核可以執行的操作的子集?
在UNIX系統中,我們有一個用戶模式和一個內核模式。有一些不能在用戶模式下訪問的指令。但是,當我們執行sudo
時,我們可以訪問我們操作系統的許多關鍵部分,執行重要操作。sudo模式和內核模式有區別嗎?
我的問題是:當程序在sudo
模式下執行時,整個程序是否以內核模式運行?還是這種情況sudo
模式只是一個管理用戶,其權力僅僅是內核可以執行的操作的子集?
有沒有這樣的事情sudo
模式。只有用戶空間和內核空間。如你所說,內核模式可以執行CPU提供的任何指令並對硬件執行任何操作。用戶模式程序只能訪問映射到正在運行的進程的內存,並且它們被禁止直接訪問硬件。通過系統調用機制,用戶模式程序可以調用內核代碼,代碼將執行硬件訪問並將結果返回到用戶空間。
在用戶空間中,對非root用戶有額外的限制(root
是用戶ID號碼0
)。例如,他們只能訪問某些文件,而且他們只能在1024以上的TCP端口上進行偵聽。運行sudo
將以root用戶身份啓動進程,但沒有這些限制。
但是作爲root用戶運行的進程(通過sudo
)仍然在用戶空間中運行,並且仍然受制於所有相同的限制。
是的,sudo
和kernel模式之間的巨大差異。內核模式涉及CPU modes。大多數處理器(特別是全部運行通用Linux內核,而不是一個),例如您的筆記本電腦中的英特爾處理器有多種操作模式,至少有兩種:特權(或supervisor)模式,其中所有機器指令都是可能的(包括最不安全的模式,如配置MMU,禁用interrupts,停止機器,做物理 I/O即在網絡上發送字節,或發送到打印機或磁盤)和user mode禁止某些機器指令(特別是物理I/O指令,MMU配置,中斷禁用等等)... )
在Linux上,只有內核代碼(包括內核模塊)在內核模式下運行。 其他一切都處於用戶模式。
在syscalls(2)中列出的應用程序(即使是以root身份運行的命令)正在以用戶模式執行,並與Linux內核交互(通過system calls進行交互)(這是應用程序與內核交互的唯一方式)。所以應用程序代碼會看到一個能夠執行系統調用並執行用戶模式指令的「virtual machine」。內核管理認證和證書(見credentials(7) & capabilities(7) ...)
sudo
只是給一個命令(使用setuid技術)root的權限(即用戶ID 0)。然後,可能會有更多系統調用...但是該命令(即運行該命令的process)仍以用戶模式運行,並使用virtual memory並且其address space。
這是管理模式,而不是內核模式。 –
不,以超級用戶身份運行的用戶空間進程仍然是用戶空間進程,而不是在內核上下文中運行的進程。但是,超級用戶可能有能力更改內核代碼,例如通過要求內核加載模塊或通過修改引導時加載內核的存儲。最後,在某些情況下,超級用戶可能能夠執行將原始硬件或內存暴露給用戶空間訪問的調用,隨後可能會從用戶空間執行一些通常只能從內核空間執行的操作。 –
每個用戶空間進程都在特定的用戶帳戶下運行。 'root'實質上只是另一個用戶帳戶;它碰巧擁有比其他用戶帳戶更多的權限。根進程仍在用戶空間中運行(或者在執行系統調用時在內核空間中運行)。 –