- 浏览: 271825 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
这里只列举几个比较麻烦的数据结构
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下挂在windows共享文件夹
2012-05-06 12:53 893smbmount //nas/xxxx /mnt/nas -o ... -
进程组 对话期
2010-04-16 16:12 1428为了便于进程控制,于是就有了进程组,对话期的概念。 进 ... -
感谢你教会我如何提问-《提问的智慧》
2009-01-12 11:25 1476转自:http://linux.chinaunix ... -
linux手动添加开机启动的服务
2009-01-02 14:48 7203如果你只是想知道如何 ... -
让信号量来实现临界区控制
2008-12-09 16:14 1610前面我们谈到过管道,消息队列。我们可以使用他们可以解决了2个进 ... -
进程通行之报文消息队列
2008-12-04 17:39 1425报文和消息队列又是进 ... -
信号和信号处理
2008-11-26 16:09 3351信号同样是用于进程通 ... -
命名管道实现样例
2008-11-18 17:41 1295[root@liumengli name_pipe]# mkn ... -
linux中的管道实现和管道
2008-11-14 17:52 12989inux的shell中有个很常用的东西管道,很多人认为他是sh ... -
文件访问权限和安全
2008-10-28 18:02 1249打开文件,读取内容或 ... -
printk内核调试
2008-10-15 17:07 9466首先阐明一点,我调试的目的是为了学习,看看内核代码是如何运行, ... -
linux内核编译
2008-10-07 17:36 1974这是调试linux内核的必要步骤,虽然很麻烦,而且容易出错(所 ... -
linux文件系统
2008-10-06 11:08 1024文件系统是一个比较模糊的名词,文件也是一个比较模糊的名词。狭义 ... -
linux内核书籍下载
2008-09-25 11:47 2203学习内核代码之前,需要有以下一些基础: 1.linux系统管理 ... -
nanosleep函数
2008-09-24 17:36 3386int nanosleep(const struct ti ... -
linux进程调度政策
2008-09-23 11:45 1598进程调度政策就是调度系统种哪一个进程来CPU运行。这种调度分2 ... -
linux进程调度发生的时机
2008-09-19 18:03 4140所谓调度时机就是:什么时候会发生进程调度。在linux中,进程 ... -
SSH远程启动服务的问题
2008-09-18 12:32 4723SSH是我们最长用的远程连接linux服务器的工具了,安全 ... -
时钟中断
2008-09-17 16:57 3377时钟中断:是指在计算 ... -
wait4的实现
2008-09-17 15:38 3026不贴实现的代码了,很 ...
相关推荐
`rb_node_t`是红黑树节点的数据结构,在Linux内核的内存管理中用于实现高效的查找和排序操作。例如,它可以用于维护空闲内存页的集合。 ##### 2.8 虚拟区间标志 虚拟区间标志是与`vm_area_struct`相关的属性,用于...
Linux 内存管理是操作系统核心的重要组成部分,它负责有效地分配、使用和回收系统内存资源。在Linux中,内存管理的设计非常复杂,以适应各种硬件架构和优化性能的需求。以下是Linux内存管理的一些关键知识点: 1. *...
### Linux内存管理分析 #### 一、内存分页管理机制原理 Linux操作系统采用了现代计算机体系结构中的内存分页管理机制,这一机制的核心在于将物理内存分割成固定大小的页面(通常为4KB),并将虚拟地址空间同样划分...
本文档提供了一个全面的Linux内存管理的知识体系,不仅适合Linux内核爱好者学习,也适用于系统管理员和开发者加深对Linux内存管理机制的理解。通过对存储器层次、UMA/NUMA架构、内存域划分、线性地址概念、页帧管理...
Linux虚拟内存管理是操作系统核心的重要组成部分,它负责为应用程序提供比物理内存更大的地址空间,并有效地管理物理内存资源。本资料“深入理解Linux虚拟内存管理”旨在帮助读者深入了解这一复杂的系统机制,包括...
4. **实验预备内容**:学习内存管理的基本概念,如内存分配算法、页表和快表的原理,以及虚拟地址空间的组织。此外,还需要熟悉编程语言,如Java或C,以便实现模拟系统。 实验指导中的源代码展示了如何用Java实现这...
### Linux学习心得——内存管理方法 #### 1. 概述 本文主要针对Linux操作系统中的内存管理技术进行探讨,特别是针对内核版本2.6.32的TI Linux-Davinci-Staging。本文将从以下几个方面展开讨论: - **Linux内核...
在Linux操作系统中,内存管理是其核心功能之一,它对系统的稳定性和性能有着至关重要的影响。Linux内存管理系统设计得相当复杂且高效,旨在优化资源分配并确保系统的稳定性。本资料包聚焦于Linux下的内存管理,提供...
嵌入式Linux系统在各种设备和应用中广泛使用,其内存管理和性能优化是开发者面临的重要问题。本资源《嵌入式Linux内存与性能详解》详细阐述了这些关键领域,为理解嵌入式系统的内在机制提供了深入见解。 1. **...
Linux内核中内存管理是一个高度复杂的系统,其设计目的旨在高效、合理地使用物理内存资源,并为运行在系统上的进程提供一个一致和虚拟的内存视图。Linux内核使用多种策略和技术来管理内存,包括物理内存的分配、虚拟...
《嵌入式Linux内存与性能详解》一书由史子旺撰写,专注于深入解析Linux内存管理机制以及如何在...通过学习,读者可以深入了解Linux内存管理的底层机制,掌握提高系统效率的关键技巧,为实际项目开发提供有力支持。
Linux内存管理是操作系统的核心组成部分,尤其对于服务器和嵌入式设备等依赖Linux系统的平台来说,高效、稳定的内存管理至关重要。本教程将深入讲解Linux内存管理的相关知识点。 首先,Linux对外提供的内存管理接口...
系统页面表是Linux内存管理中的重要数据结构,它记录了虚拟地址与物理地址的映射关系。Linux使用三级页表(在某些架构上可能是四级),以支持更大范围的虚拟地址空间。 总结起来,Linux内存管理是一个复杂且高效的...
Linux虚拟内存管理是操作系统核心的重要组成部分,它负责管理和优化系统中的内存资源,使得应用程序能够高效地使用物理内存和硬盘上的交换空间。在Linux系统中,虚拟内存并不是一个实际的硬件特性,而是一种软件策略...
在Linux操作系统中,内存管理是其...以上是Linux内存管理的一些基础知识点,通过阅读《深入理解Linux内存管理》的学习笔记,可以进一步了解这些概念的详细工作原理和优化策略,提升对Linux内存管理的理解和实战能力。
在Linux系统中,内存管理包括了多种机制和数据结构,如slub内存分配器、页(frame)管理、缓存(kmem_cache)等。以下是对这些关键知识点的详细说明: 1. 常见结构体 - `struct kmem_cache`: 这个结构体是Linux内核中...
本篇文章将深入探讨Linux内存管理的实现,主要围绕MMU(Memory Management Unit,内存管理单元)、内存分配策略以及内核中的关键数据结构。 MMU在Linux内存管理中扮演着至关重要的角色。它是一个硬件组件,负责地址...
在Linux系统中,内存管理尤其重要,因为它不仅要保证系统的稳定运行,还要尽可能地提高资源利用率。 1. **概述** Linux内存管理系统的主要目标是确保进程的高效运行,同时防止内存碎片和数据冲突。它包括了物理...
Linux虚拟存储技术是操作系统中的一项关键技术,主要涉及对物理内存的高效管理和虚拟内存的实现。本文将对Linux内核中...理解这些数据结构及其管理方式对于深入学习Linux内核和操作系统的存储管理部分是至关重要的。