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
三层映射:
进程与系统虚拟存储空间:(不考虑硬盘的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()函数就这个原理