关于宏PageReserved

在Ubuntu 20.04上搞定ucore Lab 2物理内存管理:从first-fit到页表映射的保姆级踩坑实录 本文详细介绍了在Ubuntu 20.04上完成ucore Lab 2物理内存管理实验的全过程,包括first-fit算法实现和页表映射机制。从实验环境配置到关键代码实现,再到调试技巧和常见问题解决,提供了全面的保姆级指导,帮助读者深入理解操作系统物理内存管理的核心原理与实践。 阅读详情
 

宏PageReserved用来检测是否是该页是否为内核代码所用或者该页根本就没有使用。

定义在include/linux/page-flags.h中

#define TESTPAGEFLAG(uname, lname)                                \

static inline int Page##uname(struct page *page)                      \

                     { return test_bit(PG_##lname, &page->flags); }

#define SETPAGEFLAG(uname, lname)                                  \

static inline void SetPage##uname(struct page *page)                \

                     { set_bit(PG_##lname, &page->flags); }

#define CLEARPAGEFLAG(uname, lname)                              \

static inline void ClearPage##uname(struct page *page)                    \

                     { clear_bit(PG_##lname, &page->flags); }

#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname)             \

       SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)

#define __CLEARPAGEFLAG(uname, lname)                                 \

static inline void __ClearPage##uname(struct page *page)          \

                     { __clear_bit(PG_##lname, &page->flags); }

PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)

 

其中

__clear_bit() is non-atomic,

clear_bit - Clears a bit in memory. clear_bit() is atomic and may not be reordered.

set_bit - Atomically set a bit in memory. set_bit() is atomic and may not be reordered.

   

至于flag PG_reserved,在ULK第八章里有描述:

PG_reserved:The page frame is reserved for kernel code or is unusable.页框留给内核代码或者没有使用。

 

/*

 * Various page->flags bits:

 *

 * PG_reserved is set for special pages, which can never be swapped out. Some

 * of them might not even exist (eg empty_bad_page)...

 *

 * The PG_private bitflag is set on pagecache pages if they contain filesystem

 * specific data (which is normally at page->private). It can be used by

 * private allocations for its own usage.

 *

 * During initiation of disk I/O, PG_locked is set. This bit is set before I/O

 * and cleared when writeback _starts_ or when read _completes_. PG_writeback

 * is set before writeback starts and cleared when it finishes.

 *

 * PG_locked also pins a page in pagecache, and blocks truncation of the file

 * while it is held.

 *

 * page_waitqueue(page) is a wait queue of all tasks waiting for the page

 * to become unlocked.

 *

 * PG_uptodate tells whether the page's contents is valid.  When a read

 * completes, the page becomes uptodate, unless a disk I/O error happened.

 *

 * PG_referenced, PG_reclaim are used for page reclaim for anonymous and

 * file-backed pagecache (see mm/vmscan.c).

 *

 * PG_error is set to indicate that an I/O error occurred on this page.

 *

 * PG_arch_1 is an architecture specific page state bit.  The generic code

 * guarantees that this bit is cleared for a page when it first is entered into

 * the page cache.

 *

 * PG_highmem pages are not permanently mapped into the kernel virtual address

 * space, they need to be kmapped separately for doing IO on the pages.  The

 * struct page (these bits with information) are always mapped into kernel

 * address space...

 *

 * PG_buddy is set to indicate that the page is free and in the buddy system

 * (see mm/page_alloc.c).

 *

 */

 

/*

 * Don't use the *_dontuse flags.  Use the macros.  Otherwise you'll break

 * locked- and dirty-page accounting.

 *

 * The page flags field is split into two parts, the main flags area

 * which extends from the low bits upwards, and the fields area which

 * extends from the high bits downwards.

 *

 *  | FIELD | ... | FLAGS |

 *  N-1           ^       0

 *               (NR_PAGEFLAGS)

 *

 * The fields area is reserved for fields mapping zone, node (for NUMA) and

 * SPARSEMEM section (for variants of SPARSEMEM that require section ids like

 * SPARSEMEM_EXTREME with !SPARSEMEM_VMEMMAP).

 */

enum pageflags {

       PG_locked,            /* Page is locked. Don't touch. */

       PG_error,

       PG_referenced,

       PG_uptodate,

       PG_dirty,

       PG_lru,

       PG_active,

#ifdef CONFIG_FASTFREE

       PG_fastfree,

#endif

       PG_slab,

       PG_owner_priv_1, /* Owner use. If pagecache, fs may use*/

       PG_arch_1,

       PG_reserved,

       PG_private,           /* If pagecache, has fs-private data */

       PG_writeback,              /* Page is under writeback */

#ifdef CONFIG_PAGEFLAGS_EXTENDED

       PG_head,              /* A head page */

       PG_tail,          /* A tail page */

#else

       PG_compound,             /* A compound page */

#endif

       PG_swapcache,            /* Swap page: swp_entry_t in private */

       PG_mappedtodisk, /* Has blocks allocated on-disk */

       PG_reclaim,           /* To be reclaimed asap */

       PG_buddy,            /* Page is free, on buddy lists */

#ifdef CONFIG_IA64_UNCACHED_ALLOCATOR

       PG_uncached,              /* Page has been mapped as uncached */

#endif

       __NR_PAGEFLAGS,

 

       /* Filesystems */

       PG_checked = PG_owner_priv_1,

 

       /* XEN */

       PG_pinned = PG_owner_priv_1,

       PG_savepinned = PG_dirty,

 

       /* SLOB */

       PG_slob_page = PG_active,

       PG_slob_free = PG_private,

 

       /* SLUB */

       PG_slub_frozen = PG_active,

       PG_slub_debug = PG_error,

};

操作系统ucore lab2实验报告 Lab2Exercise0:填写已有实验使用meld将lab1中的代码填入实验中Exercise1:实现 first-fit 连续物理内存分配算法default_init()static void default_init(void) { list_init(&free_list); nr_free = 0; }这个函数的正确代码已经给出,不需要进行修改。函数的作用是对free_li 阅读详情

相关推荐

Oracle Scheduler任务故障诊断 实战指南

当基础环境无异常时,需聚焦任务本身的配置与状态。定义(JOB)→ 调度(SCHEDULE)→ 执行(SLAVE进程)→ 日志(LOG),每个环节都可能存在卡点。Oracle Scheduler任务的“隐性故障”看似棘手,实则是环境配置、资源竞争、时间逻辑等问题的集中体现。通过本文的诊断工具和排查思路,你可以构建从“基础环境→任务配置→执行链路→日志追踪”的全维度分析体系,让每一个“消失”的任务都无所遁形。

Nuzbb的博客 1073

了解Linux内核内存映射

当X86引入物理地址扩展(Pisycal Addrress Extension, PAE)后,可以支持大于4G的物理内存(36位),但虚拟地址依然是32位,原先的页表项不适用,它实际多4 bytes被扩充到8 bytes,这意味着,每一页现在能存放的pte数目从1024变成512了(4k/8)。访问之前先找到一段1MB大小的空闲地址空间,假设找到的空闲地址空间为0xF8700000 ~ 0xF87FFFFF,用这1MB的逻辑地址空间映射到物理地址空间0×80000000 ~ 0x800FFFFF的内存。

m0_74282605的博客 1372

利用setEcoMode优化innovus中的ecoAddRepeater批量操作效率

本文详细介绍了在Cadence Innovus工具中,如何利用setEcoMode命令的batchMode参数,显著提升ecoAddRepeater命令在批量插入buffer或inverter时的操作效率。通过合并重复的初始化和数据库更新开销,该模式可将大规模时序修复操作的执行速度提升数倍,并提供了完整的脚本示例与最佳实践,帮助后端设计工程师优化ECO流程。

mango的博客 511

page flags

//@kernel/include/linux/page-flags.h enum pageflags { PG_locked, /* Page is locked. Don't touch. */ PG_error, PG_referenced, PG_uptodate, PG_dirty

729

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1978

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 905

Linux内核中内存相关的操作函数

1.原理说明   Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示。四级页表分别为:   * 页全局目录(Page Global Directory)   * 页上级目录(Page Upper Directory)   * 页中间目录(Page Middle Direct

michaelcao1980的专栏 2919

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4851

linux内存管理-页面的定期换出

这个情景比较长,我们得有点耐心。 为了避免总是在CPU忙碌的时候,也就是在缺页异常发生的时候,临时再来搜索可供换出的内存页面并加以换出,linux内核定期地检查并预先将若干页面换出,腾出空间,以减轻系统在缺页异常发生时的负担。当然,由于无法确定地预测页面的使用,即使这样做了也还是不能完全杜绝在缺页异常发生时内存内有空闲页面,而只好临时寻找可换出页面的可能。但是,这样毕竟可以减少其发生的概率。并且,通过选择适当的参数,例如每隔多久换出一次,每次换出多少页面,可以使得在缺页异常发生时必须临时寻找页面换出的情况

guoguangwu的专栏 887

【测开求职】面试题:操作系统 吐血整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍操作系统的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。另外操作系统在校招中有非常明显的重点,一般情况下只会考察进程管理,内存管理,和设备管理,且这三者考察频率依次递减,文件管理基本不会考察。

vector的博客 7908

基于知识图谱的智能决策系统

作者:禅与计算机程序设计艺术 1.简介 知识图谱(Knowledge Graph)最早由美国斯坦福大学的Jure Sifne等人于2013年提出,它是一个用于存储、整理和推理复杂多变的网络结构信息的数据模型。它的基本特征是每个事实都有一个统一的标识符ID,并且可以以图形的方式展示各种关系及其边缘。因此,

AI天才研究院 2183

Linux驱动开发杂记(0x0C) - SetPageReserved()

SetPageReserved()   随着linux的长时间运行,空闲页面会越来越少,为了防止linux内核进入请求页面的僵局中,Linux内核采用页面回收算法(PFRA)从用户进程和内核高速缓存中回收内存页框,并根据需要把要回收页框的内容交换到磁盘上的交换区。调用该函数可以使页面不被交换。 #define SetPageReserved(page) set_bit(PG_reserved,&a...

Vinx Blog 4172

3、图像中文字信息提取技术全解析

本文全面解析了图像中文字信息提取(Text Information Extraction,TIE)的技术原理、挑战及应用领域。详细介绍了图像中三种主要文字形式:场景文字、字幕文字和文档文字的特点及提取难点。系统阐述了TIE技术的主要流程步骤,包括文字检测、定位、提取与增强、识别等关键阶段,并对主流技术方法进行了分类比较,包括基于连通组件、边缘、纹理等方法的优缺点分析。文章还介绍了多种其他提取技术,如二值化方法、混合方法、基于梯度的方法等,并提出了一种基于立体帧的新型场景文字提取方法,通过实验验证了该方法在召

ll5678的博客 119

Understand Swap in & mem_map

Understand Swap in & mem_map 2010年10月19日   Understand Swap in & mem_map   mm/memory.c PageReserved   这1000多行代码,有绝大多数函数定义为static,意味着这个模块只提供了少量   的对外接口. 这几个接口是我们理解此模块的一个重要线索.   第一部分 :全局...

qsv26qsv 320

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

在Ubuntu 20.04上一步步搞定ucore Lab 2:物理内存管理实验避坑指南

本文详细介绍了在Ubuntu 20.04上完成ucore Lab 2物理内存管理实验的完整指南,包括环境配置、代码结构解析、First-Fit算法实现、页表项操作等关键步骤。通过实战案例和常见问题解决方案,帮助开发者高效完成操作系统内核开发中的物理内存管理实验,避免常见陷阱。

weixin_30613343的博客 361

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

图解First-Fit内存分配:用ucore Lab 2的代码讲清楚链表、Page结构与碎片合并

本文通过图解方式详细解析First-Fit内存分配算法在ucore Lab 2中的实现,涵盖链表操作、Page结构设计及内存碎片合并机制。深入讲解物理内存管理的关键数据结构与算法流程,帮助读者理解操作系统内存分配的核心原理与优化方向。

weixin_30363981的博客 411

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

操作系统(thuOS)笔记(五) 第七讲 实验二 物理内存管理

操作系统(thuOS)笔记(五) 第七讲 实验二 物理内存管理了解x86保护模式中的特权级了解特权级切换过程了解段/页表准备阶段default_init(void)default_init_memmap(struct Page *base, size_t n)default_alloc_pages(size_t n)default_free_pages() 了解x86保护模式中的特权级 基本上操作系统有一个级别,应用程序有一个级别就够了,另外另个level是预留的。Linux只使用level0和level3

weixin_39007337的博客 783

linux-glibc内存管理小结3(物理页的分配)

在上一节我们讨论了用户态向内核申请内存的接口(系统调用), 发现内核仅仅是判断进程的虚拟地址空间是否足够划分出新的区间, 实际并未分配物理内存. 这是因为内核分配内存的机制是仅当进程实际使用该地址后才为其分配物理内存, 借此提升物理内存使用率. 本节我们就来看看内核究竟是如何分配物理内存的.以32bit ARM架构为例, 首先我们来看下ARM ref manual中关于异常的这一章. ARM一共定...

weixin_34114823的博客 246

ucore lab2 实验笔记

ucore Lab2 lab 2 直接执行make qemu-nox会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 1 连续物理内存管理 1.1 page 概览 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟内存管理...

李斌的博客 526

_深入分析Linux内核源代码6-Linux 内存管理(2)

每天十五分钟,熟读一个技术点,水滴石穿,一切只为渴望更优秀的你!————零声学院6.3 内存的分配和回收 在内存初始化完成以后,内存中就常驻有内核映像(内核代码和数据)。以后,随着用 户程序的执行和结束,就需要不断地分配和释放物理页面。内核应该为分配一组连续的页面而建立一种稳定、高效的分配策略。为此,必须解决一个比较重要的内存管理问题,即外碎 片问题。频繁地请求和释放不同大小的一组连续页面,必然...

weixin_39613637的博客 108

reserved page frame

linux保留了一定的reserved page frame数量由以下方式决定:The amount of the reserved memory (in kilobytes) is stored in the min_free_kbytes variable. Its initial value is set during kernel initialization anddepends on ...

dodobear 72

lab2_练习1(已优化)

static void default_free_pages(struct Page *base, size_t n) { assert(n > 0); struct Page *p = base; for (; p != base + n; p ++) { assert(!PageReserved(p) && !PageProper...

Sangria's Blog 333

操作系统:ucore的部分Bug&挑战练习

ucore是清华大学提供的一个学习操作系统的平台。ucore有完整的mooc视频与说明文档。 https://objectkuan.gitbooks.io/ucore-docs/content/# 本文将主要记录在完成ucore平台的实验时,个人认为ucore内核及Result中的存在的问题,以及部分挑战练习内容。由于个人水平有限,可能理解有误,欢迎前来讨论。 本文...

weixin_33857679的博客 342

浅析linux内核内存管理之buddy system

浅析linux内核内存管理之buddy system        Linux采用著名的伙伴系统(buddy system)算法来解决外碎片问题。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续的页框。对1024个页框的最大请求对应着4MB大小的连续RAM块。每个块的第一个页框的物

samssm的专栏 906

内存映射

Memory mapping目标关键字:总览用于内存映射的结构struct pagestruct vm_area_structstruct mm_struct设备驱动程序内存映射Exercises1.将连续的物理内存映射到用户空间2.将不连续的物理内存映射到用户空间3.映射内存中的读/写操作4.显示在procfs中映射的内存 目标 了解地址空间映射机制 了解与内存管理相关的最重要的结构 关键字: address space mmap() struct page struct vm_area_struc

攻城狮 1158
上一篇: kmap/kmalloc/ioremap/kmalloc/kzalloc/kcalloc/vmalloc
下一篇: mmap/do_mmap/do_mmap_pgoff
adaptiver
博客等级 码龄16年 194粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值