Linux2.6.11内核文件IO系统调用详解

我想家了555555

我想家了555555

2016-01-29 17:35

Linux2.6.11内核文件IO系统调用详解,Linux 2.6.11内核文件IO系统调用详解

1.引言

从事Linux环境工作2年有余,一直懵懵懂懂,1年前拜读了《莱昂氏UNIX源代码分析》一书,感觉自己的学习道路漫漫且修远。最近受chinaunix的精华文帖启发,拟将近来的部分内核调用分析笔记拿出来与各前辈先进共同探讨学习,以壮个人学习之路。

本部分主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构、宏定义和函数流程。以下分别讲述open,create,close,read,write,lseek系统调用。

2.主要参考

《莱昂氏UNIX源代码分析》

《UNIX环境高级编程》

www.kernel.org

3.主要数据结构

3.1.FD

对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。

当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。在POSIX.1应用程序中,文件描述符为常数0、1和2分别代表STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,意即标准输入,标准输出和标准出错输出,这些常数都定义在头文件;中。

文件描述符的范围是0~OPEN_MAX,在目前常用的linux系统中,是32位整形所能表示的整数,即65535,64位机上则更多。

3.2.File

struct file {   struct list_head        f_list; //文件链表指针  struct dentry                *f_dentry; // 文件对应的目录结构  struct vfsmount         *f_vfsmnt; // 虚拟文件系统挂载点  struct file_operations        *f_op; // 文件操作函数指针  atomic_t                f_count;    unsigned int                 f_flags;   mode_t                        f_mode; // 文件模式  int                        f_error;   loff_t                        f_pos; // 文件offset   struct fown_struct        f_owner; //文件owner 结构  unsigned int                f_uid, f_gid;   struct file_ra_state        f_ra; // 跟踪上次文件操作状态的结构指针  size_t                        f_maxcount; // 文件大小  unsigned long                f_version;   void                        *f_security; // hook 文件操作的security结构指针  void                        *private_data; // tty 驱动器所需数据#ifdef CONFIG_EPOLL   struct list_head        f_ep_links; // EPOLL 机制检测所需链表结构  spinlock_t                f_ep_lock; // 兼容早期gcc bug 的标志#endif /* #ifdef CONFIG_EPOLL */   struct address_space        *f_mapping; // 地址映射表                        }

3.3.File_struct

File_struct结构保存了进程打开的所有文件表数据。

struct files_struct {   atomic_t count; // 自动增量  spinlock_t file_lock; // 低位成员保护标识  int max_fds; // 最大文件句柄数目  int max_fdset; // 最大的fd集合容量  int next_fd; // 下一个空闲fd   struct file ** fd; // 当前fd对应的文件结构指针列表  fd_set *close_on_exec; // 可执行close的fd集合  fd_set *open_fds; // 打开的fd集合  fd_set close_on_exec_init; //    fd_set open_fds_init;   struct file * fd_array[NR_OPEN_DEFAULT]; // 默认打开的fd队列                        };

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/linux/)

[1] [2] [3] [4] [5] [6] [7]   

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/linux/)
展开更多 50%)
分享

猜你喜欢

Linux2.6.11内核文件IO系统调用详解

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux2.6.11内核文件IO系统调用详解

使用Linux系统调用的内核命令

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
使用Linux系统调用的内核命令

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Linux内核的文件预读详解

服务器
Linux内核的文件预读详解

Linux操作系统内核编译详解

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux操作系统内核编译详解

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

linux内核编译详解

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
linux内核编译详解

Linux文件系统入门详解

电脑入门
Linux文件系统入门详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

XMLHTTP+javascript+Asp写得聊天室 无刷新实现(二)

XMLHTTP+javascript+Asp写得聊天室 无刷新实现(二)

找回被微软抛弃的双用户同时登录

找回被微软抛弃的双用户同时登录
下拉加载更多内容 ↓