在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

物理內存模型的演變

jf_0tjVfeJz ? 來源:嵌入式ARM和Linux ? 2024-02-25 10:35 ? 次閱讀

內存管理概述中,主要是以Linux v2.6.11為例進行分析的,但是計算技術在不斷發展,新的存儲架構、新的指令集架構、新的SoC架構等都對物理內存模型的抽象提出了更高要求。為此,必須抽象一種完全獨立于硬件架構的物理內存模型。

1 NUMA和UMA

第一個要解決的問題就是非一致性內存訪問(NUMA)。對于多核和多內存卡插槽的機器,內存位于不同的分組中,那么與處理器的距離不同,就會產生訪問時間的差異。比如,可以將一組內存更靠近CPU,另一組內存更靠近外設,作為訪問外設的DMA內存。

這樣的每個分組稱為一個節點(node)。不管是NUMA架構,還是UMA架構,Linux提供了一個統一的數據結構struct pglist_data表示節點信息。該列表中是類型為pg_data_t的數據結構,描述一個具體的節點,該數據結構可以通過NODE_DATA(nid)引用,這兒nid表示節點的ID。

對于NUMA架構,node數據結構是由特定于架構的代碼在boot階段分配的。通常,這些數據結構分配的就是本地的內存組(也就是離它們近的內存)。對于UMA體系結構,只使用一個名為cong_page_data的靜態pg_data_t結構。節點將在下一節討論。

2 內存分區(memory zone)

節點內的物理內存被劃分為一個或多個區,這樣的區稱為Zone。這些內存分區的劃分通常由硬件架構訪問物理內存的限制決定。ZONE在內核中的數據類型是zone_t,結構是zone。zone的分類類型如下所示:

ZONE_DMA和ZONE_DMA32

當外設無法DMA訪問所有可尋址內存(ZONE_NORMAL)時,使用ZONE_DMA和ZONE_DMA32。ZONE_DMA32用于覆蓋整個32位地址空間的架構上。ZONE_DMA留給具有較小DMA尋址限制的區域。這種區別很重要,因為定義ZONE_DMA32時假定使用32位DMA掩碼。某些64位平臺可能需要2個區域,因為它們支持具有不同DMA尋址限制的外設。雖然近些年提供了更好、更強大的接口分配DMA內存(使用通用設備的動態DMA映射),但ZONE_DMA和ZONE_DMA32仍然表示對其訪問方式受限制的內存。根據架構不同,可以使用CONFIG_ZONE_DMA和CONFIG_ZONE_DMA32配置選項,在構建內核時,禁用這些內存區域。

ZONE_NORMAL

普通內存,內核一直可以訪問的內存區。如果DMA設備支持向所有可尋址內存的傳輸,則可以對這些內存頁執行DMA操作。ZONE_NORMAL總是使能。

ZONE_HIGHMEM

是內核頁表中永久映射未覆蓋的物理內存部分。這個區域中的內存只能由內核使用臨時映射訪問。該區域僅在某些32位體系結構上可用,并通過CONFIG_HIGHMEM啟用。

ZONE_MOVABLE

與ZONE_NORMAL類似。不同之處是ZONE_MOVABLE區的內存頁是可移動的。也就是說,在這些內存頁的虛擬地址不改變的情況下,他們的內容可以在不同的物理內存頁之間搬運。ZONE_MOVABLE通常在內存熱插拔期間進行填充,但也可以在boot階段,使用kernelcore、movablecore和movable_node命令行參數之一進行填充。具體可以參考內存頁遷移和熱插拔

ZONE_DEVICE

表示駐留在PMEM和GPU等設備上的內存。它和內存ZONE類型有著不同,它的存在是為了設備驅動程序的物理內存范圍提供page和內存映射服務。ZONE_DEVICE可以通過配置選項CONFIG_ZONE_DEVICE使能。設備內存熱插拔支持在mem_map中建立PMEM或其它設備驅動程序發現的內存區域。這允許pfn_to_page()查找“設備物理”地址,這是在O_DIRECT操作中使用DAX映射所需要的。

需要注意的是,許多內核操作只能使用ZONE_NORMAL進行,因此它是性能最關鍵的ZONE區。

節點和ZONE之間的關系由固件報告的物理內存映射、內存尋址的體系結構約束和內核命令行中的某些參數決定。

例如,對于具有2GB內存的x86 UMA架構內核,整個內存將位于節點0上,分為3個區域:“ZONE_DMA”、“ZONE_NORMAL”和“ZONE_HIGHMEM”:

02G
+-------------------------------------------------------------+
|node0|
+-------------------------------------------------------------+

016M896M2G
+----------+-----------------------+--------------------------+
|ZONE_DMA|ZONE_NORMAL|ZONE_HIGHMEM|
+----------+-----------------------+--------------------------+

