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

linux内核缺页中断处理

缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...,内核调用copy_from_user时发生缺页异常,内核会将regs->ip也就是中断返回地址设置 //为这个地址,退出中断后不会在执行1: mov"itype" %2,%"rtype"1\n",

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

    Linux 内核如何处理中断

    此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。...接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。 软件中断 当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。...当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍。...中断描述表(interrupt descriptor table)(IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。...其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

    2.4K40

    Linux内核21-Linux内核的中断处理过程

    系统时钟 10 42 网口 11 43 USB端口,声卡 12 44 PS/2鼠标 13 45 协处理器 14 46 EIDE硬盘控制器的第一个链 15 47 EIDE硬盘控制器的第二个链 也就是说,内核必须在使能中断之前...表明IRQ请求线的状态 depth IRQ线禁止使能标志 irq_count 中断计数(诊断使用) irqs_unhandled 未处理中断计数 lock 自旋锁,保护该数据结构的访问 非预期中断,...X86架构未使用 IRQ_MASKED 未使用 IRQ_PER_CPU X86架构未使用 depth和标志IRQ_DISABLED表明IRQ线被使能还是禁止。...相反,如果调用enable_irq()函数,depth会递减,如果depth等于0,则使能IRQ线并且清除IRQ_DISABLED标志。...这样的处理方式使内核架构更为简单,因为设备驱动程序的中断服务程序是不需要可重入的(它们的执行一般都是序列化的)。

    2.4K20

    Linux内核硬中断 软中断的原理和实现

    linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...__softirq_pending) 唤醒ksoftirqd内核线程处理软中断。...内核不会立即处理重新触发的软中断。...当大量软中断出现的时候,内核会唤醒一组内核线程来处理。这些线程的优先级最低(nice值为19),这能避免它们跟其它重要的任务抢夺资源。

    22.7K21

    Linux内核36-内核同步之禁止中断

    如果太长,会影响整个系统任务的调度,也有可能导致中断信号的丢失。 同样,Linux也不会放弃禁止中断这么好的同步机制。它保证内核控制路径可以继续执行,其访问的数据结构不会被中断处理程序破坏。...所以,在多核系统中,内核数据结构的保护一般是禁止中断搭配自旋锁一起使用。...local_irq_disable()利用cli汇编指令,禁止局部CPU的中断;local_irq_enable()利用sti汇编指令使能中断。...当内核代码进入临界代码段时,通过清除eflags寄存器中的IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段的时候,内核是否该恢复之前的IF标志呢?还是不做任何处理?...local_bh_disable()可以嵌套多调用几次,如果调用local_bh_enable()的次数匹配,可延时函数就会被使能。

    1.5K21

    Linux内核22-软中断和tasklet

    应该周期性地检查挂起状态的软中断,但是不能因此增加太重的负荷。所以,软中断的执行时间点非常重要。下面是几个重要的时间点: 调用local_bh_enable()函数使能软中断的时候。...因为执行那些可延时函数时,中断是处于使能状态的,意味着执行__do_softirq()函数的过程中,随时都会发生中断,那么立即响应中断,执行do_IRQ()函数。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止软中断。 清除正在执行的软中断对应掩码位。 执行local_irq_enable()使能中断。...重新使能tasklet,使用tasklet_enable()函数。...(赋值NULL即可) 使能中断。 遍历链表中的tasklet描述符: 在多核处理器系统中,需要检查TASKLET_STATE_RUN标志。

    1.6K30

    【深入理解Linux内核锁】| 中断屏蔽

    【Linux内核锁】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU的中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...弊端在于: Linux内核中,除了系统进程调度依赖中断,还有一些异步I/O等众多操作都依赖中断,因此长时间屏蔽中断是很危险的,会对系统造成严重影响,因此也要求临界区代码要简短。...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...CPU的中断,并保存CPU中断位的信息 local_irq_restore(flags) // 使能本CPU的中断,并恢复CPU中断位的信息 local_bh_disable(void) // 禁止本...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现

    84820

    【云原生技术研究】BPF使能软件定义内核

    Linux提供了一个bpf()系统调用,通过bpf()系统调用,将这段编译之后的字节码传入内核空间。...Linux内核当前提供了对哪些BPF程序类型的支持。 这里可以简单的将BPF程序的类型分为两个方面:内核追踪(Tracing)和内核网络(Networking)。...图7 BPF实现容器网络安全 BPF在网络数据包的处理上,通常会与Linux内核的另外一个重要功能XDP一起来实现。...这个工具在默认情况下不会安装在任何Linux发行版上,而且它还处于开发阶段,所以需要开发者编译最支持Linux内核的版本。将随Linux内核5.1版本一起发布BPFTool版本。...Linux容器,作为云原生环境重要的支撑技术,是Linux内核上用于隔离和管理计算机进程的一组特性的抽象,高度依赖了Linux内核的底层功能。

    1.3K10

    【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )

    CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介 (2) CPRS 寄存器 中断控制 相关 位 3. 中断使能寄存器 (1) 中断使能寄存器简介 (2) 中断屏蔽寄存器简介 二....中断使能寄存器 参考手册 : S3C6410X.pdf ( 基于 6410 开发板 ) 1.手册对应章节 : 12.6.5 章节 VECTORED INTERRUPT CONTROLLERS; 2.S3C6410...芯片手册下载地址 :https://download.csdn.net/download/han1202012/10412045 (1) 中断使能寄存器简介 ---- 中断使能寄存器 ( VICINTENABLE...) : 1.分为两个寄存器 : 中断使能寄存器 分 两个寄存器 控制所有的中断打开功能; ( 1 ) 寄存器1 VIC0INTENABLE : 其地址是 0x71200010 ; ( 2 )...链接器脚本, ③输出文件是 gboot.elf 这是个中间文件, ④ 依赖文件是 ^ 代表所有的依赖; ( 3 ) 转换成可执行二进制文件 : arm-linux-objcopy -O binary

    9.4K21

    内核中断体系概括

    前言 本文对内核中断进行概括以及讲述中断的具体实现方法在内核是怎么做的,会结合内核源码中的一些 .s 文件和 .c 文件来具体分析一下内核在中断中的实现方式。...学习中断的目的: 1、硬件的中断响应 --------> 内核驱动中的中断 2、系统调用的函数响应(sys_call)--------> 系统调用 3、自定义中断--------> 软件的软中断模式...跳转回正常工作的函数地址继续运行 2、Linux 中中断的工作流程 ①....,中断后的回复过程 中断的执行过程 硬件中断的处理过程 linux/kernel/asm.s traps.c 软件及系统调用的处理过程 linux/kernel/system_call.s fork.c.../asm.s trap.c 具体详细内容参考 Linux内核完全注释:基于0.11内核(修正版V3.0).pdf P55~P62 和 P256~P279 三、内核中断体系结构 1、trap_init

    14310

    Linux内核中断顶半部和底半部的理解

    在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。   下图描述了Linux内核的中断处理机制。...为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部和底半部。 ?   ...其他操作系统中对中断的处理也采用了类似于 Linux的方法,真正的硬件中断服务程序都斥尽量短。...在Linux内核中,用 softing_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给该函数的参数。...local_bh_disable()和 llocal_bh_enable()是内核中用于禁止和使能软中断及 tasklet底半部机制的函数 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA

    1.9K30

    Linux内核18-中断和异常的嵌套处理

    讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。...比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈中的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。...内核控制路径可以任意嵌套;如下图所示,用户态的程序被中断打断,进入内核态响应中断;而这时候又来了其它中断,就会响应最新的中断,以此类推;但是,执行完一个中断处理程序之后,会回到之前的状态执行。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。

    2.1K20

    内核中断子系统介绍

    中断子系统 现在把之前的流程具有的部分对比内核中断子系统,可以发现还多出了一个通用中断处理层。...因为内核需要支持各种不同的架构与外设,需要解耦架构硬件相关部分(cpu 与中断控制器)与非架构相关(外设),使得开发外设驱动并不需要了解架构相关部分。...硬件封装层 硬件封装层包括 cpu 和中断控制器两部分。区分开 cpu 和中断控制器相当重要,希望大家能更明确 cpu 和中断控制器的概念。...希望帮助大家得出诸如“arm 内核有中断嵌套吗”“arm cpu eoi 是做什么”这类问题的答案。...x86 中断线的实现原生支持 NMI。x86 核上同时只会有一个需要被响应的中断,它由 Local APIC 从 IRR 中选择;当 Local APIC 不使能时,优先响应 NMI 中断线。

    1.2K21

    【linux学习指南】linux捕捉信号(二)软中断&&缺⻚中断?等&& 如何理解内核态和⽤⼾态

    ;//对应的C程序中的sys_call_table 在include/linux/sys.h 中,其中定义了一个包括72个 ;//系统调用c处理函数的地址数组表。...都是直接调⽤ 那是因为Linux的gnuC标准库,给我们把⼏乎所有的系统调⽤全部封装了。 缺⻚中断?内存碎⽚处理?除零野指针错误?...(所以,能理解“缺页异常”为什么这么叫了吗? ) 如何理解内核态和⽤⼾态 结论: 操作系统⽆论怎么切换进程,都能找到同⼀个操作系统!...操作系统提供系统调用接口,当进程发起系统调用(如通过int 0x80或syscall指令)时,会触发软中断,硬件会将当前的执行环境(包括寄存器状态等)保存起来,然后将控制权转移到内核预先设置好的中断处理程序入口...对于从用户态(CPL = 3)到内核态(CPL = 0)的转换,通过软中断(如int 0x80或syscall)的方式,系统会进行严格的校验。

    5210

    Linux内核17-硬件如何处理中断和异常

    然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...那么,剩下的工作就是内核的了,内核使用一个中断描述符表(IDT),记录每个中断或者异常编号以及相应的处理函数。那么,收到中断信号后,将相应的处理函数的地址加载到eip寄存器中执行即可。...在使能中断之前,必须使用lidt汇编指令初始化IDT表。 IDT表包含三种类型的描述符,使用Type位域表示(40-43位)。下图分别解释了这三种描述符各个位的意义。...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。...这么做,可以禁止用户态程序使用先前内核态的段寄存器。如果这些寄存器没有被清除,恶意用户态程序就可以利用它们访问内核地址空间。

    2.1K10

    【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

    包括 进程创建 , 销毁 , 线程组管理 , 内核线程管理 , 队列等待 ; 进程调度 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 二、内存管理 ---- 内存管理 涉及到 物理内存管理...和 虚拟内存管理 , 是 Linux 内核中 最复杂的模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ;...物理内存管理 包括 : 页面分配器 等 ; 内存管理 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 三、中断管理 ---- 中断管理 包括 : 处理器异常处理 , 中断处理 ; 异常指的是...处理器执行时 , 检测 异常条件 , 处理器需要停止当前执行的栈 , 处理异常 ; 中断管理 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 四、设备管理 ---- Linux 内核 支持的外设类型...内核可以很方便的集成各种文件系统 ; 文件系统 位于 下图 Linux 内核整体架构图 中的 内核空间 ;

    1.9K30

    Linux的异步通知接收中要注意使能顺序

    异步通知是一种通知,相当于用于应用程序的中断。可用于驱动通知进程,也可以进程通知进程。...F_SETOWN,getpid()); 这句是设置异步通知要通知给谁 oflags = fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知...重点就是使能这部要放在最后。原因如下:如果使能放在前面,异步通知发生在使能之后,注册信号函数之前的话。由于找不到注册函数,系统会执行默认处理函数。就是会将进程终止。这样就发生故障,与预期不符。...SIGRTMIN); 是设置异步通知使用的信号是什么 oflags = fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知...重点如上,使能放在最后。 异步通知发送 异步通知发送分为两种,进程向进程发送和驱动向进程发送。 进程向进程发送 这个比较简单,使用kill函数就可以。

    1.1K20

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节的空间分为两部分,将最高的 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的。...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。

    2.9K50

    Linux中断 - IDT

    中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...传统系统调用的实现 这里所说的传统系统调用主要指旧的32位系统使用 int 0x80软件中断来进入内核态,实现的系统调用。...syscall/sysret, 这两种都不需要通过中断方式进入内核态,而是直接转换到内核态,速度快了很多。...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

    6.6K10
    领券