-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfs.h
195 lines (184 loc) · 8.71 KB
/
fs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <memory.h>
#include <stdlib.h>
//#include "list.h"
#define IROOT 0
#define SUPERBPOS 0
#define INODEPOS 3072
#define IBITMAPOS 1024
#define BBITMAPOS 2048
#define BLOCKPOS 8192
#define BLOCKSIZE 1024
#define BLOCK_SIZE_BITS 10 // 数据块长度所占比特位数。
#define NR_OPEN 20
#define NR_INODE 32
#define NR_FILE 64
#define NINODES 100
#define INODESIZE 48
#define IS_DIR 1
//inode占48字节
struct d_inode
{
unsigned short i_mode; // 文件类型和属性(rwx 位)。
unsigned short i_uid; // 用户id(文件拥有者标识符)。
unsigned long i_size; // 文件大小(字节数)。
unsigned short i_cnt; // inode编号
unsigned char i_gid; // 组id(文件拥有者所在的组)。
unsigned char i_nlinks; // 链接数(多少个文件目录项指向该i 节点)。
unsigned short i_zone[9]; // 直接(0-6)、间接(7)或双重间接(8)逻辑块号。
// zone 是区的意思,可译成区段,或逻辑块。
};
// 这是在内存中的i 节点结构。前7 项与d_inode 完全一样。
struct m_inode
{
unsigned short i_mode; // 文件类型和属性(rwx 位)。
unsigned short i_uid; // 用户id(文件拥有者标识符)。
unsigned long i_size; // 文件大小(字节数)。
unsigned long i_mtime; // 修改时间(自1970.1.1:0 算起,秒)。
unsigned char i_gid; // 组id(文件拥有者所在的组)。
unsigned char i_nlinks; // 文件目录项链接数。
unsigned short i_zone[9]; // 直接(0-6)、间接(7)或双重间接(8)逻辑块号。
/* these are in memory also */
// struct task_struct *i_wait; // 等待该i 节点的进程。
unsigned long i_atime; // 最后访问时间。
unsigned long i_ctime; // i 节点自身修改时间。
// unsigned short i_dev; // i 节点所在的设备号。
unsigned short i_num; // i 节点号。
// unsigned short i_count; // i 节点被使用的次数,0 表示该i 节点空闲。
// unsigned char i_lock; // 锁定标志。
unsigned char i_dirt; // 已修改(脏)标志。
unsigned char i_pipe; // 管道标志。
unsigned char i_mount; // 安装标志。
// unsigned char i_seek; // 搜寻标志(lseek 时)。
// unsigned char i_update; // 更新标志。
};
// 文件结构(用于在文件句柄与i 节点之间建立关系)
struct file
{
unsigned short f_mode; // 文件操作模式(RW 位)
unsigned short f_flags; // 文件打开和控制的标志。
unsigned short f_count; // 对应文件句柄(文件描述符)数。
struct d_inode *f_inode; // 指向对应i 节点。
off_t f_pos; // 文件位置(读写偏移值)。
};
// 内存中磁盘超级块结构。超级块占24字节
struct super_block
{
unsigned short s_ninodes; // 节点数。
unsigned short s_nzones; // 逻辑块数。
unsigned short s_imap_blocks; // i 节点位图所占用的数据块数。
unsigned short s_zmap_blocks; // 逻辑块位图所占用的数据块数。
unsigned short s_firstdatazone; // 第一个数据逻辑块号。
unsigned short s_rember_node; //inode铭记节点
//unsigned short s_log_zone_size; // log(数据块数/逻辑块)。(以2 为底)。
unsigned long s_max_size; // 文件最大长度。
//unsigned short s_magic; // 文件系统魔数。
/* These are only in memory */
// struct buffer_head *s_imap[8]; // i 节点位图缓冲块指针数组(占用8 块,可表示64M)。
// struct buffer_head *s_zmap[8]; // 逻辑块位图缓冲块指针数组(占用8 块)。
// unsigned short s_dev; // 超级块所在的设备号。
// struct m_inode *s_isup; // 被安装的文件系统根目录的i 节点。(isup-super i)
// struct m_inode *s_imount; // 被安装到的i 节点。
// unsigned long s_time; // 修改时间。
// // struct task_struct *s_wait; // 等待该超级块的进程。
// unsigned char s_lock; // 被锁定标志。
// unsigned char s_rd_only; // 只读标志。
// unsigned char s_dirt; // 已修改(脏)标志。
};
// 磁盘上超级块结构。上面125-132 行完全一样。
struct d_super_block
{
unsigned short s_ninodes; // 节点数。
unsigned short s_nzones; // 逻辑块数。
unsigned short s_imap_blocks; // i 节点位图所占用的数据块数。
unsigned short s_zmap_blocks; // 逻辑块位图所占用的数据块数。
unsigned short s_firstdatazone; // 第一个数据逻辑块。
unsigned short s_rember_node; //inode铭记节点
// unsigned short s_log_zone_size; // log(数据块数/逻辑块)。(以2 为底)。
unsigned long s_max_size; // 文件最大长度。
// unsigned short s_magic; // 文件系统魔数。
};
struct dir_item
{
char name[14];
unsigned short inode_cnt;
};
struct dir
{
struct dir_item item[BLOCKSIZE/sizeof(struct dir_item)];
};
extern int my_alloc(int fd);
extern int my_free(int fd,int blk_cnt);
extern void set_empty_block(int fd,off_t pos);
extern int my_read(int fd, off_t pos, int whence, const void *buf, size_t n);
extern int my_write(int fd, off_t pos, int whence, const void *buf, size_t n);
extern int free_all_blocks(int fd, struct d_inode *inode);
extern struct d_inode *my_iget(int fd, unsigned short inode_cnt);
extern void my_iput(int fd, struct d_inode *inode);
extern int my_ifree(int fd, struct d_inode *inode);
extern unsigned short my_ialloc(int fd);
extern off_t my_bmap(int fd,struct d_inode *inode,off_t offset);
extern unsigned short my_namei(int fd, char *path);
extern struct dir getDir(int fd,struct d_inode *inode);
extern int getBlockBit(int fd,unsigned short cnt);
extern int getInodeBit(int fd,unsigned short cnt);
extern char *trim(char *str);
extern int sys_open(int fd, char *pathname, unsigned short flags, unsigned short modes);
extern size_t sys_read(int fd, int my_fd, void *buf, size_t nbytes);
extern size_t sys_write(int fd, int my_fd, void *buf, size_t count);
extern off_t sys_lseek(int fd, int my_fd, off_t offset, int whence);
extern void sys_close(int fd, int my_fd);
extern int sys_creat(int fd, char *path, mode_t modes);
extern void sys_unlink(int fd, char *path);
// //// 以下是文件系统操作管理用的函数原型。
// // 将i 节点指定的文件截为0。
// extern void truncate (struct m_inode *inode);
// // 逻辑块(区段,磁盘块)位图操作。取数据块block 在设备上对应的逻辑块号。
// extern int bmap (struct m_inode *inode, int block);
// // 创建数据块block 在设备上对应的逻辑块,并返回在设备上的逻辑块号。
// extern int create_block (struct m_inode *inode, int block);
// // 获取指定路径名的i 节点号。
// extern struct m_inode *namei (const char *pathname);
// // 根据路径名为打开文件操作作准备。
// extern int open_namei (const char *pathname, int flag, int mode,
// struct m_inode **res_inode);
// // 释放一个i 节点(回写入设备)。
// extern void iput (struct m_inode *inode);
// // 从设备读取指定节点号的一个i 节点。
// extern struct m_inode *iget (int dev, int nr);
// // 从i 节点表(inode_table)中获取一个空闲i 节点项。
// extern struct m_inode *get_empty_inode (void);
// // 获取(申请一)管道节点。返回为i 节点指针(如果是NULL 则失败)。
// extern struct m_inode *get_pipe_inode (void);
// // 在哈希表中查找指定的数据块。返回找到块的缓冲头指针。
// extern struct buffer_head *get_hash_table (int dev, int block);
// // 从设备读取指定块(首先会在hash 表中查找)。
// extern struct buffer_head *getblk (int dev, int block);
// // 读/写数据块。
// extern void ll_rw_block (int rw, struct buffer_head *bh);
// // 释放指定缓冲块。
// extern void brelse (struct buffer_head *buf);
// // 读取指定的数据块。
// extern struct buffer_head *bread (int dev, int block);
// // 读4 块缓冲区到指定地址的内存中。
// extern void bread_page (unsigned long addr, int dev, int b[4]);
// // 读取头一个指定的数据块,并标记后续将要读的块。
// extern struct buffer_head *breada (int dev, int block, ...);
// // 向设备dev 申请一个磁盘块(区段,逻辑块)。返回逻辑块号
// extern int new_block (int dev);
// // 释放设备数据区中的逻辑块(区段,磁盘块)block。复位指定逻辑块block 的逻辑块位图比特位。
// extern void free_block (int dev, int block);
// // 为设备dev 建立一个新i 节点,返回i 节点号。
// extern struct m_inode *new_inode (int dev);
// // 释放一个i 节点(删除文件时)。
// extern void free_inode (struct m_inode *inode);
// // 刷新指定设备缓冲区。
// extern int sync_dev (int dev);
// // 读取指定设备的超级块。
// extern struct super_block *get_super (int dev);
// extern int ROOT_DEV;
// // 安装根文件系统。
// extern void mount_root (void);