Linux内核中断之中断申请接口

Linux内核中断之中断申请接口,第1张

本文基于 RockPI 4A 单板Linux4.4内核介绍中断申请的常用接口函数

1、文件

2、定义

说明:

1)、 irq :要申请的中断号,可通过 platform_get_irq() 获取,见“Linux内核中断之获取中断号”。

2)、 handler :中断处理函数,发生中断时,先处理中断处理函数,然后返回 IRQ_WAKE_THREAD 唤醒中断处理线程。中断处理函数尽可能简单。

中断处理函数定义: typedef irqreturn_t (*irq_handler_t)(int, void *)

中断返回值如下:

3)、 thread_fn :中断处理线程,该参数可为NULL。类似于中断处理函数的下半部分。

4)、 irqflags :中断类型标志。

定义文件: include/linux/interrupt.h ,内容如下:

5)、 devname :中断名称,可使用 cat /proc/interrupts 命令查看。

6)、 dev_id :设备ID,该值唯一。

在使用共享中断时(即设置 IRQF_SHARED ),必须传入 dev_id ,在中断处理和释放函数中都会使用该参数。

注:

1、 request_threaded_irq() 函数可替代 request_irq 加 tasklet 或 workqueue 的方式。

2、对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。

1、文件

2、定义

说明:

1)、 __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。

2)、 request_irq() 函数本质上是中断处理线程 thread_fn 为空的 request_threaded_irq() 函数。

对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。

1、文件

2、定义

说明

devm_request_threaded_irq() 本质上还是使用 request_threaded_irq() 函数实现中断申请。

两者区别:

1)多了一个 dev 参数;

2)在设备驱动卸载时,中断会自动释放;

3)如果想单独释放中断,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函数。

1、文件

2、定义

devm_request_irq() 函数本质上是中断处理线程 thread_fn 为空的 devm_request_threaded_irq() 函数。

1、获取中断号

2、申请中断

3、中断处理函数

4、中断处理线程

5、查看中断

int 80h 是 unix/linux 类 *** 作系统内核在 Intel 类CPU架构上作为 系统调用 使用的中断号。常用的系统调用如 write, exit 之类的, 在 glibc中都有对应的接口函数可以直接使用。具体有哪些系统调用,用途,调用号的,楼主自己去找一下相关资料即可。

int 80h

调用系统调用前,应该将 系统调用号 存入 eax, 参数存入其他寄存器中,然后再 int 80h,比如下面的例子,用 int 80h 调用 第4号 系统调用 (即 write), 将 "hello world" 打印到标准输出

(我用的是 at&t 风格的汇编,这是 gcc 默认使用的格式)

.data

hello:

.string "Hello world\n"

.globl main

main:

movl $4, %eax

movl $1, %ebx

movl $hello, %ecx

movl $12, %edx

int $0x80

ret

把上面的内容存入 xxx.s ,然后用 gcc xxx.s -o xxx 即可编译出可执行文件。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7480141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存