Windows xp/Vista/Linux的内核映射以及内存置换算法

内存页面置换算法实验 山东大学操作系统实验7,内存页面置换算法实验, 立即下载

linux 的内存管理我认为是高效的,windows xp 的我认为是豪华的,vista 的呢?我认为是无以伦比的(理论是无以伦比,但是实际上不是那样)。
  linux
把内核的主要数据结构映射到内核空间3g 到3g +768 的空间内,在系统初始化的时候就将物理内存的前896 页映射到内核的3g 到3g +896 的地址空间,这内部的内存是一一对应的,而且在进程创建之初,此进程的pgd 是在slab 分配的,而slab 属于物理内存映射区,所以进程的pgd 是属于 物理内存映射区的,与物理内存是一一对应的。在linux 中,进程的pgd 是随时分配的,在要创建新的进程的时候,就会为该进程分配pgd ,该pdg 映射 到的 虚拟内存就会该分配到的pgd 的物理内存加上0xc0000000, 因为物理内存是从伙伴系统随即分配的,因此虚拟内存也就是随即的(加上 0xc0000000 )。
      linux
在系统启动之初,就会将所有小于896m 的物理内存意一一映射到内核空间,建立相关页表,并且将几乎所有内存加入伙伴系统。当内核使用内核数据 结构的时候,就会从伙伴系统把内存页面拽出来,页表还是原来的页表;在以后用户进程需要内存页面的时候,操作系统仍然会从伙伴系统分配页面,但是不会和已 经使用的内核数据使用的页面冲突,因为当时那些内核数据页面已经不再伙伴系统了。这样用户进程顺利的得到页面,然后映射到对应进程的虚拟地址空间,但是这 个时候,原来在系统初始化的时候建立的一一对应的页表(如果小与896 的话)还没有清除。实际上这是没有必要清除的,因为那毕竟是内核映射的页面,什么时 候都不过分,它将永远存在(按照道理说也是这样,内核为每一个页面保持一个映射难道不应该吗?以后会看到windows 也是这么做的)。所以说,在 linux 中,低于896m 的内存中的每个页面最少有一个映射,就是内核映射,加上如果有用户进程映射就不计其数了。
     
在windows 中,内核的映射需要遵循更多的规则,我实在想不明白这是什么理由,就像欧洲出席高档舞会男士必须穿燕尾服那样不可理解。每个进程的页表必须影射到固定的0xC0300000 开始的4k 区域内,而且,所有物理内存小于512m 的物理内存区域必须映射到内核空间固定的0x80000000 - 0x9FFFFFFF 虚拟地址内,这样,大多数的小于512 的物理内存都有两个映射,一个映射到0x80000000 - 0x9FFFFFFF 区域,一个到实际的映射区域,这是否说明大量的内存映射冗余,不得而知,但是我就是觉得windows 的内存映射很商业化,而 linux 的很艺术,实际上,内核保留一个物理内存的拷贝是应该的。linux 和windows 都是将物理内存的一部分一一映射到内核地址空间,区别在 于:1.linux 的冗余比较少;2.linux 的页表映射不是固定的,而windows 是固定的。在window 中,为了节省4k 的内存空间,采用了自 映射的技术,就是说,页目录同时也当页表使用,因为页目录被固定映射到内核的0xC0300000 之 处,那么页目录的768 项也指向页目录的物理地址之处,它之所以可以实现是因为页目录的映射是固定的,在linux 中并没有实现自映射技术,因为 linux 中页目录项的768 项以上是相同的(在windows 中0x80000000 以上有几项是不同的,其中之一就是768 项),它们是在slab 的 构造函数里面初始化的,所以,因为页目录的不固定,实现自映射是不容易的,实际上,修改一下几个页目录就可以了,但是linux 的设计者认为这不值得。可 以看出,linux 并不吝啬那么一点点内存的,它更适合大型服务器,而windows 却那么的规整,我实在看不出来这到底有什么必要,再一个,这个自映射 之所以可以实现,完全在于x86 平台上,页目录项和页表项的结构是一致的,而windows 主要针对x86 ,但是linux 面对的是多平台,它绝对不能寄 希望于页目录项和页表项结构的等同。
  windows
将页表连续映射到0xc0000000 到0xc03FFFFF 虚拟内存空间里,其中将页目录映射进0xc0300000 ,这恰恰是页表数组 的768 项,而这个页目录的768 项设置的物理地址正好也是cr3 的值,这样映射到0xc0300000 的页目录同时也是页表,这就是自映射,这归功于它 的页表连续的映射到了一个固定的位置,在windows 中访问页表可以直接访问0xc0000000 到0xc03FFFFF 的虚存空间,而这在linux 却必须要从mm_struct 到页表的转化了。
       windows
