⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 -+

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻
字号:
any problems,send mail to sindybear@163.com


相关文件
	/mm/memory.c
	/fs.h
	/include/asm-i386/pgtable.h
	/mm/filemap.c



在linux系统中,内存是最为紧俏的一种资源,随着linux的改进,这部分的管理变化也很大。现在简要介绍一下
当前2.4.18中的内存的管理方法。

在当前的版本中,设置了NUMA体系结构,使得linux可以适应于一些大型的基于不连续存储介质的系统。
其实简单说就是,假设一个计算机的体系结构中有许多不同的存储节点,则每一个存储节点在NUMA中有
一个相应的pg_data_t结构来进行描述,这些节点又通过pg_data_t结构中的node_next域连接成一个链表
链表的头指针是pgdat_list(page_alloc.c)

在每一个NUMA节点中,又可以将节点中的内存在分成不同的区域(zone),每一个区域使用一个zone_struct结构
进行描述,这个结构实际上就是我们进行内存分配回收等一系列操作的真正的场所之所在。在zone_struct结构
中,分别又
	struct list_head	active_list;
	struct list_head	inactive_dirty_list;
	struct list_head	inactive_clean_list;

	free_area_t		free_area[MAX_ORDER];

这四个结构,这就是内存周转的地方,所有的内存页面的搬迁,转移都基本上是在这个范围内做的

其中free_area按照2的阶乘方式将所有再这个zone区域中的空闲页面组织成为空闲队列。对内存的分配
就是在这个域上进行操作。

active_list上连接所有活动的叶面

inactive_dirty_list连接所有的暂时不用,而且更新过,重新使用之前要将数据写到磁盘上。

inactive_clean_list连接所有暂时不同,但并不脏,使用前不需要回写到磁盘上的叶面


*****************************相关页结构的描述****************************************
相应的,我们先来看一看代表一个内存页面的page结构的一些域,正是这些域,才又可能将page连接到
各种不同的表中。
page结构中共有三个可供连接到别的表中的域,
	struct page *next_hash;
	struct page **pprev_hash;
	
	struct list_head list;
	
	struct list_head lru;
很明显,前两个域是专门用来连接到哈希表中的域,别的地方不会使用,整个linux系统只有一个唯一的
页面缓冲哈希表,也就是定义在文件filemap.c中的struct page **page_hash_table;使用定义在pagemap.h
中的哈希函数#define page_hash(mapping,index) (page_hash_table+_page_hashfn(mapping,index))进行访问


第二个连接域list域则是连接在zone区域中的free_area中的空闲链表中,如果这个页面被请求返回给用户,
则要将它从这个链中脱离开,如果这个页面用于文件的缓冲,也就是连接到相应文件inode节点结构中的
i_mapping(等同于i_data)中相应的dirty,clean,locked等队列中。


第三个域lru则是专门用于连接到zone区域中的active_list,inactive_dirty_list,inactive_clean_list上的
用于内核来进行控制,例如内存紧张的时候,从中选取一部分的叶面换出到swap中等操作


在页面结构page中,又一个极为重要的域mapping,当一个页面用来作为文件系统的缓冲,或者作为交换分区
的缓冲的话,这个域一般存储各种文件系统的mapping结构,其实也就是从inode节点结构中的i_mapping中复制
过来的,所以,一个页面的具体的读写操作,如果在mapping不为空的情况下,就调用这个mapping中所属的
writepage,readpage等和具体的文件系统相关的操作函数进行实际的读写。当然,系统提供了诸如
block_write_full_page,block_read_full_page等通用操作函数,一般的文件系统只用使用这些就足够了













⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -