用某个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

BUG(0):用某位表示特定属性相关推荐

  1. jdk-12.0.2 64位最新版

    教程: 1.下载并且解压安装包,双击jdk-12.0.2_windows-x64_bin.exe并选择以管理员身份运行. 2.出现安装界面一直点击下一步,到安装目录文件位置,可自行更改文件安装路径,但 ...

  2. 拉姆达表达式实现对集合中的对象中的某个属性求和以及查询某个特定属性以及对特定属性求和以及针对集合根据某个属性以key-value形式分组

    废话不多说 直接上代码 求和 List<UserEntity> userEntities = new ArrayList<UserEntity>();userEntities. ...

  3. 64位环境启用ASP.net 2.0的32位扩展

    The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine. 但在安装同样软件的x32的服务器上没有这个 ...

  4. 《编写高质量代码:改善c程序代码的125个建议》——建议14-2:在右移中合理地选择0或符号位来填充空出的位...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第2章,建议14-2,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

  5. click js自动点击 vue_vue.js2.0点击获取自己的属性和jquery方法

    如下所示: :data-index="index" :dt="index" v-on:click="onclick($event,index)&quo ...

  6. 【Java】使用lambda表达式获取list中所有对象的某个属性以及获取特定属性的某一个对象

    使用lambda表达式获取list中所有对象的某个属性以及获取特定属性的某一个对象 获取List中所有对象的某个属性 获取List中某个特定属性的对象 获取List中所有对象的某个属性 案例如下:获取 ...

  7. JS 取Json数据中对象特定属性值

    解析JSON JSON 数据 var str = '[{"a": "1","b": "2"}, {"a&quo ...

  8. vc 6.0与mysql win10_vc 6.0官方下载win10-vc 6.0 win10 64位下载中文完整版-西西软件下载...

    vc 6.0 win10 64位经测试可完美运行且兼容性良好,无论是台式机还是笔记本都可以正常使用.vc++6.0是一款强大的可视化编程工具,是一款优秀专业的C++编译器,界面简洁,易学易用. vc+ ...

  9. ESET(NOD32) ESS/EAV 4.0.424.0 BE 32位 汉化正式版

    ESET(NOD32) ESS/EAV 4.0.424.0 BE 32位 汉化正式版 ESET这一名称最早来源于埃及神话中的女神Isis.Isis又称作Aset或Eset,是地神Geb和天神Nut的女 ...

  10. 《Ghost Win7 SP1 电脑商装机版 V3.0》64位(电脑疯子作品)

    ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ <Ghost Win7 SP1 电脑商装机版 V3.0>64位(电脑疯子作品) ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ ...

最新文章

  1. 平均数、中位数和众数及它们之间的关系
  2. javaBeen的四个作用范围
  3. Cloudify — 安装部署与基础使用
  4. JavaScript 判断浏览器类型
  5. 【转】ABP源码分析三:ABP Module
  6. 19-数据持久化-Bind Mounting
  7. 大龄开发者究竟该何去何从?2019年Python全栈工程师,都是开发人员改怎么转向高收入?
  8. vs2017python配置opencv_关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案...
  9. 王学丹 确定测试原始需求
  10. vue3编写组件的几种方式
  11. JavaScript关于exec()函数的理解
  12. 实时操作系统与分时操作系统(或称非实时操作系统)的区别
  13. 数据分析师是青春饭吗?年龄影响很大吗?
  14. ORA-04031: 无法分配 3840 字节的共享内存 (“shared pool“,“unknown object“,“sga heap(1,0)“,“kglsim object batch“)
  15. 幅频特性曲线protues_讲proteus实验一RC低通滤波器频率及非线性元件特性要点详解.ppt...
  16. Zinnia - Django 博客框架
  17. win10系统怎么开启sql服务器,win10如何启动sql数据库服务器
  18. [转载] 翻译 西川善司著针对3D游戏爱好者的”METAL GEAR SOLID 4”图形讲座(下)
  19. Assert De-assert
  20. 2021/3/14--前端第7天盒模型

热门文章

  1. [cocos2dx]斗地主制作之洗牌算法
  2. HDOJ 1106 排序
  3. ie6下 jsonp无响应的问题
  4. Android ListView自定义分割线 header 和footer设置没有页眉和页脚
  5. vue学习日志-过滤器
  6. Android高级之十二讲之如何降低应用内存消耗
  7. hdu 1718 Rank
  8. hlg1492盒子【最小路径覆盖】
  9. 20190825 On Java8 第十三章 函数式编程
  10. HDU 6162 树链剖分