第三章-Linux文件系统与设备文件系统-新-Linux设备驱动程序-教学课件_第1页
第三章-Linux文件系统与设备文件系统-新-Linux设备驱动程序-教学课件_第2页
第三章-Linux文件系统与设备文件系统-新-Linux设备驱动程序-教学课件_第3页
第三章-Linux文件系统与设备文件系统-新-Linux设备驱动程序-教学课件_第4页
第三章-Linux文件系统与设备文件系统-新-Linux设备驱动程序-教学课件_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

设备驱动程序第三章Linux文件系统与设备文件系统

设备驱动程序第三章Linux文件系统与设备文件系统1目录Linux文件操作Linux文件系统devfs设备文件系统udev设备文件系统目录Linux文件操作2目录Linux文件操作

Linux文件系统devfs设备文件系统udev设备文件系统目录Linux文件操作3文件操作的相关系统调用创建参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限打开Open()函数有两个形式,其中pathname是我们要打开的文件名,flags可以是下表的一个值或者是几个值的组合如果文件打开成功,open函数会返回一个文件描述符,以后对该文件的所有操作就可以通过对这个文件描述符进行操作来实现文件操作的相关系统调用创建4文件操作的相关系统调用O_RDONL、YO_WRONY、O_RDWR这三个标志只能使用任意的一个如果使用了O_CREATE标志,则使用的函数是后者。这个时候我们还要指定mode标志,用来表示文件的访问权限。Mode可以是下表的值的组合文件操作的相关系统调用5文件操作的相关系统调用除了可以通过上述宏进行或逻辑产生标志以外,我们也可以自己用数字来表示,Linux总共用5个数字来表示文件的各种权限:第一位表示设置用户ID,第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,第五位表示其他人的权限。每个数字可以取1(执行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。文件操作的相关系统调用6文件操作的相关系统调用读写函数Write()实现将把length个字节从buf指向的缓冲区写文件描述符fd所指向的文件中,返回值为实际写入的字节数。函数read()实现从文件描述符fd所指定的文件中读取length个字节到buf指向的缓冲区中,返回值为实际读取的字节数。以O_CREAT为标志的open函数实际上实现了文件创建的功能,因此,下面的函数等同creat()函数。文件操作的相关系统调用读写7文件操作的相关系统调用定位该函数将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。关闭Fd是要关闭的文件描述符文件操作的相关系统调用定位8C库函数的文件操作C库函数的文件操作是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数。创建和打开读写关闭C库函数的文件操作C库函数的文件操作是独立于具体的操作系统平9目录Linux文件操作Linux文件系统

devfs设备文件系统udev设备文件系统目录Linux文件操作10Linux文件系统目录结构目录内容/顶层根目录。其它目录都在这个根目录下/bin基本命令可执行文件的存放位置/sbin系统管理类命令可执行文件的存放位置/devdev是设备(device)的英文缩写。这是个十分重要的目录。它包含了所有Linux系统中使用的外部设备文件。要注意的是这里的设备文件不是指设备的驱动程序,而是指访问外部设备的接口文件。/usr用户应用程序和文档目录/etc这个目录下存放系统的配置文件。/liblib是库(library)英文缩写。这个目录用于存放系统动态链接库。所有动态链接程序都要用到这个目录下的库文件。/proc这是Linux的一个特殊文件系统,主要用于存放内核及进程信息/tmp临时文件目录,许多程序都需要用到此目录进行读写操作/var系统日志和一些服务程序临时文件的存放目录Linux文件系统目录结构目录内容/顶层根目录。其它目录都在11Linux文件系统与设备驱动

Linux文件系统与设备驱动12Linux文件系统与设备驱动应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备之间的接口是file_operations结构体成员函数。由于字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由设备驱动提供了,file_operations正是字符设备驱动的核心。Linux文件系统与设备驱动应用程序和VFS之间的接口是系统13Linux文件系统与设备驱动File结构体文件结构代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的structfile。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。Inode结构体VFSinode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。从一个inode中获得主设备号和次设备号:Linux文件系统与设备驱动File结构体14Linux文件系统与设备驱动同一类设备使用相同的主设备号,使用的驱动相同。次设备号用于区分具体的设备。查看/dev目录可以获知系统中包含的设备文件。mknod/dev/global_chardevc2540查看/proc/devices可以获知系统中注册的设备,第1列为主设备号,第2列为设备名。Linux文件系统与设备驱动同一类设备使用相同的主设备号,使15目录Linux文件操作Linux文件系统devfs设备文件系统

udev设备文件系统目录Linux文件操作16传统方式intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);major是为设备驱动程序向系统申请的主设备号。某些主设备号已经静态地指派给了大部分常见设备。在内核源代码树的Documentation/device.txt文件中可以找到这些设备的列表。由于许多编号已经分配了,为新设备选择一个唯一的编号是很困难的,如果为0则系统为此设备动态地分配一个主设备号。name是设备名(将出现在/proc/devices),和/dev/下的设备名要一致。返回值:

