⑴ linux 內核空間有進程的概念嗎
關於內核空間和用戶空間,說的是linux驅動程序一般工作在內核空間,但也可以工作在用戶空間。下面將詳細解析,什麼是內核空間,什麼是用戶空間,以及如何判斷他們。
Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G.Linux內核將這4G位元組的空間分為兩部分。將最高的1G位元組(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為"內核空間".而將較低的3G位元組(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為"用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G位元組的虛擬空間。
Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB位元組虛擬內核空間則為所有進程以及內核所共享。
內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處於虛擬空間中。
⑵ 為什麼要劃分為用戶空間和內核空間
Linux虛擬內存的大小為2^32(在32位的x86機器上),內核將這4G位元組的空間分為兩部分。最高的1G位元組(從虛地址
0xC0000000到0xFFFFFFFF)供內核使用,稱為「內核空間」。而較低的3G位元組(從虛地址0x00000000到
0xBFFFFFFF),供各個進程使用,稱為「用戶空間」。因為每個進程可以通過系統調用進入內核,因此,Linux內核空間由系統內的所有進程共享。
於是,從具體進程的角度來看,每個進程可以擁有4G位元組的虛擬地址空間(也叫虛擬內存).
每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB內核空間則為所有進程以及內核所共享。另外,進程的「用戶空間」也叫「地址空間」,在後面的敘述中,我們對這兩個術語不再區分。
用戶空間不是進程共享的,而是進程隔離的。每個進程最大都可以有3GB的用戶空間。一個進程對其中一個地址的訪問,與其它進程對於同一地址的訪問絕不沖
突。比如,一個進程從其用戶空間的地址0x1234ABCD處可以讀出整數8,而另外一個進程從其用戶空間的地址0x1234ABCD處可以讀出整數
20,這取決於進程自身的邏輯。
因此Linux對用戶空間與內核空間的劃分起到了一定程度上的沖突避免。