2.1 linux存储管理-内存管理基本框架

页框的划分,在操作系统初始化时就已经完成(应该)

32位机的每一次寻址需要32位的地址(物理地址)

linux 内核代码结构:简写
struct task{
   struct mm_struct;
   ...
}
struct mm_struct{
    pgd_t pgd;
    ...
}

分层管理:(介绍32位)
将寻址过程变成多层的查找,两层的分成PGD和PT,三层加上PMD
   地址划分:每个进程都有一个分层管理机制,mm_struct中有一个pgd_t的指针
       PGD(32bit * 1024个条目)
       PT(1024个PT,每个PT存放32bit * 1024个条目
   寻址过程:
       CR3寄存器:存放当前进程的PGD(物理地址)
       页目录:地址的23-32位是PGD的内部地址,用来在PGD的表项中寻找一个条目,该条目指向一个PT
       页表:地址的13-22位是PT的内部地址,用来在PT的表项中寻找一个条目,该条目指向一个页
       页内:0-12位为页内地址(4K)
适用情况:
   两层:i386
   三层:i386启用PAE,ia64

三层映射:
2.1 linux存储管理-内存管理基本框架
进程与系统虚拟存储空间:(不考虑硬盘的swap)
每个进程有4G的虚拟存储空间
0-3G为用户空间
3G-4G为系统虚拟存储空间(所有进程共享)

在linux源码page_32_types.h中有__PAGE_OFFSET的宏定义,大小为3G,同时为用户空间上限
逻辑上系统使用最高的1G空间,但是事实上是从0开始用的,所以需要__PAGE_OFFSET这个宏
所以在系统空间(内核空间),物理地址为virt_addr- __PAGE_OFFSET,物理地址需要加上__PAGE_OFFSET
notice:内核编程中使用的virt_to_phys()和phys_to_virt()函数就这个原理

2.1 linux存储管理-内存管理基本框架