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

linux内核缺页中断处理

linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...缺页异常分类:1.内核态缺页异常,2.用户态缺页异常。其中内核态异常分为1.vmalloc区异常,因为非vmalloc的内核区是直接对等映射的,只有vmalloc区是动态映射的。...内核态缺页异常频率很低,因为内核态的数据不会换出到磁盘的。所以用户态才会经常出现缺页异常,因为用户态的数据经常写到交换区和文件。并且在进程刚创建运行时也会伴随着大量的缺页异常。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...), "=r" (x) : "m"(__m(addr)), "i"(errret), "0"(err)) //"m"(__m(addr)), "i"(4), "0"(4)) 经过以上分析,对linux

10.7K21

linux缺页异常处理--内核空间

缺页异常被触发通常有两种情况—— 程序设计的不当导致访问了非法的地址 访问的地址是合法的,但是该地址还未分配物理页框. 下面解释一下第二种情况,这是虚拟内存管理的一个特性。...由于程序的局部性原理,程序在一定时间内所访问的内存往往是有限的,因此内核只会在进程确确实实需要访问物理内存时才会将相应的虚拟内存区域与物理内存进行关联(为相应的地址分配页表项,并将页表项映射到物理内存),也就是说这种缺页异常是正常的...,而第一种缺页异常是不正常的,内核要采取各种可行的手段将这种异常带来的破坏减到最小。...缺页异常的处理函数为do_page_fault(),该函数是和体系结构相关的一个函数,缺页异常的来源可分为两种,一种是内核空间(访问了线性地址空间的第4个GB),一种是用户空间(访问了线性地址空间的0~

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

linux缺页中断源码分析(基于linux0.11)

缺页中断发生在系统对虚拟地址转换成物理地址的过程中。如果对应的页目录或者页表项没有对应有效的物理内存,则会发生缺页中断。 系统在初始化的时候注册了缺页中断的处理函数。中断号是14。...// 缺页和写保护异常处理函数 set_trap_gate(14,&page_fault); page_fault是汇编实现的。...,cr2保存了引起缺页的线性地址 movl %cr2,%edx // 线性地址(有的话)和错误码入参 pushl %edx pushl %eax // 1和eax...do_no_page // 缺页处理,进程的内容还没有加载到内存,访问的时候导致缺页异常 void do_no_page(unsigned long error_code,unsigned long address...最后重新执行触发缺页中断的地址。这时候可以找到对应的内容了。

1.9K10

Linux虚拟内存和缺页中断

Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。...每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。...缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 1、保护CPU现场 2、分析中断原因 3、转入缺页中断处理程序进行处理 4、恢复CPU现场,继续执行 但是缺页中断是由于所要访问的页面不存在于内存时...,由硬件所产生的一种特殊的中断,因此,与一般的中断存在区别: 1、在指令执行期间产生和处理缺页中断信号 2、一条指令在执行期间,可能产生多次缺页中断 3、缺页中断返回是,执行产生中断的一条指令,而一般的中断返回是

6K10

Linux进程的内存管理之缺页异常

通过《Linux进程的内存管理之malloc和mmap》我们知道,这两个函数只是建立了进程的vma,但还没有建立虚拟地址和物理地址的映射关系。...如果是写访问,用alloc_zeroed_user_highpage_movable分配新的物理页,并用0填充,然后映射到虚拟页上去 如果是先读后写访问,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理...(虚拟页到0页的映射),第二次是写时复制缺页异常处理。...读之后写匿名页 见 do_wp_page do_fault 文件页缺页异常 ?...由于内存和磁盘的读写性能差异较大,Linux会在内存充裕时将空闲内存当作swap cache,用来缓存磁盘数据,以提高I/O性能。相对的在内存紧张时Linux会将这些缓存回收,将脏页回写到磁盘中。

2.5K31

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

作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...前面讲到过写时复制缺页异常(COW),一般用于父子进程之间共享页,而我们会常见一种缺页异常是匿名映射缺页异常,今天我们就来讨论下这种缺页异常,让大家彻底理解它。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...一,匿名映射缺页异常的触发情况 前面我们讲解了什么是匿名页,那么思考一下什么情况下会触发匿名映射缺页异常呢?...而如果是先读访问一页然后写访问这一页,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理,第二次是写时复制缺页异常处理。 (END)

2.9K32

一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults

但实际上,Linux 内核是用 TASK_SIZE_MAX 来定义用户空间的末尾的,也就是说 Linux 内核是使用 TASK_SIZE_MAX 来分割用户虚拟地址空间与内核虚拟地址空间的。...上图中展示的页目录项比特位布局笔者是按照 36 位物理内存地址所画,事实上 Linux 内核最大可支持 52 位的物理内存地址。...笔者曾在 《深入理解 Linux 物理内存管理》一文中为大家介绍了 Linux 内核在 NUMA 架构下物理内存管理的相关内容。...笔者在之前文章《一步一图带你构建 Linux 页表体系》 中的第 4.2.1 小节中详细介绍了 64 位页表项 pte 的比特位布局,以及各个比特位的含义。...swap 预读在 Linux 内核中由 swapin_readahead 函数负责,它有两种实现方式: 第一种是根据缺页地址 address 周围的虚拟内存地址进行预读,但前提是它们必须属于同一个 vma

2.6K22

操作系统知识梳理共9次缺页

附录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,缺页读入

86250

为什么mmap之后访问地址仍然发生了缺页异常?

作者简介: 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的行为,虽然代码逻辑整理了不少

1.4K30

OS酱:“哎呀内存太小了,人家又缺页了!”

虽然,被置换页面的可以随机选择,但是不同的选择,所导致后续系统访存开销是不一样,甚至会出现很极端的情况,每次访存都发生缺页中断,极大的增加系统额外的访存开销。...算法流程: 在缺页中断发生时,首先从 主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。...举例如下: 缺页9次,总访问次数12次缺页率:6/12 = 50% FIFO算法(先进先出置换算法) Belady异常: 采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象...举例如下: 缺页9次,总访问次数12次缺页率:9/12 = 75% LRU算法 (最近最久未使用算法) 利用局部性原理,根据一个作业在执行过程中过去的页面访问==历史来推测未来==的行为。...举例如下: 缺页7次,总访问次数12次缺页率:7/12 = 58.3% 实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。

1.1K20

Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )

文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) 1、分配虚拟内存页 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存页...分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 此处调用的...内核空间 的 系统调用 mmap 函数 , 实现了 " 物理内存地址 " 与 " 虚拟内存地址 " 的映射关系 ; Linux 内核中的 mmap 系统调用函数 : int mmap(struct file...*filp, struct vm_area_struct *vma) 3、产生缺页异常并分配物理内存页 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 " 缺页异常 " 后 ,

2.3K10

Linux 内存性能指标

其实linux中空闲的物理空间经常是很少的,和linux使用内存的思路有关 linux会尽量提高内存使用率,经常会把磁盘上的内容缓存到内存,用来加速 linux认为内存闲着也是闲着,还不如拿来做缓存...当内存不足时,linux就会释放缓存部分,让给真正需要的程序使用 2 buffer 和 cache 是什么区别?...内存不足主要有2个明显的表现 (1)持续的内存换入换出 (2)较多的主缺页中断 主缺页中断的概念: 缺页中断包含主/次缺页中断 次缺页中断,是在内存中可以找到目标页 主缺页中断,是在内存中找不到...,需要到磁盘中找 所以较多的主缺页中断意味着较多的访问磁盘 可以通过 sar 命令查看指标 # sar -B 1 3 pgpgin/pgpgout 就是内存的换入换出 fault 次缺页中断...majflt 主缺页中断 vmstat 命令也可以查看一些内存信息 # vmstat 1 5 memory 部分是内存信息 si/so 是交换区的换入换出 补充技巧 执行top命令后,

2.4K50

Linux 内存管理

