
Linux内核内存的管理
国境之南Fantasy
Coder
展开
-
linux的物理内存与线性地址空间布局--2
Linux内存线性地址空间大小为4GB,分为2个部分:用户空间部分(通常是3G)和内核空间部分(通常是1G)。在此我们主要关注内核地址空间部分。 内核通过内核页全局目录来管理所有的物理内存,由于线形地址前3G空间为用户使用,内核页全局目录前768项(刚好3G)除0、1两项外全部为0,后256项(1G)用来管理所有的物理内存。内核页全局目录在编译时静态地定义为swapper_pg_dir数组转载 2011-12-09 15:03:42 · 841 阅读 · 0 评论 -
段页式虚拟存储器
段页式虚拟存储器是段式虚拟存储器和页式虚拟存储器的结合。 首先,实存被等分成页。在段页式虚拟存储器中,把程序按逻辑结构分段以后,再把每段按照实存的页大小分页,程序按页进行调入和调出操作,但它又可按段实现共享和保护。因此,它可以兼有页式和段式系统的优点。它的缺点是在地址映像过程中需要多次查表,虚拟地址转换成物理地址是通过一个段表和一组页表来进行定位的。段表中的每个表目对应一个段,每个表目转载 2012-10-12 13:00:26 · 7608 阅读 · 0 评论 -
伙伴系统的概述 (一)
伙伴系统的概述 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种则是用一种有效的方法来监视内存,保证在内核只要申请一小块内存的情况下,不会从大块的连续空转载 2012-10-23 14:12:42 · 813 阅读 · 0 评论 -
Linux用户空间与内核空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。于是像linux这样的系统就做了一个约定,不允许没有用户空间上下文的内核线程访问用户空间。不允许内核访问用户空间使内核免去了很多的负担,使内核设计更加简化转载 2014-07-01 18:28:36 · 1019 阅读 · 0 评论 -
Linux用户空间与内核空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。于是像linux这样的系统就做了一个约定,不允许没有用户空间上下文的内核线程访问用户空间。不允许内核访问用户空间使内核免去了很多的负担,使内核设计更加简化转载 2014-07-02 10:54:40 · 2846 阅读 · 1 评论 -
TLB
TLB的全称是Translation Lookaside Buffer,翻译成中文有时是后备转换缓存,可能还有其他叫法,总之这个东西是用来保存线性地址到物理地址转换用的。因为在MMU开启的情形下,线性地址到物理地址的转换需要经过页表的查找,如果每次都这么做的话显然对系统性能有影响,因此出现了这么一个cache,用来将已经此前的查找结果保存在这个TLB中。显然TLB因为容量的限制不可能将所有的线性地转载 2014-06-17 14:55:09 · 1052 阅读 · 0 评论 -
vmalloc分配高端物理内存
由vmalloc()分配的内存线性地址空间在VMALLOC_START之上,并且其分配的物理内存也是在896M之上的高端内存中的。/*** vmalloc - allocate virtually contiguous memory* @size: allocation size* Allocate enough pages to cover @转载 2014-06-17 14:58:28 · 2259 阅读 · 0 评论 -
TLB与cache的深入分析
一)TLB1)TLB的概述TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存.TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据.2)tlb的原理当cpu对数据进行读请求时,CPU根据虚拟地址(前20位)到TLB中查找.TLB中保存着虚拟地址(前20位)和页框号的对映关系,如果匹配到虚拟地址就转载 2014-06-17 14:56:30 · 12504 阅读 · 1 评论 -
Linux x86_64 的TLB管理
TLB介绍TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访存(查页表获得物理地址+取数据),下图是TLB在整个系统中的示意图。@yuanbor:Linux x86_64 的TLB管理 - yuanbor - SmallOfficeHomeOfficx86_64上的TLB普通模式Global Pages当CR3寄存器被转载 2014-06-17 14:56:49 · 2226 阅读 · 0 评论 -
MMU和TLB
MMU和TLB记得那家芯片公司给我电话面试的时候,别的都还好,可是他问我什么是MMU,我只能干瞪眼。今天在看《Linux内核源码(陈莉君)》的时候,无意中看到第二章内存地址这一节,学习如下:在任何一台计算机上,都存在一个程序能产生的内存地址的集合。当程序执行这样一条指令时:MOVE REG,ADDR它把地址为ADDR(假设为10000)的内存单元的内容复制到REG中,地址A转载 2015-12-14 11:04:50 · 1791 阅读 · 1 评论 -
硬件篇之MMU
MMU即内存管理单元(Memory Manage Unit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最大障碍之一。可以说,不懂MMU使很多人一直停滞在单片机与无OS的时代。博主之前对MMU也一直是雾里看花,似懂非懂。最近终于自认为云开雾散后,回头总结,感觉有几个概念是阻碍人们理解MMU的元凶。1)虚拟地址/物理地址 如果处理器没有MMU,C转载 2015-12-14 10:53:44 · 1788 阅读 · 0 评论 -
MMU的作用及工作过程
原文 http://blog.youkuaiyun.com/leishangwen/article/details/27088305 以下内容摘自《步步惊芯——软核处理器内部设计分析》一书的第10章 MMU剖析MMU 的作用及工作过程 MMU ( Memory Management Unit )是内存管理单元的简称,读者朋友在学习嵌入式的时候应该听说过 µC转载 2015-12-14 11:16:09 · 4381 阅读 · 0 评论 -
Linux 进程栈和线程栈的区别
:本文所涉及的环境为Linux, 下文讨论的栈跟内核栈,没有任何的关系,关于内核栈,请参考《深入Linux内核架构》中的2.4.1 进程复制这里有如下几个问题,线程栈的空间是开辟在那里的? 线程栈之间可以互访吗?为什么在使用pthread_attr_setstack函数时,需要设置栈的大小,而进程task_struct的 mm_struct *mm 成员中却并没有却并没有stack_siz转载 2016-07-07 13:42:26 · 786 阅读 · 0 评论 -
关于BSS段的大小
1.BSS段中的内容先明确 BSS 段“存放”的是未初始化的全局变量与局部静态变量,此处指的存放是指为其预留空间(占位符)。但BSS段在磁盘上不是真的占用变量大小的空间,它仅是在该段中记录了所有未初始化全局变量与局部静态变量的大小总和,至于每个变量的大小则存储在符号表的size属性中。即:BSS段内容:无内容,它将在段表中占一个段描述符,该段描述符的size属性将记录未初始化的全局转载 2016-11-08 18:43:26 · 2149 阅读 · 0 评论 -
关于文件读写--Linux的内存映射解决大文件读写
第一组:ifstream与CFile的效率From:http://www.cppblog.com/zhangyq/archive/2009/05/19/56034.htmlifstream是标准C++中的文件输入流,在实际应用中,用它的read方法,是必须缓冲的,效率很低。在一次测试中,用它将一个800k的文件一次读入字符串中,和MFC中的CFile类的read方法,效率竟然相转载 2012-08-27 17:50:42 · 2459 阅读 · 0 评论 -
linux地址转换
三、地址转换上图揭示了进程空间、内核空间与物理地址之间的转换关系。在linux中,物理地址用page结构 表示,物理内存在初始化时已经生成了page结构管理,其他地址空间则需要生成page再进行管理(ioremap)。物理地址可以被映射到内核空间或进程空间,也可以从内核空间或进程用户空间解除物理地址(page)。所有转换中,只有mmap可以在进程中使用,其他都是内核函数。即使使转载 2011-12-12 18:13:00 · 1110 阅读 · 0 评论 -
内存分配——深入浅出
一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存。这两个概念主要来自于linux内核的支持。Linux在内存管理上份为两级,一级是线性区,类似于00c73000-00c88000,对应于虚拟内存,它实际上不占用实际物理内存;一级是具体的物理页面,它对应我们机器上的物理内存。这里要提到一个很重要的概念,内存的延迟分配。Linux内核在用户申请内存的时候,只是给它分配转载 2011-12-09 15:23:38 · 679 阅读 · 0 评论 -
高端内存(续)--临时内存映射
一.为什么引入临时内存映射(temporary kernel mappings)在永久内存映射中我们看到,如果pkmap_page_table页表里面没有空的entry,那么就会导致这次映射被阻塞,所以我们说不能在一些原子的上下文情况下调用kmap()函数。而在临时内存映射中,不会去判断该pte是否已经被用掉了,它采用的是覆盖的策略,所以把总是能成功的建立映射。会不会被阻塞就是临时内存映射和永转载 2011-12-09 16:30:26 · 1552 阅读 · 0 评论 -
看块设备驱动部分的笔记
1. 对于块设备,首先明确几个基本的概念:扇区(Sectors): 通常是512 bytes. 是硬件设备传输数据的基本单位.块(Blocks): 通常是1, 2, 4, 8, .... 个扇区,并且小于一个page. 是内核(VFS和文件系统)传送数据的基本单位.段(Segments): 是若干相邻的块. 是一个内存页或者内存页的一部分. 一般由块设备驱转载 2011-12-09 18:33:40 · 893 阅读 · 0 评论 -
高端内存
注:本文提及的物理地址空间可以理解为就是物理内存,但是在某些情况下,把他们理解为物理内存是不对的。本文讨论的环境是NON-PAE的i386平台,内核版本2.6.31-14一. 什么是高端内存linux中内核使用3G-4G的线性地址空间,也就是说总共只有1G的地址空间可以用来映射物理地址空间。但是,如果内存大于1G的情况下呢?是不是超过1G的内存就无法使用了呢?为此内核引入了一个高端内存转载 2011-12-09 16:23:36 · 1194 阅读 · 0 评论 -
高端内存——永久映射区(permanet kernel mappings)
闲着无聊,把一些东西写下来给大家分享下吧,有什么不对的,欢迎质疑注:本文提及的物理地址空间可以理解为就是物理内存,但是在某些情况下,把他们理解为物理内存是不对的。本文讨论的环境是NON-PAE的i386平台,内核版本2.6.31-14一. 什么是高端内存linux中内核使用3G-4G的线性地址空间,也就是说总共只有1G的地址空间可以用来映射物理地址空间。但是,如果内存大于1G的转载 2011-12-09 16:16:47 · 2151 阅读 · 0 评论 -
page_address()函数分析--如何通过page取得虚拟地址
由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的。一. x86上关于page_address()函数的定义在include/linux/mm.h里面,有对page_address()函数的三种宏定义,主要依赖于不同的平台:首先来看看几个宏的定义:CONFIG_HIGHMEM:顾名思义,就是是否支持高端内存,可以转载 2011-12-09 16:34:30 · 2637 阅读 · 0 评论 -
linux的物理内存与线性地址空间布局--1
在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同。Linux运行在虚拟存储空间,并负责把系统中实际存在的远小于4GB的物理内存根据不同需求映射到整个4GB的虚拟存储空间中。n 物理存储空间布局Linux的物理存储空间布局与处理器相关,详细情况可以从转载 2011-12-09 14:40:42 · 779 阅读 · 0 评论 -
Linux内存管理(下)
物理内存管理(页管理)Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数4k(在i386体系结构中)大小页,从而分配和回收内存的基本单位便是内存页了。利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[1],系统可以东一页、西一页的凑出所需要的内存供进程使用。虽然如此,但是实际上系统使用内存还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更转载 2011-12-08 15:25:03 · 599 阅读 · 0 评论 -
图解 Linux 内存管理 -- 线性空间与物理内存
上图反映了如下信息:1、进程的4G 线性空间被划分成三个部分:进程空间(0-3G)、内核直接映射空间(3G – high_memory)、内核动态映射空间(VMALLOC_START - VMALLOC_END)2、三个空间使用同一张页目录表,通过 CR3 可找到此页目录表。但不同的空间在页目录表中页对应不同的项,因此互相不冲突3、内核初始化以后,根据实际物理内存的大小,计算出 hig转载 2011-12-08 11:36:55 · 816 阅读 · 0 评论 -
Linux内存:内存管理的实质
1. 内核初始化: * 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系; * 内核建立一个page数组,page数组和物理页面系列完全是线性对应,page用来管理该物理页面状态,每个物理页面的虚地址保存在page->virtual中; * 内核建转载 2011-12-08 12:06:40 · 540 阅读 · 0 评论 -
Linux内存管理之kmalloc 与 __get_free_page()
在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页。释放内存用的是kfree,或free_pages. 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。 进程的4GB内存空间被人为的分为两个部分--用户空转载 2011-12-12 18:16:17 · 886 阅读 · 0 评论 -
Linux内存管理(上)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存地使用方法。力求从外自内、水到渠成地引导网友分析Linux地内存管理与使用。在本章最后我们给出一个内存映射地实例,帮助网友们理解内核内存管理与用户内存管理之间地关系,希望大家最终能驾驭Linux内存管理。 前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无转载 2011-12-08 15:26:30 · 693 阅读 · 0 评论 -
Linux地址映射(1)--线性映射与非线性映射
一,线性映射与非线性映射1. 内存管理物理内存管理:Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构,操作物理内存时实际上就是操作page页。某些设备会映射在物理内存地址外,这些地址会在使用时建立page结构。 进程内存管理:Linux进程通过vma进行管理,每个进程都有一个task_s转载 2011-12-12 17:25:13 · 831 阅读 · 0 评论 -
alignment fault
什么是对齐异常?简单来说,当CPU访问内存地址时,如果发现访问的地址是不对齐的,硬件(部分)就会自动触发对齐异常。对齐即要求被访问的地址满足其数据类型的位宽要求,比如要访问一个4字节int型的数据,但是提供的地址不是4字节对齐的,那就是不对齐了。也就是说要访问的数据的位宽长度是多少,那么访问的地址就必须是按这个位宽长度对齐的。如果是char类型的,那就没有没有对齐要求了。为什么在部转载 2016-12-14 21:32:35 · 6021 阅读 · 0 评论