下面是linux0.11中memory.c中的函数put_page中的一个片段:
/****************************************/
if (!(tmp=get_free_page()))
return 0;
page_table = tmp|7;
page_table = (unsigned long *) tmp;
}
page_table[(address>>12) & 0x3ff] = page | 7;
/***************************************/
这里的tmp是get_free_page()返回的物理地址,也即是说page_table 是一个物理地址,(具体说是一个页表的首地址)。可是这里采用了分页机制,CPU会把page_table视作一个线性地址,经过MMU后得到一个物理地址再访问。这样不就乱套了吗?page_table经过MMU转换后,不知道会映射到哪里,写入也就可能不是page_table所指的物理地址了。
求大神帮帮忙解释一些,哪里理解出了问题。