内存

Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。

逻辑地址 logical address:包含在机器语言指令中用来指定一个操作数或一条指令的地址。每个逻辑地址都由一个段segment和偏移量offset组成。

线性地址 linear address或虚拟地址virtual address:32位无符号整数可表示4GB的地址,从0x00000000-0xffffffff。

物理地址 physical address :用于内存芯片级内存寻址。

内存控制单元MMU通过分段单元的硬件电路把一个逻辑地址转换为线性地址,通过分页单元把线性地址转换为物理地址。

 

线性地址被分成以固定长度为单位的组,成为页page。页内部连续的线性地址被映射到连续的物理地址中。

分页单元把所有的RAM分成固定长度的页框page frame或称物理页,每一个页框包含一个页,也就是说页框的长度与页的长度一致。

页框是主存的一部分,页只是一个数据块,可存放在任何页框或磁盘中。

页表是将线性地址映射到物理地址的数据结构,页表存在主存中,在启用分页单元之前必须由内核对其进行适当的初始化。页表项PTE。

32位线性地址被分为三个域,10位目录Directory  10位页表Table  12位偏移量

线性地址的转换分两步,每一步基于一种转换表,页目录表page directory和页表page table。

 

内核的保留页框:在不可用的物理地址范围内的页框;含有内核代码和已初始化的数据结构的页框。(保留页框中的页不能被动态分配或交换到磁盘上)

Linux内核安装在RAM中从物理地址0x00100000开始的地方(即从第二个MB开始)

进程的线性地址空间分为:

0x00000000 - 0xbfffffff的线性地址,无论进程运行在用户态还是内核态都可以寻址;

0xc0000000 - 0xffffffff的线性地址,只有内核态的进程才能寻址。

宏PAGE_OFFSET为0xc0000000

宏__pa用于把PAGE_OFFSET开始的线性地址转换成相应的物理地址;宏__va相反。

 

内核页表:内核维持着自己使用的页表,驻留在主内核页全局目录(保存在swapper_pg_dir变量中,由paging_init()函数初始化)中。

第一个阶段,内核创建一个有限的地址空间,包括内核的代码段和数据段、初始化页表和用于存放动态数据结构的共128KB大小的空间。

第二个阶段,内核充分利用剩余的RAM并适当地建立分页表。

 

posted @ 2015-10-29 10:35  LarryKnight  阅读(159)  评论(0编辑  收藏  举报