Linux的用戶(hù)空間與內(nèi)核空間是什么意思

這篇文章主要介紹Linux的用戶(hù)空間與內(nèi)核空間是什么意思,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

在鄂溫克等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),鄂溫克網(wǎng)站建設(shè)費(fèi)用合理。

一. 簡(jiǎn)介

  • Linux 操作系統(tǒng)和驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間,應(yīng)用程序運(yùn)行在用戶(hù)空間。兩者不能簡(jiǎn)單地使用指針傳遞數(shù)據(jù),因?yàn)長(zhǎng)inux使用的虛擬內(nèi)存機(jī)制,用戶(hù)空間的數(shù)據(jù)可能被換出,當(dāng)內(nèi)核空間使用用戶(hù)空間指針時(shí),對(duì)應(yīng)的數(shù)據(jù)可能不在內(nèi)存中。用戶(hù)空間的內(nèi)存映射采用段頁(yè)式,而內(nèi)核空間有自己的規(guī)則;本文旨在探討內(nèi)核空間的地址映射。
  • os分配給每個(gè)進(jìn)程一個(gè)獨(dú)立的、連續(xù)的、虛擬的地址內(nèi)存空間,該大小一般是4G(32位操作系統(tǒng),即2的32次方),其中將高地址值的內(nèi)存空間分配給os占用,linux os占用1G,window os占用2G;其余內(nèi)存地址空間分配給進(jìn)程使用。
  • 通常32位Linux內(nèi)核虛擬地址空間劃分0~3G為用戶(hù)空間,3~4G為內(nèi)核空間(注意,內(nèi)核可以使用的線(xiàn)性地址只有1G)。注意這里是32位內(nèi)核地址空間劃分,64位內(nèi)核地址空間劃分是不同的。

Linux的用戶(hù)空間與內(nèi)核空間是什么意思

  • 進(jìn)程尋址空間0~4G
  • 進(jìn)程在用戶(hù)態(tài)只能訪(fǎng)問(wèn)0~3G,只有進(jìn)入內(nèi)核態(tài)才能訪(fǎng)問(wèn)3G~4G
  • 進(jìn)程通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)
  • 每個(gè)進(jìn)程虛擬空間的3G~4G部分是相同的
  • 進(jìn)程從用戶(hù)態(tài)進(jìn)入內(nèi)核態(tài)不會(huì)引起CR3的改變但會(huì)引起堆棧的改變

二. Linux內(nèi)核高端內(nèi)存

1. 由來(lái)

當(dāng)內(nèi)核模塊代碼或線(xiàn)程訪(fǎng)問(wèn)內(nèi)存時(shí),代碼中的內(nèi)存地址都為邏輯地址,而對(duì)應(yīng)到真正的物理內(nèi)存地址,需要地址一對(duì)一的映射,如邏輯地址0xc0000003對(duì)應(yīng)的物理地址為0×3,0xc0000004對(duì)應(yīng)的物理地址為0×4,… …,邏輯地址與物理地址對(duì)應(yīng)的關(guān)系為

物理地址 = 邏輯地址 – 0xC0000000:這是內(nèi)核地址空間的地址轉(zhuǎn)換關(guān)系,注意內(nèi)核的虛擬地址在“高端”,但是ta映射的物理內(nèi)存地址在低端。

邏輯地址物理內(nèi)存地址
0xc00000000×0
0xc00000010×1
0xc00000020×2
0xc00000030×3
0xe00000000×20000000
0xffffffff0×40000000 ??

假 設(shè)按照上述簡(jiǎn)單的地址映射關(guān)系,那么內(nèi)核邏輯地址空間訪(fǎng)問(wèn)為0xc0000000 ~ 0xffffffff,那么對(duì)應(yīng)的物理內(nèi)存范圍就為0×0 ~ 0×40000000,即只能訪(fǎng)問(wèn)1G物理內(nèi)存。若機(jī)器中安裝8G物理內(nèi)存,那么內(nèi)核就只能訪(fǎng)問(wèn)前1G物理內(nèi)存,后面7G物理內(nèi)存將會(huì)無(wú)法訪(fǎng)問(wèn),因?yàn)閮?nèi)核 的地址空間已經(jīng)全部映射到物理內(nèi)存地址范圍0×0 ~ 0×40000000。即使安裝了8G物理內(nèi)存,那么物理地址為0×40000001的內(nèi)存,內(nèi)核該怎么去訪(fǎng)問(wèn)呢?代碼中必須要有內(nèi)存邏輯地址 的,0xc0000000 ~ 0xffffffff的地址空間已經(jīng)被用完了,所以無(wú)法訪(fǎng)問(wèn)物理地址0×40000000以后的內(nèi)存。

顯 然不能將內(nèi)核地址空間0xc0000000 ~ 0xfffffff全部用來(lái)簡(jiǎn)單的地址映射。因此x86架構(gòu)中將內(nèi)核地址空間劃分三部分:ZONE_DMA、ZONE_NORMAL和 ZONE_HIGHMEM。ZONE_HIGHMEM即為高端內(nèi)存,這就是內(nèi)存高端內(nèi)存概念的由來(lái)。


