linux 内存管理

news2024/9/20 8:45:59

0.前言

1.了解Linux内存的管理机制(分段分页)

2.了解虚拟内存和物理内存的映射方式

3.了解操作系统内存与磁盘的交互(分页机制---》缺页重读机制,用时拷贝机制)

4.应用程序如何高效使用内存和高级程序的设计方法

1.linux物理使用情况

 内核区,用户区,高速缓冲区。内核区与用户区是分割开的,互不影响,不能让用户程序影响内核的程序。linux0.11版本内存大小只有16M.

内存以页为单位管理内存,4K大小

2.逻辑地址 ,线性地址,物理地址

逻辑地址:程序员看到的地址,linux给每一个进程分配一个独立的地址

线性地址:在分段机制下(线性地址=逻辑地址+段基地址)    4G  8G

物理地址:CPU总线的直接地址

在linux0.11版本里面,一个进程给64M的大小,在linux2.6版本,一个进程给4G的大小

分段机制:从逻辑地址---------》》》线性地址上面,根据GDT表(线性地址=逻辑地址+段基地址) 

分页机制:线性地址-----------》》》物理内存映射

3.虚拟内存

用户进程使用的都是虚拟内存,linux操作系统的内存管理会进行虚拟内存与物理内存的映射,这个映射就是mmu。

用户使用的是虚拟内存,也就是逻辑地址,当用户需要访问内存数据的时候,需要将这个逻辑地址给到Linux操作系统的管理模块,该模块会进行将逻辑地址映射到物理地址上面的操作。

虚拟内存可以很大,物理内存小,但是不可能所有进程可以同时执行,可以分批执行,合理的调度物理内存的使用

4.分段

大数据分段存储,小数据分页存储。

 

4.1.GDT

GDT:全局描述符, Intel使用一个48位的寄存器GDTR存储GDT的入口地址;一共256项,4项是内核占用的,剩下252项,一个进程占两项,也就是126个进程,但是linux代码最多支持64个进程,宏定义限制的。

4.2LDT

LDT:局部描述符

LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。LDT是进程的入口地址

 5.分页

5.1.分页机制启动

分页机制由CR0中的PG位启用。如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物理地址。如PG=0,禁用分页机制,直接把段机制产生的线性地址当作物理地址使用。分页机制管理的对象是固定大小的存储块,称之为页(page)。分页机制把整个线性地址空间及整个物理地址空间都看成由页组成,在线性地址空间中的任何一页,可以映射为物理地址空间中的任何一页(我们把物理空间中的一页叫做一个页面或页框(page frame))

5.2.页表

页表存储在CR3寄存器里面

这些页表其实就是索引(这里是二级),加快寻找数据速度

 

 

 5.3.内存管理两个机制

分页机制:

        缺页中断,重加载,利用p位

        P位:存在位,P=1表示该项可用,当P=0时,表示该项无效-----缺页中断来源

(缺页异常:在页目录项里面,如果P=0,就先分配一个页表项给页目录项,然后将P=1,让刚刚申请访问的程序重新访问;如果在页表里面,先加载数据到内存里面,然后让P=1,重新访问,然后这样就得到数据,结束过程)

写时复制,读时共享:

        fork只是虚拟内存拷贝,但是物理内存是共享的,在vfork里面,虚拟内存都是一样的。

        写时:就会引发页面异常,page_fault (中断号为14),该服务函数,会取消共享内存,然后复制一个新的物理页面,然后设置为可读写状态,进行写存在

写存在----》》》页面异常----》》》处理保护异常-------》》》重新分配内存页------》》》重新执行写存在

5.4页寻址

数据是32位,10位用于一级页表,10位用于二级页表,剩下12位给其他权限使用。

P位:存在位,P=1表示该项可用,当P=0时,表示该项无效-----缺页中断来源

(缺页异常:在页目录项里面,如果P=0,就先分配一个页表项给页目录项,然后将P=1,让刚刚申请访问的程序重新访问;如果在页表里面,先加载数据到内存里面,然后让P=1,重新访问,然后这样就得到数据,结束过程)

6.MMU

MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件,在此,我们把它们分别叫做分段机制和分页机制,以利于从逻辑的角度来理解硬件的实现机制。分段机制把一个逻辑地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。
 

7.例子

某任务加载后,在4GB虚拟地址空间创建了一个段,起始地址为0x00800000, 段界限为0x5000,字节粒度。当前任务执行时,段寄存器DS指向该段。又假设执行了下面一条指令: mov edx, [0x1050],问此时对应的物理地址是多少?

答:此时,段部件会输出线性地址0x00801050。在没有开启分页机制时, 这就是要访问的物理地址。但现在开启了分页机制,所以这是一个下虚拟地址,要经过页部件转换,才能得到物理地址。

如下图4所示,处理器的页部件专门负责线性地址到物理地址的转换工作。它首先将段部件送来的32位线性地址分为3段,分别是高10位中间10位低12位。高10位是页目录的索引,中间10位是页表的索引,低12位则作为页内偏移量来用

                           图4

当前任务页目录的物理地址在处理器的CR3寄存器中,假设它的内容为0x00005000 。段管理部件输出的线性地址是0x00801050 。其二进制的形式如图中给出。高10位是十六进制的0x002。它是页目录表内的索引,处理器将它乘以4(因为每个目录项4字节)。作为偏移量访问页目录。最终处理器从物理地址00005008处取得页表的物理地址0x08001000。

线性地址的中间10位为0x001,处理器用它作为页表索引取得页的物理地址。将该值乘以4,作为偏移量访问页表。最终,处理器又从物理地址08001004处取得页的物理地址,这就是我们一直努力寻找的那个页。

页的物理地址是0x0000C000,而线性地址的低12位是数据所在的页内偏移量,故处理器将它们相加,得到物理地址0x0000C050,这就是线性地址0x00801050所对应的物理地址,要访问的数据就在这里。

当任务加载时,操作系统先创建虚拟的段,并根据段地址的高20位决定它要用到哪些页目录项和页表项。然后,寻找空闲的页,将原本应该写入段中的数据写到一个或者多个页中,并将页的物理地址填写到相对应的页表项中。只有这样做了,当程序运行的时候,才能以相反的顺序进行地址变换,并找到正确的数据。

 

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

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

相关文章

动态站点地图提交百度收录

站点地图(sitemap)是一个网站的结构化数据,搜索引擎可以通过站点地图迅速了解一个网站的内容,加快搜索引擎收录。 一般来说,站点地图是以.xml结尾的静态化文件,例如个人博客和生化环材网的站点地图链接分别…

【Mysql】事务的四大特性(ACID)

【Mysql】事务的四大特性(ACID) 文章目录【Mysql】事务的四大特性(ACID)1. 概述1.1 并发事务问题1.1.1 脏读1.1.2 不可重复读1.1.3 幻读1.2 事务隔离级别1. 概述 事务的四大特性: 原子性(Atomicity):事务是不可分割的最小操作单…

ROS学习寄录2

1 ROS核心概念 1.1 节点(Node) (1)执行具体任务的进程、独立运行的可执行文件 (2)不同节点可以使用不同的语言,可分布式运行在不同的主机 (3)节点在系统中的名称必须…

MODBUS总线的学习笔记

MODBUS学习记录 下面所有资料均copy于安富莱电子和博客中,仅作为个人学习笔记记录,写的不好请见谅。 1.modbus简介介绍 Modbus 是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正 用于…

PowerShell 学习笔记:操作XML文件

XML文件是有一定格式要求的文本文件。百度百科可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展…

adversarial Learning and attacks 学习笔记

GANs大家是比较熟悉的网络结构,adversarial attacks 也不是很新的概念了。近期的工作有涉及到adversarial attacks,故整理一下学习的内容。 Adversarial Attacks 对抗攻击样本:一张正常的大熊猫图片(左图)在被加入噪…

Leetcode.1828 统计一个圆中点的数目

题目链接 Leetcode.1828 统计一个圆中点的数目 题目描述 给你一个数组 points,其中 points[i] [xi, yi] ,表示第 i个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries,其中 queries[j] [xj, yj, rj]&#x…

Feign入门

