序言:打开文件是Linux系统中最基本的操作之一,open函数可以实现打开文件的功能。下边,将为你们介绍open函数打通下层到底层硬件的详尽过程。
一、open函数打通软硬件介绍
open函数是系统调用中的一种,其原型定义在头文件unistd.h中:
#include
int open(const char *pathname, int flags, mode_t mode);
其中,pathname参数是要打开的文件名,flags参数是打开文件时的标志,mode参数是文件的访问权限。
当应用程序调用open函数时,该函数首先会在显存中创建一个file结构体,这个结构体表示应用程序和文件之间的联接,其中包含了文件的各类属性,比如文件类型、文件访问权限、文件厚度等等。这个file结构体一般被称为文件句柄(filehandle)或文件描述符(filedescriptor),用一个整数来表示,该整数被赋于一个非负值。
接着,open函数会调用文件系统的VFS(VirtualFileSystem)层,VFS层是Linux文件系统的核心部份,其作用是将文件系统的各类实现细节隐藏上去,为下层应用程序提供一个统一的插口。VFS层通过查找文件系统的超级块(superblock)来确定文件的类型和位置,并找到相应的文件系统对象(inode)。
VFS层在找到文件系统对象后,会通过驱动程序中的文件操作函数(fileoperations)实现文件的打开操作,这种函数一般包括open、read、write、lseek、ioctl等等。驱动程序的文件操作函数被定义在一个结构体中,这个结构体一般被称为file_operations结构体,其中包含了驱动程序中实现的各类文件操作函数表针。
在这儿插入图片描述二、驱动中的open函数
在驱动程序中,实现文件打开操作的函数一般是open函数,该函数的原型定义在头文件linux/fs.h中:
int (*open) (struct inode *, struct file *);
open函数中的第一个参数是文件系统对象(inode),第二个参数是文件句柄(file)。
当驱动程序的open函数被调用时,它会依照文件句柄中保存的文件属性和访问标志(flags)linux是什么软件,确定文件打开的方法,比如只读、只写、读写等。接着,它会通过一系列的操作,将文件和硬件设备打通。
具体来说,打开文件时,驱动程序的open函数会调用底层设备驱动程序的probe函数,probe函数会依据设备的硬件类型和地址,初始化硬件设备并完善驱动程序和设备之间的联系。在这个过程中,驱动程序须要完成一系列的操作,比如打开设备的总线、寻找设备、初始化设备、注册设备等等。
在设备驱动程序和硬件设备之间构建联系后,驱动程序就可以通过访问设备寄存器、执行设备指令等形式,向硬件设备发送各类命令,进而实现对设备的控制和访问。
当应用程序通过调用read、write、ioctl等函数来读写文件时,这种函数实际上是通过调用驱动程序中的read、write、ioctl等操作函数来实现的。驱动程序中的这种操作函数会将数据从应用程序空间拷贝到内核空间,再将数据从内核空间拷贝到硬件设备的寄存器中linux是什么软件,实现数据的传输和处理。
当应用程序调用close函数来关掉文件时,系统会调用驱动程序中的release函数来释放文件所占用的资源。release函数一般拿来做一些清除工作,比如关掉设备、释放显存等等。
open函数是打通下层应用程序和底层硬件设备的关键,它通过调用文件系统、VFS层、设备驱动程序等一系列操作,将应用程序和硬件设备联接上去,实现对硬件设备的控制和访问。因而,对于Linux驱动开发工程师来说,深入理解open函数的实现原理和内部机制是极其重要的。
三、举个反例
下边我将以控制GPIO为例,介绍open函数在其中的作用。
GPIO(GeneralPurposeInput/Output)是一种通用的输入输出引脚,可以通过编程控制来实现对外部设备的控制和交互。在Linux系统中,GPIO的控制一般是通过设备驱动程序来实现的,该驱动程序会提供open、read、write、ioctl等函数,用于与用户空间的应用程序进行交互。
在控制GPIO的程序中,一般须要先打开GPIO设备,之后才会进行后续的读写操作。当调用open函数打开GPIO设备时,系统会手动调用GPIO设备的设备驱动程序的open函数。在open函数中linux,设备驱动程序会依照传入的参数,确定GPIO设备的状态和属性,并将其初始化。
接着,设备驱动程序会调用内核中的GPIO子系统,通过GPIO子系统来访问硬件设备,诸如读取GPIO的电平状态、设置GPIO的电平状态等等。GPIO子系统会负责将内核空间的数据转换为硬件所需的讯号,实现对GPIO的控制。
当应用程序须要对GPIO进行读写操作时,会调用设备驱动程序中的read、write函数。在read函数中,设备驱动程序会通过GPIO子系统读取GPIO的电平状态,并将其返回给应用程序;在write函数中redhat linux 9.0,设备驱动程序会通过GPIO子系统设置GPIO的电平状态,实现对GPIO的控制。
最后,当应用程序关掉GPIO设备时,会调用设备驱动程序中的release函数,该函数会负责释放GPIO设备所占用的资源,并将GPIO设备关掉。
综上所述,open函数在控制GPIO的程序中起到了联接应用程序和底层硬件设备的作用,它通过调用设备驱动程序的open函数和内核中的GPIO子系统,将应用程序和GPIO设备联接上去,实现对GPIO的控制和访问。
END