5.0 linux内存管理-原理

news/2024/7/20 13:03:47 标签: linux, 内核, 内存管理

1. 信息

linux 0.11

2. 目的

  1. 了解内存的管理机制
  2. 了解虚拟内存和物理内存的映射方式
  3. 了解操作系统内存和磁盘的交互(分页机制->缺页重读机制,用时拷贝机制)
  4. 应用程序如何高效使用内存和高级程序的设计方式

linux_8">3. linux系统中内存映射图

linux 0.11 默认支持16M

虚拟盘:用来模拟磁盘
在这里插入图片描述

4. 专有名词

逻辑地址:程序员看到的地址,linux操作系统分配给每一个进程的独立地址(例如0.11中每个进程认为的自己的空间 64M的地址)
线性地址:总线地址ARM CPU采用分段机制(线性地址 = 逻辑地址 + 段基地址)
物理地址:CPU总线的物理地址

虚拟地址:每个进程的分配空间。虚拟地址中具体的地址是逻辑地址
内存管理 来进行逻辑地址–>物理内存 之间的映射
虚拟内存优点:

  • 可以分配超过实际内存大小的空间
  • 可以把离散的内存映射成一个连续的空间给虚拟内存来使用

5. 内存映射

虚拟内存如何映射到物理内存的方式:分段,分页

5.1 分段机制

GDT:全局描述符。 系统中有一个
LDT:具体描述符。每个进程有一个
在这里插入图片描述

逻辑地址是段内的偏移,段基地址没每个段的起始地址。 段基址 + 逻辑地址 得到线性地址

GDT一块256项 减去 4段内核的 = 252项 (则最大进程数为 252 / 2 = 126个)
一个进程的分配的虚拟地址为64M。则可分最大空间64M* 126 = 8G
但是0.11 内核规定最大进行为64个进程 则可以分别的最大空间64M * 64 = 4G

则每个进程(pid)的线性地址 pid * 64 到 (pid + 1) * 64

分段机制:逻辑地址 -> 线程地址 的映射
分页机制:线性地址 -> 物理内存 的映射

5.2 分页机制

页目录表:一级页表
页表:二级页表

下图中每个内存页是4K
在这里插入图片描述

线程地址变换示意图
页目录项 1024 项 为 2 ^10 所以占10位 (31 - 22)
每个页表项也是1024 项,也占10位 (21 - 12)
每个页占4K 4096 占 12位 (11 - 0)
线程地址变换示意图

在操作系统中有多个页目录项,但是当前使用的只有一个,并且这个页目录表存储地址在CR3寄存器中。
表在head.S 中被创建

6:缺页处理

每个页表对应的物理内存页在4G的地址范围内时随机的,是由页表项中页框地址内容确定的,即由内存管理程序通过设置页表项确定的。每个表项由页框地址。访问标志,脏(已修改)标志位和存在标志位构成,如下入所示:

  • 页帧地址:指定一页内存的物理起始地址,因为内存页是位于4K边界上,所以低12bit是0。因此表项的低12位可以作为它用。在一个页目录表中,表项的页框地址是一个页表地址起始地址;在第二级页表中,页表项的页框地址包含期望内存操作的物理内存地址。
  • P 存在位: 确定了一个页表项是否可以用于地址转换过程。P = 1表示该项可用。目录项或第二级表项 P = 0时。表示该表项是无效的,不能用于地址转换过程。此时该表项的所有位可供程序使用。处理器不对这些位进行测试。当CPU试图使用一个页表项进行地址转换时,如果此时一级页表项P =0,则处理期会发出页异常信号。此时中断异常处理程序就可以把所有请求的页加入到物理内存中,并且导致异常的指令被执行。
  • A(Accessed 已访问)和 D (Dirty 已修改)比特用于提供页使用信息。除了页目录项中的已修改位。这些bit位将由硬件置位。但不复位。页目录项和页表项的小区别在于页表项有个已写位D,而目录项中没有。在对一页内存进行读或写操作之前,CPU将设置相关的目录和二级页表的已访问位,在向一个二级页表项所涵盖的地址进行写操作之前,处理器将设置该二级页表的已修改位。而页目录项中的已修改位是不可用的。当所需的内存超过实际内存容量时,内存管理程序可以使用这些位来确定那些页可以从内存中取走,来腾出空间。内存管理程序还需要检测和复位这些bit位
  • R / W 读写位 和 U / S 用户超级用户位:并不用于地址转换,但是用于分页级的保护机制,有CPU在地址转换过程中同时操作

