Linux Kobject

设备模型的核心部分就是kobject,下面就是它的结构体<linux/kobject.h>,

它也是设备模型的基本结构,它所处理的任务和代码也越来越多: 对象引用计数、sysfs表述、数据结构关联、热插事件处理

struct kobject {
        const char *k_name; //指向kobject名称的起始位置 

        char name[KOBJ_NAME_LEN]; /*如果名称长度小于KOBJ_NAME_LEN(20)字节,则kobject的名称便存放到name数组中,k_name指向数组头,如果大于,则动态分配一个足够大的缓冲区来存放kobject的名称,这是k_name指向缓冲区*/         

        struct kref kref; /*引用计数*/ 

        struct list_head entry; /*在所挂到链表的连接体*/         

        struct kobject *parent;   /*指向kobject的父对象,以此来在内核中构造一个对象层次结构,并且可以将多个对象之间的关系表现初来,这就是sysfs的真相:一个用户空间的文件系统,用来表示内核中kobject对象的层次结构*/
     struct kset * kset; /*指向所属的kset*/      struct kobj_type * ktype;      struct dentry * dentry; /*目录项, 指向dentry结构体,在sysfs中该结构体就表示这个kobject */   

}; 

首先写一个简单的模块

  1 #include <linux/platform_device.h>
  2 #include <linux/init.h>
  3 #include <linux/module.h>
  4
  5 static int __init test_probe(struct platform_device *pdev){
  6     int err = 0;
  7     return err;
  8 }
  9
 10 static int test_remove(struct platform_device *pdev){
 11     return 0;
 12 }
 13
 14 static struct platform_device test_device = {
 15     .name = "test_ts",
 16     .id = -1,
 17 };
 18
 19 static struct platform_driver test_driver = {
 20     .probe = test_probe,
 21     .remove = test_remove,
 22     .driver = {
 23         .name = "test_ts",
 24         .owner = THIS_MODULE,
 25     },
 26 };
 27
 28 static int __init test_init(void){
 29     platform_device_register(&test_device);
 30     return platform_driver_register(&test_driver);
 31 }
 32
 33 static int __exit test_exit(void){
 34     platform_device_unregister(&test_device);
 35     platform_driver_unregister(&test_driver);
 36 }
 37
 38 module_init(test_init);
 39 module_exit(test_exit);
 40
 41 MODULE_AUTHOR("mine");
 42 MODULE_LICENSE("GPL");
 43 MODULE_ALIAS("test");        

insmod后,现在到sys目录中查看我们的设备是否已经加载上了

首先是/sys/bus/platform/devices/
在devices下,每一个连接文件都代表了一个设备
ls可看见test_ts,进入test_ts,ls可发现driver这个链接文件,ls-l查看,发现这个文件是连到/sys/bus/platform/drivers/test_ts的
这里需要说明的是连接的含义,并不是driver驱动存在于test_ts这个设备中,而是test_ts使用的驱动为/sys/bus/platform/drivers/test_ts
现在换到/sys/bus/platform/drivers这个目录下
ls查看会发现这里的文件都为目录,而非连接文件,说明这是驱动真正放置的位置
现在进入test_ts目录,然后ls,发现有一个test_ts的连接文件,ls –l查看可发现该文件连接到/sys/devices/platform/test_ts下
回到/sys/bus/platform/devices/下ls –l也会发现test_ts连接到/sys/devices/platform/test_ts
为什么test_ts这个设备放置于/sys/devices/platform下,而不是/sys/bus/platform/devices下呢
我认为和直观性有关,在sys下有这么几个目录block  bus  class  dev  devices  firmware  kernel  module  fs power 
devices很直观的说明了设备在这个目录下,便于大家查找
而/sys/bus/platform/devices下的连接是为了分类查找

时间: 2024-11-17 10:17:38

Linux Kobject的相关文章

浅析Linux驱动模型中的底层数据结构kobject和kset

1.kobject Linux内核用kobject来表示一个内核对象.它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录.kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理.这些数据结构(容器)通过kobject连接起来,形成了一个树状结构. 它在源码中的定义为: /*<include/linux/kobject.h>*/ struct kobject

linux之Kobject

include\linux\kobject.h struct kobject { const char  *name;   //name struct list_head entry;  //链接到kset建立层次结构 struct kobject  *parent; //指向父节点,面对对象的层次结构 struct kset  *kset;   //指向所属的kset struct kobj_type *ktype;  //attribute type struct sysfs_dirent 

Linux 设备模型之 (kobject、kset 和 Subsystem)(二)

问题描写叙述:前文我们知道了/sys是包括内核和驱动的实施信息的,用户能够通过 /sys 这个接口.用户通过这个接口能够一览内核设备的全貌.本文将从Linux内核的角度来看一看这个设备模型是怎样构建的. 1.kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject相应sysfs里的一个文件夹. 从面向对象的角度来说.kobject能够看作是全部设备对象的基类,由于C语言并没有面向对象的语法,所以通常是把kobject内嵌到其它结构体里来实现类似的

Linux 设备模型之 kobject 内嵌结构

问题描述:前文我们知道了/sys是包含内核和驱动的实施信息的,用户可以通过 /sys 这个接口,用户通过这个接口可以一览内核设备的全貌.本文将从Linux内核的角度来看一看这个设备模型是如何构建的. 1.kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录.从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的作用,这

linux设备模型之内核对象kobject

linux中一切皆文件 1.内核对象kobject struct kobject { const char *name; //对象的名字 struct list_head entry; struct kobject *parent;//对象的上层 struct kset *kset; //当前对象属于的kset指针 struct kobj_type *ktype;//文件操作集 struct sysfs_dirent *sd; struct kref kref; unsigned int sta

Linux 设备文件的创建和mdev

引子 本文是嵌入式企鹅圈开篇--<linux字符设备驱动剖析>的姐妹篇,在上述文章里面我们具体描写叙述了字符设备驱动框架涉及的驱动注冊.通过设备文件来訪问驱动等知识.并明白通过device_create接口并结合mdev来创建设备文件.但没有展开这个知识点. 本文将从代码级去理解Linux设备类和设备文件的创建过程. 通过这两篇文章,我们将能够对linux字符设备驱动的机制和脉络有全面的认识. 下面程序分析没有缩进,编辑了好几次都不行,耐心点才干跟踪完整个代码:-) 一.设备类相关知识 设备类

设备模型的基础---kobject,kset

设备模型的基础是kobject,kset,kobj_type.kobject本身并没有什么意义,真正有用的地方在于嵌入了kobject的结构体(对象),kobject可以看成是一个最小单元,sysfs的层次结构中的元素都是由kobject构成. kset与kobject的关系:kset会包含一类的kobject对象(内核链表串起来),而这些对象对应在sysfs中就是同一级的各个子目录,每一个kobject对象有自己的属性,这些属性就对应于各自子目录的文件.如此,就会构成一个有层次的组织结构.ks

linux下bus、devices和platform的基础模型 【转】

转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核中由struct kobject结构表示,这个结构使所有设备在底层都具有统一的接口.kobject提供了基本的对象管理能力,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密联系,每个在内核中注册kobject对象都对应与sysfs文件系统中的一个目录;kobject--->sys

《linux内核设计与实现》读书笔记第十七章

第17章 设备与模块 四种内核成分 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系. sysfs :表示系统中设备树的一个文件系统. 17.1 设备类型 Linux系统中,设备被分为以下三种类型 块设备 通常缩写为 blkdev ,它是可寻址的,寻址以块为单位,块大小随设备不同而不同; 支持重定位(seeking )操作,也就是对数据的