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

linux内核缺页中断处理

MMU可以做虚拟地址到物理地址转换,使用MMU我们就可以使用更多内存空间,因为程序具有局部性原理,我们可以将暂时用不到数据存放到磁盘,当访问到时会发生缺页中断,从磁盘中将所需要数据加载到内存。...缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令各种状态信息保存在特殊cpu寄存器。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...7.当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映他位置,页框也标记位正常状态。 8.恢复发生缺页中断指令以前状态,程序计数器重新指向这条指令。...linux内核对缺页异常处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux基本处理流程: 内核处理缺页异常主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器值 * error_code,由硬件产生:

10.7K21

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

更为重要是,代表中断处理程序执行进程必须总是处于TASK_RUNING状态,或系统冻结,因此,中断处理程序不能执行阻塞程序,比如I/O硬盘操作。...中断向量表 在表4-2,我们列出了IRQ分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。...但是,万变不离其宗,核心设计思想没变。 多核系统IRQ分配 我们知道SMP全称是对称多处理系统,这意味,Linux内核不应该对一个CPU有任何偏向。...因此,Linux2.6内核使用一个特定内核线程叫kirqd进行纠正IRQ自动分配(如果有必要的话)。...设置了IRQ_INPROGRESS 多核系统,此时可能另外一个CPU可能正在处理先前发生相同中断Linux对此处理方式就是延后处理。

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

Linux内核中断中断原理和实现

linux为了实现这个特点,当中断发生时候,硬中断处理那些短时间就可以完成工作,而将那些处理事件比较长工作,放到中断之后来完成,也就是软中断(softirq)来完成。...__softirq_pending是等待处理中断位图,通过设置此变量即可告诉内核该执行哪些软中断。...在ksoftirqd内核线程 c. 在那些显示检查和执行待处理中断代码,如网络子系统 而不管是用什么方法唤起,软中断都要在do_softirq()执行。...如果有待处理中断,do_softirq()会循环遍历每一个,调用它们相应处理程序。 在中断处理程序触发软中断是最常见形式。...中断处理程序执行硬件设备相关操作,然后触发相应中断,最后退出。内核在执行完中断处理程序以后,马上就会调用do_softirq(),于是软中断开始执行中断处理程序完成剩余任务。

21.6K21

Linux 内核如何处理中断

接下来会调用在内核启动时设备驱动注册对应中断服务程序(ISR)。 软件中断 当你在播放一个视频时,音频和视频是同步播放是相当重要,这样音乐速度才不会变化。...当系统需要实时性时(例如在工业应用),软件中断会变得重要。你可以在 Linux 基金会文章中找到更多相关信息:面向嵌入式开发者实时 Linux 介绍。...当请求地址在进程地址空间中,并且满足访问权限时,如果页不在内存(RAM),将会产生一个中断请求(IRQ),并开始启用缺页异常处理程序把所需页加载到内存。如果操作成功执行,程序将继续运行。...中断描述表(interrupt descriptor table)(IDT)记录了中断请求(IRQ)和中断服务程序(ISR)对应关系。Linux 定义了从 0 到 256 IRQ 向量。...其中一些在 Linux 内核源树Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

2.4K40

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

同样,Linux也不会放弃禁止中断这么好同步机制。它保证内核控制路径可以继续执行,其访问数据结构不会被中断处理程序破坏。...但是,多核系统中断禁止是一个局部概念,也就是说,只是某一个CPU核中断被禁止,不能阻止运行在其它CPU上中断处理程序访问要保护数据结构。...所以,在多核系统内核数据结构保护一般是禁止中断搭配自旋锁一起使用。...当内核代码进入临界代码段时,通过清除eflags寄存器IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段时候,内核是否该恢复之前IF标志呢?还是不做任何处理?...没有中断处理程序被激活,软中断行为也就不会发生混乱。 但是,事情不会那么简单,有时候,内核需要只禁止可延时函数,而不禁止中断。那怎么实现呢?

1.3K20

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

