5.0 linux内存管理-原理

1. 信息

linux 0.11

2. 目的

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

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)机制

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux内核完全注释5.0是指一个完全注释的Linux内核版本,该版本的注释被用来帮助开发者更好地理解Linux内核的工作原理和代码结构。Linux内核是一个用于许多操作系统的免费和开放源代码的内核,它是操作系统的枢纽。它控制着计算机硬件和软件之间的交互,包括CPU、内存、磁盘、输入/输出设备。Linux内核版本是不断更新的,由于其源代码是公开的,所以有很多开发者在对其进行修改和更新。 在Linux内核完全注释5.0中,每一行代码都被注释,这些注释内容可以帮助开发者理解每一个函数、语句和变量的作用、用法和含义。这使得开发人员更容易地了解Linux内核的本质,并且更快地进行开发、测试和修改。同时,这种完全注释版本对于那些希望自学Linux内核的人也是非常有用的。 总的来说,Linux内核完全注释5.0是一个用于帮助开发者了解Linux内核的重要资源。它不仅能够提高开发人员的效率和代码质量,还能够吸引更多的开发人员来参与开发Linux内核,从而推进整个开源社区的发展。 ### 回答2: Linux内核是一种开源操作系统内核,由林纳斯·托瓦兹(Linus Torvalds)在1991年开发。自那以后,Linux内核已经被广泛地采用,并成为使用率最高的操作系统之一。 完全注释的Linux内核5.0版本提供了对该内核的深入了解。注释是指在代码中添加解释和说明以帮助读者理解代码的各个部分。这对于新手学习内核开发和研究内核源代码非常有帮助。 注释代码完全覆盖了Linux 5.0内核的所有部分,包括进程管理、内存管理、文件系统、网络等,任何人都可以使用它们来了解内核的详细信息和功能。 Linux内核的完全注释对于希望理解操作系统内核工作原理的学生,研究人员和系统管理员非常有用。注释提供了一个更易于理解的方式来探索内核的代码,以及码头程序和模块的实现方式。 总之,完全注释的Linux 5.0内核是一种用于了解和深入研究内核代码的宝贵资源,对于学习和研究操作系统内核的人非常有用。 ### 回答3: Linux内核完全注释5.0是一本详细介绍Linux内核的书籍,旨在帮助读者更好地理解内核并学习如何对其进行修改和优化。该书籍包含了全面的内核注释,从内存管理、进程调度、设备驱动等方面逐步展开,让读者可以系统全面地了解Linux内核的运行机制及其实现方式。 在Linux内核完全注释5.0中,作者详细介绍了内核的各个部分及其功能。在内存管理部分,读者可以了解Linux内核是如何管理物理内存和虚拟内存的,同时还可以了解Linux内核的内存分配算法及其实现。在进程调度部分,读者可以了解进程的调度方式、优先级、时间片等概念,并深入了解Linux内核中的进程调度算法及其实现方式。在设备驱动部分,读者可以了解Linux内核是如何实现设备驱动程序的,同时还可以了解设备驱动程序与内核之间的交互方式。 总的来说,Linux内核完全注释5.0是一本非常有价值的书籍,可以帮助读者更好地理解Linux内核,并掌握其修改和优化的技术。尤其是对于想要深入学习内核开发或系统优化的程序员和工程师来说,这本书绝对是一个不可多得的宝藏。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值