Linux内存管理--系列文章貮

news2024/12/23 0:28:12

接上文,用户态写完,本章写内核态内存空间。

3.2内核态内存

大家会发现用户态空间不管32还是64位,这种内存分布是相差不大的。是因为使用虚拟内存的系统,会让应用程序感到和别的程序是相互独立的,互不干扰,使得进程觉得自己用了这3G的全部内存。但内核态就不一样了,它是所有进程共享的,所有进程的内核态都是长一个鬼样子的。

注意内核态的内存地址也虚拟内存地址,不要以为来这就变成实际的物理地址了。

3.2.1 32位系统

在Linux中,系统使用/arch/x86/include/asm/page_32_types.h文件中的__PAGE_OFFSET来决定内核态的起始地址。在32位系统中定为0xC000 0000,作者没改过,大家可以试试这个可以改不。

1.在这1G空间中,最前边的896MB是直接映射区

这块内存是和0896M的物理地址直接映射。
虚拟内存的3G到3G+896MB的地址在减去3G,就是物理内存。这个映射关系是固定不变的。
可以通过cat /proc/iomem命令去查看,需要在su模式下才可以。分布如下图:
在这里插入图片描述
很明显,前1M是被系统给用了,而且还有保留区。
在1M后,就是内核的代码段、数据段、BSS段。这些都是我们说的装系统的那个系统,被装进电脑时加载到了内存所占据的内存地址。大家不要以为系统很NB,其实他也是一个程序。只不过是我们普通程序员写的程序是跑在系统上,而系统是直接跑在硬件环境上的。

直接映射区也分了两块。

1.1直接映射区的最前面0-16M被称为DMA映射区

由于硬件问题,ISA总线的DMA控制器只能寻址前16M的地址,最前面16M只能给基于ISA的设备通过DMA使用,直接映射到内核的地址空间。所以就叫了DMA映射区。学名:ZONE_DMA

1.2直接映射区的其他内存被称为NORMAL映射区

这个就好理解了,就是可以正常使用的。学名:ZONE_NORMAL

直接映射区中的两块是由物理内存映射进虚拟内存的,内核对虚拟内存怎么规划,也就是对物理内存怎么规划。

2. 896MB之前的内存都被分走了,896MB到1G的这快比较高的地址被称为高端内存高端内存。学名:ZONE_HIGHMEM

因为896MB之前都是和物理内存实际映射的,所以高端内存就是剩下全部的物理内存共同映射的。

2.1 高端内存最前面8M被称为8M空洞

这个空洞范围是在/arch/x86/include/asm/pgtable_32_areas.h中定义的,范围是high_memory到VMALLOC_START.

2.2 8M空洞后面的被称为vmalloc动态映射区

范围是从VMALLOC_START到VMALLOC_END,使用动态映射的方式将物理内存映射到高端内存。
这个区域是内核使用vmalloc进行内存分配的,在虚拟内存上是连续的,但物理内存不一定连续。这导致了在映射的性能开销上要比直接映射要大。这部分会在硬件机制中会讲。

2.3 vmalloc动态映射区的后面的被称为可持久映射区

范围是PKMAP_BASE到FIXADDR_START,这个区域可以和高端物理内存建立长期的映射关系。
使用kmap函数可以将物理内存映射到可持久映射区。
在可持久内核映射区,可通过调用函数kmap()在物理页框与内核虚拟页之间建立长期映射。这个空间通常为4MB,最多能映射1024个页框,数量较为稀少,所以为了加强页框的周转,应及时调用函数kunmap()将不再使用的物理页框释放。

2.4 可持久映射区的后面是固定映射区

范围是FIXADDR_START到FIXADDR_TOP。定义在/arch/x86/include/asm/fixmap.h中。
这块区域的虚拟内存可以自由的映射到高端物理内存上,但虚拟内存的地址是固定的,而物理内存地址是可以改变的。
是为了在内核启动的时候,有的模块比内存模块起的快时,也有可以使用的虚拟内存。让这些模块可以将自己的物理地址映射到这些固定分配的虚拟地址上。
这块空间具有如下特点:
(1)每个 CPU 占用一块空间
(2)在每个 CPU 占用的那块空间中,又分为多个小空间,每个小空间大小是 1 个 page,每个小空间用于一个目的,这些目的定义在 kmap_types.h 中的 km_type 中。

2.5 固定映射区的后面是临时映射区

范围是FIXADDR_TOP到4G。一般来讲FIXADDR_TOP是0xFFFF F000.临时映射区大小一般是4MB。

2.4和2.5这两块区域其实是一个整体,也叫固定映射区和保留区。该区主要应用在多处理器系统中,因为在这个区域所获得的内存空间没有所保护,故所获得的内存必须及时使用;否则一旦有新的请求,该页框上的内容就会被覆盖,所以这个区域叫做临时映射区。

如图:

在这里插入图片描述

3.2.1 64位系统

32位系统只有1G的内核空间,所以说要精细化操作,就分出来的很多内存区域来管理。但64位操作系统有128TB的内核态空间,就可以不用那么精细了。
在64位的内核态中取消了高端内存的那种复杂映射,它可以随便访问物理内存。但其余各段的作用和32位的差不多。

1.内核态开始就一段8TB大小的空洞

主打一个富裕,挥霍。

2.空洞后边是64TB大小的直接映射区

这个地址减去PAGE_OFFSET就是物理地址。
PAGE_OFFSET是在/arch/x86/include/asm/pgtable_64_types.h中定义,大小是8TB。

3.直接映射后边是1TB大小的空洞

那是相当富裕。

4.空洞后边是32T大小的vmalloc映射区

5.vmalloc映射区后接一个1T大小的空洞

6.空洞后有一个1T大小的虚拟内存映射区

