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

2016-01-29 17:35 6 1 收藏

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

【 tulaoshi.com - Linux 】

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

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

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

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

来源:http://www.tulaoshi.com/n/20160129/1502073.html

延伸阅读
标签: 服务器
linux内核驱动-内核初涉   一、为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它。你如果以后要从事系统研发或驱动开发的话,就要学习内核。 刚刚接触内核,主要学习内核的接口函数。不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭。 学习内核主要掌握层次学习法,即从头开始学习...
LIDS( Linux入侵侦察系统)是Linux内核补丁和系统管理员工lidsadm),它加强了Linux内核。它在内核中实现了一种安全模式 -- 参考模式以及内核中的Mandatory Access Control(命令进入控制)模式。本文将阐述LIDS的功能和如何使用它来建立一个安全的Linux系统。 为什么选择LIDS 随着互连网上Linux越来越受欢迎 ,越来越多现有GNU/LINUX系统上...
一. Input和Output 1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型: 1.1 以字节为导向的stream 以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型...
    针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制; 一.核心源程序的文件组织:   1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心...
  1. 要怎麽进行核心的配置? 1.1. 取得原始程序码 你可以经由 ftp 从 ftp.funet.fi 或是 mirror in /pub/OS/Linux/PEOPLE/Linus 取 得原始程序码。也可以到这个节点的 mirror 或其他节点去拿。档案名称一般是以标记 成 linux-x.x.x.tar.gz 为代表,其中的&nb...

经验教程

184

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部