1 /dev
该目录下放的是设备文件,是应用程序和内核的交互文件,应用程序通过对这些文件的读写和控制(open、write、,poll等),可以访问实际的设备。应用程序通过mknod创建的文件,如果底层驱动对mknod的设备号有对应的驱动,那么应用程序open "/dev/**"时,就会调用到底层的驱动。
2 /sys
/sys 是个文件系统,内核设备驱动中如果有调用kobj_add函数的,就会在/sys下对应目录下创建相应的文件。 它的作用是将内核注册的device、device_driver和bus通过链表组成一个树形结构,表示内核都有哪些驱动和设备以及所属的bus,便于管理。应用层也可以通过读写/sys下的文件和内核进行交互(ktype)。
3 /sys/devices
实际存放device和driver的,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备;是文件系统管理设备的最重要的目录结构;devices 中的所有设备都是连接于某种总线之下,每一种总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的重要部分;
4 /sys/dev
下面有两个子目录,block和char,存放的是块设备和字符设备的主次号,格式为:major:minor,但都是链接,指向 /sys/devices 目录下的实际设备。
Linux在Documentation\filesystems文档中有详细讲解
总结:
- bus_register注册的bus会在/sys/bus目录下生成子目录。
- device_add添加的device会在/sys/devices下生成子目录。
- 注册的driver会在/sys/bus所属的总线目录(如platform)下的drivers生成子目录。
- class_register注册的class会在/sys/class下生成子目录。
- driver有正在由其驱动的device,driver对应的目录下会有device的链接。
- device需要有驱动自身的driver,device目录下会有名为driver的文件链接到driver目录。
- device需要挂在bus下,/sys/bus下device所属的总线目录(如platform)下的devices会有对应device目录的链接。
- device会有所属的class,/sys/class具体的class目录下,也会有device的连接。
- 同是挂在platform总线下的不同设备,可以属于不同的class。
cpp
// drivers/base/init.c
/**
* driver_init - initialize driver model.
*
* Call the driver model init functions to initialize their
* subsystems. Called early from init/main.c.
*/
void __init driver_init(void)
{
/* These are the core pieces */
bdi_init(&noop_backing_dev_info);
devtmpfs_init();
devices_init(); /// 初始化devices_kset/dev_kobj/sysfs_dev_block_kobj/sysfs_dev_char_kobj
buses_init(); /// 初始化bus_kset/system_kset
classes_init(); /// 初始化class_kset
firmware_init();
hypervisor_init();
/* These are also core pieces, but must come after the
* core core pieces.
*/
of_core_init(); /// 初始of_kset
platform_bus_init(); /// 注册platform_bus和platform_bus_type
auxiliary_bus_init();
cpu_dev_init();
memory_dev_init();
node_dev_init();
container_dev_init();
}

