91精品一区二区三区久久久久久_欧美一级特黄大片色_欧美一区二区人人喊爽_精品一区二区三区av

位置:51電子網 » 電子資訊 » 行業動態

Linux內核高端內存理解劃分

發布時間:2019/3/5 10:17:02 訪問次數:51928



apsint2012 2000w aps int系列12v dc 230v ac逆變器/充電器是可靠的電源

適用于從電動工具和泵到便攜式照明和計算機的各種設備

重載條件下的設備。沒有煙霧,燃料或噪音,它是一個很好的替代品

發電機功率。

dc-ac逆變器具有自動線電轉換開關和集成充電功能

允許其作為車輛逆變器,獨立交流電源或擴展運行ups的系統。



51電子網公益庫存:
AP2138N-1.8TRG1
AP2138N-2.5TRG1
BV726C
FDPF33N25T
FF450R12KT4
GD32F350C8T6
FP25R12KT3
FP25R12KT4
FP40R12KT3
FP50R12KT3
IRFR1205TRPBF
IRFR120NTRPBF
LM3406MHX/NOPB
LD1085D2T33R
LIS3DHTR
KXCJ9-1008
L4981AD013TR
LM2596R-ADJ
LMR16030PDDAR
FS100R12KT3
IRF3710PBF
IRF3808PBF


linux內核高端內存的理解

前面我們解釋了高端內存的由來。 linux將內核地址空間劃分為三部分zone_dma、zone_normal和zone_highmem,高端內存high_mem地址空間范圍為0xf8000000 ~ 0xffffffff(896mb~1024mb)。那么如內核是如何借助128mb高端內存地址空間是如何實現訪問可以所有物理內存?

當內核想訪問高于896mb物理地址內存時,從0xf8000000 ~ 0xffffffff地址空間范圍內找一段相應大小空閑的邏輯地址空間,借用一會。借用這段邏輯地址空間,建立映射到想訪問的那段物理內存(即填充內核pte頁面表),臨時用一會,用完后歸還。這樣別人也可以借用這段地址空間訪問其他物理內存,實現了使用有限的地址空間,訪問所有所有物理內存。如下圖。

http://msldz.51dzw.com


例如內核想訪問2g開始的一段大小為1mb的物理內存,即物理地址范圍為0x80000000 ~ 0x800fffff。訪問之前先找到一段1mb大小的空閑地址空間,假設找到的空閑地址空間為0xf8700000 ~ 0xf87fffff,用這1mb的邏輯地址空間映射到物理地址空間0x80000000 ~ 0x800fffff的內存。

映射關系如下:


linux內核高端內存的劃分內核將高端內存劃分為3部分:vmalloc_startvmalloc_end、kmap_basefixaddr_start和fixaddr_start~4g。


http://zxwdz.51dzw.com

對于高端內存,可以通過 alloc_page() 或者其它函數獲得對應的 page,但是要想訪問實際物理內存,還得把 page 轉為線性地址才行(為什么?想想 mmu 是如何訪問物理內存的),也就是說,我們需要為高端內存對應的 page 找一個線性空間,這個過程稱為高端內存映射。

對應高端內存的3部分,高端內存映射有三種方式:映射到”內核動態映射空間”(noncontiguous memory allocation)這種方式很簡單,因為通過 vmalloc() ,在”內核動態映射空間”申請內存的時候,就可能從高端內存獲得頁面(參看 vmalloc 的實現),因此說高端內存有可能映射到”內核動態映射空間”中。持久內核映射(permanent kernel mapping)如果是通過 alloc_page() 獲得了高端內存對應的 page,如何給它找個線性空間? 內核專門為此留出一塊線性空間,從 pkmap_base 到 fixaddr_start ,用于映射高端內存。在 2.6內核上,這個地址范圍是 4g-8m 到 4g-4m 之間。這個空間起叫”內核永久映射空間”或者”永久內核映射空間”。這個空間和其它空間使用同樣的頁目錄表,對于內核來說,就是 swapper_pg_dir,對普通進程來說,通過 cr3 寄存器指向。通常情況下,這個空間是 4m 大小,因此僅僅需要一個頁表即可,內核通過來 pkmap_page_table 尋找這個頁表。通過 kmap(),可以把一個 page 映射到這個空間來。由于這個空間是 4m 大小,最多能同時映射 1024 個 page。因此,對于不使用的的 page,及應該時從這個空間釋放掉(也就是解除映射關系),通過 kunmap() ,可以把一個 page 對應的線性地址從這個空間釋放出來。臨時映射(temporary kernel mapping)內核在 fixaddr_start 到 fixaddr_top 之間保留了一些線性空間用于特殊需求。這個空間稱為”固定映射空間”在這個空間中,有一部分用于高端內存的臨時映射。apsint2012

這塊空間具有如下特點:

(1)每個 cpu 占用一塊空間

(2)在每個 cpu 占用的那塊空間中,又分為多個小空間,每個小空間大小是 1 個 page,每個小空間用于一個目的,這些目的定義在 kmap_types.h 中的 km_type 中。

當要進行一次臨時映射的時候,需要指定映射的目的,根據映射目的,可以找到對應的小空間,然后把這個空間的地址作為映射地址。這意味著一次臨時映射會導致以前的映射被覆蓋。通過 kmap_atomic() 可實現臨時映射。

常見問題:

1、用戶空間(進程)是否有高端內存概念?

用戶進程沒有高端內存概念。只有在內核空間才存在高端內存。用戶進程最多只可以訪問3g物理內存,而內核進程可以訪問所有物理內存。

2、64位內核中有高端內存嗎?

目前現實中,64位linux內核不存在高端內存,因為64位內核可以支持超過512gb內存。若機器安裝的物理內存超過內核地址空間范圍,就會存在高端內存。

3、用戶進程能訪問多少物理內存?內核代碼能訪問多少物理內存?

32位系統用戶進程最大可以訪問3gb,內核代碼可以訪問所有物理內存。

64位系統用戶進程最大可以訪問超過512gb,內核代碼可以訪問所有物理內存。

4、高端內存和物理地址、邏輯地址、線性地址的關系?

高端內存只和物理地址有關系,和線性地址、邏輯地址沒有直接關系。

5、為什么不把所有的地址空間都分配給內核?

若把所有地址空間都給內存,那么用戶進程怎么使用內存?怎么保證內核使用內存和用戶進程不起沖突?

linux內核地址映射模型x86 cpu采用了段頁式地址映射模型。進程代碼中的地址為邏輯地址,經過段頁式地址映射后,才真正訪問物理內存。

http://hjdz.51dzw.com

段頁式機制如下圖。


linux內核地址空間劃分通常32位linux內核地址空間劃分03g為用戶空間,34g為內核空間。注意這里是32位內核地址空間劃分,


64位內核地址空間劃分是不同的。

linux內核高端內存的由來

當內核模塊代碼或線程訪問內存時,代碼中的內存地址都為邏輯地址,而對應到真正的物理內存地址,需要地址一對一的映射,如邏輯地址0xc0000003對應的物理地址為0x3,0xc0000004對apsint2012應的物理地址為0x4,… …,邏輯地址與物理地址對應的關系為

物理地址 = 邏輯地址  0xc0000000



假設按照上述簡單的地址映射關系,那么內核邏輯地址空間訪問為0xc0000000 ~ 0xffffffff,那么對應的物理內存范圍就為0x0 ~ 0x40000000,即只能訪問1g物理內存。若機器中安裝8g物理內存,那么內核就只能訪問前1g物理內存,后面7g物理內存將會無法訪問,因為內核的地址空間已經全部映射到物理內存地址范圍0x0 ~ 0x40000000。即使安裝了8g物理內存,那么物理地址為0x40000001的內存,內核該怎么去訪問呢?代碼中必須要有內存邏輯地址的,0xc0000000 ~ 0xffffffff的地址空間已經被用完了,所以無法訪問物理地址0x40000000以后的內存。

顯然不能將內核地址空間0xc0000000 ~ 0xfffffff全部用來簡單的地址映射。因此x86架構中將內核地址空間劃分三部分:zone_dma、zone_normal和zone_highmem。zone_highmem即為高端內存,這就是內存高端內存概念的由來。

在x86結構中,三種類型的區域如下:

http://zxsj.51dzw.com

zone_dma 內存開始的16mb

zone_normal 16mb~896mb

zone_highmem 896mb ~ 結束(linux內核 )



apsint2012 2000w aps int系列12v dc 230v ac逆變器/充電器是可靠的電源

適用于從電動工具和泵到便攜式照明和計算機的各種設備

重載條件下的設備。沒有煙霧,燃料或噪音,它是一個很好的替代品

發電機功率。

dc-ac逆變器具有自動線電轉換開關和集成充電功能