6.1 页面出错异常处理

在运行于开启了分页机制(PG = 1)的状态下,若CPU在执行线性地址变换到物理地址的过程中检测到一下条件,就会引起页出错异常中断(int 14):

  • 地址变换中用到的页目录或页表项中存在位(P)等于0
  • 当前执行程序没有足够的权限访问指定的页面,此时CPU会向页出错异常处理程序提供
  • 栈中的一个出错码。其格式位32位,但是只有低3个bit位有用,它们的名字与页表项中最后三位相同(U/S,W/R, P)含义不同
    在这里插入图片描述
  • 控制寄存器CR2中的线性地址,CPU会把引起异常的访问使用线性地址防止CR2中。页出错异常处理程序可以使用这个地址来定位相关的页目录和页表项

7:写时复制

在A进程 fork B进程之后,此时只是把A的虚拟内存拷贝给B。A和B共用一段物理内存。
并且把当前的共享内存设置位只读内存,一旦有A或B对这块内存进行写操作时。就会引发页面出错异常(int 14)
在该异常的中断函数就会首先取消共享内存的操作,并且给写进程复制一个新的物理页面
此时A,B就各有一块要写的内存,然后设置该内存为可读写状态,然后重新进行刚才的异常写操作

写操作- 页面异常中断-处理写保护异常 - 重新分配物理内存- 重新执行写操作

8:需求加载(Load on demand)机制

在这里插入图片描述


http://www.niftyadmin.cn/n/783553.html

相关文章

【接口测试】接口测试list

在首页上面看到的一篇文章,结合之前自己总结的,于是写在博客上面: 参考:https://www.cnblogs.com/leozhanggg/p/9930741.html 这个是我自己收藏的: 这幅图片是 截取上面链接文章里面的图,嘻嘻 转载于:https…

5.1 linux内存管理-分页管理和页异常处理

1:信息 linux - 0.11 memory.c page.s 2: 内存分页管理 基本名词 页目录:指的是一个4K大小的内存,有1024个页目录项 页目录项:每个页目录项指向一个页表(4K) 页表:指的是一个4K大小的内存&am…

[C陷阱和缺陷] 第1章 词法“陷阱”

有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习。 第1章 词法“陷阱” 1.1 不同与 是赋值操作符,而 是作为比较操作符,初学…

uboot移植

1 信息 各版本下载:https://ftp.denx.de/pub/u-boot/ 版本:u-boot-2012.04.01 2 U-boot 作用 设置系统时钟,关闭中断,设置svc32模式,初始化硬件进行代码重定义(uboot自身)给内核进行参数的配…

网页布局03 浮动布局

浮动 使用css的float属性设置元素的浮动可选值:none(默认值)| left | right 浮动特点 1.元素设置浮动以后,完全脱离文档流,并向页面的左上或右上浮动。直到遇到父元素的边框或其他的父元素时则停止浮动。 2.如果浮动元…

数据库连接池连接异常com.alibaba.druid.pool.GetConnectionTimeoutException

1、事务没提交 开启了事务,但是没有关闭事务,导致连接池一直被占用 事务管理代码: Autowiredprivate PlatformTransactionManager platformTransactionManager;protected TransactionStatus startTx() {TransactionStatus transactionStatus …

6.0 内核驱动-字符型驱动

1 裸机驱动和linux驱动的区别 相同:都要进行硬件实现层的设计(硬件裸机驱动) 不同: linux操作系统中加了众多接口,从系统API到硬件实现层调用过程中的系统框架同步,互斥,POLL,并发…

c语言中字符串转16进制或10进制

直接上语句; str “16” 1,字符串转16进制 int a strtol(str,NULL,16);2,字符串转10进制 int b strtol(str,NULL,10);或者:int b atoi(str);