用户程序读取文件内容流程
图1显示了用户程序读取文件内容的过程,其中绿色框部分为一个文件系统最基本的东西,其余部分为一些为了提高性能而加的模块。
图1
建立一个小型文件系统
小型文件系统基本就是实现了图1的绿色部分;具体的代码如下:
//tinyfs.h
#ifndef TINYFS_H
#define TINYFS_H
#define MAXLEN 8 //文件名最多8个字节
#define MAX_FILES 32 //定义文件最大32个字节
#define MAX_BLOCKSIZE 512 //文件及目录文件一共的个数
//定义一个目录项格式
struct dir_entry{
char filename[MAXLEN];
uint8_t idx;
};
//文件块数据结构
struct file_blk{
uint8_t busy; //
mode_t mode;
uint8_t idx; /
union
{
/* data */
uint8_t file_size; //文件大小
uint8_t dir_children; //文件夹中文件个数
};
char data[0]; //保存数据所在位置的指针
};
//下面的block数组所占据的连续内存就是我的tinyfs.h的介质,每一个元素代表一个文件
//struct file_blk bolck[MAX_FILES+1];
#endif
//tinyfs.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/dcache.h>
#include "tinyfs.h"
#include <linux/uaccess.h>
#include <linux/time.h>
#define CURRENT_TIME (current_kernel_time())
struct file_blk block[MAX_BLOCKSIZE + 1]; //在内存开辟一块空间作为模拟磁盘
int curr_count = 0; //当前文件或目录文件的个数
static int get_block(void){
int i;
//就是一个遍历,但实现快速
for(i =2;i<MAX_BLOCKSIZE;i++){
if(!block[i].busy){
block[i].busy = 1;
return i;
}
}
return -1;
}
static struct inode_operations tinyfs_inode_ops;
//读取目录的实现
/*static int tinyfs_readdir(struct file *filp,void *dirent,filldir_t filldir){
loff_t pos;
struct file_blk *blk;
struct dir_entry *entry;
int i;
pos = filp->f_pos;
if(pos){
return 0;
}
blk = (struct file_blk*)filp->f_dentry->d_in