当前位置: 首页 > news >正文

易语言做网站客户端/免费代理上网网站

易语言做网站客户端,免费代理上网网站,反网站搭建一条龙,如何做视频网站旗下账号上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。第一种是使用mknod手工创建:mknod filename type major minor第二种是自动创建设备节点:利用udev(mdev)来实现设备文…

      上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。

第一种是使用mknod手工创建:mknod filename type major minor

第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。

      具体udev相关知识这里不详细阐述,可以移步Linux 文件系统与设备文件系统 —— udev 设备文件系统,这里主要讲使用方法。

     

    在驱动用加入对udev 的支持主要做的就是:在驱动初始化的代码里调用class_create(...)为该设备创建一个class,再为每个设备调用device_create(...)创建对应的设备

    内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。

     这样,加载模块的时候,用户空间中的udev会自动响应 device_create()函数,去/sysfs下寻找对应的类从而创建设备节点。


下面是两个函数的解析:

1、class_create(...) 函数

功能:创建一个类;

下面是具体定义:

#define class_create(owner, name)		\
({						\static struct lock_class_key __key;	\__class_create(owner, name, &__key);	\
})

owner:THIS_MODULE
name  : 名字

__class_create(owner, name, &__key)源代码如下:
struct class *__class_create(struct module *owner, const char *name,struct lock_class_key *key)
{struct class *cls;int retval;cls = kzalloc(sizeof(*cls), GFP_KERNEL);if (!cls) {retval = -ENOMEM;goto error;}cls->name = name;cls->owner = owner;cls->class_release = class_create_release;retval = __class_register(cls, key);if (retval)goto error;return cls;error:kfree(cls);return ERR_PTR(retval);
}
EXPORT_SYMBOL_GPL(__class_create);

销毁函数:void class_destroy(struct class *cls)

void class_destroy(struct class *cls)
{if ((cls == NULL) || (IS_ERR(cls)))return;class_unregister(cls);
}

2、device_create(...) 函数

struct device *device_create(struct class *class, struct device *parent,
                 dev_t devt, void *drvdata, const char *fmt, ...)

功能:创建一个字符设备文件

参数:

      struct class *class  :类
      struct device *parent:NULL
     dev_t devt  :设备号
     void *drvdata  :null、
     const char *fmt  :名字

返回:

    struct device *

下面是源码解析:

struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
{va_list vargs;struct device *dev;va_start(vargs, fmt);dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);va_end(vargs);return dev;
}

device_create_vargs(class, parent, devt, drvdata, fmt, vargs)解析如下:

struct device *device_create_vargs(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt,va_list args)
{return device_create_groups_vargs(class, parent, devt, drvdata, NULL,fmt, args);
}
现在就不继续往下跟了,大家可以继续往下跟;


下面是一个实例:

hello.c

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>static int major = 250;
static int minor=0;
static dev_t devno;
static struct class *cls;
static struct device *test_device;static int hello_open (struct inode *inode, struct file *filep)
{printk("hello_open \n");return 0;
}
static struct file_operations hello_ops=
{.open = hello_open,
};static int hello_init(void)
{int ret;	printk("hello_init \n");devno = MKDEV(major,minor);ret = register_chrdev(major,"hello",&hello_ops);cls = class_create(THIS_MODULE, "myclass");if(IS_ERR(cls)){unregister_chrdev(major,"hello");return -EBUSY;}test_device = device_create(cls,NULL,devno,NULL,"hello");//mknod /dev/helloif(IS_ERR(test_device)){class_destroy(cls);unregister_chrdev(major,"hello");return -EBUSY;}	return 0;
}
static void hello_exit(void)
{device_destroy(cls,devno);class_destroy(cls);	unregister_chrdev(major,"hello");printk("hello_exit \n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

test.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>main()
{int fd;fd = open("/dev/hello",O_RDWR);if(fd<0){perror("open fail \n");return ;}close(fd);
}

makefile

ifneq  ($(KERNELRELEASE),)
obj-m:=hello.o
$(info "2nd")
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:$(info "1st")make -C $(KDIR) M=$(PWD) modules
clean:rm -f *.ko *.o *.symvers *.mod.c *.mod.o *.order
endif

下面可以看几个class几个名字的对应关系:




转载自:https://blog.csdn.net/zqixiao_09/article/details/50849735


http://www.jmfq.cn/news/5194189.html

相关文章:

  • 站长论坛/软文接单平台
  • 建筑工程网络图片/aso优化费用
  • 怎么用云主机做网站/淘宝关键词优化怎么弄
  • 合肥百度 网站建设/代发百度首页排名
  • 益阳网站建设公司/重庆森林在线观看
  • 企业做网站有发展么/长春今日头条新闻
  • 铁岭市网站建设公司/互联网推广渠道有哪些
  • wordpress 佛系汉化组/公众号排名优化软件
  • 王爷的疯狂绝望/郑州百度关键词seo
  • 网站建设端口/如何推广公司
  • 手机好在百度做网站吗/51网站统计
  • 成都市武侯区建设局门户网站/优秀软文范例100字
  • 域名备案 个人 网站基本信息查询/山东网站建设
  • 杭州公司招聘/seo网站内容优化有哪些
  • 洛阳霞光营销型网站/seo综合查询站长工具
  • 网站备案如何转移/正规排名网站推广公司
  • 做网站反链/cnn头条新闻
  • 建什么网站可以赚钱/关键词优化搜索引擎
  • 跑腿网站开发/搜索引擎优化排名培训
  • 做网站开发的电话销售话术/百度怎么做自己的网页
  • 网站清除数据库/网络营销服务的特点有哪些
  • 做暧暧视频免费视频网站/链接购买平台
  • 网站开发与/东莞网站制作推广公司
  • 中企动力做网站行吗/竞价推广代运营企业
  • 专业网站开发/亚马逊查关键词搜索量的工具
  • 武汉网站建设S小蝌蚪互联/seo整站优化多少钱
  • dreamweaver教程做网站/平台宣传推广方案
  • 企业网站怎么做排名/seo网站权重
  • 郑州网站建设公司排行/百度官方推广
  • 公司网站可以不备案吗/友链是什么