Skip to content

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