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

服装类的网站建设竞价排名什么意思

服装类的网站建设,竞价排名什么意思,外国黄冈网站推广软件,沧州做英文网站哪家公司好目录 一、起源 二、新方案 2.1 sysfs: 2.2 uevent 三、代码中自动mknod 四、实例 一、起源 仅devfs,导致开发不方便以及一些功能难以支持:(硬编) 1. 热插拔(插上usb设备就立马能安装驱动) 2. 不支持…

目录

一、起源

二、新方案

2.1 sysfs:

2.2 uevent

三、代码中自动mknod

四、实例


一、起源

仅devfs,导致开发不方便以及一些功能难以支持:(硬编)

    1. 热插拔(插上usb设备就立马能安装驱动)

    2. 不支持一些针对所有设备的统一操作(如电源管理)

    3. 不能自动mknod

    4. 用户查看不了设备信息

    5. 设备信息硬编码,导致驱动代码通用性差,即没有分离设备和驱动

内核2.6开始引入总线式开发解决这些问题。3.0开始引入设备树。

二、新方案

device+driver结合形成驱动,device内只有设备信息,driver内是一些操作。

uevent机制:sysfs + uevent + udevd(上层app)

uevent是一种通信机制用来解决热插拔的问题。上层还有一个比udevd差一点的mdevd。

2.1 sysfs:

一种用内存模拟的文件系统,系统启动时mount到/sys目录

sysfs用途:(类似于windows的设备管理器)

1. 建立系统中总线、驱动、设备三者之间的桥梁

2. 向用户空间展示内核中各种设备的拓扑图

3. 提供给用户空间对设备获取信息和操作的接口,部分取代ioctl功能

| **sysfs在内核中的组成要素** | **在用户空间/sys下的显示** |

| --------------------------- | -------------------------- |

| 内核对象(kobject)         | 目录                       |

| 对象属性(attribute)       | 文件                       |

| 对象关系(relationship)    | 链接(Symbolic Link)      |

四个基本结构

| **类型**      | **所包含的内容**                   | **内核数据结构**     | **对应/sys项**          |

| ------------- | ------------------------------------------------------- | -------------------- | ----------------------- |

| 设备(Devices) | 设备是此模型中最基本的类型,以设备本身的连接按层次组织       | struct device        | /sys/devices/?/?/.../   |

| 驱动(Drivers) | 在一个系统中安装多个相同设备,只需要一份驱动程序的支持       | struct device_driver | /sys/bus/pci/drivers/?/ |

| 总线(Bus)     | 在整个总线级别对此总线上连接的所有设备进行管理               | struct bus_type      | /sys/bus/?/             |

| 类别(Classes) | 这是按照功能进行分类组织的设备层次树;如 USB 接口和 PS/2 接口的鼠标都是输入设备,都会出现在/sys/class/input/下 | struct class         | /sys/class/?/           |

 最核心的只有这四个,剩下的都是针对某一块,比如block是块设备,fs是文件系统,module是模块。。。。。

目录组织结构:

| **/sys下的子目录** | **所包含的内容**                                             |

| ------------------ | ------------------------------------------------------------ |

| /sys/devices       | 这是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构; |

| /sys/dev           | 这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件; |

| /sys/bus           | 这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分; |

| /sys/class         | 这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在/sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分; |

| /sys/kernel        | 这里是内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel) 接口中; |

| /sys/module        | 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在/sys/module 中 |

| /sys/power         | 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。 |


2.2 uevent

 

新方案中bus既提供通信方式,也是device和driver的管理者。

三、代码中自动mknod

```cstruct class *class_create(struct module *owner, const char *name);/** 功能:在/sys/class生成一个目录,目录名由name指定* 参数:struct module *owner - THIS_MODULEconst char *name - 目录名* 返回值  成功:class指针   失败:NULL*//*辅助接口:可以定义一个struct class 的指针变量cls来接受返回值,然后通过IS_ERR(cls)判断是否失败;IS_ERR(cls);成功----------------->0IS_ERR(cls);失败----------------->非0PTR_ERR(cls);来获得失败的返回错误码;*/```
```cvoid class_destroy(struct class *cls)/** 功能:删除class_create生成目录* 参数:struct class *cls - class指针* 返回值*/```
```cstruct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)/** 功能:在/sys/class目录下class_create生成目录再生成一个子目录与该设备相对应,发uevent让应用程序udevd创建设备文件* 参数:struct class *class - class指针struct device *parent - 父对象,一般NULLdev_t devt - 设备号void *drvdata - 驱动私有数据,一般NULLconst char *fmt - 字符串的格式... - 不定参数* 返回值成功:device指针失败:NULL*/```


 

```cvoid device_destroy(struct class *class, dev_t devt)/** 功能:删除device_create生成目录* 参数:struct class *class - class指针dev_t devt - 设备号* 返回值*/```

四、实例

