1 驱动作为内核模块存在,相当于一个内核动态库。
2 驱动提供一系列实现好的接口,并将其注册到操作系统中,等待操作系统按需调用。
3 驱动的初始化、接口注册等工作由init_module函数完成。该函数类似于windows 驱动中的DriverEntry。
4 init_module主要完成以下工作
1) 获取设备号。可以通过手工指定或者系统动态分配方法获取设备号。
2) 初始化设备对象,保存cdev
5 使用container_of(pointer, struct, field)宏可以获得结构体的指针。这样,就可以从cdev指针获取用户自定义的设备对象了。
6 在内核中,对用户态地址空间的访问应该通过copy_to_user和copy_from_user进行。由于可能存在调业情况,所以对用户地址空间访问的代码必需是可重入的。必要时要进行同步操作。