Chinaunix首页 | 论坛 | 博客
  • 博客访问: 938965
  • 博文数量: 403
  • 博客积分: 27
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-25 22:20
文章分类

全部博文(403)

文章存档

2016年(3)

2015年(16)

2014年(163)

2013年(222)

分类: LINUX

2014-04-09 14:04:04

Linux驱动开发庖丁解牛之三

——揭开字符设备驱动程序的面纱

By:dreamice 2008-11-23

1.写在前面的话

我们知道,在Linux设备驱动开发中,包括三大设备类:字符设备,块设备和网络设备。而字符设备,作为最简单的设备类,为此,我们将从最简单的字符设备开始,走进Linux驱动程序设计的神秘殿堂。

——我们已经踏上了真正的设备驱动开发的道路了!

有志者,事竟成。付出越多,而上苍定会以同等的收获回馈于你,当然,最重要的一点是:我们必须走上正确的道路,做正确的付出。开始吧……

参考书目:

Linux Device Driver》第三版

Understanding the linux kernel》第三版

Linux设备驱动开发详解》

 

2.必备之“砖”

盖大楼,得预先准备好砖头。同样的道理,要写好驱动程序,我们也必须准备好自己的“砖头”,拿好这些砖头,便会真正如庖丁解牛般,游刃于Linux驱动程序设计的神奇艺术之中。

Linux的设计之初,曾提出:一切皆文件,如果一个东西不是文件,那就是进程。由此可见,文件的概念在Linux系统中可谓是根深蒂固,以至于它深入到对驱动程序的控制,这也是情理之中的事。

下图描述了Linux系统中虚拟文件系统和进程之间的关系:

图表 1进程和文件系统的关系

在上图中,我们看到了ProcessFile objectdentry objectinode object以及Sperblock object等概念。Process就是指一个特定的进程,而File obeject对应于进程打开的一个文件;dentry object描述了一个目录项;inode object则对应于磁盘上一个特定的文件;Sperblock object描述了文件系统的相关信息。从这个图中,可以看到进程到磁盘上一个文件实体的路径及对应关系。下面,我们一次看看这些实体结构在内核中的定义。

2.1 File object

File结构代表一个打开的文件,系统中每个打开的文件,在内核空间都对应一个file结构。它由内核在调用open时创建,并传递给在该文件上操作的所有函数,直到最后的close函数。在文件的所有实例都被关闭以后,内核才会释放这个结构。

在内核中,通常以filp来代表指向file结构的指针。File结构的详细定义如下:

//linux/fs.h

779 struct file {

 780         /*

 781          * fu_list becomes invalid after file_free is called and queued via

 782          * fu_rcuhead for RCU freeing

 783          */

 784         union {

 785                 struct list_head        fu_list;

 786                 struct rcu_head         fu_rcuhead;

 787         } f_u;

 788         struct path             f_path;

 789 #define f_dentry        f_path.dentry

 790 #define f_vfsmnt        f_path.mnt

 791         const struct file_operations    *f_op; //与文件操作相关的函数指针结构

 792         atomic_t                f_count;

 793         unsigned int            f_flags;

 794         mode_t                  f_mode;

 795         loff_t                  f_pos;

 796         struct fown_struct      f_owner;

 797         unsigned int            f_uid, f_gid;

 798         struct file_ra_state    f_ra;

 799

 800         u64                     f_version;

 801 #ifdef CONFIG_SECURITY

 802         void                    *f_security;

803 #endif

 804         /* needed for tty driver, and maybe others */

 805         void                    *private_data;

 806

 807 #ifdef CONFIG_EPOLL

 808         /* Used by fs/eventpoll.c to link all the hooks to this file */

 809         struct list_head        f_ep_links;

 810         spinlock_t              f_ep_lock;

 811 #endif /* #ifdef CONFIG_EPOLL */

 812         struct address_space    *f_mapping;

 813 };

 

1166 /*

1167  * NOTE:

1168  * read, write, poll, fsync, readv, writev, unlocked_ioctl and compat_ioctl

1169  * can be called without the big kernel lock held in all filesystems.

1170  */

1171 struct file_operations {

1172         struct module *owner;

1173         loff_t (*llseek) (struct file *, loff_t, int);

1174         ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

1175         ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

1176         ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

1177         ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

1178         int (*readdir) (struct file *, void *, filldir_t);

1179         unsigned int (*poll) (struct file *, struct poll_table_struct *);

1180         int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

1181         long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

1182         long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

1183         int (*mmap) (struct file *, struct vm_area_struct *);

1184         int (*open) (struct inode *, struct file *);

1185         int (*flush) (struct file *, fl_owner_t id);

1186         int (*release) (struct inode *, struct file *);

1187         int (*fsync) (struct file *, struct dentry *, int datasync);

1188         int (*aio_fsync) (struct kiocb *, int datasync);

1189         int (*fasync) (int, struct file *, int);

1190         int (*lock) (struct file *, int, struct file_lock *);

1191         ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

1192         unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

1193         int (*check_flags)(int);

1194         int (*dir_notify)(struct file *filp, unsigned long arg);

1195         int (*flock) (struct file *, int, struct file_lock *);

1196         ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

1197         ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

1198         int (*setlease)(struct file *, long, struct file_lock **);

1199 };

其中,蓝色字体标出部分,为与驱动程序最为密切的部分。由于很多书中都对这些结构体做了详细的阐述,这里就不再赘述了。

 

2.2 inode object

