• struct page*


    struct page {
            unsigned long flags;            /* Atomic flags, some possibly
                                             * updated asynchronously */
            atomic_t _count;                /* Usage count, see below. */
            union {
                    atomic_t _mapcount;     /* Count of ptes mapped in mms,
                                             * to show when page is mapped
                                             * & limit reverse map searches.
                                             */
                    struct {                /* SLUB */
                            u16 inuse;
                            u16 objects;
                    };
            };
            union {
                struct {
                    unsigned long private;          /* Mapping-private opaque data:
                                                     * usually used for buffer_heads
                                                     * if PagePrivate set; used for
                                                     * swp_entry_t if PageSwapCache;
                                                     * indicates order in the buddy
                                                     * system if PG_buddy is set.
                                                     */
                    struct address_space *mapping;  /* If low bit clear, points to
                                                     * inode address_space, or NULL.
                                                     * If page mapped as anonymous
                                                     * memory, low bit is set, and
                                                     * it points to anon_vma object:
                                                     * see PAGE_MAPPING_ANON below.
                                                     */
                };
    #if USE_SPLIT_PTLOCKS
                spinlock_t ptl;
    #endif
                struct kmem_cache *slab;    /* SLUB: Pointer to slab */
                struct page *first_page;    /* Compound tail pages */
            };
            union {
                    pgoff_t index;          /* Our offset within mapping. */
                    void *freelist;         /* SLUB: freelist req. slab lock */
            };
            struct list_head lru;           /* Pageout list, eg. active_list
                                             * protected by zone->lru_lock !
                                             */
            /*
             * On machines where all RAM is mapped into kernel address space,
             * we can simply calculate the virtual address. On machines with
             * highmem some memory is mapped into kernel virtual memory
             * dynamically, so we need a place to store that address.
             * Note that this field could be 16 bits on x86 ... ;)
             *
             * Architectures with slow multiplication can define
             * WANT_PAGE_VIRTUAL in asm/page.h
             */
    #if defined(WANT_PAGE_VIRTUAL)
            void *virtual;                  /* Kernel virtual address (NULL if
                                               not kmapped, ie. highmem) */
    #endif /* WANT_PAGE_VIRTUAL */
    #ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
            unsigned long debug_flags;      /* Use atomic bitops on this */
    #endif
    
    #ifdef CONFIG_KMEMCHECK
            /*
             * kmemcheck wants to track the status of each byte in a page; this
             * is a pointer to such a status block. NULL if not tracked.
             */
            void *shadow;
    #endif
    };
    
    /*
     * A region containing a mapping of a non-memory backed file under NOMMU
     * conditions.  These are held in a global tree and are pinned by the VMAs that
     * map parts of them.
     */
    struct vm_region {
            struct rb_node  vm_rb;          /* link in global region tree */
            unsigned long   vm_flags;       /* VMA vm_flags */
            unsigned long   vm_start;       /* start address of region */
            unsigned long   vm_end;         /* region initialised to here */
            unsigned long   vm_top;         /* region allocated to here */
            unsigned long   vm_pgoff;       /* the offset in vm_file corresponding to vm_start */
            struct file     *vm_file;       /* the backing file or NULL */
    
            int             vm_usage;       /* region usage count (access under nommu_region_sem) */
            bool            vm_icache_flushed : 1; /* true if the icache has been flushed for
                                                    * this region */
    };

      1 unsigned long flags

    unsigned long flags
    //flags在page-flags.h文件夹中枚举
    //paging_init()可设置PG_reserved做flags
    //mem_init()可设置含PG_reserved的flags清除
    //#define PG_reserved 11;表示页保留,无法被__free_page()回收

      2 atomic_t _count和atumic_t _mapcount 

    atomic_t _count;          //页引用计数器
    atomic_t _mapcount;    //页映射计数器
    //paging_init()可以将它们初始化为-1
    //mem_init()可以将所有位码为0的页的_count设置为0
    //page_count和page_mapcount可以统计其实用者个数
    //_count+1为页使用者个数,_mapcount+1为页共享者个数
    // _count为-1时不可被__free_page()释放
    //_mapcount为0表示该页未被共享

      3 unsigned long private

    unsigned long private;        //私有数据指针
    //设置为PG_private,则private字段指向struct buffer_head
    //设置为PG_compound,则指向struct page
    //设置为PG_swapcache,则private为swp_entry_t的成员变量val

      4 struct address_space *mapping

    struct address_space *mapping;  //该页所在地址空间描述结构指针
    /*page->mapping == 0 属于交换高速缓存页
    *page->mapping != 0 且第0位为1,为匿名页,指向struct anon_vma
    *page->mapping != 0 且第0位为0,指向struct address_space地址空间结构变量
    */

      5 pgoff_t index

    pgoff_t index; 
    //该页描述结构在地址空间radix树page_tree中的对象索引号即页号
    //表示该页在vm_file中的便宜页数
    //#define unsigned long pgoff_t

      6 struct list_head lru

    struct list_head lru; //最近、最久未使用struct slab结构指针变量
    //设置PG_slab,则该页由slab分配器来管理,lru.next指向kmem_cache_t结构变量,lru.prev则指向struct slab结构

      7 struct pagevec

    struct pagevec {                //页向量描述结构
            unsigned long nr;       //该页向量中的内存页数
            unsigned long cold;    //冷区标志,0表示热区,非0表示冷区
            struct page *pages[PAGEVEC_SIZE];
            //该也想两种的页描述结构指针数组(PAGEVEC_SIZE=14)
    };

      8 struct page_address_map

    struct page_address_map {        //页地址映射
            struct page *page;            //页的描述结构
            void *virtual;                //页的虚拟地址
            struct list_head list;           //通过list字段链接到页表池全局链表page_address_pool中或page_address_htable[hash_ptr(page,PA_HASH_ORDER)].lh
    };    

      9 struct page_address_slot

    static struct page_address_slot {
            struct list_head lh;                    /* List of page_address_maps */
            spinlock_t lock;                        /* Protect this bucket's list */
    } ____cacheline_aligned_in_smp page_address_htable[1<<PA_HASH_ORDER];
  • 相关阅读:
    【BUG修复】视频综合管理平台EasyNVS首页设备接入情况显示与实际不符如何调整?
    数据库连接池
    手写SORM(simple object relation mapping)框架3—DBManager和TableContext的设计
    jdbc—总结
    jdbc—CLOB和BLOB
    jdbc—时间处理
    jdbc—事务
    递归(最大公约数)
    C++ return
    函数参数
  • 原文地址:https://www.cnblogs.com/plinx/p/2860520.html
Copyright © 2020-2023  润新知