zoukankan      html  css  js  c++  java
  • Linux内核中关于内存的数据结构

    • 物理页面  
    /*
     * Try to keep the most commonly accessed fields in single cache lines
     * here (16 bytes or greater).  This ordering should be particularly
     * beneficial on 32-bit processors.
     *
     * The first line is data used in page cache lookup, the second line
     * is used for linear searches (eg. clock algorithm scans). 
     */
    typedef struct page {
        struct list_head list;
        struct address_space *mapping;
        unsigned long index;
        struct page *next_hash;
        atomic_t count;
        unsigned long flags;       /* atomic flags, some possibly updated asynchronously */
        struct list_head lru;
        unsigned long age;
        wait_queue_head_t wait;
        struct page **pprev_hash;
        struct buffer_head * buffers;
        void *virtual;             /* non-NULL if kmapped */
        struct zone_struct *zone;
    } mem_map_t;
    • 虚拟空间
    /*
     * Linux kernel virtual memory manager primitives.
     * The idea being to have a "virtual" mm in the same way
     * we have a virtual fs - giving a cleaner interface to the
     * mm details, and allowing different kinds of memory mappings
     * (from shared memory to executable loading to arbitrary
     * mmap() functions).
     */
    
    /*
     * This struct defines a memory VMM memory area. There is one of these
     * per VM-area/task.  A VM area is any part of the process virtual memory
     * space that has a special rule for the page-fault handlers (ie a shared
     * library, the executable area etc).
     */
    struct vm_area_struct {
        struct mm_struct * vm_mm;    /* VM area parameters */
        unsigned long vm_start;
        unsigned long vm_end;
    
        /* linked list of VM areas per task, sorted by address */
        struct vm_area_struct *vm_next;
    
        pgprot_t vm_page_prot;
        unsigned long vm_flags;
    
        /* AVL tree of VM areas per task, sorted by address */
        short vm_avl_height;
        struct vm_area_struct * vm_avl_left;
        struct vm_area_struct * vm_avl_right;
    
        /* For areas with an address space and backing store,
         * one of the address_space->i_mmap{,shared} lists,
         * for shm areas, the list of attaches, otherwise unused.
         */
        struct vm_area_struct *vm_next_share;
        struct vm_area_struct **vm_pprev_share;
    
        struct vm_operations_struct * vm_ops;
        unsigned long vm_pgoff;        /* offset in PAGE_SIZE units, *not* PAGE_CACHE_SIZE */
        struct file * vm_file;
        unsigned long vm_raend;
        void * vm_private_data;        /* was vm_pte (shared mem) */
    };
    • 进程用户空间的抽象:mm_struct,一个进程只有一个mm_struct结构,当一个mm_struct结构却可以为多个进程所共享,例如当一个进程创建一个子进程时(vfork或clone),子进程与父进程共享一个mm_struct,
    struct mm_struct {
        struct vm_area_struct * mmap;        /* list of VMAs */
        struct vm_area_struct * mmap_avl;    /* tree of VMAs */
        struct vm_area_struct * mmap_cache;    /* last find_vma result */
        pgd_t * pgd;
        atomic_t mm_users;            /* How many users with user space? */
        atomic_t mm_count;            /* How many references to "struct mm_struct" (users count as 1) */
        int map_count;                /* number of VMAs */
        struct semaphore mmap_sem;
        spinlock_t page_table_lock;
    
        struct list_head mmlist;        /* List of all active mm's */
    
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long start_brk, brk, start_stack;
        unsigned long arg_start, arg_end, env_start, env_end;
        unsigned long rss, total_vm, locked_vm;
        unsigned long def_flags;
        unsigned long cpu_vm_mask;
        unsigned long swap_cnt;  /* number of pages to swap on next pass */
        unsigned long swap_address;
    
        /* Architecture-specific MM context */
        mm_context_t context;
    };
    ------------------------------- 问道,修仙 -------------------------------
  • 相关阅读:
    关于配置文件权衡,.config VS .xml
    Google不支持小于12px字体 终极办法
    两个表循环的复杂度分析 征集
    SQL 计算列
    5分钟上手写ECharts的第一个图表
    NGif, Animated GIF Encoder for .NET
    Chart系列(一):Chart的基本元素
    一张广告图片引起的思维DFS
    洛谷 P2580 于是他错误的点名开始了
    洛谷 P1496 火烧赤壁
  • 原文地址:https://www.cnblogs.com/elvalad/p/4242814.html
Copyright © 2011-2022 走看看