linux 内核 驱动

首先 :  

1. 

     创建设备  

           //分配cdev结构体
    if (globalmem_major)
        //手动分配
        ret = register_chrdev_region(devno, 1, "globalmem");
    else {
        //自动分配
        ret = alloc_chrdev_region(&devno, 0, 1, "globalmem");
        globalmem_major = MAJOR(devno);
    }

       globalmem   提供给上层使用 。   

 2   。

       创建内核设备 

struct globalmem_dev {
    struct cdev cdev;
    unsigned char mem[GLOBALMEM_SIZE];
    struct class *lkm_memory_class;
};

         globalmem_devp = kzalloc(sizeof(struct globalmem_dev), GFP_KERNEL);


    int err, devno = MKDEV(globalmem_major, index);
    //对cdev结构体设置file_operations结构体
    cdev_init(&dev->cdev, &globalmem_fops);
    dev->cdev.owner = THIS_MODULE;
    //将cdev结构体注册入系统,系统能够识别调用当前cdev
    err = cdev_add(&dev->cdev, devno, 1);
    if (err)
        printk(KERN_NOTICE "Error %d adding globalmem%d", err, index);
    
    //实现创建文件系统节点
    dev->lkm_memory_class = class_create(THIS_MODULE, "globalmem");
    if (IS_ERR(dev->lkm_memory_class))
        return PTR_ERR(dev->lkm_memory_class);
    device_create(dev->lkm_memory_class, NULL,MKDEV(globalmem_major,0),NULL,"globalmem");

struct cdev {
    struct kobject kobj;
    struct module *owner;
    const struct file_operations *ops;
    struct list_head list;
    dev_t dev;
    unsigned int count;
} __randomize_layout;
 

发布了5 篇原创文章 · 获赞 0 · 访问量 90

猜你喜欢

转载自blog.csdn.net/tan1666/article/details/103182272