Linux - 内存映射

[内存管理] linux kernel内存映射实例分析 作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处   引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex A9 + 1GB DDR似乎已经跟不上主流配置了。虽说硬件是王道,可我们还是不禁还怀疑这么强大的硬件配置得到充分利用了吗?因此以后我都会正对ARM平台分析kernel的内容。  正文 阅读详情
一  内存映射概述
          
          从原理上讲,Linux系统利用已有的存储管理机制可以很自然的实现进程间的共享存储。对于一段物理存储空间,只需通过进程的 虚存管理机构 就可以映射到各自的3G用户地址空间中。通过这种映射,在不同进程看来“私有”的数据事实上是同一段内存单元,它们被这些不同的进程所共享。
     
        在Linux系统实际运行时,内存中的页面要经常被换入或换出,共享存储区中的页面也不例外。一般而言,内存页面的换入/换出过程采用两种方式进行:
               1. 普通页面因长时间未得到访问而被内核线程kswaps在系统空闲而得到调度时换出内存到磁盘上的页面交换区,或因为进程访问的页面不在内存引起缺页从而将曾被换出到页面交换区的页面重新换入。
               2. 针对某个被打开的磁盘文件在内存中的页缓冲,在内资源不足而需要增加空闲页面时,由内核线程bdflush在系统空闲而得到调度时按照LRU算法将“脏”页面写回磁盘文件以回收空闲页面(或由用户强制“刷出”页面),或者因进程所读文件某段数据不在内存而启动磁盘IO读文件数据到内存中的文件缓冲区。
       
       方式1本身就是操作系统已实现的页调度机制,从用户角度来看,它是完全透明、不必额外关心的底层功能;而方式2依托某一种文件系统,需显式创建磁盘文件。因此该方式实现的页面交换功能对用户并不透明,需用户干涉。但从功能角度来看,它们却具有共同的本质:磁盘到物理内存之间的动态页面交换。

       mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
     mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

二 内存映射的原理
 
      “映射” 主要是指  硬盘上文件  的位置与进程  逻辑地址空间 中一块大小相同的区域之间的一一对应,如下图所示。这种对应关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在。在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,具体到代码,就是建立并初始化了相关的数据结构(struct address_space),这个过程有系统调用mmap()实现,所以建立内存映射的效率很高。

 

  
  

                                                                    内存映射原理  


       既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。

       mmap()会返回一个指针ptr,它指向进程逻辑地址空间中的一个地址,这样以后,进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作文件。但是ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过MMU将逻辑地址转换成物理地址,如上图过程2所示。

      前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如上图过程3所示。

       如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如上图过程4所示。

  
        在Linux系统中,设计mmap()系统调用的本意是提高文件操作的效率。通过mmap(), 进程可以把一个文件的内容映射到它的虚存空间并以访问内存的方式实现文件的读写操作,这为文件读写提供了极大的方便; 如果多个不同的进程通过这种方式映射同一个文件,则可以共享该文件对应的物理存储空间。  如下图所示:
                           

     注:在进程的地址空间中,栈的下方是内存映射段,内核直接将文件的内容映射到内存,通过虚存管理机构将进程中映射的地址转换为内存中的物理地址。

       这恰恰完成了上述共享存储机制中的两个关键要 素:底层的页面换入换出(磁盘文件->内存)功能以及物理存储(内存)到进程空间的映射,并最终实现了一种进程间通信的手段。这种共享存储的功能虽然是mmap()系统调用的“副产品”,但无论从功能角度还是从实现原理角度来看,它都具备共享存储的特征。

              

      使用mmap对于设备文件,最大的优点就是用户空间可以直接访问设备内存;普通文件被映射到进程地址空间后,进程进程访问文件的速度也变快,不必再调read(),write()等系统调用,可以用memcpy,strcpy等操作写文件,写完后用msync()同步一下。mmap()的这种能力用于显示适配器一类的设备,屏幕帧的像素不再需要从一个用户空间到内核空间的复制过程。

        从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如下图过程1,然后再将这些数据拷贝到用户空间,如 下 图中过程2,在这个过程中,实际上完成了  两次数据拷贝  ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了  一次数据拷贝 。因此,内存映射的效率要比read/write效率高。                         
    
       

                                                     read系统调用原理


