虚拟地址与物理地址
1 大多数情况下,单个虚拟地址空间就比系统中可用的物理内存要大。在每个进程都有自身的虚拟地址空间时,情况也不会有什么改善。因此内核和CPU必须考虑如何将实际可用的物理内存映射到虚拟地址空间的区域。
可取的方法是用页表来为物理地址分配虚拟地址。虚拟地址关系到进程的用户空间和内核空间,而物理地址则用来寻址实际可用的内存。
下图是两个进程的虚拟地址空间,都被内核划分为很多等长的部分。这些部分称之为页。物理内存也划分为同样大小的页。
2 物理内存也称为页帧,页指虚拟空间中的页。
3 第五个页帧是两个进程显示共享的页帧,这种情况是可能的,因为两个虚拟地址空间中的页可以映射到同一物理内存页(内核可以决定哪些内存区域在进程之间共享,哪些不共享)。
4 并非所有页(虚拟地址中的页)都映射到某个页帧。
可能是因为某个页没有使用,也可能数据不需要使用而没有载入内存中。还可能是页已经换出到硬盘,将在需要是再换回内存。
5 用户运行的应用程序的不同说法:
BSD社区通常称为用户层,指所有不属于内核的东西。
用户空间,不仅可以表示应用程序,还指代了应用程序所运行的虚拟地址空间的一部分,与内核空间相对。
页表与多级分页
1页表,将虚拟地址空间映射到物理地址空间的数据结构。
2多级分页的必要性:如果虚拟地址空间都分配一个数组,那么将会消耗巨大的内存资源
3linux为四级分页
4 例,使用三级分页来说明分页机制
× 全局页表目录,PGD用于索引进程中的一个数组(每个进程有且只有一个)
PGD的数组项指向另一些数组的起始地址
× 上诉的这些数组称为PMD,在通过PGD的数组项找到对应PMD之后,便使用PMD来索引PMD,PMD的数据项也是指针,指向下一级数组,称为页表或目录。
× 虚拟地址第三部分称为PTE,用作页表的索引。
虚拟内存页和页帧之间的映射就此完成
× 虚拟地址最后一部分为偏移量
这样带来的弊端是每次访问内存时,必须逐级访问各个数组才能将虚拟地址转化为物理地址,CPU采用以下方法加速:
①内存管理单元(MMU),优化内存访问操作
②地址转换中最频繁的那些地址,保存到地址后备缓存器(TLB)的cpu高速缓存中,加速地址转换。
5内存映射
内存映射是一种抽象手段,内核中大量使用,也可用于应用程序。
映射方法可以讲任意来源的数据传输到进程的虚拟空间中。作为映射目标的地址空间区域,可以像普通内存那样用通常的方法访问,但任何修改都会自动传输到原数据源,这样可以使用相同的函数处理完全不同的目标对象。
内核在实现设备驱动程序时直接使用了内存映射。外设的输入输出可以映射到虚拟地址空间的区域中。对相关区域的读写会有系统重定向到设备。
6设备驱动
万物皆文件,设备驱动文件用于系统连接的输入输出装置通信。对外设的访问可利用/dev目录下的设备文件来完成。设备驱动程序的任务在于支持应用程序经由设备文件与设备通信。换言之,使之能够按适当的方式在设备上读取/写入数据。、
(注,本文使用内核版本2.4)