当前位置: 技术问答>linux和unix
内核源码map_new_virtual()中的问题
来源: 互联网 发布时间:2016-03-06
本文导语: 最近在读ULK中关于内存管理的章节,提到map_new_virtual()的代码,书中的代码好像有些误差,于是直接找到源码看了看,有一处不是太明白 87 /* Find an empty entry */ 88 for (;;) { 89 last_pkmap_nr = (last_pkmap_nr + 1) & LAST_...
最近在读ULK中关于内存管理的章节,提到map_new_virtual()的代码,书中的代码好像有些误差,于是直接找到源码看了看,有一处不是太明白
87 /* Find an empty entry */
88 for (;;) {
89 last_pkmap_nr = (last_pkmap_nr + 1) & LAST_PKMAP_MASK;
90 if (!last_pkmap_nr) {
91 flush_all_zero_pkmaps();
92 count = LAST_PKMAP;
93 }
94 if (!pkmap_count[last_pkmap_nr])
95 break; /* Found a usable entry */
96 if (--count)
97 continue;
其中第89行,(last_pkmap_nr + 1) & LAST_PKMAP_MASK;目的是不让last_pkmap_nr超过LAST_PKMAP,但是对于他的取值,我很疑惑,比如last_pkmap_nr = 0, LAST_PKMAP=5, LAST_PKMAP_MASK = 4; 这样每次循环,last_pkmap_nr总是为0啊,这是怎么回事?那位给解释一下,谢谢
87 /* Find an empty entry */
88 for (;;) {
89 last_pkmap_nr = (last_pkmap_nr + 1) & LAST_PKMAP_MASK;
90 if (!last_pkmap_nr) {
91 flush_all_zero_pkmaps();
92 count = LAST_PKMAP;
93 }
94 if (!pkmap_count[last_pkmap_nr])
95 break; /* Found a usable entry */
96 if (--count)
97 continue;
其中第89行,(last_pkmap_nr + 1) & LAST_PKMAP_MASK;目的是不让last_pkmap_nr超过LAST_PKMAP,但是对于他的取值,我很疑惑,比如last_pkmap_nr = 0, LAST_PKMAP=5, LAST_PKMAP_MASK = 4; 这样每次循环,last_pkmap_nr总是为0啊,这是怎么回事?那位给解释一下,谢谢
|
我的意思是 LAST_PKMAP_MASK 通常是 11111..111 这种情况,事实上所有 MASK 都是这样设计的,也只有这样能通过&操作起到限定大小的作用。