struct page

news/2025/11/2 22:07:58/文章来源:https://www.cnblogs.com/sunbines/p/19185521

 

 

/** 系统中的每一个物理页(physical page)都对应一个 struct page 结构,* 用于追踪该页当前的用途。注意,我们无法追踪哪些任务(task)* 正在使用这个页;但如果该页是一个 pagecache 页面,* 我们可以通过 rmap(reverse mapping)结构来知道是谁映射了它。** 如果你是通过 alloc_pages() 分配页面,* 那么你可以把 struct page 中的一部分空间用于你自己的目的。* 在主 union 中的五个字(5 words, 即 20/40 字节)是可用的,* 但第一个字(word)的 bit 0 必须保持清零。* 许多使用者会把这个字用于存储一个已对齐的指针。* 如果你使用了与 page->mapping 相同的存储位置,* 那么在释放该页面前必须把它恢复为 NULL。** 如果你的页面不会映射到用户空间(userspace),* 那么你还可以使用 mapcount union 中的四个字节,* 但在释放页面前必须调用 page_mapcount_reset()。** 如果你想使用 refcount 字段,* 那么必须保证其他 CPU 临时增加或减少引用计数时不会引发问题。* 从 alloc_pages() 得到的页面,其 refcount 初始为正数。** 如果你分配的是 order > 0 的连续页(compound page),* 那么你可以在每个子页中使用部分字段,* 但在释放之前可能需要恢复它们的值。** SLUB 使用 cmpxchg_double() 来原子更新 freelist 和计数器。* 这要求 freelist 和 counters 必须相邻且双字(double-word)对齐。* 我们会把所有 struct page 按双字边界对齐,* 并保证结构中的 'freelist' 字段在结构体中是对齐的。*/#ifdef CONFIG_HAVE_ALIGNED_STRUCT_PAGE
#define _struct_page_alignment	__aligned(2 * sizeof(unsigned long))
#else
#define _struct_page_alignment
#endifstruct page {unsigned long flags;		/* 原子标志位(atomic flags),部分可能异步更新 *//** 这个 union 中有五个字(20/40 字节)可用。* 注意:第一个字(word)的 bit 0 被 PageTail() 使用。* 因此,其他使用这个 union 的代码不能使用该位,* 否则会引发冲突和误判 PageTail()。*/union {struct {	/* 用于 page cache 和匿名页(anonymous pages) *//*** @lru: 页面回收链表(pageout list),* 例如 active_list,由 pgdat->lru_lock 保护。* 有时也被页面所有者作为通用链表使用。*/struct list_head lru;/* 参见 page-flags.h 中的 PAGE_MAPPING_FLAGS */struct address_space *mapping;pgoff_t index;		/* 在 mapping 中的偏移(页索引) *//*** @private: 映射私有的不透明数据。* 如果 PagePrivate 被设置,通常用于 buffer_heads。* 如果是 PageSwapCache,存放 swp_entry_t。* 如果是 PageBuddy,表示 buddy 系统中的 order。*/unsigned long private;};struct {	/* 网络栈(netstack)使用的 page_pool *//*** @dma_addr: 在 32 位架构上可能需要 64 位值。*/unsigned long dma_addr[2];};struct {	/* slab、slob 和 slub 分配器使用 */union {struct list_head slab_list;struct {	/* 部分页(Partial pages) */struct page *next;
#ifdef CONFIG_64BITint pages;	/* 剩余页数 */int pobjects;	/* 大致对象数 */
#elseshort int pages;short int pobjects;
#endif};};struct kmem_cache *slab_cache; /* 非 slob 使用 *//* 双字对齐边界 */void *freelist;		/* 第一个空闲对象 */union {void *s_mem;	/* slab:第一个对象 */unsigned long counters;		/* SLUB 模式 */struct {			/* SLUB 模式 */unsigned inuse:16;unsigned objects:15;unsigned frozen:1;};};};struct {	/* compound page 的尾页(tail page) */unsigned long compound_head;	/* 第 0 位(bit zero)被置位 *//* 仅第一个 tail page 使用 */unsigned char compound_dtor;unsigned char compound_order;atomic_t compound_mapcount;unsigned int compound_nr; /* 1 << compound_order */};struct {	/* compound page 的第二个尾页 */unsigned long _compound_pad_1;	/* compound_head 占位 */atomic_t hpage_pinned_refcount;/* 同时用于全局和 memcg */struct list_head deferred_list;};struct {	/* 页表页(page table pages) */unsigned long _pt_pad_1;	/* compound_head 占位 */pgtable_t pmd_huge_pte; /* 由 page->ptl 保护 */unsigned long _pt_pad_2;	/* mapping 占位 */union {struct mm_struct *pt_mm; /* 仅 x86 pgd 使用 */atomic_t pt_frag_refcount; /* powerpc 使用 */};
#if ALLOC_SPLIT_PTLOCKSspinlock_t *ptl;
#elsespinlock_t ptl;
#endif};struct {	/* ZONE_DEVICE 类型的页面 *//** @pgmap: 指向对应的设备页映射结构 */struct dev_pagemap *pgmap;void *zone_device_data;/** ZONE_DEVICE 私有页面会被认为是已映射的,* 因此接下来的三个字(mapping、index、private)* 用于在页面被迁移到设备私有内存时,* 保存源匿名页或页缓存页的信息。* 对于 ZONE_DEVICE 类型为 MEMORY_DEVICE_FS_DAX 的页,* 当 pmem 支持的 DAX 文件被映射时,* 这些字段(mapping、index、private)同样会被使用。*/};/** @rcu_head: 可用于通过 RCU 延迟释放页面。 */struct rcu_head rcu_head;};union {		/* 该 union 占 4 字节 *//** 如果页面可映射到用户空间,* 则该字段表示该页面被页表引用的次数。*/atomic_t _mapcount;/** 如果页面既不是 PageSlab,也不会映射到用户空间,* 那么这里存储的值可以用来表示页面的用途。* 可参考 page-flags.h 中当前定义的页面类型。*/unsigned int page_type;unsigned int active;		/* SLAB 使用 */int units;			/* SLOB 使用 */};/* 使用计数。不要直接使用,请参见 page_ref.h */atomic_t _refcount;#ifdef CONFIG_MEMCGunion {struct mem_cgroup *mem_cgroup;struct obj_cgroup **obj_cgroups;};
#endif/** 在所有物理内存都映射到内核地址空间的机器上,* 可以直接计算出虚拟地址。* 但在 highmem 架构上,一部分内存是动态映射的,* 因此需要保存映射时的虚拟地址。* 注意:在 x86 上该字段可能只有 16 位。** 对于乘法较慢的架构,可以在 asm/page.h 中定义* WANT_PAGE_VIRTUAL。*/
#if defined(WANT_PAGE_VIRTUAL)void *virtual;	/* 内核虚拟地址(如果未 kmap 则为 NULL,即 highmem) */
#endif /* WANT_PAGE_VIRTUAL */#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGSint _last_cpupid;
#endif
} _struct_page_alignment;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NFS 服务端/客户端配置