Feign入门Feign入门Feign代替RestTemplate自定义配置Feign使用优化最佳实践Feign入门 Feign代替RestTemplate RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码: String url "http://userservice/user/" order.ge…

linux(Debian11)安装后安装无线网卡等驱动

在工作和生活中,我们经常会用到linux系统,debian作为一个老牌的程序员常用发行版,自然成为我们的首选。 下面记录一下,安装无线网卡的过程。 首先,可以通过命令查看自己所需要的驱动 lspci -vvv iwlwifi 就是我所需…

机器学习为什么使用归一化? 有哪些归一化算法?

一、归一化的基本介绍 1. Why 归一化? 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。或者举一个更浅显的例子:对房子进行…

Java——组合总和(3)

题目链接 leetcode在线oj——组合总和(3) 题目描述 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff…

计算机网络 —— TCP篇 TCP 重传、滑动窗口、流量控制、拥塞控制

计算机网络系列文章目录 TCP篇 TCP 重传、滑动窗口、流量控制、拥塞控制 文章目录计算机网络系列文章目录前言4.2 TCP 重传、滑动窗口、流量控制、拥塞控制4.2.1 重传机制超时重传什么情况会触发超时重传超时时间应该设置为多少呢?快速重传SACKD-SACK4.2.2 滑动窗…

【数据结构之二叉树系列】万字深剖数据结构---堆

目录前言一、堆二、堆的实现(重点)1. 数据类型重定义2. 堆结构的定义3. 堆结构的重定义三、堆中常见的基本操作(重点)1. 声明2. 定义(1)初始化(2)销毁(3)插入数据(4&…

macOS Monterey 12.6.3 (21G419) 正式版 ISO、IPSW、PKG 下载

macOS Monterey 12.6,皆为安全更新,不再赘述。 macOS Monterey 12.6,发布于 2022 年 9 月 12 日(北京时间今日凌晨),本次为安全更新。 今日(2022-07-21)凌晨,Apple 终于…

ATAC-seq分析:Peak Calling(8)

1. 寻找开发区域 ATACseq 的一个共同目标是识别转录因子结合和/或转录机制活跃的无核小体区域。该核小体游离信号对应于小于一个核小体的片段&#xff08;如 Greenleaf 论文中定义 < 100bp&#xff09;。 然而&#xff0c;为了识别开放的染色质&#xff0c;我们可以简单地使…

意想不到的结果:Foo(m)可能是在定义名为m的对象

文章目录例一&#xff1a;Foo(m); 是定义名为 m 的对象例二&#xff1a;Foo(m).i; 传入实参 m例三&#xff1a;func(Foo(m)); 传入实参 m例四&#xff1a;S(cout)(1) 定义名为 cout 的对象例五&#xff1a;S(std::cout)(1) 传入实参 std::cout你知道吗&#xff0c;如果 Foo 是…

vue3 watch 监听响应式数据变化

主要是用来监听ref 或者reactive 所包裹的数据才可以被监听到 <template><input type"text" v-model"message"> </template> <script setup lang"ts">import {ref, watch} from "vue";let message ref<s…

powerdesigner画UML组件图初步

组件图 组件图是用来描述组件与组件之间关系的一种UML图&#xff0c;组件图在宏观层面上显示了构成系统某一特定方面的实现结构。 组件图可以用来显示组件之间的依赖关系&#xff0c;以及组件的接口和调用关系。 组件图由组件&#xff0c;接口&#xff0c;组件图中的关系&…

20230124英语学习

Why Do We Still Procrastinate Despite It Causing So Much Stress? 明知道拖延不好&#xff0c;为何还会拖延&#xff1f; Are you procrastinating?I am.I have been delaying writing this article for the last few days even though I knew I had a deadline. I have …

从零到一:复现 DIR-815 栈溢出漏洞

从零到一&#xff1a;复现 DIR-815 栈溢出漏洞 实验环境 执行命令uname -a可以查看到当前系统版本 我这边采用桥接模式进行实验。 环境搭建 文章命令操作均在root下操作&#xff0c;且git clone xxxx.git下载所用到工具都均下载保存到/opt/tools/文件夹下&#xff0c;方便统…