木其工作室(专业程序代写服务)[原]ok6410学习笔记(11.kobject学习记录)
2013-06-19 14:35
357 查看
优质代写程序 代写Assignment程序 定制软件 设计程序 专业代写IT 大学生程序代写
1.目前学习了三种基于ram的文件系统,有ramdisk(实际上是ext2,ext3文件系统),proc,sysfs系统。
2.根目录下sys文件下:
block:里面包含所有块设备,即设备的属性文件。
BUS:包含所有总线,有ide,pci,usb等,里面还有两个文件夹devices和drives。devices目录包含系统中所有属于该总线的设备,drives包含所有注册该总线的驱动。
Class:按照功能分类
Devices:包含系统所有设备
Kernel:内核中的配置参数
Module:系统中的所有模块的信息
Firmware:系统中的固件
Fs:描述系统中的文件系统
Power:系统中的电源选项
他们之间的关系用下图来解释:不管是怎么分类的最后都会找到Devices文件里面
3.kobject的作用是在sys目录下面,创建文件夹和文件的。每个kobject都对应sysfs中的一个目录。
2.在模块初始化函数中,使用kobject_init和kobject_add 或者 使用kobject_init_and_add参数需要
(1).struct kobject my_koject
(2).struct kobj_type my_kobject_type(包含struct sysfs_ops my_kobject_ops和struct attribute my_kobject_file)
(3).struct kobject *parent 这里没有所以就用NULL
(4).kobject的名字
3.填写struct kobj_type ,struct sysfs_ops ,struct attribute三个结构,其中struct attribute是数组指针
4.填写ops的操作函数
5.卸载模块函数
的参数很像
2.这几个函数一直不太明白怎么用
.
3.kobject中最重要的结构struct kobj_type{
void(*release) () ;
struct sys_ops * ;
struct attribute ** ;
}
sys_ops中有show和store两个函数,这两个函数方法对应这一个目录 而不是一个文件,对于属性文件的操作,要靠自己在函数中通过attribute的name参数进行区分。
4.struct attribute** 被赋值的一般是一个数组指针,数组类型是struct attribute结构体类型。把所有要创建的属性文件都放进这个数组中。然后赋值给struct attribute **
5.struct attribute结构体 是用来创建属性文件的,包含文件名name,和文件权限mode(可读,可写,可执行等)。
在ok6410开发板上对于属性文件也是读取不到数据的,写入的可以,但是是一直循环写入,不知道为什么~~~
原因找到了,就是show和store的返回值,一个是strlen(buf),一个是count,不能return 0 会出错误。
kobject.c:
作者:qq418674358 发表于2013-6-19 14:35:20 原文链接
阅读:57 评论:0 查看评论
1.目前学习了三种基于ram的文件系统,有ramdisk(实际上是ext2,ext3文件系统),proc,sysfs系统。
2.根目录下sys文件下:
block:里面包含所有块设备,即设备的属性文件。
BUS:包含所有总线,有ide,pci,usb等,里面还有两个文件夹devices和drives。devices目录包含系统中所有属于该总线的设备,drives包含所有注册该总线的驱动。
Class:按照功能分类
Devices:包含系统所有设备
Kernel:内核中的配置参数
Module:系统中的所有模块的信息
Firmware:系统中的固件
Fs:描述系统中的文件系统
Power:系统中的电源选项
他们之间的关系用下图来解释:不管是怎么分类的最后都会找到Devices文件里面
3.kobject的作用是在sys目录下面,创建文件夹和文件的。每个kobject都对应sysfs中的一个目录。
驱动结构:
1.注意kobject只在2.6以上的内核中才有。2.在模块初始化函数中,使用kobject_init和kobject_add 或者 使用kobject_init_and_add参数需要
(1).struct kobject my_koject
(2).struct kobj_type my_kobject_type(包含struct sysfs_ops my_kobject_ops和struct attribute my_kobject_file)
(3).struct kobject *parent 这里没有所以就用NULL
(4).kobject的名字
3.填写struct kobj_type ,struct sysfs_ops ,struct attribute三个结构,其中struct attribute是数组指针
4.填写ops的操作函数
5.卸载模块函数
重点函数:
1.在2.6.18的内核中kobject_init和kobject_add只有一个参数就是struct kobject *my_koject 但是总是模块挂载不成功,应该是内核版本问题,并且kobject_init_and_add没有定义。在2.6.36中kobject_init(&my_kobject,&my_kobject_type);和kobject_add(&my_kobject,NULL,"sys_my_kobject");跟kobject_init_and_add(&my_kobject,&my_kobject_type,NULL,"sys_my_kobject");的参数很像
2.这几个函数一直不太明白怎么用
.
3.kobject中最重要的结构struct kobj_type{
void(*release) () ;
struct sys_ops * ;
struct attribute ** ;
}
sys_ops中有show和store两个函数,这两个函数方法对应这一个目录 而不是一个文件,对于属性文件的操作,要靠自己在函数中通过attribute的name参数进行区分。
4.struct attribute** 被赋值的一般是一个数组指针,数组类型是struct attribute结构体类型。把所有要创建的属性文件都放进这个数组中。然后赋值给struct attribute **
5.struct attribute结构体 是用来创建属性文件的,包含文件名name,和文件权限mode(可读,可写,可执行等)。
本节代码:
注意:本节代码只能运行在linux2.6.36的内核的 ok6410上,我的2.6.18的redhat模块挂载不上。在ok6410开发板上对于属性文件也是读取不到数据的,写入的可以,但是是一直循环写入,不知道为什么~~~
原因找到了,就是show和store的返回值,一个是strlen(buf),一个是count,不能return 0 会出错误。
kobject.c:
#include <linux/device.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/string.h> #include <linux/sysfs.h> #include <linux/stat.h> #include <linux/kobject.h> MODULE_AUTHOR("Hao"); MODULE_LICENSE("Dual BSD/GPL"); struct kobject my_kobject; ssize_t my_show(struct kobject *kobject,struct attribute *attr,char *buf) { printk(KERN_EMERG"IN my_show\n"); strcpy(buf,"you are reading!!!"); //在sys文件系统中读属性文件的时候应该读出 you are reading!!! return 0; } ssize_t my_store(struct kobject *kobject,struct attribute *attr,char *buf,size_t size) { printk(KERN_EMERG"write : %s\n",buf); //在写属性文件的时候 应该在这里打印出来 return 0; } void my_release(struct kobject *my_koject) { printk(KERN_EMERG"being release\n"); } struct sysfs_ops my_kobject_ops={ //对sys文件夹下面sys_my_kobject文件夹的文件进行操作的函数集 .show=my_show, .store=my_store, }; struct attribute my_kobject_file={ //对sys文件夹下面sys_my_kobject文件夹里面创建文件即文件属性 .name="my_kobject_file", .mode=S_IRWXU, }; static struct attribute *def_attrs[] = { &my_kobject_file, NULL, }; struct kobj_type my_kobject_type={ //kobject属性 包含sysfs_ops和attribute .release=my_release, .sysfs_ops=&my_kobject_ops, .default_attrs=def_attrs, }; /*struct kobject my_kobject= { .name="sys_my_kobject", .ktype=&my_kobject_type, };*/ //2.6.18版本的koject_init和koject_add只有一个参数所以应该先把这些值都赋值给kobject //但是2.6.18版本的这个模块始终挂不上 不知道为什么~~ int my_kobject_init(void) { /*需要1.struct kobject my_koject 2.struct kobj_type my_kobject_type(包含struct sysfs_ops my_kobject_ops和struct attribute my_kobject_file) 3.struct kobject *parent 这里没有所以就用NULL 4.kobject的名字 */ //kobject_init_and_add(&my_kobject,&my_kobject_type,NULL,"sys_my_kobject"); kobject_init(&my_kobject,&my_kobject_type); kobject_add(&my_kobject,NULL,"sys_my_kobject"); printk(KERN_EMERG"module insmod success!!!\n"); } void my_kobject_exit (void) { kobject_del(&my_kobject);//删除koject对象 printk(KERN_EMERG"module rmmod success!!!\n"); } module_init(my_kobject_init); module_exit(my_kobject_exit);
作者:qq418674358 发表于2013-6-19 14:35:20 原文链接
阅读:57 评论:0 查看评论
相关文章推荐
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(12.kset学习记录)
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(19.块设备驱动程序设计)
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(13.总线设备驱动)
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(18.linux串口驱动程序设计)
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(14.platform平台总线驱动模型)
- 木其工作室(专业程序代写服务)[转]Linux设备驱动程序学习-中断处理
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(16.按键中断控制led驱动)
- 木其工作室(专业程序代写服务)[转]每个程序员都应该学习使用Python或Ruby
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(15.platform平台总线驱动模型之混杂设备驱动led)
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(17.中断下部分之工作队列)
- 木其工作室(专业程序代写服务)[原]数据结构学习笔记(1.大O表示法和顺序表)
- 木其工作室(专业程序代写服务)[转]学写块设备驱动(一)----了解gendisk及request处理函数
- 木其工作室(专业程序代写服务)[转]学写块设备驱动(二)----更换IO调度器
- 木其工作室(专业程序代写服务)[转]学写块设备驱动(三)----踢开IO调度器,自己处理bio(上)
- 木其工作室(专业程序代写服务)[转]学写块设备驱动(三)----踢开IO调度器,自己处理bio(下)
- 木其工作室(专业程序代写服务)[转]linux中断处理体系结构
- 木其工作室(专业程序代写服务)[转]linux块设备读写流程(一篇很难的块设备文件 没怎么看懂)
- 木其工作室(专业程序代写服务)
- 木其工作室(专业程序代写服务)[原]c语言复习课程1(唐老师答疑课)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Struts2_实战演练(中)>(三十九)