Documentation/translations/zh_CN/mm/highmem.rst

Source file repositories/reference/linux-study-clean/Documentation/translations/zh_CN/mm/highmem.rst

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_CN/mm/highmem.rst
Extension
.rst
Size
7582 bytes
Lines
152
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

.. include:: ../disclaimer-zh_CN.rst

:Original: Documentation/mm/highmem.rst

:翻译:

 司延腾 Yanteng Si <siyanteng@loongson.cn>

:校译:

==========
高内存处理
==========

作者: Peter Zijlstra <a.p.zijlstra@chello.nl>

.. contents:: :local:

高内存是什么?
==============

当物理内存的大小接近或超过虚拟内存的最大大小时,就会使用高内存(highmem)。在这一点上,内
核不可能在任何时候都保持所有可用的物理内存的映射。这意味着内核需要开始使用它想访问的物理内
存的临时映射。

没有被永久映射覆盖的那部分(物理)内存就是我们所说的 "高内存"。对于这个边界的确切位置,有
各种架构上的限制。

例如,在i386架构中,我们选择将内核映射到每个进程的虚拟空间,这样我们就不必为内核的进入/退
出付出全部的TLB作废代价。这意味着可用的虚拟内存空间(i386上为4GiB)必须在用户和内核空间之
间进行划分。

使用这种方法的架构的传统分配方式是3:1,3GiB用于用户空间,顶部的1GiB用于内核空间。::

		+--------+ 0xffffffff
		| Kernel |
		+--------+ 0xc0000000
		|        |
		| User   |
		|        |
		+--------+ 0x00000000

这意味着内核在任何时候最多可以映射1GiB的物理内存,但是由于我们需要虚拟地址空间来做其他事
情--包括访问其余物理内存的临时映射--实际的直接映射通常会更少(通常在~896MiB左右)。

其他有mm上下文标签的TLB的架构可以有独立的内核和用户映射。然而,一些硬件(如一些ARM)在使
用mm上下文标签时,其虚拟空间有限。


临时虚拟映射
============

内核包含几种创建临时映射的方法。下面的列表按照使用的优先顺序显示了它们。

* kmap_local_page()。这个函数是用来要求短期映射的。它可以从任何上下文(包括中断)中调用,
  但是映射只能在获取它们的上下文中使用。

  在可行的情况下,这个函数应该比其他所有的函数优先使用。

  这些映射是线程本地和CPU本地的,这意味着映射只能从这个线程中访问,并且当映射处于活跃状
  态时,线程被绑定到CPU上。尽管这个函数从来没有禁用过抢占,但在映射被处理之前,CPU不能
  通过CPU-hotplug从系统中拔出。

  在本地的kmap区域中采取pagefaults是有效的,除非获取本地映射的上下文由于其他原因不允许
  这样做。

  如前所述,缺页异常和抢占从未被禁用。没有必要禁用抢占,因为当上下文切换到一个不同的任务
  时,离开的任务的映射被保存,而进入的任务的映射被恢复。

  kmap_local_page()总是返回一个有效的虚拟地址,并且假定kunmap_local()不会失败。

Annotation

Implementation Notes