岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> 系统管理 >> 内核技术 >> Linux频道正文
Linux 2.6.11内核文件IO系统调用详解
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-12-18 17:31:42

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] 下一页  

 

4.open 函数

4.1.原型与参数

int open(const char * pathname, int oflag, .../*, mode_t mode * / ) -1代表错误。

这里的oflag是一个整形,主要供open 函数使用,部分fcntl函数也会使用。详细的说明请用man 2 open就可以看到了。以下列出了2.6内核定义的open和fcntl函数所使用的flag宏定义,说明的格

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


  • 上一个Linux频道:
  • 下一个Linux频道:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    天龙八部私服 传世私服 传奇世界私服 传奇私服 bet365 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365