与内存映射相关的宏

三. 内核对页表的设置
CPU做出映射的前提是操作系统要为其准备好内核页表,而对于页表的设置,内核在系统启动的初期和系统初始化完成后都分别进行了设置。
3.1 与内存映射相关的几个宏
这几个宏把无符号整数转换成对应的类型
    #define __pte(x)              ((pte_t) { (x) } )
    #define __pmd(x)             ((pmd_t) { (x) } )
    #define __pgd(x)              ((pgd_t) { (x) } )
    #define __pgprot(x)            ((pgprot_t) { (x) } )
    根据x把它转换成对应的无符号整数
    #define pte_val(x)              ((x).pte_low)
    #define pmd_val(x)             ((x).pmd)
    #define pgd_val(x)             ((x).pgd)
    #define pgprot_val(x)           ((x).pgprot)
    把内核空间的线性地址转换为物理地址
    #define __pa(x)                ((unsigned long)(x)-PAGE_OFFSET)
    把物理地址转化为线性地址
    #define __va(x)             ((void *)((unsigned long)(x)+PAGE_OFFSET))
  
    x是页表项值, 通过pte_pfn得到其对应的物理页框号, 最后通过pfn_to_page得到对应的物理页描述符
    #define pte_page(x)             pfn_to_page(pte_pfn(x))
    如果对应的表项值为0, 返回1
    #define pte_none(x)             (!(x).pte_low)
    x是页表项值, 右移12位后得到其对应的物理页框号
    #define pte_pfn(x)         ((unsigned long)(((x).pte_low >> PAGE_SHIFT)))
根据页框号和页表项的属性值合并成一个页表项值
    #define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
    根据页框号和页表项的属性值合并成一个中间表项值
    #define pfn_pmd(pfn, prot)   __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
    向一个表项中写入指定的值
    #define set_pte(pteptr, pteval)         (*(pteptr) = pteval)
    #define set_pte_atomic(pteptr, pteval)   set_pte(pteptr,pteval)
    #define set_pmd(pmdptr, pmdval)      (*(pmdptr) = pmdval)
    #define set_pgd(pgdptr, pgdval)       (*(pgdptr) = pgdval)
    根据线性地址得到高10位值, 也就是在目录表中的索引
    #define pgd_index(address) (((address)>>PGDIR_SHIFT) & (PTRS_PER_PGD-1))
    根据页描述符和属性得到一个页表项值
    #define mk_pte(page, pgprot)    pfn_pte(page_to_pfn(page), (pgprot))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值