历程

    发展历程 优点 缺点/改进
    1.CPU直接读取物理内存 进程B可能会操作进程A的内存空间——进程间内存地址无隔离
    2.引入虚拟内存 保护模式(隔离、底层非透明)
    内存隔离——相同虚拟地址操作不同物理地址
    内存共享——不同虚拟地址操作相同物理地址
    需要地址映射机制
    3.引入内存分段
    1. 按逻辑分段(读写属性):代码段、数据段、栈段、堆段等固定个数
    1. 段内地址连续、段外地址不连续

    1. 内存碎片 问题产生原因
    1. 内存交换效率低 问题产生原因
    4.引入内存交换 解决内存碎片问题—将不用内存保存磁盘 swap
    5.引入分页机制 解决内存分段的弊端(内存碎片、内存交换) 页表太大
    6.引入多页机制
    7.段页式内存管理

    内存分段
    分段机制
    图示

    • TODO 自己动手画

    虚拟地址 = 段选择因子 + 段内偏移量 = 段号(0-3)+ 标志位 + 段内偏移量
    段表: 段基地址 + 段界限 + 特权级DPL
    MMU
    问题 段表存储在哪里?
    问题 为什么要引入分段机制?
    问题 物理内存是连续的吗?与磁盘有什么区别和联系?
    问题 为什么会产生内存碎片?
    问题 为什么分段机制中的内存交换效率低?
    每次交换的内存较大

    分页机制
    把虚拟和物理内存都分成一个固定大小的块(4kb)——即页,相当于以页为单位来操作
    图示

    • TODO 自己动手画

    页表
    页号+偏移地址
    页表项 = 页号 + 物理地址

    MTU

    多页机制
    页表项太多,存储占内存太大
    单级页表:4G/4K = 2^20个页表项
    多级页表:
    4G/4K/1024 = 1024个页表项

    缓存机制MTU中TLB
    问题 哪些是常用页表项?
    将常用表项直接存储,加快访问速度

    问题 进程地址空间4G(32位)还是8G(64位)与linux 8G/16G内存有关系吗?
    Linux内存管理
    发展历程
    x286是段氏管理
    x386由于硬件原因,段式内存管理无法消除,故意仅分一段(即不分段)进行页式管理
    图示
    思考🤔 如何去用演示整个过程,如进程运行时各个分区的起始地址及存放数据地址
    32位
    图示
    用户空间 0x0-0xbfffffff(0xc0000000-1) 3G=122^28
    代码区
    数据区
    BSS
    堆区
    共享内存区
    栈区
    内核空间 0xc0000000-0xffffffff(0x100000000 - 1 )4G = 16
    2^28
    64位
    内核空间 128T
    用户空间 128T
    查看file命令
    为什么要区分内核空间和用户空间?
    为了保证操作系统的稳定性。内核空间运行操作系统程序和驱动程序,用户空间运行应用程序。Linux以这种方式隔离了操作系统程序和应用程序,避免了应用程序影响到操作系统自身的稳定性。
    所有的系统资源操作都在内核空间进行,比如读写磁盘文件,内存分配和回收,网络接口调用等。
    所有进程的内核空间虚拟地址相同,指向的物理地址也相同,即所有进程的内核空间都是同一个。