當(dāng)一個進(jìn)程在執(zhí)行自己的代碼時處于用戶態(tài),當(dāng)這個進(jìn)程因?yàn)橄到y(tǒng)調(diào)用陷入內(nèi)核代碼中執(zhí)行時處于內(nèi)核態(tài)。執(zhí)行的內(nèi)核代碼會使用當(dāng)前進(jìn)程的內(nèi)核棧,每個進(jìn)程都有自己的內(nèi)核棧。
當(dāng)用戶運(yùn)行一個程序時,該程序創(chuàng)建的進(jìn)程開始時運(yùn)行自己的代碼,處于用戶態(tài)。如果要執(zhí)行文件操作、網(wǎng)絡(luò)數(shù)據(jù)發(fā)送等操作必須通過write、send等系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用會調(diào)用內(nèi)核的代碼。進(jìn)程會進(jìn)入內(nèi)核地址空間去執(zhí)行內(nèi)核代碼來完成相應(yīng)的操作,內(nèi)核態(tài)的進(jìn)程執(zhí)行完后又會回到用戶態(tài)。這樣,用戶態(tài)的程序就不能隨意操作內(nèi)核地址空間,具有一定的安全保護(hù)作用,保證進(jìn)程間的地址空間不會互相沖突,一個進(jìn)程的操作不會修改另一個進(jìn)程地址空間中的數(shù)據(jù)。
進(jìn)程從用戶態(tài)切換到內(nèi)核態(tài)常見的有三種方式:系統(tǒng)調(diào)用(如fork調(diào)用)、異常(如缺頁異常)、外圍設(shè)備中斷。