内核用inode结构在内部表示文件,它和file结构的不同之处在于:file表示打开的文件描述符,对单个文件,可能有多个表示打开的文件描述符的file结构,但他们都指向同一个inode结构。

Inode结构的详细定义如下:

593 struct inode {

 594         struct hlist_node       i_hash;

 595         struct list_head        i_list;

 596         struct list_head        i_sb_list;

 597         struct list_head        i_dentry;

 598         unsigned long           i_ino;

 599         atomic_t                i_count;

 600         unsigned int            i_nlink;

 601         uid_t                   i_uid;

 602         gid_t                   i_gid;

 603         dev_t                   i_rdev;

 604         u64                     i_version;

 605         loff_t                  i_size;

 606 #ifdef __NEED_I_SIZE_ORDERED

 607         seqcount_t              i_size_seqcount;

 608 #endif

 609         struct timespec         i_atime;

 610         struct timespec         i_mtime;

 611         struct timespec         i_ctime;

 612         unsigned int            i_blkbits;

 613         blkcnt_t                i_blocks;

 614         unsigned short          i_bytes;

 615         umode_t                 i_mode;

 616         spinlock_t              i_lock; /* i_blocks, i_bytes, maybe i_size */

 617         struct mutex            i_mutex;

 618         struct rw_semaphore     i_alloc_sem;

 619         const struct inode_operations   *i_op;//inode操作函数集合

 620         const struct file_operations    *i_fop; /* former ->i_op->default_file_ops */

 621         struct super_block      *i_sb;

 622         struct file_lock        *i_flock;

 623         struct address_space    *i_mapping;

 624         struct address_space    i_data;

 625 #ifdef CONFIG_QUOTA

 626         struct dquot            *i_dquot[MAXQUOTAS];

 627 #endif

 628         struct list_head        i_devices;

 629         union {

 630                 struct pipe_inode_info  *i_pipe;

 631                 struct block_device     *i_bdev;

 632                 struct cdev             *i_cdev;

 633         };

 634         int                     i_cindex;

 635

 636         __u32                   i_generation;

 637

638 #ifdef CONFIG_DNOTIFY

 639         unsigned long           i_dnotify_mask; /* Directory notify events */

 640         struct dnotify_struct   *i_dnotify; /* for directory notifications */

 641 #endif

 642

 643 #ifdef CONFIG_INOTIFY

 644         struct list_head        inotify_watches; /* watches on this inode */

 645         struct mutex            inotify_mutex;  /* protects the watches list */

 646 #endif

 647

 648         unsigned long           i_state;

 649         unsigned long           dirtied_when;   /* jiffies of first dirtying */

 650

 651         unsigned int            i_flags;

 652

 653         atomic_t                i_writecount;

 654 #ifdef CONFIG_SECURITY

 655         void                    *i_security;

 656 #endif

 657         void                    *i_private; /* fs or device private pointer */

 658 };

2.3 Super block object

Super block object对应于一个特定的文件系统,通常对应于存放在磁盘扇区中的文件系统超级块或文件系统控制块,而对于非基于文件系统的文件,他们会在使用现场创建超级块,并将其保存到内存中。

一下是结构体的详细描述:

981 struct super_block {

 982         struct list_head        s_list;         /* Keep this first */

 983         dev_t                   s_dev;          /* search index; _not_ kdev_t */

 984         unsigned long           s_blocksize;

 985         unsigned char           s_blocksize_bits;

 986         unsigned char           s_dirt;

 987         unsigned long long      s_maxbytes;     /* Max file size */

 988         struct file_system_type *s_type;

 989         const struct super_operations   *s_op;

 990         struct dquot_operations *dq_op;

 991         struct quotactl_ops     *s_qcop;

 992         const struct export_operations *s_export_op;

 993         unsigned long           s_flags;

 994         unsigned long           s_magic;

 995         struct dentry           *s_root;

 996         struct rw_semaphore     s_umount;

 997         struct mutex            s_lock;

 998         int                     s_count;

 999         int                     s_syncing;

1000         int                     s_need_sync_fs;

1001         atomic_t                s_active;

1002 #ifdef CONFIG_SECURITY

1003         void                    *s_security;

1004 #endif

1005         struct xattr_handler    **s_xattr;

1006

1007         struct list_head        s_inodes;       /* all inodes */

1008         struct list_head        s_dirty;        /* dirty inodes */

1009         struct list_head        s_io;           /* parked for writeback */

1010         struct list_head        s_more_io;      /* parked for more writeback */

1011         struct hlist_head       s_anon;         /* anonymous dentries for (nfs) exporting */

1012         struct list_head        s_files;

1013

1014         struct block_device     *s_bdev;

1015         struct mtd_info         *s_mtd;

1016         struct list_head        s_instances;

1017         struct quota_info       s_dquot;        /* Diskquota specific options */

1018

1019         int                     s_frozen;

1020         wait_queue_head_t       s_wait_unfrozen;

1021

1022         char s_id[32];                          /* Informational name */

1023

1024         void                    *s_fs_info;     /* Filesystem private info */

1025

1026         /*

1027          * The next field is for VFS *only*. No filesystems have any business

1028          * even looking at it. You had been warned.

1029          */

1030         struct mutex s_vfs_rename_mutex;        /* Kludge */

1031

1032         /* Granularity of c/m/atime in ns.

1033            Cannot be worse than a second */

1034         u32                s_time_gran;

1035

1036         /*

1037          * Filesystem subtype.  If non-empty the filesystem type field

1038          * in /proc/mounts will be "type.subtype"

阅读(867) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~