Linux内核对于内存的管理摒弃了i386复杂的段式管理,而是采用了页式管理。Linux把整个的物理内存空间化为成一个个单独的页面,每页占4K空间大小。Linux把所有页面链接到一个全局的数组mem_map[]中,mem_map的每一个元素都是一个指针指向page数据结构。系统中的每个物理页面都对应着一个page数据结构,并根据需要把这些页面划分为不同的管理区:ZONE_DMA,ZONE_NORMAL和ZONE_HIGHMEM(用于物理内存超过1G空间的地址)。
typedef struct page {
struct list_head list; /* ->mapping has some page lists. */
struct address_space *mapping; /* The inode (or ...) we belong to. */
unsigned long index; /* Our offset within mapping. */
struct page *next_hash; /* Next page sharing our hash bucket in
the pagecache hash table. */
atomic_t count; /* Usage count, see below. */
unsigned long flags; /* atomic flags, some possibly
updated asynchronously */
struct list_head lru; /* Pageout list, eg. active_list;
protected by pagemap_lru_lock !! */
struct page **pprev_hash; /* Complement to *next_hash. */
struct buffer_head * buffers; /* Buffer maps us to a disk block. */
/*
* On machines where all RAM is mapped into kernel address space,
* we can simply calculate the virtual address. On machines with
* highmem some memory is mapped into kernel virtual memory
* dynamically, so we need a place to store that address.
* Note that this field could be 16 bits on x86 ... ;)
*
* Architectures with slow multiplication can define
* WANT_PAGE_VIRTUAL in asm/page.h
*/
#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)
void *virtual; /* Kernel virtual address (NULL if
not kmapped, ie. highmem) */
#endif /* CONFIG_HIGMEM || WANT_PAGE_VIRTUAL */
} mem_map_t;
DMA管理区是单独进行管理的,不经过MMU映射,而一般的外设都对地址空间有一定的限制。地址空间不能太大,而且要求地址连续。
每个管理区都对应着一个zone_struct结构,这个结构体中有一组空闲队列free_area_t。这些队列中要有一个队列保持一些离散的物理页面,另一个队列要保持长度为2的指数的连续物理页面。
typedef struct zone_struct {
/*
* Commonly accessed fields:
*/
spinlock_t lock;
unsigned long free_pages;
unsigned long pages_min, pages_low, pages_high;
int need_balance;
/*
* free areas of different sizes
*/
free_area_t free_area[MAX_ORDER];
/*
* wait_table -- the array holding the hash table
* wait_table_size -- the size of the hash table array
* wait_table_shift -- wait_table_size
* == BITS_PER_LONG (1 << wait_table_bits)
*
* The purpose of all these is to keep track of the people
* waiting for a page to become available and make them
* runnable again when possible. The trouble is that this
* consumes a lot of space, especially when so few things
* wait on pages at a given time. So instead of using
* per-page waitqueues, we use a waitqueue hash table.
*
* The bucket discipline is to sleep on the same queue when
* colliding and wake all in that wait queue when removing.
* When something wakes, it must check to be sure its page is
* truly available, a la thundering herd. The cost of a
* collision is great, but given the expected load of the
* table, they should be so rare as to be outweighed by the
* benefits from the saved space.
*
* __wait_on_page() and unlock_page() in mm/filemap.c, are the
* primary users of these fields, and in mm/page_alloc.c
* free_area_init_core() performs the initialization of them.
*/
wait_queue_head_t * wait_table;
unsigned long wait_table_size;
unsigned long wait_table_shift;
/*
* Discontig memory support fields.
*/
struct pglist_data *zone_pgdat;
struct page *zone_mem_map;
unsigned long zone_start_paddr;
unsigned long zone_start_mapnr;
/*
* rarely used fields:
*/
char *name;
unsigned long size;
} zone_t;
分享到:
相关推荐
Linux内核内存管理是操作系统中极为重要的一个部分,它涉及到操作系统如何高效、合理地使用物理内存资源以及虚拟内存资源。Linux内核内存管理机制包括页面类型与组织、页面回收逻辑、内存区域划分、页面分配策略、...
Linux内核内存管理是操作系统设计中的关键部分,它负责有效地分配和管理系统的物理和虚拟内存。在Linux系统中,内存管理的复杂性在于它需要在多个进程之间共享有限的资源,同时确保系统的稳定性和高效性。以下是...
内存管理子系统是Linux内核的重要组成部分,它负责处理系统的物理内存资源。良好的内存管理不仅能够提高系统的性能,还能确保系统的稳定性和安全性。对于从事Linux内核开发的工程师来说,深入了解内存管理机制是必不...
Linux 内核的内存管理探秘之四 虚拟内存的管理 Linux 操作系统中,内存管理是非常重要的一部分。虚拟内存技术是现代操作系统中的一个关键技术,它克服了旧有的内存管理的限制,允许系统运行比物理内存大的应用程序...
"Linux内核的内存管理探秘之三 物理内存的管理(二)页面周转与缓冲区" Linux内核的内存管理探秘之三 物理内存的管理(二)页面周转与缓冲区是Linux内核的内存管理机制中一个重要的部分。物理内存的管理是指操作系统...
Linux内核的内存管理是操作系统核心功能之一,负责高效地分配和回收物理内存资源。为了更好地理解这一复杂的过程,本文将深入探讨Linux内核如何管理和组织内存资源。 #### 内存布局 Linux内核将内存分为几个关键...
Linux内核内存管理是操作系统设计的关键部分,它负责有效地分配、使用和回收系统中的物理内存。在Linux系统中,内存管理机制确保了高效且可靠的内存使用,为各个进程提供了一个一致且安全的运行环境。本资料主要探讨...
此外,内核还包含了一些内存管理子系统,如伙伴系统和slab分配器,它们用于高效地管理物理内存和缓存。伙伴系统主要用于分配和回收连续的大块内存,而slab分配器则优化了小对象的分配和回收,减少了内存碎片。 实验...
《Linux内核的内存管理探秘之二:物理内存的管理(一)分配与回收》 在深入探讨Linux内核的内存管理时,物理内存的分配与回收是至关重要的环节。Linux内核采用了一种高效的分配算法——伙伴系统(Buddy System),其...
Zone是Linux内核内存管理中的一个重要概念,它将整个系统的物理内存分割成多个区域(zone),每个区域包含了一定量的物理页。这种分层的方式有助于提高内存分配的效率。每个Zone都有自己的管理结构,包括自旋锁、空闲...
首先,内存节点(node)是Linux内核对物理内存的一种抽象表示。在一个计算机系统中,内存节点用于描述物理内存的分布情况。在一致存储结构(UMA)的计算机系统中,内存是均匀分布的,系统只有一个节点。然而,在非一致性...
这本书由Robert Love编写,是学习Linux内核不可或缺的经典之作。以下将从标题、描述以及标签中提炼出的关键信息,详细阐述Linux内核设计与实现的相关知识点。 1. **Linux内核的基本概念**:Linux内核是Linux操作...
Linux 内核的内存管理是一种复杂的机制,它的主要任务是对物理内存进行组织和分配,并对虚拟地址进行映射。下面将对 Linux 内核的内存管理机制进行详细的剖析。 一、物理内存的组织 Linux 中的物理内存被组织成三...
3. 内存管理:了解Linux如何分配和回收内存,包括物理内存的组织、虚拟内存的映射、页面缓存等机制。这些知识对于优化程序性能和避免内存泄漏至关重要。 4. 文件系统:Linux内核支持多种文件系统,如EXT2、EXT3、...
Linux内核内存管理是操作系统设计的核心部分,它负责有效地分配、使用和回收系统中的物理及虚拟内存。在Linux系统中,内存管理确保了程序的高效运行,防止数据损坏,并优化了系统的整体性能。本篇文章将深入探讨...
Linux内核内存管理技术分享 Linux内核内存管理技术是指Linux操作系统中管理计算机内存资源的机制。该技术涉及到计算机体系结构、MMU、Cache、DMA、EPT、虚拟地址空间布局、伙伴系统、SLAB、用户空间地址布局、匿名...
在Linux内核中,内存管理包括了物理内存的分配与释放、虚拟内存的映射、缓存和页面替换策略等多个方面。 首先,我们需要了解Linux内核是如何组织物理内存的。Linux采用了一种称为页式内存管理的机制,将物理内存...
1. 系统管理能力:Linux内核的强大之处在于其高效的系统管理能力,它能够有效地调度和管理CPU、内存以及各种设备资源。系统调度器是内核的核心组件之一,负责为运行在系统上的进程分配CPU时间片,并根据不同的调度...
Linux0.11是一个早期版本的Linux内核,虽然相对简陋,但它的内存管理系统为我们理解现代Linux内核提供了基础。本节将深入探讨Linux0.11内核的内存管理机制。 1. **物理内存管理**: - Linux0.11内核通过页框管理器...
8. **内存管理**:Linux内核的内存管理系统包括虚拟内存、物理内存的分配和回收、页交换等机制,这些对于系统的稳定性和效率至关重要。 9. **进程管理**:内核负责进程的创建、调度、同步和通信,理解进程生命周期...