linux1.2.13 file结构体管理是怎样的

发布时间:2021-12-17 09:22:56 作者:iii
来源:亿速云 阅读:166
# Linux 1.2.13 file结构体管理是怎样的

## 引言

在Linux内核的早期版本中,文件系统管理是一个核心功能模块。Linux 1.2.13(发布于1995年)作为早期稳定版本,其文件管理机制体现了UNIX-like系统的经典设计思想。本文将深入剖析该版本中`file`结构体的管理机制,包括:

1. file结构体的定义与作用
2. 文件描述符与file结构的关联
3. 内核中的file结构管理机制
4. 相关系统调用实现分析
5. 与后续版本的对比

## 一、file结构体的定义与作用

### 1.1 基础定义(include/linux/fs.h)

在Linux 1.2.13中,`file`结构体定义为:

```c
struct file {
    mode_t f_mode;          // 文件访问模式
    loff_t f_pos;           // 文件当前位置
    unsigned short f_flags; // 文件打开标志
    unsigned short f_count; // 引用计数
    struct inode *f_inode;  // 关联的inode
    struct file_operations *f_op; // 操作函数集
};

1.2 关键成员解析

1.3 生命周期示意图

graph TD
    A[open系统调用] --> B[创建file结构体]
    B --> C[加入进程文件表]
    C --> D[操作期间引用增减]
    D --> E[close时释放]

二、文件描述符与file结构的关联

2.1 三级映射关系

  1. 进程task_struct中的files指针
  2. files_struct结构中的fd_array[]
  3. file结构体本身

2.2 关键数据结构

// include/linux/sched.h
struct task_struct {
    /* ... */
    struct files_struct *files;
};

// include/linux/file.h
struct files_struct {
    int count;              // 共享计数
    fd_set close_on_exec;   // exec时关闭的fd
    struct file * fd[NR_OPEN]; // 文件指针数组
};

2.3 文件描述符分配算法

内核使用简单的线性搜索算法:

// fs/open.c
int get_unused_fd(void)
{
    for(int fd = 0; fd < NR_OPEN; fd++) {
        if (!current->files->fd[fd])
            return fd;
    }
    return -EMFILE;
}

三、内核中的file结构管理机制

3.1 全局文件表管理

Linux 1.2.13尚未引入现代RCU机制,采用简单的引用计数:

// fs/file_table.c
void fput(struct file *file)
{
    if (--file->f_count == 0) {
        if (file->f_inode)
            iput(file->f_inode);
        kmem_cache_free(filp_cachep, file);
    }
}

3.2 缓存机制

内核维护一个slab缓存用于快速分配:

// fs/file_table.c
void __init file_table_init(void)
{
    filp_cachep = kmem_cache_create("filp", sizeof(struct file),
                                    0, SLAB_HWCACHE_ALIGN, NULL, NULL);
}

3.3 最大打开文件数限制

#define NR_OPEN (256)        // 每个进程默认限制
#define NR_FILE (4096)       // 系统全局限制

四、关键系统调用实现分析

4.1 open系统调用流程

  1. 调用getname()从用户空间获取路径名
  2. 调用get_unused_fd()分配fd
  3. 调用filp_open()创建file结构
  4. 建立fd与file的关联
// fs/open.c
int sys_open(const char *filename, int flags, int mode)
{
    struct file *f;
    int fd, error;
    
    fd = get_unused_fd();
    f = filp_open(filename, flags, mode);
    current->files->fd[fd] = f;
    return fd;
}

4.2 read/write实现

典型实现模式:

ssize_t sys_read(unsigned int fd, char *buf, size_t count)
{
    struct file *file = current->files->fd[fd];
    return file->f_op->read(file, buf, count, &file->f_pos);
}

五、与后续版本的对比

5.1 主要演进方向

特性 Linux 1.2.13 现代内核(5.x)
引用计数 简单原子操作 refcount_t API
同步机制 无RCU RCU保护文件表
最大fd数 硬编码256 动态调整(ulimit)
分配方式 简单数组 可扩展哈希表

5.2 性能优化案例

现代内核引入的改进: - 文件表的RCU保护 - 快速fd分配算法 - 延迟释放机制

六、典型问题分析

6.1 引用计数异常

当出现f_count泄漏时,会导致:

  1. 文件资源无法释放
  2. inode缓存膨胀
  3. 最终可能耗尽filp缓存

6.2 多线程安全问题

原始版本存在的问题:

// 非线程安全的操作示例
file->f_count++; 

现代内核已使用atomic_t类型解决。

结论

Linux 1.2.13的file结构管理体现了早期UNIX设计的简洁性: 1. 基于引用计数的资源管理 2. 面向对象的文件操作抽象 3. 简单有效的描述符分配策略

这些基础设计理念延续至今,虽然实现细节已有巨大改进,但基本架构仍然保持稳定。研究早期版本有助于理解Linux文件系统的设计本质。

附录

关键代码路径

  1. 文件表管理:fs/file_table.c
  2. 系统调用实现:fs/open.c
  3. 结构定义:include/linux/fs.h

相关统计命令

# 查看系统文件使用情况
cat /proc/sys/fs/file-nr

参考文献

  1. Linux 1.2.13内核源码
  2. 《Linux内核设计与实现》第2版
  3. UNIX环境高级编程

”`

推荐阅读:
  1. Linux系统ubuntu16.04中Python3.5如何配置OpenCV3.2
  2. Oracle 在 Linux 下移动控制文件步骤

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux file

上一篇:Spark闭包中driver及executor程序代码是怎样执行的

下一篇:python匿名函数怎么创建

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》