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的执行过程单步执行,思惟惯性每每就是想固然。

相关文章
相关标签/搜索