[国嵌攻略][118][混杂设备模型]

混杂设备概念

在linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链,对设备访问时内核根据次设备号查找到相应的混杂设备。

 

设备描述

Linux中使用struct miscdevice来描述一个混杂设备。

struct miscdevice{

    int minor;                            //次设备号

    const char *name;                     //设备名

    const struct file_operations *fops;   //文件操作

    struct list_head list;

    struct device *parent;

    struct device *this_device;

};

 

设备注册

Linux系统中使用misc_register函数来注册一个混杂设备驱动。

int misc_register(struct miscdevice (misc)

 

混杂设备驱动

1.初始化miscdevivce

1.1.minor

1.2.name

1.3.fops

2.注册miscdevice

2.1.misc_register

 

头文件

<linux/miscdevice.h>

struct miscdevice   //混杂设备描述

misc_register()     //混杂设备注册

misc_deregister()   //混杂设备注销

 

keydev.c

复制代码
/********************************************************************
*头文件
*********************************************************************/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>

/********************************************************************
*设备方法
*********************************************************************/
//打开设备
int key_open(struct inode *node, struct file *filp){
    return 0;
}

//关闭设备
int key_close(struct inode *node, struct file *filp){
    return 0;
}

//设备方法
struct file_operations key_fops = {
    .open      = key_open,
    .release   = key_close
};

/********************************************************************
*模块安装
*********************************************************************/
struct miscdevice misdev = {
    .minor = 200,        //次设备号
    .name  = "mykey",    //设备名称
    .fops  = &key_fops   //设备方法
};

//安装模块
static int led_init(){
    //注册混杂设备
    misc_register(&misdev);
    
    return 0;
}

//卸载模块
static void led_exit(){
    //注销混杂设备
    misc_deregister(&misdev);
}

/********************************************************************
*模块声明
*********************************************************************/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("D");
MODULE_DESCRIPTION("");
MODULE_VERSION("v1.0");

module_init(key_init);
module_exit(key_exit);
复制代码

 

posted @   盛夏夜  阅读(299)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示