Linux kernel之中断

linux kernel中断处理 一、什么是下半部中断是一个很霸道的东西,处理器一旦接收到中断,就会打断正在执行的代码,调用中断处理函数。如果在中断处理函数中没有禁止中断,该中断处理函数执行过程中仍有可能被其他中断打断。出于这样的原因,大家都希望中断处理函数执行得越快越好。 另外,中断上下文中不能阻塞,这也限制了中断上下文中能干的事。 基于上面的原因,内核将整个的中断处理流程分为了上半部和下半部。上半部就是之前所说的中断处理函数 阅读详情

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

设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。下图描述了Linux内核的中断处理机制。

上半部也就是硬中断,软中断只是底半部的一种实现机制

为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部和底半部。

顶半部用于完成尽量少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态,并在清除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去。这样,顶半部执行的速度就会很快,从而可以服务更多的中断请求。

现在,中断处理工作的重心就落在了底半部的头上,需用它来完成中断事件的绝大多数任务。底半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是底半部和顶半部的最大不同,因为顶半部往往被设计成不可被新的中断打断。

尽管顶半部、底半部的结合能够善系统的响应能力,但是,僵化地认为Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。

所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保其数据结构。

软中断和硬中断的区别

硬中断:

1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。

2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。

3. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。

4. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。

软中断:

1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。

2. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。

3. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。

4. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。

硬中断、软中断和信号的区别

硬中断是外部设备对CPU的中断,软中断是中断底半部的一种处理机制,而信号则是由内核(或其他进程)对某个进程的中断。在涉及系统调用的场合,人们也常说通过软中断(例如ARM为swi)陷入内核,此时软中断的概念是指由软件指令引发的中断,和我们这个地方说的softirq是两个完全不同的概念,一个是software,一个是soft。 需要特别说明的是,软中断以及基于软中断的tasklet如果在某段时间内大量出现的话,内核会把后续软中断放入ksoftirqd内核线程中执行。总的来说,中断优先级高于软中断,软中断又高于任何一个线程。软中断适度线程化,可以缓解高负载情况下系统的响应。

进程上下文

  所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

  一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

  用户级上下文: 正文、数据、用户堆栈以及共享存储区;

  寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);

  系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

  当发生进程调度时,进行进程切换就是上下文切换(context switch)。操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。

进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。

中断上下文

  硬件通过触发信号,向CPU发送中断信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核, 内核通过这些参数进行中断处理。

  所以,“中断上下文”就可以理解为硬件传递过来的这些参数和内核需要保存的一些环境,主要是被中断的进程的环境。

  内核进入中断上下文是因为中断信号而导致的 中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。

  事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。

中断函数

1.开关中断

/************关闭指定中断*************************/

void enable_irq(unsigned int irq)

void disable_irq(unsigned int irq) //要等到当前正在执行的中断处理函数执行完才返回

void disable_irq_nosync(unsigned int irq)  //函数调用以后立即返回

/**************硬中断****************************/

local_irq_disable():关闭中断

local_irq_enable():开启中断

local_irq_save(flags):关闭中断并保存中断标志位

local_irq_restore(flags):开启中断并清除中断标志位

/*************底半部开关************************/

local_bh_disable();

local_bh_enable();

/*************判断中断状态*********************/

#define in_interrupt() (irq_count())   // 是否处于中断状态(硬中断或软中断)

#define in_irq() (hardirq_count())     // 是否处于硬中断

#define in_softirq() (softirq_count()) // 是否处于软中断

  disable_irq函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。

  当任务A调用local_irq_disable企图关闭中断1s,然后再开启中断,但在中断中出现了另一个优先级更高的任务B也调用了local_irq_disable关闭中断,然后100ms后执行local_irq_enable开启中断,导致任务A的中断没有持续1s就被打开了,这显然是有问题的,所以需要用到后两个中断函数,当B任务关闭中断的时候保存中断标志位,开启中断的时候清除中断标志位,还原之前的中断状态,才能使任务A继续处于中断状态中正确执行。

2、申请中断

int request_irq(unsigned int irq, irq_handle_t handle, unsigned int flags,

                const char *name, void* dev_id);

int devm_request_irq(struct device *dev, unsigned int irq, irq_handle_t handle,

                unsigned int flags, const char *name, void* dev_id);

其中flags代表中断标志,可以取值如下:

  上升沿触发:IRQF_TRIGGER_RISING

  下降沿触发:IRQF_TRIGGER_FALLING

  高电平触发:IRQF_TRIGGER_HIGH

  低电平触发:IRQF_TRIGGER_LOW

  共享中断:IRQF_SHARED

