簡體   English   中英

內核模塊:訪問另一個模塊頭中定義的結構成員

[英]kernel module: Accessing member of structure defined in another module header

我正在嘗試編寫一個內核模塊,但我仍然堅持訪問另一個模塊頭中定義的結構成員。 我會試着解釋一下:

讓我們說另一個模塊是:

<kernel-src>/drivers/xxx/xxx.c|.h

在xxx.c中有一些我在驅動程序中使用的導出函數。 但是我想從xxx.h中定義的struct s_xxx訪問成員m1

struct s_xxx {
    ...
    int m1;
};

接下來我在/usr/include/linux/yyy.h中有這個:

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

我的司機我:

#include <linux/yyy.h>

我成功地使用了xxx驅動程序中的導出符號。 但是當然如果我嘗試從s_xxx訪問成員,編譯器會抱怨:

struct s_yyy *p_yyy;
...
m = p_yyy->p_xxx->m1; /* error */

在/ usr / include / linux /中找不到xxx.h。 到目前為止,我找到了2個解決方法:

1)下載內核源代碼並在我的模塊中包含xxx.h的完整路徑

2)將s_xxx定義從xxx.h復制/粘貼到我的模塊

這樣做的正確方法是什么?

(對不起那個冗長而糟糕的解釋:@)

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

如果沒有xxx.h,這意味着你有一個struct s_xxx的前向聲明,你可以聲明指向它的指針,但你不能使用它的成員或實例化一個,因為編譯器不知道它的大小或成員。 您需要在編譯單元中包含xxx.h來包含完整的結構定義。

如果xxx.h不是xxx公共接口的一部分,但你仍然堅持訪問模塊的內部,那么如果xxx的內部結構發生變化,你將面臨將來發生災難性兼容性中斷的風險。

不建議將結構定義復制到您自己的代碼中,因為無法保證結構之間的二進制兼容性, 除非您使用相同的編譯器和選項自己構建了所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM