学习Linux内核驱动框架记录。
宏内核与微内核的区别
宏内核:内核是一个大箩筐,什么都可以往里装。哈哈,就是本来可以放在用户态的驱动,为了效率放在了内核里,作为内核的核心模块(调度、内存、驱动、文件系统)。内核与驱动之间的通信是不需要进程间通信(IPC)的,所以运行效率很高,但是一个模块崩了所有模块都坏了,并且体积增大。
使用宏内核的操作系统:Linux(linux其实算半个,因为驱动程序在用户态和内核态都有分布)、Unix
宏内核的特点:
微内核:将驱动程序放在用户态,不放在内核里,不作为内核的核心模块(调度、内存)。内核与驱动是需要进程间通信的,自然调用的效率就下降了。稳定,驱动等出现问题退出,不会影响内核。如果内核有问题会蓝屏(windows)、死机(linux)。
使用微内核的操作系统:Windows、微软的Fucshla、Mac。鸿蒙OS也宣称是微内核。
微内核的特点:
混合内核:
实际上Mac和Windows都是混合内核,包括鸿蒙。
Linux内核的模块机制
虽然Linux是宏内核,但是Linux有模块机制Loadable Kernel Module。从开发的角度讲,对一个模块进行开发时,不需要重新加载,重启内核,使用insmod,rmmod即可。从运行时讲,模块的加载和卸载时动态的、从产品化的角度讲,他的功能是可以根据模块进行裁剪和定制的;
1 源码内模块的编译
主要在两个文件,一个是KConfig,用于给用户配置是否决定编译该模块、静态/动态编译该模块。另一个是Makefile,就是文件本身的编译控制。
KConfig:
tristate表示有三种选择,静态编译(* ),可加载模块(M),和默认。选择M以后就可以使用insmod和rmmod进行动态加载卸载了。
bool表示有两种选择,静态编译和默认。
Linux驱动框架中 总线、驱动和设备的关系是什么?
总线有例如USB总线、串口总线等。
各子总线系统向内核注册自己;
各驱动向自己属于的总线注册自己;
当设备连接时,设备向总线注册自己。(而此时,我猜应该是发生了一些操作,例如总线匹配对应的驱动,并将该鼠标设备交给该串口驱动管理,进行读写控制。)