Skip to content

9.2. The Memory Descriptor

All information related to the process address space is included in an object called the memory descriptor of type mm_struct . This object is referenced by the mm field of the process descriptor. The fields of a memory descriptor are listed in Table 9-2.

Table 9-2. The fields of the memory descriptor

Type Field Description 注释
struct vm_area_struct * mmap Pointer to the head of the list of memory region objects 参见chapter 9.3. Memory Regions
struct rb_root mm_rb Pointer to the root of the red-black tree of memory region objects
struct vm_area_struct * mmap_cache Pointer to the last referenced memory region object
unsigned long (*)( ) get_unmapped_area Method that searches an available linear address interval in the process address space
void (*)( ) unmap_area Method invoked when releasing a linear address interval
unsigned long mmap_base Identifies the linear address of the first allocated anonymous memory region or file memory mapping (see the section "Program Segments and Process Memory Regions" in Chapter 20)
unsigned long free_area_cache Address from which the kernel will look for a free interval of linear addresses in the process address space
pgd_t * pgd Pointer to the Page Global Directory 关于Page Global Directory,参见Section 2.4. Paging in Hardware、Section 2.5. Paging in Linux
atomic_t mm_users Secondary usage counter
atomic_t mm_count Main usage counter

All memory descriptors are stored in a doubly linked list. Each descriptor stores the address of the adjacent list items in the mmlist field. The first element of the list is the mmlist field of init_mm , the memory descriptor used by process 0 in the initialization phase. The list is protected against concurrent accesses in multiprocessor systems by the mmlist_lock spin lock.

The mm_users field stores the number of lightweight processes that share the mm_struct data structure (see the section "The clone( ), fork( ), and vfork( ) System Calls" in Chapter 3). The mm_count field is the main usage counter of the memory descriptor; all "users" in mm_users count as one unit in mm_count . Every time the mm_count field is decreased, the kernel checks whether it becomes zero; if so, the memory descriptor is deallocated because it is no longer in use.