`
memorymyann
  • 浏览: 271825 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux学习二内存管理重要的数据结构

阅读更多

这里只列举几个比较麻烦的数据结构

struct list_head {
    struct list_head *next, *prev;
} //linux通用的双向链队列,下面多处用到,这里列出源代码

linux对内存再用页式管理,对于页,就有个数据结构page加以描述。在内核中有个全局量mem-map指向的是一个page的数组,整个数组描述了整个物理内存,大家注意32位地址线,内存大小是2的32次方。由于页大小是4k也就是2的12次方。每4K的页就有一个page。那么2的32次方共有2的20次方个页,则mem-map指向的数组大小就是2的20次方。其中明显对于页的物理地址,一定是4K的倍数,因为它大小是4K,那么这个数组就有个对应,数组下标后面12个0(2进制)对应了页面的物理地址,他们在数值上是相等的。那么我们在page数据结构中就没有必要存贮它的物理地址。page数据结构定义位置include/linux/mm.h

struct page{

struct list_head list;   //通过使用它进入下面的数据结构free_area_struct结构中的双向链队列

struct address_space * mapping;   //用于内存交换的数据结构

unsigned long index;//当页面进入交换文件后

struct page *next_hash; //自身的指针,这样就可以链接成一个链表

atomic t count; //用于页面交换的计数,若页面为空闲则为0,分配就赋值1,没建立或恢复一次映射就加1,断开映射就减一

unsigned long flags;//反应页面各种状态,例如活跃,不活跃脏,不活跃干净,空闲

struct list_head lru;

unsigned long age; //表示页面寿命

wait_queue_head_t wait;

struct page ** pprev_hash;

struct buffer_head * buffers;

void * virtual

struct zone_struct * zone; //指向所属的管理区

}

(对于每个项的说明,我会慢慢补上)

对内存,仅仅用page数据结构来描述肯定远远不够,对于整个内存,我们在此之上分了管理区的概念,每个管理区管理数个页面。这个数据结构是 zone_struct定义位置是在include/linux/mmzone.h

typedef struct free_area_struct {
    struct list_head free_list;   //linux 中通用的双向链队列
    unsigned int * map;
} free_area_t;

typedef struct zone_struct{

    spinlock_t        lock;

    unsigned long offset;  //表示该管理区在mem-map数组中,起始的页号

    unsigned long free pages;
    unsigned long inactive_clean_pages;
    unsigned long inactive_dirty_pages;
    unsigned pages_min, pages_low, pages_high;
   
    struct list_head inactive_clean_list;   //用于页面交换的队列,基于linux页面交换的机制。这里存贮的是不活动“干净”页面
    free_area_t free_area[MAX_ORDER]; 

//一组“空闲区间”队列,free_area_t定义在上面,其中空闲下标表示的是页面大小,例如:数组第一个元素0号,表示所有区间大小为2的0次方的页面链接成的双向队列,1号表示所有2的1次方页面链接链接成的双向队列,2号表示所有2的2次方页面链接成的队列,其中要求是这些页面地址连续
   
    char * name;
    unsigned long size;
   
    struct pglist_data * zone_pgdat;   //用于指向它所属的存贮节点,及下面的数据结构
    unsigned  long  zone_start_paddr;
    unsigned  long    zone_start_mapnr;
    struct page * zone_mem_map;

} zone_t;

我们知道内存的地位并不是“平等的”,例如主内存和图形卡上的静态内存ram就不是“平等地位”,因此我们页面管理机制做了修正,管理区不是内存管理中最高层的概念,前述的page数组mem-map也不是全局,而是从属于具体的节点,在zone_struct 上面有了一层代表存贮节点的数据结构pglist_data,定义于include/linux/mmzone.h 中

typedef struct pglist_data {
    zone_t    node_zones[MAX_NR_ZONES];   //该节点最多的3个页面管理区,MAX_NR_ZONE值是3,在linux中分为3个管理区,也可能是2个ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM
    zonelist_t    node_zonelist[NR_GFPINDEX];   //具体说明见下面的数据结构
    struct page * node_mem_map;   //用于指向属于该存储节点的page数组
    unsigned long * valid_addr_bitmap;
    struct bootmem_data    * bdata;
    unsigned long node_start_paddr;
    unsigned long node_start_mapnr;
    unsigned long node_size;
    int    node_id;
    struct pglistdata * node_next;   //用于形成一个单链队列
}    pg_data_t;

typedef struct zonelist_struct {
    zone_t * zones [MAX_NR_ZONES+1]; //指针数组,指向每个具体的页面管理区
    int gfp_mask;
}    zonelist_t; //用于描述内存分配策略的数据结构,比如内存中最小适应法则的分配策略,我们就可以将区放入zones数组中,按照区内空闲页面从小到大的原则,但我们要实现这个法则,我们只需要从头到尾便利这个数组,那么找到第一个大于你要求的页面个数的区就是最小适应区

这些都是用于物理空间管理的,虚拟空间管理由下面的数据结构描述(我刚开始把虚拟空间弄成了虚拟内存,越看越糊涂,虚拟空间指的是,在linux中,4G内存被分为2块,搞地址1G内存叫系统空间,所有进程共享,下面的3G便是虚拟空间,每个进程都占有虚拟空间3G,在进程自己看来是这样的,但实际上,他远远没这么多内存用),vm_area_struct数据结构,定义于 include/linux/mm.h,进程虚存空间的描述,他被进一步组织到mm_struct中,它描述是地址连续的空间

struct vm_area_struct {
    struct mm_struct * vm_mm;   //下面说明
    unsigned long  vm_start;
    unsigned long vm_end;   //start和end决定了虚存空间,个人理解应该是mem-map表的下标,其中 start包含,end不包含,同时区间划分不单单是地址连续,还要保证权限的统一
   
    struct vm_area_struct * vm_next;   //将属于同一进程的虚存区间按照虚存地址高低链接起来
   
    pgrot t_vm_page_prot;
    unsigned long vm_flags;   //存贮该区间的权限
   
    short vm_avl_height;
    struct vm_area_struct * vm_avl_left;
    struct vm_area_struct * vm_avl_rigth; //用于生成 avl树,提高搜索效率
   
    struct vm_area_struct * vm_next_share;
    struct vm_area_struct ** vm_pprev_share;
   
    struct vm_operations_struct * vm_ops;   //下面说明
    unsigned long vm_pgoff;
   
    struct file * vm_file;
    unsigned long vm_raend;
    void * vm_private_data;   //这些属性都是用于记录页面与文件关系,具体情况具体分析
}

定义于include/linux/mm.h

struct vm_operations_struct {
    void (*open) (struct vm_area_struct * area);
    void (*close) (struct vm_area_struct * area);
    struct page * (*nopage)(struct vm_area_struct *area, unsigned long address, int write_access);
} //open, close,nopage用于虚存空间打开,关闭和建立印射

 

定义于include/linux/sched.h,进程所有的虚存空间的数据结构描述

struct mm_struct{
    struct vm_area_struct * mmap;   //建立虚存空间的单链队列
    struct vm_area_struct * mmap_avl;   //建立虚存空间的AVL树
    struct vm_area_struct * mmap_cache;   //最近一次使用的虚存空间,由于内存访问总是带有局部性,命中率有35%
    pgd_t * pgd;   //指向进程页面目录,在载入进程时候这个值会被载入到cr3寄存器中
    atomic_t mm_users;
    atomic_t mm_count;
    //这2个变量比较令人费解,mm_users记录是虚存空间的使用者,而mm_count记录的是mm_struct使用的计数。首先虚存空间是可以多个进程使用的,比如如果父进程调用vfork创建子线程,此时2者使用的是同一个虚存空间。线程是没有自己的虚存空间。其次一个mm_struct对应一个虚存,有几个使用者那么就有几个进程通过指针共享了这个mm_struct,按理说这2个计数应该是一个,不应该分成2个。大部分可能性2者是相同的。但又特殊情况,比如内核线程是没有虚存空间,他是需要暂借调用者的虚存空间,只是虚存空间使用者和mm_struct使用计数就不统一
    int map_count;
    struct semaphore mmap_sem;   //用于进程的间的互斥访问
    spinlock_t page_table_lock;
   
    struct list_head mmlist;
   
    unsigned long start_code, end_code, start_data, end_data
    unsigned long start_brk, brk, start_stack;
    unsigned long arg_start, arg_end, env_start, env_end;
    unsigned long rss, total_vm, locked_vm;
    unsigned long def_flags;
    unsigned long cpu_vm_mask;
    unsigned long swap_cnt;
    unsigned long swap_address;
    mm_context_t context;
}

在操作系统中,有个进程控制块(PCB)的概念,具体到linux里面对应的数据结构是task_struct,它内部就有个mm_struct指针,mm_struct是整个用户空间的抽象。待续。。。

分享到:
评论

相关推荐

    linux源代码分析之内存管理

    `rb_node_t`是红黑树节点的数据结构,在Linux内核的内存管理中用于实现高效的查找和排序操作。例如,它可以用于维护空闲内存页的集合。 ##### 2.8 虚拟区间标志 虚拟区间标志是与`vm_area_struct`相关的属性,用于...

    linux内存管理总结

    Linux 内存管理是操作系统核心的重要组成部分,它负责有效地分配、使用和回收系统内存资源。在Linux中,内存管理的设计非常复杂,以适应各种硬件架构和优化性能的需求。以下是Linux内存管理的一些关键知识点: 1. *...

    Linux内存管理分析

    ### Linux内存管理分析 #### 一、内存分页管理机制原理 Linux操作系统采用了现代计算机体系结构中的内存分页管理机制,这一机制的核心在于将物理内存分割成固定大小的页面(通常为4KB),并将虚拟地址空间同样划分...

    Linux内存管理笔记

    本文档提供了一个全面的Linux内存管理的知识体系,不仅适合Linux内核爱好者学习,也适用于系统管理员和开发者加深对Linux内存管理机制的理解。通过对存储器层次、UMA/NUMA架构、内存域划分、线性地址概念、页帧管理...

    深入理解Linux虚拟内存管理.rar

    Linux虚拟内存管理是操作系统核心的重要组成部分,它负责为应用程序提供比物理内存更大的地址空间,并有效地管理物理内存资源。本资料“深入理解Linux虚拟内存管理”旨在帮助读者深入了解这一复杂的系统机制,包括...

    操作系统 linux 请求分页 模拟内存管理实验报告java(内含源码)

    4. **实验预备内容**:学习内存管理的基本概念,如内存分配算法、页表和快表的原理,以及虚拟地址空间的组织。此外,还需要熟悉编程语言,如Java或C,以便实现模拟系统。 实验指导中的源代码展示了如何用Java实现这...

    Linux学习心得——内存管理方法

    ### Linux学习心得——内存管理方法 #### 1. 概述 本文主要针对Linux操作系统中的内存管理技术进行探讨,特别是针对内核版本2.6.32的TI Linux-Davinci-Staging。本文将从以下几个方面展开讨论: - **Linux内核...

    linux下内存管理

    在Linux操作系统中,内存管理是其核心功能之一,它对系统的稳定性和性能有着至关重要的影响。Linux内存管理系统设计得相当复杂且高效,旨在优化资源分配并确保系统的稳定性。本资料包聚焦于Linux下的内存管理,提供...

    嵌入式Linux内存与性能详解

    嵌入式Linux系统在各种设备和应用中广泛使用,其内存管理和性能优化是开发者面临的重要问题。本资源《嵌入式Linux内存与性能详解》详细阐述了这些关键领域,为理解嵌入式系统的内在机制提供了深入见解。 1. **...

    Linux内存管理内部学习资料

    Linux内核中内存管理是一个高度复杂的系统,其设计目的旨在高效、合理地使用物理内存资源,并为运行在系统上的进程提供一个一致和虚拟的内存视图。Linux内核使用多种策略和技术来管理内存,包括物理内存的分配、虚拟...

    嵌入式Linux内存与性能详解-史子旺

    《嵌入式Linux内存与性能详解》一书由史子旺撰写,专注于深入解析Linux内存管理机制以及如何在...通过学习,读者可以深入了解Linux内存管理的底层机制,掌握提高系统效率的关键技巧,为实际项目开发提供有力支持。

    Linux内存管理详解学习教案.pptx

    Linux内存管理是操作系统的核心组成部分,尤其对于服务器和嵌入式设备等依赖Linux系统的平台来说,高效、稳定的内存管理至关重要。本教程将深入讲解Linux内存管理的相关知识点。 首先,Linux对外提供的内存管理接口...

    Linux内存管理.

    系统页面表是Linux内存管理中的重要数据结构,它记录了虚拟地址与物理地址的映射关系。Linux使用三级页表(在某些架构上可能是四级),以支持更大范围的虚拟地址空间。 总结起来,Linux内存管理是一个复杂且高效的...

    Linux虚拟内存管理

    Linux虚拟内存管理是操作系统核心的重要组成部分,它负责管理和优化系统中的内存资源,使得应用程序能够高效地使用物理内存和硬盘上的交换空间。在Linux系统中,虚拟内存并不是一个实际的硬件特性,而是一种软件策略...

    linux的内存管理

    在Linux操作系统中,内存管理是其...以上是Linux内存管理的一些基础知识点,通过阅读《深入理解Linux内存管理》的学习笔记,可以进一步了解这些概念的详细工作原理和优化策略,提升对Linux内存管理的理解和实战能力。

    linux内存管理学习文档.doc

    在Linux系统中,内存管理包括了多种机制和数据结构,如slub内存分配器、页(frame)管理、缓存(kmem_cache)等。以下是对这些关键知识点的详细说明: 1. 常见结构体 - `struct kmem_cache`: 这个结构体是Linux内核中...

    linux内存管理实现代码

    本篇文章将深入探讨Linux内存管理的实现,主要围绕MMU(Memory Management Unit,内存管理单元)、内存分配策略以及内核中的关键数据结构。 MMU在Linux内存管理中扮演着至关重要的角色。它是一个硬件组件,负责地址...

    Linux学习心得——内存管理方法[归纳].pdf

    在Linux系统中,内存管理尤其重要,因为它不仅要保证系统的稳定运行,还要尽可能地提高资源利用率。 1. **概述** Linux内存管理系统的主要目标是确保进程的高效运行,同时防止内存碎片和数据冲突。它包括了物理...

    Linux虚拟存储技术的主要数据结构分析.pdf

    Linux虚拟存储技术是操作系统中的一项关键技术,主要涉及对物理内存的高效管理和虚拟内存的实现。本文将对Linux内核中...理解这些数据结构及其管理方式对于深入学习Linux内核和操作系统的存储管理部分是至关重要的。

Global site tag (gtag.js) - Google Analytics