首页 > 其他分享 >页帧的数据结构设计

页帧的数据结构设计

时间:2023-10-08 11:58:15浏览次数:40  
标签:struct private PG 设计 数据结构 slab page define

前言

页帧page是物理内存管理的基本单位,struct page记录了任意时刻page的所有状态,因此每一个物理页帧都需一个对应的struct page结构体记录状态,对于内存多计算机系统来说需要的struct page本身就需要大量内存进行存储,因此该结构体中每增加一个变量带来的代价会很大,需要仔细控制该结构体的size。内核中广泛使用了union,将同一时刻不会同时使用的变量作为一个union来减少内存开销。

struct page

struct page的声明如下:

  • flags: 标志位
  • _count: 使用计数,关系到内存释放。
  • _mapcount & inuse: _mapcount是页表项的映射个数,当page用于slab分配器管理时使用inuse表示包含的对象个数。
  • priave: page用作pagecahe时private存放struct buffer_head;page内容被换出时,private存放swap_entry_t;page位于伙伴系统时,存放order
  • mapping: 如果low bit没有set,指向inode的address_space,如果有low bit,指向aono_vma对象,此时clear低位bit后就可以访问到有效指针。指针都是字节对齐的,低位bit正常情况为0,可以在低位bit中添加信息。
  • slab: 指向所属的slab分配器kmem_cache结构体。
  • first_page: 用于复合页中tail page指向head page。
  • virtual: 高端内存页的虚拟地址。
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.
                     */
        unsigned int inuse; /* SLUB: Nr of 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 NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
        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_CGROUP_MEM_RES_CTLR
    unsigned long page_cgroup;
#endif
};

swap、地址映射、复合页、slab分配器等机制都会操作page结构体。

PG_FLAG

PG_FLAG是page的标志位,可以表示page当前所处的状态。一些标志位的说明如下:

  • PG_locked: 锁定,避免竞态。
  • PG_error: IO error
  • PG_reference & PG_active: 和page swap相关。
  • PG_uptodate: 数据已从块设备读取并且未出错。
  • PG_dirty: 数据未同步到磁盘。
  • PG_lru: 页面回收和切换相关,表示在active_list or inactive_list中,如果PG_active同时设置表明在active_list中。
  • PG_slab: 用于slab分配器。
  • PG_private: private变量不为空时使用。
  • PG_writeback: 处于IO写回的过程中。
  • PG_compound: 复合页。
  • PG_swapcache: 处于swap cache。
  • PG_reclaim: 内核决定回收该page时需要标记可回收。
  • PG_buddy: 位于伙伴系统中,空闲状态。
#define PG_locked    0 /* Page is locked. Don't touch. */
#define PG_error   1
#define PG_referenced   2
#define PG_uptodate   3

#define PG_dirty    4
#define PG_lru    5
#define PG_active   6
#define PG_slab    7 /* slab debug (Suparna wants this) */

#define PG_owner_priv_1   8 /* Owner use. If pagecache, fs may use*/
#define PG_arch_1   9
#define PG_reserved  10
#define PG_private  11 /* If pagecache, has fs-private data */

#define PG_writeback  12 /* Page is under writeback */
#define PG_compound  14 /* Part of a compound page */
#define PG_swapcache  15 /* Swap page: swp_entry_t in private */

#define PG_mappedtodisk  16 /* Has blocks allocated on-disk */
#define PG_reclaim  17 /* To be reclaimed asap */
#define PG_buddy  19 /* Page is free, on buddy lists */

/* PG_readahead is only used for file reads; PG_reclaim is only for writes */
#define PG_readahead  PG_reclaim /* Reminder to do async read-ahead */

/* PG_owner_priv_1 users should have descriptive aliases */
#define PG_checked  PG_owner_priv_1 /* Used by some filesystems */
#define PG_pinned  PG_owner_priv_1 /* Xen pinned pagetable */

标签:struct,private,PG,设计,数据结构,slab,page,define
From: https://www.cnblogs.com/wodemia/p/17748527.html