允許其作為車輛逆變器,獨立交流電源或擴展運行ups的系統。



51電子網公益庫存:
AP2138N-1.8TRG1
AP2138N-2.5TRG1
BV726C
FDPF33N25T
FF450R12KT4
GD32F350C8T6
FP25R12KT3
FP25R12KT4
FP40R12KT3
FP50R12KT3
IRFR1205TRPBF
IRFR120NTRPBF
LM3406MHX/NOPB
LD1085D2T33R
LIS3DHTR
KXCJ9-1008
L4981AD013TR
LM2596R-ADJ
LMR16030PDDAR
FS100R12KT3
IRF3710PBF
IRF3808PBF


linux內核高端內存的理解

前面我們解釋了高端內存的由來。 linux將內核地址空間劃分為三部分zone_dma、zone_normal和zone_highmem,高端內存high_mem地址空間范圍為0xf8000000 ~ 0xffffffff(896mb~1024mb)。那么如內核是如何借助128mb高端內存地址空間是如何實現訪問可以所有物理內存?

當內核想訪問高于896mb物理地址內存時,從0xf8000000 ~ 0xffffffff地址空間范圍內找一段相應大小空閑的邏輯地址空間,借用一會。借用這段邏輯地址空間,建立映射到想訪問的那段物理內存(即填充內核pte頁面表),臨時用一會,用完后歸還。這樣別人也可以借用這段地址空間訪問其他物理內存,實現了使用有限的地址空間,訪問所有所有物理內存。如下圖。

http://msldz.51dzw.com


例如內核想訪問2g開始的一段大小為1mb的物理內存,即物理地址范圍為0x80000000 ~ 0x800fffff。訪問之前先找到一段1mb大小的空閑地址空間,假設找到的空閑地址空間為0xf8700000 ~ 0xf87fffff,用這1mb的邏輯地址空間映射到物理地址空間0x80000000 ~ 0x800fffff的內存。

映射關系如下:


linux內核高端內存的劃分內核將高端內存劃分為3部分:vmalloc_startvmalloc_end、kmap_basefixaddr_start和fixaddr_start~4g。


http://zxwdz.51dzw.com

對于高端內存,可以通過 alloc_page() 或者其它函數獲得對應的 page,但是要想訪問實際物理內存,還得把 page 轉為線性地址才行(為什么?想想 mmu 是如何訪問物理內存的),也就是說,我們需要為高端內存對應的 page 找一個線性空間,這個過程稱為高端內存映射。

對應高端內存的3部分,高端內存映射有三種方式:映射到”內核動態映射空間”(noncontiguous memory allocation)這種方式很簡單,因為通過 vmalloc() ,在”內核動態映射空間”申請內存的時候,就可能從高端內存獲得頁面(參看 vmalloc 的實現),因此說高端內存有可能映射到”內核動態映射空間”中。持久內核映射(permanent kernel mapping)如果是通過 alloc_page() 獲得了高端內存對應的 page,如何給它找個線性空間? 內核專門為此留出一塊線性空間,從 pkmap_base 到 fixaddr_start ,用于映射高端內存。在 2.6內核上,這個地址范圍是 4g-8m 到 4g-4m 之間。這個空間起叫”內核永久映射空間”或者”永久內核映射空間”。這個空間和其它空間使用同樣的頁目錄表,對于內核來說,就是 swapper_pg_dir,對普通進程來說,通過 cr3 寄存器指向。通常情況下,這個空間是 4m 大小,因此僅僅需要一個頁表即可,內核通過來 pkmap_page_table 尋找這個頁表。通過 kmap(),可以把一個 page 映射到這個空間來。由于這個空間是 4m 大小,最多能同時映射 1024 個 page。因此,對于不使用的的 page,及應該時從這個空間釋放掉(也就是解除映射關系),通過 kunmap() ,可以把一個 page 對應的線性地址從這個空間釋放出來。臨時映射(temporary kernel mapping)內核在 fixaddr_start 到 fixaddr_top 之間保留了一些線性空間用于特殊需求。這個空間稱為”固定映射空間”在這個空間中,有一部分用于高端內存的臨時映射。apsint2012

這塊空間具有如下特點:

(1)每個 cpu 占用一塊空間

(2)在每個 cpu 占用的那塊空間中,又分為多個小空間,每個小空間大小是 1 個 page,每個小空間用于一個目的,這些目的定義在 kmap_types.h 中的 km_type 中。

