歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux物理內存描述

Linux物理內存描述

日期:2017/2/28 16:00:21   编辑:Linux教程

linux使用於廣泛的體系結構,因此需要用一種與體系結構無關的方式來描述內存。linux用VM描述和管理內存。在VM中獸藥的普遍概念就是非一致內存訪問。對於大型機器而言,內存會分成許多簇,依據簇與處理器“距離”的不同,訪問不同的簇會有不同的代價。

每個簇都被認為是一個節點(pg_data_t),每個節點被分成很多的成為管理區(zone)的塊,用於表示內存中的某個范圍。除了ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM以外,linux2.6.32中引入了ZONE_MOVABLE,用於適應大塊連續內存的分配。

每個物理頁面由一個page結構體描述,所有的結構都存儲在一個全局的mem_map數組中(非平板模式),該數組通常存放在ZONE_NORMAL的首部,或者就在校內存系統中為裝入內核映像而預留的區域之後。

節點

內存的每個節點都有pg_data_t描述,在分配一個頁面時,linux采用節點局部分配的策略,從最靠近運行中的CPU的節點分配內存。由於進程往往是在同一個CPU上運行,因此從當前節點得到的內存很可能被用到。

  1. /*
  2. * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
  3. * (mostly NUMA machines?) to denote a higher-level memory zone than the
  4. * zone denotes.
  5. *
  6. * On NUMA machines, each NUMA node would have a pg_data_t to describe
  7. * it's memory layout.
  8. *
  9. * Memory statistics and page replacement data structures are maintained on a
  10. * per-zone basis.
  11. */
  12. struct bootmem_data;
  13. typedef struct pglist_data {
  14. /*該節點內的內存區。可能的區域類型用zone_type表示。 */
  15. struct zone node_zones[MAX_NR_ZONES];
  16. /* 該節點的備用內存區。當節點沒有可用內存時,就從備用區中分配內存。*/
  17. struct zonelist node_zonelists[MAX_ZONELISTS];
  18. /*可用內存區數目,即node_zones數據中保存的最後一個有效區域的索引*/
  19. int nr_zones;
  20. #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
  21. /* 在平坦型的內存模型中,它指向本節點第一個頁面的描述符。 */
  22. struct page *node_mem_map;
  23. #ifdef CONFIG_CGROUP_MEM_RES_CTLR
  24. /*cgroup相關*/
  25. struct page_cgroup *node_page_cgroup;
  26. #endif
  27. #endif
  28. /**
  29. * 在內存子系統初始化以前,即boot階段也需要進行內存管理。
  30. * 此結構用於這個階段的內存管理。
  31. */
  32. struct bootmem_data *bdata;
  33. #ifdef CONFIG_MEMORY_HOTPLUG
  34. /*
  35. * Must be held any time you expect node_start_pfn, node_present_pages
  36. * or node_spanned_pages stay constant. Holding this will also
  37. * guarantee that any pfn_valid() stays that way.
  38. *
  39. * Nests above zone->lock and zone->size_seqlock.
  40. */
  41. /*當系統支持內存熱插撥時,用於保護本結構中的與節點大小相關的字段。
  42. 哪調用node_start_pfn,node_present_pages,node_spanned_pages相關的代碼時,需要使用該鎖。
  43. */
  44. spinlock_t node_size_lock;
  45. #endif
  46. /*起始頁面幀號,指出該節點在全局mem_map中
  47. 的偏移*/
  48. unsigned long node_start_pfn;
  49. unsigned long node_present_pages; /* total number of physical pages */
  50. unsigned long node_spanned_pages; /* total size of physical page range, including holes */
  51. /*節點編號*/
  52. int node_id;
  53. /*等待該節點內的交換守護進程的等待隊列。將節點中的頁幀換出時會用到。*/
  54. wait_queue_head_t kswapd_wait;
  55. /*負責該節��的交換守護進程。*/
  56. struct task_struct *kswapd;
  57. /*由頁交換子系統使用,定義要釋放的區域大小。*/
  58. int kswapd_max_order;
  59. } pg_data_t;
Copyright © Linux教程網 All Rights Reserved