fs.h ( File view )

  • By 2010-08-31
  • View(s):24
  • Download(s):2
  • Point(s): 1
			/*
* This file has definitions for some important file table
* structures etc.
*/
/*
* 本文件含有某些重要文件表结构的定义等。
*/

#ifndef _FS_H
#define _FS_H

#include <sys/types.h>		// 类型头文件。定义了基本的系统数据类型。

/* devices are as follows: (same as minix, so we can use the minix
* file system. These are major numbers.)
*
* 0 - unused (nodev)
* 1 - /dev/mem
* 2 - /dev/fd
* 3 - /dev/hd
* 4 - /dev/ttyx
* 5 - /dev/tty
* 6 - /dev/lp
* 7 - unnamed pipes
*/
/*
* 系统所含的设备如下:(与minix 系统的一样,所以我们可以使用minix 的
* 文件系统。以下这些是主设备号。)
*
* 0 - 没有用到(nodev)
* 1 - /dev/mem 内存设备。
* 2 - /dev/fd 软盘设备。
* 3 - /dev/hd 硬盘设备。
* 4 - /dev/ttyx tty 串行终端设备。
* 5 - /dev/tty tty 终端设备。
* 6 - /dev/lp 打印设备。
* 7 - unnamed pipes 没有命名的管道。
*/

#define IS_SEEKABLE(x) ((x)>=1 && (x)<=3)	// 是否是可以寻找定位的设备。

#define READ 0
#define WRITE 1
#define READA 2			/* read-ahead - don't pause */
#define WRITEA 3		/* "write-ahead" - silly, but somewhat useful */

void buffer_init (long buffer_end);

#define MAJOR(a) (((unsigned)(a))>>8)	// 取高字节(主设备号)。
#define MINOR(a) ((a)&0xff)	// 取低字节(次设备号)。

#define NAME_LEN 14		// 名字长度值。
#define ROOT_INO 1		// 根i 节点。

#define I_MAP_SLOTS 8		// i 节点位图槽数。
#define Z_MAP_SLOTS 8		// 逻辑块(区段块)位图槽数。
#define SUPER_MAGIC 0x137F	// 文件系统魔数。

#define NR_OPEN 20		// 打开文件数。
#define NR_INODE 32
#define NR_FILE 64
#define NR_SUPER 8
#define NR_HASH 307
#define NR_BUFFERS nr_buffers
#define BLOCK_SIZE 1024		// 数据块长度。
#define BLOCK_SIZE_BITS 10	// 数据块长度所占比特位数。
#ifndef NULL
#define NULL ((void *) 0)
#endif

// 每个逻辑块可存放的i 节点数。
#define INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct d_inode)))
// 每个逻辑块可存放的目录项数。
#define DIR_ENTRIES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct dir_entry)))

// 管道头、管道尾、管道大小、管道空?、管道满?、管道头指针递增。
#define PIPE_HEAD(inode) ((inode).i_zone[0])
#define PIPE_TAIL(inode) ((inode).i_zone[1])
#define PIPE_SIZE(inode) ((PIPE_HEAD(inode)-PIPE_TAIL(inode))&(PAGE_SIZE-1))
#define PIPE_EMPTY(inode) (PIPE_HEAD(inode)==PIPE_TAIL(inode))
#define PIPE_FULL(inode) (PIPE_SIZE(inode)==(PAGE_SIZE-1))
#define INC_PIPE(head) \
__asm__( "incl %0\n\tandl $4095,%0":: "m" (head))

typedef char buffer_block[BLOCK_SIZE];	// 块缓冲区。

// 缓冲区头数据结构。(极为重要!!!)
// 在程序中常用bh 来表示buffer_head 类型的缩写。
struct buffer_head
{

  char *b_data;			/* pointer to data block (1024 bytes) *///指针。
  unsigned long b_blocknr;	/* block number */// 块号。
  unsigned short b_dev;		/* device (0 = free) */// 数据源的设备号。
  unsigned char b_uptodate;	// 更新标志:表示数据是否已更新。
  unsigned char b_dirt;		/* 0-clean,1-dirty *///修改标志:0 未修改,1 已修改.
  unsigned char b_count;	/* users using this block */// 使用的用户数。
  unsigned char b_lock;		/* 0 - ok, 1 -locked */// 缓冲区是否被锁定。
  struct task_struct *b_wait;	// 指向等待该缓冲区解锁的任务。
  struct buffer_head *b_prev;	// hash 队列上前一块(这四个指针用于缓冲区的管理)。
  struct buffer_head *b_next;	// hash 队列上下一块。
  struct buffer_head *b_prev_free;	// 空闲表上前一块。
  struct buffer_head *b_next_free;	// 空闲表上下一块。

};

