Linux内核中断处理机制
linux 驱动中的中断处理程序:
当发生中断的时候,无论是裸机程序还是Linux系统都会有一个统一的入口.
裸机中的中断入口是代码:ldr pc,_irq;
linux 系统中的统一入口:irq_svc
向Linux系统注册中断处理程序想:
requst_irq(unsigned int irq ,void(*handler)(int ,void *,struct pt_regs*),unsigned long flags,const char *devname ,void *dev_id )
参数分析:
unsigned long flags:参数还是一个宏,用于决定是快速中断还是慢速中断,或者表明该中断是多少个设备共享。
unsigned int irq:
向Linux系统注销中断处理程序:
void free_irq(unsigned int irq ,void *dev_id)
参数分析:
int irq:中断号,注意这里的中断号和裸机中的中断号有一定的不同,因为系统预留了16个的软中断号,所以硬件中断号需要加上16,系统通过中断号找到相应的描述符表,在描述符表中找到相应个处理函数。
dev_id:对于共享中断号的设备,需要提供相应的中断号才能准确的注销掉。
中断嵌套:
为了解决中断处理速度,Linux中将硬件处理函数和非硬件处理函数进行了分开,将非硬件操作放到工作队列中。
注意:工作队列中的结构体数组名都是使用一个struct 在后面
定义和描述中断队列:
struct workqueue_struct {
struct cpu_workqueue_struct *cpu_wq;
struct list_head list;
const char *name; /*workqueue name*/
int singlethread;
int freezeable; /* Freeze threads during suspend */
int rt;
}
定义和描述一个工作:
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func;
};
创建一个工作队列:
srtuct workqueue_struct * =create_workqueue(“workqueue_name”)
初始化工作:
INIT_WORK(struct work_struct *,func)
注意:创建工作实质是将创建的工作和相应的操作函数关联起来
向Linux系统提交工作
queue_work(struct workqueue_struct , func)
在大多数情况下,并把需要定义工作队列,Linux内核中已经有一个默认的工作队列keventd_wq,所以只需要创建工作,并初始化工作。
提交默认工作队列:
schedule_work()
按键去抖之内核定时器:
定义并描述定时器:
struct timer_list {
struct list_head entry;
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
struct tvec_base *base;
};
初始化定时器:
init_timer(struct list_timer * keytimer)
keytimer.function = key_timerfunc()
找一个地方定义timerfunc()
想Linux注册定时器:
add_timer(struct timer_list *)
启动定时器:
mod_timer(struct list_timer * ,jiffes+Hz/2)
阻塞型驱动:
背景:
当计算机驱动访问一个硬件的时候发现访问条件不满足,称之为阻塞,这时就需要将该驱动放入到等待队列中。
定义等待队列:
wait_queue_head_t my_queue
初始化等待队列:
init_waitqueue_head( wai_queue_head_t* )
备注:定义并初始化等待队列
DECLARE_WAIT_QUEUE_HEAD(wait_queue_head_t my_queue)
进入等待队列:
wait_event(queue,condition) //TASK_UNINTERRUPT 模式
wait_event_interrupt(queue,condition)//TASK_INTERRUPT 模式
int wait_event_killable(queue,condition) //TASK_KILLABLE 模式
函数分析:
以上两个函数,在条件满足时,直接返回,并继续执行相应的下面的程序,当条件不满足时则挂载到等待队列中,知道被唤醒。
唤醒等待队列:
wake_up(wait_queue_t *q) //从等待队列中唤醒,所有TASK_UNINTERRUPT ,TASK_INTERRUPT ,TASK_KILLABLE 状态的所有进程。
wake_up_intterruptible(wait_queue_t *q)//从等待队列q中唤醒状态仅为INTERRUPTIBLE 状态的队列。
设备驱动在内存中开辟内存:
kmalloc()
注意:该函数返回的是物理地址
释放内存:
kfree()
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
Linux内核中断处理机制的更多相关文章
- [内核同步]浅析Linux内核同步机制
转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...
- Linux内核同步机制--转发自蜗窝科技
Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...
- Linux内核同步机制
http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...
- 浅析Linux内核同步机制
非常早之前就接触过同步这个概念了,可是一直都非常模糊.没有深入地学习了解过,最近有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这 ...
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
- Linux内核OOM机制的详细分析(转)
Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...
- Linux内核同步机制之(五):Read Write spin lock【转】
一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...
- Linux内核同步机制之completion【转】
Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的 ...
- Linux内核NAPI机制分析
转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...
随机推荐
- Redis(Remote Dictionary Server)入门
说说特性 存储结构:键值对支持多种数据类型,包括字符串类型,散列类型,列表类型,集合类型,有序集合类型. 内存存储与持久化:支持将内存中的数据异步写入磁盘中. 丰富的功能:支持为每个键值对设置生存时间 ...
- Shell脚本-自动化部署反向代理、WEB、nfs
部署nginx反向代理三个web服务,调度算法使用加权轮询(由于物理原因只开启两台服务器) AutoNginxNfsService.sh #/bin/bash systemctl status ngi ...
- Windows无法访问局域网内共享文件夹[0x800704cf,0x80070035]解决方案
Windows7系统突然无法访问访问其他windows机器的共享文件夹,出现0x800704cf或者0x80070035错误: 解决方案如下两张图,配置与下面两张图为准,即可解决: 1:window+ ...
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
- Dream------scala--开发环境搭建
scala简介: scala是一门函数式编程和面向对象编程结合的语言 函数式编程非常擅长数值计算而面向对象特别适合于大型工程或项目的组织以及团队的分工合作 我们借助scala可以非常优雅的构造出各种规 ...
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
- 莫烦课程Batch Normalization 批标准化
for i in range(N_HIDDEN): # build hidden layers and BN layers input_size = 1 if i == 0 else 10 fc = ...
- replication-manager 搭建
replication-manager 搭建 介绍 replication-manager 主要用于mysql主从结构的监控和主从切换. 安装 vi /etc/yum.repos.d/signal18 ...
- ActiveMQ之VirtualTopic是什么?
一句话总结: VirtualTopic是为了解决持久化模式下多消费端同时接收同一条消息的问题. 想象这样一个场景: 生产端产生了一笔订单,作为消息MessageOrder发了出去. 这笔订单既 ...
- python网络编程--线程Semaphore(信号量)
一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...