
linux memory
michaelcao1980
这个作者很懒,什么都没留下…
展开
-
dma_alloc_writecombine和dma_alloc_coherent的区别
先理解cache的作用CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容;否则,就 称为“ 不命中”,CPU只好去内存中调用所需的子程序或指令了。CPU不但可以直接从Cache中读出内容,也可以直接往其中写入内容。由于Cache的存取速 率相当快,使得CPU的利用率大大提高,进而使整个系统的性能得以提升。转载 2013-10-25 10:25:26 · 6268 阅读 · 1 评论 -
kmap的实现分析与实验
kmap/unkmap系统调用是用来映射高端物理内存页到内核地址空间的api函数,他们分配的内核虚拟地址范围属于[PKMAP_BASE,PAGE_OFFSET]即[0xbfe00000,0xc0000000]范围,大小是2M的虚拟空间,为了映射该块虚拟地址,所使用的二级页表的大小刚好是一个物理page的总计是两个pte table(4KB)kmap的调用流程分析:arch/arm/转载 2015-01-30 16:47:04 · 1672 阅读 · 0 评论 -
Linux中的地址空间
有这么一系列的问题,是否在困扰着你:用户程序编译连接形成的地址空间在什么范围内?内核编译后地址空间在什么范围内?要对外设进行访问,I/O的地址空间又是什么样的?先回答第一个问题。Linux最常见的可执行文件格式为elf(Executable and Linkable Format)。在elf格式的可执行代码中,ld总是从0x8000000开始安排程序的“代码段”,对每个程序都是这样。至于程序执原创 2015-01-30 17:13:49 · 833 阅读 · 0 评论 -
linux arm mmu基础
ARM MMU页表框架先上一张arm mmu的页表结构的通用框图(以下的论述都由该图来逐渐展开):以上是arm的页表框图的典型结构:即是二级页表结构:其中第一级页表(L1)是由虚拟地址的高12bit(bits[31:20])组成,所以第一级页表有4096个item,每个item占4个字节,所以一级页表的大小为16KB,而在第一级页表中的每个entry的最低2bi转载 2015-01-30 16:39:47 · 918 阅读 · 0 评论 -
Linux内核地址空间分布和进程地址空间
内核地址空间分布直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。永久内存映射区:该区域可访转载 2015-01-30 16:56:17 · 1684 阅读 · 0 评论 -
ARM处理器 的linux分页机制
ARM MMU只支持两级页表地址转换,也就是采用三级分页映射,能够满足32bitCPU的存储管理需求ARM支持的页大小有几种 - 1M, 64K, 4K, 1K。在linux kernel中,ARM采用了4K大小的页,4K大小的页决定了虚拟地址的低12bit留作偏移地址。从上图可以看出,页全局目录索引有效位数是12bit,二级索引有效位数是8bit,页内偏移量为12转载 2014-05-07 15:39:19 · 1389 阅读 · 0 评论 -
ioremap返回的地址
ioremap和vmalloc一样,都会返回vmalloc区的虚拟地址,但是ioremap并不会分配任何物理内存,ioremap也需要建立新的页表来访问物理页面。ioremap获取的虚拟地址空间需要使用iounmap来释放。ioremap主要用来映射设备的物理内存到内核的虚拟地址空间,这样,内核就可以通过这些虚拟地址空间访问设备内存。使用ioremap需要注意几转载 2014-05-07 15:14:45 · 1904 阅读 · 0 评论 -
linux mmap 详解
一.前言mmap的具体实现以前在学习内核时学习过,但是对于其中的很多函数是一知半解的,有些只能根据其函数名来猜测其具体的功能,在本文中,一起来重新深入理解其具体的实现。二.mmap的用户层应用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 具体参数含义start :转载 2014-03-04 11:16:36 · 1240 阅读 · 0 评论 -
linux高端内存映射
1 内核空间和用户空间 用户空间:在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,通过每个进程自己的页目录、页表,用户进程可以直接访问。内核空间:从3GB到4GB的虚存地址为内核态空间,存放供内核访问的代码和数据,用户态进程不能访问,只有内核态进程才能寻址。所有进程从3GB到4GB的虚拟空间都是一样的,linux以此方式让内核态转载 2014-03-03 16:23:08 · 5184 阅读 · 0 评论 -
kmalloc/kfree,vmalloc/vfree函数用法和区别
1.kmalloc1>kmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零.tiger说明:在用kmalloc申请函数后,要对起清零用memset()函数对申请的内存进行清零。> 2>kamlloc函数原型:#includeVoid *kmalloc(size_t size, int flags);(1)第一个参数是要转载 2014-02-20 11:12:39 · 861 阅读 · 0 评论 -
Linux内核中内存相关的操作函数
1.原理说明 Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示。四级页表分别为: * 页全局目录(Page Global Directory) * 页上级目录(Page Upper Directory) * 页中间目录(Page Middle Direct转载 2014-02-28 17:09:33 · 2808 阅读 · 0 评论 -
DMA和cache一致性问题
CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存 读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的 一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用原创 2014-02-14 10:30:21 · 21258 阅读 · 6 评论 -
kmalloc、vmalloc、kmap、malloc的区别
简单的说:kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(猜测的,不一定正确)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大内存只有在要被DMA访问的时候才需要物理上连续vmalloc比kmalloc要慢转载 2013-10-28 14:39:12 · 4988 阅读 · 0 评论 -
内存管理-高端内存
进程可以寻址4G,其中0~3G为用户态,3G~4G为内核态。如果内存不超过1G那么最后这1G线性空间足够映射物理内存了,如果物理内存大于1G,为了使内核空间的1G线性地址可以访问到大于1G的物理内存,把物理内存分为两部分,0~896MB的进行直接内存映射,也就是说存在一个线性关系:virtual address = physical address + PAGE_OFFSET,这里的PAGE_原创 2013-10-25 15:25:18 · 3502 阅读 · 0 评论 -
linux kernel内存映射实例分析
引子现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex A9 + 1GB DDR似乎已经跟不上主流配置了。虽说硬件是王道,可我们还是不禁还怀疑这么强大的硬件配置得到充分利用了吗?因此以后我都会正对ARM平台分析kernel的内容。 正文在linux内存管理中,有两个资源非常重要,一个是虚拟地址,一个是物理地址。听起来似乎是废话,实际上内存管理主要转载 2013-10-25 15:28:20 · 6341 阅读 · 0 评论 -
字节对齐
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问转载 2016-10-18 08:49:46 · 366 阅读 · 0 评论