Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216858
  • 博文数量: 27
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 17:06
文章分类

全部博文(27)

文章存档

2011年(1)

2009年(5)

2008年(21)

我的朋友

分类: LINUX

2008-07-23 18:07:59

在暑假的Linux嵌入式学习中,我们原打算从编写简单的字符驱动开始,逐步深入,但是大家在遇到2.6下linux的驱动模型时卡住了,因为这一块涉及的结构非常之多而且复杂,理清它们的关系看来要耽搁不少时间。在这方面网上的资料也很少,在老师的鼓励下我们决定深入linux内核,把udev文件系统的驱动模型整理出来,理清它们的关系。这对我们是一个挑战,也使我们深入学习的的一个机会,于是我们匆忙上路了。
这周我的任务是理清inode 的结构体:
这里是v2.6.23内核版本的源码:        
大略介绍一下:该结构共有46个字段,按功能可以分为几大部分:基本信息部分,串行管理部分,索引节点同步部分,内存管理部分,磁盘限额管理部分,文件锁操作部分,以及用来操作处理的一组函数。
想了解inode的
请看这里

一、基本信息部分: 
unsigned long           ;//索引节点号:对于每一个inode都有一个序号,经由super block结构和其序号,我们可以很容易的找到这个inode。
;//引用计数器:在内核中,很多的结构都会记录其引用计数,以确保如果某个结构正在使用,它不会被不小心释放掉。

unsigned int
; //硬链接数目
; //所有者标识符
; //组标识符

有关uid_t 和gid_t 类型的详细定义:()
#ifdef CONFIG_UID16
/* This is defined by include/asm-{arch}/posix_types.h */
typedef __kernel_old_uid_t      old_uid_t;
typedef __kernel_old_gid_t      old_gid_t;
#endif /* CONFIG_UID16 */
/* libc5 includes this file to define uid_t, thus uid_t can never change when it is included by non-kernel code * */
#else
typedef __kernel_uid_t          uid_t;
typedef __kernel_gid_t          gid_t;
#endif /* __KERNEL__ */
其中关于
__kernel_old_uid_t和__kernel_uid_t的定义:
typedef unsigned short  
typedef unsigned short ;

//在i386平台下()
typedef unsigned short  __kernel_uid_t;
typedef unsigned short  ;
//在i386平台下()

dev_t i_rdev
; //实设备标识符
有关dev_t类型的详细定义:
typedef __kernel_dev_t          dev_t;()
typedef __u32 __kernel_dev_t;()
typedef unsigned int __u32;//在i386平台下(
)
unsigned long ; //版本号(每次使用后自动递增)
; //文件的字节数:inode所代表的文件大小
有关loff_t类型的详细定义:
typedef __kernel_loff_t         loff_t;()
typedef long long       __kernel_loff_t;//在i386平台下(
)

struct          ; //上次访问文件的时间
struct ; //上次修改文件的时间
struct ; //创建索引节点的时间
struct timespec结构的详细定义:()
#ifndef _STRUCT_TIMESPEC
#define _STRUCT_TIMESPEC *struct timespec {
        time_t  tv_sec;         /* seconds */秒
        long    tv_nsec;        /* nanoseconds */毫微秒
};
#endif
其中关于 time_t 的定义:
typedef __kernel_time_t         time_t;()
关于__kernel_time_t 的定义:
typedef long            __kernel_time_t;//在i386平台下()

usigned int            ; //块的位数:文件在做IO时的区块大小
; //文件的块数:文件所使用的磁盘块数,一个磁盘块为512 byte
有关blkcnt_t类型的详细定义:()
#ifdef CONFIG_LSF
typedef u64 blkcnt_t; //typedef unsigned long long u64;在i386平台下
#else
typedef unsigned long blkcnt_t;
#endif

unsigned short          ; //文件中最后一个块的字节数
;//文件的类型和访问权限

有关umode_t类型的详细定义:()
typedef unsigned short umode_t;//在i386平台下

有关i_mode字段的详细说明:
在i386平台下,i_mode占两个字节,共有16位.
其中15-12位用于保存文件类型(括弧内为八进制):
0001-FIFO文件(001)
0010-字符设备文件(002)
0100—目录文件(004)
0110—块设备文件(006)
1000—常规文件(010)
11-9位保存执行文件时设置的信息:
001——执行时设置用户ID(01)
010——执行时设置组ID(02)
100——对于目录,置受限删除标志。(04)
8-0位表示文件的访问权限:
其中
8-6位表示宿主的权限:
      8-宿主读权限
      7-宿主写权限
      6-宿主执行权限
5-3位表示组员的权限:
      5-组员读权限
      4-组员写权限
      3-组员执行权限
2-0位表示其他人的权限
      2-其他人读权限
      1-其他人写权限
      0-
其他人执行权限

struct       *; //指向超级块对象的指针:inode所属文件系统的超级块
/*这里又要设计另一个庞大的结构超级块,这里不做讨论,有兴趣可以查看相关资料*/
union {
struct *;//如果文件是一个管道则使用它
struct block_device *i_bdev; //指向块设备驱动程序的指针
struct cdev *i_cdev; //指向字符设备驱动程序的指针
 };
int ; //拥有一组此设备号的设备文件的索引
; //索引节点版本号(由某些文件系统使用)
有关__u32类型的详细定义:()
typedef unsigned int __u32//在i386平台下

unsigned long           ;//索引节点的状态标志:可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合
unsigned long ;   /* jiffies of first dirtying */ //索引节点的弄脏时间
unsigned int ; //文件系统的安装标志:记录此inode的参数
atomic_t                i_writecount; //用于写进程的引用计数器
有关atomic_t类型的详细定义:()
typedef struct { int counter; } atomic_t;//在i386平台下

void                    *i_security; //指向索引节点安全结构的指针
void *; /* fs or device private pointer */ //指向私有数据的指针

其中或许还有一些偏差,正在校正中,欢迎指正!
阅读(3073) | 评论(7) | 转发(0) |
0

上一篇:Inode的浅理解

下一篇:inode的串行管理

给主人留下些什么吧!~~

niutao.linux2008-07-27 22:08:04

貌似: struct timespec i_mtime; //上次写文件的时间 struct timespec i_ctime; //上次修改索引节点的时间 是不是写错了? i_mtime是修改时间,i_ctime是创建时间。

niutao.linux2008-07-27 22:01:08

首先你虽然对uid_t和gid_t作了解释,但总终还是没有给出其真正的类型,这里给出: typedef unsigned int __kernel_uid_t; typedef unsigned int __kernel_gid_t; 配合你上面给的有关uid_t 和gid_t 类型的详细定义就可以知道最终两个都是unsigned int类型的。