struct pglist_data *pgdat_list[];
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];
struct zonelist node_zonelists[MAX_ZONELISTS];
int nr_zones;
struct page *node_mem_map;
struct bootmem_data *bdata;
unsigned long node_start_pfn;
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;
wait_queue_head_t pfmemalloc_wait;
struct task_struct *kswapd; /* Protected by mem_hotplug_begin/end() */
...
unsigned long flags;
...
} pg_data_t;
zone
메모리 내의 범위를 나타내는 노드 내의 블록
ZONE_DMA/ZONE_DMA32 (0 ~ 16M) : ISA 버스 기반 디바이스에서 사용
ZONE_NORMAL (16 ~ 896M) : 커널의 가상 주소 공간과 1:1 연결
ZONE_HIGHMEM (896 ~ End) : 필요할 때 동적으로 연결
/proc/zoneinfo 참조
`/include/linux/mmzone.h``
struct zone {
unsigned long watermark[NR_WMARK];
unsigned long nr_reserved_highatomic;
long lowmem_reserve[MAX_NR_ZONES];
int node;
struct pglist_data *zone_pgdat;
struct per_cpu_pageset __percpu *pageset;
unsigned long zone start_pfn;
unsigned long managed_pages;
unsigned long spanned_pages;
unsigned long present_pages;
const char *name;
...
} ____cacheline_internodealigned_in_smp;
page
물리 메모리의 최소 단위를 페이지 프레임(page frame)이라 부른다.
각각의 zone은 자신에 속해 있는 페이지 프레임을 관리
/include/linux/mm_types.h
page 구조체
mem_map 이라는 전역 배열을 통해 접근
struct page {
unsigned long flags; /* Atomic flags, some possibly updated asynchronously */
union {
struct address_space *mapping;
void *s_mem; /* slab first object */
atomic_t compound_mapcount; /* first tail page */
};
union {
pgoff_t index; /* Our offset within mapping. */
void *freelist; /* sl[aou]b first free object */
};
union {
unsigned counters;
struct {
union {
atomic_t _mapcount;
...
}
리눅스 커널 - 메모리
물리 메모리 관리
키워드
/include/linux/mmzone.h
/proc/zoneinfo
참조/include/linux/mm_types.h
커널 메모리 할당
버디(Buddy)와 슬랩(Slab)
슬랩 캐시 (Slab Cache)