第三章 内存管理

一、概述


1.内存管理的领域:

1.管理物理内存页

2.分配打开内存的伙伴系统

3.分配小内存的slab、slub、slob分配器

4.分配非连续内存快的vmalloc

5.进程的地址空间


内核将虚拟地址空间分为两个部分,底部较大,用于用户空间,上部用于内核,在发生进程切换时,底部会变化,上部不会变化,因为进程共享内核空间

64位的不需要高端内存模式,因为64位地址空间足够将所有的物理地址映射到内核。

2. UMA模型中的内存组织

在UMA系统上只使用一个NUMA节点来管理整个系统内存,每个NUMA节点用pg_data_t来表示

linux上的内存分区

enum zone_type {
#ifdef CONFIG_ZONE_DMA

ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32

ZONE_DMA32,
#endif

ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM


ZONE_HIGHMEM,
#endif
ZONE_MOVABLE,      为了防止物理内存碎片,我在2.6.22中没有看到这个位
MAX_NR_ZONES       为了表示结构的结束标志
};

typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];                                     节点类内存域的数组

struct zonelist node_zonelists[MAX_ZONELISTS];                           备用节点及其内存域列表

int nr_zones;                                                                                             节点中不同内存域的数目
#ifdef CONFIG_FLAT_NODE_MEM_MAP
struct page *node_mem_map;                                                             指向该节点的所有物理内存页
#endif
struct bootmem_data *bdata;                                                                 指向自举内存分配器,在系统内存管理还没有启动是为系统分配内存
#ifdef CONFIG_MEMORY_HOTPLUG
/*
* Must be held any time you expect node_start_pfn, node_present_pages
* or node_spanned_pages stay constant.  Holding this will also
* guarantee that any pfn_valid() stays that way.
*
* Nests above zone->lock and zone->size_seqlock.
*/
spinlock_t node_size_lock;
#endif
unsigned long node_start_pfn;                                 该节点的起始页帧,在UMA上为0
unsigned long node_present_pages; /* total number of physical pages */
unsigned long node_spanned_pages; /* total size of physical page
    range, including holes */
int node_id;
wait_queue_head_t kswapd_wait;
struct task_struct *kswapd;
int kswapd_max_order;
} pg_data_t;

节点状态

enum node_states {
N_POSSIBLE, /* The node could become online at some point */
N_ONLINE, /* The node is online */
N_NORMAL_MEMORY, /* The node has regular memory */                            
#ifdef CONFIG_HIGHMEM
N_HIGH_MEMORY, /* The node has regular or high memory */
#else
N_HIGH_MEMORY = N_NORMAL_MEMORY,
#endif
N_CPU, /* The node has one or more cpus */
NR_NODE_STATES
};

N_POSSIBLE 

N_ONLINE 

N_CPU是对cpu和内存热插拔有用的位,内存管理有用的是

N_NORMAL_MEMORY和

N_HIGH_MEMORY 

内存域

内核使用zone结构来描述内存域




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值