字符设备驱动1_第1页
字符设备驱动1_第2页
字符设备驱动1_第3页
字符设备驱动1_第4页
字符设备驱动1_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上章回顾Linux设备驱动的简介,以及分类字符设备块设备网络接口模块的应用如何编写模块模块相关的宏模块和应用程序的区别编译和装载内核模块字符设备驱动程序第2章本章目标掌握字符设备驱动程序的基本结构和开发方法掌握用户空间调用设备驱动程序的方法本章结构字符设备驱动基本结构

字符设备驱动程序

用户空间调用设备驱动程序

添加驱动程序到内核

内核配置和编译方法添加驱动程序到内核中主要概念和结构体实例字符驱动的主要组成2-1字符设备驱动程序基本结构用户空间内核空间应用程序设备文件低级文件输入输出函数处理文件系统呼叫设备驱动程序设备文件硬件控制函数2-1字符设备驱动程序基本结构低级文件操作函数创建intcreat(constchar*filename,mode_tmode)打开

intopen(constchar*pathname,intflags)

intopen(constchar*pathname,intflags,mode_tmode)——pathname打开文件名,包括路径,默认当前路径——flags文件打开标志:O_RDONLYO_WRONLYO_RDWRO_APPENDO_CREATO_EXECO_NONBLOCKO_TRUNC以只读方式打开以只写方式打开以读写方式打开以追加方式打开创建一个文件若使用O_CREAT而且文件存在,会发生错误以非阻塞的方式打开一个文件若文件存在,则删除文件内容2-1字符设备驱动程序基本结构

标志S_IRUSRS_IWUSRS_IXUSRS_IRWXUS_IRGRPS_IWGRPS_IXGRP含义用户可以读用户可以写用户可以执行用户可以读、写、执行组可以读组可以写组可以执行若使用O_CREAT标志,则要使用第二个open函数,即提供MODE文件访问权限

标志S_IRWXGS_IROTHS_IWOTHS_IRWXOS_ISUIDS_ISGID含义组可以读、写、执行其他可以读其他可以写其他可以读、写、执行设置用户的执行ID设置组的执行IDEG:open(“test”,O_CREAT,S_IRWXU|S_IROTH|S_IXOTH|S_ISUID)2-1字符设备驱动程序基本结构低级文件操作函数读intread(intfd,void*buf,size_tlength);实现从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回为实际的读字节数写intwrite(intfd,constvoid*buf,size_tlength);定位intlseek(intfd,offset_toffset,intwhence);将文件读写指针相对whence移动offset个字节,操作成功返回文件指针相对于文件头的位置参数whence可以使用如下值:

SEEK_SET 相对文件开头

SEEK_CUR相对文件读写指针的当前位置

SEEK_END 相对文件末尾

eg:

lseek(fd,-5,SEEK_CUR)

lseek(fd,0,SEEK_END)2-1字符设备驱动程序基本结构字符设备开发的基本步骤确定主设备号和次设备号实现字符驱动程序实现file_operations结构体实现初始化函数,注册字符设备实现销毁函数,释放字符设备创建设备文件节点2-1字符设备驱动程序基本结构什么是主设备号/次设备号主设备号是内核识别一个设备的标识。整数(占高12bits),范围从0到4095,通常使用1到255次设备号由内核使用,用于正确确定设备文件所指的设备。整数(占低20bits),范围从0到1048575,一般使用0到255内核如何实现设备文件和设备驱动程序函数之间的连接的?

内核利用设备文件上记录的设备类型和主设备号连接注册在内核上的设备驱动程序2-1字符设备驱动程序基本结构设备编号的内部表达dev_t类型(32位):用来保存设备编号(包括主设备号(12位)和次设备号(20位))从dev_t获得主设备号和次设备号:MAJOR(dev_tdev);MINOR(dev_tdev);将主设备号和次设备号转换成dev_t类型:MKDEV(intmajor,intminor);

2-1字符设备驱动程序基本结构分配主设备号手工分配主设备号:找一个内核没有使用的主设备号来使用。#include<linux/fs.h>intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);要分配的设备编号范围的起始值,次设备号经常为0所请求的连续设备编号的个数和该编号范围关联的设备名称#include<linux/fs.h>intregister_chrdev(unsignedintmajor,countchar*name,structfile_operations*fops);2-1字符设备驱动程序基本结构动态分配主设备号:#include<linux/fs.h>intalloc_chrdev_resion(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name);输出的设备号要使用的被请求的第一个次设备号2-1字符设备驱动程序基本结构释放设备号voidunregister_chrdev_region(dev_tfirst,unsignedintcount);通常在模块的清除函数中调用。voidunregister_chrdev(unsignedintmajor,counstchar*name);2-1字符设备驱动程序基本结构实现字符驱动程序cdev结构体——描述字符设备structcdev{ structkobjectkobj;/*内嵌的kobject对象*/ structmodule*owner;/*所属模块*/

structfile_operations*ops;/*文件操作结构体*/ structlist_headlist;

dev_tdev;/*设备号*/ unsignedintcount;};2-1字符设备驱动程序基本结构操作cdev的函数voidcdev_init(structcdev*,structfile_operations*);structcdev*cdev_alloc(void);intcdev_add(structcdev*,dev_t,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论