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

BUG(0):用某位表示特定属性的更多相关文章

  1. Json Serialize 忽略特定属性

    Json Serialize 忽略特定属性 Json Serialize SerializeFilter 忽略特定属性 key words:Json Serialize jackson fastjso ...

  2. python实例编写(4)--js,滚动条,cookie,验证码,获取特定属性的元素,实现原理

    一.调用js 执行方法:execute_script(script,*args) 场景一:在页面上直接执行调用js 场景二:在定位的某个元素上执行调用js 如:掩藏文字(提示插件 tooltip设置淡 ...

  3. jquery实现对象数组 筛选出每条记录中的特定属性字段 及根据某个属性值筛选出指定的元素

    jquery实现对象数组 筛选出每条记录中的特定属性字段 直接上图: 源码: /** * 对后端返回的数据,筛选出符合报表的列项,多余的列项去除 */ function filterParams(da ...

  4. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  5. 使用.NET 4.0+ 操作64位系统中的注册表

    一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...

  6. Windows7 QT5.6.0(64位)使用mysql(64位)环境搭建详解

    1 说明 使用环境为:Windows7 VS2015 QT5.6.0(64位),MYSQL 5.7.13(64位). 网上各种错误.模糊.抽象的资料,配置环境花了半天,痛定思痛,总结出来,方便后来人. ...

  7. SQL类型转换以及自动在前面补0满足10位工号标示法

    1,自动在前面补0满足10位工号标示法 SELECT rtrim(ltrim(right(cast('00000000'+rtrim(CAST(数值 as int)) as varchar(20)), ...

  8. CentOS 7.1静默安装11.2.0.3 64位单机数据库软件

    第1章 CentOS 7.1静默安装11.2.0.3 64位单机数据库软件 1.1  安装前的准备工作 1.1.1      软件准备 1.1.2      检查硬件 注意这里的内存应该满足要求,不然 ...

  9. QT5.6.0 VS2013 Win764位系统QT环境搭建过程

    QT5.6.0 VS2013 Win764位系统QT环境搭建过程 没用过QT自己跟同事要了安装包,按照同事指导方法操作安装部署开发环境结果遇到好多问题,错误网上搜遍了所有帖子也没有找到合适的解决方案. ...

随机推荐

  1. (转载)jenkins 安装 SVN Publisher 后向 svn 提交代码报错: E170001: Authentication required for...

    问题描写叙述 安装并启动 jenkins 后,加入了 SVN Publisher 插件,然后在构建任务的“构建后操作”操作中加入了“Publish to Subversion repository”相 ...

  2. 手工命令行 搭建 hadoop 和 spark 环境

    环境准备:3台CentOS7,64位,Hadoop2.7需要64位Linux 192.168.20.161  192.168.20.162  192.168.20.163 三台机器分别叫host01. ...

  3. MVC002之获取当前用户失败(Context.User.Identity.Name)

    通过Context.User.Identity.Name想获取当前用户的域帐号信息(如:Greatwall\Snow) 可值等于"",什么原因呢. 该问题和MVC关系不大,主要是I ...

  4. metasploit framework(十五):弱点扫描

    openvas扫描生成NBE格式的日志 改个比较好记的文件名 将日志导入到msf进行后续操作,导入之前查看一下hosts和services 导入nbe格式的文件 查看漏洞弱点 msf直接调用nessu ...

  5. Android studio 安装中遇到一些问题的解决办法,分享一下

    从eclipse转到android studio也是很无耐,刚开始总是会遇到很多难题,但是都不要轻言放弃. 以下是我遇到的问题,并通过搜索引擎找到的解决办法,善用工具,善用头脑,勿为伸手之人. And ...

  6. 六 json&pickle模块

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  7. numpy学习之矩阵之旅

    一:特殊的矩阵 1.全0全1的矩阵 2.单位矩阵 单位矩阵:整个矩阵是n*n的,并且斜对角全是1 矩阵的加减法 1.矩阵相加,相减必须要有相同的行和列 二:数组的乘法(点成) 数组的乘法 list_1 ...

  8. 14. Longest Common Prefix (截取字符串)

    Write a function to find the longest common prefix string amongst an array of strings. char* longest ...

  9. 线程 Thread Handler

    new Thread(new Runnable() { @Override public void run() { Message msg = new Message(); msg.what = 0; ...

  10. java虚拟机的原理

    所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,Visual Box .Vmare就属于系统虚拟机.他们完全是对物理计算机的仿真 ...