在字符设备中使用struct cdev这种结构来描述设备。
应用程序:读写文件,点灯;获取按键。用一些接口调用驱动程序去实现一些引用。
open这些函数,是C库实现的。从而进入内核,C库怎么进入内核?本质上,这些函数对应的汇编指令会引发一个异常,类似于中断一样,发生了就会进入相应的异常处理函数(进入到了内核空间)。根据发生异常的原因,调用不同的处理函数,比如sys_open,sys_read函数等 (内核的接口处就是系统调用的接口)。
最简单的莫过于led:
中间就依赖于驱动程序框架。
过程:
驱动运行的方式有两种,其中有一种就是将驱动编译为模块,启动内核的时候,就使用命令加载驱动模块。这里就涉及到两个函数:
module_init(xxx_init); //注册模块加载函数 入口函数
module_exit(xxx_exit); //注册模块卸载函数 出口函数
字符设备注册和注销:
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)
一般字符设备的注册在入口函数中进行,字符设备的注销在出口函数中进行。
现在,我们可以看到已经定义了file_operations结构体,这个结构体就是设备的具体操作函数。现在就需要对用到的函数尽心初始化。比如open /realease/read/write。
附上面试题: