简析Windows Linux的内核映射

【Kernel】内核数据结构之映射(v5.15.10) 【Kernel】内核数据结构之映射(v5.15.10) 内核源码快捷查看 一、概念 映射常称为关联数组,是一个由唯一键组成的集合,而每个键必然关联一个特定的值。键到值的关联关系称为映射。映射至少支持三个操作:add(key,value) remove(key) value = Lookup(key) 映射可以通过散列表和二叉搜索树实现。 二、IDR简介 系统许多资源都用整数 ID 来标识,如进程 ID、文件描述符 ID、IPC ID 等;资源信息 通常存放在对应的数据结构中 (如进程信息存放在 task 阅读详情

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真是虚无缥缈,招无定法,惊!

Linux系统升级及内核版本升级 一、背景 工作中有时会遇到系统版本过旧,无法满足安全扫描后的安全要求,系统漏洞数量多,处理难度较大,这时,我们就需要升级OS或Linux内核版本; 二、升级操作 2.1、 redhat/CentOS系统 三、附录:包升级命令 1)配置yum更新源 /etc/yum.repos.d目录下新建主机的yum源,.repos文件中,repositoryid:指定一个仓库,name指定仓库名称, baseurl:指定仓库的URL,mirrorlist指定仓库的镜像站点,enable是否启用本仓库,gpgcheck 阅读详情

相关推荐

Linux内核映射关系图

Linux 内核关系映射图,包含了HardwareInterfaces,DevicesControl,Functional,Bridges,Virtual,UserSpaceInterfaces,FunctionLayers各层次模块之间的关系映射图。

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

linux的内存管理我认为是高效的,windows xp的我认为是豪华的,vista的呢?我认为是无以伦比的(理论是无以伦比,但是实际上不是那样)。   linux把内核的主要数据结构映射到内核空间3g到3g+768的空间内,在系统初始化的时候就将物理内存的前896页映射到内核的3g到3g+896 的地址空间,这内部的内存是一一对应的,而且在进程创建之初,此进程的pgd是在slab分配的,而s

TCP/IP 6692

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

了解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

[官方培训]07-UE材质基础 孙丹璐 Epic 笔记

勾选允许自定义深度写入再在模型上勾选然后可以通过Scene Texture节点拿到渲染的自定义深度信息,有了自定义深度信息就可以与当前渲染的像素深度进行对比,自定义深度信息存放的是最靠近我们的深度,如果当前像素离自定义深度比较远我们就不要这个像素。效果如下这种方案的缺点也很明显,因为这样看不到第二层的透明了,如果是两层的半透明的裙摆,这样就看不到第二层的裙摆了。对于半透明排序问题最根本能解决的还是光线追踪,ue5中又加入了OIT(基于像素的排序)。官方透明材质的理解和应用。

Tcohneyn的博客 1562

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3032

Linux内存管理之高端内存映射(转贴)

  -------------------------------------- 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ ------------------------------------------ 一:引子 我们在前面分析过,在linux内存管理中,内核使用3G—>4G的地址空间,总共1G的大小。而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大小供内核映射到物理地

645

迪文串口屏开发环境搭建全流程:从DGUS Tool到串口联调

串口屏作为嵌入式人机交互的核心组件,通过串口通信实现主控MCU与显示终端的指令交互。其工作原理基于变量地址映射,主控读写VP地址即可驱动屏上控件,兼具低功耗与高稳定性。在工业控制、医疗设备及智能家居面板等场景中,串口屏能显著降低开发门槛与硬件成本。迪文屏凭借DGUS Tool上位机与自定义串口协议,成为主流选择。掌握DGUS Tool版本匹配、串口驱动安装及VP地址规划,是快速搭建开发环境的关键。

weixin_33937499的博客 603

30分钟搞懂Linux内核内存映射,(值得收藏)

一、内存映射基础知识 1、内核地址映射模型 比如:X86CPU采用段页式地址映射模型,进程代码地址为逻辑地址,经过段页式地址映射之后,才能够真正访问物理内存。32位Linux内核地址空间划分:0GB--3GB为用户空间,3GB--4GB为内核空间。32位和64位内核地址空间划分是不同的。具体空间表示如下: ​ 2、内核高端内存 比如:当内核模块代码或络访问内存时,代码中的地址为逻辑地址,而且对应到真正的物理内存地址,需要地址和它一对一的映射,假设:逻辑地址0xc0000003对应的物

youzhangjing_的博客 3017

NV 英伟达2022数字芯片笔试题

作者:数字IC打工人 链接:【开卷】第27期 NV 英伟达2022数字芯片笔试题_笔经面经_牛客网 来源:牛客网 1、Single Choice: Given thefollowing FIFO and rules, how deep does the FIFO need to be to preventunderflow or overflow? RULES: clk_A=25MHz; clk_B=100MHz; en_B is periodically asserted: period.