dev_id代表要传给中断处理程序的私有数据,一般是这个设备的结构体或者NULL
  devm_request_irq和request_irq区别在于前者是申请的内核“managed”资源,不需要自己手动释放,会自动回收资源,而后者需要手动调用free_irq来释放中断资源

3、释放中断

void free_irq(unsigned int irq, void *dev_id);

实现中断底半部的三种方法: 软中断   tasklet    工作队列

软中断

软中断( Softirq)也是一种传统的底半部处理机制,它的执行时机通常是顶半部返回的时候, tasklet是基于软中断实现的,因此也运行于软中断上下文。

在Linux内核中,用 softing_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给该函数的参数。使用 open_softirq()函数可以注册软中断对应的处理函数,而 raise_softirq()函数可以触发一个软中断。

软中断和 tasklet运行于软中断上下文,仍然属于原子上下文的一种,而工作队列则运行于进程上下文。因此,在软中断和 tasklet处理函数中不允许睡眠,而在工作队列处理函数中允许睡眠。

local_bh_disable()和 llocal_bh_enable()是内核中用于禁止和使能软中断及 tasklet底半部机制的函数

软中断模版

asmlinkage void do_softirq(void)

{

    __u32 pending;

    unsigned long flags;

    /* 判断是否在中断处理中,如果正在中断处理,就直接返回 */

    if (in_interrupt())

        return;

    /* 保存当前寄存器的值 */

    local_irq_save(flags);

    /* 取得当前已注册软中断的位图 */

    pending = local_softirq_pending();

    /* 循环处理所有已注册的软中断 */

if (pending)

        __do_softirq();

    /* 恢复寄存器的值到中断处理前 */

    local_irq_restore(flags);

}

tasklet

tasklet的使用较简单,它的执行上下文是软中断,执行时机通常是顶半部返回的时候。我们只需要定义 tasklet及其处理函数,并将两者关联则可,例如

void my_tasklet_func(unsigned long); /*定义一个处理函数*/

DECLARE_TASKLET(my_tasklet, my_tasklet_func, data);

/*定义一个tasklet结构my_tasklet,与my_tasklet_func(data)函数相关联*/

代码DECLARE_TASKLET(my_tasklet,my_tasklet_func,data)实现了定义名称为my_tasklet的tasklet,并将其与my_tasklet_func()这个函数绑定,而传入这个函数的参数为data。 在需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度运行

tasklet_schedule(&my_tasklet);

使用tasklet作为底半部处理中断的设备驱动程序模板下所示(仅包含与中断相关的部 分)。

tasklet函数模版

/* 定义tasklet和底半部函数并将它们关联 */

void xxx_do_tasklet(unsigned long);

DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);

/* 中断处理底半部 */

void xxx_do_tasklet(unsigned long)

...

/* 中断处理顶半部 */

 irqreturn_t xxx_interrupt(int irq, void *dev_id)

{

 ...

 tasklet_schedule(&xxx_tasklet);

 ...

}

/* 设备驱动模块加载函数 */

 int __init xxx_init(void)

{

 ...

 /* 申请中断 */

 result = request_irq(xxx_irq, xxx_interrupt,

 0, "xxx", NULL);

 ...

 return IRQ_HANDLED;

}

/* 设备驱动模块卸载函数 */

 void __exit xxx_exit(void)

{

 ...

 /* 释放中断 */

 free_irq(xxx_irq, xxx_interrupt);

 ...

}

对应于xxx_irq的中断处理程序被设置为xxx_interrupt()函数,在这个函数中,tasklet_schedule(&xxx_tasklet)调度被定义的tasklet函数xxx_do_tasklet()在适当的时候执行。

工作队列

工作队列的使用方法和tasklet非常相似,但是工作队列的执行上下文是内核线程,因此工作队列可以调度和睡眠。下面的代码用于定义一个工作队列和一个底半部执行函数

struct work_struct my_wq; /* 定义一个工作队列 */

void my_wq_func(struct work_struct *work); /* 定义一个处理函数 */

通过INIT_WORK()可以初始化这个工作队列并将工作队列与处理函数绑定:

INIT_WORK(&my_wq, my_wq_func);

/* 初始化工作队列并将其与处理函数绑定 */

与tasklet_schedule()对应的用于调度工作队列执行的函数为schedule_work(),如:

schedule_work(&my_wq); /* 调度工作队列执行 */

工作队列函数模版