當要進行一次臨時映射的時候,需要指定映射的目的,根據映射目的,可以找到對應的小空間,然后把這個空間的地址作為映射地址。這意味著一次臨時映射會導致以前的映射被覆蓋。通過 kmap_atomic() 可實現臨時映射。

常見問題:

1、用戶空間(進程)是否有高端內存概念?

用戶進程沒有高端內存概念。只有在內核空間才存在高端內存。用戶進程最多只可以訪問3g物理內存,而內核進程可以訪問所有物理內存。

2、64位內核中有高端內存嗎?

目前現實中,64位linux內核不存在高端內存,因為64位內核可以支持超過512gb內存。若機器安裝的物理內存超過內核地址空間范圍,就會存在高端內存。

3、用戶進程能訪問多少物理內存?內核代碼能訪問多少物理內存?

32位系統用戶進程最大可以訪問3gb,內核代碼可以訪問所有物理內存。

64位系統用戶進程最大可以訪問超過512gb,內核代碼可以訪問所有物理內存。

4、高端內存和物理地址、邏輯地址、線性地址的關系?

高端內存只和物理地址有關系,和線性地址、邏輯地址沒有直接關系。

5、為什么不把所有的地址空間都分配給內核?

若把所有地址空間都給內存,那么用戶進程怎么使用內存?怎么保證內核使用內存和用戶進程不起沖突?

linux內核地址映射模型x86 cpu采用了段頁式地址映射模型。進程代碼中的地址為邏輯地址,經過段頁式地址映射后,才真正訪問物理內存。

http://hjdz.51dzw.com

段頁式機制如下圖。


linux內核地址空間劃分通常32位linux內核地址空間劃分03g為用戶空間,34g為內核空間。注意這里是32位內核地址空間劃分,


64位內核地址空間劃分是不同的。

linux內核高端內存的由來

當內核模塊代碼或線程訪問內存時,代碼中的內存地址都為邏輯地址,而對應到真正的物理內存地址,需要地址一對一的映射,如邏輯地址0xc0000003對應的物理地址為0x3,0xc0000004對apsint2012應的物理地址為0x4,… …,邏輯地址與物理地址對應的關系為

物理地址 = 邏輯地址  0xc0000000



假設按照上述簡單的地址映射關系,那么內核邏輯地址空間訪問為0xc0000000 ~ 0xffffffff,那么對應的物理內存范圍就為0x0 ~ 0x40000000,即只能訪問1g物理內存。若機器中安裝8g物理內存,那么內核就只能訪問前1g物理內存,后面7g物理內存將會無法訪問,因為內核的地址空間已經全部映射到物理內存地址范圍0x0 ~ 0x40000000。即使安裝了8g物理內存,那么物理地址為0x40000001的內存,內核該怎么去訪問呢?代碼中必須要有內存邏輯地址的,0xc0000000 ~ 0xffffffff的地址空間已經被用完了,所以無法訪問物理地址0x40000000以后的內存。

顯然不能將內核地址空間0xc0000000 ~ 0xfffffff全部用來簡單的地址映射。因此x86架構中將內核地址空間劃分三部分:zone_dma、zone_normal和zone_highmem。zone_highmem即為高端內存,這就是內存高端內存概念的由來。

在x86結構中,三種類型的區域如下:

http://zxsj.51dzw.com

zone_dma 內存開始的16mb

zone_normal 16mb~896mb

zone_highmem 896mb ~ 結束(linux內核 )

熱門點擊

推薦電子資訊

Chrome 31:iOS版發布
iOS版Chrome 31主要更新:   “Au... [詳細]
版權所有:51dzw.COM
深圳服務熱線:13692101218  13751165337
粵ICP備09112631號-6(miitbeian.gov.cn)
公網安備44030402000607
深圳市碧威特網絡技術有限公司
付款方式


 復制成功!
罗平县| 陇南市| 河东区| 孝义市| 宜昌市| 松滋市| 淄博市| 柳江县| 浦县| 嘉祥县| 邵东县| 玉山县| 彭山县| 九寨沟县| 长岛县| 东乌珠穆沁旗| 宿州市| 进贤县| 金塔县| 长乐市| 鄱阳县| 额敏县| 崇左市| 宁安市| 景宁| 金寨县| 石泉县| 饶河县| 越西县| 孟村| 抚顺市| 抚州市| 海丰县| 阜康市| 瑞昌市| 湖州市| 农安县| 曲沃县| 棋牌| 眉山市| 六安市|