的pgd 在EPROCESS 结构的KPROCESS 里面,但是linux 的相应结构却在mm_struct 里面,说明,在linux 里面,遵循的理念就是地址空间和页目录的关系比进程和页目录的关系更加紧密。
     
最后说一下页面置换算法,在linux 里面,内核维护了一个active 链表和一个inactive 链表,清页进程时常被唤起,然后扫描这两个链表,最后 释放能释放的内存,最好的办法还是看内核代码,或者,等着我以后分析代码。但是在windows 里,链表却不只两个了,而是四个,连个仍然和进程关联的链 表,两个没有关联的,其中有关联的之一就是后备链表,这个只是将对应页表的有效位清除,但是却还是可以用的,如果一段时间没有用,就会彻底切断与进程的 关联,放入空闲链表,最后将放入清零链表,这个就不多说了。在vista 中,后备链表不只一个了,而是7 个,按照优先级排列,如果非要清除一个后备链表的 页面时,将选择优先级最小的那个.
  windows
的内存管理非常复杂,写得也非常不错,我特别看重的就是内存回收这一块。
 
最后简要谈一下我对linux 做法和windows 做法的理解,linux 尽量拷贝现成的东西,默认大家区别不是很大,windows 里面就不一样了,它 遵循的是尽量一致,比如虚拟内存空间,windows 中每一块虚拟内存干什么用基本说得都是清清楚楚,尽量把一切王确定的虚拟地址靠,但是linux 中却 只规定一段物理映射区,一段高端映射区... 至于说你怎么去用这些区域,那就不管了,所以任何数据结构在linux 中都很难有固定的虚拟地址,在 windows 中却有,这就是为什么黑客总是可以找到windows 关键数据结构从而操作它们的原因之一吧。呵呵,linux 真是虚无缥缈,招无定法, 惊!

 

操作系统实验五 虚拟内存页面置换算法 操作系统实验五 虚拟内存页面置换算法(内含源代码和详细实验报告),详细介绍:http://blog.youkuaiyun.com/xunciy/article/details/79239096 立即下载

相关推荐

什么是无人机巡检?如何实现无人机自动巡检?

复亚智能的无人机自动巡检系统通过高度自动化的技术,实现了无人机的高效巡检作业。无人机自动机场支持无人机的自动起降和电池更换,自动飞行算法确保无人机在复杂环境中的精准飞行和拍摄,而云端识别诊断和AI感知算法平台则实现图像的实时传输和智能分析。复亚智能,作为无人机技术的创新者和推动者,致力于开发先进的无人机自动巡检解决方案,助力各行各业实现智能化、自动化的巡检工作,引领智能巡检的未来。利用人工智能和机器学习算法,无人机可以被训练来识别特定的模式和异常,如结构损坏、热泄漏等,从而提高巡检的准确性和效率。

foiadrone的博客 2842

操作系统——虚拟内存和页面置换算法(一文详解操作系统的虚拟内存和页面置换算法)

操作系统——虚拟内存和页面置换算法(一文详解操作系统的虚拟内存和页面置换算法)

xdx_dili的博客 1628

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1425

物理内存分配与回收(5)之交换机制

当物理内存出现不足时,Linux内存管理子系统需要释放部分物理页面内存。这一人任务由内核的交换守护进程kswapd完成,该内核守护进程实际是一个内核线程,它在内核初始化时启动,并周期的运行。就是为了保证系统中具有足够的空闲页面,从而使内存管理子系统能够正常运行法。 一.交换的基本原理       在计算机技术的发展史上很早就有了把内存的内容与一个专用的磁盘空间交换技术,在Linux中,把用作交

在雨一方 1812

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

Bochs源码分析 - 26:8259中断控制器介绍

前言 现在我们跟着《x86/x64体系探索及编程》来分析17章内容 -- 8259中断控制器。这个是涉及硬件的,很遗憾,除了大学期间使用STM32搞过一个计算器,其余就没多少硬件编程经验,我在淘宝上找了下大概是这个东东。 https://pdos.csail.mit.edu/6.828/2010/readings/hardware/8259A.pdf 上面是8259A的芯片手册,里面讲的还是挺详细的,虽然里面很多东西还是看不太懂,但是结合着《x86/...

WriteAnything_的博客 967

14操作系统基础——内存页面置换算法——LRU

缺页中断 当CPU访问的页面不在内存时,便会产生缺页中断,请求操作系统将所缺页从硬盘中调入到内存里。 和一般中断的区别: 是指令执行期间产生和处理中断信号 一般中断程序计数器返回的时候会执行下一条指令,而缺页中断需要重新执行该条指令。 流程: CPU访问一条Load指令,然后去找指令对应的页表项。 如果页表有效,则直接访问内存,如果无效,则CPU发送缺页中断请求。 操作系统收到缺页中断,执行处理函数,先查找页面在磁盘中的位置。 然后需要把页面换入到物理内存中 ,但换入前需要物理内存有空位,如果没有空位需要