下面为你介绍基于CentOS7的NFS服务端和客户端的配置方法。 NFS服务端配置安装NFS服务相关软件包yum install -y nfs-utils rpcbind 启动并设置开机自启服务systemctl start rpcbind systemctl start nfs-server system…

CSP-S2025 题目解析

看了我的游记的都知道我每道题目的做题情况。 T1 比较简单的签到题目。 你先贪心选每个数最大的那个组,然后判断有没有某一个组的大于 \(\frac{n}{2}\),显然这种组有且仅有一个。 我们考虑把这个组的某些数换组,那么…

[Record] CSP-S 2025 邮寄

也不算特别寄,但是出考场之后 \(\texttt{T3}\) \(\texttt{T4}\) 都胡出来了,就很难绷。\(\texttt{T1}\) 水题,读完题写写就过了。 \(\texttt{T2}\) 胡思乱想了一会,然而并没有想到比 \(O(m\log m+nk2^k\alpha(n))\…

CH59x/CH58X蓝牙从机白名单使用

蓝牙从机设置白名单,可以只扫描应答(白名单中列出的)设备,只允许(白名单中列出的)设备连接。 蓝牙主机设置白名单,可以只扫描、连接特定的蓝牙设备(白名单中列出的)。 一.蓝牙从机白名单设置有关的函数介绍:…

算法实践第二次作业

一、找第 k 小的数的分治算法描述(伪代码 + 自然语言) 伪代码 plaintext function findKthSmallest(arr, low, high, k): if low == high: # 子数组仅1个元素,直接返回 return arr[low] # 步骤1:选基准元素(此处…

CSP2025总结

J组: 应该是最有机会 AK 的一次。 T1,T2 都是一眼题,用 30min 简单写完后看 T3

hello!

第一篇!第一篇博客园博客! 之前用Astro搭建了个人博客,但是没有评论区的反馈确实博客就像写学习笔记一样,中间出现了很多错误也没人说。。所以来博客园了! 希望这里能见证自己剩下两年半xcpc的学习时光o( ̄▽ ̄)ブ…

docker 交付方案AI设计备份

基于当前项目结构,Docker 交付和在线升级计划如下: Docker 交付与在线升级方案 一、总体架构设计 1.1 容器化策略应用镜像:为 FastAPI 主应用构建独立 Docker 镜像服务编排:使用 Docker Compose 编排所有服务数据持…

2025 CSP-S 游记

Day 0: 大巴上基本啥也没干,发会呆,看会b站就到了。 带了笔记本,晚上CS启动!打了两把小镇一把没赢。/ll 22:30算早睡吗。 Day 1: 上午6:14突然醒了,上了个厕所又睡下去了,7:30再次醒来,感觉睡得比去年好。 因为…

[题解]CSP-S 2025 T1~T3 题解

T1. P14361 [CSP-S 2025] 社团招新 / club Tag:贪心、排序。 因为要求每个社团不超过 \(\dfrac{n}{2}\) 个人,所以无论怎么分配,最多只会有一个社团超出限制。 因此,我们先让每个人选最满意的社团。若存在超出限制…

关于git关联github问题

本地GIT绑定GITHUB 配置本地GIT信息 #配置用户名 git config --global user.name "test"#配置邮箱 git config --global user.email abc@163.com生成本地密钥和公钥 生成ssh文件夹(生成ssh秘钥)(输入$ s…

AT ABC285E Work or Rest 题解

SolutionLink 有趣的 DP 题,难点在于从哪里开始入手以及优化(也许)。 显然 DP 可以方便地处理这个 \(\max\) 值的转移,但是从哪个位置开始 DP 呢?注意到周期呈现环状,也就是说一周的第 \(n\) 天和下一周的第 \(1…

代码复杂度的代价远比你想象得大

引言:复杂度的代价远比你想象得大 在 Java 后端系统演进过程中,代码复杂度是影响可维护性、稳定性和迭代效率的核心因素。然而,复杂度往往被忽视,直到一次“小改动”引发线上事故,才被重新审视。 本文以“复杂度战…

CSP2025 - S 年度总结大会报告

各大 oj 估分:洛谷:\(100+52+10+8=170\)。 小图灵:\(100+60+?+8=168+?\),当时他 \(T_3\) 数据还没有造。 梦熊:\(100+92+30+8=230\),感觉不准。自己估分:\(100+[48,70]+[0,40]+8=[156,218]\)。 第一:明确自己…

25CSP退役游记(11.1更新)

关于我在考虑要不要把S1的P话也加进来这件事 day—— -5 今天天气晴朗,不很像秋天,更不像济南今年的秋天。 考前焦虑期也是要休息的。它从一周之前来,从三四天之后来,这么算三个周能休七八天,比我的假期多多了。但…

第二章实践作业

第二章实践作业分治法找第 k 小的数:基础理解与思考 一、用分治法找第 k 小的数 找第 k 小的数,用分治法来解决其实思路还挺直观的。大概可以分成这几步: 先选一个 “基准数”,随便从数组里挑一个就行,比如选第一…

(补11月)代码大全阅读笔记2

第6-9章的架构设计内容,彻底解答了我长期以来的核心困惑:为何同样实现了基础功能的代码,有的在后续迭代中能轻松响应需求变化,有的却如同“牵一发而动全身”的乱麻,修改一个小功能就引发连锁bug。书中系统阐述的“…

java 基础语法一

java 基础语法一 一、基本概念 冯诺依曼结构,Java三大版本、编译型和解释型语言 1、五大组成部分:运算器、控制器、存储器、输入设备和输出设备;核心特点:采用二进制表示、存储程序原理、顺序执行指令 2、javaSE(…

VisualStudio 2022如何打开.slnx文件格式的解决方案

打开VisualStudio 2022,菜单中设置-选项-环境 > 预览功能 > 勾选最下方的“使用解决方案文件持久性模型”设置,再手动对.slnx文件进行关联设置即可。

(补11月)代码大全阅读笔记3

研读第23-25章关于测试与调试的内容后,我彻底摒弃了“开发负责写代码,测试负责找bug”的错误认知,建立起“开发者是质量第一责任人”的核心意识。书中一组数据让我尤为震撼:单元测试阶段发现并修复bug的成本,仅为…