用戶空間與內(nèi)核空間
我們知道現(xiàn)在操作系統(tǒng)都是采用虛擬存儲器,那么對32位操作系統(tǒng)而言调限,它的尋址空間(虛擬存儲空間)為4G(2的32次方)凿宾。操心系統(tǒng)的核心是內(nèi)核,獨立于普通的應用程序纲仍,可以訪問受保護的內(nèi)存空間呀袱,也有訪問底層硬件設備的所有權(quán)限。為了保證用戶進程不能直接操作內(nèi)核郑叠,保證內(nèi)核的安全夜赵,操心系統(tǒng)將虛擬空間劃分為兩部分,一部分為內(nèi)核空間乡革,一部分為用戶空間寇僧。
針對linux操作系統(tǒng)而言摊腋,將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF),供內(nèi)核使用婉宰,稱為內(nèi)核空間歌豺,而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用心包,稱為用戶空間类咧。
每個進程可以通過系統(tǒng)調(diào)用進入內(nèi)核,因此蟹腾,Linux內(nèi)核由系統(tǒng)內(nèi)的所有進程共享痕惋。于是,從具體進程的角度來看娃殖,每個進程可以擁有4G字節(jié)的虛擬空間值戳。空間分配如下圖所示:
有了用戶空間和內(nèi)核空間炉爆,整個linux內(nèi)部結(jié)構(gòu)可以分為三部分堕虹,從最底層到最上層依次是:硬件-->內(nèi)核空間-->用戶空間。如下圖所示:
需要注意的細節(jié)問題:
- 內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù)芬首,而進程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)赴捞。不管是內(nèi)核空間還是用戶空間,它們都處于虛擬空間中郁稍。
- Linux使用兩級保護機制:0級供內(nèi)核使用赦政,3級供用戶程序使用。
內(nèi)核態(tài)與用戶態(tài)
(1)當一個任務(進程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時耀怜,稱進程處于內(nèi)核運行態(tài)(內(nèi)核態(tài))恢着。此時處理器處于特權(quán)級最高的(0級)內(nèi)核代碼中執(zhí)行。當進程處于內(nèi)核態(tài)時财破,執(zhí)行的內(nèi)核代碼會使用當前進程的內(nèi)核棧掰派。每個進程都有自己的內(nèi)核棧。
(2)當進程在執(zhí)行用戶自己的代碼時左痢,則稱其處于用戶運行態(tài)(用戶態(tài))靡羡。此時處理器在特權(quán)級最低的(3級)用戶代碼中運行。當正在執(zhí)行用戶程序而突然被中斷程序中斷時抖锥,此時用戶程序也可以象征性地稱為處于進程的內(nèi)核態(tài)亿眠。因為中斷處理程序?qū)⑹褂卯斍斑M程的內(nèi)核棧碎罚。
進程上下文與中斷上下文
程序在執(zhí)行過程中通常有用戶態(tài)和內(nèi)核態(tài)兩種狀態(tài)磅废,CPU對處于內(nèi)核態(tài)根據(jù)上下文環(huán)境進一步細分,因此有了下面三種狀態(tài):
(1)內(nèi)核態(tài)荆烈,運行于進程上下文拯勉,內(nèi)核代表進程運行于內(nèi)核空間竟趾。
(2)內(nèi)核態(tài),運行于中斷上下文宫峦,內(nèi)核代表硬件運行于內(nèi)核空間岔帽。
(3)用戶態(tài),運行于用戶空間导绷。
進程上下文
用戶空間的應用程序犀勒,通過系統(tǒng)調(diào)用,進入內(nèi)核空間妥曲。這個時候用戶空間的進程要傳遞 很多變量贾费、參數(shù)的值給內(nèi)核,內(nèi)核態(tài)運行的時候也要保存用戶進程的一些寄存 器值檐盟、變量等褂萧。所謂的“進程上下文”,可以看作是用戶進程傳遞給內(nèi)核的這些參數(shù)以及內(nèi)核要保存的那一整套的變量和寄存器值和當時的環(huán)境等葵萎。
相對于進程而言导犹,就是進程執(zhí)行時的環(huán)境。具體來說就是各個變量和數(shù)據(jù)羡忘,包括所有的寄存器變量谎痢、進程打開的文件、內(nèi)存信息等壳坪。一個進程的上下文可以分為三個部分:用戶級上下文舶得、寄存器上下文以及系統(tǒng)級上下文。
(1)用戶級上下文: 正文爽蝴、數(shù)據(jù)沐批、用戶堆棧以及共享存儲區(qū);
(2)寄存器上下文: 通用寄存器蝎亚、程序寄存器(IP)九孩、處理器狀態(tài)寄存器(EFLAGS)、棧指針(ESP)发框;
(3)系統(tǒng)級上下文: 進程控制塊task_struct躺彬、內(nèi)存管理信息(mm_struct、vm_area_struct梅惯、pgd宪拥、pte)、內(nèi)核棧铣减。
當發(fā)生進程調(diào)度時她君,進行進程切換就是上下文切換(context switch).操作系統(tǒng)必須對上面提到的全部信息進行切換,新調(diào)度的進程才能運行葫哗。而系統(tǒng)調(diào)用進行的模式切換(mode switch)缔刹。模式切換與進程切換比較起來球涛,容易很多,而且節(jié)省時間校镐,因為模式切換最主要的任務只是切換進程寄存器上下文的切換亿扁。
中斷上下文
硬件通過觸發(fā)信號,導致內(nèi)核調(diào)用中斷處理程序鸟廓,進入內(nèi)核空間从祝。這個過程中,硬件的 一些變量和參數(shù)也要傳遞給內(nèi)核引谜,內(nèi)核通過這些參數(shù)進行中斷處理哄褒。所謂的“ 中斷上下文”,其實也可以看作就是硬件傳遞過來的這些參數(shù)和內(nèi)核需要保存的一些其他環(huán)境(主要是當前被打斷執(zhí)行的進程環(huán)境)煌张。中斷時呐赡,內(nèi)核不代表任何進程運行,它一般只訪問系統(tǒng)空間骏融,而不會訪問進程空間链嘀,內(nèi)核在中斷上下文中執(zhí)行時一般不會阻塞。