標籤:
1,__attrubte__關鍵字的作用
點擊開啟連結
__attrubte__ ((packed)) 的作用就是告訴編譯器取消結構在編譯過程中的最佳化對齊,按照實際佔用位元組數進行對齊。
struct str_struct{
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed));
以上結構體的大小為5
/* 當用到typedef時,要特別注意__attribute__ ((packed))放置的位置,相當於:
* typedef struct str_stuct str;
* 而struct str_struct 就是上面的那個結構。
*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed)) str;
以上結構體的大小為5
/* 在下面這個typedef結構中,__attribute__ ((packed))放在結構名str_temp之後,其作用是被忽略的,注意與結構str的區別。*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
}str_temp __attribute__ ((packed));
以上結構體的大小為6
attribute前後都有兩個底線,後面會緊跟一對原括弧,括弧裡面是相應的__attribute__參數。
文法格式為:__attribute__ ((attribute-list))
屬性 section 用於函數和變數,通常編譯器將函數放在 .text 節,變數放在.data 或 .bss 節,使用 section 屬性,可以讓編譯器將函數或變數放在指定的節中。
2,驅動程式中IS_ERR()的含義
所有的驅動程式都是運行在核心空間,核心空間雖然很大,但總是有限的,而在這有限的空間中,其最後一個page是專門保留的.
所有在核心指標如果指在最後一個PAGE,那麼這就是一個錯誤指標,核心空間是3G-4G,所以OXFFFFF000-0XFFFFFFFF是無效的指標。
[cpp] view plaincopy
- /*static inline long IS_ERR(const void *ptr)
- {
- return (unsigned long)ptr > (unsigned long)-1000L;
- }*/
- static inline void * __must_check ERR_PTR(long error)
- {
- return (void *) error;
- }
PTR_ERR()把指標轉換成錯誤碼。
3,linux核心的likely()和unlikely函數
點擊開啟連結
likely和unlikely只是用來改變系統的效能,並不會改變以前已經有的值,
不會經常發生用unlikely,經常發生的用likly
4,mdelay和msleep()函數的區別
點擊開啟連結
mdelay精度更高,但是會一直佔用CPU資源,msleep將當前進程放到等待隊列中 根據個人經驗,10ms以下的延時對時序要求比較高的地方最好還是用mdelay,100ms以上的延時最好還是用msleep,100ms以上的延遲
對linux的多任務系統運行還是有一定影響的。
[linux核心]linux核心編程規範