内存
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并适当地建立分页表。