• 【操作系统】 内存管理



    阅读思考
    1.为什么要使用虚拟内存?有什么好处
    2.既然使用的是虚拟内存,如何找到对应的物理内存?
    3.程序的运行分为用户态和内核态

    《上》

    计算机的计算 : 第一,进程和线程对于 CPU 的使用;第二,对于内存的管理。
    我们说每个进程应该有自己的内存空间。内存空间都是独立 的、相互隔离的。

    独享内存空间的原理

    • 指令的运行,就难免会产生一些数据,这些数据都要保存在内存“会议室” 并且每个内存都进行了编号/地址(物理地址 or 虚拟地址).
    • 为什么要用到虚拟地址? 如果同时打开三个相同的进程,产生的物理地址就会发生冲突,所以处了内存意外,都要用虚拟地址,封闭开发 ,防止与内存冲突。
    • 物理地址对于进程不可见,谁也不能直接访问这个物理地址。操作系统会给进程 分配一个虚拟地址。所有进程看到的这个地址都是一样的,里面的内存都是从 0 开始编号(十六进制)。
    • 物理地址 和 虚拟地址 通过映射进行联系。

    规划虚拟地址空间

    如果执行一个程序, 哪些东西会存放在内存中?

    代码需要放在内存里面,全局变量,常量字符串,函数栈 (函数调用),堆(malloc free), 然后malloc 还涉及到系统调用,内核部分也有一些东西要放在内存里 内核的代码要在内存里面; 内核中也有全局变量;每个进程都要有一个 task_struct; 每个进程还有一个内核栈; 在内核里面也有动态分配的内存;

    • 只有内存管理使用物理地址, 其他的都使用虚拟地址
    • 虚拟地址的空间 : 32 位,有 2^32 = 4G , 64 位,在 x86_64 下面,其实只使用了 48 位 相对于 256TB 的地址空间

    在这里插入图片描述

    小结

    • 内存管理(上)
    • 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射
    • 除了内存管理模块, 其他都使用虚拟地址(包括内核)
    • 虚拟内存空间包含: 内核空间(高地址); 用户空间(低地址)
    • 用户空间从低到高布局为: 代码段; DATA 段; BSS 段(未初始化静态变量); 堆段; 内存映射段; 栈地址空间段
    • 多个进程看到的用户空间是独立的
    • 内核空间: 多个进程看到同一内核空间, 但内核栈每个进程不一样
    • 内核代码也仅能访问内核空间
    • 内核也有内核代码段, DATA 段, 和 BSS 段; 位于内核空间低地址
    • 内核代码也是 ELF 格式

    《下》

    分段机制

    在这里插入图片描述

    • 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量

    • 段选择子里面最重要的是段号,用作段表的索引。

    • 段表里面保存的是 这个段的基地址、段的界限和特权等级等。

    • 虚拟地址中的段内偏移量应该位于 0 和段界限 之间。
      在这里插入图片描述

    • 如果要访问段 2 中偏移量 600 的虚拟地址,我们可以计算出物理地址为,段 2 基地址 2000 + 偏移量 600 = 2600。这就是linux用的机制,在 Linux 里面,段表全称段描述符表(segment descriptors),放在全局描述符表 GDT(Global Descriptor Table)里面

    • 对于 64 位的和 32 位的,都定义了内核代码段、内核数据段、用户代码段和用户数据段。

    • 四个段选择子 : 分段可以做权限审核,例如用户态 DPL 是 3,内核态 DPL 是 0。当用户态试图访问内 核态的时候,会因为权限不足而报错
      在这里插入图片描述

    • Linux 倾向于另外一种从虚拟地址到物理地址的转换方式,称为分页(Paging)。 对于内存长时间不要,可以暂时写到硬盘上,称为换出。一旦需要的时候,再加载进来,叫作 换入。这样可以扩大可用物理内存的大小,提高物理内存的利用率。

    • 需要有个页表,保存每个页的起始地址,再加上在页内的偏移量,组成线性地址,就能 对于内存中的每个位置进行访问了。
      在这里插入图片描述

    • 虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理页每页所在物 理内存的基地址。这个基地址与页内偏移的组合就形成了物理内存地址。
      在这里插入图片描述
      32位下 : 页目录项 + 页表项 + 页内偏移量 恰好 = 32位
      在这里插入图片描述

    • 当然对于 64 位的系统,两级肯定不够了,就变成了四级目录,分别是全局页目录项 PGD(Page Global Directory)、上层页目录项 PUD(Page Upper Directory)、中间 页目录项 PMD(Page Middle Directory)和页表项 PTE(Page Table Entry)。
      在这里插入图片描述

    总结

    • 第一,虚拟内存空间的管理,将虚拟内存分成大小相等的页;
    • 第二,物理内存的管理,将物理内存分成大小相等的页;
    • 第三,内存映射,将虚拟内存也和物理内存也映射起来,并且在内存紧张的时候可以换出 到硬盘中。
      在这里插入图片描述
  • 相关阅读:
    vim相关命令讲解!
    SpringMVC
    基于PHP+MySQL汽车展览会网站的设计与实现
    基于蚁群算法的时延Petri网(ACOTPN)路径规划算法(Matlab代码实现)
    python绘制直方图
    考研思想政治理论大纲
    Taocms 代码注入漏洞(CVE-2022-25578)
    BOM系列之history对象
    CPP-Templates-2nd--第十一章 泛型库
    你的密码安全吗?如何加密才安全?
  • 原文地址:https://blog.csdn.net/weixin_49486457/article/details/125859075