strive for the best 的博客 1551

第四天 Labview交互也很轻松(4.1 DAQ数据采集)

LabVIEW DAQ数据采集有很大的优势,NI提供了超过5千万条I/O通道,支持多种主流总线(如USB、PCI、PCIe、PXI等),并为所有这些设备提供统一的编程接口,实现软硬件的无缝集成。LabVIEW包含全套范例,覆盖各类应用,用户无需从头创建整个数据采集系统,可以快速启动并执行这些范例程序。所有NI DAQ硬件都采用NI-DAQmx驱动程序,支持多种编程语言,并包含了这些编程语言的示例代码,使得与NI硬件的通信变得更加便捷。

weixin_38637405的博客 2617

Windows虚拟地址空间分配问题

一般情况下,32位的机器上,地址空间从0x000000~0xFFFFFFFF,总大小为4GB。一般而言,虚拟地址空间分为两个区,即为用户空间和系统空间。虚拟地址低空间,即从0x00000000~0X7FFFFFFF的2GB为用户空间,而高地址0x80000000~0xFFFFFFFF被分配给了系统内核。高地址空间2GB内存是提供系统内核使用的。在这高地址空间中安排了操作系统的系统代码和数据,用户一般

wang010366的专栏 5349

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)

随着人工智能技术在农业领域的深入应用,基于深度学习的害虫检测系统已成为智慧农业的重要组成部分。本文详细介绍了一种基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统,涵盖算法原理、数据集构建、模型训练、系统实现及完整代码。该系统能够实时检测并识别多种农作物害虫,为农业生产提供精准的病虫害监测解决方案。

YOLO 273

儿童启蒙教育APP

pinyinList.add(createPinyin("a", "啊,像阿姨的阿", R.raw.pinyin_a));pinyinList.add(createPinyin("i", "衣,像衣服的衣", R.raw.pinyin_i));pinyinList.add(createPinyin("u", "乌,像乌鸦的乌", R.raw.pinyin_u));pinyinList.add(createPinyin("ü", "鱼,像小鱼的鱼", R.raw.pinyin_v));-- 固定竖屏 -->

寒寒豆豆软件公司的博客 166

Windows2000虚拟地址空间是如何划分的

0~0XFFFF(64KB):不能用来检测空指针赋值(访问冲突)  0x10000(64KB)~0x7FFEFFFF(2GB-64KB):Win32进程私有的(非保留的),用于程序代码和数据 0x7FFF0000(2GB-64KB)~0x7FFFFFFF(2GB):不能用来防止覆盖OS分区(访问冲突) 0x800000000(2GB)~0xFFFFFFFF(4GB):为操作系统保留,不可访问

zimu2702的专栏 1162

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

Bresenham视线生成是一种高效的算法,用于在二维网格上绘制直线。Bresenham算法可以应用在栅格地图中进行一维碰撞检测,即检查起点和终点间直线是否穿过障碍栅格。本文图解Bresenham碰撞检测的原理,并给出ROS C++/Python/Matlab三种实现加深理解

FRIGIDWINTER的博客 1万+

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 166

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 670

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 370

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 268

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 49

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 229

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 267

【AI 开发从入门到进阶 · 10】收官篇:LoRA 微调、模型评估、推理加速与生产部署全链路

本文系统梳理了大模型微调与生产落地的全流程,从决策是否微调、优选LoRA技术方案,到代码实现、效果评估、推理加速与FastAPI服务封装,最终构建可迭代的生产级AI系统。强调“逐级升级”原则,倡导以数据闭环驱动优化,避免技术冲动。全系列贯穿工程化思维,提供可复用模板与实战建议,助力开发者从模型训练迈向稳定可用的AI服务部署。

信息安全领域优质创作者|操作系统领域专家 17

LangGraph 的分离思想总结

LangGraph 的分离思想,本质上是对"高内聚、低耦合"这一经典工程原则在 LLM 应用领域的落地。它通过状态与逻辑分离、节点职责分离、控制流与执行分离、计算与持久化分离、编排与实现分离五个层面,把一个难以维护的"大黑盒"拆解成一组可组合、可测试、可观测的部件。理解这套分离思想,比记住 API 更重要——因为当你面对新的智能体场景时,真正指导你做出合理拆分的,正是这些分离原则。

张晨光老师的播客 369
上一篇: 操作系统关于中断的实现
下一篇: 有关likely和unlikely
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值