免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1210 | 回复: 0
打印 上一主题 下一主题

inode的基本信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 18:07 |只看该作者 |倒序浏览

                                                                                                                                                                                                                                                               
                                                在暑假的Linux嵌入式学习中,我们原打算从编写简单的字符驱动开始,逐步深入,但是大家在遇到2.6下linux的驱动模型时卡住了,因为这一块涉及的结构非常之多而且复杂,理清它们的关系看来要耽搁不少时间。在这方面网上的资料也很少,在老师的鼓励下我们决定深入linux内核,把udev文件系统的驱动模型整理出来,理清它们的关系。这对我们是一个挑战,也使我们深入学习的的一个机会,于是我们匆忙上路了。
这周我的任务是理清inode 的结构体:
这里是v2.6.23内核版本的源码:         
大略介绍一下:该结构共有46个字段,按功能可以分为几大部分:基本信息部分,串行管理部分,索引节点同步部分,内存管理部分,磁盘限额管理部分,文件锁操作部分,以及用来操作处理的一组函数。
想了解inode的
inode的详细结构
,请看这里。
一、基本信息部分:
unsigned long           
i_ino
;//索引节点号:对于每一个inode都有一个序号,经由super block结构和其序号,我们可以很容易的找到这个inode。
atomic_t
               
i_count
;//引用计数器:在内核中,很多的结构都会记录其引用计数,以确保如果某个结构正在使用,它不会被不小心释放掉。
unsigned int            
i_nlink
; //硬链接数目
uid_t
                  
i_uid
; //所有者标识符
gid_t
                  
i_gid
; //组标识符
有关uid_t 和gid_t 类型的详细定义:(
摘自linux/include/linux/types.h
)
#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_uid32_t和__kernel_uid_t的定义:
typedef unsigned int    __kernel_uid32_t;//在i386平台下(
摘自  linux/include/asm-i386/posix_types.h
[/url]
)
typedef unsigned short  __kernel_uid_t;//在i386平台下(
[url=http://lxr.linux.no/linux/include/asm-i386/posix_types.h#L16]摘自  linux/include/asm-i386/posix_types.h

)
dev_t
                  
i_rdev
; //实设备标识符
有关dev_t类型的详细定义:
typedef __kernel_dev_t          dev_t;(
摘自linux/include/linux/types.h
)
typedef __u32 __kernel_dev_t;(
摘自linux/include/linux/types.h
)
typedef unsigned int __u32;//在i386平台下(
摘自linux/include/asm-i386/types.h
)
unsigned long           
i_version
; //版本号(每次使用后自动递增)
loff_t
                  
i_size
; //文件的字节数:inode所代表的文件大小
有关loff_t类型的详细定义:
typedef __kernel_loff_t         loff_t;(
摘自linux/include/linux/types.h
)
typedef long long       __kernel_loff_t;//在i386平台下(
摘自linux/include/asm-i386/types.h
)
struct
timespec
         
i_atime
; //上次访问文件的时间
struct
timespec
         
i_mtime
; //上次写文件的时间
struct
timespec
         
i_ctime
; //上次修改索引节点的时间关struct timespec结构的详细定义:(
摘自linux/include/linux/time.h
)
#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;(
摘自linux/include/linux/types.h
)
关于__kernel_time_t 的定义:
typedef long            __kernel_time_t;//在i386平台下(
摘自linux/include/asm-i386/types.h
)
nsigned int            
i_blkbits
; //块的位数:文件在做IO时的区块大小
blkcnt_t
               
i_blocks
; //文件的块数:文件所使用的磁盘块数,一个磁盘块为512 byte
有关blkcnt_t类型的详细定义:(
摘自linux/include/linux/types.h
)
#ifdef CONFIG_LSF
typedef u64 blkcnt_t; //typedef unsigned long long u64;在i386平台下
#else
typedef unsigned long blkcnt_t;
#endif
unsigned short         
i_bytes
; //文件中最后一个块的字节数
umode_t
                 
i_mode
;//文件的类型和访问权限
有关umode_t类型的详细定义:(
摘自linux/include/asm-i386/types.h
)
typedef unsigned short umode_t;//在i386平台下
struct
super_block
      *
i_sb
; //指向超级块对象的指针:inode所属文件系统的超级块
/*这里又要设计另一个庞大的结构超级块,这里不做讨论,有兴趣可以查看相关资料*/
union {
            struct
pipe_inode_info
  *
i_pipe
;//如果文件是一个管道则使用它
            struct
block_device
     *
i_bdev
; //指向块设备驱动程序的指针
             struct
cdev
             *
i_cdev
; //指向字符设备驱动程序的指针
};
int                     
i_cindex
; //拥有一组此设备号的设备文件的索引
__u32
                  
i_generation
; //索引节点版本号(由某些文件系统使用)
有关__u32类型的详细定义:(
摘自linux/include/asm-i386/types.h
)
typedef unsigned int __u32//在i386平台下
unsigned long           
i_state
;//索引节点的状态标志:可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合
unsigned long           
dirtied_when
;   /* jiffies of first dirtying */ //索引节点的弄脏时间
unsigned int            
i_flags
; //文件系统的安装标志:记录此inode的参数    atomic_t                i_writecount; //用于写进程的引用计数器
有关atomic_t类型的详细定义:(
摘自linux/include/asm-i386/types.h
)
typedef struct { int counter; } atomic_t;//在i386平台下
void                    *
i_security
; //指向索引节点安全结构的指针void                    *
i_private
; /* fs or device private pointer */ //指向私有数据的指针
其中或许还有一些偏差,正在校正中,欢迎指正!
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73569/showart_1090114.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP