Linux的内存管理(二)

Linux的内存管理(二)

6.Linux数据结构

pg_data_t的主要数据结构

作用
node_zones 保存该节点所拥有的管理区描述符, DMA、NORMAL、HIGHMEM
node_zonelists 内存管理区的分配策略, 当调用free_area_init_core()时,由build_zonelists()函数设置
nr_zones node中的zone的数量, 1到3个之间
node_mem_map node中的第一个page
bdata 仅用于boot 的内存分配
node_start_pfn pfn是page frame number的缩写, 用于表示node中的开始那个page在物理内存中的位置的
node_present_pages node中的真正可以使用的page数量
node_spanned_pages node中所有存在的Page的数量, 包括可用的、mem_map所占用的及dma所占用的区域
node_id node的NODE ID, 从0开始
kswapd_wait node的等待队列
   

zone的主要数据结构

作用
lowmem_reserve 保留的低地址区域的内存
pageset page管理的数据结构对象, 内部有一个page的列表(list)来管理. 每个CPU维护一个
list 用于避免自旋锁的冲突, 其大小和NR_CPUS有关, 编译时确定
lock 对zone并发访问的保护的自旋锁
free_area 页面使用状态的信息, 以每个bit标识对应的page是否可以分配
pages_scanned 上次回收page后, 扫描过的page的数量
wait_table 等待一个page释放的等待队列哈希表. 会被wait_on_page(),unlock_page()函数使用
wait_table_hash_nr_entries 哈希表中的等待队列的数量
zone_pgdat 指向这个zone所在的pglist_data对象
zone_start_pfn 同node_start_pfn, 用于表示zone中的开始那个page在物理内存中的位置
present_pages 和node中的类似的成员含义一样
spanned_pages 和node中的类似的成员含义一样
   

page的主要数据结构

作用
flags 状态的标志信息, 有大量宏用于设置清楚、检测flag成员中的各个位所表示的状态信息
_count 访问计数. 当为0说明page是空闲的, 大于0说明一个或多个进程使用或者kernel用于在等待I/O
index 根据page的使用的目的有2种可能的含义。第一种情况:如果page是file mapping的一部分,它指明在文件中的偏移。如果page是交换缓存,则它指明在address_space所声明的对象:swapper_space(交换地址空间)中的偏移。第二种情况:如果这个page是一个特殊的进程将要释放的一个page块,则这是一个将要释放的page块的序列值,这个值在__free_page_ok()函数中设置
mapping 当文件或设备需要内存映射,文件或设备的inode对象有一个address_space类型的成员。如果page属于这个文件或设备,mapping将指向inode中这个成员。如果page不属于任何文件或设备,但是 mapping被设置了,则mapping指向了一个address_space类型的swapper_space对象,则page用于管理交换地址空间(swap address space)了
lru page交换调度策略使用。page可能被调度到active_list或者inactive_list队列里。就是使用lru这个list_head
private 保存了一些和mapping(文件mapping到内存)有关的一些特定的信息。如果page是一个buffer page,则它就保存了一个指向buffer_head的指针
virtual 不再用于将high memory的映射到ZONE_NORMAL区域的作用了,除了一些其他的体系结构会用到外
   

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7.进程内存管理

内存管理中MMU的存在使得进程之间相互隔离,进程访问的空间均为虚拟地址空间
Linux中用struct mm_struct来描述一个进程的虚拟地址空间,也通常称为内存描述符
每个进程只有一个mm_struct结构,但可能有多个虚拟内存区间(struct vm_area_struct),通常用vma表示,不同vma代表着进程空间的各个区域,比如堆、栈、代码区、数据区、各种映射区、等等
   对这些vma的组织方式有两种
     - 当虚拟区间较少时, 采用单链表,由mmap指针指向这个链表,
     - 当虚拟区间多时, 采用"红黑树(red_black tree)”结构,由mm_rb指向这颗树。
mmap_cache 用来保存最近一次用到的虚拟区间,因为程序中用到的地址常常具有局部性
pgd 指向该进程的页目录(每个进程都有自己的页目录,区别于内核页目录)
mmap_sem/page_table_lock 是互斥访问虚拟区间的信号量
mm_user/mm_count 指明了此虚拟地址空间的用户/引号。主要用于进程间共享

特殊的内存描述符: 同init_task一样,init_mm为内核进程服务。
Linux的内存管理(二)_第1张图片

http://blog.csdn.net/tommy_wxie/article/details/7426580

http://blog.csdn.net/ryder001/article/details/7825710

http://www.chinaunix.net/old_jh/4/1003872.html

http://www.linuxidc.com/Linux/2011-12/50480.htm


Linux mips内存初始化分析

参考:
linux内存管理浅析
专栏:Linux内存管理
内存管理的那些事儿
Linux的内存管理(二)_第2张图片

你可能感兴趣的:(linux)