linux 内存管理

news/2024/5/2 21:23:53/文章来源:https://blog.csdn.net/weixin_48006170/article/details/126999541

用户空间与内核空间

人间还是仙界?聊一聊linux系统的用户空间和内核空间
以32 位Linux系统为例,虚拟地址的大小是4GB (0x0000_0000 ~ 0xffff_ffff)。
Linux 用户空间和 内核空间的大小可以通过设置宏 PAGE_OFFSET 来配置,默认PAGE_OFFSET = 0xc000_0000。
当PAGE_OFFSET = 0xc000_0000 时用户空间为 0-3G,内核空间为3-4G。
在这里插入图片描述
应用进程地址空间:
在Linux 中一个进程的空间大小就是4GB,0-3G 是用户空间,3-4G 是内核空间。
这3G 的虚拟空间就包含代码段、数据段、bss 段、堆栈等等。
在这里插入图片描述

内核使用task_struct 来描述一个用户进程,每个进程都需要分配内存空间资源 用task_struct->mm_struct来描述一个进程的内存资源。
mm_struct->vm_area_struct 用来描述进程中各部分的虚拟地址空间(代码段、数据段等等);mm_struct->pgd 用来描述虚拟地址与物理地址之间的关系。

不同进程之间的内存资源是不可共享的,因为它们都有自己唯一的页表,mm_struct->pgd 表示一个进程的页目录表地址,通过页表就可以找到对应的内存物理地址。所以有时候发现不同进程使用相同的虚拟地址,依然能正常工作,这是因为它们页表中实际映射的物理地址不同。(因为如此不同进程之间通信要使用进程间通信)

其实并不是说一个进程真的拥有 4GB 的内存空间,内核对进程屏蔽了内存空间的管理,表面上给他画出4个G 的大饼,但是只有在进程真正访问一个内存地址的时候,内核才会将这个虚拟地址映射到实际存在的物理地址上。进程用到一点就给他分配一点,所以内核实际上是将物理内存东一块、西一块的分配给不同进程。

内核空间:内核中所有的线程,共享1GB 内核空间,因此内核中不同模块之间通信只需要全局变量即可。
用户进程也可以通过调用c库中的函数,执行系统调用产生0x80 号中断来陷入内核空间。

Linux为什么要划分用户空间 和 内核空间?
① 处理器模式不同、权限不同
对于x86 体系的CPU,用户空间的代码运行在Ring3 模式,内核空间的代码运行在Ring0 模式;
对于 arm体系的CPU,用户空间的代码运行在usr 模式,内核空间的代码运行在svc 模式;

②安全考虑
内核空间主要用于内核,内核负责管理系统中的各种资源,CPU资源、内存资源和外设资源等等。
Linux是多用户、多进程的系统,用户进程访问这些资源是受限的,空间隔离可以保证系统内核的稳定性,即使一个用户进程奔溃,或是恶意的破坏也不会导致内核奔溃。

③软件设计思想
内核代码偏向于系统管理,用户空间代码偏向于业务逻辑实现,二者分工不同更利于管理。

CPU 访问内存的过程

在程序中 CPU 使用的是虚拟地址,需要通过MMU 的转换得到物理地址,在总线上发出物理地址才能访问到内存。
MMU:地址映射单元,完成虚拟地址到物理地址转换的计算。
TLB:页表缓存,是一个高速ram。由于在地址换算过程中MMU 需要经常访问页表,那么如果把页表放在相对低速的内存中,那么转换效率将会变得低下。

在这里插入图片描述

页表映射

linux内核页表映射机制:线性地址如何转为物理地址?
二级页表映射:
以32位 系统为例虚拟地址的大小一共是4GB (0x0000_0000 ~ 0xffff_ffff)。
在程序中想要表达一个虚拟地址就是 用32位长度,比如0xffff_0011,要完成对内存上的数据的访问就要做到 虚拟地址–> 线性地址–> 物理地址的转换,物理地址才是真实存放数据的地址。
在Linux 内核中虚拟地址与线性地址的值是相等的。

下图是一个二级页表的结构图:
线性地址由页目录表索引、页表索引和页表偏移组成,一共32位。
Linux 将一个物理页大小设置为4KB,那么一个4GB 的物理内存就有 4GB / 4KB = 1024* 1024页;
页目录表(Page directory)用来存放页表地址,每一个地址条目的大小4 byte,一个页目录表一个共可以描述1024个页表;
页表(page Table)用来描述一个物理页的基地址,每一个条目需要大小为4 bype,一个页表可以描述1024个页地址;
(1024项页表 x 1024条页地址 x 4KB(页大小) = 4GB )如此刚好能描述4GB 的地址大小。

