Linux模块的实现机制可移出符号
扫描二维码
随时随地手机看文章
在某种意义上来说,从可安装模块的角度来看,内核也是一个模块,只不过是一个不可安装的模块。既然把可安装模块安装到了内核这个模块上并向内核提供服务.那么这些可安装模块就必须有与内核交互的手段。实现两个模块之间交互的最简单的手段就是实现双方的变量和函数的共享.
为了使被安装模块知道内核的哪些变量和函数是模块可以使用的,Linux内核以“可移出”符号的形式提供了可供其他模块共享的变量和函数名称。这里所谓的“可移出”,是指外部可以引用,即是暴露在内核外面的符号。在文件中,可移出符号的定义形式如下:
而模块在需要引用内核的一个“可移出”符号时,要把该符号用extern声明为外部引用。
为了使加载的各模块之间也可通过可移出符号进行交互,模块也可声明自己的移出符号,以供其他模块使用。所以这些移出符号可看做是内核与模块以及模块之间的信号通路,模块之间就是通过这些内核或模块的可移出符号实现交互的。
但需要注意的是,模块可以引用内核及其他模块的可移出符号,而内核不能引用模块的可移出符号。也就是说,内核与模块之间的互连是一种“单向”的互连。 模块与内核之间连接示意图如图所示。
图 模块和内核的连接