我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是虚拟映射和mmap()

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是虚拟映射和mmap()

这篇文章给大家介绍什么是虚拟映射和mmap(),内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

虚存映射

我们知道,程序是存储在磁盘上到静态文件;进程是对程序到一次运行过程。在进程开始运行时,进程的代码和数据等内容必须装入到进程用户空间到适当区域。这些区域也就是所谓的代码段和数据段等,而被装入的数据和代码等内容被称为进程的可执行映像。从上面都描述中可以发现,进程在运行时并不是将程序一下子就装入到物理内存,而只是将程序装入到进程的用户空间,这个装入的过程称为虚存映射。

一个源程序在成为可执行文件的过程中会经历预处理、编译、汇编和链接四个阶段。因此,进程要成功运行不仅要在其用户空间装入进程映像,也要装入该进程所用到到函数库以及链接程序等。所以,一个进程到用户空间就被分为若干个内存区域。linux使用mm_struct结构来描述一个进程到用户地址空间,使用vm_area_struct结构来描述进程地址空间中的一个内存区域。因此,一个vm_area_struct结构可能代表进程到数据段,也可能代表链接程序到代码段等。

进程的虚存映射所做的只是将磁盘上到文件映射到该进程的用户地址空间,并没有建立虚拟内存到物理内存的映射。当某个可执行映像映射到进程用户空间并开始执行时,只有很少一部分虚拟页被装入了物理内存。在进程后续到执行过程中,如果需要访问到数据并不在物理内存中,则产生一个缺页中断(其实是异常),将所需页从交换区或磁盘中调入物理内存,这个过程即虚拟内存中到请页机制。

进程到虚存区

那么对于一个任意的进程,我们可以通过下面到方法查看其地址空间中到内存区域。

我们先看一个简单的测试程序:

#include < stdio.h >    #include < stdlib.h >      int main()    {     int i=1;     char *str=NULL;     printf("hello,world!\n");     str=(char *)malloc(sizeof(char)*1119);     sleep(1000);     return 0;    }

这个程序中使用到了malloc函数,因此str变量存储于堆中。我们通过打印/proc/3530/maps文件,即可看到该进程的内存空间划分。其中3530是该进程的id。

edsionte@edsionte-desktop:~$ cat /proc/3530/maps    0014a000-00165000 r-xp 00000000 08:07 398276 /lib/ld-2.11.1.so    00165000-00166000 r--p 0001a000 08:07 398276 /lib/ld-2.11.1.so    00166000-00167000 rw-p 0001b000 08:07 398276 /lib/ld-2.11.1.so    001d8000-0032b000 r-xp 00000000 08:07 421931 /lib/tls/i686/cmov/libc-2.11.1.so    0032b000-0032c000 ---p 00153000 08:07 421931 /lib/tls/i686/cmov/libc-2.11.1.so    0032c000-0032e000 r--p 00153000 08:07 421931 /lib/tls/i686/cmov/libc-2.11.1.so    0032e000-0032f000 rw-p 00155000 08:07 421931 /lib/tls/i686/cmov/libc-2.11.1.so    0032f000-00332000 rw-p 00000000 00:00 0    00441000-00442000 r-xp 00000000 00:00 0 [vdso]    08048000-08049000 r-xp 00000000 08:09 326401 /home/edsionte/test    08049000-0804a000 r--p 00000000 08:09 326401 /home/edsionte/test    0804a000-0804b000 rw-p 00001000 08:09 326401 /home/edsionte/test    08958000-08979000 rw-p 00000000 00:00 0 [heap]    b78ce000-b78cf000 rw-p 00000000 00:00 0    b78dd000-b78e0000 rw-p 00000000 00:00 0    bfa6a000-bfa7f000 rw-p 00000000 00:00 0 [stack]

每一行信息依次显示的内容为内存区域其实地址-终止地址,访问权限,偏移量,主设备号:次设备号,inode,文件。

