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

做生物学的网站/故事性营销软文

做生物学的网站,故事性营销软文,江西响应式网页建设价位,商城网站建设开发多少钱1.字符设备基础 字符设备:指一个字节一个字节进行读写操作的设备,不能随机读取设备中的某一数据,读取数据要按照先后数据。字符设备是 面向流的设备,常见的字符设备有鼠标,键盘,串口,控制台和L…

1.字符设备基础

字符设备:指一个字节一个字节进行读写操作的设备,不能随机读取设备中的某一数据,读取数据要按照先后数据。字符设备是
面向流的设备,常见的字符设备有鼠标,键盘,串口,控制台和LED等。
一般每个字符设备或者块设备都会在/dev目录下对应一个设备文件。Linux用户层程序通过设备文件来使用驱动程序操作字符设备
或块设备。

2.字符设备驱动与用户空间访问该设备的程序三者之间的关系

字符设备是三大类设备(字符设备,块设备,网络设备)中较简单的一类设备,其驱动程序中完成的主要工作是初始化,添加和删除struct cdev结构体,申请和释放设备号,以及填充struct file_operations结构体中断的操作函数,实现struct file_operations结构体中的read(),write(),和ioctl()等函数是驱动设计的主体工作。
在这里插入图片描述

3.字符设备模型

在这里插入图片描述

1> linux内核中,使用struct cdev来描述一个字符设备
<include/linux/cdev.h>struct cdev{struct kobject kobj; //内嵌的内核对象struct module *owner; //该字符设备所在的内核模块(所有者)的对象指针,一般为THIS_MODULE主要用于模块计数const struct file_operations *ops; //该结构描述了字符设备所能实现的操作集(打开,关闭,读/写...),是极为关键的一个结构体struct list_head list; //用来将已经向内核注册的所有字符设备形成链表dev_t dev; //字符设备的设备号,由主设备号和次设备号构成(如果是一次申请多个设备号,此设备号为第一个)unsigned int count; //隶属于同一主设备号的次设备号的个数
};

对于struct cdev内核提供了一些操作接口:
头文件Linux/cdev.h
动态申请(构造)cdev内存(设备对象)

struct cdev *cdev_alloc(void);
/* 返回值: 成功: cdev首地址失败:NULL */

初始化cdev的成员,并建立cdev和file_operations之间的关联

void cdev_init(struct cdev *p,const struct file_operations *p);
/* 参数:struct cdev *p 被初始化的cdev对象const struct file_operations *fops 字符设备操作方法集 */

注册cdev设备对象(添加到系统字符设备列表中)

int cdev_add(struct cdev *p,dev_t dev,unsigned count);
/* 参数:struct cdev *p 被注册的cdev对象dev_t dev  设备的第一个设备号unsigned  这个设备连续的次设备号数量返回值:成功:0失败:负数(绝对值是错误码) */

将cdev对象从系统中移除(注销)

void cdev_del(struct cdev *p);
/* 参数:struct cdev *p  要移除的cdev对象 */

释放cdev内存

void cdev_put(struct cdev *P);
/* 参数:struct cdev *P 要移除的cdev对象 */
2> 设备号申请/释放

一个字符设备或块设备都有一个主设备号和一个次设备号。主设备号用来标识与设备文件相连的驱动程序,用来反映设备类型。次设备号被驱动程序用来辨别操作的是哪个设备,用来区分同类型的设备。
Linux内核中,设备号用dev_t来描述:

typedef u_long dev_t;  //在32位机中是4个字节,高12位表示主设备号,低20位表示次设备号#define MAJOR(dev)        ( (unsigned int)    ( (dev)    >> MINORBITS) )    //从设备号中提取主设备号
#define MINOR(dev)        ( (unsigned int)    ( (dev)    & MINORMAKS) )   //从设备号中提取次设备号
#define MKDEV(ma,mi)    (((ma) << MINORBITS)  |  (mi))</span>  //将主,次设备号拼凑为设备号
/* 只是拼凑设备号,并未注册到系统中,若要使用需要申请 */

头文件 Linux/fs.h

静态申请设备号

int register_chrdev_region(dev_t from, unsigned count, const char *name);
/* 参数:dev_t from  要申请的设备号(起始)unsigned count  要申请的设备号数量const char *name  设备名返回值:成功:0失败:负数(绝对值是错误码)*/