相关文章

  • 【后台体验】运营后台订单详情设计分享
    目前大部分运营后台的设计和开发都是由后端同学来做,产品经理对界面标准要求并不高,大多数都是能用就行。其实,只要花些心思,运营后台也可以做的很美,提升运营同学的日常使用体验。下面跟大家分享两个我做的运营后台中的订单详情设计1.共享图书平台运营后台订单详情设计心路历程:产......
  • 内存管理中的关键数据结构
    前言在谈Linux内存管理框架之前需要了解NUMA,NUMA是非一致性内存访问(Uon-UniformMemoryAccess)的缩写,与之相反的是一致性内存访问UMA。在多核的UMA架构的机器上,CPU视角下所有的内存都是均匀的,不同CPU访问同一块内存的延迟是相同;而在NUMA架构的机器上内存被划分为不同的区域,对CP......
  • 94基于java的智能物流管理系统设计与实现(含配套lun文,可参考做毕设)
    本章节给大家带来一个基于java智能物流管理系统设计与实现,可适用于校园物流管理系统,物流配送系统,快递物流管理,物流追踪系统,物流系统,物流运输系统,javaweb物流系统,springboot物流管理系统,javaweb智能物流系统等等;项目背景随着互联网技术的快速发展,网络时代的到来,网络信息也将会......
  • 网络规划设计师真题解析--独立磁盘冗余阵列(二)(容量的计算)
    假如有3块容量是160G的硬盘做RAID5阵列,则这个RADI5的容量是(1);而如果有2块160G的盘和1块80G的盘,此时RAID5的容量是(2)。(1)A.320G    B.160G     C.80G     D.40G(2)A.40G     B.80G     C.160G    D.200G答案:(1)A (2)C解析:常见的RAID......
  • 94基于java的智能物流管理系统设计与实现(含配套lun文,可参考做bi设)
    本章节给大家带来一个基于java智能物流管理系统设计与实现,可适用于校园物流管理系统,物流配送系统,快递物流管理,物流追踪系统,物流系统,物流运输系统,javaweb物流系统,springboot物流管理系统,javaweb智能物流系统等等;项目背景随着互联网技术的快速发展,网络时代的到来,网络信息也将会......
  • 【后台体验】运营后台订单详情设计分享 | 京东云技术团队
    目前大部分运营后台的设计和开发都是由后端同学来做,产品经理对界面标准要求并不高,大多数都是能用就行。其实,只要花些心思,运营后台也可以做的很美,提升运营同学的日常使用体验。下面跟大家分享两个我做的运营后台中的订单详情设计1.共享图书平台运营后台订单详情设计心路历程:产品经......
  • Sovit2D在线组态设计 构建LNG加气站Web Scada控制系统
    前言天然气是最清洁的化石能源,天然气使用安全、应用广泛,在炊事、供热、发电、交通等领域扮演重要角色。LNG(液化天然气)作为一种市场化的全球能源,能够很好的解决天然气的可及性问题。建设背景在LNG行业迅速发展的同时,加气站的监管难度加大,加之许多地方管理工作相对薄弱滞后、控......
  • Java设计模式之策略模式
    1.1 概述先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。定......
  • 2023-2024-1 20231413 《计算机基础与程序设计》第二周学习总结
    班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程目标:自学教材:计算机科学概论第1章并完成云班课测试《C语言程序设计》第1章并完成云班课测试教材学习内容总结:再次阅读了《计算机科学概论》第1章,更加了解了计算机与计算系统;对C语......
  • 软件设计师学习-海明码
    wiki海明码(HammingCode)是由贝尔实验室的RichardHamming设计的,是一种利用奇偶校验来检错和纠错的校验方法。方法是在数据位插入k个校验位,通过扩大码距来实现检错和纠错。1.理论构成设数据位有n位置,校验位有k位,则n与k需要满足关系:2k-1≥n+k。按照如下规则......