linux 在某个core上的中断 affinity c语言函数,Linux中断处理体系结构
各种的异常的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中断处理体系结构相关推荐
- linux ftp 登录慢,linux中vsftpd登录,上传下载文件慢解决办法linux操作系统 -电脑资料...
vsftpd登录慢主要是nameserver #定义DNS服务器的IP地址没有设置了,这样我们只要设置或更新一下nameserver即可解决了, 在使用vsftpd的过程中,一直以来都有一个问题就是在 ...
- linux系统在硬盘上安装程序,在硬盘中安装Linux操作系统最简单的方法
通过Grub(多系统引导管理器)来安装 本人最近摸索Linux系统,想在本机上安装双系统,但我这老爷机上没有软驱,没有刻录机,下载的ISO文件只能存在硬盘上,也只能通过硬盘来安装,在各大Linux的B ...
- python调用c语言内核计算,在Linux上实现Python调用C语言函数
一般思路 Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用. 假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y). 将.c文件编译成 .so文 ...
- 几个书本上不常见到的C语言函数
函数名称:getcwd #include <unistd.h> char *getcwd(char *buf, size_t size); 作用:把当前目录的绝对地址保存到 buf 中,b ...
- linux里如何创建c文件夹,使用c语言在Linux中的/ tmp文件夹中创建文本文件
#include // Defines fopen(), fclose(), fprintf(), printf(), etc. #include // Defines errno C程序mkstem ...
- linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...
背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...
- linux的ftp停不下来了,FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时总是出现connection refuse......
导航:网站首页 > FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时总是出现connection refuse... FTP上传时经常中断,怎么办? 在Linux终端中使用ftp时 ...
- linux高优先级打断低优先级,对Linux x86-64架构上硬中断的重新认识
对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草 ...
- Linux 中断学习之小试牛刀篇---Linux中断内核编程
原址 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序: 我们还是来看一看成程序: 在看程序之前,要熟悉如何进行 ...
最新文章
- 如何在Windows 2000的域环境中自动分发软件
- 国内能打自动驾驶出租车了!行驶平稳还免费,首个量产车型开放道路试运营...
- python 元组 字典 列表 序列化与反序列化
- linux:配置jdk环境变量
- 【干货】优秀的移动客户端 Web App设计,让用户体验飞起来
- php interface exists,43、面向对象方法get_object_vars、is_subclass_of、interface_exists
- pythonlinux加入自己写的模块_利用ngx_python模块嵌入到Python脚本
- 7-69 计算圆周率 (15 分)
- 线上python课程一般多少钱-排名前十的python零基础编程在线网课一对一费用多少钱...
- git学习指南_GIT 学习指南
- 机器学习防止模型过拟合的方法知识汇总
- cpu性能天梯图包含服务器,服务器cpu性能天梯图
- 【数据科学家】如何成为一名数据科学家?
- hadoop组件---面向列的开源数据库(九)--python--python使用thrift连接hbase
- 32-Figma-谷歌表格插件替换数据方法
- 程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
- 计算机防火墙无法关闭,为什么我电脑的防火墙关不了(win7电脑防火墙怎么关)
- Stealth-Persist混合内存系统中持久应用程序的体系结构支持
- 冒险岛启动游戏提示计算机丢失,各种无法登陆情况解决建议汇总
- SQL Server新增Contained Database功能
热门文章
- python3 如何读中文路径_Python 3.8.2安装教程
- 排序 np_P问题、NP问题、NP完全问题和NP难问题理解
- java 注解学习_java注解的学习
- python输入ip地址_python批量生成本地ip地址的方法
- Windows 操作系统的安全设置
- Ant 脚本打印系统属性变量、ant内置属性
- CPython对象模型:string(留坑待填)
- (转)start_kernel 代码分析
- C# 程序员最常犯的 10 个错误
- [EasyTao(道)系列文章之一]太极之道