Kobject浅析
面向对象的思想的确在应用软件的开发中颇具优势,它让一个个纯逻辑的函数和数据变成了一个个有生命的个体。鉴于性能的考虑,系统软件的实现(例如linux kernel)并没有采用面向对象的语言(如C++、Java)。但这丝毫没有影响到用小c找对象。
简单来说,一个对象包含数据以及对这些数据的操作。如果把银行比作一个对象的话,银行里的RMB就是数据、而银行的工作人员就相当于对象中方法(即操作数据的结构)。如果,我们想打劫银行的话,我们只需要拿着枪指着工作人员说,“亲,给我拿500万出来”。当然,如果你是一个比较牛逼的劫匪你可能要1000万,或者更多。这没有关系,因为无论你要多少钱,你都不必亲自动手去取,工作人员会帮你办好这一切。当你拎着一袋子钱溜走的时候,你可能会想说,“自从有了面向对象,腰不酸了、腿不疼了,打劫也更有效率了”。
这个例子只是想说明面向对象的一个显而易见的优点——给劫匪,哦不,给用户提供了可直接使用的接口。当然,面向对象的优点可不只这一点。
kobject是Linux设备驱动模型的核心部分,它的作用是简单点说就是嵌入到设备和驱动相关的结构体之中。既可以将这些设备和驱动组织成树形结构,又可以让用户通过sysfs直接控制驱动和设备。让我们来搭讪一下kobject,从她那儿看看有对象的好处。
我们哲学老师在提问一个学生之前都会先问学生的家乡在哪儿。据他的逻辑应该是一方水土养一方人,从一个人的家乡可以大致推断出他的性格等。 不管这个理论对不对,我们先看看kobject的家乡——include/linux/kobject.h,kobject在这里定义:
1 | struct kobject { |
struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
1 |
|
struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
};
1 |
|
/**
* This is a simple module for kobject test.And it is licensed under the terms
* of GNU/GPL v3 or later.
* Wang Sen (C) <wangsen@linux.vnet.ibm.com>
* 2012.3.23
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/list.h>
#include <linux/stat.h>
#include <linux/string.h>
#define BUF_SIZE 128
MODULE_LICENSE("GPL");
static char asset[BUF_SIZE] = "Hello Kitty";
static void test_release(struct kobject *kobj);
static ssize_t test_show(struct kobject *, struct attribute *, char *);
static ssize_t test_store(struct kobject *, struct attribute *, const char *, size_t);
static void test_release(struct kobject *kobj)
{
if (kobj == NULL) {
return;
}
printk("------[kobject_test]Hello,test_release is dancing\n");
}
static ssize_t test_show(struct kobject *kobj, struct attribute *attr, char *buf)
{
sprintf(buf, "asset:%s\nkobject_name:%s\n", asset,kobj->name);
return strlen(buf);
}
static ssize_t test_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t size)
{
if (strlen(buf) > BUF_SIZE) {
return E2BIG;
}
memset(asset, 0, BUF_SIZE);
sprintf(asset, "%s", buf);
return strlen(buf);
}
struct attribute test_attr = {
.name = "info",
.mode = S_IRWXUGO,
};
struct attribute test_attr_1 = {
.name = "addr",
.mode = S_IRWXUGO,
};
struct attribute *attr_array[] = {
&test_attr,
&test_attr_1,
NULL
};
struct sysfs_ops test_sysfs_ops = {
.show = test_show,
.store = test_store,
};
struct kobject test_kobject;
struct kobj_type test_kobj_type= {
.release = test_release,
.sysfs_ops = &test_sysfs_ops,
.default_attrs = attr_array,
};
static int __init kobj_test_init(void)
{
printk("------kobject init...");
kobject_init_and_add(&test_kobject, &test_kobj_type, NULL, "test_object_of_kelvin");
return 0;
}
static void __exit kobj_test_exit(void)
{
kobject_put(&test_kobject);
printk("------See you");
}
module_init(kobj_test_init);
module_exit(kobj_test_exit);
MODULE_AUTHOR("Wang Sen <senwang@linux.vnet.ibm.com>");
```
参考文献:
- 《LINUX设备驱动程序》 第三版 Jonathan Corbet,Alessandro Rubini,Greg Kroah-hartman
- http://linux.chinaunix.net/techdoc/system/2008/07/19/1018480.shtml
- http://blog.21ic.com/user1/5593/archives/2010/69112.html
- http://blog.csdn.net/yili_xie/article/details/5835935
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 三木的技术博客!
评论