缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...下面看内核态缺页异常具体的处理函数,内核态分为当前进程的页表内核映射部分没更新到最新的,此时需要进行页表同步,调用vmalloc_fault /* * 处理vmalloc异常或者模块区域映射异常 *...内核的缺页异常处理有了一个比较深入的理解,当然还有很多细枝末节没分析到,但是整个处理逻辑已经分析完了。
缺页异常被触发通常有两种情况—— 程序设计的不当导致访问了非法的地址 访问的地址是合法的,但是该地址还未分配物理页框. 下面解释一下第二种情况,这是虚拟内存管理的一个特性。...由于程序的局部性原理,程序在一定时间内所访问的内存往往是有限的,因此内核只会在进程确确实实需要访问物理内存时才会将相应的虚拟内存区域与物理内存进行关联(为相应的地址分配页表项,并将页表项映射到物理内存),也就是说这种缺页异常是正常的...,而第一种缺页异常是不正常的,内核要采取各种可行的手段将这种异常带来的破坏减到最小。...缺页异常的处理函数为do_page_fault(),该函数是和体系结构相关的一个函数,缺页异常的来源可分为两种,一种是内核空间(访问了线性地址空间的第4个GB),一种是用户空间(访问了线性地址空间的0~...3GB),以X86架构为例,先来看内核空间异常的处理。
缺页中断发生在系统对虚拟地址转换成物理地址的过程中。如果对应的页目录或者页表项没有对应有效的物理内存,则会发生缺页中断。 系统在初始化的时候注册了缺页中断的处理函数。中断号是14。...// 缺页和写保护异常处理函数 set_trap_gate(14,&page_fault); page_fault是汇编实现的。...addl $8,%esp pop %fs pop %es pop %ds popl %edx popl %ecx popl %eax iret 缺页中断的具体处理函数是...do_no_page // 缺页处理,进程的内容还没有加载到内存,访问的时候导致缺页异常 void do_no_page(unsigned long error_code,unsigned long address...最后重新执行触发缺页中断的地址。这时候可以找到对应的内容了。
,一个是进程用户态页表(用户态缺页处理的就是这部分),另一个就是内核页表的 copy 部分(内核态缺页处理的是这部分)。...image.png 由于进程 1 的缺页处理发生了物理内存的分配以及磁盘 IO ,所以本次缺页处理属于 VM_FAULT_MAJOR。...省略 2M 大页缺页处理 .......... // 进行页表的相关处理以及解析具体的缺页原因,后续针对性的进行缺页处理 return handle_pte_fault(&vmf);...所以在处理虚拟内存映射区 vma 中的缺页时,也需要分为匿名映射区的缺页处理以及文件映射区的缺页处理。那么在这里,我们该如何区分这个缺页的 vma 到底是属于匿名映射区还是文件映射区呢 ?...笔者曾在 《深入理解 Linux 物理内存管理》一文中为大家介绍了 Linux 内核在 NUMA 架构下物理内存管理的相关内容。
Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。...每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。...缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 1、保护CPU现场 2、分析中断原因 3、转入缺页中断处理程序进行处理 4、恢复CPU现场,继续执行 但是缺页中断是由于所要访问的页面不存在于内存时...,由硬件所产生的一种特殊的中断,因此,与一般的中断存在区别: 1、在指令执行期间产生和处理缺页中断信号 2、一条指令在执行期间,可能产生多次缺页中断 3、缺页中断返回是,执行产生中断的一条指令,而一般的中断返回是
通过《Linux进程的内存管理之malloc和mmap》我们知道,这两个函数只是建立了进程的vma,但还没有建立虚拟地址和物理地址的映射关系。...当进程访问这些还没建立映射关系的虚拟地址时,处理器会自动触发缺页异常。 ARM64把异常分为同步异常和异步异常,通常异步异常指的是中断(可看《上帝视角看中断》),同步异常指的是异常。...如果是写访问,用alloc_zeroed_user_highpage_movable分配新的物理页,并用0填充,然后映射到虚拟页上去 如果是先读后写访问,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理...(虚拟页到0页的映射),第二次是写时复制缺页异常处理。...由于内存和磁盘的读写性能差异较大,Linux会在内存充裕时将空闲内存当作swap cache,用来缓存磁盘数据,以提高I/O性能。相对的在内存紧张时Linux会将这些缓存回收,将脏页回写到磁盘中。
作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...三,源代码分析 3.1 触发条件 当第一节中的触发情况发生的时候,处理器就会发生缺页异常,从处理器架构相关部分过渡到处理器无关部分,最终到达handle_pte_fault函数: 3742 static...当满足这两个条件的时候就会调用do_anonymous_page函数来处理匿名映射缺页异常。...而如果是先读访问一页然后写访问这一页,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理,第二次是写时复制缺页异常处理。 (END)
d -b s -a nothing -b nothing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当出现双波折线-- shell就会停止处理选项
中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...鉴于这个原因,Linux把中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...Linux在系统初始化时注册了两种softirq处理函数,分别为 TASKLET_SOFTIRQ 和 HI_SOFTIRQ: void __init softirq_init() { ......Linux通过 __softirq_active 这个字段得知哪种softirq需要执行(只需要把对应位设置为1)。...在Linux内核中有两种tasklet,一种是高优先级tasklet,一种是普通tasklet。
作者简介: 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、增加吞吐量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,缺页读入
目前 Linux 支持64种信号。信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。...信号实现原理 接下来我们分析一下Linux对信号处理机制的实现原理。...为了尽快让信号得到处理,Linux把信号处理过程放置在进程从内核态返回到用户态前,也就是在 ret_from_sys_call 处: // arch/i386/kernel/entry.S ENTRY...我们知道,从内核态返回到用户态时,CPU要从内核栈中找到返回到用户态的地址(就是调用系统调用的下一条代码指令地址),Linux为了先让信号处理程序执行,所以就需要把这个返回地址修改为信号处理程序的入口,...Linux的做法就是在用户态栈空间构建一个 Frame(帧)(我也不知道为什么要这样叫),构建这个帧的目的就是为了执行完信号处理程序后返回到内核态,并恢复原来内核栈的内容。
虽然,被置换页面的可以随机选择,但是不同的选择,所导致后续系统访存开销是不一样,甚至会出现很极端的情况,每次访存都发生缺页中断,极大的增加系统额外的访存开销。...算法流程: 在缺页中断发生时,首先从 主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。...举例如下: 缺页9次,总访问次数12次缺页率:6/12 = 50% FIFO算法(先进先出置换算法) Belady异常: 采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象...举例如下: 缺页9次,总访问次数12次缺页率:9/12 = 75% LRU算法 (最近最久未使用算法) 利用局部性原理,根据一个作业在执行过程中过去的页面访问==历史来推测未来==的行为。...举例如下: 缺页7次,总访问次数12次缺页率:7/12 = 58.3% 实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。
linux之字符处理 管道 linux中存在着管道,它是一个固定大小的缓冲区,缓冲区大小通常为1页,也就是4K字节。...6872 8月 9 2021 udev -rwxr-xr-x 1 root root 2757 11月 23 2016 x11-common --More-- 使用grep搜索文本 grep是linux...age is 24. my name is swz,i come from china. no,let's come here. ok,i'm swz. swz 使用cut截取文本 cut截取文本,处理的是一行文本
信号的处理 1 信号的处理 2 内核态 VS 用户态 3 键盘输入数据的过程 4 如何理解OS如何正常的运行 5 如何进行信号捕捉 信号处理的总结 6 可重入函数 volatile关键字 Thanks♪...下一篇文章见 1 信号的处理 处理信号本质就是递达这个信号!...我们说过:信号可能不会被立即处理,而是在合适的时候进行处理。那么这个合适的时候到底是什么时候?! 进程从内核态(处于操作系统的状态)返回到用户态(处在用户状态)的时候进行处理!...来看Linux内核: 在操作系统的主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...我们慢慢来说: 首先信号处理有一个特性,比如我们在处理二号信号的时候,默认会对二号信号进行屏蔽!对2号信号处理完成的时候,会自动解除对2号信号的屏蔽!
最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....正在处理同一中断的那个CPU完成一次处理后, 会再次检查”触发”标记, 如果设置, 则再次触发处理过程. 于是, 中断的处理是一个循环过程, 每次循环调用handle_IRQ_event来处理中断....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.
无论kill -9还是直接把系统中nanoWatch所对应的进程文件删除,一样会定时重启。
关于信号何时处理、该如何处理,本文中将会一一揭晓 捕捉动作并进行处理 ---- ️正文 1、信号的处理时机 直奔主题,谈谈信号的 处理时机 1.1、处理情况 普通情况 所谓的普通情况就是指...普通情况 就有点难搞了,它需要等待 “合适” 的时机,才能被 递达,继而被 处理 1.2、“合适” 的时机 信号的产生是 异步 的 也就是说,信号可能随时产生,当信号产生时,进程可能在处理更重要的事,此时贸然处理信号显然不够明智...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨,然后学习了 用户态 和 内核态 的相关内容
文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) 1、分配虚拟内存页 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存页...分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 此处调用的...内核空间 的 系统调用 mmap 函数 , 实现了 " 物理内存地址 " 与 " 虚拟内存地址 " 的映射关系 ; Linux 内核中的 mmap 系统调用函数 : int mmap(struct file...*filp, struct vm_area_struct *vma) 3、产生缺页异常并分配物理内存页 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 " 缺页异常 " 后 ,
领取专属 10元无门槛券
手把手带您无忧上云