/* 定义工作队列和关联函数 */

struct work_struct xxx_wq;

void xxx_do_work(struct work_struct *work);

/* 中断处理底半部 */

void xxx_do_work(struct work_struct *work)

...

/*中断处理顶半部*/

 irqreturn_t xxx_interrupt(int irq, void *dev_id)

{

 ...

schedule_work(&xxx_wq);

 ...

 return IRQ_HANDLED;

}

/* 设备驱动模块加载函数 */

 int xxx_init(void)

{

 ...

 /* 申请中断 */

 result = request_irq(xxx_irq, xxx_interrupt,

 0, "xxx", NULL);

 ...

 /* 初始化工作队列 */

 INIT_WORK(&xxx_wq, xxx_do_work);

 ...

}

/* 设备驱动模块卸载函数 */

 void xxx_exit(void)

{

 ...

 /* 释放中断 */

 free_irq(xxx_irq, xxx_interrupt);

 ...

}

Linux Kernel中的中断 21 阅读详情

相关推荐

Linux kernel的中断子系统之一

一、中断系统相关硬件描述 中断硬件系统主要有三种器件参与,各个外设、中断控制器和CPU。各个外设提供irq request line,在发生中断事件的时候,通过irq request line上的电气信号向CPU系统请求处理。外设的irq request line太多,CPU需要一个小伙伴帮他,这就是Interrupt controller。Interrupt Controller是连接外设中断系统和CPU系统的桥梁。根据外设irq request line的多少,Interrupt Controller可

hli22222的博客 281

Linux kernel的中断子系统之(一):综述

对于CPU1而言,在执行该中断的handler的时候,将Interruptprocessortargetregister中CPU0的bit为设置为1,disable本CPU的比特位,这样在下次中断发生的时候,interuptcontroller就把中断送给了CPU0。如果送达了多个cpu,实际上,也应该只有一个handler实际和外设进行交互,另外一个cpu上的handler的动作应该是这样的发现该irqnumber对应的中断已经被另外一个cpu处理了,直接退出handler,返回中断现场。...

生活需要深度 668

Linux内核中实现关闭中断的几种方式

根据具体的需求和场景,选择适合的方式可以确保关键代码的执行不被中断。在实际开发中,需要根据具体情况选择最合适的方式来关闭和恢复中断,以确保系统的稳定性和可靠性。自旋锁是一种更高级的中断关闭机制,它通过自旋的方式等待其他代码释放锁资源。需要注意的是,以上几种方式都是在内核开发中使用的方法。在Linux内核中,为了确保关键代码的执行不被中断,我们需要关闭中断。本文将介绍Linux内核中几种常见的关闭中断的方式,并提供相应的源代码示例。它通过设置处理器的全局中断屏蔽寄存器来实现,确保整个系统处于中断关闭的状态。

SVIPCODE的博客 1210

Linux内核5. 中断和中断处理

我们先来看一下中断的定义:中断机制:CPU在执行指令时,收到某个中断信号转而去执行预先设定好的代码,然后再返回到原指令流中继续执行,这就是中断机制。可以发现中断的定义非常简单。我们根据中断的定义来画一张图:在图灵机模型中,计算机是一直线性运行的。加入了中断之后,计算机就可以透明地在进程执行流中插入一段代码来执行。那么这么做的目的是什么呢?本文我们从中断的概念开始讲起,一路上分析了中断的作用、中断的产生、中断的处理。其中内容最多的是硬件中断的处理,方法很多很繁杂。

weixin_39757802的博客 2218

armv8/armv9中断系列详解-软件篇-Linux kernel中断相关软件导读

armv8, armv9, gic,gicv2,gicv3,异常, 中断,irq,fiq,serror,sync,同步异常,异步异常,向量表,向量表基地址,VBAR,vbar_el3,中断嵌套,中断级联,Linux Kernel,optee,ATF,TF-A,optee,hypervisor, SPM

baron-周贺贺-代码改变世界ctw 1850

强化学习代码实现PPO

梯度更新:通过截断(clipping)限制策略更新幅度,避免策略变化过大影响稳定性。首先是数据预处理,将相关数据(状态、采取的动作、状态奖励、下一个状态)放到gpu上。根据当前状态 state,利用策略网络生成每个动作的概率分布 probs。2. 修改了策略模型的输出,从每个动作的概率分布变成了动作的均值和方差。1. 修改了动作空间,离散空间变成了连续空间,使用正太分布来采样。3. 修改了动作的ratio的计算,从离散分布变成了正太分布计算。Update函数:通过经验缓冲数据来优化策略模型和价值模型。