虚拟地址到物理地址的转换过程(页表映射):
① 从寄存器CR3 得到页目录表基地址。
② 取出线性地址高 10位 作为页目录表索引,通过索引找到页目录表中对应的页表项,得到页表基地址。
③ 取出线性地址中间 10位 作为页表索引,通过页表索引找到页表中描述的物理页项,得到页基地址。
④ 取出线性地址低 12位 作为物理页中的偏移地址,页地址 + 偏移地址 = 物理地址。

每一个进程都有自己唯一的页表,Linux 内核使用mm_struct->pgd 来描述一个进程的页目录表地址,在切换进程时只需要将pgd 存入寄存器CR3 即可完成进程页表的切换。
在这里插入图片描述

四级页表映射:
Linux 64位用户空间与内核空间布局:
在这里插入图片描述

ARMv8 使用的是4级页表映射,4级页表映射参考
4级页表与2级页表的基本原理是一样的,只不过多了几层:全局页目录(pgd)、上级页目录(pud)、中间页目录(pmd)和页表(pte)。
页的大小还是相同的 4KB,但是多级页目录能描述的地址空间也就更广泛了。
一个pgd 一共能描述512项pud,一个pud 一功能描述512项pmd,一个pmd 一共能描述512项pte,一页大小4KB。
(512 x 512 x 512 x4KB = 256TB) 目前64位系统的寻址能力就是256TB。
在这里插入图片描述
使用参考链接中的测试代码可以查看ARMv8 的页表映射情况、和虚拟地址到物理地址的换算:
下图是进程hello 中变量a 地址的虚拟地址->物理地址转换。
在这里插入图片描述

ARMv8 对pgd_t、pud_t、pmd_t、pte_t 等类型定义在:arch\arm64\include\asm\pgtable-types.h (不同架构定义不同)

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

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

相关文章

Oracle数据库中的包(七)