从VMEMMAP_START开始,定义在/arch/x86/include/asm/pgtable_64_types.h。
里面存放了物理内存页的描述符,来描述物理内存页。

7.虚拟内存映射区后面有一个512M大小的代码段

这个段是来存放内核代码段、全局变量段、BSS段等。
这个段减去__START_KERNEL_map就是物理内存的地址。
__START_KERNEL_map也是在/arch/x86/include/asm/pgtable_64_types.h定义。

如图:

在这里插入图片描述

到此两篇讲内存分布的文章就结束了。下一篇文章将会开始讲ELF文件。

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

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

相关文章

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…

pytorch CV入门 - 汇总

初次编辑:2024/2/14;最后编辑:2024/3/9 参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch 更多的内容可以参考本作者其他专栏: Pytorch基础:https…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入&#xf…

计算机网络 |内网穿透

其实内网穿透,也挺好玩的,如果在大学的时候,那个时候讲计算机网络的老师能横向延展,估计课也会更有趣不少,本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说,怪可惜的 回到正题,内网…

提高安全投资回报:威胁建模和OPEN FAIR™风险分析

对大多数人和企业来说,安全意味着一种成本。但重要的是如何获得适合的量,而不是越多越好。然而,你如何决定什么时候可以有足够的安全性,以及你如何获得它?则完全是另一回事。 该篇文章是由The Open Group安全论坛主办&…

k8s之图形界面DashBoard【九】

文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 镇场 9. DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard&…

leetcode 热题 100_环形链表 II

题解一: 哈希表:遍历链表,用哈希表存储遍历过的链表节点,判断链表节点是否在哈希表中存在,如果存在说明链表出现过,第一个重复出现的节点即为开始入环的第一个节点。 import java.util.HashSet;public cla…

第八阶段:uni-app小程序 --首页开发(2)

一:分析页面布局 1.1: 功能 搜索框: 轮播图: 分类的导航区: 楼层区: 二: 利用命令创建home分支 git branch git checkout -b home git branch 三: 配置网络请求(main.js 入口函数&#x…

python问题:vscode切换环境,pip安装库网络错误

python问题:vscode切换环境,pip安装库网络错误 vscode切换环境pip安装库网络错误 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用requirements.txt来安装…

CentOS部署 JavaWeb 实现 MySql业务

一、项目打war包 在eclispe或idea中找到项目,右键打war包。 二、上传项目到linux 2.1云服务器虚拟机均可 以tomcat为例 /usr/local/tomcat/webapps 将war包通过ssh连接上传到webapps目录下。 如果是root目录则不需要项目名即 ip或域名端口直接访问&#xff08…

linux下重启ORACLE

切换到oracle用户 su - oracle 登录oracle sqlplus / as sysdba 启动数据库 startup 退出数据库 exit 启动监听 lsnrctl start FINISH

Docker使用(二)Docker安装和常见典型操作

Docker使用(二)Docker安装和常见典型操作 二、软件安装 1、Docker安装 (1)环境准备 [rootlocalhost ~]# uname -r 3.10.0-327.el7.x86_64 # cat /etc/os-release (2)卸载旧版本 $ sudo yum remove docker \ ​ docker-cli…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 环境变量参考 下一篇:将OpenCV与gcc和CMake结合使用 引言: OpenCV是一个开源的计算机视觉库,由英特尔公司所赞助。它是一个跨…

KBP210-ASEMI新能源专用整流桥KBP210

编辑:ll KBP210-ASEMI新能源专用整流桥KBP210 型号:KBP210 品牌:ASEMI 封装:KBP-4 正向电流(Id):2A 反向耐压(VRRM):1000V 正向浪涌电流:6…

SpingBoot集成Rabbitmq及Docker部署

文章目录 介绍RabbitMQ的特点Rabbitmq术语消息发布接收流程 Docker部署管理界面说明Overview: 这个页面显示了RabbitMQ服务器的一般信息,例如集群节点的名字、状态、运行时间等。Connections: 在这里,可以查看、管理和关闭当前所有的TCP连接。Channels: …

#QT(定时轮播电子相册)

1.IDE:QTCreator 2.实验: (1)使用QOBJECT的TIMER (2)EVENT时间 (3)多定时器定时溢出判断 (4)QLABEL填充图片 3.记录 4.代码 widget.h #ifndef WIDGET_H…

数星星 刷题笔记 (树状数组)

依题意 要求每个点 x, y 的左下方有多少个星星 又因为 是按照y从小到大 给出的 所以 我们在计算个数的时候是按照y一层层变大来遍历的 因此我们在处理每一个点的时候 只需要看一下 当前的点有多少个点的x值比当前点小即可 树状数组的 操作模板 P3374 【模板】树…

R语言实现中介分析(1)

中介分析,也称为介导分析,是统计学中的一种方法,它用于评估一个或多个中介变量(也称为中间变量)在自变量和因变量之间关系中所起的作用。换句话说,中介分析用于探索自变量如何通过中介变量影响因变量的机制…

Python-GIS分析之地理数据空间聚类

地理空间数据聚类是空间分析和地理信息系统(GIS)领域的一项关键技术。这种方法对于理解地理数据固有的空间模式和结构、促进城市规划、环境管理、交通和公共卫生等各个领域的决策过程至关重要。本文探讨了地理空间数据聚类的概念、方法、应用、挑战和未来方向。 当模式出现…

《计算机视觉中的深度学习》之目标检测算法原理

参考:《计算机视觉中的深度学习》 概述 目标检测的挑战: 减少目标定位的准确度减少背景干扰提高目标定位的准确度 目标检测系统常用评价指标:检测速度和精度 提高精度:有效排除背景,光照和噪声的影响 提高检测速度…