在x86結(jié)構(gòu)中,三種類(lèi)型的區(qū)域(從3G開(kāi)始計(jì)算)如下:

ZONE_DMA       內(nèi)存開(kāi)始的16MB

ZONE_NORMAL      16MB~896MB

ZONE_HIGHMEM      896MB ~ 結(jié)束(1G)

Linux的用戶(hù)空間與內(nèi)核空間是什么意思

2. 理解

前 面我們解釋了高端內(nèi)存的由來(lái)。 Linux將內(nèi)核地址空間劃分為三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端內(nèi)存HIGH_MEM地址空間范圍為 0xF8000000 ~ 0xFFFFFFFF(896MB~1024MB)。那么如內(nèi)核是如何借助128MB高端內(nèi)存地址空間是如何實(shí)現(xiàn)訪(fǎng)問(wèn)可以所有物理內(nèi)存?

當(dāng)內(nèi)核想訪(fǎng)問(wèn)高于896MB物理地址內(nèi)存時(shí),從0xF8000000 ~ 0xFFFFFFFF地址空間范圍內(nèi)找一段相應(yīng)大小空閑的邏輯地址空間,借用一會(huì)。借用這段邏輯地址空間,建立映射到想訪(fǎng)問(wèn)的那段物理內(nèi)存(即填充內(nèi)核PTE頁(yè)面表),臨時(shí)用一會(huì),用完后歸還。這樣別人也可以借用這段地址空間訪(fǎng)問(wèn)其他物理內(nèi)存,實(shí)現(xiàn)了使用有限的地址空間,訪(fǎng)問(wèn)所有所有物理內(nèi)存。如下圖。

Linux的用戶(hù)空間與內(nèi)核空間是什么意思

例 如內(nèi)核想訪(fǎng)問(wèn)2G開(kāi)始的一段大小為1MB的物理內(nèi)存,即物理地址范圍為0×80000000 ~ 0x800FFFFF。訪(fǎng)問(wèn)之前先找到一段1MB大小的空閑地址空間,假設(shè)找到的空閑地址空間為0xF8700000 ~ 0xF87FFFFF,用這1MB的邏輯地址空間映射到物理地址空間0×80000000 ~ 0x800FFFFF的內(nèi)存。映射關(guān)系如下:

邏輯地址物理內(nèi)存地址
0xF87000000×80000000
0xF87000010×80000001
0xF87000020×80000002
0xF87FFFFF0x800FFFFF

當(dāng)內(nèi)核訪(fǎng)問(wèn)完0×80000000 ~ 0x800FFFFF物理內(nèi)存后,就將0xF8700000 ~ 0xF87FFFFF內(nèi)核線(xiàn)性空間釋放。這樣其他進(jìn)程或代碼也可以使用0xF8700000 ~ 0xF87FFFFF這段地址訪(fǎng)問(wèn)其他物理內(nèi)存。

從上面的描述,我們可以知道高端內(nèi)存的最基本思想:借一段地址空間,建立臨時(shí)地址映射,用完后釋放,達(dá)到這段地址空間可以循環(huán)使用,訪(fǎng)問(wèn)所有物理內(nèi)存。

看到這里,不禁有人會(huì)問(wèn):萬(wàn)一有內(nèi)核進(jìn)程或模塊一直占用某段邏輯地址空間不釋放,怎么辦?若真的出現(xiàn)的這種情況,則內(nèi)核的高端內(nèi)存地址空間越來(lái)越緊張,若都被占用不釋放,則沒(méi)有建立映射到物理內(nèi)存都無(wú)法訪(fǎng)問(wèn)了。

3. 劃分

內(nèi)核將高端內(nèi)存劃分為3部分:VMALLOC_START~VMALLOC_END、KMAP_BASE~FIXADDR_START和FIXADDR_START~4G。

Linux的用戶(hù)空間與內(nèi)核空間是什么意思


對(duì) 于高端內(nèi)存,可以通過(guò) alloc_page() 或者其它函數(shù)獲得對(duì)應(yīng)的 page,但是要想訪(fǎng)問(wèn)實(shí)際物理內(nèi)存,還得把 page 轉(zhuǎn)為線(xiàn)性地址才行(為什么?想想 MMU 是如何訪(fǎng)問(wèn)物理內(nèi)存的),也就是說(shuō),我們需要為高端內(nèi)存對(duì)應(yīng)的 page 找一個(gè)線(xiàn)性空間,這個(gè)過(guò)程稱(chēng)為高端內(nèi)存映射。

對(duì)應(yīng)高端內(nèi)存的3部分,高端內(nèi)存映射有三種方式:
映射到”內(nèi)核動(dòng)態(tài)映射空間”(noncontiguous memory allocation)
這種方式很簡(jiǎn)單,因?yàn)橥ㄟ^(guò) vmalloc() ,在”內(nèi)核動(dòng)態(tài)映射空間”申請(qǐng)內(nèi)存的時(shí)候,就可能從高端內(nèi)存獲得頁(yè)面(參看 vmalloc 的實(shí)現(xiàn)),因此說(shuō)高端內(nèi)存有可能映射到”內(nèi)核動(dòng)態(tài)映射空間”中。

