linux设备驱动中的异步通知机制

本文探讨了Linux设备驱动中的异步通知机制,该机制类似于硬件中断,允许设备在准备就绪时主动通知应用程序。在应用层,需要指定进程属主并设置FASYNC标志;在内核层,当FASYNC标志变化时,通过fasync_helper和kill_fasync函数实现信号的发送。
摘要由CSDN通过智能技术生成

前言

异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”.信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
在这里插入图片描述

应用层

实现异步通知机制,用户程序涉及2项工作,首先,得指定一个进程作为文件的“属主(owner)”.当应用程序使用fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就被保存在filp->f_owner中.这一步是必需的,目的是告诉内核将信号发给谁,也就是发给哪个进程.然后为了真正启动异步通知机制,用户程序还必须在设备中设置FASYNC标志,这通过fcntl的F_SETFL命令完成的,文件打开时,FASYNC标志被默认为是清除的.,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。.执行完这两个步骤之后,内核就可以在新数据到达时通过调用kill_fasync()函数请求发送一个SIGIO信号给应用层,该信号被发送到存放在filp->f_owner中的进程(如果是负值就是进程组)
在这里插入图片描述

内核层

根据内核源码来看看调用过程,应用层调用fcntl(),会进行系统调用sys_fcntl(),接着调用do_fcntl(),再根据cmd调用相应的操作函数
sys_fcntl

asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
   	
	struct file *filp;
	long err = -EBADF;

	filp = fget(fd);//通过文件描述符获得相应的文件指针
	if (!filp)
		goto out;

	err = security_file_fcntl(filp, cmd, arg);//调用do_fcntl函数
	if (err) {
   
		fput(filp);
		return err;
	}

	err = do_fcntl(fd, cmd, arg, filp);

 	fput(filp);
out:
	return err;
}

do_fcntl

static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
		struct file *filp)
{
   
	long err = -EINVAL;
    ......
	case F_GETFL: //返回文件标志
		err = filp->f_flags;
		break;
	case F_SETFL:
		err = setfl(fd, filp
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值