file_table.c 文件分析 linux1_0\linux\fs\file_table.c
2013-01-18 13:41
447 查看
/* * linux/fs/file_table.c * * Copyright (C) 1991, 1992 Linus Torvalds */ #include <linux/fs.h> #include <linux/string.h> #include <linux/mm.h> struct file * first_file; //开头文件. int nr_files = 0; //文件位置为0 //文件双向链表插入文件点,并把first_file指向当前文件点。 static void insert_file_free(struct file *file) { file->f_next = first_file; file->f_prev = first_file->f_prev; file->f_next->f_prev = file; file->f_prev->f_next = file; first_file = file; } //双向链表删除文件点 static void remove_file_free(struct file *file) { //如果first_file点被删,first_file 往下移 if (first_file == file) first_file = first_file->f_next; //下个链表点指向前链表点 if (file->f_next) file->f_next->f_prev = file->f_prev; //前个链表点指向下个链表点 if (file->f_prev) file->f_prev->f_next = file->f_next; //当前删除点向前,向后指针指为空 file->f_next = file->f_prev = NULL; } //把链表点放到双向链表最后 static void put_last_free(struct file *file) { remove_file_free(file); file->f_prev = first_file->f_prev; file->f_prev->f_next = file; file->f_next = first_file; file->f_next->f_prev = file; } //根据申请的页,生成N个文件点,并同时插入双向链表 void grow_files(void) { struct file * file; int i; //分配空页 file = (struct file *) get_free_page(GFP_KERNEL); //分配失败返回 if (!file) return; //每页生成n个文件链表点 nr_files+=i= PAGE_SIZE/sizeof(struct file); //如果不存在头节点的话,设定头节点; file 指向往下移动,个数i减1 if (!first_file) file->f_next = file->f_prev = first_file = file++, i--; //挨个插入列表 for (; i ; i--) insert_file_free(file++); } //文件链表初始化 unsigned long file_table_init(unsigned long start, unsigned long end) { first_file = NULL; return start; } //获取空的文件链表点 struct file * get_empty_filp(void) { int i; struct file * f; //不存在first_file,分配链表空间 if (!first_file) grow_files(); repeat: for (f = first_file, i=0; i < nr_files; i++, f = f->f_next) //存在为记录的链表点,把该链表放到最后,并 if (!f->f_count) { //从链表中移除 remove_file_free(f); //链表点初始化为空 memset(f,0,sizeof(*f)); //把链表放到最后 put_last_free(f); //记录使用数 f->f_count = 1; //返回分配的链表点 return f; } //如果没有找到空链表点,并且 链表数小于NR_FILE(1024);在生成链表点 if (nr_files < NR_FILE) { //按页空间生成链表点 grow_files(); goto repeat; } //已经分配链表点大于NR_FILE(1024) 返回空 return NULL; }
相关文章推荐
- linux-0.11调试教程 minix 文件系统1.0 下篇(3)文件表 file_table
- linux 为崩溃的程序生成core文件的相关函数,调用代码生成core dump file 但程序不用退出,gdb 分析core
- Linux的nmon监控结果分析文件中网络分析NET
- linux系统调用 创建文件 file_creat.c
- Linux--文件结构体struct file
- Linux--根文件系统的挂载过程分析
- Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较
- Linux下设置最大文件打开数nofile及nr_open、file-max
- linux下执行php文件发现Could not open input file
- windows PE Image 文件分析(6)--- .reloc 节与 base relocation table
- linux文件系统的系统分析--(五)路径名的查找
- mini6410 Linux--根文件系统的挂载过程分析
- 在linux下利用程序崩溃后的core文件分析bug
- 一个操作系统的实现(1):分析linux下如何运行一个执行文件
- linux下文件大小不一致的情况分析,文件空洞
- linux分析日志文件
- crash 工具分析linux dump 文件
- linux文件系统的系统分析 1-17
- Linux 内核启动挂载android根文件系统过程分析
- 关于File.separator 文件路径:windows与linux下路径问题 ("\"与"/")