小结: 使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

三、代码实现
   
    1、mmap系统调用
        #include <sys/mman.h>
       void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset );
      内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。

   参数含义:

        addr: 指定映射的起始地址, 通常设为NULL, 由系统指定。
     length:   映射到内存的文件长度,即可用访问的数据量
        prot: 映射区的保护方式,它是下列常值的按位OR结果
               PROT_EXEC: 映射区可被执行
              PROT_READ: 映射区可被读取
               PROT_WRITE: 映射区可被写入
               PROT_NONE  映射区不可访问.

     flags: 映射区的特性, 可以是: MAP_SHARED、MAP_PRIVATE、MAP_FIXED
      MAP_SHARED:对此区域所做的修改内容奖写入文件内;允许其他映射该文件的进程共享,意思是:n个mmap.out程序在运行,这n个进程的“虚拟内存区域”的物理空间空间都相同。

      

        MAP_PRIVATE:对此区域所做的修改不会更改原来的文件内容,对映射区的写入操作会产生一个映射区的复制(copy-on-write);意思是:n个mmap.out程序在运行,但是虚拟内存区域的物理地址会被内核另外分配。

              

      fd: 由open返回的文件描述符, 代表要映射的文件。
      offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射。

 返回值:返回成功----函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址,该内存区域与可以通过一个打开的文件描述符访问的文件内容相关联。如果失败返回MAP_FAILED(-1),错误原因存于errno 中。

  2、munmap 函数
      int munmap(void *addr, size_t length);
      用于取消参数addr所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述符时不会解除映射。
    
  3、 msync函数
       int msync(const void *start, size_t length, int flags);
     把在该内存段的某个部分的或整段中的修改写回到被映射的文件中(或者从被映射文件中读出)。
   
  参数含义:
   start  修改部分的起始地址,length为长度。
   flags则有三个:
   MS_ASYNC : 采用异步写方式,请Kernel快将资料写入,发出回写请求后立即返回。
   MS_SYNC :  采用同步写范式,在msync结束返回前,将资料写入。
   MS_INVALIDATE:
通知使用该共享区域的进程,数据已经修改,在共享内容更改之后,使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值。

实例:
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>



typedef struct {
    int integer;
    char string[24];
}RECORD;

#define NRECORDS (100)

int main(int argc,char**argv)
{
    RECORD record,*mapped;
    int i,f;
    FILE *fp;

    //打开初始化文件
    fp = fopen("record.dat","w+");
    for (i=0;i<NRECORDS;i++)
    {
        record.integer = i;
        sprintf(record.string,"RECORD-%d",i);
        fwrite(&record,sizeof(record),1,fp);
    }
    fclose(fp);

    //把第43条记录中的整数值由43修改为143,并把它写入第43条记录中的字符串
    fp = fopen("record.dat","r+");
    fseek(fp,43*sizeof(record),SEEK_SET);
    fread(&record,sizeof(record),1,fp);

    record.integer = 143;
    sprintf(record.string,"RECORD-%d",record.integer);

    fseek(fp,43*sizeof(record),SEEK_SET);
    fwrite(&record,sizeof(record),1,fp);
    fclose(fp);

    //把这些记录映射到内存中,然后访问第43条记录,把它的整数值修改为243
    f = open("record.dat",O_RDWR);
    mapped = (RECORD*)mmap(0,NRECORDS*sizeof(record),PROT_READ|PROT_WRITE,MAP_SHARED,f,0);
    mapped[43].integer = 243;
    sprintf(mapped[43].string,"RECORD-%d",mapped[43].integer);

    msync((void*)mapped,NRECORDS*sizeof(record),MS_ASYNC);
    munmap((void*)mapped,NRECORDS*sizeof(record));
    close(f);

    exit(0);

    return 0;
}