操作系统内存管理包括物理内存管理和虚拟内存管理:       我们这篇主要介绍Linux的虚拟内存管理。...Linux仅把可执行映像的一小部分 装入物理 内存. 当需要访问未装入的页面时 . 系统产生一个缺页中断 , 把需要的页读入 物理内存。 ...六.分页机制管理 ----          Linux使用分页管理机制来更加有效地利用物理内存.当创建一个进程时.仅仅把当前进程的一小部分真正装入内 存.其余部分需要访问时.处理器产生一个页故障.由缺页中断服务程序根据缺页虚拟地址和出错码调用写拷贝函数...例如:32位Linux的每个用户进程都可以访问4GB的线性地址空间, 而实际的物理内存可能远远少于4GB. 采用分页机制 ,Linux仅把可执行映像的一小部分装入物理内存....计算缺页次数和缺页率?那么采用FIFO、LRU、OPT调度算法产生的缺页中断数各为多少?缺页中断率各为多少?  1)、先进先出(FIFO) 优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。

7.7K10

MySQL分表时机:100w?300w?500w?都对也都不对!

关于内存分配器以及管理内存的策略和算法,将来在《Linux内核深度解读》新专题中,我会详细讲解。 缺页异常 在《mmap》这部分中,我提到了缺页异常,那么,什么是缺页异常呢?...在讲解缺页异常之前,我们先看一下《内存分配》这部分中的第一张图底部的虚拟内存管理器,通过讲解它的工作原理,我们慢慢理解什么是缺页异常。...缺页处理程序从磁盘中调入新的页面到内存中,并且更新 PTE 缺页处理程序将控制权返回给原来的进程,再次执行导致缺页的指令。再次执行后,就会产生页命中时的情况了。...所以,mmap过程中讲到的缺页异常就是上面过程中所提到的缺页异常。 最后,通过上面Linux内存分配的各部分细节的讲解,我们再来回顾一下《内存分配》部分开头那张图: ?...分配内存 (2) 当申请内存大小大于MMAP_THRESHOLD这个内核参数配置的大小(默认128K)时,使用mmap分配内存 当出现缺页时,Linux内核使用虚拟内存管理器的几个组件处理缺页异常 InnoDB

97120

一切皆是映射:浅谈操作系统内核的缺页异常(Page Fault)

浅谈操作系统内核的缺页异常(Page Fault) 缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。...由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理。...image.png 缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。...缺页错误的分类处理 缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理: Hard Page Fault 也被称为Major Page Fault,翻译为硬缺页错误...Soft Page Fault 也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU

13.3K45

五分钟彻底搞懂你一直没明白的Linux内存管理

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。...机器指令中出现的是逻辑地址,逻辑地址规则如下: 在Linux中的逻辑地址等于线性地址,也就是说Inter为了兼容把事情搞得很复杂,Linux简化顺便偷个懒。...Linux中使用slab来解决小对象的分配: 在运行时,slab向buddy“批发”一些内存,加工切块以后“散卖”出去。...缺页异常 在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。...在内核处理缺页异常时可以拿到的信息如下: cr2:访问到线性地址 err_code:异常发生时由控制单元压入栈中,表示发生异常的原因 regs:发生异常时寄存器的值 处理的流程如下: 发生缺页异常的时候

95250

Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...没有 文件 支持 的 内存映射 , 只是将 " 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux...系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了...” 延迟策略 “ , 即进程第一次访问 , 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 3、分配物理内存页 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 :...对于 " 文件映射 " , 遇到 " 缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射

8.3K20

五分钟彻底搞懂你一直没明白的Linux内存管理

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。...在Linux中的逻辑地址等于线性地址,也就是说Inter为了兼容把事情搞得很复杂,Linux简化顺便偷个懒。...Linux中使用slab来解决小对象的分配: ? 在运行时,slab向buddy“批发”一些内存,加工切块以后“散卖”出去。...缺页异常 在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。...发生缺页异常的时候,可能因为不常使用而被swap到磁盘上了,swap相关的命令如下: ? 如果内存是mmap映射到内存中的,那么在读、写对应内存的时候也会产生缺页异常。

1K80
领券