博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BUG(0):用某位表示特定属性
阅读量:5094 次
发布时间:2019-06-13

本文共 1142 字,大约阅读时间需要 3 分钟。

用某个bit表示特定属性通常有两种方式:

1.指定某个特定的value

#define _PAGE_VALID    0x0001

    0bit 为 1 时表示此时的page entry是有效的

    用法如下,此时这种用法不能保证是原子操作。

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

 

2.也可以是指定某个特定的bit

 

#define _PAGE_VALID_BIT 0

    0bit用来表示page entry是否有效,具体的 0 有效还是 1 有效需要自己清楚。

    针对第二种用法,kernel中提供了一组内联函数,通过这组函数可以保证该操作是原子操作

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

转载于:https://www.cnblogs.com/rivsidn/p/9206399.html

你可能感兴趣的文章
Mysql 解压安装
查看>>
Mysql
查看>>
前端html
查看>>
网络编程
查看>>
.Net Core项目发布到虚拟机(三)
查看>>
android 动画
查看>>
算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)
查看>>
图解安卓-c++开发-通过java 调用c++ jni的使用
查看>>
最近在整appium自动化的事情,遇到一个虚拟键盘的问题,折腾了好几天解决了,给大家分享一下...
查看>>
Deep Learning 在中文分词和词性标注任务中的应用
查看>>
[JAVA SE] Java反射机制
查看>>
Altium Designer 输出 gerber 光绘文件的详细说明
查看>>
留个遗体
查看>>
IE6 png处理
查看>>
A股ROE连续3年超过15%的股票排名
查看>>
promise用法
查看>>
学习进度表
查看>>
机器学习相关数据库(转)
查看>>
linux常用命令
查看>>
iOS开发Swift篇—(四)运算符
查看>>