当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > Linux 2.6.11内核文件IO系统调用详解

Unix/Linux
Linux下Socket连接超时的一种实现方法
谈一谈至关重要的Linux系统Swap交换区
Linux系统GRUB引导单用户模式三种方式
实例解析:虚拟机中Lvs的负载均衡实验
实用技巧:DOS文件转换成UNIX文件格式
Linux系统多进程查看及调配管理方法
非常实用 Linux系统开机提速我有绝招!
Linux系统中的文件目录结构介绍(表)
Linux操作系统如何完美装载Windows分区
Linux系统访问Windows分区FAT32和NTFS
高手进阶 Linux系统下MTD/CFI驱动介绍
新手看招 Linux系统的参数配置优化技巧
Xmanager 远程登陆Linux系统后配置Xdm
新手学堂:Emacs只启动一个进程的方法
小技巧 在Linux桌面上建立“我的文档”
Linux slab 分配器详解
拨开云雾:Lastlog文件不断变大的原因
使用ImageMagick 的提示与技巧
认识Linux操作系统中的播客客户端
Linux系统中显示设备配置工具介绍

Unix/Linux 中的 Linux 2.6.11内核文件IO系统调用详解


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 72 ::
收藏到网摘: n/a

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队列 };

[1] [2] [3] [4] [5] [6] [7] 下一页