我正在开发一个模块,该模块充当mac80211模块和ath9k设备驱动程序之间的一层(我通过导出ath9k_ops,然后在模块中对其进行访问并更改回调函数以指向模块中的函数来完成此操作) 。
目前,我的模块仅拦截mac80211回调操作(通过struct ieee80211_ops
)并将其转发给设备驱动程序。
struct ieee80211_ops
的一部分是:
struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, struct sk_buff *skb);
/* other callback functions ... */
}
这样,当模块80211调用回调函数(*tx)
时,我可以访问结构ieee80211_hw
,ieee80211_tx_control
,sk_buff
的成员,但指向私有数据的指针除外。设备:
struct ath_softc *sc = hw->priv;
我不遵循的是ath9k设备驱动程序的原始回调函数(我在回调函数末尾调用)执行完全相同的操作:
static void ath9k_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{
struct ath_softc *sc = hw->priv;
/* other code accessing members of struct ath_softc normally */
}
那么,为什么我的模块不能访问私有数据,而ath9k模块却可以呢? hw->
我想我提供了有关该问题的足够信息,因为该问题可能与保护私有数据不受其他模块访问私有数据的方式有关,这是我不了解内存如何完全发挥作用的错误linux内核。
非常感谢。让我知道是否值得提供有关该问题的更多信息。