udev和mdev学习总结doc

上传人:EY****y 文档编号:44021911 上传时间:2021-12-05 格式:DOC 页数:24 大小:97KB
收藏 版权申诉 举报 下载
udev和mdev学习总结doc_第1页
第1页 / 共24页
udev和mdev学习总结doc_第2页
第2页 / 共24页
udev和mdev学习总结doc_第3页
第3页 / 共24页
资源描述:

《udev和mdev学习总结doc》由会员分享,可在线阅读,更多相关《udev和mdev学习总结doc(24页珍藏版)》请在装配图网上搜索。

1、udev 和 mdev学习总结篇一: linux环境编程福建农林大学金山学院课程名称:姓 名:系: 专 业:年 级:学 号:指导教师:职 称:实验报告Linux 环境编程信息与机电工程计算机科学与技术XX级讲师XX年5月 26日实验项目列表福建农林大学金山学院实验报告系:信息与机电工程系专业:计算机科学与技术年级: XX姓名:学号:实验室号 _ _607_ 计算机号实验时间:指导教师签字:成绩:实验一: gcc 编译器(验证性、2 学时)一、实验目的:1)熟悉 Shell操作环境。2)掌握在 Linux 下的 C 语言代码编译运行的方法。3 )初步了解 C 语言库函数与Linux 系统调用。二

2、、实验内容1、编写能输出“Hello world!”问候语的C 程序,并在终端中编译、执行。要求记录所使用的命令及结果。#include #include int main() printf(Hello Worldn); exit(0); 2、编写程序p.c ,其功能是从键盘输入两个实数,输出这 两 个 实 数 的 平 方 和 , 生 成 可 执 行 文 件 为pow 。#includestdio.h main() float x,y;scanf(%f %f,&x,&y); printf(%6.3f,x*x+y*y); 3、教材第9 页静态库实验,记录操作步骤与结果。分析所出现的问题及如何解决

3、的?4 、编写一个C 程序并设置其在后台执行,其功能是在一段时间后(可自行设置),在屏幕上显示信息: Time for play! ,写出相应的程序、命令及结果。 #include main() sleep(6);printf(Time for Play!n);5、编制一段程序,使用系统调用fork() 创建两个子进程,这样在此程序运行时,在系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符 a,子进程分别显示字符 b 和字符 c。试观察、记录并分析屏幕上, 进程调度的情况。 #include #include#include #include main(

4、)if ( fork() = 0 ) /子进程 1 printf(bn);exit(0); elseif ( fork() = 0 )/子进程 2printf(cn); exit(0);printf(an);/父进程 exit(0); 三、实验结果与讨论(根据实验结果回答下列问题)1、你所使用的实验环境是什么?请写出Linux 的平台、内核版本号。VMware Workstation2、 在 Linux 中,标准设备文件有哪些?这些设备文件在哪个目录?Devfsudevmdev3、 对于上述各编程题目中所用到了的各个头文件,请找到它们的位置。/user/include四、总结篇二:设备文件系统

5、剖析与使用设备文件系统剖析与使用设备文件系统剖析与使用嵌入式 Linux 之我行,主要讲述和总结了本人在学习嵌入式 linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。? 共享资源,欢迎转载:一、什么是Linux 设备文件系统首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了) ,启动开发板,我们用串口工具进入开发板, 查看系统 /dev 目录,往往里面没有或者就只有 null 、console 等几个系统必须的设备文件在这儿外,没有任何设备文件了。那我们移植

6、好的各种设备驱动的设备文件怎么没有啊?如果要使用这些设备,那不是要一个一个的去手动的创建这些设备的设备文件节点,这给我们使用设备带来了极为的不便(在之前篇幅中讲的各种设备驱动的移植都是这样)。设备文件系统就是给我们解决这一问题的关键,他能够在系统设备初始化时动态的在 /dev 目录下创建好各种设备的设备文件节点 (也就是说, 系统启动后 /dev 目录下就有了各种设备的设备文件,直接就可使用了) 。除此之外,他还可以在设备卸载后自动的删除 /dev 下对应的设备文件节点(这对于一些热插拔设备很有用,插上的时候自动创建,拔掉的时候又自动删除) 。还有一个好处就是,在我们编写设备驱动的时候,不必再

