Linux0.11源码研究 put_page

//在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; 
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值