ARM64機器上禁用ZONE_DMA并啟用ZONE_DMA32的同時,使用movablecore = 80%參數啟動內核時,在兩個節點之間平均分配16G內存,則節點0上將有ZONE_DMA32,ZONE_NORMAL和ZONE_MOVABLE,節點1上將有ZONE_NORMAL和ZONE_MOVABLE:

1G9G17G
+--------------------------------++--------------------------+
|node0||node1|
+--------------------------------++--------------------------+

1G4G4200M9G9320M17G
+---------+----------+-----------++------------+-------------+
|DMA32|NORMAL|MOVABLE||NORMAL|MOVABLE|
+---------+----------+-----------++------------+-------------+

內存組也可以交替分配給節點。在下面的示例中,x86機器具有16G的內存,分為4組,偶數組屬于節點0,奇數組屬于節點1:

04G8G12G16G
+-------------++-------------++-------------++-------------+
|node0||node1||node0||node1|
+-------------++-------------++-------------++-------------+

016M4G
+-----+-------++-------------++-------------++-------------+
|DMA|DMA32||NORMAL||NORMAL||NORMAL|
+-----+-------++-------------++-------------++-------------+

在這種情況下,節點0將橫跨0→12G,節點1將橫跨4→16G。

3 節點

正如我們所提到的,內存中的每個節點都由pg_data_t描述,pg_data_t是結構體pglist_data的類型定義。在分配頁面時,默認情況下Linux使用節點本地分配策略,從離運行CPU最近的節點分配內存。由于進程傾向于在同一個CPU上運行,因此很可能會使用當前節點的內存。分配策略可以由用戶控制,詳見NUMA內存策略。

大多數NUMA體系結構維護一個指向node結構的指針數組。實際的結構是在boot過程的早期分配的,當特定于體系結構的代碼解析固件報告的物理內存映射時。節點初始化的大部分在boot過程中稍晚的時候通過free_area_init()函數進行,稍后將在初始化一節中描述。

除了node結構,內核還維護一個名為node_states的nodemask_t位掩碼數組。這個數組中的每個位掩碼代表一組具有特定屬性的節點,這些屬性由enum node_states定義:

N_POSSIBLE

節點可能在某個時間點在線。

N_ONLINE

節點在線。

N_NORMAL_MEMORY

節點具有常規內存。

N_HIGH_MEMORY

節點具有常規內存或高端內存。當CONFIG_HIGHMEM被禁用時,別名為N_NORMAL_MEMORY。

N_MEMORY

節點具有內存(常規、高、可移動).

N_CPU

節點內CPU數量。

對于具有上述屬性的每個節點,將設置與node_states[]位掩碼中節點ID對應的位。

例如,節點2,具有常規內存和CPU,位2將在下面設置:

node_states[N_POSSIBLE]
node_states[N_ONLINE]
node_states[N_NORMAL_MEMORY]
node_states[N_HIGH_MEMORY]
node_states[N_MEMORY]
node_states[N_CPU]

關于nodemask的各種操作,請參考include/linux/nodemask.h。

有了節點之后,LRU列表、頁回收機制、交換區(kswapd)等等都需要在NONE分區之上添加處理。細節在此不再詳述。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • soc
    soc
    +關注

    關注

    38

    文章

    4212

    瀏覽量

    219178
  • Linux
    +關注

    關注

    87

    文章

    11351

    瀏覽量

    210498
  • 內存
    +關注

    關注

    8

    文章

    3064

    瀏覽量

    74374
  • 模型
    +關注

    關注

    1

    文章

    3340

    瀏覽量

    49267

原文標題:Linux內核8.9-內存管理進階之物理內存模型的演變