上面的信息不但包含了test可执行对象的各内存区域,而且还分别显示了 /lib/ld-2.11.1.so(动态连接程序)文件和/lib/tls/i686/cmov/libc-2.11.1.so(C库)文件的内存区域信息。

我们从某个内存区域的访问权限上可以大致判断该区域的类型。各个属性符号的意义为:r-read,w-write,x-execute,s-shared,p-private。因此,r-x一般代表程序的代码段,即可读,可执行。rw-可能代表数据段,BSS段和堆栈段等,即可读,可写。堆栈段从行信息的文件名就可以区分;如果某行信息的文件名为空,那么可能是BSS段。另外,上述test进程共享了内核动态库,所以在00441000-00442000行处文件名显示为vdso(Virtual Dynamic Shared Object)。

mmap系统调用

通过mmap系统调用可以在进程到用户空间中创建一个新到虚存区。该系统调用到原型如下:

#include    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

该函数可以将以打开的文件映射到进程用户空间到一片内存区上,执行成功后,该函数返回这段映射区到首地址。用户得到这片虚存的首地址后,就可以像访问内存那样访问文件。

该系统调用的参数说明如下:

addr:映射到用户地址空间到起始地址;

length:映射区以字节为单位到长度;

prot:对映射区到访问模式。包括PROT_EXEC(可执行),PROT_READ (可读),PROT_WRITE(可写),PROT_NONE(文件不可访问)。这个访问模式不能超过所映射文件到打开模式。比如被映射的文件打开模式为只读,那么此处到访问模式不能是可读写的。

flags:这个字段比较灵活,不同到标志有不同的功能,具体如下:

MAP_SHARED:创建一个可被子进程共享的映射区;

MAP_PRIVATE:创建一个“写实复制”的映射区;

MAP_ANONYMOUS:创建一个匿名到映射区,该虚存区与进程无关;

fd:所要映射到进程用户空间的文件描述符,该文件必须为以打开的文件;

offset:文件的起始映射偏移量;

mmap()举例

在该程序中,首先以只读方式打开文件test.c,再通过该文件返回到文件描述符和mmap函数将test.c文件映射到当前进程到用户地址空间中。成功执行mmap函数后,buf被赋值为所映射的虚存区的首地址。注意,mmap函数返回的是void型指针,而buf是char型指针。将mmap返回值赋值给buf变量时,自动将void*转化为char*型。

***,就像平常我们使用一个char型指针变量那样,依次打印出buf中到数据。

 #include < stdio.h >     #include < sys/mman.h >     #include < fcntl.h >     int main()     {     int i,fd;     char *buf = NULL;     fd = open("./test.c", O_RDONLY);     if(fd < 0)     {     printf("open error\n");     return -1;     }     buf = mmap(NULL, 12, PROT_READ, MAP_PRIVATE ,fd, 0);     for(i = 0;i < 12;i++)     {     printf("%c",buf[i]);     }     printf("\n");     return 0;    }

关于什么是虚拟映射和mmap()就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是虚拟映射和mmap()

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

什么是虚拟映射和mmap()

这篇文章给大家介绍什么是虚拟映射和mmap(),内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。虚存映射我们知道,程序是存储在磁盘上到静态文件;进程是对程序到一次运行过程。在进程开始运行时,进程的代码和数据等内容必须装入到
2023-06-16

java什么是映射

集是一个集合,它可以快速地查找现有的元素。但是,要查看一个元素,需要有要查找元素的精确副本。这不是一种非常通用的查找方式,因为在集合中查找元素总是要遍历集合。通常,我们知道某些键的信息,并想要查找与之对应的元素。映射(map)数据结构就是为此而设计的。映射用来
java什么是映射
2022-02-23

怎么进行tomcat虚拟目录的映射

