我正在使用Linux内核版本2.6。 我想同步访问单个 net_device结构。 在内核代码中搜索答案时,我遇到了与此问题相关的两种同步机制:
dev_base_lock 锁定。
rtnl_lock()函数。
我的问题是:
两者有什么区别?
是否有使用上述其中一项的拇指规则?
谢谢!
答案 0 :(得分:2)
您可以参考<< 中的“8.15。锁定”一章。了解linux网络内部>>
dev_base
列表和两个哈希表dev_name_head
和dev_name_index
受dev_base_lock
保护。但是,该锁只用于序列化对列表和表的访问,而不是序列化对net_device数据结构内容的更改。 net_device内容更改由Routing Netlink信号量(rtnl_sem)处理,该信号量分别与rtnl_lock
和rtnl_unlock
一起获取和释放。[*]此信号量用于序列化对net_device实例的更改:
运行时事件
例如,当链接状态改变时(例如,插入或拔出网络电缆),内核 需要通过修改dev->标志来更改设备状态。
配置更改
当用户使用netconfig工具包中的ifconfig和route等命令或IPROUTE2包中的ip应用配置更改时,内核将分别通过ioctl命令和Netlink套接字通知。通过这些接口调用的例程必须使用锁。
[*]其他例程也可用于获取和释放信号量。有关更多详细信息,请参阅include / linux / rtnetlink.h。