在看完了内核中的进程管理,接下来我们看看内存管理——操作系统的另一大块,个人觉得当你对进程管理和内存管理都有一定的了解后,对“内核”这一词就会有一个比较清晰的概念。
12.1 页(page)
页,是内核管理物理内存的基本单位。虽然处理器处理内存可以以字节为单位,但是一般来讲在处理器和物理内存之间,还存在着一个处理单元,我们称之为内存管理单元(MMU),主要负责虚拟地址到物理地址的转换。(关于为什么我们总是需要一个MMU在CPU和物理内存之间,这是计算机系统设计的一个总要知识,挖坑中……)
在内核中,用struct page表示系统中的一个物理页,所有的物理内存的使用一定和这个结构体有关系。当前内核的结构体已经比书上所展示的复杂很多了,我也稍作修剪贴上来。
struct page {
unsigned long flags; /* Atomic flags, some possibly updated asynchronously */
/* flag每个位的意义定义在linux/page-flags.h中,包括是否为脏,有没有锁定等 */
union {
struct {
/* Page cache and anonymous pages */
/**
* @lru: Pageout list, eg. active_list protected by
* lruvec->lru_lock. Sometimes used as a generic list
* by the page owner.
*/
struct list_head lru;
/* See page-flags.h for PAGE_MAPPING_FLAGS */
struct address_space *mapping;
pgoff_t index; /* Our offset within mapping. */
/**
* @private: Mapping-private opaque data.
* Usually used for buffer_heads if PagePrivate.
* Used for swp_entry_t if PageSwapCache.
* Indicates order in the buddy system if PageBuddy.
*/
unsigned long private;
};
/* 剩下的是其他场景下使用的结构体 */
…
};
union {
/* This union is 4 bytes in size. */
/*
* If the page can be mapped to userspace, encodes the number
* of times this page is referenced by a page table.
*/
atomic_t _mapcount;
…
};
/* Usage count. *DO NOT USE DIRECTLY*. See page_ref.h */
/* 引用计数,当计数为-1时,代表没有被应用,就可以被重新分配 */