BUG(0):用某位表示特定屬性

用某個bit表示特定屬性一般有兩種方式:函數

1.指定某個特定的valuecode

#define _PAGE_VALID    0x0001

    0bit 爲 1 時表示此時的page entry是有效的it

    用法以下,此時這種用法不能保證是原子操做。class

if (pte_val(*ptep) & _PAGE_VALID) {
    /*page valid*/
} else {
    /*page unvalid*/
}

 

2.也能夠是指定某個特定的bittest

 

#define _PAGE_VALID_BIT 0

    0bit用來表示page entry是否有效,具體的 0 有效仍是 1 有效須要本身清楚。static

    針對第二種用法,kernel中提供了一組內聯函數,經過這組函數能夠保證該操做是原子操做co

static inline void set_bit(int nr, volatile unsigned long *addr);
static inline void clear_bit(int nr, volatile unsigned long *addr);
static inline void change_bit(int nr, volatile unsigned long *addr);
static inline int test_and_set_bit(int nr, volatile unsigned long *addr);
static inline int test_and_clear_bit(int nr, volatile unsigned long *addr);
static inline int test_and_change_bit(int nr, volatile unsigned long *addr);

 

上述兩種用法關係是思維

(_PAGE_VALID)、(0x01 << _PAGE_VALID_BIT) 意思是同樣的數字

 

BUG錯誤

//錯誤示範!!!
if (pte_val(*ptep) & _PAGE_VALID_BIT) {
    /*page valid*/
} else {
    /*page unvalid*/
}

一個value一個bit offset作與操做,得出了不三不四的結果。

如何避免:

1.定義bit offset時候建議以 _BIT 結尾

2.定義value時候數值爲 0x0001,定義bit offset時候爲1,2,3 數字

 

最後,check code時候儘可能避免思惟慣性,想象CPU的執行過程單步執行,思惟慣性每每就是想固然。

相關文章
相關標籤/搜索