内核内存管理几个重要的结构体与函数(一)
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结构体本身代表了物理页面,它会和虚拟页面管理产生交互。(未完)
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结构体本身代表了物理页面,它会和虚拟页面管理产生交互。(未完)
相关文章推荐
- uclinux-2008r1(bf561)内核中内存管理相关的几个结构体
- linux 内核源代码情景分析——几个重要的数据结构和函数
- file_operations结构体中几个重要函数的原型
- ndpi源码分析一--几个重要的结构体
- 几个重要的内核文件介绍
- (转载)几个重要的RedHat Linux内核文件介绍
- QtAssitant(Qt5.2.1)中与Qt的元对象系统和事件机制相关的几个重要段落或函数说明
- SQLServer中的几个重要时间函数
- 几个重要的Linux系统 内核文件介绍[转]
- 几个重要的RedHat Linux内核文件介绍
- 网络中几个重要的结构体
- 【内核】几个重要的linux内核文件【转】
- LINUX0.11内核KERNEL包(内核代码)中的几个重要的文件分析
- java几个重要函数
- SQLServer中的几个重要时间函数
- 几个重要的Linux系统内核文件介绍
- Linux-0.11内核源码分析系列:内存管理copy_page_tables()函数分析
- python几个重要的函数(lambda,filter,reduce,map,zip) 一、匿名函数lambda lambda argument1,argument2,...argumentN :e
- C语言循环章节几个重要的函数总结~
- 关于cocos2dx坐标及几个重要函数说明