要将Tomcat的虚拟目录映射到特定的路径上,可以按照以下步骤进行操作:打开Tomcat的安装目录,找到`conf`文件夹。在`conf`文件夹中找到`server.xml`文件,使用文本编辑器打开。在`server.xml`文件中,找
怎么进行tomcat虚拟目录的映射
2023-10-28

Hibernate映射关联是什么

这篇文章主要讲解了“Hibernate映射关联是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射关联是什么”吧!Hibernate映射关联关系和我们现实世界里事物的关
2023-06-17

Hibernate的集合映射是什么

这期内容当中小编将会给大家带来有关Hibernate的集合映射是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。POJOs如下:Customer类---->customer表Order类对应---->o
2023-06-17

java映射的概念是什么

在Java中,映射(Map)是一种数据结构,用于存储键值对(key-value pairs)的集合。每个键(key)都是唯一的,而值(value)可以重复。映射提供了以常量时间复杂度(O(1))来查找、插入、删除键值对的操作。在映射中,可以
2023-08-23

Hibernate高级集合映射是什么

本篇内容主要讲解“Hibernate高级集合映射是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hibernate高级集合映射是什么”吧!Hibernate高级集合映射主要分为有序集合、双向
2023-06-17

Linux内存映射指的是什么

Linux内存映射指的是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 内存映射就是用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修
2023-06-28

mysql映射表的作用是什么

MySQL映射表的作用是将数据库中的数据表与Java类进行映射,方便在程序中操作数据库。通过映射表,可以将数据库中的表字段映射为Java类的属性,从而实现数据库表与Java对象之间的对应关系。这样可以简化数据库操作,提高开发效率,同时也可以
mysql映射表的作用是什么
2024-04-09

Linux端口映射的方法是什么

这篇文章主要介绍“Linux端口映射的方法是什么”,在日常操作中,相信很多人在Linux端口映射的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux端口映射的方法是什么”的疑惑有所帮助!接下来
2023-06-28

mybatis中mapper映射的方法是什么

在MyBatis中,Mapper映射的方法是通过SQL语句来操作数据库。Mapper映射文件中定义了一系列的SQL语句,这些SQL语句与Java接口中的方法一一对应。Mapper接口中的方法可以使用注解或者XML来定义SQL语句,以完成对数
2023-09-16

ps渐变映射的作用是什么

这篇文章主要讲解了“ps渐变映射的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ps渐变映射的作用是什么”吧!ps渐变映射的作用:一、渐变映射的使用原理 1、利用 PS渐变映射工具
2023-07-04

云服务器映射端口是什么

云服务器的映射端口通常指云服务器提供商为客户端提供的网络接口,用于连接到其服务器以获得网络资源。您可以查看云服务器提供商的网站,以确定他们是否提供此类映射端口。一般来说,在云服务器上使用的网络接口是动态主机配置协议(DHCP)。在DHCP服务器上保存有客户端IP地址和服务器IP地址的映射信息。当您访问云服务器时,服务器将分配给您一个IP地址,使您可以连接到该服务器并获得所需的服务。需要注意的
2023-10-26

云服务器内网映射是什么

云服务器内网映射指的是将本地内网IP映射到云服务器的IP地址或公网IP地址范围内,从而实现跨云计算平台的访问。通常,云服务器通过内部的IP来映射用户访问,而云服务器本身也将访问地址映射到内部的IP,以便在云服务器的本地内网范围内实现用户的功能。内网映射的实现步骤如下:将内网IP映射到云服务器的IP地址。可以使用VPN或DNS服务来实现。如果没有VPN或DNS服务,则必须使用云服务器提供的内
2023-10-26

ERP的Account group和CRM partner group的映射关系是什么

ERP的Account group和CRM partner group的映射关系是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在VD01中创建客户时,需要指定一个账户组。
2023-06-04

Linux主机名映射的方法是什么

这篇文章主要讲解了“Linux主机名映射的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux主机名映射的方法是什么”吧!1. 查看主机名: hostname uname -
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录