内核内存管理几个重要的结构体与函数(一)

数据结构

        Linux内存主要采取页式管理。所以需要表示出页表的数据结构:

        typedef  struct { unsigned long pte_low; } pte_t;

pte_low里面存储页面的物理地址。因为页表是mmu用来寻址物理内存中页面的,如果存储的是线性地址的话就毫无意义了。但是内核用来寻址的时候只要是在开启了分页的情况下都应该使用虚拟地址。因为页式地址转换是硬件执行的(暂且不看分段)。Linux本身无法绕过这个过程。

        pte_low本身存放了物理地址的高20位。因为一个页面是4KB大小,正好占据12位,所以剩下12位(生成的物理地址的低12位直接拷贝了给出的线性地址的低12位)。Linux利用12位来记录页面的性质。但是在实际的实现中,并没有直接利用pte_low的低12位。而是定义了另一个数据结构pgprot:

           typedef struct { unsigned long pgprot ;} pgprot_t ;

        单独设置pgrprot_t是因为可以定义不同的页面类型,方便页表项的创建。在include/asm-i386/pgtable.h中可以发现确实定义了一些类型用来设置页表项。

          那么很明显合成页表项的方法就是 #define __mk_pte(page_nr,pgprot) __pte(page_nr<<PAGE_SHIFT | pgprot_val(pgprot))

PAGE_SHIFT=12;pgprot_val=pgprot_t.pgprot;__pte=(pte){(x)};这个宏的意思就是page_nr左移12位后与pgprot进行或运算得到页表项。

           要注意的是page结构体本身代表了物理页面,它会和虚拟页面管理产生交互。(未完)

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值