// 磁盘上的索引节点(i 节点)数据结构。
struct d_inode
{

  unsigned short i_mode;	// 文件类型和属性(rwx 位)。
  unsigned short i_uid;		// 用户id(文件拥有者标识符)。
  unsigned long i_size;		// 文件大小(字节数)。
  unsigned long i_time;		// 修改时间(自1970.1.1:0 算起,秒)。
  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 m_inode *f_inode;	// 指向对应i 节点。
  off_t f_pos;			// 文件位置(读写偏移值)。

};

// 内存中磁盘超级块结构。
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_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_log_zone_size;	// log(数据块数/逻辑块)。(以2 为底)。
  unsigned long s_max_size;	// 文件最大长度。
  unsigned short s_magic;	// 文件系统魔数。

};

// 文件目录项结构。
struct dir_entry
{

  unsigned short inode;		// i 节点。
  char name[NAME_LEN];		// 文件名。

};

extern struct m_inode inode_table[NR_INODE];	// 定义i 节点表数组(32 项)。
extern struct file file_table[NR_FILE];	// 文件表数组(64 项)。
extern struct super_block super_block[NR_SUPER];	// 超级块数组(8 项)。
extern struct buffer_head *start_buffer;	// 缓冲区起始内存位置。
extern int nr_buffers;		// 缓冲块数。