wlxsp的博客 635

Linux kernel学习(二)中断机制(1)

在学习中断之前需要了解中断的概念:中断是指CPU 在执行程序的过程中,出现了某些突发事件急待处理, CPU 必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。需要注意的就是中断不仅仅是打断当前的执行任务,还包括了后续的还原的工作

weixin_50795704的博客 390

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4887

关中断

这两个宏相对于local_irq_enable与local_irq_disable最大的不同在于,local_irq_save会在关闭中断前,将处理器当前的标志位保存在一个unsigned long flags中,在调用local_irq_restore的时候,再将保存的fla恢复到处理器的FLAGS寄存器中。但在使用时应该注意,因为local_irq_enable与local_irq_disable是通过关中断的方式进行互斥保护,所以必须确保处于两者之间的代码执行时间不能太长,否则将影响到系统的性能。

weixin_52849254的博客 1528

直流电源EMI滤波器设计实战:从器件选型到PCB布局的完整指南

本文提供了一份直流电源EMI滤波器的完整实战设计指南。针对EMI噪声超标问题,文章深入剖析了差模与共模噪声的抑制原理,详细讲解了从电路拓扑、核心器件(如X/Y电容、共模电感)的选型计算,到决定性能成败的PCB布局艺术。重点强调了低阻抗路径、干净接地及输入输出隔离等关键布局原则,并分享了常见的调试坑点与排查方法,旨在帮助硬件工程师设计出真正有效的滤波器,确保电源系统通过EMC测试。

q9r0s的博客 641

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8437

Linux Kernel5.10的软中断(softirq)的本质

Linux Kernel的中断的底半部分实现有三种,分别是: 软中断 tasklet 工作队列 软中断 软中断的本质是什么? 其实就是在硬件中断(也叫中断顶半部分)执行完毕后,通过wakeup_softirqd()的方式唤醒一个softirq队列,然后中断程序返回,softirq队列也在适当的时候开始执行。 irq_handler —> gic_handle_irq() —> handle_domain_irq() —> __handle_domain_irq() —>

baron-周贺贺-代码改变世界ctw 1259

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

本文详细介绍了如何使用AD9834 DDS模块DIY一个高精度可调信号源,涵盖硬件搭建、原理图解读、PCB优化和程序烧录等关键步骤。通过STM32控制实现0-10MHz频率范围输出,特别适合电子设计与射频实验,提供完整的AD原理图、PCB设计和程序代码参考。

weixin_31854867的博客 407

【Linux kernel】中断

-------------------------中断上下文注意事项------------------------ 1)"中断上下文(包括软中断上下文)不可以调用schedule()函数及其封装函数,如msleep(msecs), 因为不允许在中断上下文发生进程调”(在支持内核抢占的情况下不成立), 但是可以调用wake_up_process(task)及其封装函数,如schedule_work

baidu_17062867的专栏 1040

ARFoundation系列讲解 - 手部跟踪编程

通过使用ARFoundation的手部跟踪子系统,我们可以轻松地在AR应用程序中实现与用户手部的交互。通过设置AR环境、创建场景和相机、添加手部跟踪功能以及编写相应的脚本,我们可以开始在AR场景中跟踪和操作用户的手部。在Unity中创建一个新场景,并将AR Session组件添加到场景中的一个空对象上。手部跟踪的具体实现可能因AR设备和平台的不同而有所差异,你可能需要根据你的使用情况进行一些适配和调整。当你将手部放入AR场景中时,手部跟踪系统将触发相应的事件,并调用脚本中的回调函数。

2301_79325339的博客 355

QCC304x系列开发教程(基础篇)之2.1-QCC3040之开发环境搭建

一、安装MDE 1.解压qualcomm_mde.win.2.4_installer_2.4.1.4压缩包,安装MDE_WIN_2.4.1.4_x64.exe,路径自定义 点击NEXT, 安装完成后,点击Finish. 完成安装后,桌面生成快捷方式

心跳包的博客 6079

linux kernel的中断编程

上一篇文章介绍了linux kernel中的中断系统,这边文章简单介绍在内核中如何使用中断编程。 首先编写中断程序需要注意的事项 中断处理函数中不能睡眠,也不能调用执行了睡眠动作的函数 当中断处理函数有部分代码进入临界区时,使用自旋锁,而不是使用互斥锁,因为获取互斥锁获取不到的时候,会进入睡眠状态。 中断处理函数不能与用户空间交换数据 必须尽快执行中断处理程序。为了确保这一点,最好将实现分为两部分,上半部分和下半部分。处理程序的上半部分将尽快完成工作,稍后再完成下半部分工作,这可以通过 softirq 或

