上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4.3 模块功能的注册和取消
应用程序的作用通常是运行后完成一定的功能,模块的主要任务是为当前内核中的其他组件提供服务。某个时候内核以模块的方式增加了新功能,运行一段时间后,当不再需要这种功能时,可能将其移去。在系统启动阶段我们无从知道将会有什么功能以模块的形式加入到系统中,所以我们需要为模块提供接口来注册。内核中各组件都有相应的模块注册的接口(如注册和取消网络驱动程序、文件系统、协议等)。
这些接口很容易从其函数名识别出来,一般是以register_...和unregister_...开始的函数。表1-3中给出了一些接口的函数示例。
表1-3 内核组件模块注册和取消函数
模块的注册和初始化由模块自己的init_mudule方法来完成。如前所述,该函数是在模块成功地集成到内核中后直接被调用。init_模块需要完成所有的模块初始化任务,如申请内存空间,创建在 /proc文件系统中的入口,初始化数据结构,注册函数等。
init_模块函数执行成功后,模块的功能就被内核识别了,而且它需要的所有初始化过程都应该运行结束;如果在初始化过程的某个环节出了错,所有在此之前执行的动作都应回退。因为,当init_模块返回的是错误代码时,模块的目标代码会从内核地址空间卸载,所以任何对该模块原地址空间的访问都会导致不可预期的错误。
模块自己的方法cleanup_模块,是用于将模块从内核地址空间卸载的。它需要清除原模块的所有运行环境(注销模块的功能,释放模块占用的内存,去掉内核中模块间和部件间的相互依赖关系)。一旦调用了cleanup_模块,内核或其他模块就不应该再引用该模块了,否则会导致存储器访问出错,造成系统崩溃。