缺页异常被触发通常有两种情况—— 程序设计的不当导致访问了非法的地址 访问的地址是合法的,但是该地址还未分配物理页框. 下面解释一下第二种情况,这是虚拟内存管理的一个特性。...由于程序的局部性原理,程序在一定时间内所访问的内存往往是有限的,因此内核只会在进程确确实实需要访问物理内存时才会将相应的虚拟内存区域与物理内存进行关联(为相应的地址分配页表项,并将页表项映射到物理内存),也就是说这种缺页异常是正常的...,而第一种缺页异常是不正常的,内核要采取各种可行的手段将这种异常带来的破坏减到最小。...缺页异常的处理函数为do_page_fault(),该函数是和体系结构相关的一个函数,缺页异常的来源可分为两种,一种是内核空间(访问了线性地址空间的第4个GB),一种是用户空间(访问了线性地址空间的0~...3GB),以X86架构为例,先来看内核空间异常的处理。
当进程访问这些还没建立映射关系的虚拟地址时,处理器会自动触发缺页异常。 ARM64把异常分为同步异常和异步异常,通常异步异常指的是中断(可看《上帝视角看中断》),同步异常指的是异常。...如果是写访问,用alloc_zeroed_user_highpage_movable分配新的物理页,并用0填充,然后映射到虚拟页上去 如果是先读后写访问,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理...(虚拟页到0页的映射),第二次是写时复制缺页异常处理。...第一次读匿名页情况 //是否为写内存导致的缺页异常 if (!(vmf->flags & FAULT_FLAG_WRITE) && !...读之后写匿名页 见 do_wp_page do_fault 文件页缺页异常 ?
作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...前面讲到过写时复制缺页异常(COW),一般用于父子进程之间共享页,而我们会常见一种缺页异常是匿名映射缺页异常,今天我们就来讨论下这种缺页异常,让大家彻底理解它。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...一,匿名映射缺页异常的触发情况 前面我们讲解了什么是匿名页,那么思考一下什么情况下会触发匿名映射缺页异常呢?...而如果是先读访问一页然后写访问这一页,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理,第二次是写时复制缺页异常处理。 (END)
linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...缺页异常分类:1.内核态缺页异常,2.用户态缺页异常。其中内核态异常分为1.vmalloc区异常,因为非vmalloc的内核区是直接对等映射的,只有vmalloc区是动态映射的。...内核态缺页异常频率很低,因为内核态的数据不会换出到磁盘的。所以用户态才会经常出现缺页异常,因为用户态的数据经常写到交换区和文件。并且在进程刚创建运行时也会伴随着大量的缺页异常。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...下面看内核态缺页异常具体的处理函数,内核态分为当前进程的页表内核映射部分没更新到最新的,此时需要进行页表同步,调用vmalloc_fault /* * 处理vmalloc异常或者模块区域映射异常 *
此时 CPU 会将发生缺页异常时,进程正在使用的相关寄存器中的值压入内核栈中。比如,引起进程缺页异常的虚拟内存地址会被存放在 CR2 寄存器中。...address 表示触发缺页异常的虚拟内存地址。...error_code 是对缺页异常的一个描述,目前内核只使用了 error_code 的前六个比特位来描述引起缺页异常的具体原因,后面比特位的含义我们先暂时忽略。...,那么就会引起写保护类型的缺页异常。...U/S(2):表示缺页异常发生在用户态还是内核态,error_code 第 2 个比特位设置为 0 表示 CPU 访问内核空间的地址引起的缺页异常,设置为 1 表示 CPU 访问用户空间的地址引起的缺页异常
缺页中断发生在系统对虚拟地址转换成物理地址的过程中。如果对应的页目录或者页表项没有对应有效的物理内存,则会发生缺页中断。 系统在初始化的时候注册了缺页中断的处理函数。中断号是14。...// 缺页和写保护异常处理函数 set_trap_gate(14,&page_fault); page_fault是汇编实现的。...push %fs // 内核数据段描述符 movl $0x10,%edx mov %dx,%ds mov %dx,%es mov %dx,%fs // 如果是缺页异常...与,结果放到ZF中 testl $1,%eax // zf=0则跳转,即0是写异常,1是缺页异常 jne 1f call _do_no_page // 跳到标签2...do_no_page // 缺页处理,进程的内容还没有加载到内存,访问的时候导致缺页异常 void do_no_page(unsigned long error_code,unsigned long address
Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常...还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。...缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 1、保护CPU现场 2、分析中断原因 3、转入缺页中断处理程序进行处理 4、恢复CPU现场,继续执行 但是缺页中断是由于所要访问的页面不存在于内存时
作者简介: viho he,ARM64专家,现供职于某芯片公司,专注于Linux内核、BSP、ARM64虚拟化以及与ARM64 SoC相关的各种底软技术 问题简述 在笔者的开发平台上,应用程序使用ION...分析remap_pfn_range行为发现应该不是这里的问题,那么,或许这个page fault不是缺页异常,而是别的page fault?想到这一层后,继续对比4.19与5.10内核行为。...答: 5.10对PTE_RDONLY引入,是ARM官方maintainer的刻意行为,源于commit: https://github.com/torvalds/linux/commit/aa57157be69fb599bd4c38a4b75c5aad74a60ec0...因为笔者先入为主的观念,把所有page fault都当成了缺页异常,而没有第一时间想到permission fault的可能,导致浪费了大量时间来分析remap_pfn_range的行为,虽然代码逻辑整理了不少
浅谈操作系统内核的缺页异常(Page Fault) 缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。...缺页异常Page Fault大揭秘 设想,CPU给MMU的虚拟地址,在TLB和 Page Table都没有找到对应的物理页帧,该怎么办呢?...没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误。...image.png 缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。...Soft Page Fault 也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU
文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) 1、分配虚拟内存页 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存页...二、mmap 库函数与 mmap 内核系统调用函数 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) ---- 1、分配虚拟内存页...分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 此处调用的...*filp, struct vm_area_struct *vma) 3、产生缺页异常并分配物理内存页 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 " 缺页异常 " 后 ,
近期接触了Linux平台的测试,遇到了软件发生异常,从而接触到了 Linux平台下的Signal——信号,用来通知进程发生了异步事件。...作为测试,免不了需要初步判断一下是否是正在的异常,因此学习了一下Signal NO 1 信号事件的发生有两个来源: 硬件来源(比如我们按下了键盘或者其它硬件故障); 软件来源,最常用发送信号的系统函数是...NO 2 Linux支持的信号列表如下(很多信号是与机器的体系结构相关的) 信号值 默认处理动作 发出信号的原因 SIGHUP 1 A 终端挂起或者控制进程终止...E 信号不能被捕获 F 信号不能被忽略 了解了以上信息后,再来看软件生成异常的log文件,其他的信息可以暂时不关注,将log信息中的Signal字段找出来,解读后面的数值 未了解之前: 跟开发了解了软件在出现异常时会写...是经常出现且需要重点关注的信号,遇到这个数字千万要放过 6和14,遇到这个信号也千万不要忽略,需要找开发进行分析讨论的哟,它可能是问题,当然,也可能不是问题 其他的信号,目前位置没有遇到过 以上简单分享了Linux
文章时间:2020年3月5日 09:59:20 解决问题:系统时间异常,修复系统时间 CentOS系统 yum install ntpdate ntpdate 某个服务器节点 Ubuntu系统
附录1 FIFO 与LRU FIFO 先进先出 ---- 刚开始内存为空 null, null, null 使用2,缺页读入 2, null, null 使用3,缺页读入 2, 3, null...使用2,直接使用 2, 3, null 使用1,缺页读入 2, 3, 1 使用5,缺页读入 3, 1, 5 因为2是最先读入的,所以就把它删掉 使用2,缺页读入 1, 5, 2 使用4,缺页读入...5, 2, 4 使用5,直接使用 5, 2, 4 使用3,缺页读入 2, 4, 3 使用2,直接使用 2, 4, 3 使用5,缺页读入 4, 3, 5 使用2,缺页读入 3, 5, 2 共9...次缺页 LRU 会删除最不常访问的 刚开始内存为空 null, null, null 使用2,缺页读入 2, null, null 使用3,缺页读入 3, 2, null 使用2,直接使用 2,...3, null 使用1,缺页读入 1, 2, 3 使用5,缺页读入 5, 1, 2 因为最近1和2都访问过而3是很早之前用过的,所以就把它删掉 使用2,直接使用 2, 5, 1 使用4,缺页读入
对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内存分为内核态和用户态两部分,经典比例如下: 从用户态到内核态一般通过系统调用、中断来实现。...,只有在真正需要的时候才分配物理内存,这就是COW(COPY-ON-WRITE:写时复制)技术,而物理分配的过程就是最复杂的缺页异常处理环节了,下面来看!...缺页异常 在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。...在内核处理缺页异常时可以拿到的信息如下: cr2:访问到线性地址 err_code:异常发生时由控制单元压入栈中,表示发生异常的原因 regs:发生异常时寄存器的值 处理的流程如下: 发生缺页异常的时候...,可能因为不常使用而被swap到磁盘上了,swap相关的命令如下: 如果内存是mmap映射到内存中的,那么在读、写对应内存的时候也会产生缺页异常。
文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...没有 文件 支持 的 内存映射 , 只是将 " 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux...系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了...” 延迟策略 “ , 即进程第一次访问 , 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 3、分配物理内存页 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 :...对于 " 文件映射 " , 遇到 " 缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射
对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内存分为内核态和用户态两部分,经典比例如下: ? 从用户态到内核态一般通过系统调用、中断来实现。...malloc完以后,并没有马上占用那么大的物理内存,而仅仅是维护上面的虚拟地址空间而已,只有在真正需要的时候才分配物理内存,这就是COW(COPY-ON-WRITE:写时复制)技术,而物理分配的过程就是最复杂的缺页异常处理环节了...缺页异常 在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。...在内核处理缺页异常时可以拿到的信息如下: cr2:访问到线性地址 err_code:异常发生时由控制单元压入栈中,表示发生异常的原因 regs:发生异常时寄存器的值 处理的流程如下: ?...发生缺页异常的时候,可能因为不常使用而被swap到磁盘上了,swap相关的命令如下: ? 如果内存是mmap映射到内存中的,那么在读、写对应内存的时候也会产生缺页异常。
但是频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc 只对大块内存使用 mmap 的原因。欧!!这里冒出一个新名词,缺页异常?别着急,我会在后面讲解。...关于内存分配器以及管理内存的策略和算法,将来在《Linux内核深度解读》新专题中,我会详细讲解。 缺页异常 在《mmap》这部分中,我提到了缺页异常,那么,什么是缺页异常呢?...在讲解缺页异常之前,我们先看一下《内存分配》这部分中的第一张图底部的虚拟内存管理器,通过讲解它的工作原理,我们慢慢理解什么是缺页异常。...所以,mmap过程中讲到的缺页异常就是上面过程中所提到的缺页异常。 最后,通过上面Linux内存分配的各部分细节的讲解,我们再来回顾一下《内存分配》部分开头那张图: ?...分配内存 (2) 当申请内存大小大于MMAP_THRESHOLD这个内核参数配置的大小(默认128K)时,使用mmap分配内存 当出现缺页时,Linux内核使用虚拟内存管理器的几个组件处理缺页异常 InnoDB
操作系统--虚页面管理之页面置换算法 系统的内存并不是无限大,操作系统会为每个程序分配内存,当访问的地址块不在内存中,就要从外存(即硬盘,U盘等)调入,这就是所说的缺页异常。...当发生缺页异常时,操作系统会选择一个页面进行换出从而为新进来的页面腾出空间。对于被置换的页面有以下情况: 如果要被换出的页面只被访问而没被修改,那么直接将此页面丢弃。...举例如下: 缺页9次,总访问次数12次缺页率:6/12 = 50% FIFO算法(先进先出置换算法) Belady异常: 采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象...举例如下: 缺页9次,总访问次数12次缺页率:9/12 = 75% LRU算法 (最近最久未使用算法) 利用局部性原理,根据一个作业在执行过程中过去的页面访问==历史来推测未来==的行为。...举例如下: 缺页7次,总访问次数12次缺页率:7/12 = 58.3% 实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。
1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope Linux内核由于存在page...在Linux内核中,因为跟踪脏页会涉及到文件回写、缺页异常、反向映射等技术,所以本文也重点讲解在Linux内核中如何跟踪脏页。...因为页表项为只读,所以写访问会发生写时复制缺页异常,异常处理中将处理共享文件页映射,重新将相应进程的页表项为设置为脏、可写。...分析如下: 2.1 第一次写访问文件页时 如果是mmap映射文件页,在没有填充页表情况下,写访问会发生转换表错误类型的缺页异常。...这时写访问文件页会发生写时复制缺页异常(访问权限错误缺页)。
领取专属 10元无门槛券
手把手带您无忧上云