,那我们看下 Linux 内核是怎么体现上面内存布局。...二、线程栈 从 Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 。...中断也是如此,当系统收到中断事件后,进行中断处理时候,也需要中断栈来支持函数调用。由于系统中断时候,系统当然是处于内核,所以中断栈是可以和内核栈共享。...X86 上中断栈就是独立于内核;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数 (如果是多处理器系统,那么每个处理器都会有一个独立中断栈...而 ARM 上中断栈和内核栈则是共享中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核一些重要数据,所以栈空间有时候难免会捉襟见肘。

2.8K50

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

,那我们看下 Linux 内核是怎么体现上面内存布局。...二、线程栈 从 Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 。...中断也是如此,当系统收到中断事件后,进行中断处理时候,也需要中断栈来支持函数调用。由于系统中断时候,系统当然是处于内核,所以中断栈是可以和内核栈共享。...X86 上中断栈就是独立于内核;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数 (如果是多处理器系统,那么每个处理器都会有一个独立中断栈...而 ARM 上中断栈和内核栈则是共享中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核一些重要数据,所以栈空间有时候难免会捉襟见肘。

3.3K20

Linux内核中断、tasklet和工作队列具体解释

引言 软中断、tasklet和工作队列并非Linux内核中一直存在机制,而是由更早版本号内核“下半部”(bottom half)演变而来。 下半部机制实际上包含五种,但2.6版本号内核。...上半部指的是中断处理程序,下半部则指的是一些尽管与中断有相关性可是能够延后运行任务。 举个样例:在网络传输。...由于二者这种差别,所以对于一个工作是放在上半部还是放在下半部去运行,能够參考以下4条: 假设一个任务对时间很敏感。将其放在中断处理程序运行。 假设一个任务和硬件相关,将其放在中断处理程序运行。...假设一个任务要保证不被其它中断(特别是同样中断)打断,将其放在中断处理程序运行。 其它全部任务,考虑放在下半部去运行。 有写内核任务须要延后运行。...详细流程图例如以下所看到: ---- 是否处于中断Linux是通过preempt_count来判断,详细例如以下: 在linux系统进程数据结构里,有这么一个数据结构: #define

1.8K30

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

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

50920

Linux内核22-软中断和tasklet

相反,这些可延时任务执行时,可以使能中断。那么,将这些任务从中断处理程序剥离出来,可以有效地保证内核对于中断响应时间尽可能短。...另一个广泛使用术语是中断上下文:可以是内核正在执行中断处理程序,也可以是一个可延时处理函数。...更重要是,总是把一个函数绑定到某个CPU上执行是有风险,这个CPU可能负荷很重而其它CPU可能比较空闲。 2 软中断 Linux2.6内核,软中断数量比较少。...Linux中断处理程序总是从索引0开始执行。 2.1 软中断使用数据结构 软中断主要数据结构是softirq_vec数组,包含类型为softirq_action32个元素。...而do_IRQ()函数,在最后会调用irq_exit()宏,这个宏会引发另一个调用 __do_softirq()程序执行。这在Linux内核是禁止,因为其可延时函数执行都是串行

1.4K30

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

中断上半部、下半部概念   设备中断会打断内核进程正常调度和运行,系统对更高吞吐率追求势必要求中断服务程序尽量短小精悍。但是,这个良好愿望往往与现实并不吻合。...在大多数真实系统,当中断到来时,要完成工作往往并不会是短小,它可能要进行较大量耗时处理。   下图描述了Linux内核中断处理机制。...为了在中断执行时间尽量短和中断处理需完成工作尽量大之间找到一个平衡点,Linux中断处理程序分解为两个半部:顶半部和底半部。 ?   ...其他操作系统中断处理也采用了类似于 Linux方法,真正硬件中断服务程序都斥尽量短。...在Linux内核,用 softing_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给该函数参数。

1.7K30

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

比如,I/O设备引发一个中断,相应内核程序,首先,应该是保存内核态堆栈CPU寄存器内容;然后,执行中断处理程序;最后,再恢复这些寄存器内容。...所以,在后面的描述,我们使用内核控制路径这个术语代替一段可执行内核态代码这种表述。...恢复执行嵌套内核控制路径所有数据都存储在内核态堆栈,而该堆栈又和当前进程紧紧绑定在一起。通俗说,中断处理程序相当于当前进程资源,切换进程之前该中断资源必须释放掉。...中断处理程序绝对不能包含页错误操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序两个主要原因是: 为了提高可编程中断控制器和设备控制器吞吐量。...内核正在处理一个中断时候,能够及时响应另一个中断。 实现没有中断优先级模型。这可以简化内核代码并提高可移植性。 在多核系统,几个中断或异常处理程序可能会并发执行。

2K20

调皮程序员:Linux之父雕刻在Linux内核故事

,执行如下命令,唤出GDB,并打开描述内核空间kcore虚拟文件: $ sudo gdb --core /proc/kcore 然后在GDB执行如下命令加载内核符号信息: (gdb) file /...这样说有点不精确,精确说法是从Linux内核2.1.17版本开始,第二个参数也可以是0x5121996。查阅kernel.org上内核;4)发布历史,2.1.17应该发布于1996年12月22日。...在内核代码,上述规则是在reboot.c强制,代码如下: /* For safety, we require "magic" arguments. */ if(magic1 !...内核代码,而且使它们成为Linux API一部分。...只要Linux系统还在,那么这些常量就将永远使用,因为API意味着用户态和内核法定接口。为了保障应用程序兼容性,不可轻易变化。 6、写在最后 无论哪种文化,家庭都有着极其重要地位。

90740

一文搞懂 | Linux 各种栈(进程栈 线程栈 内核中断栈)

,那我们看下 Linux 内核是怎么体现上面内存布局。...二、线程栈 从 Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 。...中断也是如此,当系统收到中断事件后,进行中断处理时候,也需要中断栈来支持函数调用。由于系统中断时候,系统当然是处于内核,所以中断栈是可以和内核栈共享。...X86 上中断栈就是独立于内核;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数 (如果是多处理器系统,那么每个处理器都会有一个独立中断栈...而 ARM 上中断栈和内核栈则是共享中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核一些重要数据,所以栈空间有时候难免会捉襟见肘。

5K20

一文读懂 | Linux 各种栈:进程栈 线程栈 内核中断

,那我们看下 Linux 内核是怎么体现上面内存布局。...二、线程栈 从 Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 。...中断也是如此,当系统收到中断事件后,进行中断处理时候,也需要中断栈来支持函数调用。由于系统中断时候,系统当然是处于内核,所以中断栈是可以和内核栈共享。...X86 上中断栈就是独立于内核;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数(如果是多处理器系统,那么每个处理器都会有一个独立中断栈...Linux 调度程序并没有区分线程和进程,当调度程序需要唤醒”进程”时候,必然需要恢复进程上下文环境,也就是进程栈;但是线程和父进程完全共享一份地址空间,如果栈也用同一个那就会遇到以下问题。

1.6K20

内核中断系统设备树

内核补丁及设备树 先解压原始内核(source_and_images\kernel): tar xzf linux-4.19-rc3.tar.gz 打上补丁: cd linux-4.19-rc3...有几个U32数据来描述中断 =第05节_示例_使用设备树描述按键中断= 在上节视频里我们体验了怎么在设备树描述中断,这一节我们来写一个按键驱动程序来看看怎么使用设备树来描述按键驱动程序所使用引脚和所使用中断...; 001th_buttons_drv是用在之前阉割版本内核,里面没有支持用设备树描述中断; 002th_buttons_drv是本节视频使用驱动程序,在设备树里可以描述中断了; 将000th...    a.1 在设备树描述     a.2 在内核驱动 b....2) 设备中断 a.1 在设备节点中描述(表明使用"哪一个中断控制器里哪一个中断, 及中断触发方式") a.2 在内核驱动 (在platform_driver.probe获得IRQ资源, 即中断

1.1K31

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

然后通过APIC总线发送给目标APIC,该APIC就会给自己CPU发送一个相应中断。 CPU间中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...那么,剩下工作就是内核了,内核使用一个中断描述符表(IDT),记录每个中断或者异常编号以及相应处理函数。那么,收到中断信号后,将相应处理函数地址加载到eip寄存器执行即可。...首先比较cs寄存器CPL(当前特权等级)和包含在GDT段描述符DPL(描述符特权等级),如果CPL小于DPL,产生 通用保护 异常,因为中断处理程序特权等级不能比造成中断程序低。...检查ds、es、fs和gs寄存器值。如果它们之中任何一个描述符DPL小于CPL,则清除相应段寄存器。这么做,可以禁止用户态程序使用先前内核段寄存器。...如果这些寄存器没有被清除,恶意用户态程序就可以利用它们访问内核地址空间。

2K10

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

和 虚拟内存管理 , 是 Linux 内核 最复杂模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ;...物理内存管理 包括 : 页面分配器 等 ; 内存管理 位于 下图 Linux 内核整体架构图 内核空间 ; 三、中断管理 ---- 中断管理 包括 : 处理器异常处理 , 中断处理 ; 异常指的是...处理器执行时 , 检测 异常条件 , 处理器需要停止当前执行栈 , 处理异常 ; 中断管理 位于 下图 Linux 内核整体架构图 内核空间 ; 四、设备管理 ---- Linux 内核 支持外设类型...是最多 , 设备树 PCI 总线设备 设备模型 Kobject ACPI 网络设备驱动 块设备驱动 字符设备驱动 设备管理 位于 下图 Linux 内核整体架构图 内核空间 ; 五、文件系统...内核可以很方便集成各种文件系统 ; 文件系统 位于 下图 Linux 内核整体架构图 内核空间 ;

1.8K30
领券