日期:2014-05-16  浏览次数:20555 次

以模块B对kernel中的函数指针进行赋值可行否?

  我现在在做模块移植。以前模块A的功能是全部写在内核的/net/bridge目录下的。现在我要做的事就是把模块A的功能全部移值出来,形成一个模块B,模块B会以insmod的形式运行。

  移值的具体方法为:以前模块A嵌在bridge中的功能函数,全部放到模块B中去。而在bridge目录里各个文件中的原调用点,全部放上函数指针,因为功能函数经过整合,所以放函数指针的位置大概只有五六处,还可以容忍。

  同时kernel里对外提供一个接口,让模块B对这些函数指针进行赋值,把原来的处理函数赋给这些指针。以便kernel调用。

  我的问题是:

  1.以上的思路是否可行?如果可行,能否提供一个例子让我参考一下。或者贴部分代码示意一下?

  2.模块B中还有些数据是kernel里的函数指针运行时要使用的。我就在模块B中用static定义这些数据,在kernel中用extern声明一下,是不是就可以用了?
  如果不是,要如何才可用?也请给个例子。。。。。。。

  多谢诸位赐教~~~~

------解决方案--------------------
1、 估计不行内嵌的模块会先于insmod,被调用会发现你的函数指针为空(非法更杯具)。
2、 被声明static的变量只能在本文件内有效,在别的地方extern声明编译“应该”是会出错的,如果你真的想给外部使用你的数据应该是提供接口,而不是让别人直接访问你的数据,如果非要直接访问数据,那么你就没必要分模块了。
------解决方案--------------------
当然可以了,linux是单内核结构,所有kernel模块都是共享内存地址的,
比如说linux的设备驱动程序就是这样的,我们去填充file_operations里面得各个函数指针,
而这些函数指针则是有内核中的其他模块调用的
------解决方案--------------------
怎么可以用static申明变量,然后再其他模块中间用extern来应用了,就直接定义成全局变量就可以了
------解决方案--------------------
可以的,EXPORT_SYMBOL 了就可以复制那些了。使用的时候判断是不是为空咯
------解决方案--------------------
探讨

1、 估计不行内嵌的模块会先于insmod,被调用会发现你的函数指针为空(非法更杯具)。
2、 被声明static的变量只能在本文件内有效,在别的地方extern声明编译“应该”是会出错的,如果你真的想给外部使用你的数据应该是提供接口,而不是让别人直接访问你的数据,如果非要直接访问数据,那么你就没必要分模块了。