学习Linux源码fs/pipe.c
TL;DR
- 概要
- fs/pipe.c是一个内核模块,初始化了pipe(伪)文件系统
- pipe系统调用在pipe文件系统中新建一个pipe文件
- pipe文件包括struct inode和struct pipe_inode_info数据结构
- pipefs初始化
- 内核调用init_pipe_fs初始化pipefs:register_filesystem
- pipefs创建文件
- pipe系统调用内核入口:SYSCALL_DEFINE1(pipe)
- 创建PIPE文件的函数:create_pipe_files
- 在内存创建inode:alloc_inode(pipe_fs_type)
- 初始化pipe文件:alloc_pipe_info
- 绑定pipe文件pipefifo_fops:pipefifo_fops
- 打开新创建的pipe文件:create_pipe_files
- 返回打开的文件给用户:copy_to_user
- pipe write
- write系统调用入口:SYSCALL_DEFINE3(write)
- 根据fd获取到对应的数据结构struct fd和struct file:ksys_write
- VFS write函数调用对应文件系统的write函数:__vfs_write
- pipefs的write函数把用户数据写到内核内存中:pipe_write
- 总结
- 管道是一个文件系统,分配一块内存供进程读写
- 管道的数据保存在inode->i_pipe中,结构为struct pipe_inode_info