目录 1.Oracle中包 2.包的创建 (1)可视化方式创建包 (2)以命令方式创建包 ①创建包头 ②创建包体 ③删除包 3.包的初始化 4.重载 ①相关概念和注意事项 ②系统内置的包 Oracle学习的相关知识点(汇总&#x…

UGeek大咖说 | 直播预告:顺丰高难度可观测性压测实践与应用

本月「UGeek大咖说-大厂可观测」又双叒……来和大家见面了!本期大咖说特邀到顺丰科技应用架构高级工程师——李卓做客直播间,用实际案例带我们一起剖析大型复杂系统下可观测性在全链路压测中的落地实践。 往期大咖说我们对可观测性做了很多诠释和分享&a…

2022安徽省赛赛题——B-2任务二:流量分析

有题有环境有解析,要的私我,勿喷! B-2任务二:流量分析 *任务说明:仅能获取Server2的IP地址 1.使用Wireshark查看并分析Server2桌面下的capture.pcapng数据包文件,找出黑客获取到的可成功登录目标服务器Telnet服务的账号密码,并将黑客获取到的账号密码作为Flag值(用户…

开创性的区块链操作系统项目——去中心化簿订单交易所

关于区块链操作系统上的 Web2 和 Web3 先驱系列今天向大家介绍来自Dakai的 Peter、Laszlo 和 Mark 。Web3 开发人员通过他们的去中心化簿订单交易所推进了区块链技术的发展。他们正在使用 Python 和 SQLite 作为数据库引擎来进行开发,他们发现他们可以在区块链操作系…

js与jquery实例-拖动改变列宽和行高

如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂。先看效果图:html结构:html结构:<!DOCTYPE HTML> <html> <head><meta charset="utf-8"><title>table&…

最适合从事游戏建模这类高薪职业的是这些人,快来看看有你吗?

随着游戏行业的发展&#xff0c;游戏建模受到越来越多的人的关注&#xff0c;那游戏建模的学习适用于什么样的人群呢&#xff1f;今天就来介绍一下吧 01 大学毕业&#xff0c;就业方向不明确 大学期间&#xff0c;本专业知识没有深度掌握&#xff0c;无法从事本专业相关的工作…

Vue3 i18国际化

本文参考了两片文章如下&#xff0c;博文原创&#xff0c;转载附上本博文链接即可 1、基于Vue3.0和ElementPlus开发后台框架(loginbacki18n)_zzzzzzzzzz的博客-CSDN博客_vue3后台框架 &#xff08;这个有点没看懂&#xff09; 2、https://www.jianshu.com/p/fa85595642cd&am…

盘点一个Python网络爬虫实战问题

大家好,我是皮皮。 一、前言 前几天在Python铂金交流群【红色基因代代传】问了一个Python网络爬虫的问题,提问截图如下:代码截图如下:报错截图如下:要么就是原始网页没那么多数据,要么就是你自己取到的数据没那么多,有的有排名,有的没有,可以考虑加个try异常处理。首先…

基于单片机的老人防摔GSM报警

目录 1 跌倒报警器研究现状........................................................................................ 8 2.1单片机的功能及最小系统的电路设计.................................................. 9 内置闪存存储器......................................…

雷鸟乐队 VoxEdit 大赛启动啦,24,500 SAND 奖励等你们来赢取!

是鸟……是飞机……是雷鸟&#xff01; 如果你们选择接受它&#xff0c;那么你们的任务是创造一个受 1960 年代标志性电视剧启发的车辆资产&#xff08;汽车、轮船摩托车等&#xff09;。 不要使用雷鸟的 logo 或对现有的雷鸟作品进行二次创作。 24,500 SAND 将按以下方式分配给…

手机远程控制之scrcpy(一)

有线投屏 无线投屏 屏幕录制 常见问题 错误检查 ERROR: Exception on thread 投屏模糊 scrcpy 是免费开源的投屏软件&#xff0c;支持将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上&#xff0c;并可直接借助鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协…

机器人地面站-[QGroundControl源码解析]-[7]-[api]

目录 前言 一.QmlComponentInfo 二.QGCSettings 三.QGCOptions 四.QGCCorePlugin 总结 前言 上篇讲完了Analyize中内容&#xff0c;主要对应界面上AnalyzeTool模块的功能。本篇我们来过api文件夹下的代码。api下的代码主要实现了qgc的核心接口&#xff0c;应用所有的选项…

为什么2022年7月的PMP考试通过率这么低?

2022年 7月考的是新考纲&#xff0c;有50%的敏捷题型&#xff0c;考题相对旧考纲灵活很多&#xff0c;混合型项目内容较多&#xff0c;要是不好好备考&#xff0c;很有可能挂哦&#xff0c;所以 PMI 官方都发布通知&#xff0c;7、8、9 月没考过的考生可以免费重考一次。 但是&…

rk3368-双以太网口

RK芯片以太网补丁android5-12 就打一个补丁就行, 1.\sdk\device\rockchip\common\init.rockchip.rc service dhcpcd_eth1 /system/bin/dhcpcd -aABDKLclass late_startdisabledoneshot 2.添加文件EthernetNetworkFactoryExt.java 给eth1使用:sdk\frameworks\opt\net\ethern…

docker images 命令详解

文章目录一、docker images 命令选项二、docker images 使用实例2.1 显示最近创建的镜像2.2 根据镜像名和tag值查询2.3 查询结果中显示完整的镜像ID2.4 显示镜像的摘要信息2.5 显示未打tag值的镜像2.6 删除未打tag值额镜像2.7 根据标签筛选镜像2.8 根据时间筛选镜像2.9 通过模糊…

uniapp离线打包安卓APP全过程

1、首先就是下载Android Studio&#xff0c;官方下载 就好了。 2、然后就是使用 HBuilderX 离线打包,生成本地打包App资源。 打包好的文件路径在unpackage>resources>__UNI__XXX&#xff0c;这里的这个__UNI__XXX就待会需要的。 3、再准备HBuilder最新的SDK下载好 原生开…

arcgis runtime加载自定义控件并和地图铆钉一起

例如上图这个节点&#xff0c;无论移动还是缩放位置均固定 在Arcgisruntime 中有一个附加属性esri:GeoView.ViewOverlayAnchor"{Binding GeometryFrom}" Bingding里面绑定的就是铆钉的位置&#xff0c;具体用法如下&#xff1a; public partial class MainWindow :…

【黑马程序员 C++教程从0到1入门编程】【笔记5】C++核心编程(类和对象——继承、多态)

黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 文章目录4.6 继承4.6.1 继承的基本语法普通实现&#xff1a;继承实现&#xff1a;总结&#xff1a;派生类中的成员&#xff0c;包含两大部分&#xff1a;4.6.2 继承方式&#xff08;继承的语法&#xff1a;class 子类 :…

SpringSecurity(二)- SpringSecurity Web权限方案

文章目录一、SpringSecurity Web权限方案1. 设置登录系统的账号、密码方式一&#xff1a;通过配置文件方式二&#xff1a;通过配置类方式三&#xff1a;自定义编写类实现接口2. 实现数据库认证来完成用户登录&#xff08;1&#xff09;准备sql&#xff08;2&#xff09;添加依赖…

cookie/localStorage /sessionStorage的区别

1、webStorage webStorage是HTML5引入的一个重要的功能&#xff0c;在前端开发的过程中会经常用到&#xff0c;它可以在客户端本地存储数据&#xff0c;类似cookie&#xff0c;但其功能却比cookie强大的多。cookie的大小只有4Kb左右&#xff08;浏览器不同&#xff0c;大小也不…