在sys下的对某个文件进行cat和echo是调用在用sysfs_create_file创建文件的时候,填的第二参数;里面有实现show和store的函数
device_create
|
+ -- kzalloc struct device
|
+---device_register
|
+-----device_initialize
|
+-----device_add
---------------------
device_register()函数会在/sys/devices下创建一个对应的目录;
bus_create_file()是在sysfs下创建一个文件夹
create_dir(kobj),这个函数作用是在sysfs下创建一个文件夹
device_create函数来在/dev目录下创建相应的设备节点
加载模块的时候,用户空间中的udev会自动响应 device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点
uevent根据dev的属性文件在/dev下创建文件
而uevent把事件上报给用户空间有两种途径:
1.通过kmod模块,直接调用用户空间的可执行程序或脚本。
2.通过netlink通信机制,将事件从内核空间传递到用户空间。
kobject_add() -> create_dir() -> sysfs_create_dir()
每当我们新增一个kobject结构的时候,同时会在/sys下创建一个目录。
sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
传给它的参数是kobj和attr,其中,kobject对应的是文件夹,attribute对应的是该文件夹下的文件。
1、目录项(/sys/kernel/helloworld):通过函数kobject_create_and_add("helloworld", kernel_kobj)可以在/sys/kernel下建立一个helloworld目录项。
2、属性文件(hello_value):通过函数sysfs_create_file(helloworld_kobj, &hello_value_attribute)建立。这个也同时建立了文件与操作之间的联系和对应。
3、操作(hello_show、hello_store):在sys系统中对文件的操作有2个函数,一个是show,一个是store,这两个函数和普通文件的read和write函数有点类似,是他们的精简版。对于sprintf和sscanf是对copy_from_user和copy_to_user函数的封装。