Linux驱动中的异步函数(aio_read和aio_write)

摘要:
对于Linux驱动程序中的异步函数(aio_read和aio_write),我们可以使用_处理程序使用读写函数来处理设备文件的读写操作。使用aio_Read和aio_write函数处理设备文件的读/写操作_Read和aio_write函数中的pos参数变为实际值。相反,实现的信号被称为“读取”和“信号写入”函数。
Linux驱动中的异步函数(aio_read和aio_write)

我们可以在signal_handler使用了read和write函数处理设备文件的读写操作。然而这两个函数可以分别用aio_read和aio_write代替。在本节将重新改造signal驱动,使用aio_read和aio_write函数来处理设备文件的读写操作,新的Linux驱动源代码文件是aio_signal.c。这个文件和13.1.3节编写的signal.c文件的内容基本相同,只是添加了如下两个函数。

//  设备文件的aio_read函数
static ssize_t signal_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos)
{
    return signal_read(iocb->ki_filp, (char*)iov->iov_base,iocb->ki_nbytes, &pos);;
}
//  设备文件的aio_write函数
static ssize_t signal_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos)
{
    return signal_write(iocb->ki_filp, (char*)iov->iov_base,iocb->ki_nbytes, &pos);;
}

这两个函数的参数完全相同。其中kiocb结构体类似于aiocb结构体,aiocb结构体中很多数据(如aio_nbytes、aio_offset等)在kiocb中都可以通过对应的成员变量获取。而iov可以获取用于读写数据的缓存区,也就是aiocb.aio_buf指向的内存区域。除此之外,还可以通过iovec.iov_len获取缓存区的字节长度。pos参数和kiocb.ki_pos都可以获取读写数据的偏移量,使用哪个都可以。只是pos参数和read、write函数不同。在aio_read和aio_write函数中pos参数变成了实际的值,而不是loff_t指针类型参数。也就是不能在aio_read和aio_write函数中修改pos参数的值(修改了也没用)。
从上面实现的aio_read和aio_write函数可以看出,在这两个函数中并未实现具体的代码,而是调用了已经实现的signal_read和signal_write函数。这就会引出一个问题,如果file_operations结构体同时初始化异步(aio_read和aio_write)和同步(read和write)函数,那么系统会使用同步还是异步读写方式处理对设备文件的读写操作呢?
如果同时指定同步和异步读写函数,系统会使用read和write函数来处理设备文件的读写操作。如果想使用aio_read和aio_write函数来处理设备文件的读写操作,就不能指定read和write函数。因此,本节的示例需要按如下方式修改file_operations结构体初始化的代码。

static struct file_operations dev_fops =
{
.owner = THIS_MODULE,
.poll = signal_poll,
.fasync = signal_fasync,
.aio_read=signal_aio_read,
.aio_write=signal_aio_write
};

现在Linux驱动程序已经修改完毕,最后执行build.sh脚本文件编译和安装本节实现的Linux驱动。为了和13.1.3节实现的signal驱动区分开。本节实现的Linux驱动建立的设备文件名是aio_signal。

注意:file_operations结构体的aio_read、aio_write和read、write都能处理同步和异步I/O操作。只是aio_read和aio_write函数可以获取更多的异步I/O的数据,并可以更好地控制异步I/O。虽然大多数字符设备都不使用aio_read和aio_write函数(只有一些块设备,如磁带机,为了提高读写效率会使用它们),但如果想对AIO有更多的控制,也可以考虑使用aio_read和aio_write函数,尽管这两个函数看起来比read和write函数复杂一些。

免责声明:文章转载自《Linux驱动中的异步函数(aio_read和aio_write)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Misc工具合集工具-windows命令--查看端口占用情况,关闭端口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

coreos安装

cloud-config-bootstrap.sh #!/bin/bash cat > "cloud-config.yaml" <<EOF #cloud-config ssh_authorized_keys: - ssh-rsa ... EOF sudo coreos-install -d /dev/vd...

php CI框架目录结构及运行机制

CI目录结构   CI主要组成部分为,application(应用文件夹)、system(系统文件夹)和index.php入口文件。     应用文件夹中主要是存放控制器、模型和视图等,系统文件夹中主要是存放组成CI的核心文件的,index.php入口文件是一个单一入口文件,所谓单一文 件是指在一个网站(应用程序)中,所有的请求都是指向的这么一个文件,由...

PCIe Max_Payload_Size 和 Max_Read_Request_Size

最近PCIe在SSDFans上镜率挺高,那我们来聊两句MAX_READ_REQUEST_SIZE 和MAX_PAYLOAD_SIZE。 这两个东西都在PCIe Capability Structure 08h (Device Control Register)里 Maximum Payload Size (简称MPS) 控制一个TLP可以传输的最大数据长...

Markdown 文件如何实现 chm 文件打包

需要借助2个工具,下面的链接都有对应的网址 LME和 hhw, 有不清楚的可以下面评论,7*24小时在线解答问题,也可以加博主微信 首先借助 Markdown To CHM(LME) 工具将Markdown文件,编译成chm工程文件其实就是HTML文件,LME工具栏提供编译功能。 然后借助 HTML Help Workshop 工具编译成chm文件。...

利用iis虚拟目录实现文件服务器功能

要求说明:   通过网站上传文件保存到统一的文件服务器上。   服务器说明:     1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213    2.Web服务器为以下称为WebServer,IP地址为:192.168.1.214 详细步骤:   (1)在FilesServer和WebServer上分别新建一个新用户,要求这...

【Oracle】Oracle安装配置、创建数据库实例及用户和连接

https://blog.csdn.net/wudiyong22/article/details/78904361 参考资料:https://www.cnblogs.com/hoobey/p/6010804.html 一、Oracle下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。 路径名称中,最好不要出现中文,也不要出现空格...