7、去为设备指定主设备号,在设备注册时用 0 来动态的获取可用的主设备号,然后在驱动中来实现创建和销毁设备文件(一般在驱动模块加载和卸载函数中来实现)。二、设备文件系统的种类设备文件系统有:devfs 、 udev、 mdev等。mdev 是 udev 的简化版本,是 busybox 中所带的程序,最适合用在嵌入式系统,而 udev 一般都用在 PC上的 Linux中,相对 mdev来说要复杂些;devfs 是 2.4 内核引入的,而在 2.6 内核中却被 udev 所替代,他们有着共同的优点,只是 devfs 中存在着一些未修复的 bug,作者也停止了对他的维护,最显著的一个区别是:采用 dev

8、fs 时,当一个并不存在的设备节点被打开时,他却还能自动加载对应的驱动,而udev 则不能, udev 认为当打开并不存在的设备节点时不应该加载对应的驱动模块,因为加载了也没用, 浪费系统资源。三、 udev 或者 mdev设备文件系统的使用1.首先让大家明白一个问题就是,不管是udev 还是mdev,他们就是一个应用程序,就跟其他应用程序一样(比如: Boa 服务),配置了就可以使用了。为了方便起见,我们就使用 busybox 自带的一个mdev,这样在配置编译busybox时,只要将mdev的支持选项选上,编译后就包含了mdev 设备文件系统的应用(当然你也可以不使用busybox 自带的

9、,去下载 udev 的源码进行编译移植)#make menuconfigLinux System Utilities -* mdev* Support /etc/mdev.conf* Support subdirs/symlinks*Supportregularexpressionssubstitutionswhenrenaming device* Support command execution at device addition/removal2. udev 或者 mdev需要内核 sysfs 和 tmpfs 虚拟文件系统的支持,sysfs 为 udev 提供设备入口和 uevent

10、通道,tmpfs为 udev 设备文件提供存放空间。所以在/etc/fstab配置文件中添加如下内容(红色部分):# device mount-point type options dump fsck order#-procfs /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0usbfs /proc/bus/usb usbfs defaults 0 0ramfs /dev ramfs defaults 0 0none /dev/pts devpts mode=0622 0

11、03.在系统初始化配置文件/etc/init.d/rcS中挂载mdev要用到的 sysfs 文件系统和 tmpfs 文件系统, 然后启动 /sbin 目录下的 mdev应用对系统的设备进行搜索 (红色部分) 。# Mount virtual filesystem /bin/mount -t proc procfs /proc /bin/mount -n -t sysfs sysfs /sys /bin/mount -n -t usbfs usbfs /proc/bus/usb/bin/mount -t ramfs ramfs /dev# Make dir /bin/mkdir -p /dev/

12、pts /bin/mkdir -p /dev/shm /bin/mkdir -p /var/log/bin/mount -n -t devpts none /dev/pts -o mode=0622/bin/mount -n -t tmpfs tmpfs /dev/shm# Make device nodeecho /sbin/mdev /proc/sys/kernel/hotplug/sbin/mdev -s4. 在设备驱动程序中加上对类设备接口的支持,即在驱动程序加载和卸载函数中实现设备文件的创建与销毁,例如在之前篇幅的按键驱动中添加(红色部分) :#include /设备类用到的头文件s

13、tatic int device_major = DEVICE_MAJOR; /用于保存系统动态生成的主设备号static struct class *button_class; /定义一个类static int _init button_init(void)/ 注册字符设备, 这里定义 DEVICE_MAJOR=0,让系统去分配,注册成功后将返回动态分配的主设备号device_major = register_chrdev(DEVICE_MAJOR, DEVICE_NAME, &buttons_fops);if(device_majorprintk(DEVICE_NAME register

14、faild!n);return device_major;/ 注册一个设备类,使 mdev可以在 /dev/ 目录下建立设备节点button_class = class_create(THIS_MODULE, DEVICE_NAME);if(IS_ERR(button_class)printk(DEVICE_NAME create class faild!n);return -1;/ 创建一个设备节点,取名为 DEVICE_NAME(即my2440_buttons)/ 注意 2.6 内核较早版本的函数名是class_device_create,现该为 device_createdevice_c

15、reate(button_class, NULL, MKDEV(device_major, 0), NULL, DEVICE_NAME);return 0;static void _exit button_exit(void)/ 注销字符设备uegister_chrdev(device_major, DEVICE_NAME);/ 删除设备节点,注意2.6 内核较早版本的函数名是class_device_destroy,现该为 device_destroydevice_destroy(button_class, MKDEV(device_major,0);/ 注销类class_destroy(b

16、utton_class);4. 至于 mdev 的配置文件 /etc/mdev.conf ,这个可有可无,只是设定设备文件的一些规则。我这里就不管他了,让他为空好了。5. 完成以上步骤后,重新编译文件系统,下载到开发板上,启动开发板后进入开发板的 /dev 目录查看, 就会有很多系统设备节点在这里产生了,我们就可以直接使用这些设备节点了。篇三:设备模型( 上 ) 底层模型Linux 设备驱动工程师之路设备模型(上)底层模型一、重要知识点1. Sysfs文件系统Sysfs 文件系统是一种类似于proc 文件系统的特殊文件系统,它存在于内存当中,当系统启动时由内核挂载于内存当中。用于将系统中的设备

17、组织成层次结构,并向用户模式程序提供详细的数据结构信息。2. Linux 设备底层模型1)为什么要使用设备模型随着系统的拓扑结构越来越复杂,以及要支持诸如电源管理等新特性的要求,于是在2.6的内核中出现了设备模型。设备模型其实就是一套数据结构建立起来的模型。内核使用该模型支持了多种不同的任务,包括:a. 电源管理和系统关机设备模型使操作系统能够以正确的顺序遍历系统硬件。b. 与用户空间通信Sysfs 文件系统向用户空间提供系统信息以及改变操作参数的结构。 c. 热插拔事件d. 设备类型系统中许多部分对设备如何连接不感兴趣,但是他们需要知道哪些类型设备时可用的。设备模型提供了将设备分类的机制。e

18、. 对象的生命周期上述的许多功能,包括热插拔支持和sysfs ,使得内核中管理对象的工作更为复杂。设备模型需要创造一套机制管理对象的生命周期。2)Kobject如果说设备模型是一套房子的话,Kobject就是构造房子的砖块。每个注册的Kobject的都对应于Sysfs 文件系统中的一个目录。Kobject是组成设备模型的基本结构。类似于 C+的基类,它潜入于更大的对象中所谓的容器,用来描述设备模型的组件。如bus,device,drivers都是典型的容器。这些容器就是通过 kobject 连接起来,形成一个树状结构。这个树状结构就与 /sys 文件系统对应。 不过 kobject 只能建立单

19、层结构,也就是只能建立一级目录,要建立多级目录,还要使用后面要介绍的 Kset 。Kobject结构定义为:struct kobject const char *name; /指向设备名称的指针structlist_headentry;/structlist_headentry;挂接到所在kset中去的单元struct kobject *parent;/ 指向父对象的指针struct kset *kset; /所属 kset 的指针struct kobj_type *ktype; /指向其对象类型描述符的指针struct sysfs_dirent *sd; / sysfs文件系统中与该对象对应

20、的文件节点路径指针struct kref kref; /对象引用计数unsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;struct kobj_type void (*release)(struct kobject *kobj);struct sysfs_ops *sysfs_ops;struct attri

21、bute *default_attrs;相关操作函数:void kobjet_init(struct kobject*kobj)初始化 Kobjectint kobject_add(struct kobject*kobj)将 Kobject 对象注册到 linux 系统,如果失败则返回一个错误码 .intkobject_init_and_add(structkobject*kobj,kobj_type*ktype,structkobject*parent,const*fmt)初始化并注册kobject, kobject传入要初始化的Kobject对象, ktype将在后面介绍到,parent指

22、向上级的kobject对象,如果指定为NULL,将在 /sys的顶层创建一个目录。 *fmt为 kobject对象的名字。kobject 的 ktype 对象是一个指向 kobject_type 结构的指针,该结构记录了 kobject 对象的一些属性。 每个 kobject 都需要对应一个相应的 kobj_type 结构。struct kobj_typevoid (*release)(struct kobject *kobj);structsysfs_ops *sysfs_ops;struct attribute *default_attrs;release方法用于释放kobject占用的资

23、源,当 kobject引用计数为0 时被调用。kobje_type的 attribute成员:struct attributechar*name;/属性文件名structmodule *owner;mode_tmode;struct attribute(属性 ) :对应于 kobject的目录下一个文件 , name 就是文件名。kobje_type的 struct sysfs_ops成员:struct sysfs_opsssize_t (*show)(structkobejct *,struct attribute *, char *name);ssize_t(*store)(structk

24、obejct*,structattribute *, char *name);show: 当用户读属性文件时,该函数被调用,该函数将属性值存入buffer中返回给用户态;store:当用户写属性文件时,该函数被调用,用于存储用户存入的属性值。Kobject测试模块:#include#include#include#include#include#include#includeMODULE_AUTHOR(David Xie);MODULE_LICENSE(Dual BSD/GPL);void obj_test_release(structkobject*kobject);ssize_t kobj

25、_test_show(struct kobject *kobject,struct attribute *attr,char *buf);ssize_tkobj_test_store(structkobject*kobject,structattribute*attr,constchar*buf,size_t count);struct attribute test_attr = .name = kobj_config,.mode = S_IRWXUGO,;static struct attribute *def_attrs = &test_attr,NULL,;struct sysfs_op

26、s obj_test_sysops =.show = kobj_test_show,.store = kobj_test_store,;struct kobj_type ktype =.release = obj_test_release,.sysfs_ops=&obj_test_sysops,.default_attrs=def_attrs,;void obj_test_release(struct kobject *kobject)printk(eric_test: release .n);ssize_tkobj_test_show(structkobject*kobject,struct

27、 attribute *attr,char *buf)printk(have show.n);printk(attrname:%s.n, attr-name);sprintf(buf,%sn,attr-name);return strlen(attr-name)+2;ssize_tkobj_test_store(structkobject*kobject,structattribute*attr,constchar*buf,size_t count) printk(havestoren);printk(write: %sn,buf);return count;struct kobject ko

28、bj;static int kobj_test_init()printk(kboject test init.n);kobject_init_and_add(&kobj,&ktype,NULL,kobject_tes t);return 0;static int kobj_test_exit()printk(kobject test exit.n);kobject_del(&kobj);return 0;module_init(kobj_test_init);module_exit(kobj_test_exit);测试结果 :在/sys 目录下创建了 kobject_test 目录在 kobj

29、ect_test目录下有 kobj_config文件读 kobject_config文件则调用了show 函数。并在用户空间显示了show 返回的 kobject对象名字。写 kobject_config文件调用了 store 函数。3) Ksetkset 的主要功能是包容; 我们可以认为它是kobject的顶层容器。实际上,在每个kset对象的内部,包含了自己的 kobject,并且可以用多种处理kobject的方法处理kset 。如果说 kobject 是基类的话,那么 kset 就是派生类。kobject通过 kset 组织成层次化的结构, kset 是相同类型的组合。通俗的讲, kob

30、ject 建立一级的子目录, kset 可以为 kobject 建立多级的层次性的父目录。struct kset struct list_head list; /用于连接该kset中所有kobject的链表头spinlock_t list_lock;struct kobject kobj; /嵌入的kobjectstruct kset_uevent_ops *uevent_ops; /指向热插拔操作表的指针;struct kset struct subsystem * subsys; /所在的subsystem的指针struct kobj type * ktype; /指向该kset对象类型描

31、述符的指针struct list head list;struct kobject kobj;struct kset_uevent_ops * uevent_ops;包含在 kset 中的所有 kobject 被组织成一个双向循环链表,list 域正是该链表的头。 Ktype 域指向一个 kobj_type结构,被该kset中的所有kobject共享,表示这些对象的类型。 Kset 数据结构还内嵌了一个kobject 对象(由 kobj域表示),所有属于这个 kset的 kobject对象的 parent 域均指向这个内嵌的对象。此外,kset还依赖于 kobj维护引用计数: kset 的引用计数实际上就是内嵌的kobject对象的引用计数。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!