可以把内核看做一个进程,其它进程对内核的系统调用就可以看做进程通信。各个驱动程序从属于内核,可以把驱动程序看做一个对象,因为同一类驱动程序只能有一个,可以用单例模式来实现。抽象驱动定义一个接口,具体硬件的驱动实现这个接口。以文件系统为例,考虑到驱动都是用C语言实现的,以下用C语言描述。
1,抽象驱动中定义文件结构体(简单起见,函数的返回类型和参数都是void):保护两个函数变量(是不是很像C++中的虚函数,只不过C++对象中存放的是虚表指针,而C中相当于直接存放了虚表)
struct file{
void(*open)();
void(*close)();
};
2,抽象驱动中定义并实现函数来查询获取指定的驱动对象:
void* get_module(int module_name);
3,抽象驱动中定义并实现函数注册驱动对象:
void register_module(int module_name, void* module);
4,实现驱动中定义结构对象,初始化并注册。在C++中,对虚表的赋值和对象虚指针的赋值是由编译器实现的,C语言编译器态简单。
void my_open(){}
void my_close(){}
struct file my_file{
.open=my_open;
.close=my_close;
};
register_module(123, &my_file);
5,外部调用驱动,只需要根据指定驱动名称调用:
struct file* this_file=get_module(123);
this_file->open();
this_file->close();
大致的结构就是这样,具体的驱动实现要考虑很多细节,比如同步问题。