日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux内核内存管理(zone_dma zone_normal zone_highmem)

發(fā)布時(shí)間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核内存管理(zone_dma zone_normal zone_highmem) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux 操作系統(tǒng)和驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間,應(yīng)用程序運(yùn)行在用戶空間,兩者不能簡單地使用指針傳遞數(shù)據(jù),因?yàn)長inux使用的虛擬內(nèi)存機(jī)制,用戶空間的數(shù)據(jù)可能被換出,當(dāng)內(nèi)核空間使用用戶空間指針時(shí),對(duì)應(yīng)的數(shù)據(jù)可能不在內(nèi)存中。

?

? ?Linux內(nèi)核地址空間劃分

通常32位Linux內(nèi)核地址空間劃分0~3G為用戶空間,3~4G為內(nèi)核空間。注意這里是32位內(nèi)核地址空間劃分,64位內(nèi)核地址空間劃分是不同的。

?

1、x86的物理地址空間布局:

?

?

  物理地址空間的頂部以下一段空間,被PCI設(shè)備的I/O內(nèi)存映射占據(jù),它們的大小和布局由PCI規(guī)范所決定。640K~1M這段地址空間被BIOS和VGA適配器所占據(jù)。

  Linux系統(tǒng)在初始化時(shí),會(huì)根據(jù)實(shí)際的物理內(nèi)存的大小,為每個(gè)物理頁面創(chuàng)建一個(gè)page對(duì)象,所有的page對(duì)象構(gòu)成一個(gè)mem_map數(shù)組。

進(jìn)一步,針對(duì)不同的用途,Linux內(nèi)核將所有的物理頁面劃分到3類內(nèi)存管理區(qū)中,如圖,分別為ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。

  ZONE_DMA的范圍是0~16M,該區(qū)域的物理頁面專門供I/O設(shè)備的DMA使用。之所以需要單獨(dú)管理DMA的物理頁面,是因?yàn)镈MA使用物理地址訪問內(nèi)存,不經(jīng)過MMU,并且需要連續(xù)的緩沖區(qū),所以為了能夠提供物理上連續(xù)的緩沖區(qū),必須從物理地址空間專門劃分一段區(qū)域用于DMA。

  ZONE_NORMAL的范圍是16M~896M,該區(qū)域的物理頁面是內(nèi)核能夠直接使用的。

  ZONE_HIGHMEM的范圍是896M~結(jié)束,該區(qū)域即為高端內(nèi)存,內(nèi)核不能直接使用。

?

2、linux虛擬地址內(nèi)核空間分布

?

  在kernel image下面有16M的內(nèi)核空間用于DMA操作。位于內(nèi)核空間高端的128M地址主要由3部分組成,分別為vmalloc area,持久化內(nèi)核映射區(qū),臨時(shí)內(nèi)核映射區(qū)。

  由于ZONE_NORMAL和內(nèi)核線性空間存在直接映射關(guān)系,所以內(nèi)核會(huì)將頻繁使用的數(shù)據(jù)如kernel代碼、GDT、IDT、PGD、mem_map數(shù)組等放在ZONE_NORMAL里。而將用戶數(shù)據(jù)、頁表(PT)等不常用數(shù)據(jù)放在ZONE_ HIGHMEM里,只在要訪問這些數(shù)據(jù)時(shí)才建立映射關(guān)系(kmap())。比如,當(dāng)內(nèi)核要訪問I/O設(shè)備存儲(chǔ)空間時(shí),就使用ioremap()將位于物理地址高端的mmio區(qū)內(nèi)存映射到內(nèi)核空間的vmalloc area中,在使用完之后便斷開映射關(guān)系。

?

3、linux虛擬地址用戶空間分布

  用戶進(jìn)程的代碼區(qū)一般從虛擬地址空間的0x08048000開始,這是為了便于檢查空指針。代碼區(qū)之上便是數(shù)據(jù)區(qū),未初始化數(shù)據(jù)區(qū),堆區(qū),棧區(qū),以及參數(shù)、全局環(huán)境變量。

4、linux虛擬地址與物理地址映射的關(guān)系

?

?

  Linux將4G的線性地址空間分為2部分,0~3G為user space,3G~4G為kernel space。

  由于開啟了分頁機(jī)制,內(nèi)核想要訪問物理地址空間的話,必須先建立映射關(guān)系,然后通過虛擬地址來訪問。為了能夠訪問所有的物理地址空間,就要將全部物理地址空間映射到1G的內(nèi)核線性空間中,這顯然不可能。于是,內(nèi)核將0~896M的物理地址空間一對(duì)一映射到自己的線性地址空間中,這樣它便可以隨時(shí)訪問ZONE_DMA和ZONE_NORMAL里的物理頁面;此時(shí)內(nèi)核剩下的128M線性地址空間不足以完全映射所有的ZONE_HIGHMEM,Linux采取了動(dòng)態(tài)映射的方法,即按需的將ZONE_HIGHMEM里的物理頁面映射到kernel space的最后128M線性地址空間里,使用完之后釋放映射關(guān)系,以供其它物理頁面映射。雖然這樣存在效率的問題,但是內(nèi)核畢竟可以正常的訪問所有的物理地址空間了。

?

5、buddyinfo的理解

cat /proc/buddyinfo 顯示如下:

Node 0, zone ? ? ?DMA ? ? ? 0 ? ? ?4 ? ? ?5 ? ? ?4 ? ? ?4 ? ? ?3 ...

Node 0, zone ? Normal ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?1 ? ?101 ? ? 8 ...

Node 0, zone ?HighMem ? ?2 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ? 0 ...

其中,Node表示在NUMA環(huán)境下的節(jié)點(diǎn)號(hào),這里只有一個(gè)節(jié)點(diǎn)0;zone表示每一個(gè)節(jié)點(diǎn)下的區(qū)域,一般有DMA、Normal和HignMem三個(gè)區(qū)域;后面的列表示,伙伴系統(tǒng)中每一個(gè)order對(duì)應(yīng)的空閑頁面塊。例如,對(duì)于zone DMA的第二列(從0開始算起),空閑頁面數(shù)為5*2^4,可用內(nèi)存為5*2^4*PAGE_SIZE。

?

計(jì)算方法就是:

? ? ? ? ? ? ? ? ? ? ?當(dāng)前列的數(shù)字*2^列數(shù)*PAGE_SIZE 其中列數(shù)是從0開始計(jì)算的,即第一列是 當(dāng)前列的數(shù)字*2^0*PAGE_SIZE



?

常見問題:

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

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

?

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

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

?

3、用戶進(jìn)程能訪問多少物理內(nèi)存?內(nèi)核代碼能訪問多少物理內(nèi)存?

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

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

?

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

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

?

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

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

轉(zhuǎn)載于:https://www.cnblogs.com/vinozly/p/5618451.html

總結(jié)

以上是生活随笔為你收集整理的linux内核内存管理(zone_dma zone_normal zone_highmem)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。