//// 磁盘操作函数原型。
// 检测驱动器中软盘是否改变。
extern void check_disk_change (int dev);
// 检测指定软驱中软盘更换情况。如果软盘更换了则返回1,否则返回0。
extern int floppy_change (unsigned int nr);
// 设置启动指定驱动器所需等待的时间(设置等待定时器)。
extern int ticks_to_floppy_on (unsigned int dev);
// 启动指定驱动器。
extern void floppy_on (unsigned int dev);
// 关闭指定的软盘驱动器。
extern void floppy_off (unsigned int dev);
//// 以下是文件系统操作管理用的函数原型。
// 将i 节点指定的文件截为0。
extern void truncate (struct m_inode *inode);
// 刷新i 节点信息。
extern void sync_inodes (void);
// 等待指定的i 节点。
extern void wait_on (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 st
...
...
(Not finished, please download and read the complete file)
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 1

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
linux0.00 B0% 04-10-07
<boot>0.00 B04-10-07 15:01
bootsect.s12.49 kB08-01-04 21:38
head.s13.22 kB08-01-04 21:38
setup.s12.42 kB08-01-04 21:38
<fs>0.00 B04-10-07 15:01
bitmap.c8.46 kB02-09-04 13:12
block_dev.c3.95 kB02-09-04 13:12
buffer.c17.71 kB02-09-04 13:12
char_dev.c4.09 kB02-09-04 13:12
exec.c18.90 kB02-09-04 13:12
fcntl.c3.33 kB02-09-04 13:12
file_dev.c4.82 kB02-09-04 13:12
file_table.c209.00 B02-09-04 13:12
inode.c14.92 kB02-09-04 13:12
ioctl.c1.94 kB02-09-04 13:12
Makefile6.80 kB08-01-04 21:45
namei.c37.20 kB02-09-04 13:12
open.c10.00 kB02-09-04 13:12
pipe.c5.42 kB02-09-04 13:12
read_write.c5.86 kB02-09-04 13:12
stat.c2.69 kB02-09-04 13:12
super.c13.57 kB02-09-04 13:12
truncate.c2.46 kB02-09-04 13:12
<include>0.00 B04-10-07 15:01
a.out.h8.22 kB02-09-04 13:14
<asm>0.00 B04-10-07 15:01
io.h772.00 B02-09-04 13:14
memory.h1.03 kB08-01-04 22:13
segment.h2.50 kB02-09-04 13:14
system.h4.08 kB02-09-04 13:14
const.h589.00 B02-09-04 13:14
ctype.h1.68 kB02-09-04 13:14
errno.h2.30 kB02-09-04 13:14
fcntl.h3.30 kB02-09-04 13:14
<linux>0.00 B04-10-07 15:01
config.h2.16 kB02-09-04 13:14
fs.h9.72 kB02-09-04 13:14
hdreg.h2.94 kB02-09-04 13:14
head.h760.00 B02-09-04 13:14
kernel.h1.44 kB02-09-04 13:14
mm.h473.00 B02-09-04 13:14
sched.h13.25 kB02-09-04 13:14
sys.h5.41 kB02-09-04 13:14
tty.h3.93 kB02-09-04 13:14
signal.h4.01 kB02-09-04 13:14
stdarg.h1.77 kB02-09-04 13:14
stddef.h378.00 B02-09-04 13:14
string.h21.75 kB02-09-04 13:14
<sys>0.00 B04-10-07 15:01
stat.h2.37 kB02-09-04 13:14
times.h377.00 B02-09-04 13:14
types.h1.10 kB02-09-04 13:14
utsname.h423.00 B02-09-04 13:14
wait.h1.48 kB02-09-04 13:14
termios.h13.58 kB02-09-04 13:14
time.h1.81 kB02-09-04 13:14
unistd.h9.21 kB02-09-04 13:14
utime.h392.00 B02-09-04 13:14
<init>0.00 B04-10-07 15:01
main.c12.52 kB02-09-04 13:12
<kernel>0.00 B04-10-07 15:01
asm.s5.10 kB08-01-04 22:48
<blk_drv>0.00 B04-10-07 15:01
blk.h5.69 kB02-09-04 13:14
floppy.c23.49 kB02-09-04 13:12
hd.c17.14 kB02-09-04 13:12
ll_rw_blk.c7.59 kB02-09-04 13:12
Makefile4.25 kB08-01-04 22:53
ramdisk.c6.13 kB02-09-04 13:12
<chr_drv>0.00 B04-10-07 15:01
console.c30.91 kB02-09-04 13:12
keyboard.S21.04 kB08-01-04 22:59
Makefile4.81 kB08-01-04 22:59
rs_io.s5.75 kB08-01-04 22:59
serial.c2.91 kB02-09-04 13:12
tty_io.c18.40 kB02-09-04 13:12
tty_ioctl.c10.70 kB02-09-04 13:12
exit.c8.08 kB02-09-04 13:12
fork.c6.78 kB15-07-07 22:10
<math>0.00 B04-10-07 15:01
Makefile3.21 kB08-01-04 23:01
math_emulate.c2.08 kB02-09-04 13:12
mktime.c2.72 kB02-09-04 13:12
panic.c952.00 B02-09-04 13:12
printk.c1.75 kB02-09-04 13:12
sched.c18.57 kB16-07-07 21:23
signal.c5.61 kB02-09-04 13:12
sys.c7.62 kB02-09-04 13:12
system_call.s12.53 kB08-01-04 22:48
traps.c8.29 kB04-10-07 14:57
vsprintf.c9.96 kB02-09-04 13:12
<lib>0.00 B04-10-07 15:01
close.c397.00 B02-09-04 13:12
ctype.c1.72 kB02-09-04 13:12
dup.c401.00 B02-09-04 13:12
errno.c66.00 B02-09-04 13:12
execve.c607.00 B02-09-04 13:12
Makefile4.83 kB08-01-04 22:30
malloc.c13.50 kB02-09-04 13:12
open.c1.22 kB02-09-04 13:12
setsid.c382.00 B02-09-04 13:12
string.c199.00 B02-09-04 13:12
wait.c774.00 B02-09-04 13:12
write.c545.00 B02-09-04 13:12
_exit.c616.00 B02-09-04 13:12
Makefile8.58 kB08-01-04 22:21
<mm>0.00 B04-10-07 15:01
Makefile2.91 kB08-01-04 22:34
memory.c25.10 kB02-09-04 13:12
page.s842.00 B08-01-04 22:34
<tools>0.00 B04-10-07 15:01
build.c8.12 kB02-09-04 13:12
...
Sponsored links

fs.h (286.77 kB)

Need 1 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D