首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核虚拟内存管理之匿名映射缺页异常分析

作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...这种异常对于我们来说非常常见: 1.当我们应用程序使用malloc来申请一块内存(堆分配),在没有使用这块内存之前,仅仅是分配了虚拟内存,并没有分配物理内存,第一次去访问的时候才会通过触发缺页异常来分配物理页建立和虚拟页的映射关系...2.当我们应用程序使用mmap来创建匿名的内存映射的时候,页同样只是分配了虚拟内存,并没有分配物理内存,第一次去访问的时候才会通过触发缺页异常来分配物理页建立和虚拟页的映射关系。...五,总结 匿名映射缺页异常是我们遇到的一种很常用的一种异常,对于匿名映射,映射完成之后,只是获得了一块虚拟内存,并没有分配物理内存,当第一次访问的时候:如果是读访问,会将虚拟页映射到0页,以减少不必要的内存分配

3K32

Linux虚拟内存管理

Linux的内存管理分为 虚拟内存管理 和 物理内存管理,本文主要介绍 虚拟内存管理 的原理和实现。在介绍 虚拟内存管理 前,首先介绍一下 x86 CPU 内存寻址的具体过程。...虚拟内存地址管理 应用程序使用 malloc() 函数向Linux内核申请内存时,Linux内核会返回可用的虚拟内存地址给应用程序。...每个进程都可以使用4GB的虚拟内存地址,所以Linux内核需要为每个进程管理这4GB的虚拟内存地址。例如记录哪些虚拟内存地址是空闲的可以分配的,哪些虚拟内存地址已经被占用了。...Linux的内存访问异常处理例程是 do_page_fault(),代码如下: asmlinkage void do_page_fault(struct pt_regs *regs, unsigned...,CPU会把触发异常虚拟内存地址保存到 cr2寄存器中,do_page_fault() 函数首先通过读取 cr2寄存器 获取到触发异常虚拟内存地址,然后调用 find_vma() 函数获取虚拟内存地址对应的

4K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux虚拟内存管理

    摘要--本文旨在深入探讨Linux操作系统的虚拟内存管理机制。我们将从基本概念开始,逐步深入到内核级别的实现细节。为了达到这个目标,本文将结合理论讨论和实际的代码分析。...我们希望通过这种方式,使读者对Linux虚拟内存管理有更深入的理解。一、虚拟内存的基本概念在现代操作系统中,虚拟内存是一个非常重要的概念。...此外,虚拟内存还允许物理内存的超量使用,即所谓的“内存过量承诺”,这使得我们可以运行比物理内存还要大的程序。Linux操作系统采用了一种称为“分页”的技术来实现虚拟内存。...二、Linux虚拟内存管理的实现在Linux内核中,虚拟内存的管理主要涉及以下几个部分:页表管理、页面分配与回收、页面置换算法以及内存映射。1....三、代码分析为了更深入地理解Linux虚拟内存管理的实现,让我们来看一个简单的例子:一个创建新的内存映射的系统调用。这个例子的代码可以在mm/mmap.c文件中找到。

    48400

    linux 虚拟内存的作用?

    虚拟内存可以用来管理物理内存,进程直接和虚拟内存进行打交道而不是物理内存,为什么这样设计? 什么是虚拟内存?...虚拟内存的作用 利用磁盘起到的缓存的作用,提高进程访问磁盘的速度。 虚拟内存可以为进程提供独立的内存空间,并通过动态链接库共享内存。...通过增加虚拟内存,避免了程序直接访问任意内存,修改了其他程序使用的数据导致程序崩溃,虚拟内存可以将不同进程使用的虚拟地址彼此隔离。...目前linux系统,采用四层页表结构页表结构,每个9位,最低12位作为偏移量。...总 虚拟内存可以结合磁盘和物理内存的优势为进程提供看起来速度足够快并且容量足够大的存储; 虚拟内存可以为进程提供独立的内存空间并引入多层的页表结构将虚拟内存翻译成物理内存,进程之间可以共享物理内存减少开销

    3.5K20

    理解 Linux虚拟内存

    前言 ---- 前不久组内又有一次我比较期待的分享:”Linux虚拟内存”。...之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux 还为大内存设计了多级页表...直接操作物理内存 操作系统使用了虚拟内存,我们想要直接操作内存该怎么办呢? Linux 会将各个设备都映射到 /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。...此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。具体可以查看 为什么linux下多线程程序如此消耗虚拟内存。...常用管理命令 ---- 我们也可以自己来管理 Linux虚拟内存

    3K20

    理解 Linux虚拟内存

    前不久组内又有一次我比较期待的分享:“Linux虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题。...之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux 还为大内存设计了多级页表...直接操作物理内存 操作系统使用了虚拟内存,我们想要直接操作内存该怎么办呢? Linux 会将各个设备都映射到 /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。...此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。具体可以查看 为什么linux下多线程程序如此消耗虚拟内存。...常用管理命令 我们也可以自己来管理 Linux虚拟内存

    2.1K10

    Linux虚拟内存和缺页中断

    Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。...还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。...请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。 虚拟内存的好处: 扩大地址空间; 内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。

    6.1K10

    Linux系统建立虚拟内存教程

    虚拟内存是将硬盘规划出一个区间用来读取数据的空间,建立虚拟内存可以提高服务器的运行效率。...目前,大多数服务器操作系统都使用了虚拟内存,Windows系统一般称为“虚拟内存”;而Linux称作“交换空间”。 这里主要讲解Linux系统如何建立虚拟内存。...Linux系统建立虚拟内存,一般通过建立swap file完成。先建立swap这个装置或是档案后,将他格式化为swap格式,最后将他挂载到系统上即可。...方法如下:   一、 建立虚拟内存装置   直接再加一颗硬盘,并且将其中的某个分区规划为swap 的文件系统   1、(1) fdisk /dev/hd[a-d]   (2) 将该分区的ID改为82 ,...1-16]   将上面1中的分区格式化为swap的档案格式   3、swapon /dev/hd[a-d][1-16]   启动swap ,顺便说一下 关掉swap的命令为swapoff   二、建立虚拟内存档案

    3.6K10

    Linux 虚拟内存,这理解很到位

    之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux 还为大内存设计了多级页表...,通过这种”交换”技术,Linux 可以让进程使用更多的内存。...直接操作物理内存 操作系统使用了虚拟内存,我们想要直接操作内存该怎么办呢? Linux 会将各个设备都映射到 /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。...此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。具体可以查看 为什么linux下多线程程序如此消耗虚拟内存。...常用管理命令 我们也可以自己来管理 Linux虚拟内存

    2.7K10

    操作系统:Linux虚拟内存知识介绍

    今天给大家分享Linux虚拟内存相关的知识,希望的对大家能有所帮助! 1、虚拟内存 毋庸置疑,虚拟内存是操作系统中最重要的概念之一。我想主要是由于内存的重要”战略地位”。...之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux 还为大内存设计了多级页表...8.2 直接操作物理内存 操作系统使用了虚拟内存,我们想要直接操作内存该怎么办呢? Linux 会将各个设备都映射到 /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。...此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。具体可以查看 为什么linux下多线程程序如此消耗虚拟内存。...8.4 常用管理命令 我们也可以自己来管理 Linux虚拟内存

    2.5K20

    利用结构化异常实现动态分配虚拟内存

    虚拟内存一次保留(MEM_RESERVE 可以理解为申请)最小就是 64K,一次提交(MEM_COMMIT)至少是一个页面 4K。...而往往有的时候我们不知道我们到底需要多少虚拟内存才够使用,所以可能需要动态分配,下面例子演示了如何使用结构化异常机制,动态根据需要分配内存给一个不断写入新字符的空间使用。...#include #include #define PAGELIMIT 80 LPTSTR lpNxtPage; // 用于记录已经提交的虚拟内存的位置...储存系统页面大小的变量 int PageFaultExceptionFilter(DWORD dwCode) { LPVOID lpvResult; // 如果进程不是访问了错误的虚拟内存地址...(i = 0; i < PAGELIMIT * dwPageSize; i++) { __try { // 尚未分配内存就给赋值会触发异常

    13920

    十问 Linux 虚拟内存管理 ( 一 )

    因此,需要深入学习 Linux虚拟内存管理方面的内容来解释这个现象。...Linux虚拟内存管理有几个关键概念: 每个进程有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址 虚拟地址可通过每个进程上页表与物理地址进行映射,获得真正物理地址 如果虚拟地址对应物理地址不在物理内存中...基于以上认识,这篇文章通过本人以前对虚拟内存管理的疑惑由浅入深整理了以下十个问题,并通过例子和系统命令尝试进行解答。 Linux 虚拟地址空间如何分布? 32 位和 64 位有何不同?.../test_vsz 由以上结果知: VSZ 并不是每次 malloc 后都增长,是与上一节说的堆顶没发生变化有关,因为可重用堆顶内剩余的空间,这样的 malloc 是很轻量快速的。...这也是 Linux 虚拟内存管理的核心概念之一。 四. 如何查看进程虚拟地址空间的使用情况? 进程地址空间被分为了代码段、数据段、堆、文件映射区域、栈等区域,那怎么查询这些虚拟地址空间的使用情况呢?

    11.3K23

    完全剖析 - Linux虚拟内存空间管理

    所以,Linux 根据功能上的差异,来对虚拟内存空间进行管理。 今天,我们来介绍一下 Linux虚拟内存空间管理的细节。...段 之前我们说过,在 32 位的操作系统中,每个进程都拥有 4GB 的虚拟内存空间。Linux 根据功能上的差异,把整个虚拟内存空间划分为多个不同区间,称为 段。...我们先来看看 Linux 进程虚拟内存空间的布局图,如图 1 所示: ? 上图展示了 Linux 进程的虚拟内存空间布局情况,我们只关注 用户空间 的布局。...vm_next:Linux 会通过链表把进程的所有虚拟内存区连接起来,这个字段用于指向下一个虚拟内存区。 vm_page_prot:主要用于保存当前虚拟内存区所映射的物理内存页的读写权限。...总结 本文主要介绍了 Linux 内核是怎么加载应用程序,并且在虚拟内存中建立各个段的布局。

    3.2K12

    Linux下多线程程序为什么消耗大量虚拟内存

    进行服务器内存优化,发现一个非常奇妙的问题,我们的认证服务器(AuthServer)负责跟第三方渠道SDK打交道(登陆和充值),由于采用了curl阻塞的方式,所以这里开了128个线程,奇怪的是每次刚启动的时候占用的虚拟内存在...MAP_STACK, -1, 0) = 0x7f53d04a8000 Process 19495 attached 我检查了一下trace文件也没有发现大量内存mmap动作,即便是brk动作引起的内存增长也不大...于是感觉人生都没有方向了,然后怀疑是不是文件缓存把虚拟内存占掉了,注释掉了代码中所有读写日志的代码,虚拟内存依然增加,排除了这个可能。...那就是如果进程创建了一个线程并且在该线程内分配一个很小的内存1k,整个进程虚拟内存立马增加64M,然后再分配,内存就不增加了。...glibc 版本大于2.11的都会有这个问题:在Redhat 的官方文档上: Red Hat Enterprise Linux 6 features version 2.11 of glibc, providing

    2K30
    领券