zoukankan      html  css  js  c++  java
  • linux内存管理

    linux子系统包括:

    物理地址:出现在CPU地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。

    线性地址(虚拟地址):在32位CPU架构下,可以表示4G的地址空间,16进制0xffffffff。

    逻辑地址:

    逻辑地址--->物理地址:

    首先cpu利用段氏内存管理单元,将逻辑地址转换成线性地址。

    再利用页式内存管理单元,把线性地址最终转换成物理地址。

    段氏管理(16位CPU):16位CPU内部拥有20位的地址线,寻址范围是2的20次方,也就是1M的内存空间。但只有16位CPU用于存放地址的寄存器(只能访问65536个存储单元,64K)。

    为了能够访问1M的内存空间,CPU就采用了内存分段的管理模式,并在CPU内部加入了段寄存器。16位CPU把1M内存空间分为若干个逻辑段,每个逻辑段要求如下:

    1.逻辑段的起始地址(段地址)必须是16的倍数,即最后4个二进制位必须是全0.

    2.逻辑段的最大容量为64K

    页式管理:线性地址被分为固定长度的组,称为页(page)。

    32位PC采用两种不同的工作方式:实模式和保护模式。

    一般工作在保护模式。

    内存管理子系统职能:1.管理:虚拟地址与物理地址的映射。

    2.管理:物理内存的分配。

    linux内存管理:

    所有段的基地址均为0.

    因为每个段的基地址为0,因此,逻辑地址与线性地址保持一致。也就是在linux中所提到的逻辑地址和线性地址可认为一致。

    虚拟内存:linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间。用户看到和接触的都是虚拟地址,无法看到实际的物理地址。

    利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户进程可使用比实际物理内存更大的地址空间

    进程空间:用户空间对应进程,每当进程切换,用户空间就会跟着变化。

    每个进程的用户空间都是完全独立、互不相干的。( 如把同一个程序同时运行10次,会看到10个进程使用的线性地址一模一样)

    ps aux
    cat /proc/<pid>/maps

     实际物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页”异常,进而进入分配实际页框的程序。之后虚拟地址才实实在在地映射到了物理地址上。

    在linux中,由kmalloc来分配动态内存(应用程序中malloc)

    #include  <linux/slab.h>
    void *kmalloc(size_t size,int flags)
    //size:要分配的内存大小
    //flags:分配标志。它控制kmalloc的行为。

    分配标志:

    内存使用:

    内核空间:内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。

     高端内存:物理内存896M以上的部分称为高端内存。

    4G的虚拟地址空间又分为:

    1.用户空间(0~3G):用户程序

    2.内核空间(3G~4G):

     直接映射区(3G~3G+896M):因为该区域的线性地址和物理地址之间存在线性转换关系:线性地址=3G+物理地址。

    动态内存映射区(Vmalloc区):线性地址空间连续,对应物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,页可能处于高端内存。

    KMAP区(永久内存映射区):

    固定映射区:

  • 相关阅读:
    SpringCloud-技术专区-Gateway基于OAuth2.0 的身份认证
    Jaeger-实践处理相关计划
    Jaeger-3.实现一个分布式调用(OkHttp+SpringBoot)
    Jaeger-2.客户端使用 (Java版本)
    分布式-技术专区- Pinpoint部署手册
    分布式-技术专区-APM监控系统服务跟踪技术选型参考
    Skywalking集成springcloud分布式链路追踪
    Spring-框架专区
    22Spring基于配置文件的方式配置AOP
    21Spring重用切点表达式
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/8326028.html
Copyright © 2011-2022 走看看