ARM Linux基本运算符综合实例(3)

Linux内核建立页面主要是通过这3个while循环语句来完成的,这里主要分析第一个while循环语句中的表达式:

(virt & 0xfffff || (virt + off) & 0xfffff) && length >= PAGE_SIZE

这句表达式用到了多种运算符,包括位运算符、关系运算符、逻辑运算符等,请读者根据运算符的优先级来分析下这条语句的逻辑结果。

这里的运算符中,括号的优先级最高,因此先计算括号内的内容:

virt & 0xfffff || (virt + off) & 0xfffff

可以看到这条语句里还有括号,因此先计算“virt + off”。接下来的运算符有“&”和“||”(逻辑或),由优先级口诀中欧冠可以看到,“&”(位与)的优先级为八,逻辑或的优先级为十二,因此先计算逻辑与,即“virt & 0xfffff” 和“(virt + off) & 0xfffff”,再计算它们的逻辑或。上述语句可等价为以下括号的语句:

(virt & 0xfffff)||((virt + off) & 0xfffff)

上述表达式的运算结果为:若“virt”或“virt + off”和“0xfffff”相与的结果中有一方非0,则表达式的结果为真,即只有“virt”和“virt+off”的低20为都为0时,表达式的结果才为假。

在计算完上述括号内的表达式后,原语句可等价为如下:

TRUE/FALSE && length >=PAGE_SIZE

这时,要判断先计算逻辑与还是先计算关系运算符“ >=".从优先级口诀中可以看出,关系运算符的优先级为六,逻辑与的优先级为十一,因此该语句首先计算“length>=PAGE_SIZE”。这样,上述语句可等价为以下括号的语句:

TRUE/FALSE && (length >= PAGE_SIZE)

因此,该表达式为真的条件就是:“virt”或“virt+off”和“0xfffff”相与的结果中有一方非0并且“length”大于等于“PAGE_SIZE”;表达式为假的条件是:“virt”和“virt+off”的低20位都为零或者“length”小于“PAGE_SIZE”.

这几个while语句的含义为:若地址与1M(2的20次方)没有对齐(即低20位不全为0),则建立二级页面映射;若地址1M对齐,且长度大于PGDIR_SIZE,则逐段建立单层映射;若地址与1M对齐,且长度大于PAGE_SIZE,则建立二级页表映射。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxjfy.html