2015-05-26 255 views
2

我正在閱讀「Linux設備驅動程序」第三版。Tagged初始化是否允許重新排序結構成員?

提取物:

的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標記化的結構初始化 語法。這種語法是首選,因爲它使得驅動程序在結構定義的變化中更具可移植性,並且可以說,使得代碼更加緊湊和可讀。 標記爲 初始化允許重新排序結構成員;在某些 的情況下,實質上的性能改進已經實現了 將指針指向同一硬件中經常訪問的成員 緩存行。

我可能會誤讀它。它們是否意味着對象的最終佈局與最初的結構定義有所不同?因此無法移植?我沒有看到可行的實施建議。有人能解釋我最後一段中的建議嗎?他們是否建議另外選擇,功能在記憶中的最終位置會受到影響,並彼此接近?因此更可能在相同的緩存行中。

回答

2

該對象的內存中的最終佈局是完全依賴於struct file_operations定義linux/fs.h頭文件。

他們的意思是,這個定義可以改變爲了性能的原因,而這種改變不會打破任何驅動程序,它使用標記初始化它的成員(如對面成員的無名初始化爲了出現在結構的定義中)。

此外,除了重新排列結構的成員,有可能添加新成員和刪除未使用的不打破已有的驅動程序。這實際上發生在內核中。

+0

好的。所以,對你而言,本書建議結構定義稍後可能會改變以優化性能。本書最重要的是它不會破壞使用標記初始化的驅動程序的代碼。事實上你的解釋顯然是正確的。讀這個我的問題現在看起來很愚蠢。無論如何。謝謝。順便說一下:刪除字段可能會中斷驅動程序代碼,當它們從已標記的初始化引用已刪除的字段時,對不對? –

+0

'刪除字段可能會破壞驅動程序代碼,當它們從標記的初始化引用已刪除的字段時,對嗎?' - 是的,它可能會中斷。 – Tsyvarev