Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8826
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-04 19:57
文章分类
文章存档

2013年(3)

我的朋友
最近访客

分类: 嵌入式

2013-08-17 21:34:08

字符设备驱动结构

一、cdev结构体

在 Linux 2.6 内核中使用cdev结构体描述字符设备,cdev结构体的定义:

struct cdev
 {
 struct kobject kobj; /* 内嵌的kobject对象*/
 struct module *owner; /*所属模块*/
 struct file_operations *ops; /*文件操作结构体*/
 struct list_head list;
 dev_t dev; /*设备号*/
 unsigned int count;
 };
1、cdev结构体的dev_t 成员定义了设备号,为32 位,其中高12 位为主设备号,低
20 位为次设备号。使用下列宏可以从dev_t获得主设备号和次设备号。
MAJOR(dev_t dev)
MINOR(dev_t dev)
2、cdev 结构体的另一个重要成员file_operations 定义了字符设备驱动提供给虚拟文件系统的接口函数
3、Linux 2.6 内核提供了一组函数用于操作cdev结构体,如下所示:
    void cdev_init(struct cdev *, struct file_operations *);
        用于于初始化cdev 的成员,并建立cdev 和file_operations 之间的连
    struct cdev *cdev_alloc(void); 动态申请一个cdev内存
    void cdev_put(struct cdev *p);
    int cdev_add(struct cdev *, dev_t, unsigned) 和 void cdev_del(struct cdev *);
        分别向系统添加和删除一个cdev,完成字符设备的注册和注销
二、分配和释放设备号
        在调用cdev_add() 函数向系统注册字符设备之前, 应首先调用register_chrdev_region()或alloc_chrdev_region()函数向系统申请设备号。
        
register_chrdev_region() 函数用于已知起始设备的设备号的情况;而alloc_chrdev_region()用于设备号未知,向系统动态申请未被占用的设备号的情况。
        在调用cdev_del() 函数从系统注销字符设备之后,unregister_chrdev_region()应该被调用以释放原先申请的设备号。
三、file_operations结构体
        file_operations结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux 的open()、write()、read()、close()等系统调用时最终被调用。

Linux字符设备驱动的组成

1.字符设备驱动模块加载与卸载函数
       在字符设备驱动模块加载函数中应该实现设备号的申请和cdev的注册,而在卸载函数中应实现设备号的释放和cdev的注销。工程师通常习惯将设备定义为一个设备相关的结构体,其包含该设备所涉及的cdev、私有数据及信号量等信息。
2.字符设备驱动的file_operations 结构体中成员函数
        file_operations 结构体中成员函数是字符设备驱动与内核的接口,是用户空间对Linux 进行系统调用最终的落实者。大多数字符设备驱动会实现read()、write()和ioctl()函数。

        





阅读(1055) | 评论(0) | 转发(0) |
0

上一篇:嵌入式linux文件系统与根文件系统

下一篇:没有了

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