差异 "Initializing Each Device"
Difference in "Initializing Each Device"
各位。我正在学习 LDD3。并对以下陈述有疑问
"Note that struct net_device is always put together at runtime; it cannot be set up at compile time in the same manner as a file_operations or block_device_operations structure"
那么造成这种差异的根本原因是什么?顺便说一句,网络驱动程序和字符驱动程序的不同行为??有人可以在这里解释吗?谢谢
差异的根本原因是存储在这些结构中的数据的性质。
file_operations 是针对特定设备的某种全局回调集,具有明确的用途(例如 .open
、.mmap
等)并且可用(已知)在编译时。
它不假定任何可能在整个模块使用过程中发生变化的易失性数据字段。所以,只有一组在编译时已知的回调。
net_device, in turn, is a structure intended to keep data amenable to lots of runtime changes. Suffice it to say, such fields as state, mtu 和许多其他的都是不言自明的。它们在编译时是未知的,需要在整个运行时都是 initialised/changed。
换句话说,该结构遵循设备 probe/configuration/start 顺序的严格接口,并且相应的字段在相应的步骤上初始化。比如说,在编译时没有人知道 Rx 或 Tx 队列的数量。驱动程序根据 OS 的一些限制和要求在初始化时计算这些值。例如,同一个网络适配器可能会发现在 1 核 CPU 系统上分配 1 个 Rx 队列和 1 个 Tx 队列是可行的,而它可能会决定在四核系统上设置 4 个队列。在编译时预测这一点并将结构初始化为一些无论如何都会改变的值是没有意义的。
the different behavior btw network driver and char driver??
所以,综合来说,就是两种结构用途的区别。在一种情况下保留有关回调的静态信息,在另一种情况下维护易变的设备状态(名称、可调属性、计数器等)。希望你看清楚了。
各位。我正在学习 LDD3。并对以下陈述有疑问
"Note that struct net_device is always put together at runtime; it cannot be set up at compile time in the same manner as a file_operations or block_device_operations structure"
那么造成这种差异的根本原因是什么?顺便说一句,网络驱动程序和字符驱动程序的不同行为??有人可以在这里解释吗?谢谢
差异的根本原因是存储在这些结构中的数据的性质。
file_operations 是针对特定设备的某种全局回调集,具有明确的用途(例如 .open
、.mmap
等)并且可用(已知)在编译时。
它不假定任何可能在整个模块使用过程中发生变化的易失性数据字段。所以,只有一组在编译时已知的回调。
net_device, in turn, is a structure intended to keep data amenable to lots of runtime changes. Suffice it to say, such fields as state, mtu 和许多其他的都是不言自明的。它们在编译时是未知的,需要在整个运行时都是 initialised/changed。 换句话说,该结构遵循设备 probe/configuration/start 顺序的严格接口,并且相应的字段在相应的步骤上初始化。比如说,在编译时没有人知道 Rx 或 Tx 队列的数量。驱动程序根据 OS 的一些限制和要求在初始化时计算这些值。例如,同一个网络适配器可能会发现在 1 核 CPU 系统上分配 1 个 Rx 队列和 1 个 Tx 队列是可行的,而它可能会决定在四核系统上设置 4 个队列。在编译时预测这一点并将结构初始化为一些无论如何都会改变的值是没有意义的。
the different behavior btw network driver and char driver??
所以,综合来说,就是两种结构用途的区别。在一种情况下保留有关回调的静态信息,在另一种情况下维护易变的设备状态(名称、可调属性、计数器等)。希望你看清楚了。