在之前的秒设备上添加自动mknod

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/atomic.h>
#include <linux/poll.h>
#include <linux/device.h>
#include <linux/timer.h>
#include <linux/device.h>
int major = 11;
int minor = 0;
int mysecond_num = 1;struct mysecond_dev
{struct cdev mydev;int second;struct timer_list mytimer;/*Define atomic variables || 1 can open, 0 can not open*/atomic_t openflag;/*automatic create mknod*/struct class *pcls;struct device *pdev;
};struct mysecond_dev gmydev;void timer_func(unsigned long arg)
{struct mysecond_dev *pmydev = (struct mysecond_dev *)arg;pmydev->second++;mod_timer(&pmydev->mytimer, jiffies + HZ * 1);
}int mysecond_open(struct inode *pnode, struct file *pfile)
{struct mysecond_dev *pmydev = NULL;pfile->private_data = (void *) (container_of(pnode->i_cdev, struct mysecond_dev, mydev));pmydev = (struct mysecond_dev *)pfile->private_data;if(atomic_dec_and_test(&pmydev->openflag)){pmydev->mytimer.expires = jiffies + HZ * 1;pmydev->mytimer.function = timer_func;pmydev->mytimer.data = (unsigned long)pmydev;add_timer(&pmydev->mytimer);return 0;}else{atomic_inc(&pmydev->openflag);printk("The device is opened already\n");return -1;}return 0;
}
int mysecond_close(struct inode *pnode, struct file *pfile)
{//printk("mysecond_close\n");/*C90 requires printk after the variable declaration*/struct mysecond_dev *pmydev = (struct mysecond_dev *)pfile->private_data;del_timer(&pmydev->mytimer);atomic_set(&pmydev->openflag,1);return 0;
}ssize_t mysecond_read(struct file *pfile, char __user *puser, size_t size, loff_t *p_pos)
{struct mysecond_dev *pmydev = (struct mysecond_dev *)pfile->private_data;int ret = 0;if(size < sizeof(int)){printk("the expect read size is invalid\n");return -1;}if(size >= sizeof(int)){size = sizeof(int);}ret = copy_to_user(puser, &pmydev->second, size);if(ret){printk("copy to user failed\n");return -1;}return size;
}struct file_operations myops = {.owner = THIS_MODULE,.open = mysecond_open,.release = mysecond_close,.read = mysecond_read,
};int __init mysecond_init(void)
{int ret = 0;dev_t devno = MKDEV(major,minor);/*Apply for device number*/ret = register_chrdev_region(devno, mysecond_num, "mysecond");if(ret){ret = alloc_chrdev_region(&devno, minor, mysecond_num, "mysecond");if(ret){printk("get devno failed\n");return -1;}major = MAJOR(devno);//Easy to miss *****}/*Assign the 'struct cdev' a set of operation functions*/cdev_init(&gmydev.mydev, &myops);/*Add 'struct cdev' to the kernel's data structure*/gmydev.mydev.owner = THIS_MODULE;cdev_add(&gmydev.mydev, devno, mysecond_num);//add to Hash.init_timer(&gmydev.mytimer);/*initialize the atomic variable to 1*/atomic_set(&gmydev.openflag,1);gmydev.pcls = class_create(THIS_MODULE, "mysecond");if(IS_ERR(gmydev.pcls)){printk("class_create failed\n");cdev_del(&gmydev.mydev);unregister_chrdev_region(devno,mysecond_num);return -1;	}gmydev.pdev = device_create(gmydev.pcls,NULL,devno,NULL,"mysec");if(NULL == gmydev.pcls){printk("device_create failed\n");class_destroy(gmydev.pcls);cdev_del(&gmydev.mydev);unregister_chrdev_region(devno,mysecond_num);return -1;	}return 0;
}
void __exit mysecond_exit(void)
{dev_t devno = MKDEV(major,minor);device_destroy(gmydev.pdev,devno);class_destroy(gmydev.pcls);cdev_del(&gmydev.mydev);//printk("mysecond will exit\n");unregister_chrdev_region(devno, mysecond_num);
}
MODULE_LICENSE("GPL");module_init(mysecond_init);
module_exit(mysecond_exit);

 

http://www.laogonggong.com/news/79494.html

相关文章:

  • 建设工程其它费计算网站关键词优化难度查询
  • 常见网站结构模块化建站工具
  • 玻璃钢格栅无锡网站建设广州网站建设58
  • 青岛网站关键字优化深圳营销型网站方案
  • 网站建设所需资料怎么做网站免费的教程
  • 交互式网站响应式外贸建站
  • 江西省网站备案建设银行手机查询网站
  • 怎么做系统网站app是干什么用的
  • 迅速网站米拓 wordpress
  • wordpress个人建站教程网站设计的主要特点
  • 网站域名要钱嘛韩国网站加速器
  • 吉安网站制作公司怎么维护网站教程
  • 教育咨询网站模板福建省政务服务网
  • 装修网站排名前十做淘客网站怎么样
  • 贵州网站建设价格eclipse可以做网站吗
  • 南通城市建设集团有限公司网站wordpress the time
  • 企业门户网站需求东莞网站制作的公司
  • cms企业网站管理系统中国建设企业协会网站首页
  • 做网站常用的插件南京江北新区教师招聘
  • 网站建设出找不到网页织梦网站怎么关闭
  • 数据库型网站vs2010网站开发 视频
  • 网站建设会出现哪些问题帝国cms搭建个人网站
  • 有趣的网站小游戏成都网站外包优化
  • 品牌网站建设哪好深圳康福特户外家具营销型网站
  • 不知此网站枉做男人的网站网站建设皿金手指排名
  • 基于python的网站开发项目英文网站怎么设置中文
  • 宋庄网站建设网络平台推广方式
  • 找别人做网站注意事项泰安建设企业网站
  • 建站工具包台州电子商务网站开发
  • 优化网站排名需要多少钱注册域名要多少钱