木木的博客 265

ChatGPT启蒙之旅:弟弟妹妹的关键概念入门

本文主要介绍了ChatGPT启蒙之旅:弟弟妹妹的关键概念探险,希望能对初学大模型的同学们有所帮助。 文章目录 1. 背景 2. GPT是个什么样的人? 3. GPT使用的核心思维 4. GPT使用的场景介绍

herosunly的博客 16万+

【linux kernel】 中断处理

欢迎转载,转载时需保留作者信息,谢谢。 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog.youkuaiyun.com/xiayulewa   环境: http://www.cnblogs.com/embedded-tzp/p/4443876.html    

xiayuleWA的专栏 1772

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux kernel 学习之中断

以前学习计算机组成原理的时候就知道了硬件如果要和cpu进行通信有那么几种方法,其实有程序查询法,中断,DMA,通道等,就记得那么多了,我记得好像还有一个。那个时候书上很形象的把这个过程比作是老师分苹果的故事。程序查询法就是老师每一个小孩子都去问,他们的苹果有没有吃完了,想想这也是一件比较累的事情。中断就比较智能了,就是当小孩子自己吃完了苹果,如果还想要的话就自己去想老师要。DMA好像是老师把这个权

Android's Blog 5582

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NVIDIA Linux Open GPU Kernel Modules:中断优先级深度解析

在Linux系统中,中断处理是确保硬件设备能够及时响应和高效运行的关键机制。NVIDIA Linux Open GPU Kernel Modules作为开源GPU内核模块,其中断优先级管理机制对于GPU性能优化和系统稳定性至关重要。本文将深入探讨NVIDIA开源GPU内核模块的中断优先级实现原理、配置策略以及最佳实践。 ## 中断优先级基础概念 ### 什么是中断优先级? 中断优先级(Int...

gitblog_00689的博客 1056

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux kernel中断子系统之(五):驱动申请中断API

一、前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述。第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格。第四章

新时代农民工 871

Linux kernel的中断子系统

Linux kernel的中断子系统 文章目录Linux kernel的中断子系统1、GICV3简介1.1 GICv3定义的4种中断类型:1.2 中断号1.3 GICV3编程模型1.4 GICV3中断亲和度路由2、GIC的设备树描述3、ARM GICV3代码分析3.1 irq chip driver声明3.2 gic_of_init流程3.3 gic_init_bases流程4、中断域irq_domain以及中断映射4.1 irq_domain4.2 中断映射的完整过程5、ARM64中断处理过程5.1 AR

zhb399的博客 1721

linux kernel软中断及其衍生品-定时器 tasklet的实现

软中断概念在嵌入式开发可以有两个不同的解释: 其一,软中断在处理器设计中是处理器异常之一,程序软件使用指定指令(如arm的SWI指令)引发该异常从而陷入内核态执行,最典型的软件应用就是系统调用。 其二,在kernel代码中实现了一套软中断机制,区别于硬件中断的硬件触发软件处理,而是软件触发软件处理。

做一个有技术追求的人 4453

【linux kernel】linux中断管理 | tasklet

linux中断管理—tasklet 文章目录linux中断管理—tasklet一、tasklet简介二、如何使用tasklet三、tasklet源码分析(3-1)在linux启动过程中tasklet的初始化(3-2)tasklet_schedule()函数分析四、总结 一、tasklet简介 tasklet是利用软中断实现的一种下半部机制。所以说,本质上也是软中断的一种,其运行在软中断上下文。 tasklet使用struct tasklet_struct结构体来描述,如下定义(/include/linux/

iriczhao的博客 1601

Linux_kernel中断系统13

在系统启动 \ 热插拔 和动态加载模块时,自动创建设备节点文件系统中的/dev目录下的设备节点都是由mdev创建的在加载模块时根据驱动程序,可以在/dev/目录下自动创建设备文件中断处理函数存在的疑虑【1】Linux系统希望中断上下文处理的越快越好(不应该有printk函数,其不具可重入性)【2】中断处理函数中不应该有返回值【3】中断处理函数中不应该有额外的参数。

qq_45882170的博客 949
上一篇: DSD 和 PCM audio接口
下一篇: linux多处理器并发访问共享资源---自旋锁
~我爱中国~
博客等级 码龄16年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值