我目前正在阅读“Linux设备驱动程序”第三版。
提取物:
scull设备驱动程序仅实现最重要的设备 方法。其file_operations结构初始化如下:
struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, };
此 声明使用标准的C标记结构初始化 句法。这种语法是首选,因为它使驱动程序更多 便于跨越结构定义的变化, 可以说,使代码更紧凑和可读。的标记 初始化允许重新排序结构成员; 在一些 案例,实现了大幅性能改进 将指针放在同一硬件中的频繁访问的成员上 缓存行。
我可能会误读。它们是否意味着对象内存中的最终布局将与初始结构定义不同?因此不可移植?我没有看到建议的可行实施。有人可以解释一下上一段中的建议吗?他们是否会建议在内存中最终放置函数会受到影响并相互靠近?因此更有可能在同一个缓存行中。
答案 0 :(得分:2)
对象内存中的最终布局完全依赖于struct file_operations
头文件中的linux/fs.h
定义。
他们的意思是,出于性能原因,此定义可以更改顺序,并且该更改不会破坏任何使用标记初始化其成员的驱动程序(与未命名的相反) 按顺序初始化它们出现在结构的定义中。
此外,除了重新排序结构成员之外,还可以添加新成员并删除未使用的成员,而不会破坏现有的驱动程序。这实际上发生在内核中。