kobject的容器kset與hotplug

2021-07-12 04:31:41 字數 3544 閱讀 3354

ps: linux 無法登入ssh

1.檢查linux下sshd 服務 ps -e | grep ssh*

2.重啟服務 service /etc/ssh restart

3.ufw disbale 關閉防火牆

struct kset:

struct kset ;

struct kset_uevent_ops ;

操作函式

//初始化kset_init

extern

void kset_init(struct kset *kset);

//註冊kset

int kset_register(struct kset *k)

kset_init(k); //初始化

err = kobject_add_internal(&k->kobj);//建立目錄

kobject_uevent(&k->kobj, kobj_add); // 如果設定 config_hotplug ,將向核心傳送事件通知使用者空間

熱插拔過程分析

//注意: kobject物件要支援熱插拔必須要有它的容器kset,孤立的kobject是無法支援熱插拔的

int kobject_uevent(struct kobject *kobj, enum kobject_action action)

kobject_uevent_env(kobj, action, null);

//找到頂層的kset

top_kobj = kobj;

while (!top_kobj->kset && top_kobj->parent)

top_kobj = top_kobj->parent;

//獲得頂層的kset的uevent_ops

kset = top_kobj->kset;

uevent_ops = kset->uevent_ops;

//事件是否被頂層過濾

uevent_ops->filter(kset, kobj)

subsystem = uevent_ops->name(kset, kobj);

//準備傳送使用者空間的訊息

env = kzalloc(sizeof(struct kobj_uevent_env), gfp_kernel);

retval = add_uevent_var(env, "action=%s", action_string);

retval = uevent_ops->uevent(kset, kobj, env);

#if defined(config_net)

//傳送 netlink

retval = netlink_broadcast_filtered(uevent_sock, skb,

0, 1, gfp_kernel,

kobj_bcast_filter,

kobj);

#else

//call_usermodehelper

核心:

#include

#include

#include

#include

static

struct kobject * parent = null;

static

struct kobject * child = null;

static

struct kset * p_kset =null;

static

struct attribute child_attr = ;

static ssize_t attr_show(struct kobject *kobj, struct attribute *attr,char *buf)

static ssize_t attr_store (struct kobject *kobj,struct attribute *attr,const

char *buf, size_t count)

return count;

}static

struct sysfs_ops attr_ops =;

static

struct kobj_type attr_ktype=;

static

int __init kobject_test_init(void)

static

void __exit kobject_test_exit(void)

module_init(kobject_test_init);

module_exit(kobject_test_exit);

module_author("derrick email: [email protected]");

module_license("gpl v2");

module_description("kobject test module");

module_alias("kobject test module");

使用者空間:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define netlink_test 21

#define max_payload 1024

int main(int argc, char* argv)

bind(pfd.fd,(void *)&nls,sizeof(struct sockaddr_nl));

while(-1!=poll(&pfd,1,-1))

i=0;

while(iprintf("%s\n",buf+i);

i+=strlen(buf+i)+1;}}

printf("poll error\r\n");

return0;}

test:

#....# echo '1' > /sys/pa_obj/pb_obj/child_attr

attr_store

buf[0] = 0x31

flag= 1remove@/pa_obj/pb_obj

action=remove

devpath=/pa_obj/pb_obj

subsystem=p_kset

seqnum=1536

# echo '0' > /sys/pa_obj/pb_obj/child_attr

attr_store

buf[0] = 0x30

flag= 0add@/pa_obj/pb_obj

action=add

devpath=/pa_obj/pb_obj

subsystem=p_kset

seqnum=1537

體會: netlink sys 這兩種都可以使用者空間和核心空間交換資料

linux裝置驅動模型之 kset原理與例項分析

1 kset kset是具有相同型別的kobject的集合,在sysfs中體現成乙個目錄,在核心中用kset資料結構表示,定義為 2 kset操作 1 int kset register struct kset kset 在核心中註冊乙個kset 2 void kset unregister str...

servlet容器與Apache容器的區別

兩者的定位 apache是http web伺服器,tomcat是web伺服器 兩者的區別 1 apache是世界上最流行的web伺服器 其次是微軟的iis 可以處理http請求,預設埠是80 tomcat是執行在apache上的應用伺服器,它是乙個servlet容器,也可以單獨執行的。2 apach...

順序容器與關聯容器的不同

想要理解關聯容器與順序容器的不同,最關鍵的是理解其基礎的資料結構,這樣就很自然的理解它所表現出來的性質。兩類容器的根本差別在於,順序容器中的元素是 順序 儲存的 鍊錶容器中的元素雖然不是在記憶體中 連續 儲存的,但仍然是按 順序 儲存的 理解順序的關鍵,是理解容器支援的操作形式以及效率。對vecto...