tonykang22 / study

0 stars 0 forks source link

[리눅스 개발환경] 24. 리눅스 커널 - 메모리 #95

Open tonykang22 opened 2 years ago

tonykang22 commented 2 years ago

리눅스 커널 - 메모리

물리 메모리 관리

키워드


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;




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;




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;
... 
}



image



커널 메모리 할당

#include <linux/slab.h>

void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *ptr);



#include <linux/slab.h>

void *vmalloc(unsigned long size); 
void vfree(const void *addr);



버디(Buddy)와 슬랩(Slab)


슬랩 캐시 (Slab Cache)





void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags);


void kmem_cache_free(struct kmem_cache *cachep, void *objp);