动态分配设备号

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);
/* 参数:dev_t *dev - 用于保存分配到的第一个设备号(起始)unsigned baseminor - 起始次设备号unsigned count - 要分配设备号的数量const char *name - 设备名返回值:成功:0失败:负数(绝对值是错误码)*/

释放设备号

void unregister_chrdev_region(dev_t from, unsigned count);
/* 参数:dev_t from - 要释放的第一个设备号(起始)unsigned count - 要释放的次设备号数量 */

创建设备文件
利用cat /proc/devices查看申请到的设备名,设备号。
*使用mknod手工创建:mknod filename type major minor
*自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。在驱动初始化代码里调用 class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。

3>struct cdev 中的 file_operations *fops成员

Linux下一切皆“文件”,字符设备也是这样,file_operations *fops结构体中的成员函数是字符设备程序设计的主题内容,这些函数实际会在用户层程序进行Linux的open(),close(),write(),read()等系统调用时最终被调用。

标准化:如果做到极致,应用层仅仅需要一套系统调用接口函数。

“文件”的操作接口结构:

struct file_operstions {struct module *owner;/*模块拥有者,一般为 THIS--MODULE */ssize_t (*read) (struct file *,char_user *,size_t,loff_t *);/* 从设备中读取数据,成功时返回读取的字节数,出错返回负值(绝对值是错误码) */ssize_t (*write) (struct file *,const char_user *,size_t,loff_t *);/* 向设备发送数据,成功时该函数返回写入字节数。若为被实现,用户调层用write()时系统将返回 -EINVAL*/int (*mmap) (struct file *,struct vm_area_struct *);/* 将设备内存映射内核空间进程内存中,若未实现,用户层调用 mmap()系统将返回 -ENODEV */long (*unlocked_ioctl)(struct file *filp,unsigned int cmd,unsigned long arg);/* 提供设备相关控制命令(读写设备参数、状态,控制设备进行读写...)的实现,当调用成功时返回一个非负值 */int (*open) (struct inode *,struct file *); /*打开设备*/int (*release) (struct inode *,struct file *); /*关闭设备*/int (*flush) (struct file *,fl_owner_t id);/*刷新设备*/loff_t (*llseek) (struct file *,loff_t, int);/* 用来修改文件读写位置,并将新位置返回,出错时返回一个负值 */int (*fasync) (int, struct file *,int); /* 通知设备 FASYNC 标志发生变化 */unsigned int (*poll) (struct file *,struct poll_table_struct *);/* POLL机制,用于询问设备是否可以被非阻塞地立即读写。当询问的条件未被触发时,用户空间进行select()和poll()系统调用将引起进程阻塞 */...
};
http://www.whsansanxincailiao.cn/news/30343422.html

相关文章:

  • 网站运营分析报告/北京网站seo设计
  • 股票做T网站/网站模板大全
  • 宝鸡市住房与城乡建设厅网站/成都百度百科
  • 做网站公司东莞/爱站网关键词查询系统
  • 网站制作公司 深圳/品牌推广专员
  • 网站如何自动手机版/网络营销策略名词解释
  • 中国手机网站大全/seo优化交流
  • 深圳网站制作服务公/培训心得体会1500字
  • 想采集某类型网站怎么做/广东seo网站优化公司
  • 龙华网站建设招聘/淘宝店铺怎么运营
  • 吉林省高等级公路建设局 网站/软文是什么样子的
  • 广西建设工程质检安全网站/网站建设推广公司
  • 网站建设后台实训体会/网店推广实训系统
  • abbs建筑网站/品牌推广和营销推广
  • 网站维护与建设ppt/佛山做seo推广公司
  • 织梦网站标题被改/产品推广平台排行榜
  • 响应式网站建设案例/年度关键词
  • 手机网站需要多少钱/网络运营推广是做什么的
  • 如何建设淘宝客网站/网络优化工具
  • 奥鹏作业代做靠谱的网站/百度移动端点赞排名软件
  • 表单大师做网站/靠谱的推广平台有哪些
  • wdcp 网站日志/b站免费推广app大全
  • 海西州公司网站建设/河南网站关键词优化代理
  • 网页制作与网站建设文档/优化大师win10
  • 济宁专业网站制作公司/品牌宣传策划方案
  • 兰州医院网站建设/培训网站
  • 阜宁县城乡建设局新的官方网站/广告推广文案
  • 网站的整体结构/网站收录优化
  • 网站顶部图片素材/seo快速培训
  • 现在帮别人做网站赚钱不/站长工具pr值查询