物理内存与虚拟内存
虽然应用程序操作的对象是映射到物理内存之上的虚拟内存,但是处理器直接操作的却是物理内存。所以当用程序访问一个虚拟地址时,首先必须将虚拟地址转化成物理地址,然后处理器才能解析地址访问请求。地址的转换工作需要通过查询页表才能完成,概括地将,地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表则指向下一级别的页表或者指向最终的物理页面。
linux中使用三级页表完成地址转换。利用多级页表能够节约地址转换需占用的存放空间。如果利用三级页表转换地址,即使64位机器,占用的空间也很有限。linux使用的机制:
顶级页表示页全局目录(PGD),它包含一个pgd_t类型数组,多数体系结构中pgd_t类型等同于无符号长整型。PGD中的表项指向二级页目录中的表项:PMD
二级页表是中间页目录(PMD),它是个pmd_t类型数据,其中的表项指向PTE中的表项。
最后一级的页表简称页表,其中包含了pte_t类型的页表项,该页表项指向物理页面。多数体系结构中,搜索页表的工作由硬件完成。每个进程都有自己的页表,内存描述符的pgd域指向的就是进程的页全局目录。
虚拟存储器
虚拟存储器提供了三个重要的能力:
1)将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用的主存。
2)为每个进程提供了一致的地址空间,从而简化了存储器管理
3)保护了每个进程的地址空间不被其他进程破坏
Linux操作系统同样也采用了虚拟存储技术,对一个技术而言,好像可以访问整个系统的所有物理内存,即使单独一个进程而言,它拥有的地址空间可以远远大于系统物理内存。
用户空间与内核空间
4G的地址空间被人为的分为两个部分,用户空间和内核空间,
用户空间从0-3G,内核空间占据3G-4G.用户进程通常情况下只能访问用户空间的虚拟地址,不能范围内和空间的虚拟地址
除非用户进程执行系统调用时,切换进内核态执行,可以访问到内核空间。
每个进程的用户空间时完全独立的,互不相关的。
mm_struct
Linux为每个进程都维持了一个单独的虚拟地址空间,这个虚拟地址空间例包括我们所熟知的代码段,数据段,堆栈等。
内核为系统中的每个进程维护一个单独的数据结构task_struct,里面除了之前所学到的,还包括一个mm_struct的指针,指向一个结构体mm_struct