您的位置:首页 > 其它

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

2018-02-10 21:30 417 查看
数据结构
        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结构体本身代表了物理页面,它会和虚拟页面管理产生交互。(未完)

            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: