#include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/kobject.h> struct my_kobj { int val; struct kobject kobj; }; struct my_kobj *obj1, *obj2; struct kset *my_kset; struct kobj_type my_type; struct attribute name_attr = { .name = "name", .mode = 0444, }; struct attribute val_attr = { .name = "val", .mode = 0666, }; struct attribute *my_attrs[] = { &name_attr, &val_attr, NULL, }; ssize_t my_show(struct kobject *kobj, struct attribute *attr, char *buffer) { struct my_kobj *obj = container_of(kobj, struct my_kobj, kobj); ssize_t count = 0; if (strcmp(attr->name, "name") == 0) { count = sprintf(buffer, "%s\n", kobject_name(kobj)); } else if (strcmp(attr->name, "val") == 0) { count = sprintf(buffer, "%d\n", obj->val); } return count; } ssize_t my_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size) { struct my_kobj *obj = container_of(kobj, struct my_kobj, kobj); if (strcmp(attr->name, "val") == 0) { sscanf(buffer, "%d", &obj->val); } return size; } struct sysfs_ops my_sysfsops = { .show = my_show, .store = my_store, }; void obj_release(struct kobject *kobj) { struct my_kobj *obj = container_of(kobj, struct my_kobj, kobj); printk(KERN_INFO "obj_release %s\n", kobject_name(&obj->kobj)); kfree(obj); } static int __init mykset_init(void) { printk(KERN_INFO "mykset_init\n"); my_kset = kset_create_and_add("my_kset", NULL, NULL); if (!my_kset) { return -ENOMEM; } obj1 = kzalloc(sizeof(struct my_kobj), GFP_KERNEL); if (!obj1) { kset_unregister(my_kset); return -ENOMEM; } obj1->val = 1; obj2 = kzalloc(sizeof(struct my_kobj), GFP_KERNEL); if (!obj2) { kset_unregister(my_kset); kfree(obj1); return -ENOMEM; } obj2->val = 2; obj1->kobj.kset = my_kset; obj2->kobj.kset = my_kset; my_type.release = obj_release; my_type.default_attrs = my_attrs; // default attr for object. my_type.sysfs_ops = &my_sysfsops; kobject_init_and_add(&obj1->kobj, &my_type, NULL, "mykobj1"); // parent is null, but kset is present kobject_init_and_add(&obj2->kobj, &my_type, NULL, "mykobj2"); return 0; } static void __exit mykset_exit(void) { printk(KERN_INFO "mykset_exit\n"); kobject_del(&obj1->kobj); kobject_put(&obj1->kobj); kobject_del(&obj2->kobj); kobject_put(&obj2->kobj); kset_unregister(my_kset); return; } module_init(mykset_init); module_exit(mykset_exit); MODULE_LICENSE("GPL");
kobj,ktype,kset
最新推荐文章于 2024-10-13 18:47:07 发布