此函数返回0表示成功。返回-EINVAL表示申请的主设备号非法,一般来说是主设备号大于系统所允许的最大设备号。返回-EBUSY表示所申请的主设备号正在被其它设备驱动程序使用。如果是动态分配主设备号成功,此函数将返回所分配的主设备号。传统方式intregister_chrdev(unsign17传统方式如果register_chrdev操作成功,设备名就会出现在/proc/devices文件里。在成功地向系统注册了设备驱动程序后(调用register_chrdev()成功后),就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备的时候,只要对此特别文件进行操作就行了。动态分配的缺点是:由于分配给你的主设备号不能保证总是一样的,因而你无法用mknod命令事先创建设备节点(即设备文件),如何解决?unregister_chrdev(unsignedintmajor,constchar*name);传统方式如果register_chrdev操作成功,设备名18传统方式如果开发人员不打算将设备驱动程序与外界共享,那么什么号码都可以,只要它与当前内核使用的其它主设备号都不冲突即可。然而,这样的解决方案通常只是在驱动程序不会被其它人使用的情况下可行。如果开发人员想让驱动程序与外界共享(大多数Linux开发人员常常采用这一方法),那么仅仅从“真空”中抽一个主设备号或者使用动态的主设备号分配就不行了。相反,开发人员必须联系Linux内核开发人员,这样这个设备才能分配一个“正式”主设备号。传统方式如果开发人员不打算将设备驱动程序与外界共享,那么什么19传统方式不幸的是,这种方法有很多可伸缩性问题。不仅设备驱动程序开发人员联系内核开发人员来获取正式主设备号是一件讨厌的事,内核开发人员弄清他们怎样分配所有这些主设备号甚至更加恼人。这种任务在很多方面很象系统管理员跟踪公司局域网静态IP地址分配的工作―这并不十分有趣。正如系统管理员可以利用DHCP来缓解这种管理负担,如果设备注册有某种类似的方法就好了。另一方面,典型的Linux系统以一种不太理想而且麻烦的方式管理这些特殊的设备文件。如今,Linux支持很多不同种类的硬件。这意味着严格意义上我们中绝大多数在/dev中都有数百个特殊文件来表示所有这些设备。还不止这样,这些特殊文件中大多数甚至不会映射到系统中存在的设备上(但需要它们存在,只是考虑到我们最终会在系统中添加新的硬件/驱动器),这让事情变得更令人困惑。从这个方面来看,我们就知道/dev需要彻底检修

。传统方式不幸的是,这种方法有很多可伸缩性问题。不仅设备驱动程20Devfs设备文件系统Devfs,也叫设备文件系统(DeviceFilesystem),设计它的唯一目的就是提供一个新的(更理性的)方式管理通常位于/dev的所有块设备和字符设备。使用Devfs需要在内核添加对的devfs支持。(配置内核)。devfs文件系统是安装在/dev中,/dev包含了devfs名称空间的表达。使用devfs,可以只要查看/dev就知道系统上有什么设备。Devfs设备文件系统Devfs,也叫设备文件系统(Devi21Devfs设备文件系统驱动程序调用下面的函数来进行设备文件的创建和删除工作:Devfs设备文件系统驱动程序调用下面的函数来进行设备文件的22Devfs设备文件系统devfs_register函数说明:功能:向系统注册设备。dir:新创建的设备文件的父目录,一般设为NULL,表示父目录为/dev。如果需要创建一个自己的目录,那么驱动程序应该调用devfs_mk_dir()。Name:设备名称。Flags:Devfs标志的位掩码。如果指定为DEVFS_FL_AUTO_DEVNUM,自动为设备分配设备号。则主次设备号就不再有用了,可以都为0。Major:主设备号。Minor:次设备号。Mode:设备的访问模式,和文件的访问模式类似。Ops:设备的文件操作数据结构指针。Info:filp->private_data的默认值,一般设为NULL。用devfs_register注册的设备会自动创建/dev/下的设备文件,而用register_chrdev注册的设备则需要用户手工mknod创建设备文件。Devfs设备文件系统devfs_register函数说明23Devfs设备文件系统Devfs_mk_dir函数说明:功能:在/dev下创建新的设备目录Dir:值为NULLName:设备目录名Info:值为NULLDevfs设备文件系统Devfs_mk_dir函数说明:24Devfs设备文件系统举例:devfs_gpf_dir=devfs_mk_dir(NULL,"gpf",NULL);devfs_gpf_raw=devfs_register(devfs_gpf_dir,"key",

DEVFS_FL_AUTO_DEVNUM,0,0,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410_fops,NULL);分析:这样就会在/dev下建立一个/gpf/key的设备文件,相当于手动创建mknod文件路径c主设备号从设备号Devfs设备文件系统举例:25目录Linux文件操作Linux文件系统devfs设备文件系统udev设备文件系统

目录Linux文件操作26Udev与Devfs的区别在Linux2.6内核中,udev取代了devfs,原因如下:Devfs所做的工作被确信可以在用户态完成一些bug相当长的时间内未被修复Devfs的维护者和作者停止了对代码的维护工作Udev完全在用户态工作,利用设备加入或移除时内核所发送的热插拔事件来工作。由于udev根据系统中硬件设备的状态动态更新设备文件,进行设备文件的创建和删除等,因此,在使用udev后,/dev目录下就会只包含系统中真正存在的设备。Devfs与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。Udev与Devfs的区别在Linux2.6内核中,udev27Sysfs文件系统与Linux设备模型Sysfs文件系统Linux2.6引入了sysfs文件系统,它是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。Sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构及它们的树型。Sysfs的一个目的就是展示设备驱动模型中各组件的层次关系。Sysfs文件系统与Linux设备模型Sysfs文件系统28Sysfs文件系统与Linux设备模型Kobject内核对象kobject是Linux2.6引入的设备管理机制,在内核中由kobject结构体表示,这个数据结构使所有设备在底层都具有统一的接口。每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Voidkobject_init(structkobject*kobj)Intkobject_set_name(structkobject*kobj,constchar*format,…)Structkobject*kobject_get(structkobject*kobj)Voidkobject_put(structkobject*kobj)Intkobject_register(structkobject*kobj)Voidkobject_del(sturctkobject*kobj)Voidkobject_unregister(structkobject*kobj)Sysfs文件系统与Linux设备模型Kobject内核对象29Sysfs文件系统与Linux设备模型Kset内核对象Kobject通常通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合,在内核中用kset数据结构表示。包含在kset中的所有kobject被组织成一个双向循环链表。Sysfs文件系统与Linux设备模型Kset内核对象30Sysfs文件系统与Linux设备模型Subsystem内核对象子系统Subsystem是一系列kset的集合,它描述系统中某一类设备子系统。Linux设备模型组件系统中的任一是设备在设备模型中都有一个deivce对象描述。属性在bus、device、driver和class层次上都分别定义了其属性结构体,包括bus_attribute、driver_attribute、class_attribute、class_device_attributeSysfs文件系统与Linux设备模型Subsystem内核31Udev的组成Udev的设计目标:在用户空间中执行动态建立/删除设备文件允许每个都不用关心主/次设备号提供LSB标准名称如果需要,可提供固定的名称Udev的组成Udev的设计目标:32Udev的组成Udev的工作过程当内存检测到在系统中出现了新设备后,内核会在sysfs文件系统中为该新设备生成新的记录并导出一些设备特定的信息及所发生的事情Udev获取内核导出的信息,它调用namedev决定应该给该设备指定的名称。Udev的组成Udev的工作过程33Udev的组成在namedev中使用5个步骤来决定指定设备的命名标签/序号设备总线号总线上的拓扑替换名称内核提供的名称Udev的组成在namedev中使用5个步骤来决定指定设备的34Udev规则文件Udev规则文件以行为单位,以“#”开头的行代表注释行。其余的每一行代表一个规则。每个规则分成一个或多个匹配和赋值部分。匹配部分用匹配专用的关键字来表示,相应的赋值部分用赋值专用的关键字来表示。匹配关键字包括:ACTION、KERNEL、BUS、SYSFS、SUBSYSTEM等。赋值关键字包括:NAME、SYMLINK、OWNER、GROUP、IMPORT等。Udev规则文件Udev规则文件以行为单位,以“#”开头的行35创建和配置udevUdev包括udev、udevcontrol、udevd、udevsend、udevmonitor、udevsettle、udevstart、udevinfo、udevtest和udevtrigger等处于用户空间的程序。在嵌入式系统中,只需要udevd和udevstart就能使udev工作。我们可以按照下面的步骤来生成和配置udev从网站上下载udev程序运行tarzxvfudev-114.tar.gz命令解压缩udev程序包运行make编译udev把第3步生成的工具程序复制到/sbin目录,同时把解压缩udev-114.tar.gz后获得的etc目录下的udev目录复制到系统的/etc下编写完成启动、停止、重新启动等工作的udev脚本创建和配置udevUdev包括udev、udevcontro36设备驱动程序第三章Linux文件系统与设备文件系统

设备驱动程序第三章Linux文件系统与设备文件系统37目录Linux文件操作Linux文件系统devfs设备文件系统udev设备文件系统目录Linux文件操作38目录Linux文件操作

Linux文件系统devfs设备文件系统udev设备文件系统目录Linux文件操作39文件操作的相关系统调用创建参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限打开Open()函数有两个形式,其中pathname是我们要打开的文件名,flags可以是下表的一个值或者是几个值的组合如果文件打开成功,open函数会返回一个文件描述符,以后对该文件的所有操作就可以通过对这个文件描述符进行操作来实现文件操作的相关系统调用创建40文件操作的相关系统调用O_RDONL、YO_WRONY、O_RDWR这三个标志只能使用任意的一个如果使用了O_CREATE标志,则使用的函数是后者。这个时候我们还要指定mode标志,用来表示文件的访问权限。Mode可以是下表的值的组合文件操作的相关系统调用41文件操作的相关系统调用除了可以通过上述宏进行或逻辑产生标志以外,我们也可以自己用数字来表示,Linux总共用5个数字来表示文件的各种权限:第一位表示设置用户ID,第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,第五位表示其他人的权限。每个数字可以取1(执行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。文件操作的相关系统调用42文件操作的相关系统调用读写函数Write()实现将把length个字节从buf指向的缓冲区写文件描述符fd所指向的文件中,返回值为实际写入的字节数。函数read()实现从文件描述符fd所指定的文件中读取length个字节到buf指向的缓冲区中,返回值为实际读取的字节数。以O_CREAT为标志的open函数实际上实现了文件创建的功能,因此,下面的函数等同creat()函数。文件操作的相关系统调用读写43文件操作的相关系统调用定位该函数将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。关闭Fd是要关闭的文件描述符文件操作的相关系统调用定位44C库函数的文件操作C库函数的文件操作是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数。创建和打开读写关闭C库函数的文件操作C库函数的文件操作是独立于具体的操作系统平45目录Linux文件操作Linux文件系统

devfs设备文件系统udev设备文件系统目录Linux文件操作46Linux文件系统目录结构目录内容/顶层根目录。其它目录都在这个根目录下/bin基本命令可执行文件的存放位置/sbin系统管理类命令可执行文件的存放位置/devdev是设备(device)的英文缩写。这是个十分重要的目录。它包含了所有Linux系统中使用的外部设备文件。要注意的是这里的设备文件不是指设备的驱动程序,而是指访问外部设备的接口文件。/usr用户应用程序和文档目录/etc这个目录下存放系统的配置文件。/liblib是库(library)英文缩写。这个目录用于存放系统动态链接库。所有动态链接程序都要用到这个目录下的库文件。/proc这是Linux的一个特殊文件系统,主要用于存放内核及进程信息/tmp临时文件目录,许多程序都需要用到此目录进行读写操作/var系统日志和一些服务程序临时文件的存放目录Linux文件系统目录结构目录内容/顶层根目录。其它目录都在47Linux文件系统与设备驱动

Linux文件系统与设备驱动48Linux文件系统与设备驱动应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备之间的接口是file_operations结构体成员函数。由于字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由设备驱动提供了,file_operations正是字符设备驱动的核心。Linux文件系统与设备驱动应用程序和VFS之间的接口是系统49Linux文件系统与设备驱动File结构体文件结构代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的structfile。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。Inode结构体VFSinode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。从一个inode中获得主设备号和次设备号:Linux文件系统与设备驱动File结构体50Linux文件系统与设备驱动同一类设备使用相同的主设备号,使用的驱动相同。次设备号用于区分具体的设备。查看/dev目录可以获知系统中包含的设备文件。mknod/dev/global_chardevc2540查看/proc/devices可以获知系统中注册的设备,第1列为主设备号,第2列为设备名。Linux文件系统与设备驱动同一类设备使用相同的主设备号,使51目录Linux文件操作Linux文件系统devfs设备文件系统

udev设备文件系统目录Linux文件操作52传统方式intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);major是为设备驱动程序向系统申请的主设备号。某些主设备号已经静态地指派给了大部分常见设备。在内核源代码树的Documentation/device.txt文件中可以找到这些设备的列表。由于许多编号已经分配了,为新设备选择一个唯一的编号是很困难的,如果为0则系统为此设备动态地分配一个主设备号。name是设备名(将出现在/proc/devices),和/dev/下的设备名要一致。返回值:

此函数返回0表示成功。返回-EINVAL表示申请的主设备号非法,一般来说是主设备号大于系统所允许的最大设备号。返回-EBUSY表示所申请的主设备号正在被其它设备驱动程序使用。如果是动态分配主设备号成功,此函数将返回所分配的主设备号。传统方式intregister_chrdev(unsign53传统方式如果register_chrdev操作成功,设备名就会出现在/proc/devices文件里。在成功地向系统注册了设备驱动程序后(调用register_chrdev()成功后),就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备的时候,只要对此特别文件进行操作就行了。动态分配的缺点是:由于分配给你的主设备号不能保证总是一样的,因而你无法用mknod命令事先创建设备节点(即设备文件),如何解决?unregister_chrdev(unsignedintmajor,constchar*name);传统方式如果register_chrdev操作成功,设备名54传统方式如果开发人员不打算将设备驱动程序与外界共享,那么什么号码都可以,只要它与当前内核使用的其它主设备号都不冲突即可。然而,这样的解决方案通常只是在驱动程序不会被其它人使用的情况下可行。如果开发人员想让驱动程序与外界共享(大多数Linux开发人员常常采用这一方法),那么仅仅从“真空”中抽一个主设备号或者使用动态的主设备号分配就不行了。相反,开发人员必须联系Linux内核开发人员,这样这个设备才能分配一个“正式”主设备号。传统方式如果开发人员不打算将设备驱动程序与外界共享,那么什么55传统方式不幸的是,这种方法有很多可伸缩性问题。不仅设备驱动程序开发人员联系内核开发人员来获取正式主设备号是一件讨厌的事,内核开发人员弄清他们怎样分配所有这些主设备号甚至更加恼人。这种任务在很多方面很象系统管理员跟踪公司局域网静态IP地址分配的工作―这并不十分有趣。正如系统管理员可以利用DHCP来缓解这种管理负担,如果设备注册有某种类似的方法就好了。另一方面,典型的Linux系统以一种不太理想而且麻烦的方式管理这些特殊的设备文件。如今,Linux支持很多不同种类的硬件。这意味着严格意义上我们中绝大多数在/dev中都有数百个特殊文件来表示所有这些设备。还不止这样,这些特殊文件中大多数甚至不会映射到系统中存在的设备上(但需要它们存在,只是考虑到我们最终会在系统中添加新的硬件/驱动器),这让事情变得更令人困惑。从这个方面来看,我们就知道/dev需要彻底检修

。传统方式不幸的是,这种方法有很多可伸缩性问题。不仅设备驱动程56Devfs设备文件系统Devfs,也叫设备文件系统(DeviceFilesystem),设计它的唯一目的就是提供一个新的(更理性的)方式管理通常位于/dev的所有块设备和字符设备。使用Devfs需要在内核添加对的devfs支持。(配置内核)。devfs文件系统是安装在/dev中,/dev包含了devfs名称空间的表达。使用devfs,可以只要查看/dev就知道系统上有什么设备。Devfs设备文件系统Devfs,也叫设备文件系统(Devi57Devfs设备文件系统驱动程序调用下面的函数来进行设备文件的创建和删除工作:Devfs设备文件系统驱动程序调用下面的函数来进行设备文件的58Devfs设备文件系统devfs_register函数说明:功能:向系统注册设备。dir:新创建的设备文件的父目录,一般设为NULL,表示父目录为/dev。如果需要创建一个自己的目录,那么驱动程序应该调用devfs_mk_dir()。Name:设备名称。Flags:Devfs标志的位掩码。如果指定为DEVFS_FL_AUTO_DEVNUM,自动为设备分配设备号。则主次设备号就不再有用了,可以都为0。Major:主设备号。Minor:次设备号。Mode:设备的访问模式,和文件的访问模式类似。Ops:设备的文件操作数据结构指针。Info:filp->private_data的默认值,一般设为NULL。用devfs_register注册的设备会自动创建/dev/下的设备文件,而用register_chrdev注册的设备则需要用户手工mknod创建设备文件。Devfs设备文件系统devfs_register函数说明59Devfs设备文件系统Devfs_mk_dir函数说明:功能:在/dev下创建新的设备目录Dir:值为NULLName:设备目录名Info:值为NULLDevfs设备文件系统Devfs_mk_dir函数说明:60Devfs设备文件系统举例:devfs_gpf_dir=devfs_mk_dir(NULL,"gpf",NULL);devfs_gpf_raw=devfs_register(devfs_gpf_dir,"key",

DEVFS_FL_AUTO_DEVNUM,0,0,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410_fops,NULL);分析:这样就会在/dev下建立一个/gpf/key的设备文件,相当于手动创建mknod文件路径c主设备号从设备号Devfs设备文件系统举例:61目录Linux文件操作Linux文件系统devfs设备文件系统udev设备文件系统

目录Linux文件操作62Udev与Devfs的区别在Linux2.6内核中,udev取代了devfs,原因如下:Devfs所做的工作被确信可以在用户态完成一些bug相当长的时间内未被修复Devfs的维护者和作者停止了对代码的维护工作Udev完全在用户态工作,利用设备加入或移除时内核所发送的热插拔事件来工作。由于udev根据系统中硬件设备的状态动态更新设备文件,进行设备文件的创建和删除等,因此,在使用udev后,/dev目录下就会只包含系统中真正存在的设备。Devfs与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。Udev与Devfs的区别在Linux2.6内核中,udev63Sysfs文件系统与Linux设备模型Sysfs文件系统Linux2.6引入了sysfs文件系统,它是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。Sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构及它们的树型。Sysfs的一个目的就是展示设备驱动模型中各组件的层次关系。Sysfs文件系统与Linux设备模型Sysfs文件系统64Sysfs文件系统与Linux设备模型Kobject内核对象kobject是Linux2.6引入的设备管理机制,在内核中由kobject结构体表示,这个数据结构使所有设备在底层都具有统一的接口。每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Voidkobject_init(structkobject*kobj)Intkobject_set_name(structkobject*kobj,constchar*format,…)Structkobject*kobject_get(structkobject*kobj)Voidkobject_put(structkobject*kobj)Intkobject_register(structkobje

温馨提示

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

最新文档

评论

0/150

提交评论