//在linux/mm/memory.c中
unsigned long put_page(unsigned long page,unsigned long address){
unsigned long tmp, *page_table;
// address>>20&ffc存放的是页目录的地址。
//此操作相当于把page_table设置为指向该页目录项的指针【page_table的值为add,p是指针,add是页目录地址,故而*p指向页目录,p为页目录指针】
page_table=(unsigned long *)((address>>20)&ffc);
//检查页目录项,即页表地址是否有效。
//有效的话则把page_table跟上面一样再跳一级,依据页号指向该页目录项对应的页表的第一项;【因为页目录项只保存页表的base address】
//无效的话,则新申请一张页表
if((*page_table)&1)
page_table=(unsigned long*)(0xfffff000&*page_table);
else{
tmp=get_free_page();
*page_table = tmp|7;
page_table = (unsigned long *) tmp;
}
//将页表视为数组,偏移量为页号,页号从add中取得。
page_table[(address>>12)&0x3ff] = page|7;
return page;
}
Linux0.11源码研究 put_page
于 2022-10-02 16:51:12 首次发布