欢迎来到天天文库
浏览记录
ID:49503660
大小:75.00 KB
页数:18页
时间:2020-03-02
《内存管理基础.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、系统对进程的虚拟内存管理:mm{},vm_area_struet{}系统对物理内存管理:page{}每个进程都可用4G的虚拟地址空间0~4G,每个进程的页表不同(pagetable:内存映射。Memorymapping)几种内存地址:物理地址(PA),虚拟地址:内核空间:3~4G共1G,内核虚拟地址(其中包括896M的内核逻辑地址)又划分为两部分:实际的物理地址直接映射到内核空间,当实际物理内存>896M时,此时要做映射,通过建立页表,只有前896M存在这种映射关系当实际物理内存<896M时,PA全部映射到内核空间,此时内核VA-3G=对应的物
2、理PA,反之亦然。此部分地址称为内核逻辑地址区域kernellogicaladdress用户空间:0~3G,页表映射高端内存:>896M的内存空间以上4G虚拟地址空间分配见本子Figure-lo重点kernellogicaladdress见课件涉及到的内核结构体:task-struct{mm_struet*mm;}mm_struct*mm{pgd_tpgd;}vm_area_struet*mmap{}/*emphasisLinux内核中对应进程内存区域的数据结构,一个进程有多个内存区域,所以有多个vma*/cat/proc//map内
3、存映射的两层含义:1.把VA映射到对应的PA上(对VA的操作即对PA的操作)2.把一个文件的地址空间(文件打开后有缓存,即文件打开后存在于内存上,占用一定内存空间)映射到进程,让进程可以通过访问内存从而访问文件。内存映射的基本单位都是VMA,如structfile_operations{int(*mmap)(struetf订e*,structvm__area_struct*);Linux内存管理中,4G的进程地址空间,0-3G为用户空间,3-4G为内核空间,内核空间中小于896M的虚拟内存可以通过offset容易的映射到物理内存,大于896M的
4、部分通过页表映射到物理内存,假如只有800M内存,会被内核空间完全映射,那用户空间的虚拟地址映射到物理内存哪里?是不是内核空间虽然能够完全映射到物理内存,但是为不会全部使用物理内存,所以当用户空间需要内存映射时,会从物理内存中空闲的部分进行映射?如果是这样,对于物理内存而言,同时存在着内核空间的映射和当前进程的用户空间的映射Problems:文件打开后被调入内存,称之为缓存下载一个新的内核叶框与页区别页的状态pagecache,buffercachefileinodechartr二malloc(O);把各个函数都用一下,把每个函数的返回值打印出
5、来,看在哪个空间内。8・1进程与内存8.1.1进程如何使用内存(进程的内存映像)毫无疑问所有进程(执行的程序)都必须占用一定数量的内存,它或是用來存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不-•而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。稍有编程知识的朋友都该能想到这几个数据段种包含有“程序代码段”、“程序数据段”、“程序堆栈段”等。不错,这几种数据段都在其屮,但除了以上几种数据段之外,进程还另外包含
6、两种数据段。下面我们来简单归纳一下进程对应的内存空间屮所包含的5种不同的数据区(由vmareastruct描述各个段)。代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行吋被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是只读不可写的。数据段:数据段用来存放可执行文件屮己初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。可读可写BSS段[2]:BSS段包含了程序中未初始化全局变量,在内存中bss段全部置零。堆(heap):堆是用于存放进程运行屮被动态分配的内存段,
7、它大小并不固定,可动态扩张或缩减。汁进程调用malloc等函数分配内存吋,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆小被剔除(堆被缩减)栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“仆”屮定义的变量(但不包括static声明的变量,static意味这在数据段屮存放变量)。除此以外在函数被调用吋,其参数也会被压入发起调用的进程栈屮,并且待到调用结束后,函数的返冋值也冋被存放冋栈屮。由于栈的先进先出特点,所以栈特别方便用來保存/恢复调用现场。从这个意义上将我们对以把堆栈看成一个临时数
8、据寄存、交换的内存区。堆栈实际是在一•个区域,看博客8.1.2进程内存空间Linux操作系统釆用虚拟内存管理技术,使得每个进程都有各互不干涉的进程地址
此文档下载收益归作者所有