第1个回答 2014-10-22
198 unsigned long get_free_page(void)
199{
200 unsigned long result;
201
202repeat:
203 __asm__("std ; repne ; scasb\n\t"
204 "jne 1f\n\t"
205 "movb $1,1(%%edi)\n\t"
206 "sall $12,%%ecx\n\t"
207 ...
215 :"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
216 "D" (mem_map+PAGING_PAGES-1)
217 :"di","cx","dx");
...
223 }
224 if (!result && swap_out())
225 goto repeat;
226 return result;
227}
在这段代码中, 没有存在中断屏蔽cli , 而在fork系统调用中直接使用这个函数, 如果在执行到204的时候被中断, 并且其他进程也调用fork系统调用执行完这个函数, 这样就会导致同一页被引用两次, 而mark数值 1 而造成数据重复的错误. 不知道会不会造成这样子的错误.本回答被网友采纳