持久內(nèi)核映射(permanent kernel mapping)
如果是通過(guò) alloc_page() 獲得了高端內(nèi)存對(duì)應(yīng)的 page,如何給它找個(gè)線(xiàn)性空間?
內(nèi)核專(zhuān)門(mén)為此留出一塊線(xiàn)性空間,從 PKMAP_BASE 到 FIXADDR_START ,用于映射高端內(nèi)存。在 2.6內(nèi)核上,這個(gè)地址范圍是 4G-8M 到 4G-4M 之間。這個(gè)空間起叫”內(nèi)核永久映射空間”或者”永久內(nèi)核映射空間”。這個(gè)空間和其它空間使用同樣的頁(yè)目錄表,對(duì)于內(nèi)核來(lái)說(shuō),就是 swapper_pg_dir,對(duì)普通進(jìn)程來(lái)說(shuō),通過(guò) CR3 寄存器指向。通常情況下,這個(gè)空間是 4M 大小,因此僅僅需要一個(gè)頁(yè)表即可,內(nèi)核通過(guò)來(lái) pkmap_page_table 尋找這個(gè)頁(yè)表。通過(guò) kmap(),可以把一個(gè) page 映射到這個(gè)空間來(lái)。由于這個(gè)空間是 4M 大小,最多能同時(shí)映射 1024 個(gè) page。因此,對(duì)于不使用的的 page,及應(yīng)該時(shí)從這個(gè)空間釋放掉(也就是解除映射關(guān)系),通過(guò) kunmap() ,可以把一個(gè) page 對(duì)應(yīng)的線(xiàn)性地址從這個(gè)空間釋放出來(lái)。

臨時(shí)映射(temporary kernel mapping)
內(nèi)核在 FIXADDR_START 到 FIXADDR_TOP 之間保留了一些線(xiàn)性空間用于特殊需求。這個(gè)空間稱(chēng)為”固定映射空間”在這個(gè)空間中,有一部分用于高端內(nèi)存的臨時(shí)映射。

這塊空間具有如下特點(diǎn):
(1)每個(gè) CPU 占用一塊空間
(2)在每個(gè) CPU 占用的那塊空間中,又分為多個(gè)小空間,每個(gè)小空間大小是 1 個(gè) page,每個(gè)小空間用于一個(gè)目的,這些目的定義在 kmap_types.h 中的 km_type 中。

當(dāng)要進(jìn)行一次臨時(shí)映射的時(shí)候,需要指定映射的目的,根據(jù)映射目的,可以找到對(duì)應(yīng)的小空間,然后把這個(gè)空間的地址作為映射地址。這意味著一次臨時(shí)映射會(huì)導(dǎo)致以前的映射被覆蓋。通過(guò) kmap_atomic() 可實(shí)現(xiàn)臨時(shí)映射。

三. 其他

1、用戶(hù)空間(進(jìn)程)是否有高端內(nèi)存概念?

用戶(hù)進(jìn)程沒(méi)有高端內(nèi)存概念。只有在內(nèi)核空間才存在高端內(nèi)存。用戶(hù)進(jìn)程最多只可以訪(fǎng)問(wèn)3G物理內(nèi)存,而內(nèi)核進(jìn)程可以訪(fǎng)問(wèn)所有物理內(nèi)存。

2、64位內(nèi)核中有高端內(nèi)存嗎?

目前現(xiàn)實(shí)中,64位Linux內(nèi)核不存在高端內(nèi)存,因?yàn)?4位內(nèi)核可以支持超過(guò)512GB內(nèi)存。若機(jī)器安裝的物理內(nèi)存超過(guò)內(nèi)核地址空間范圍,就會(huì)存在高端內(nèi)存。

3、用戶(hù)進(jìn)程能訪(fǎng)問(wèn)多少物理內(nèi)存??jī)?nèi)核代碼能訪(fǎng)問(wèn)多少物理內(nèi)存?

32位系統(tǒng)用戶(hù)進(jìn)程最大可以訪(fǎng)問(wèn)3GB,內(nèi)核代碼可以訪(fǎng)問(wèn)所有物理內(nèi)存。

64位系統(tǒng)用戶(hù)進(jìn)程最大可以訪(fǎng)問(wèn)超過(guò)512GB,內(nèi)核代碼可以訪(fǎng)問(wèn)所有物理內(nèi)存。

4、高端內(nèi)存和物理地址、邏輯地址、線(xiàn)性地址的關(guān)系?

高端內(nèi)存只和邏輯地址有關(guān)系,和邏輯地址、物理地址沒(méi)有直接關(guān)系。

以上是“Linux的用戶(hù)空間與內(nèi)核空間是什么意思”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文名稱(chēng):Linux的用戶(hù)空間與內(nèi)核空間是什么意思
轉(zhuǎn)載來(lái)源:http://muchs.cn/article18/iioegp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站改版、定制開(kāi)發(fā)、軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司