文章出處:【微信號:嵌入式ARM和Linux,微信公眾號:嵌入式ARM和Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux的內存管理是什么,Linux的內存管理詳解

    、物理內存模型 ? ? ? 物理內存模型主要分為兩種:UMA(Uniform Memory Ac
    的頭像 發表于 05-11 17:54 ?6167次閱讀
    Linux的<b class='flag-5'>內存</b>管理是什么,Linux的<b class='flag-5'>內存</b>管理詳解

    Linux內核的物理內存組織結構詳解

    Linux中內存管理子系統使用 節點(node)、區域(zone)和頁(page) 三級結構描述物理內存
    發表于 08-21 15:35 ?619次閱讀
    Linux內核的<b class='flag-5'>物理</b><b class='flag-5'>內存</b>組織結構詳解

    用labview模擬物理模型

    課程推薦:http://z.elecfans.com/258.html?elecfans_trackid=bbs_toptxtlabview是很神奇的,可以模擬物理模型,挺好玩的
    發表于 05-13 22:55

    物理內存和虛擬內存之間的轉換

    內存操作:涉及到了物理內存和虛擬內存之間的轉換,需要用到兩個函數: ioremap 和 iounmap。ioremap :函 數 用 于 獲 取 指 定 物 理 地 址 空 間 對 應
    發表于 12-17 06:48

    Linux虛擬內存物理內存的深刻分析

    進程這種情況,浪費內存!第二層理解每個進程的4G內存空間只是虛擬內存空間,每次訪問內存空間的某個地址,都需要把地址翻譯為實際物理
    發表于 05-31 08:00

    UMTS的物理結構模型

    UMTS的物理結構模型
    發表于 09-18 15:13 ?1328次閱讀

    NetWare內存模型與NetWare組網的介紹

    NetWare內存模型 N e t Ware 4.x只可以使用物理內存, N e t Ware 5.0可以同時使用物理
    發表于 11-23 17:51 ?3次下載

    如何避免Linux的物理內存碎片化

    Linux buddyy系統是linux kernel比較穩定的一個模塊,但是并不是說它沒有缺陷,Linux內存管理系統自誕生之日,就一直存在物理內存碎片化的問題:在系統啟動并且運行很長一段時間后
    的頭像 發表于 05-01 16:43 ?5513次閱讀
    如何避免Linux的<b class='flag-5'>物理</b><b class='flag-5'>內存</b>碎片化

    淺析計算機中物理內存模型

    個人感覺學這部分的知識應該首先在腦海中抽象出存儲體系,因為無論磁盤,物理內存還是虛擬內存都是互相有聯系的,抽象出模型有助于我們的理解和記憶。接著需要哪部分知識或再次深入哪部分知識,從體
    的頭像 發表于 08-28 16:29 ?4429次閱讀

    了解并學習Linux內存模型

    在linux內核中支持3中內存模型,分別是flat memory model,Discontiguous memory model和sparse memory model。所謂memory
    發表于 05-12 09:44 ?728次閱讀
    了解并學習Linux<b class='flag-5'>內存</b><b class='flag-5'>模型</b>

    電腦物理內存過高的處理技巧

    電腦物理內存過高的處理技巧。很多時候,我們的一些電腦管家或者電腦助手都總會顯示內存過大,需要我們及時清理。其實這一種提示中的內存過大,不是指我們的電腦中的
    發表于 06-19 10:26 ?3225次閱讀
    電腦<b class='flag-5'>物理</b><b class='flag-5'>內存</b>過高的處理技巧

    內存是怎么映射到物理地址空間的?內存是連續分布的嗎?

    如果我們將兩個4G內存插入內存插槽,得到的內存地址空間是0到8G嗎?是不是0到4G是第一根內存,4到8G是第二根內存呢?實際情況相差甚遠,
    的頭像 發表于 06-30 15:59 ?3645次閱讀
    <b class='flag-5'>內存</b>是怎么映射到<b class='flag-5'>物理</b>地址空間的?<b class='flag-5'>內存</b>是連續分布的嗎?

    jvm內存模型內存結構

    JVM(Java虛擬機)是Java程序的運行平臺,它負責將Java程序轉換成機器碼并在計算機上執行。在JVM中,內存模型內存結構是兩個重要的概念,本文將詳細介紹它們。 一、JVM內存
    的頭像 發表于 12-05 11:08 ?991次閱讀

    邏輯內存物理內存的區別

    邏輯內存物理內存是計算機系統中兩個重要的概念,它們在計算機的運行和數據處理中起著至關重要的作用。 1. 物理內存(Physical Mem
    的頭像 發表于 09-27 15:38 ?963次閱讀

    虛擬內存不足如何解決 虛擬內存物理內存的區別

    虛擬內存不足的解決方案 虛擬內存不足是計算機用戶經常遇到的問題,尤其是在運行大型軟件或多任務處理時。以下是一些解決虛擬內存不足問題的方法: 增加物理
    的頭像 發表于 12-04 09:14 ?605次閱讀
    主站蜘蛛池模板: 午夜看片 | 五月婷婷丁香在线 | 四虎在线成人免费网站 | 人人艹在线观看 | 精品视频在线观看视频免费视频 | 女人张开腿让男人桶免费网站 | 日本乱理论片免费看 | 天天做天天爱天天爽天天综合 | 欧美aaaaa性bbbbb小妇 | 天天视频观看 | 国产综合精品久久久久成人影 | 红怡院欧洲 | 涩久久 | 色香影视| 夜夜夜夜爽 | 夜夜操操操 | 三级黄色a| 天天做天天爱夜夜爽毛片毛片 | 国产情侣出租屋露脸实拍 | 天天干天天澡 | 色婷婷久久综合中文久久蜜桃 | 一级欧美在线的视频 | 亚洲人成网站在线在线 | 日本美女黄色一级片 | 亚洲色图图片专区 | 久久狼人综合 | 欧美亚洲第一区 | 关晓彤被调教出奶水的视频 | 五月天婷婷网亚洲综合在线 | 国产亚洲精品免费 | 亚洲一区 在线播放 | 日本污全彩肉肉无遮挡彩色 | 亚洲国产成人久久三区 | 黄色网一级片 | 免费观看一级成人毛片 | 狠狠色综合色综合网络 | 午夜精品福利在线 | 欧美亚洲啪啪 | 欧美日韩在线成人免费 | 美女被网站免费看九色视频 | 成人国产一区二区 |