我在Linux内核中使用的net_device模块就某一具体问题。
让我们解决这个问题的代码示例 ,请。
当我初始化我的设备,我叫alloc_netdev,并为它提供的私人数据的大小,所以它会正确地分配它。
现在,当我打电话时snull_cleanup我想停止使用该设备,会发生什么。 我看到它基本上是免费的结构(包括私人数据)。
现在的问题是,如果有什么当前正在运行的代码是我的设备模块内的内部功能使用由卡利netdev_priv()得到了私人数据,holdes私有数据的引用,所有的突然我得到了内核上下文切换-space朝snull_cleanup功能 - 这将释放私有数据。
然后,上下文切换时回函数保持的参考私人数据,难道不我得到一个释放结构的参考?
我会很高兴,如果你能为我解决这问题,谢谢
我最初的想法是,它没有任何意义:这是您的私人数据,以便自己和处理 - 您已经分配它,所以你必须释放它。 这对私人数据的通用模式-你可以看到它,例如,在struct bio
。 但我所看到的是一个非常肮脏的黑客。
所以,我看着alloc_netdev代码,这就是我发现。
你不分配您的私人结构,你可以通过大小alloc_netdev
。 如果您通过您的私人数据的大小alloc_netdev
(第一个参数),那么它将使大小的分配:
ALIGN_OF_32( sizeof(struct net_device) + sizeof(struct snull_private) )
因此,您的私人数据结构net_device中的固有的一部分 - 这是后追加
Whole struct net_device
you're working with
+-------------------------------+
| +---------------------------+ |
| | | |
| | | |
| | Actual struct net_device | |
| | | |
| | | |
| +---------------------------+ |
| | --> Your private data <-- | |
| +---------------------------+ |
| | Alignment to 32 | |
| +---------------------------+ |
+-------------------------------+
要获得私有数据使用netdev_priv
,只是增加了大小struct net_device
的指针从而让您的私人数据的起始地址:
static inline void *netdev_priv(const struct net_device *dev)
{
return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
}
与释放装置free_netdev
会收回整个结构,包括私有数据。 虽然不会马上完成,所以你就可以访问您的数据一段时间。
这棘手的事情会让你的结构缓存友好合作,从而带动你的表现。 貌似认为有道理只为net_device的寿命,所以如果你想消灭你net_device中可以嵌入的net_device本身到您的结构后,有一些数据这个私人数据,所以你的结构将类型的包装。