`
waterlife
  • 浏览: 67893 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Linux内核之虚拟内存管理(一)

阅读更多

Linux内核对于虚拟内存的管理是以进程为基础的,每个进程都有自己的虚存空间。而系统空间是所有进程所共享的。对虚拟空间常用数据结构vm_area_struct来描述。

 

struct vm_area_struct {
	struct mm_struct * vm_mm;	/* The address space we belong to. */
	unsigned long vm_start;		/* Our start address within vm_mm. */
	unsigned long vm_end;		/* The first byte after our end address
					   within vm_mm. */

	/* linked list of VM areas per task, sorted by address */
	struct vm_area_struct *vm_next;

	pgprot_t vm_page_prot;		/* Access permissions of this VMA. */
	unsigned long vm_flags;		/* Flags, listed below. */

	rb_node_t vm_rb;

	/*
	 * For areas with an address space and backing store,
	 * one of the address_space->i_mmap{,shared} lists,
	 * for shm areas, the list of attaches, otherwise unused.
	 */
	struct vm_area_struct *vm_next_share;
	struct vm_area_struct **vm_pprev_share;

	/* Function pointers to deal with this struct. */
	struct vm_operations_struct * vm_ops;

	/* Information about our backing store: */
	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE
					   units, *not* PAGE_CACHE_SIZE */
	struct file * vm_file;		/* File we map to (can be NULL). */
	unsigned long vm_raend;		/* XXX: put full readahead info here. */
	void * vm_private_data;		/* was vm_pte (shared mem) */
};

 其中vm_start和vm_end决定了一个虚存空间,vm_page_prot和vm_lags表示页面的访问权限。同一进程的所有区间都要按虚拟地址的高低次序链接在一起,vm_next指向下一个区间,组成一个线性链表。

 

区间数量较大的时候会建立AVL树,它搜索的时间复杂度为olog (n)。其中vm _mm指向mm_struct结构,是进程用户空间的抽象,在task_struct中有相应的指针指向mm_struct。

struct mm_struct {
	struct vm_area_struct * mmap;		/* list of VMAs */
	rb_root_t mm_rb;
	struct vm_area_struct * mmap_cache;	/* last find_vma result */
	pgd_t * pgd;
	atomic_t mm_users;			/* How many users with user space? */
	atomic_t mm_count;			/* How many references to "struct mm_struct" (users count as 1) */
	int map_count;				/* number of VMAs */
	struct rw_semaphore mmap_sem;
	spinlock_t page_table_lock;		/* Protects task page tables and mm->rss */

	struct list_head mmlist;		/* List of all active mm's.  These are globally strung
						 * together off init_mm.mmlist, and are protected
						 * by mmlist_lock
						 */

	unsigned long start_code, end_code, start_data, end_data;
	unsigned long start_brk, brk, start_stack;
	unsigned long arg_start, arg_end, env_start, env_end;
	unsigned long rss, total_vm, locked_vm;
	unsigned long def_flags;
	unsigned long cpu_vm_mask;
	unsigned long swap_address;

	unsigned dumpable:1;

	/* Architecture-specific MM context */
	mm_context_t context;
};

 mmap用于建立一个虚存区间结构的单线性列表;mmap_avl用于建立一个虚存区间的AVL树;mmap_cache指向最近一次用到的虚存空间;mm_count说明队列中(AVL树)有几个虚存结构;pdg指向该进程的页面目录,当进程运行的时候,pdg转换成物理地址保存在寄存器CR3中。

 

 

分享到:
评论

相关推荐

    Linux内核的内存管理探秘之四 虚拟内存的管理.pdf

    Linux 内核的内存管理探秘之四 虚拟内存的管理 Linux 操作系统中,内存管理是非常重要的一部分。虚拟内存技术是现代操作系统中的一个关键技术,它克服了旧有的内存管理的限制,允许系统运行比物理内存大的应用程序...

    Linux虚拟内存管理.pdf

    "Linux虚拟内存管理" Linux操作系统中,虚拟内存管理是指使用磁盘作为RAM的扩展,以增大可用的内存大小。内核会将暂时不用的内存块的内容写到硬盘上,以便释放出内存空间供其他进程使用。当需要用到原始的内容时,...

    linux内核内存管理

    Linux内核内存管理是操作系统中极为重要的一个部分,它涉及到操作系统如何高效、合理地使用物理内存资源以及虚拟内存资源。Linux内核内存管理机制包括页面类型与组织、页面回收逻辑、内存区域划分、页面分配策略、...

    深入理解Linux虚拟内存管理.rar

    本资料“深入理解Linux虚拟内存管理”旨在帮助读者深入了解这一复杂的系统机制,包括虚拟内存的原理、页表、内存映射、交换机制以及缓存管理等关键概念。 首先,虚拟内存的基本理念是将内存地址分为两部分:虚拟...

    Linux内核虚拟化.pdf

    Linux 内核虚拟化可以分为两大类:一是基于硬件的虚拟化技术,二是基于软件的虚拟化技术。基于硬件的虚拟化技术可以直接使用硬件提供的虚拟化功能,而基于软件的虚拟化技术则需要通过软件来模拟硬件的虚拟化功能。 ...

    Linux内存管理之虚拟内存管理.doc

    4.虚拟内存管理单元(Memory Management Unit,MMU): MMU是 Linux操作系统虚拟内存管理机制的核心组件之一,MMU负责将逻辑地址转换为物理地址,并对物理内存进行保护和管理。 在Linux操作系统中,虚拟内存管理...

    深入理解Linux虚拟内存管理_英文原版

    - **内核虚拟内存管理器**:Linux内核中的虚拟内存管理器负责整个系统的虚拟内存管理,包括内存映射、页面置换、内存保护等功能。 #### 结论 通过深入研究《深入理解Linux虚拟内存管理》,我们可以了解到Linux如何...

    linux内核内存管理图解

    Linux内核内存管理是操作系统设计中的关键部分,它负责有效地分配和管理系统的物理和虚拟内存。在Linux系统中,内存管理的复杂性在于它需要在多个进程之间共享有限的资源,同时确保系统的稳定性和高效性。以下是...

    linux内核开发-内存管理

    ### Linux内核开发—内存管理 #### 一、引言 在现代计算机系统中,内存管理作为操作系统的核心功能之一,其重要性不言而喻。Linux作为一种广泛使用的开源操作系统,其内核中的内存管理机制尤为关键。本文将深入...

    Linux内核内存管理技术分享

    Linux内核内存管理技术是一个复杂的系统,涉及到计算机体系结构、MMU、Cache、DMA、EPT、虚拟地址空间布局、伙伴系统、SLAB、用户空间地址布局、匿名页和文件页、缺页异常、反向映射、内存规整、OOM、KSM、巨型页、...

    linux源代码分析之内存管理

    本文档是对Linux内核内存管理系统的一个深入分析,特别是针对其源代码进行了详细的解读。Linux的内存管理是内核中最复杂的部分之一,它涉及到了内存初始化、地址映射、请页、交换、分配与回收等多个方面。通过对这些...

    Linux操作系统内存管理.pdf

    Linux操作系统的内存管理机制是一个复杂的机制,涉及到物理内存、虚拟内存、地址映射、内存碎片和内存不连续的问题解决等。只有深入了解Linux操作系统的内存管理机制,我们才能更好地使用和管理计算机资源。

    01-Linux内存管理之二:在X86上的虚拟内存管理.rar

    本文将深入探讨Linux在X86平台上如何实现虚拟内存管理,包括虚拟地址空间的划分、页表机制、内存分配与回收、交换机制以及缓存管理。 1. 虚拟地址空间: 在X86架构下,Linux为每个进程分配了一个独立的4GB虚拟地址...

    基于Linux内核的动态内存管理机制的实现.pdf

    为解决这一问题,基于Linux内核实现的动态内存管理机制旨在限制每个进程可以申请的最大内存数量,并防止内存泄露导致的系统不稳定。 Linux内核提供了多种内存分配接口,如malloc、calloc等,这些接口被封装在C库...

    疯狂内核之——Linux虚拟内存

    分页机制是现代操作系统中常用的一种虚拟内存管理方法。它将物理内存划分为固定大小的页(通常为4KB),并将虚拟地址空间也划分为相同大小的页。每个页可以映射到不同的物理页上,这种映射关系由页表来维护。 **...

    Linux内核内存管理.zip

    总结,Linux内核的内存管理是一个复杂而精细的系统,它涉及到物理内存的分配、映射、权限控制、换页、碎片管理和内存压力的处理等多个方面。这些机制共同确保了Linux系统在内存资源有限的情况下,仍能高效、稳定地...

    Linux内核设计的艺术

    内存管理是另一个重要的方面,Linux内核通过虚拟内存管理技术,实现了内存的保护、共享和高效利用。 2. 内核模块化设计:Linux内核采用了模块化的架构设计,能够动态地加载和卸载内核模块。这种设计使得内核能够...

    一文剖析 Linux 内核的内存管理.docx

    Linux 内核的内存管理是一种复杂的机制,它的主要任务是对物理内存进行组织和分配,并对虚拟地址进行映射。下面将对 Linux 内核的内存管理机制进行详细的剖析。 一、物理内存的组织 Linux 中的物理内存被组织成三...

    Linux内核设计与实现(第三版中文高清带目录)_linux_linux内核_

    这本书由Robert Love编写,是学习Linux内核不可或缺的经典之作。以下将从标题、描述以及标签中提炼出的关键信息,详细阐述Linux内核设计与实现的相关知识点。 1. **Linux内核的基本概念**:Linux内核是Linux操作...

    Linux内核完全注释:基于0.11内核(V5.0)_0.11内核_linux_linux内核完全注释_Linux内核注释_

    3. 内存管理:了解Linux如何分配和回收内存,包括物理内存的组织、虚拟内存的映射、页面缓存等机制。这些知识对于优化程序性能和避免内存泄漏至关重要。 4. 文件系统:Linux内核支持多种文件系统,如EXT2、EXT3、...

Global site tag (gtag.js) - Google Analytics