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

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

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文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql索引 (索引的忧缺点 ,联合索引)

索引的忧缺点 优点 (增加读操作效率,排序成本) 1 查询效率高 2 降低排序成本,索引对应的字段 就已经 自动排序,因为索引本身就是一种排好序的数据结构 缺点(降低写操作效率,占用空间&#xf…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中,Json是比较常用的一种数据存储文本,尤其是在和第三方交互中,基本都是json格式。 先给出一个Json示例,我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 : 环境配置 : 首先在ubt 上的环境,可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误,误以为下载的安装包,一直解压不掉,结果用gpt 检查 结…

Js输入输出语句

输入语法 prompt("您想输入的是&#xff1f;")输出语法: 语法1: document.write(‘要出的内容’&#xff09; <body><script>document.write("你好")document.write("<h1>我是<h1>")</script> </body>作…

【开发】Spring整合MyBatis、MyBatisPlus

目录 前言 Spring整合MyBatis 1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖&#xff1a; 2. 配置数据源 3. 编写实体类 4. 编写API接口 5. 编写单元测试方法&#xff08;业务&#xff09; Spring整合MyBatis-Plus 1. 在项目中导入依赖&#xff1a; 2. 配置数…

电大搜题:开启学习新时代

身处信息化时代&#xff0c;学习的方式已经发生了巨大的变革。在这个多元化的学习环境中&#xff0c;传统的学习模式已经无法满足现代学习者的需求。然而&#xff0c;电大搜题应运而生&#xff0c;为学习者提供了一个高效、便捷的学习途径。 电大搜题&#xff0c;作为黑龙江开…

“智慧农业新篇章:AI大模型引领生态与气象科研的未来“

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用 以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下&#xff1a; 弹幕轮播组件&#xff1a;BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化&#xff0c;包括&#…

【Git版本控制系统】:起步

目录 前言 版本控制 集中式与分布式的区别 Windows安装Git 核心 文件状态 工作区域 基本工作流程 配置用户信息 获取帮助 在线资源 前言 本篇文件的环境是Windows环境下实现。 在日常工作中git少不了&#xff0c;所以编写本篇文章介绍Git基础&#xff0c;专栏会不…

【DAY3 3.16】

1.【刷题】 【知识点与思路】 用乘法求余公式&#xff0c;暴力计算最大的m。 ans1,2,6,24,120...。计算这些阶乘的和是否是能被ans其整除&#xff0c;也就是判断&#xff1a; A[1]!%ansA[2]!%ans....A[n]!%ans0 要是不行的话&#xff0c;就输出当前ans对应的阶乘数。 【代码】 …

为什么国外客户在你跟进的过程中“消失”了?

看着别人跟的客户终于下单了&#xff0c;再看看自己的&#xff0c;怎么跟着跟着就没了。很多时候我们的客户就是不知不觉就被我们给跟丢了&#xff0c;因为我们的跟进方法是有问题的&#xff0c;下面给大家一些比较好的跟进方式和思路。 首先要跟进哪些客户&#xff1f; 不是所…

解压即用,2024最简单好用AI开源换脸应用,整合包已备好

软件整合包&#xff1a;点击下载 关键词&#xff1a;#AI换脸 #开源应用 #可视化界面 #实时换脸 #高清修复 #多个模型 #人脸遮挡处理 #模糊修复 #性能优化 #操作简单 总结&#xff1a;本软件是一款2024年最强大、最易用的AI换脸开源应用。该应用界面经过汉化&#xff0c;操作简…

数字万用表 (Digital Multimeter)

数字万用表 [Digital Multimeter] 1. Product parameters2. 交流频率测量3. 面板介绍4. 背光屏References 1. Product parameters 2. 交流频率测量 在交流 750V 档处按 HOLD 键切换到市电频率 3. 面板介绍 4. 背光屏 ​ References [1] Yongqiang Cheng, https://yongqiang…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

【leetcode-53最大子数组和】

题目&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] …

Java关于物联网消息引擎:EMQ X

1.背景 1、5G 时代&#xff0c;万物互联 随着5G的到来&#xff0c;万物互联已经成为现实&#xff0c;物联网行业得以蓬勃发展&#xff0c;催生了很多的应用&#xff0c;比如&#xff1a;物联网pass平台&#xff0c;车联网&#xff0c;面向云平台的IOT-Hub&#xff0c;NB-IoT蜂…

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

进程学习--02

在C语言中&#xff0c;一般使用fork函数开辟进程&#xff0c;这个函数开辟进程后会返回一个进程号&#xff0c;在子进程中会返回0&#xff0c;在父进程中会返回子进程的进程号。 int main(){int ret fork();if(ret<0){fprintf(stderr, "pid error");exit(-1);}e…

【嵌入式实践】【芝麻】【硬件篇-4】从0到1给电动车添加指纹锁:IO电路简单介绍

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…