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

linux内核缺页中断处理

缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...下面看内核态缺页异常具体的处理函数,内核态分为当前进程的页表内核映射部分没更新到最新的,此时需要进行页表同步,调用vmalloc_fault /* * 处理vmalloc异常或者模块区域映射异常 *...内核的缺页异常处理有了一个比较深入的理解,当然还有很多细枝末节没分析到,但是整个处理逻辑已经分析完了。

10.8K22

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

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

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

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

    ,一个是进程用户态页表(用户态缺页处理的就是这部分),另一个就是内核页表的 copy 部分(内核态缺页处理的是这部分)。...image.png 由于进程 1 的缺页处理发生了物理内存的分配以及磁盘 IO ,所以本次缺页处理属于 VM_FAULT_MAJOR。...省略 2M 大页缺页处理 .......... // 进行页表的相关处理以及解析具体的缺页原因,后续针对性的进行缺页处理 return handle_pte_fault(&vmf);...所以在处理虚拟内存映射区 vma 中的缺页时,也需要分为匿名映射区的缺页处理以及文件映射区的缺页处理。那么在这里,我们该如何区分这个缺页的 vma 到底是属于匿名映射区还是文件映射区呢 ?...笔者曾在 《深入理解 Linux 物理内存管理》一文中为大家介绍了 Linux 内核在 NUMA 架构下物理内存管理的相关内容。

    3.4K22

    Linux虚拟内存和缺页中断

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

    6.1K10

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

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

    2.6K42

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

    作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...三,源代码分析 3.1 触发条件 当第一节中的触发情况发生的时候,处理器就会发生缺页异常,从处理器架构相关部分过渡到处理器无关部分,最终到达handle_pte_fault函数: 3742 static...当满足这两个条件的时候就会调用do_anonymous_page函数来处理匿名映射缺页异常。...而如果是先读访问一页然后写访问这一页,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理,第二次是写时复制缺页异常处理。 (END)

    3K32

    Linux信号处理

    目前 Linux 支持64种信号。信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。...信号实现原理 接下来我们分析一下Linux对信号处理机制的实现原理。...为了尽快让信号得到处理Linux把信号处理过程放置在进程从内核态返回到用户态前,也就是在 ret_from_sys_call 处: // arch/i386/kernel/entry.S ENTRY...我们知道,从内核态返回到用户态时,CPU要从内核栈中找到返回到用户态的地址(就是调用系统调用的下一条代码指令地址),Linux为了先让信号处理程序执行,所以就需要把这个返回地址修改为信号处理程序的入口,...Linux的做法就是在用户态栈空间构建一个 Frame(帧)(我也不知道为什么要这样叫),构建这个帧的目的就是为了执行完信号处理程序后返回到内核态,并恢复原来内核栈的内容。

    5.9K40

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

    作者简介: viho he,ARM64专家,现供职于某芯片公司,专注于Linux内核、BSP、ARM64虚拟化以及与ARM64 SoC相关的各种底软技术 问题简述 在笔者的开发平台上,应用程序使用ION...分析remap_pfn_range行为发现应该不是这里的问题,那么,或许这个page fault不是缺页异常,而是别的page fault?想到这一层后,继续对比4.19与5.10内核行为。...联合属性,包含这样两个页表基本属性:PTE_RDONLY | PTE_DBM 根据ARMv8手册,PTE_RDONLY | PTE_DBM 两个属性叠加,根据另一个系统寄存器的不同配置,会有两种不同硬件处理的情况...VM_SHARED ptes are clean by default 从该commit描述看,对此的引入是合理的,因为引入者预期配置了TCR_EL1.HD=1,即问题要素2.A)的路径,由CPU硬件自动处理页表项...因为笔者先入为主的观念,把所有page fault都当成了缺页异常,而没有第一时间想到permission fault的可能,导致浪费了大量时间来分析remap_pfn_range的行为,虽然代码逻辑整理了不少

    1.4K30

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

    1、增加吞吐量2、规模经济3、增加可靠性 非对称多处理系统每个处理器都有各自特定的任务,一个主处理器控制系统,其他处理器或者向主处理器要任务或者完成预定任务对称多处理系统每个处理器都要完成操作系统的任务...使用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,缺页读入

    87350

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

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

    1.2K20

    Linux】信号的处理

    信号的处理 1 信号的处理 2 内核态 VS 用户态 3 键盘输入数据的过程 4 如何理解OS如何正常的运行 5 如何进行信号捕捉 信号处理的总结 6 可重入函数 volatile关键字 Thanks♪...下一篇文章见 1 信号的处理 处理信号本质就是递达这个信号!...我们说过:信号可能不会被立即处理,而是在合适的时候进行处理。那么这个合适的时候到底是什么时候?! 进程从内核态(处于操作系统的状态)返回到用户态(处在用户状态)的时候进行处理!...来看Linux内核: 在操作系统的主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...我们慢慢来说: 首先信号处理有一个特性,比如我们在处理二号信号的时候,默认会对二号信号进行屏蔽!对2号信号处理完成的时候,会自动解除对2号信号的屏蔽!

    9310

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....正在处理同一中断的那个CPU完成一次处理后, 会再次检查”触发”标记, 如果设置, 则再次触发处理过程. 于是, 中断的处理是一个循环过程, 每次循环调用handle_IRQ_event来处理中断....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

    7.4K80

    Linux信号处理机制

    信号是一种进程间通信机制,信号都有一个对应的默认处理行为,信号触发时,信号处理函数和进程正常的执行流程同时存在,这会给编程带来隐患,如果信号处理函数中调用了不可重入函数的话。...如果想要自定义信号处理逻辑,可以使用signal/sigaction函数接口来设置信号处理函数。...Linux信号可以分为两类:可靠信号和不可靠信号,信号值在[1,31] 之间的所有信号,都被称为不可靠信号;在[SIGRTMIN,SIGRTMAX] 之间的信号,被称为可靠信号。...信号未决状态是指 从生成信号到信息处理逻辑执行的这段时间。 常见的Linux信号如下(可以通过命令kill -l查看): SIGHUP 1 终端挂起或控制进程终止。...从信号生成到执行信号处理逻辑这段时间,信号是未决的。 在信号处理函数期间,有可能还会收到其他信号,当然也有可能再次收到正在处理的信号。如果在处理A信号期间再次收到A信号,会发生什么呢?

    3.4K21
    领券