linux内核的主要组成部分由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS),网络接口(NET),进程间通信(IPC)
查看linux系统的总线ls /sys/bus
查看linux系统的设备cat /proc/devices
Linux驱动和设备的注册过程
Linux 内核会要求每出现一个设备就要向总线汇报,或者说注册,出现一个驱动,也要向总线汇报,或者叫注册。
在系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立一个struct_device 的变量,然后将设备的变量插入到devices 链表系统初始化任意一个驱动程序的时候,就要准备一个struct device_driver 结构的变量,然后将驱动的变量插入到drivers 链表
Linux 总线是为了将设备和驱动绑定,方便管理。在系统每注册一个设备的时候,会寻找与之匹配的驱动(后面的热拔插设备会用到这个注册流程);相反,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。
先注册设备再注册驱动
在注册驱动的时候,系统会通过platform_match 函数匹配设备和驱动。注册设备的结构体为platform_device,注册驱动的结构体为platform_driver。设备和和驱动结构体的成员name 字段,相同则匹配如果匹配了则会调用platform_driver 中的probe 函数,注册驱动。
设备节点
上层应用使用设备节点访问对应的设备
ls /dev
上层应用有一套标准的接口文件和函数用来和底层通信。Linux 将所有对设备的操作全部都抽象为对文件的操作,常用的文件操作函数有open、close、write、read、write 等。
设备注册
platform结构体
内核文件include/linux/platform_device.h文件中查看platform_device.
struct platform_device{
const char *name,//设备名称,在sys/devices会显示
int id;//设备id,用于插入总线并具有相同的name的设备编号,只有一个则是-1;
struct device dev;//结构体内嵌device结构体
u32 num_resources;//设备使用的资源数量
struct resource *resource;//设备组使用的资源数组
const struct platform_device_id *id_entry;
struct mfd_cell *m