Appearance
file.h
TIP
在 xv6 中,文件描述符是一个整数,它作为进程打开文件表的索引。 每个进程都维护着自己独立的打开文件表。 每个打开的文件(由 struct file 表示)都具有一个类型(例如:管道、inode、设备), 如果是 inode 类型,则还会关联一个 i-node,并记录当前的读/写偏移量。 此外,每个打开的文件都维护一个引用计数,这对于支持 fork() 系统调用(即复制文件描述符)至关重要。 struct file 结构体代表一个已打开的文件。
struct file {TIP
文件类型,可以是以下几种之一: FD_NONE: 未使用 FD_PIPE: 管道 FD_INODE: 普通文件或目录 FD_DEVICE: 设备
enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE } type;
int ref;
char readable;
char writable;
struct pipe *pipe;
struct inode *ip;
uint off;
short major;
};
TIP
从一个 32 位的设备号中提取 16 位的major(主)设备号
#define major(dev) ((dev) >> 16 & 0xFFFF)TIP
从一个 32 位的设备号中提取 16 位的minor(次)设备号
#define minor(dev) ((dev) & 0xFFFF)TIP
将 16 位的 major 和 16 位的 minor 设备号合并成一个 32 位的设备号
#define mkdev(m,n) ((uint)((m)<<16| (n)))
TIP
inode 在内存中的表示。 它与磁盘上的 inode 结构(struct dinode)相对应,是磁盘 inode 的一个缓存。
struct inode {
uint dev;
uint inum;
int ref;
struct sleeplock lock;
int valid;
TIP
以下字段是磁盘上 struct dinode 的一个拷贝
short type;
short major;
short minor;
short nlink;
uint size;
uint addrs[NDIRECT+1];
};
TIP
设备驱动程序切换表。 通过主设备号索引,可以找到对应的读写函数。
struct devsw {
int (*read)(int, uint64, int);
int (*write)(int, uint64, int);
};
extern struct devsw devsw[];
#define CONSOLE 1