用Linux5.0的视角看《Linux内核设计与实现》——(四)内存管理

本文从页(page)和区(zone)的概念出发,详细介绍了Linux内核中内存管理的基本单位及分区策略。讨论了内核如何通过页分配、释放接口进行内存操作,并涉及进程地址空间、内存描述符mm_struct和虚拟内存区域vm_area_struct的管理。文章还探讨了32位和64位CPU的地址空间布局,并以Linux5.13中ARM64为例,解析进程创建时地址空间的构建过程。
摘要由CSDN通过智能技术生成

在看完了内核中的进程管理,接下来我们看看内存管理——操作系统的另一大块,个人觉得当你对进程管理和内存管理都有一定的了解后,对“内核”这一词就会有一个比较清晰的概念。

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时,代表没有被应用,就可以被重新分配 */
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值