各种的异常的C处理函数可以分为5类,他们分布在不同的文件中。

1、在arch/arm/kernel/trapsc.c中

未定义指令异常,总入口函数为do_undefinstr.

2、在arch/arm/mm/fault.c中

与内存访问相关的异常的C处理函数,

3、在arch/arm/mm/irq.c中

中断处理函数

4、在arch/arm/kernel/aclls.S中

swi异常的处理函数执政被组织成一个表格:swi指令集起码的位[23:0]被用来作为索引。这样,通过不同的”swi index”指令就可以调用不同的swi异常处理函数,它们被称为系统调用,比如sys_open,sys_read,sys_write等。

5、没有使用的异常。

中断处理体系结构

Linux内核将所有的中断统一编号,使用一个irq_desc结构数组来描述这些中断:每个数组项对应一个中断(也有可能是一组中断,他们共用相同的中断号),里面记录了中断的名称,中断状态,中断标记(比如中断类型,是否共享中断等),并提供了中断的底层硬件访问函数(清除,屏蔽,使能中断),提供了这个中断的处理函数入口,通过它可以调用用户注册的中断处理函数。

struct irq_desc {

irq_flow_handler_t handle_irq; /当前中断的处理函数入口/

struct irq_chip chip; /底层的硬件访问*/

struct msi_desc *msi_desc;

void *handler_data;

void *chip_data;

struct irqaction action; / IRQ action list 用户提供的中断处理函数链表*/

unsigned int status; /* IRQ status IRQ状态*/

unsigned int depth; /* nested irq disables */

unsigned int wake_depth; /* nested wake enables */

unsigned int irq_count; /* For detecting broken IRQs */

unsigned int irqs_unhandled;

spinlock_t lock;

#ifdef CONFIG_SMP

cpumask_t affinity;

unsigned int cpu;

#endif

#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)

cpumask_t pending_mask;

#ifdef CONFIG_PROC_FS

struct proc_dir_entry *dir;

#endif

const char name; /中断名称*/

} ____cacheline_internodealigned_in_smp;

struct irq_chip {

const char *name;

unsigned int (startup)(unsigned int irq); /启动中断,如果不设置,缺省为”enable”*/

void (shutdown)(unsigned int irq); /关闭中断,如果不设置,缺省为”disable”*/

void (enable)(unsigned int irq); /使能中断,如果不设置,缺省为”unmask”*/

void (disable)(unsigned int irq); /禁止中断,如果不设置,缺省为”mask”*/

void (ack)(unsigned int irq); / 相应中断,通常是清除当前中断使得可以接收下一个中断*/

void (mask)(unsigned int irq); /屏蔽中断源*/

void (mask_ack)(unsigned int irq); /屏蔽和相应中断*/

void (unmask)(unsigned int irq); /开启中断源*/

void (*eoi)(unsigned int irq);

void (*end)(unsigned int irq);

void (*set_affinity)(unsigned int irq, cpumask_t dest);

int (*retrigger)(unsigned int irq);

int (*set_type)(unsigned int irq, unsigned int flow_type);

int (*set_wake)(unsigned int irq, unsigned int on);

/* Currently used only by UML, might disappear one day.*/

#ifdef CONFIG_IRQ_RELEASE_METHOD

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

#endif

/*

* For compatibility, ->typename is copied into ->name.

* Will disappear.

*/

const char *typename;

};

struct irqaction {

irq_handler_t handler; /用户注册的中断处理函数/

unsigned long flags; /中断标志,比如是否共享中断,电平触发还是边沿触发等/

cpumask_t mask; /用于SMP(对称多处理器系统)/

const char name; /用户注册的中断名字,”cat /proc/interrupts”时可以看到*/

void dev_id; /用户传给上面的handler的参数,还可以用来区分共享中断*/

struct irqaction *next;

int irq; /中断号/

struct proc_dir_entry *dir;

};

中断处理流程如下:

1、发生中断时,CPU执行异常向量vector_irq的代码。

2、在vector_irq里面,最终会调用中断处理的总入口函数asm_do_IRQ.

3、asm_do_IRQ根据中断号调用irq_desc数组项中的handle_irq.

4、handle_irq会使用chip成员中的函数来设置硬件,比如清除中断,禁止中断,重新使能中断等。

5、handle_irq逐个调用用户在action链表中注册的处理函数。

可见,中断体系结构的初始化就是构造这些数据结构,比如irq_desc数组项中的handle_irq,chip等成员;用户注册中断时就是构造action链表;用户卸载中断就是从action链表中去除不需要的项。

用户(即驱动程序)通过request_irq函数向内核注册中断处理函数,request_irq函数根据中断号找到irq_desc数组项,然后在它的action链表中添加一个表项。

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

{

action = kmalloc(sizeof(struct irqaction), GFP_ATOMIC);

action->handler = handler;

action->flags = irqflags;

cpus_clear(action->mask);

action->name = devname;

action->next = NULL;

action->dev_id = dev_id;

retval = setup_irq(irq, action);

}

