鸿冠HDD-100P**静音管道风机酒店卧室KTV抽风机排气扇厨房换气扇 UWE 运行在用户模式下的代码可以写此页面。 page frame number 对于V位置位的PTE,此域包含了对应此PTE的物理页面框号;对于无效PTE,此域不为0,它包含了页面在交换文件中位置的信息。 以下两位由Linux定义并使用。 _PAGE_DIRTY 如果置位,此页面要被写入交换文件。 _PAGE_ACCESSED Linux用它表示页面已经被访问过。 高速缓冲 如果用上述理论模型来实现一个系统,它可能可以工作,但效率不会高。操作系统设计者和处理器设计者都在努力以提高系统的性能。除了制造更快的CPU和内存外,较好的办法是在高速缓冲中维护有用信息和数据以加快某些操作。Linux使用了许多与高速缓冲相关的 内存管理策略。 Buffer Cache 这个buffer cache中包含了被块 设备驱动使用的数据缓冲。 这些缓冲的单元的大小一般固定(例如说512字节)并且包含从 块设备读出或者写入的信息块。 块设备是仅能够以固定大小块进行读写操作的设备。所有的硬盘都是 块设备。 利用设备标志符和所需块号作索引可以在buffer cache中迅速地找到数据。 块设备只能够通过buffer cache来存取。如果数据在buffer cache中可以找到则*从物理 块设备(如硬盘)中读取,这样可以加速访问。 Page Cache 用来加速硬盘上可执行 映象文件与数据文件的存取。 它每次缓冲一个页面的文件内容。页面从 磁盘上读入内存后缓存在page cache中。 Swap Cache 只有修改过的页面存储在交换文件中。 只要这些页面在写入到交换文件后没有被修改,则下次此页面被交换出内存时,就不必再进行更新写操作,这些页面都可以简单的丢弃。在交换频繁发生的系统中,Swap Cache可以省下很多不必要且耗时的磁盘操作。 Hardware Caches 一个常见的hardware cache是处理器中的 页表入口cache。处理器不总是直接读取 页表而是在需要时缓存页面的转换。这种cache又叫做转换旁视缓冲(Translation Look-aside Buffers),它包含系统中一个或多个处理器的 页表入口的缓冲拷贝。 当发出对 虚拟地址的引用时,处理器试图找到相匹配的TLB入口。如果找到则直接将 虚拟地址转换成物理地址并对数据进行处理。如果没有找到则向操作系统寻求帮助。处理器将向操作系统发出TLB失配信号,它使用一个特定的 系统机制来将此异常通知操作系统。操作系统则为此地址匹配对产生新的TLB入口。当操作系统清除此异常时,处理器将再次进行虚拟地址转换。由于此时在TLB中已经有相应的入口,这次操作将成功。 使用高速缓存的缺点在于Linux必须消耗更多的时间和空间来维护这些缓存,并且当缓存 系统崩溃时系统也将崩溃。 Linux 页表 图3.3 Linux的三级页表结构 Linux总是假定处理器有三级 页表。每个 页表通过所包含的下级页表的页面框号来访问。图3.3给出了 虚拟地址是如何分割成多个域的,每个域提供了某个* 页表的偏移。为了将虚拟地址转换成 物理地址,处理器必须得到每个域的值。这个过程将持续三次直到对应于 虚拟地址的物理页面框号被找到。最后再使用 虚拟地址中的最后一个域,得到了页面中数据的地址。 为了实现跨平台运行,Linux提供了一系列转换宏使得核心可以访问特定进程的 页表。这样核心*知道 页表入口的结构以及它们的排列方式。 这种策略相当成功,无论在具有三级 页表结构的Alpha AXP还是两级页表的Intel X86处理器中,Linux总是使 用相同的页表操纵代码。 页面分配与回收 对系统中物理页面的请求十分频繁。例如当一个可执行映象被调入内存时,操作系统必须为其分配页面。当映象执行完毕和 卸载时这些页面必须被释放。物理页面的另一个用途是存储 页表这些核心 数据结构。 虚拟内存子系统中负责页面分配与回收的 数据结构和机制可能用处较大。 系统中所有的物理页面用包含mem_map_t结构的链表mem_map来描叙,这些结构在系统启动时初始化。每个 mem_map_t描叙了一个物理页面。其中与 内存管理相关的重要域如下: count 记录使用此页面的用户个数。当这个页面在多个进程之间共享时,它的值大于1。 age 此域描叙页面的年龄,用于选择将适当的页面抛弃或者置换出内存时。 map_nr 记录本mem_map_t描叙的物理页面框号。 页面分配代码使用free_area 数组来寻找和释放页面,此机制负责整个缓冲管理。另外此代码与处理器使用的页面大小和物理 分页机制无关。 free_area中的每个元素都包含页面块的信息。 数组中**个元素描叙1个页面,*二个表示2个页面大小的块而接下来表示4个页面大小的块,总之都是2的次幂倍大小。list域表示一个队列头,它包含指向mem_map 数组中page 数据结构的 指针。所有的空闲页面都在此队列中。map域是指向某个特定页面尺寸的页面组分配情况位图的 指针。当页面的*N块空闲时,位图的*N位被置位。 图free-area-figure画出了free_area结构。**个元素有个自由页面(页面框号0),*二个元素有4个页面大小的2个自由块,**个从页面框号4开始而后一个从页面框号56开始。