#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char**argv)
{
    int fd; //文件描述符
    char* mapped, *p;
    int flength      = 1024;
    void *start_addr = 0;

    if (argc < 2)
    {
        printf("argc less than 2\n");
        exit(-1);
    }

    fd = open(argv[1],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
    flength = lseek(fd,1,SEEK_END);
    write(fd,"\0",1); //在文件末尾添加一个空字符
    lseek(fd,0,SEEK_SET);
    mapped = mmap(start_addr,flength,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    printf("%s\n",mapped);

    while((p=strstr(mapped,"test")))
    {
        memcpy(p,"map",3);
        p+=3;
    }
    munmap((void*)mapped,flength);
    close(fd);

    return 0;
}


四 小结
      在实际程序中大量运用了mmap,用到的正是mmap的这种“像访问普通内存一样对文件进行访问”的功能。实践证明,当要对一个文件频繁的进行访问,并且指针来回移动时,调用mmap比用常规的方法快很多。

参考:
           Linux中mmap系统调用原理分析与实现
Linux 内核之 mmap 内存映射的原理及源码解析 mmap 的全称是 memory map,中文意思是内存映射或地址映射,是 Linux 操作系统中的一种系统调用,其作用是将一个文件或者其它对象映射到进程的虚拟地址空间,实现磁盘地址和进程虚拟地址空间一段虚拟地址的一一对应关系。通过 mmap 系统调用我们可以让进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程虚拟地址空间当中后,进程可以像访问普通内存一样对文件进行一系列操作,而不需要通过 I/O 系统调用来读取或写入。 阅读详情

相关推荐

Linux mmap内存映射

四、网上测试实例 (1)demo1 演示一下,将文件/tmp/file_mmap中的字符转成大写,分别使用mmap与read/write二种方法实现。 先创建/tmp/file_mmap文件,该文件写入www.baidu.com,使用strace统计系统调用。 /* @file: t_mmap.c */ #include <stdio.h> #include <ctype.h> #include <sys/mman.h> /mmap munmap/ #include &

uu_5201314的博客 2887

Linux性能优化实战 15:内存映射、虚拟内存空间分布、内存分配与回收 和 查看内存使用

一、内存映射 1. 通常所说的内存容量,指的是物理内存。进程是不能直接访问物理内存的。 Linux 内核给每个进程都提供一个独立的虚拟地址空间,这个地址空间是连续的。(也就是虚拟内存) 2.虚拟地址空间的内部又被分为内核空间和用户空间。 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间。 进程在用户态时,只能访问用户空间内存;...

1604

Linux内存映射实现

1、内存管理架构图 分为用户空间,内核空间,硬件三个层面: 方便用户——段——虚拟内存 方便操作系统——页——物理内存 1、用户空间 应用程序malloc()申请内存,free()释放内存(是内存分配器ptmalloc提供的接口),内存分配器ptmalloc使用系统调用brk()或者mmap()向内核以页为单位申请内存,然后划分成小内存块分配给程序 2、内核空间 虚拟内存管理,负责把用户地址映射成虚拟地址,从进程的虚拟地址空间分配虚拟页 sys_brk()用来扩大缩小堆, sys_mmap()用来内存映

qq_37857224的博客 2363

深入理解Linux内存映射机制

创建时间:2008-08-31文章属性:原创文章提交:wzt (wzt_at_xsec.org)深入理解Linux内存映射机制 Author: wztEMail: wzt@xsec.orgSite: http://www.xsec.org & http://hi.baidu.com/wzt85Date: 2008-6-13 一. 绪 论二. X86的硬件寻址方法

thewayma的专栏 1505

《UE4游戏开发》之 《查cook资源失败,问题记录》

当项目打包时,cook出错,但是从原始引擎提供的信息中,没有提示具体的那个资源出错,要查到出错资源,还是非常麻烦。 下面就材质cook出错,增加一些日志,方便查找问题做简单记录 材质cook的一个阶段,是收集MaterialShaderMap,如果在这个阶段收集的信息出错,将会在FShaderMapContent::GetOutdatedTypes函数中,因为Shaders指针指向的内存有问题而出错,通过断点发现,FShaderMapContent这个类对象指针为null,而这个类对象的来源于AllMat.

qq_21919621的博客 2580

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1331

共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

功能:创建共享内存映射函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。prot:指定共享内存的访问权限。

qq_43341187的博客 1175

MODTRAN5.2.1安装配置

MODTRAN5.2.1安装配置

Home 4260

net use 映射linux 67_操作系统:图文详解神秘的”内存映射“

前言内存映射 在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作今天,我将详细讲解操作系统中核心概念:内存映射目录1. 定义关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系上述的映射过程 = 初始化该虚拟内存区域虚拟内存区域被初始化后,就会在交换空间中换你来还去被映射的对象称为:共享对象(普通文件 / 匿名文件)2. 作用若存在上...

weixin_39715187的博客 379

避坑指南:Windows下OpenCV摄像头索引混乱问题的3种解决之道

本文详细解析了Windows下OpenCV摄像头索引混乱问题的3种解决方案,包括GUID查询法、DirectShow接口集成和注册表固化技术。针对工业视觉和智能监控场景,提供实战代码和性能优化建议,帮助开发者稳定识别多路摄像头设备,有效解决VideoCapture接口的索引漂移问题。

weixin_30836759的博客 406

TensorFlow_PyTorch实战:构建AI人工智能回归模型

回归分析是机器学习的核心任务之一,用于预测连续型目标变量(如房价、股票价格、用户留存时间等)。基础线性回归模型的数学原理与代码实现多项式回归模型的过拟合处理与正则化技巧自定义数据集加载与数据预处理流程动态图(PyTorch)与静态图(TensorFlow)的编程范式对比模型评估指标与可视化分析方法核心概念:对比两大框架的架构设计,解析回归模型核心组件数学原理:推导线性回归的假设函数、损失函数及优化算法算法实现:提供TensorFlow和PyTorch的完整代码示例项目实战。

AI天才研究院 1430

Linux内存映射

使一个磁盘文件与内存中的一个缓冲区相映射,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write。

weixin_57604904的博客 1913

Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图

今天教使用dashboard的chart组件和slider组件来是实现一个双线的折线图。效果如下 拖动顶部的电量和水量,低下的图表会实时显示时间和值之所以做这个模拟案例,是将教 大家使用chart节点和slider节点先说一下slider节点,该节点是一个滑块节点,可以接受上一节点的 msg.payload,作为滑块的值, slider必须设置最大值和最小值。且不能动态设置。 此外当用户拖动slider滑块,改变值时,该节点会向下传递当前值 以属性payload装载。在说一下chart节点,该节点可以用于

知无涯 4968

Linux C/C++内存映射

文章目录一、什么是内存映射??二、内存映射的优势三、a,b通信代码实现(Linux)四、父子进程通信代码实现(Linux)五、匿名映射代码实现(Linux)六、文件映射进行拷贝代码实现(Linux)内存映射注意实现以及面试常见题 一、什么是内存映射?? 内存映射是将磁盘上某文件的一部分或整个文件映射到应用程序地址空间内某个地址范围的一种机制。然后,应用程序可采用与访问动态内存相同的方法访问磁盘上的文件。与使用 fread 和 fwrite 等函数相比,这会加快文件的读取和写入速度。 二、内存映射的优势

Abieai的博客 3647

微信小程序 - 实现Java微信支付退款功能以及退款流程,微信小程序前端+java后端完整示例源码,微信小程序退款功能详解,小程序订单申请退款和退款回调方法、查询退款等(新版微信支付,详细示例代码)

微信小程序开发-微信支付退款功能以及退款回调方法,微信支付退款API详解,微信小程序支付V3(支付、退款)Java实现微信小程序开发 小程序支付开发-小程序退款功能,微信小程序小程序和公众号 退款功能教程(含申请退款和退款回调,退款回调地址在商户后台配置或者代码自定义)最新版微信小程序支付,退款问题,小程序支付和退款功能详解,小程序申请退款,小程序处理退款,微信小程序支付与退款java,微信小程序退款及回调,JAVA实现微信小程序支付退款功能,退款api调用报错,如何解决退款申请无响应,如何用实现小程序订单

🏆 前端领域优质创作者 4159

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

Linux内存映射原理

普通文件每一次读写都需要3次拷贝:上层应用、C语言、内核态、磁盘。而文件映射则是把磁盘中的数据拷贝到物理内存之后,在内存中读写,适合的机会写回磁盘,大大减少了从物理内存拷贝到磁盘的步骤。最后,匿名映射则根本不会有写回磁盘的操作,纯内存,通信效率最高。

电气工程专业本科生、辅修计算机。分享嵌入式、后端等方面的系统学习路径。 1128

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux内存映射示例

一、内存映射介绍 linux对外设的一般操作,用户空间不能直接对外设访问,而是通过内核空间间接访问,如下图访问磁盘 对于速度要求不敏感的程序影响不大,但是对于摄像头或者视频显示的设备,这种操作会导致视频卡顿等 linux提供了一种方式直接操作,内存映射 二、linux内存映射函数 mmap映射函数 功能:将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零 返回:成功,返回被映射区的指针失败时,失败,返回MAP_FAILED(其为

锅锅的博客 453

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux】mmap文件内存映射

【Linux】mmap文件内存映射:一文带你理解mmap的映射,教你使用mmap,写入映射,读入映射,简单模拟实现malloc

tan_run的博客 3394

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux IPC之内存映射mmap()

导言:如何使用mmap()系统调用来创建内存映射,它可以用于IPC以及其他很多方面。 概述mmap()系统调用,在调用进程的虚拟地址空间中创建一个新内存映射。映射分为两种: 文件映射(内存映射文件) 将一个文件的一部分直接映射到调用进程的虚拟内存中。一旦一个文件被映射之后就可以通过在相应的内存区域中操作字节来访问文件内容了。映射的分页会在需要的时候从文件中自动加载。这种映射也被称为,基于文件的映射

delphiwcdj的专栏 4870

Linux内核学习5——Linux内存映射实现

下面介绍一下Linux内存映射的实现 一、基础概念 1、mmap文件映射 mmap是一种内存映射文件的方法,将一个文件映射到进程的地址空间,建立文件磁盘地址和进程虚拟地址的一种对应关系,如此进程通过读取相应的虚拟地址就可以直接读取相应文件中的内容。 这样映射的最大好处是进程可用直接访问内存,避免了频繁的使用read/write等文件系统的系统调用。需要注意的是mmap并不分配物理内存,它所做的最重要的工作就是为进程映射区的虚拟地址建立页表项 从图上可以看出进程的虚拟地址空间,是由多个虚拟内存区域构成的。如

weixin_45730790的博客 2547

Linux内存映射基础概念

总之,内存映射本身是一个更广泛的知识领域,涉及内存管理和文件操作等方面。然而,在实际应用中,它常常被用作一种高效的进程间通信方式,因此也可以将其视为进程间通信知识范畴的一个子集。

weixin_49503250的博客 1115

Linux下内存映射文件的用法

学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。              简介:         内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将

涛行无疆的专栏 3576

【Linux内核】内存映射原理

物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理空间,有些架构的处理器把分配给外围设备的物理地址称为设备内存处理器通过外围设备控制器里面的寄存器来访问外围设备,寄存器分为控制寄存器,状态寄存器和数据寄存器外围设备的寄存器通常被常备连续的编址,处理器对外围设备寄存器的编址方式分为两种:I/O映射方式,内存映射方式ARM64架构分为两种内存类型:正常内存(Norm

qq_42896106的博客 506
上一篇: Linux - 进程(一) 进程空间
下一篇: Linux - 进程 (二) 进程创建
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值