Linux内核的学习(四)之字符设备驱动

#include <linux/cdev.h>
struct cdev {
    struct kobject kobj;//内核用于管理字符设备驱动,kobject 就是内核里最底层的类,内核里会自动管理此成员,
    struct module *owner://通常设为THIS——MODULE,用于防止驱动在使用中时卸载驱动模块。
    const struct file_operations *ops;//这个结构体是实现用户进程进行open/read/write等操作时,驱动里对应的操作
    struct list_head list;//内核链表节点,内核里自动管理此成员
    dev_t dev;//设备号
    unsigned int count;// 设备个数
};

//struct cdev 类型的一个对象来描述一个字符设备驱动的;

c语言是面向过程的, 内核是有C语言来实现面向对象。但不全是。

/////////////////////

内核提供对cdev对象操作的函数

void cdev_init(struct cdev*, const struct file_operations *);
//初始化cdev对象

struct cdev *cdev_alloc(void);
//动态分配一个cdev对象

int cdev_add(struct cdev *, dev_t unsigned);
//设置cdev对象使用设备号及设备个数,再把cdev对象增加到内核里,让它工作起来

void cdev_del(struct cdev*)
//从内核里移除cdev对象

字符设备驱动实现的基本步骤

1.申请设备号 register_chrdev_region();

2.声明一个cdev的对象
struct cdev mycdev;

 声明一个file_operations 的文件操作对象
 struct file_operations fops = {
            .owner = THIS_MODULE,
            .read = 读函数的地址
            .write = 写函数的地址
            .........

};

3.初始化cdev对象,并把fops对象与cdev对象关联起来。
 cdev_init(&mycdev, &fops); //mycdev.ops = &fops;
    
    mycdev.owner = THIS_MODULE;

4.把cdev对象加入内核里cdev_map(字符设备驱动的哈希表),并指定该驱动对象的设备号
 cdev_add(&mycdev, 设备号, 次设备号的个数);

5. 卸载模块时, 要把设备驱动对象从内核里移除, 并把设备号反注册
    unregister_chrdev_region(..);
    cdev_del(&mycdev);

编译加载驱动模块后,需要用”mknod /dev/设备文件名 c 主设备号 次设备号”来创建设备文件.

mknod /dev/mydev0 c 1234 3344

 

posted on 2017-12-12 20:05  131927  阅读(167)  评论(0)    收藏  举报

导航