weixin_44072819的博客 6387

执行HDevelop项目

这一节,我们讲述的是如何用HDevEngine加载和执行一个HDevelop项目。代码部分来源于示例程序exec_program(源文件exec_program.cpp),检测塑料零件边界上的毛刺。1.Step 1:初始化首先,我们包含HALCON/C++和HDevEngine头文件以及命名空间。注意到在这个示例程序中,HDevEngine头文件已经包含在my_hdevoperatorimpl中,所

Z's Palace 2994

QOwnNotes 完全指南:开源 Markdown 笔记与 Nextcloud/ownCloud 生态深度解析

QOwnNotes 是一款基于 Qt 框架的开源(GPL)纯文本笔记与待办清单管理工具,专为与 Nextcloud / ownCloud 自托管生态深度协同而设计。本文以官方 overview 文档为骨架,结合仓库源码逐项解析其核心功能、加密机制、脚本与 AI 集成、界面定制与多语言支持,帮助你全面评估并快速上手这款低资源消耗的桌面笔记应用。 [![QOwnNotes 主界面截图](https:

gitblog_00375的博客 754

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 407

函数 ioremap 物理地址到内核映射空间的映射函数

源代码:/* * Remap an arbitrary physical address space into the kernel virtual * address space. Needed when the kernel wants to access high addresses * directly. * * NOTE! We need to allow no

1439

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Windows/Linux内核地址空间管理的异同

相信很多人都知道Windows页表自映射一说,也晓得Linux内核的一一线性映射。然而很多人也仅仅就是知道而已,记住一个结论比理解一个原因要简单得多。 上周末,有人极具挑衅态度的问我能否分别用一句话描述它们,我承认我不是布道者,也难以说出”道可道,非常道“的玄语,但我十分赞同老子的观点,能说出来的道就不是大道,虽难以说出,但却可以解释,说到解释,那就是越详细越好了,冗长并不总是贬义词。...

weixin_34377919的博客 72

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从物理页面的争抢看linux内核内存管理

linux的内核页面是不可换出的,这是事实,但是为什么呢?本文我将从物理页面争抢的角度来试图发现和解决这个疑问。 linux的内核地址空间很大一块 是一一映射,这实际上不是必须的,而是内核想尽可能简单的实现内核本身的管理(迎合mmu,人家必须要mmu插手,你内核无法逃避,只好用最简单的方式应 付一下,如果没有mmu,那么对于内核就好了)。  内核毕竟只是为用户进程提供服务,它不应该花很大的精力用...

~~ LINUX ~~ 302

关于linux栈的一个深层次的问题

内存不用白不用,何必在一开始就限制栈的大小,linux的机制是尽量多尽量紧凑的使用虚拟内存,原则就是你现在不用我就用,没有预留的概念,当然你可以通过系统调用实现预留,就像glibc的堆管理那样,这里所说的完全是针对于操作系统内核的,用户空间程序完全可以向操作系统通过brk或者mmap实现用户空间的内存预留。windows的实现就不是这样,windows要求程序在运行之前就限制好栈使用的内存的大小,一旦超过这个大小,哪怕向下伸展的栈下方的内存没有实体使用,那么也会触发异常,windows将栈内存的使用完全暴露

caotuo_csdn的博客 278

Linux根文件系统

Linux根文件系统

baidu_1234567的博客 202

Linux下的磁盘管理之LVM详解及lvm的常用磁盘操作命令

LVM,Logical Volume Manger,是linux内核提供的一种逻辑卷管理功能,由内核驱动和应用层工具组成,它是在硬盘的分区基础上,创建了一个逻辑层,可以非常灵活且非常方便的管理存储设备。

weixin_42915431的博客 8万+

【C/C++】用户态与内核态内存访问_初步了解

方面用户态内核态权限级别低权限(环3)高权限(环0)访问地址范围仅用户空间地址用户空间 + 内核空间地址访问权限控制受页表和硬件保护可绕过用户权限限制访问非法地址触发异常,进程崩溃内核需捕获异常,防止内核崩溃内存访问接口直接访问用户内存需使用特定接口访问用户内存运行环境应用程序操作系统内核。

YZJincsdn的博客 790

(总)linux

Linux Linux和windows 免费与收费 windows是收费的,linux是免费。但是在国内,新电脑买回来的时候,电脑的费用就已经包括了windows的版权费。但是还是可以去下载破解版的。 软件的支持 windows可以运行绝大多数软件和游戏,硬件厂商制作电脑时就安装了windows,这就是为什么windows的版权费绑定在电脑的费用中。而linux更加侧重于字符模式。软件和游戏方面...

梁涛的博客 253
上一篇: 系统设计---分层,分级,分块
下一篇: 有关likely和unlikely??
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值