Documentation/translations/zh_CN/mm/hugetlbfs_reserv.rst

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

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_CN/mm/hugetlbfs_reserv.rst
Extension
.rst
Size
26184 bytes
Lines
438
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

struct resv_map {
			struct kref refs;
			spinlock_t lock;
			struct list_head regions;
			long adds_in_progress;
			struct list_head region_cache;
			long region_cache_count;
		};

	系统中每个巨页映射都有一个预留映射。resv_map中的regions列表描述了映射中的
	区域。一个区域被描述为::

		struct file_region {
			struct list_head link;
			long from;
			long to;
		};

	file_region结构体的 ‘from’ 和 ‘to’ 字段是进入映射的巨页索引。根据映射的类型,在
	reserv_map 中的一个区域可能表示该范围存在预留,或预留不存在。
Flags for MAP_PRIVATE Reservations
	这些被存储在预留的映射指针的底部。

	``#define HPAGE_RESV_OWNER    (1UL << 0)``
		表示该任务是与该映射相关的预留的所有者。
	``#define HPAGE_RESV_UNMAPPED (1UL << 1)``
		表示最初映射此范围(并创建储备)的任务由于COW失败而从该任务(子任务)中取消映
		射了一个页面。
Page Flags
	PagePrivate页面标志是用来指示在释放巨页时必须恢复巨页的预留。更多细节将在
	“释放巨页” 一节中讨论。


预留映射位置(私有或共享)
==========================

一个巨页映射或段要么是私有的,要么是共享的。如果是私有的,它通常只对一个地址空间
(任务)可用。如果是共享的,它可以被映射到多个地址空间(任务)。对于这两种类型的映射,
预留映射的位置和语义是明显不同的。位置的差异是:

- 对于私有映射,预留映射挂在VMA结构体上。具体来说,就是vma->vm_private_data。这个保
  留映射是在创建映射(mmap(MAP_PRIVATE))时创建的。
- 对于共享映射,预留映射挂在inode上。具体来说,就是inode->i_mapping->private_data。
  由于共享映射总是由hugetlbfs文件系统中的文件支持,hugetlbfs代码确保每个节点包含一个预
  留映射。因此,预留映射在创建节点时被分配。


创建预留
========
当创建一个巨大的有页面支持的共享内存段(shmget(SHM_HUGETLB))或通过mmap(MAP_HUGETLB)
创建一个映射时,就会创建预留。这些操作会导致对函数hugetlb_reserve_pages()的调用::

	int hugetlb_reserve_pages(struct inode *inode,
				  long from, long to,
				  struct vm_area_struct *vma,
				  vm_flags_t vm_flags)

hugetlb_reserve_pages()做的第一件事是检查在调用shmget()或mmap()时是否指定了NORESERVE
标志。如果指定了NORESERVE,那么这个函数立即返回,因为不需要预留。

参数'from'和'to'是映射或基础文件的巨页索引。对于shmget(),'from'总是0,'to'对应于段/映射
的长度。对于mmap(),offset参数可以用来指定进入底层文件的偏移量。在这种情况下,'from'和'to'
参数已经被这个偏移量所调整。

PRIVATE和SHARED映射之间的一个很大的区别是预留在预留映射中的表示方式。

- 对于共享映射,预留映射中的条目表示对应页面的预留存在或曾经存在。当预留被消耗时,预留映射不被
  修改。
- 对于私有映射,预留映射中没有条目表示相应页面存在预留。随着预留被消耗,条目被添加到预留映射中。
  因此,预留映射也可用于确定哪些预留已被消耗。

Annotation

Implementation Notes