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

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

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

1.9K20

linux内核缺页中断处理

linux内核对缺页异常处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...下面看内核态缺页异常具体的处理函数,内核态分为当前进程的页表内核映射部分没更新到最新的,此时需要进行页表同步,调用vmalloc_fault /* * 处理vmalloc异常或者模块区域映射异常 *...下面看在内核调用copy_from_user时发生缺页异常处理过程: /* 异常表项结构体 */ struct exception_table_entry { unsigned long insn;...内核的缺页异常处理有了一个比较深入的理解,当然还有很多细枝末节没分析到,但是整个处理逻辑已经分析完了。

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

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

当进程访问这些还没建立映射关系的虚拟地址时,处理器会自动触发缺页异常。 ARM64把异常分为同步异常和异步异常,通常异步异常指的是中断(可看《上帝视角看中断》),同步异常指的是异常。...关于ARM异常处理的文章可参考《ARMv8异常处理简介》。...ARM64处理处理器有异常发生时,处理器会先跳转到ARM64的异常向量表中: ENTRY(vectors) kernel_ventry 1, sync_invalid // Synchronous...如果是写访问,用alloc_zeroed_user_highpage_movable分配新的物理页,并用0填充,然后映射到虚拟页上去 如果是先读后写访问,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理...(虚拟页到0页的映射),第二次是写时复制缺页异常处理

2.4K31

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

随后内核会在 do_page_fault 函数中来处理缺页异常,该函数的参数都是内核在处理缺页异常的时候需要用到的基本信息: dotraplinkage void do_page_fault(struct...内核态缺页异常处理 —— do_kern_addr_fault do_kern_addr_fault 函数的工作主要就是处理内核虚拟内存空间中 vmalloc 映射区里的缺页异常,这一部分内容,笔者会在...这就是本小节,笔者想要和大家交代的主题 —— 内核态缺页异常处理。...用户态缺页异常处理 —— do_user_addr_fault 进程用户态虚拟地址空间的布局我们现在已经非常熟悉了,在处理用户态缺页异常之前,内核需要在进程用户空间众多的虚拟内存区域 vma 之中找到引起缺页的内存地址...从进程虚拟内存空间布局的角度来讲,缺页中断主要分为两个方面: 内核态缺页异常处理 —— do_kern_addr_fault,这里主要是处理 vmalloc 虚拟内存区域的缺页异常,其中涉及到主内核页表与进程页表内核部分的同步问题

77422

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

前面讲到过写时复制缺页异常(COW),一般用于父子进程之间共享页,而我们会常见一种缺页异常是匿名映射缺页异常,今天我们就来讨论下这种缺页异常,让大家彻底理解它。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...三,源代码分析 3.1 触发条件 当第一节中的触发情况发生的时候,处理器就会发生缺页异常,从处理器架构相关部分过渡到处理器无关部分,最终到达handle_pte_fault函数: 3742 static...当满足这两个条件的时候就会调用do_anonymous_page函数来处理匿名映射缺页异常。...而如果是先读访问一页然后写访问这一页,则会发生两次缺页异常:第一次是匿名页缺页异常的读的处理,第二次是写时复制缺页异常处理。 (END)

2.8K32

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

缺页中断发生在系统对虚拟地址转换成物理地址的过程中。如果对应的页目录或者页表项没有对应有效的物理内存,则会发生缺页中断。 系统在初始化的时候注册了缺页中断的处理函数。中断号是14。...// 缺页和写保护异常处理函数 set_trap_gate(14,&page_fault); page_fault是汇编实现的。...与,结果放到ZF中 testl $1,%eax // zf=0则跳转,即0是写异常,1是缺页异常 jne 1f call _do_no_page // 跳到标签2...pop %ds popl %edx popl %ecx popl %eax iret 缺页中断的具体处理函数是。...do_no_page // 缺页处理,进程的内容还没有加载到内存,访问的时候导致缺页异常 void do_no_page(unsigned long error_code,unsigned long address

1.8K10

Linux虚拟内存和缺页中断

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

6K10

为什么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.3K30

【Python】异常处理 ① ( 异常概念 | 异常处理 | 异常捕获 )

一、Python 异常简介 1、异常概念 Python 异常 是在程序运行过程中发生的错误或问题的表示 ; 出现异常可能会中断程序的正常执行流程 , 并引发一个异常对象 ; 此时 , 需要 捕获和处理...---- 程序出现异常有两种情况 : 整个应用因为该异常停止运行 ; 对异常进行捕获处理 , 应用正常运行 ; 1、异常处理简介 程序出现异常导致无法运行 , 这种情况下 并不是要求程序没有异常完美运行..., 而是在力所能及的范围内 , 对可能出现的异常进行处理 ; 异常处理 就是 在可能出现异常的代码块中 , 对可能出现的异常做好提前准备 , 出现异常时将异常捕获 , 然后针对异常类型进行不同的处理...进行异常处理") open("file3.txt", "w", encoding="UTF-8") 执行结果 : /Users/zyq/PycharmProjects/Hello/venv/bin.../python /Users/zyq/PycharmProjects/Hello/main.py 出现异常, 进行异常处理 Process finished with exit code 0

16410

【Python】异常处理 ④ ( 异常处理 else 语句 | 异常处理 finally 语句 )

, 在 try 代码块中 , 出现了异常 , 执行的是 except 代码块 , else 代码块没有触发 ; 代码实例 : """ 异常处理操作 代码示例 """ try: # 可能会引发异常的代码...result = 10 / 0 # result = 10 / 0 except Exception as e: # 处理异常 print("发生了异常:", e) else...""" try: # 可能会引发异常的代码 result = 10 / 1 except Exception as e: # 处理异常 print("发生了异常:",...都会执行 finally 语句 ; 2、代码示例 - 出现异常后执行 finally 语句 下面的代码中 , 出现了异常 , 该异常被捕获 , finally 最终执行 ; 执行结果 : """ 异常处理操作...代码示例 """ try: # 可能会引发异常的代码 result = 10 / 0 except Exception as e: # 处理异常 print("发生了异常

16030

异常--python异常处理

python提供了2个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。...当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。 异常处理 捕捉异常可以使用try/except语句。...如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。..." else: '''保护不抛出异常的代码''' print "没有异常" finally: print "最后总是要执行我" 异常处理代码执行说明: #!...,针对不同形式的异常处理 code #这里执行异常处理的相关代码,打印输出等 else: #如果没有异常则执行else code #try部分被正常执行后执行的代码 finally: code

2.7K20

Java异常&处理异常

运行时异常 运行时异常,即编译时不会报错,在运行时发生的异常。此类异常不强制处理,但是就像上面举的“穿鞋”的例子,假如不处理,可能会引发其他更严重的错误。 3....处理办法 无论是编译时异常还是运行时异常,理论上都需要我们去处理,假如不处理异常,JVM的默认处理办法是,在异常发生的位置终止程序,然后输出异常的信息。...使用 throws 抛出异常,由JVM处理,即以默认方式处理异常:在出现异常的位置终止异常; 是由 try...catch.....环绕: try{ // 出现异常的代码 };catch (异常类1 异常对象){ // 处理异常 };catch (异常类2 异常对象){ // 处理异常 };... ......配合使用: 在可能出现异常的方法名后使用 throws 抛出异常,在此方法处不处理异常,调用者在调用此方法时,需要集中捕获处理异常 如: class Fun { public void fun(

2.4K10

异常异常处理

异常异常处理 1、异常体系结构 1.1 什么是异常?...错误:指的是Java虚拟机无法解决的严重问题,一般不编写针对性的代码进行处理异常:指其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。...2、异常处理 通常情况下,异常处理方式有以下三种: 在当前方法发生异常的代码处直接捕获并处理。这种方式对调用者来说,可能完全不知道被调用方法发生了异常。 在当前方法中不处理,直接抛给调用方处理。...除此之外,在当前方法中捕获了某个异常对象时,也可以将异常对象包装为新类型后再抛给调用方处理。...有时候在当前方法中,无法确定如何处理异常,那么可以将throws(异常信息)抛给上一级处理

1.9K40

异常问题-异常处理

5 异常处理 5.1 异常处理的问题分析 示例代码 //添加页面 public CmsPageResult add(CmsPage cmsPage) { //校验页面是否存在...在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息。...系统对异常处理使用统一的异常处理流程: 自定义异常类型。...可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随 请求响应给客户端。 异常抛出及处理流程: ?...在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型 统一由异常捕获类捕获异常,并进行处理 捕获到自定义异常则直接取出错误代码及错误信息,响应给用户

2.4K20

python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默

如果你编写了处理异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback ,其中包含有关异常的报告。异常是使用 try-except 代码块处理的。...处理ZeroDivisionError异常 下面来看一种导致 Python 引发异常的简单错误。...处理 ZeroDivisionError 异常的 try-except 代码块类似于下面这样: try: print(5/0) except ZeroDivisionError: print...使用异常避免崩溃 发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。...处理 FileNotFoundError 异常 FileNotFoundError 错误是函数 open() 导致的,因此要处理这个错误,必须将 try 语句放在包含 open() 的代码行之前: filename

5.9K20

异常处理

异常处理 异常的分类 ?...Throwable是所有异常类的父类派生了两大类Error与Exception Error是用来描述java运行系统中的类部错误像内存溢出等 Exception类称为非致命性类,可通过捕捉处理程序使其继续执行...Exception又分为运行异常(RuntimeException和其下子类)和其他类属于编译时异常 JVM处理异常方式 Main方法收到问题后又两种处理方式 第一种程序种有捕捉处理程序去处理...第二种程序种没能处理,就会让JVM来处理(将异常名称,异常信息,异常出现的位置打印在控制台,同时停止运行) ?...处理异常方法 try...catch代码块 当try中代码出现异常时中断就会产生相对应的异常类对象传入catch中并开始执行catch中的代码 class test{ public static

89210
领券