当应用程序调用 write
系统调用时,会进入内核态执行相应的内核函数。在 Linux 内核中,内核函数通过 file_operations
结构体中的函数指针来实现。
在 file_operations
结构体中,.write
字段是指向设备文件的写操作函数的函数指针。当应用程序调用 write
系统调用时,内核会根据文件描述符找到对应的 file
结构体,并通过这个结构体中的 file_operations
字段中的 .write
函数指针来调用相应的写操作函数。
因此,当应用程序调用 write
系统调用时,会进入内核态,并执行 file_operations
结构体中的 .write
函数。这个函数可以在 static const struct file_operations
结构体中指定。
用户态调用write系统调用之后是怎么通过 file_operation结构体找到对应字符设备需要调用的write内核函数的
当用户态调用 write
系统调用之后,内核会进行一系列的处理来将数据传递给对应的字符设备的内核函数。以下是大致的流程:
-
应用程序调用
write
系统调用,将数据和文件描述符传递给内核。 -
内核通过文件描述符找到相应的
file
结构体,其中包含了指向对应字符设备的file_operations
结构体。 -
内核调用
file_operations
结构体中的.write
函数指针,进入对应字符设备的写操作函数。 -
在字符设备的写操作函数中,会对传入的数据进行处理,并将数据写入设备的缓冲区或进行相关的操作。
-
完成写操作后,返回给内核。
-
内核将写操作的结果返回给应用程序。
总结起来,应用程序调用 write
系统调用后,内核会根据文件描述符找到对应的字符设备,并通过 file_operations
结构体中的函数指针进入设备的写操作函数。在该函数中,完成对数据的处理和设备的写操作。