requset_irq函数首先使用这4个参数构造一个irqaction结构,然后调用setup_irq函数将它链入链表中;

setup_irq函数完成了3个功能:

1、将新建的irqaction结构链入irq_desc[irq]结构的action链表中。如果action链表为空,则直接链入。如果先判断新建的irqaction结构和链表中的irqaction结构所表示的中断类型是否一致:即是否都声明为“可共享的”,是否都是用相同的触发方式(电平,边沿,极性),如果一致,则将新建的irqaction结构链入。

2、设置irq_desc[irq]结构中chip成员的还没设置的指针,让它们只想一些默认函数。

3、设置中断的触发方式。

4、启动中断。

asm_do_IRQ是中断的C语言总入口函数;

中断是一种很稀缺的资源,当不再使用一个设备时,应该释放它占据的中断。这通过free_irq函数来实现;

void free_irq(unsigned int irq, void *dev_id)

linux 在某个core上的中断 affinity c语言函数,Linux中断处理体系结构相关推荐

  1. linux ftp 登录慢,linux中vsftpd登录,上传下载文件慢解决办法linux操作系统 -电脑资料...

    vsftpd登录慢主要是nameserver #定义DNS服务器的IP地址没有设置了,这样我们只要设置或更新一下nameserver即可解决了, 在使用vsftpd的过程中,一直以来都有一个问题就是在 ...

  2. linux系统在硬盘上安装程序,在硬盘中安装Linux操作系统最简单的方法

    通过Grub(多系统引导管理器)来安装 本人最近摸索Linux系统,想在本机上安装双系统,但我这老爷机上没有软驱,没有刻录机,下载的ISO文件只能存在硬盘上,也只能通过硬盘来安装,在各大Linux的B ...

  3. python调用c语言内核计算,在Linux上实现Python调用C语言函数

    一般思路 Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用. 假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y). 将.c文件编译成 .so文 ...

  4. 几个书本上不常见到的C语言函数

    函数名称:getcwd #include <unistd.h> char *getcwd(char *buf, size_t size); 作用:把当前目录的绝对地址保存到 buf 中,b ...

  5. linux里如何创建c文件夹,使用c语言在Linux中的/ tmp文件夹中创建文本文件

    #include // Defines fopen(), fclose(), fprintf(), printf(), etc. #include // Defines errno C程序mkstem ...

  6. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...

    背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...

  7. linux的ftp停不下来了,FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时总是出现connection refuse......

    导航:网站首页 > FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时总是出现connection refuse... FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时 ...

  8. linux高优先级打断低优先级,对Linux x86-64架构上硬中断的重新认识

    对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草 ...

  9. Linux 中断学习之小试牛刀篇---Linux中断内核编程

    原址 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序: 我们还是来看一看成程序: 在看程序之前,要熟悉如何进行 ...

最新文章

  1. 如何在Windows 2000的域环境中自动分发软件
  2. 国内能打自动驾驶出租车了!行驶平稳还免费,首个量产车型开放道路试运营...
  3. python 元组 字典 列表 序列化与反序列化
  4. linux:配置jdk环境变量
  5. 【干货】优秀的移动客户端 Web App设计,让用户体验飞起来
  6. php interface exists,43、面向对象方法get_object_vars、is_subclass_of、interface_exists
  7. pythonlinux加入自己写的模块_利用ngx_python模块嵌入到Python脚本
  8. 7-69 计算圆周率 (15 分)
  9. 线上python课程一般多少钱-排名前十的python零基础编程在线网课一对一费用多少钱...
  10. git学习指南_GIT 学习指南
  11. 机器学习防止模型过拟合的方法知识汇总
  12. cpu性能天梯图包含服务器,服务器cpu性能天梯图
  13. 【数据科学家】如何成为一名数据科学家?
  14. hadoop组件---面向列的开源数据库(九)--python--python使用thrift连接hbase
  15. 32-Figma-谷歌表格插件替换数据方法
  16. 程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
  17. 计算机防火墙无法关闭,为什么我电脑的防火墙关不了(win7电脑防火墙怎么关)
  18. Stealth-Persist混合内存系统中持久应用程序的体系结构支持
  19. 冒险岛启动游戏提示计算机丢失,各种无法登陆情况解决建议汇总
  20. SQL Server新增Contained Database功能

热门文章

  1. python3 如何读中文路径_Python 3.8.2安装教程
  2. 排序 np_P问题、NP问题、NP完全问题和NP难问题理解
  3. java 注解学习_java注解的学习
  4. python输入ip地址_python批量生成本地ip地址的方法
  5. Windows 操作系统的安全设置
  6. Ant 脚本打印系统属性变量、ant内置属性
  7. CPython对象模型:string(留坑待填)
  8. (转)start_kernel 代码分析
  9. C# 程序员最常犯的 10 个错误
  10. [EasyTao(道)系列文章之一]太极之道