内核用inode结构在内部表示文件,因此它和file结构不同,后者表示打开的文件描述符。对单个文件,可能会有许多个表示打开的文件描述符的file结构,但它们都指向单个inode结构。
inode结构中包含了大量有关文件的信息。
该结构定义在<linux/fs.h>中。
作为常规,只有下面两个字段对编写驱动程序代码有用:
dev_t i_rdev;
对表示设备文件的inode结构,该字段包含了真正的设备编号。
struct cdev *i_cdev;
struct cdev是表示字符设备的内核的内部结构。当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针。
i_cdev的类型在2.5开发系列版本中发生了变化,这破坏了大量驱动程序代码的兼容性。为了鼓励编写可移植性更强的代码,内核开发者增加了两个新的宏,可用来从一个inode中获得主设备号和次设备号:
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
为了防止因为类似的改变而出现问题,我们应该使用上述宏,而不是直接操作i_rdev。
/*
* Keep mostly read-only and often accessed (especially for
* the RCU path lookup and 'stat' data) fields at the beginning
* of the 'struct inode'
*/
struct inode {
umode_t i_mode;
unsigned short i_opflags;
kuid_t i_uid;
kgi