linux的結構體
① linux驅動程序簡單結構體
這應該是定義一個結構體,並初始化。Linux驅動中經常有這種形式。
比如聲明了一個這樣的結構體
struct num
{
int max;
int min;
};
然後有如下定義
static struct num mynum = {
.max = 5,
.min = 1,
};
這就意味著定義了一個叫做mynum的結構體,mynum.max初始化為5,mynum.min初始化為1。
當然也可以這么寫:
static struct num mynum;
mynum.max = 5;
mynum.min = 1;
兩種寫法一個意思。
② 高手進,關於linux內核中的一類結構體,該結構體中的函數指針的參數指向這類結構體, 說下這么做有啥用
松耦合!例如現在內核從上到下有兩層,A,B層。A層向上提供一個統一的介面,而B層有各種不同的實例,那麼A層無需關心B層到底現在用的是哪個實例,屏蔽了底層的復雜性。
如A層現在使用了結構體struct softirq_action a, 而 a.action 可能被B層的實例賦值了不同的操作方法(這里就是函數指針),那麼A層只需要用 a,它的這個函數成員被指向了它需要的地方
③ linux 結構體為什麼不用typedef
typedef是把一個已經存在的類型,進行「重新」定義,而結構體本身是一個「未知」的數據類型,所以,不能使用typedef來定義
而對於已定義好的結構體類型,則可以用typedef來重新命名,如:
struct _st_ { int i; char s[100]; } ; //先定義一個結構體
typedef struct _st_ my_struct ; //重新定義一個新類型:my_struct ,與struct _st_是等效的
④ Linux常見文件結構體有哪些
linux虛擬文件系統核心數主要有以下幾個數據結構: * 超級塊結構(struct super_block {...} ) 該結構保存了一個被安裝在linux系統上的文件系統的信息。對於基於磁碟的文件系統,該結構一般和保存在磁碟上的"文件系統控制塊"對應。
⑤ Linux字元設備驅動的組成
在Linux中,字元設備驅動由如下幾個部分組成。
1.字元設備驅動模塊載入與卸載函數
在字元設備驅動模塊載入函數中應該實現設備號的申請和cdev的注冊,而在卸載函數中應實現設備號
的釋放和cdev的注銷。
Linux內核的編碼習慣是為設備定義一個設備相關的結構體,該結構體包含設備所涉及的cdev、私有
數據及鎖等信息。2.字元設備驅動的file_operations結構體中的成員函數
file_operations結構體中的成員函數是字元設備驅動與內核虛擬文件系統的介面,是用戶空間對Linux
進行系統調用最終的落實者。設備驅動的讀函數中,filp是文件結構體指針,buf是用戶空間內存的地址,該地址在內核空間不宜直
接讀寫,count是要讀的位元組數,f_pos是讀的位置相對於文件開頭的偏移。
設備驅動的寫函數中,filp是文件結構體指針,buf是用戶空間內存的地址,該地址在內核空間不宜直
接讀寫,count是要寫的位元組數,f_pos是寫的位置相對於文件開頭的偏移。
由於用戶空間不能直接訪問內核空間的內存,因此藉助了函數_from_user()完成用戶空間緩沖
區到內核空間的復制,以及_to_user()完成內核空間到用戶空間緩沖區的復制,見代碼第6行和第14
行。
完成內核空間和用戶空間內存復制的_from_user()和_to_user()的原型分別為:
unsigned long _from_user(void *to, const void _ _user *from, unsigned long count);
unsigned long _to_user(void _ _user *to, const void *from, unsigned long count);
上述函數均返回不能被復制的位元組數,因此,如果完全復製成功,返回值為0。如果復制失敗,則返
回負值。如果要復制的內存是簡單類型,如char、int、long等,則可以使用簡單的put_user()和
get_user()讀和寫函數中的_user是一個宏,表明其後的指針指向用戶空間,實際上更多地充當了代碼自注釋的
功能。內核空間雖然可以訪問用戶空間的緩沖區,但是在訪問之前,一般需要先檢查其合法性,通過
access_ok(type,addr,size)進行判斷,以確定傳入的緩沖區的確屬於用戶空間。
⑥ linux下怎麼查看某個結構體的定義
Linux下查看結構體、變數、函數的定義可以用一款Windows上的軟體叫做Source Insight,這個軟體在Linux的Wine環境中運行的非常好,是少數可以在Linux平台正常運行的Windows應用,這個軟體最大的作用就是瀏覽代碼,可以很容易的跳轉到變數、函數、結構體、類的定義處,特別是代碼項目比較龐大時就更能夠顯示出它的好處了。
⑦ linux中定義的幾個網路報文的結構體
public struct MyStruct{ public int _number; public string _text; } 在C#中 建議你使用string而不是char數組存儲字元串 還有 請在每一個欄位前加入public 否則你會訪問不到,C#相比C是有訪問修飾的
⑧ linux中什麼是文件結構體
linux虛擬文件系統核心數主要有以下幾個數據結構: * 超級塊結構(struct super_block {...} ) 該結構保存了一個被安裝在linux系統上的文件系統的信息。對於基於磁碟的文件系統,該結構一般和保存在磁碟上的"文件系統控制塊"對應。也就是說如果是...
⑨ 淺談結構體及linux下內存分配原則
淺談結構體及linux下內存分配原則結構體在程序中的應用是很廣泛的,要處理的問題越復雜,數據量越多月雜,就越需要用到結構體。比如網路,內核,驅動等等。熟練使用結構體對每個程序員都是至關重要的。一個好的結構體不僅能使程序體系結構清晰,而且使得操作靈活,可擴展性強。linux網路之所以很強大,這和它里設計合理的數據結構有很大關系。
www.shiwu.com
結構體定義:[cpp]<span
style=font-size:18px;>struct
a{
int
xx:4;
int
yy:4;
};</span>
結構體初始化:方式一:[cpp]<span
style=font-size:18px;>struct
a
aa
={
xx:2,
yy:3
};</span>
www.shiwu.com
方式二:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=6,
.yy=1,
};</span>
方式三:[cpp]<span
style=font-size:18px;>struct
a
dd={4,2};</span>
在定義中,可以限制變數的位的作用域,比如上面的:int
xx:4;這表明xx的有效域只有4位,也就是能給他賦值的最大值為15,如果超過這個值,編譯器就會報錯:warning:
overflow
in
implicit
constant
conversion。在這里如果你給xx賦值為15,如:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=15,
.yy=1,
};</span>
www.shiwu.com
然後輸出:[cpp]<span
style=font-size:18px;>printf(cc.xx
=
%d/n,cc.xx);</span>
結果會是:-1因為這里定義的xx為int
型,15的二進制位1111,最高位為1,表示為負數,所以取反加1後為0001。所以是-1。這種位域操作的好處是當你不需要用到你定義的類型的長度時,可以加位域操作以節省內存空間。引出的其他問題這里用sizeof(struct
a)得到的是4,如果不加位域限制則是8,至於為什麼是4呢?4bit+4bit應該剛好是1byte啊,應該是1才對啊。這是因為我是在linux下編譯執行的,而在linux對內存分配最小值為類型值的一半。(我在linux下做了實驗)如下我定義了一個結構體:[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:2;
short
int
yy:2;
}bb;</span>
如上,我定義二個short
int類型值,short
int在32位linux下為2位元組,這里二個相加不足一位元組,但是輸出sizeof(struct
a)的值為2。不足一位元組系統自動補滿一位元組。[html]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:2;
}bb;</span>
www.shiwu.com
這個輸出也是2。xx超過一位元組,但是9+2=11,還沒有超過16(2位元組),我猜系統將xx超過的那1bit分到了yy那1bit裡面了。[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:9;
}bb;</span>
這個輸出是4。9+9=18,超過了16,系統各分配了2位元組給xx和yy。作者
linuxblack125125