服装网站的建设与管理/b站推广网站入口2023是什么

服装网站的建设与管理,b站推广网站入口2023是什么,电子商务平台经营者有哪些,网站开发中数据库的设计原则目录 1 怎样通过object地址获取其对应的struct slab? 2 struct page、struct folio和struct slab类型之间转换,怎么保证内部关键数据的传递? 3 怎样判断一个内存空间是属于slab、page管理? 4 struct page 结构中 __mapcou…

目录

1   怎样通过object地址获取其对应的struct slab?

2   struct page、struct folio和struct slab类型之间转换,怎么保证内部关键数据的传递?

3   怎样判断一个内存空间是属于slab、page管理?

4   struct page 结构中 __mapcount 和 page_type的理解


 

        近期在解读Linux slub内存分配管理器相关代码,随着代码的不断深入会不断地自我提出新的疑问点,自己带着疑问又再次走查代码解答自我的疑问。这篇便是对于解读Slub内存时的自我疑问解。

        参考代码:Linux-6.10

1   怎样通过object地址获取其对应的struct slab?

        代码中有 slab =folio_slab(fvirt_to_folio(object)) 逻辑,也就是通过object获取其在内存中对应的page结构,在把page结构转换为folio结构,最后将folio结构转化为slab结构。也就该object对应的page结构空间,也是slab结构所在的空间。

       通过slab分配逻辑也可有得出此结论。slab分配函数alloc_slab_page调用alloc_pages_node函数分配slab空间,alloc_pages_node函数返回值为分配空间对应的page结构(其实是通过获取可用的page结构来确定可用内存),将获取的struct page结构转换为struct folio,再通过folio_slab()将folio转换为struct slab,所以slab结构的空间就是page结构空间。

2   struct page、struct folio和struct slab类型之间转换,怎么保证内部关键数据的传递?

         三个结构不仅共用内存空间,而且结构中部分关键元素在各自结构中偏移量也相同。如下系统编译时,会计算部分关键元素在struct slab、struct folio的偏移量,将此偏移量和strcut page结构中关键元素的偏移量进行对比。

        struct slab中 __page_flags 、__page_refcount 和struct page中的flags、_refcount 偏移量进行对比。

文件路径:mm/slab.h//static_asserts 编译静态判断函数,如果条件不满足则编译报错。
#define SLAB_MATCH(pg, sl)                                                \
static_assert(offsetof(struct page, pg) == offsetof(struct slab, sl))   //在编译过程判定flag在strcut page中偏移量是否和__page_flags 元素在struct slab中的偏移量是否一致,如果不一致则编译报错。
SLAB_MATCH(flags, __page_flags);    //判定_refcount在struct page中的偏移量是否和 __page_refcount在struct page中偏移量相同
SLAB_MATCH(_refcount, __page_refcount);   

        struct folio中flags、_mapcount、refcount和struct page中flags、_mapcount、_refcount元素偏移量对比。

文件路径:include/linux/mm_type.h#define FOLIO_MATCH(pg, fl)                                                \
static_assert(offsetof(struct page, pg) == offsetof(struct folio, fl))FOLIO_MATCH(flags, flags);
FOLIO_MATCH(_mapcount, _mapcount);
FOLIO_MATCH(_refcount, _refcount);

        如果关键元素的偏移量不一致,则在编译过程直接报错。如果一致时,无论结构怎么转换在不重新赋值给关键元素时,关键元素在各结构中值一致。例如将page结构转换为slab结构、在不覆盖flags元素空间时,page->flags 和 slab->_page_flags值相同。如此变保证了关键元素值在不同结构间的传递。

3   怎样判断一个内存空间是属于slab、page管理?

       上一节中可以推断出Linux内核中struct slab、和 struct folio、strcut page存在共用空间情况,哪怎样确认这个空间是属于哪个结构?或者任意一内存地址空间是属于slab还是page buddy内存管理器?

      内核提供一个判断函数 static inline bool PageSlab(const struct page *page),该函数展开后如下:

static inline bool PageSlab(const struct page *page)
{struct folio = page_folio(page);return ((folio->page.page_type & (PAGE_TYPE_BASE | PG_slab)) == PAGE_TYPE_BASE);
}

从逻辑看当pag_type中不存在PG_slab标识时,则page属于slab结构。有些反常规,常规情况会认为需要page_type中有PG_slab对应标识时才会认为该pag属于slab结构。通过代码进一步确认page_type变量来历,没有发现太多关于page_type赋值和初始化地方。但是通过struct page结构(如下),_mapcount 和 page_type共用4字节储存单元,故对于_mapcount赋值则等同于操作pagetype。

Struct page {…union {                /* This union is 4 bytes in size. *//** If the page can be mapped to userspace, encodes the number* of times this page is referenced by a page table.*/atomic_t _mapcount;/** If the page is neither PageSlab nor mappable to userspace,* the value stored here may help determine what this page* is used for.  See page-flags.h for a list of page types* which are currently stored here.*/unsigned int page_type;};
…}

      从__init_single_page - >page_mapcount_reset函数可以获取_mapcount = -1 即0xFFFF FFFF,则page_type 初始值也等于0xFFFF FFFF。如果该page要给slab用,则需要将PG_slab设置到page_type ,设置后page_type值为 0xFFFF EFFFF。当page已经为slab结构时,再去通过PageSlab()函数值进行类型判断其结果为true,则表明了此结构为slab结构,该结构对应的内存空间由slab分配器进行管理。page buddy及其他类型的判断也同此逻辑。

static inline void page_mapcount_reset(struct page *page)
{atomic_set(&(page)->_mapcount, -1);}

        当从page buddy获取到page给slab时,会调用__folio_set_slab函数对page.page_type进行PG_slab标识,表示该空间对应的slab结构,该空间由slab分配器进行管理。

slab page分配函数调用:alloc_slab_page -> __folio_set_slab

4   struct page 结构中 __mapcount 和 page_type的理解

         前文提到在struct page结构中_mapcount 和 page_type 共用4字节内存单元(同一union单元),初始化值相同为0xFFFF FFFF (-1,见page_mapcount_reset函数)。_mapcount代表该内存空间被映射用户空间的引用次数(一个物理page内存可能被映射到不同用户内存空间),page_type表示该page的类型即属于buddy、slab、table等内存管理器或者页表专用。实际使用该空间只能有个意义:要么表示用户空间引用次数、要么标识page类型。具体表示什么意义可根据该空间值的范围确认: 0xFFFF FFFF - 0xFFFF FF80 (PAGE_MAPCOUNT_RESERVE = -128  =0xFFFF FFF80)时表示该page被映射到用户空间的次数,当小于PAGE_MAPCOUNT_RE-SERVE(0xFFFF FF80)时表示该page的类型

如下两个函数可以佐证如上逻辑:

 A.page_type_has_type函数用于判定是否有page的类型,当base_type小于 PAGE_MAPCOUN-T_RESERVE(0xFFFF FF80)是被认为有page类型。

static inline int page_type_has_type(unsigned int page_type)
{return (int)page_type < PAGE_MAPCOUNT_RESERVE;}

B.page_mapcount函数获取page的到用户空间映射的应用次数,当mapcount小于PAGE_MAP-COUNT_RESERVE(0xFFFF FF80)时返回0被认为没有引用,也就是该空间被设置了Page类型(enum pagetype)。

static inline int page_mapcount(struct page *page)
{int mapcount = atomic_read(&page->_mapcount) + 1;/* Handle page_has_type() pages */if (mapcount < PAGE_MAPCOUNT_RESERVE + 1)mapcount = 0;if (unlikely(PageCompound(page)))mapcount += folio_entire_mapcount(page_folio(page));return mapcount;
}

        带着疑问走读代码总会有不一样的收货,知道自己的理解依然不够全面、甚至有误但带着问题前行会让前行更有目的,也让自己更多注重对于细节的理解。

        继续前行,日拱一卒!

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

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

相关文章

Lag-Llama时间序列模型简单实现数据预测

前言&#xff1a; 最近在大模型预测&#xff0c;简单了解了lag-llama开源项目&#xff0c;网上也有很多讲解原理的&#xff0c;这里就将如何快速上手使用说一下&#xff0c;只懂得一点点皮毛&#xff0c;有错误的地方欢迎大佬指出。 简单介绍&#xff1a; Lag-Llama 是一个开…

Plastiform复制胶泥:高精度表面复制与测量的高效工具

在工业制造和质量检测领域&#xff0c;表面复制和测量是确保产品质量的关键环节。Plastiform复制胶泥作为一种创新材料&#xff0c;凭借其出色的性能和多样化的应用&#xff0c;为用户提供了可靠的解决方案。它能够快速捕捉复杂表面的细节&#xff0c;确保测量结果的准确性&…

AI大模型、机器学习以及AI Agent开源社区和博客

以下梳理了适合学习 AI大模型、机器学习、AI Agent和多模态技术 的英文网站、社区、官网和博客&#xff0c;按类别分类整理&#xff1a; 一、官方网站与开源平台 1. AI大模型 (Large Language Models) • OpenAI • 官网: openai.com • 内容: GPT系列模型文档、研究论文、AP…

python 上下文管理器with

with 上下文管理器 上下文管理器示例如下&#xff1a;若想不使用with关键字 上下文管理器 任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器&#xff0c;上下文管理器对象可以使用 with 关键字。 必须同时具有__enter__和__exit__&#xff0c;就可以使用with语句…

CesiumJS 本地数据瓦片加载南北两极出现圆点问题

const imageryProvider new UrlTemplateImageryProvider({url: "/gisimg/{z}/{x}/{reverseY}.png",minimumLevel: 0,maximumLevel: 19})上面这段代码是加载本地切片&#xff0c;但是有个致命问题就是会出现南北两极显示蓝色圆点 解决方案&#xff1a; 加上这句话&am…

Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接

一、gcc/g基础认知 在Linux开发环境中&#xff0c;gcc和g是我们最常用的编译器工具&#xff1a; gcc&#xff1a;GNU C Compiler&#xff0c;专门用于编译C语言程序g&#xff1a;GNU C Compiler&#xff0c;用于编译C程序&#xff08;也可编译C语言&#xff09; &#x1f4cc…

飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号

2025年3月24日&#xff0c;阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量&#xff0c;飞致云&#xff08;即杭州飞致云信息科技有限公司&#xff09;凭借旗下MaxKB开源知识库问答系统、1Panel开源面板、Halo开…

Vue如何利用Postman和Axios制作小米商城购物车----简版

实现功能&#xff1a;全选、单选、购物数量显示、合计价格显示 实现效果如下&#xff1a; 思路&#xff1a; 1.数据要利用写在Postman里面&#xff0c;通过地址来调用Postman里面的数据。 2.写完数据后&#xff0c;给写的数据一个名字&#xff0c;然后加上一个空数组&#xf…

第一篇:系统分析师首篇

目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复…

CSS学习笔记4——盒子模型

目录 盒子模型是什么&#xff1f; 盒子模型的组成 一、div标签 二、边框属性 1、border-style:边框样式 2、border-width:边框宽度 3、border-color:边框颜色、border&#xff1a;综合设置 4、border-radius:圆角边框 5、border-image&#xff1a;图像边框 三、边距属性…

stable diffusion 本地部署教程 2025最新版

前提&#xff1a; 需要环境 git git下载地址Git - Downloading Package ​ 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org ​ 记得python环境一定要3.10.6&#xff01;&#xff01;&#xff01; 第一个版本 项目地址https://github.…

【二刷代码随想录】螺旋矩阵求解方法、推荐习题

一、求解方法 &#xff08;1&#xff09;按点模拟路径 在原有坐标的基准上&#xff0c;叠加 横纵坐标 的变化值&#xff0c;求出下一位置&#xff0c;并按题完成要求。但需注意转角的时机判断&#xff0c;特别是最后即将返回上一出发点的位置。 &#xff08;2&#xff09;按层…

从Manus到OpenManus:AI智能体技术如何重塑未来生活场景?

从Manus到OpenManus&#xff1a;AI智能体技术如何重塑未来生活场景&#xff1f; 一、现状&#xff1a;AI智能体技术面临的三大核心矛盾 &#xff08;通过分析用户高频痛点与市场反馈提炼&#xff09; 能力与门槛的失衡 Manus展示的复杂任务处理能力&#xff08;如股票分析、代…

Mybatis源码 插件机制

简介 插件是一种常见的扩展方式&#xff0c;大多数开源框架也都支持用户通过添加自定义插件的方式来扩展或者改变原有的功能&#xff0c;MyBatis中也提供的有插件&#xff0c;虽然叫插件&#xff0c;但是实际上是通过拦截器(Interceptor)实现的&#xff0c;在MyBatis的插件模块…

全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践

2025年3月21日&#xff0c;云轴科技ZStack在香港成功举办了主题为“ZStack AIOS 智塔与 DeepSeek 私有化方案介绍及企业应用落地实践”的 Partner Day 活动。此次活动吸引了众多海外合作伙伴&#xff0c;共同探讨 AI Infra 平台在企业私有化 AI 中的应用与价值闭环。 ZStack CT…

【C++初阶】第12课—list

文章目录 1. list的构造2. list迭代器的常见接口2.1 list遍历的迭代器接口2.2 list修改数据的迭代器接口2.3 list排序、逆序、合并相关操作的成员函数 3. 模拟实现list3.1 模拟实现list的构造3.2 模拟实现list的尾插3.3 模拟实现迭代器iterator3.4 模拟实现list的插入删除3.5 模…

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…

Windows学习笔记(4)关于MITRE

基本术语 APT&#xff08;威胁组&#xff0c;高级持续威胁&#xff09; TTP&#xff08;攻击目的技术过程&#xff0c;战术技术和程序&#xff09; ATT&CK框架 网站 https://attack.mitre.org/ CAR知识库 MITRE Engage MITRE D3FEND 网址 https://d3fend.mitre.org/

Share01-WinCC文件越用越大?

为什么你们的经典WinCC项目在客户电脑上运行的越来越慢&#xff1f;为什么查询一个历史曲线慢的要死&#xff1f;为什么重启一下电脑画面都要怀疑人生&#xff1f;具体原因可能多种多样&#xff0c;但是极大可能是您的数据管理设置欠佳&#xff0c;那么闲话少叙&#xff0c;和小…

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响&#xff0c;以有功功率损耗、电压质量及分布式电源总容量为优化目标&#xff0c;基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型&#xff0c;并提出了一种改进粒子群算法进行求解。在算例仿真中&#xff0c;基于IEEE-14标准…