返回列表 发帖

Linux板级内存管理之-物理内存的一致性和内存管理区

Linux板级内存管理之-物理内存的一致性和内存管理区

Linux板级内存管理之-内核的页,页框,页帧


osboy - mcuos.com站长原创


mcuos.com@gmail.com



(一)一致内存概念一致内存概念:
计算机内存是一种均匀、共享的资源。在忽略硬件高速缓存的作用下,我们期望不管内存单元处于何处,也不管CPU处于何处,CPU对内存的访问都需要相同的时间。

非符合以上描述的计算机为非一致性内存访问。

Linux2.6对这种非一致性内存的访问支持的方式为,系统的物理内存划分为几个不同的节点node,在一个单独的节点内任一给定的CPU对其的访问时间都是相同的。

节点node的描述符:pg_data_t
  1. typedef struct pglist_data {
  2.         struct zone node_zones[MAX_NR_ZONES];
  3.         struct zonelist node_zonelists[MAX_ZONELISTS];
  4.         int nr_zones;
  5. #ifdef CONFIG_FLAT_NODE_MEM_MAP        /* means !SPARSEMEM */
  6.         struct page *node_mem_map;
  7. #ifdef CONFIG_CGROUP_MEM_RES_CTLR
  8.         struct page_cgroup *node_page_cgroup;
  9. #endif
  10. #endif
  11. #ifndef CONFIG_NO_BOOTMEM
  12.         struct bootmem_data *bdata;
  13. #endif
  14. #ifdef CONFIG_MEMORY_HOTPLUG
  15.         /*
  16.          * Must be held any time you expect node_start_pfn, node_present_pages
  17.          * or node_spanned_pages stay constant.  Holding this will also
  18.          * guarantee that any pfn_valid() stays that way.
  19.          *
  20.          * Nests above zone->lock and zone->size_seqlock.
  21.          */
  22.         spinlock_t node_size_lock;
  23. #endif
  24.         unsigned long node_start_pfn;
  25.         unsigned long node_present_pages; /* total number of physical pages */
  26.         unsigned long node_spanned_pages; /* total size of physical page
  27.                                              range, including holes */
  28.         int node_id;
  29.         wait_queue_head_t kswapd_wait;
  30.         struct task_struct *kswapd;
  31.         int kswapd_max_order;
  32. } pg_data_t;
复制代码

即使我们的CPU使用一致内存访问,NUMA没有被编译进内核,Linux还是使用节点,不过这是一个单独的节点,它包含了系统的所有物理内存,这个节点被linux2.6定义为contig_page_data


#ifndef CONFIG_NEED_MULTIPLE_NODES

struct pglist_data __refdata contig_page_data= {

#ifndefCONFIG_NO_BOOTMEM


.bdata = &bootmem_node_data[0]

#endif


typedef struct bootmem_data {


unsignedlong node_min_pfn;


unsignedlong node_low_pfn;


void*node_bootmem_map;


unsignedlong last_end_off;


unsignedlong hint_idx;


structlist_head list;

} bootmem_data_t;


(2)内存管理区



先来看张图,图所示的四种颜色的框表示你的板子上的不同的物理内存节点,我们大家用的板子一般都是一致性物理内存,所以基本上都是只有一个节点,就是只有上面的四种颜色之一的框。在我们的nuc900 arm9的板子上有64M的内存,所以还不存在高端内存区,而arm没有固定的DMA区域,整个物理内存都可以作为DMA区域使用,所以我们的系统中没有配置:CONFIG_ZONE_DMA 和 CONFIG_HIGHMEM。

Linux内核中的zone区域的类型定义如下:

  1. enum zone_type {
  2. #ifdef CONFIG_ZONE_DMA
  3.         /*
  4.          * ZONE_DMA is used when there are devices that are not able
  5.          * to do DMA to all of addressable memory (ZONE_NORMAL). Then we
  6.          * carve out the portion of memory that is needed for these devices.
  7.          * The range is arch specific.
  8.          *
  9.          * Some examples
  10.          *
  11.          * Architecture                Limit
  12.          * ---------------------------
  13.          * parisc, ia64, sparc        <4G
  14.          * s390                        <2G
  15.          * arm                        Various
  16.          * alpha                Unlimited or 0-16MB.
  17.          *
  18.          * i386, x86_64 and multiple other arches
  19.          *                         <16M.
  20.          */
  21.         ZONE_DMA,
  22. #endif
  23. #ifdef CONFIG_ZONE_DMA32
  24.         /*
  25.          * x86_64 needs two ZONE_DMAs because it supports devices that are
  26.          * only able to do DMA to the lower 16M but also 32 bit devices that
  27.          * can only do DMA areas below 4G.
  28.          */
  29.         ZONE_DMA32,
  30. #endif
  31.         /*
  32.          * Normal addressable memory is in ZONE_NORMAL. DMA operations can be
  33.          * performed on pages in ZONE_NORMAL if the DMA devices support
  34.          * transfers to all addressable memory.
  35.          */
  36.         ZONE_NORMAL,
  37. #ifdef CONFIG_HIGHMEM
  38.         /*
  39.          * A memory area that is only addressable by the kernel through
  40.          * mapping portions into its own address space. This is for example
  41.          * used by i386 to allow the kernel to address the memory beyond
  42.          * 900MB. The kernel will set up special mappings (page
  43.          * table entries on i386) for each page that the kernel needs to
  44.          * access.
  45.          */
  46.         ZONE_HIGHMEM,
  47. #endif
  48.         ZONE_MOVABLE,
  49.         __MAX_NR_ZONES
  50. };
复制代码



又上面的分析可以,我们的系统中只有ZONE_NORMAL正常的物理内存区域。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服