自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(221)
  • 资源 (3)
  • 收藏
  • 关注

原创 进程地址空间 - 辅助函数分析

TBD

2013-07-17 15:51:42 1295

原创 进程地址空间 - 数据结构

TBD

2013-07-17 13:49:47 2318

原创 Linux 进程地址空间 - 简介

TBD

2013-07-17 13:49:30 2244

原创 内核映射 - 持久内核映射

持久内核映射 permanent kernel mappings内核提供了其他函数用于把Highmem内存映射到内核地址空间:持久内核映射和临时内核映射。而这些函数和vmalloc无关。因此网络上对持久内核映射和临时内核映射的理解非常的混乱持久内核映射允许内核建立高端物理内存帧到内核地址空间的长期映射。和其他kernel地址空间一样,持久内核映射使用kernel一个pte页表来

2013-07-14 17:32:21 2900 2

原创 内核分配不连续页 - vmalloc

当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需

2013-07-14 11:42:09 8960

原创 伙伴系统分配器 - __free_pages

内核中所有涉及到页面释放的函数最终都会调用到__free_pages

2013-07-13 16:08:24 2878 1

原创 linux 内存管理中的PG_Compound和GFP_COMP

当__alloc_pages分配的gfp_flags制定了__GFP_COMP,那么内核必须将这些页组合成复合页compound page。第一个页称为head page,其余所有的页称为tail page。复合页的尺寸要远大于当前分页系统支持的页面大小。并且一定是2^order * PAGE_SIZE大小。复合页主要用在HugeTLB相关的代码。复合页的引入是因为随着计算机物理内存容量不断增

2013-07-13 11:38:14 4334

原创 伙伴系统分配器 - buffered_rmqueue

在__alloc_pages过程中,操作分为两个部分,第一部分是找到适当的内存域,接下来的一部分就是按照伙伴系统的分配方式,从free_lists中移除这些页。buffered_rmqueue就是用来完成第二部分工作的。1. 首先判断要分配的页面数是否为 1,如果为1 的情况下,那么并不需要从buddy系统获取,因为per-CPU的页缓存提供了更快的分配和释放机制。per-CPU cach

2013-07-12 10:33:21 3394

翻译 内存管理中的cold page和hot page, 冷页 vs 热页

所谓冷热是针对处理器cache来说的,冷就是页不大可能在cache中,热就是有很大几率在cache中。网上还有一种说法:冷页就是冷的页,热页就是热点的页,解释的真好 :)cold page和hot page的概念可以参考LWN的一片文章http://lwn.net/Articles/14768/2.5.45内核,Martin Bligh和Andrew Morton以及其他人提交

2013-07-12 09:46:03 5081 1

原创 伙伴系统分配器 - PF_MEMALLOC 标志位

这是一个进程标记位,除了在内存管理子系统中使用外,还在其他的内核子系统中使用。之所以在伙伴系统分配器中讨论,是因为这个标记和内存管理密不可分。当一个进程被设置PF_MEMALLOC后,那么对进程会有如下影响:1. 当进程进行页面分配时,可以忽略内存管理的水印进行分配,这是告诉内存管理系统,给我一点紧急内存使用,我将会释放更多的内存给你。2. 如果忽略水印分配仍然失败,那么直接返回ENO

2013-07-11 20:15:51 6754 2

原创 伙伴系统分配器 - __alloc_pages

kernel可以通过几个分配函数从伙伴系统分配页面:alloc_pagesget_zeroed_pageget_dma_pages这几个函数都是通过alloc_pages来实现页面分配的,而alloc_pages的核心实现就是__alloc_pages。alloc_pages在gfp.h中定义#define alloc_pages(gfp_mask, ord

2013-07-10 10:14:10 6806

原创 伙伴系统分配器 分配掩码

kernel伙伴系统分配的函数,只能分配2的整数幂个页,更细力度的分配只能借助与slab或者slub分配器常见的分配函数是:alloc_pages(mask, order) 分配2的order幂次个页面,如果成功返回第一个页框对应的page结构,失败则返回NULLget_zeroed_page(mask)分配一个页面,成功则返回这个页框对应的page结构,失败返回NUL

2013-07-09 19:06:38 1981

原创 线程栈和进程栈 区别

要搞清线程栈和进程栈的区别,首先要弄清线程和进程之间的关系。线程和进程有很多类似的地方,人们习惯上把线程称为轻量级进程,这个所谓的轻量级是指线程并不拥有自己的系统资源,线程依附于创建自己的进程。我们可以从三个方面来理解线程的轻量级1. 调度由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免了昂贵的进程切换。当然不

2013-07-09 10:07:55 15369 3

翻译 避免物理内存碎片化 - 内存紧缩

原文地址 http://lwn.net/Articles/368869/长期存在的内存碎片问题,已经有多篇文章提及了。简单的说:当系统运行一段时间后,空闲页面趋向于散落在不连续的空间,很难再有足够长的连续物理内存页面分配。内核开发者已经下了很多工夫,减少大块连续物理内存的分配,因此大部分内核功能并不会受到页面碎片化的影响。但是仍然存在对大块连续物理内存的需要,在内存碎片化系统上的内存分

2013-07-03 19:10:57 5853

原创 mlock对page MOVABLE和RECLAIMABLE特性的影响

系统调用mlock允许应用进程锁住某一个地址空间,这将阻止Linux内存回收进程回收这个地址空间的页面。mlock仅仅在kernel层对给定地址范围所在的VMA增加 VM_LOCKED标记,当linux kernel进行内存回收时,会首先判断VMA是否有VM_LOCKED标记,如果存在,那么不会对这个地址范围内的页面进行回收锁定后,这个地址范围内的物理页面,就从RECLAIMABL

2013-07-03 10:33:18 1467

原创 避免物理内存碎片化

以前的项目碰到了buddy内存分配失败的情况,最近面试的两家公司也提到了这个问题。物理内存碎片化,是指系统空闲物理内存被使用过的物理内存分割开,导致buddy系统无法满足page分配申请,尤其是申请的连续空间较大的情况下。一般情况下,出错信息如下:[ 3308.564000] lowmem_reserve[]: 0 0 0[ 3308.564000] Normal: 7

2013-07-01 13:55:26 14909 3

原创 内核线程和普通进程的区别

内核线程的主要作用1. 周期性的将dirty内存页同步到磁盘设备上。 比如 bpflush线程周期性的把dirty数据写回磁盘2. 内存页很少的情况下,把内存page 交换到磁盘空间。 比如kswapd,系统会为每一个NUMA创建一个kswapd进程,但是在非NUMA系统上,则仅有一个kswapd3. 管理延时动作4. 实现文件系统的事物日志有两种类型的线程:

2013-07-01 11:03:03 4482

原创 ARM指令STMFD和LDMFD

STMFDST - storeM - MultipleF - FULLD - DescendingLDMFDLD - LoadM - MultipleF - FULLD - Descending栈指针通常可以指向不同的位置。栈指针指向栈顶元素(即最后一个入栈的数据元素)时称为FULL栈;栈指针指向与栈顶元素相邻的一个可用书局单元时称为EMPT

2013-06-27 23:44:48 26910 1

原创 Android Binder 驱动分析 - 数据结构

binder_procsstatic HLIST_HEAD(binder_procs);系统所有的binder_proc都在这个双向链表上。在binder_open中每一个新创建的binder_proc都通过binder_proc->proc_node链接到这个双向链表;在binder_deferred_release函数释放binder_proc前,从binder_procs

2013-06-03 08:35:51 3589 1

翻译 Android binder简介

原文地址https://www.nds.rub.de/media/attachments/files/2011/10/main.pdf4 Binder本章介绍什么是Binder以及Binder的能力。本章是从抽象的角度介绍Binder,并没有涉及到实现细节,在下一章我们会讲解实现细节。4.1 出身Binder最初是Be Inc公司开发的OpenBinder,后来Pa

2013-06-01 11:11:47 6572

转载 Android binder系统架构

1. binder驱动是客户端和服务器端交换请求和处理结果的中介,客户端先获得服务器端的代理对象,通过调用代理对象的方式向服务器端发送请求。代理对象将用户的请求通过Binder驱动发送到服务器端服务器进程处理用户请求,通过BInder驱动返回处理结果给客户端的服务器代理对象。2. Binder Adapter 是对Binder驱动的封装,主要用于操作Binder驱动,实现包

2013-05-31 10:13:12 1866

翻译 存储器层次结构 - cache基本原理

局部性原理局部性原理表明了在任何时间内,程序访问的只是地址空间相对较小的一部分内容。以下是两种类型的局部性:时间局部性如果某个数据被访问,那么在不久的将来它可能再一次的被访问。例如大多数程序都包好了循环结构,因此这部分指令和数据将被重复的访问,呈现出了很高的时间局部性。空间局部性如果某个数据项被访问,与他地址相邻的数据项可能很快被访问。由于程序通常是顺序执行的,因此程序也呈现了

2013-05-27 15:43:48 4130

转载 内存屏障

写的不错,转来看看。http://www.spongeliu.com/233.html当你看到“内存屏障”四个字的时候,你的第一反应是什么?寄存器里取出了错误的值?ifence,sfence之类的指令?还是诸如volatile之类的关键字?好吧,我第一次看到这四个字的时候,脑子里浮现出的是魔兽争霸里绿油油的铺满苔藓的岩石屏障- -#,并且,当我搞明白内存屏障具体是什么,而且自认

2013-05-17 09:52:37 980

原创 dump 函数调用trace

dump函数调用trace:可以获取函数的调用关系图,某些时候对于跟踪bug,理解程序结构有特别重要的意义。内核函数调用trace内核提供了dump_stack()函数,利用该函数,可以打印出当前函数的调用路径。dump_stack是一个架构相关的函数,对于arm平台,该函数的实现位置是arch/arm/kernel/traps.c应用层函数调用trace

2013-05-03 14:34:08 2746

原创 uboot 内核传参

uboot在启动内核时,会向内核传递一些参数。据说bootloader有两种方式向内核传递参数,另外一种我不了解,本文仅介绍arm架构下tag结构的传参方式。uboot在启动内核时,会传递一些参数,包括:RAM位置和尺寸,命令行参数,initrd起始位置和尺寸,framebuffer物理地址和尺寸,开发板版本等。uboot把每一个参数打包到一个tag结构中(tag结构参见表1),tag列表

2013-04-25 10:42:51 2006

原创 lowmem_reserve的理解

2.6内核的zone结构中一个成员变量 lowmem_reservestruct zone { /* Fields commonly accessed by the page allocator */ /* zone watermarks, access with *_wmark_pages(zone) macros */ unsigned long watermar

2013-04-22 18:23:14 9861

原创 函数foorprint足迹和高速缓存

内核函数对硬件高速缓存的影响就是所谓的函数足迹(foorprint),定义为函数执行后重写高速缓存的百分比。执行大的函数或者调用层次比较多的函数,都会导致硬件高速缓存icache被更新的百分比更高,这就导致其后的代码有很大的几率不在高速缓存中,因为硬件高速缓存中都是大足迹函数代码。

2013-04-09 17:44:45 1178

原创 Linux mmap内存映射

Linux系统调用mmap和mmap2,创建一个进程地址空间的映射,mmap/mmap2几个常用的场景:1. 文件映射普通文件I/O操作,读写mmap映射后的内存,即可完成文件的读写操作,kernel和userspace操作同一块物理内存;而常规的文件读写,需要循环调用read write lseek接口,每一次读写都需要kernel到userspace,或者userspace到kernel的

2013-04-03 14:10:16 4295

原创 Linux kernel和TLB

TLB - translation lookaside buffer快表,直译为旁路快表缓冲,也可以理解为页表缓冲,地址变换高速缓存。由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据。提高访存性能的关键在于依靠页表的访问局部性。当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到,。TLB是一种高速缓存,内存管理硬件使用它来改善

2013-03-29 16:59:21 5716

原创 Linux Fixmap 的作用

Fixmaps是内核(虚拟)地址空间地址固定的映射到物理内存,同DMA/Normal zone物理内存的直接地址映射有点类似。但是4GB开始部分的直接地址映射是线性的,也就是说物理地址和线性映射地址间存在着计算公式paddr = vaddr - PAGE_OFFSET;而固定地址映射则可以映射任意的物理地址,包括DMA Normal Highmem。Fixmaps的存在意义每个

2013-03-28 07:25:46 4675

翻译 避免物理内存碎片化 - ZONE_MOVABLE

在2.6.20-rc4中,mel Gorman提交了的patch引入了ZONE_MOVABLE,引入这个pseudo zone的目的是为了防止zone内存碎片化ZONE_MOVABLE表示这个zone仅能被带有__GFP_HIGHMEM和__GFP_MOVABLE标志的分配使用。这就使得所有non-movable页面都限制在单一的内存区,而movable的分配则由其他的内存区满足。Mo

2013-03-26 17:16:57 3633

原创 framebuffer xres和xres_virtual区别

xres yres是可视区间大小,对应着LCD的显示尺寸。xres_virtual yres_virtual定义了framebuffer内存中一帧的尺寸。xres_virtual yres_virtual必定大于或者等于xres yres,可以通过pan操作来显示xres_virtual和yres_virtual定义的显示区域。

2013-03-20 17:04:06 4557 1

原创 ARM linux 建立页表过程

paging_init 用来建立页表,初始化zone的memory map void *zero_page; sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); build_mem_type_table(); sanity_check_memi

2013-03-05 18:13:37 7811

原创 ARM处理器 的linux分页机制

ARM MMU只支持两级页表地址转换,也就是采用三级分页映射,能够满足32bitCPU的存储管理需求ARM支持的页大小有几种 - 1M, 64K, 4K, 1K。在linux kernel中,ARM采用了4K大小的页,4K大小的页决定了虚拟地址的低12bit留作偏移地址。从上图可以看出,页全局目录索引有效位数是12bit,二级索引有效位数是8bit,页内偏移量为12bit。

2013-02-28 17:42:09 7458

原创 Android pmem分析

最近在优化mx51项目中内存的使用,512MB RAM的划分为:64MB pmem_adsp64MB pmem gpu96MB DMA zone96MB GPU memory这样只剩下192M给kernel 的Normal zone,由于普通的alloc_pages无法使用DMA zone的空间,内存相当紧张,想从pmem中释放一些内存出来,因此花了点时间了解pmem.

2013-02-26 10:13:24 4756 1

原创 SDRM/DDR 寻址

DDR内部组成DDR内部是由多个存储阵列组成的,我们称这些存储阵列为bank,早期的SDRAM内部分割成两个bank,后来是4个,这是SDRAM规范中规定的最大bank数,在DDR2标准中,BANK的数目提高到8个。每一个存储阵列就像表格一样,表格的每一个单元格是最小存储单元,大小可以为4, 8, 16,也就是位宽,位宽决定了数据线位数。如果想使用32bit的数据总线宽度,那么可以使用

2013-02-23 14:43:06 5672 1

原创 Linux Highmem的使用

Linux kernel zone有如下类型:ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM。每一种zone类型适合不同的使用类型:ZONE_DMA是低端物理内存范围适合于ISA设备的请求,ZONE_DMA的物理页框映射到kernel线性地址空间。ZONE_NORMAL则被直接映射到kernel线性地址空间,常见的内核操作都发生在ZONE_NORMAL。ZON

2013-02-20 17:19:14 6915 1

原创 linux kernel lpj参数

CELF- CE Linux Forum 在kernel提交了一个“Preset LPJ”的patch,这个patch可以通过预设LPJ来减少linux kernel启动过程中校正loops_per_jiffy所需花费的时间。What is loops_per_jiffy?按字面的意思就是每jiffy的循环次数,jiffy是kernel 的一次节拍时间(HZ=100,则表示10ms),

2013-01-17 17:48:03 4987

原创 linux 终端设备 - 线路规程

line discipline(LDISC) 线路规程,是linux和类unix系统终端子系统的一个软件驱动层。终端子系统从上到下可划分为三层:顶层tty core驱动层提供字符设备接口(因为所有的终端设备都是字符设备);最底层是tty driver层用来和硬件进行通讯,实现tty_operations供tty core和 LDISC层调用;中间层line discipline实现终端输入

2013-01-17 11:01:22 6271

原创 linux uart终端 - 调用关系

内核函数调用关系可以通过dump_stack()函数分析出来uart设备是tty设备的一种,主从设备号的分配依赖于平台实现,在我的mx51板上,主设备号是217,从设备号范围为16-23终端驱动设备号分配信息可以通过proc文件系统查看:cat /proc/tty/driveruart serial是tty设备的一种,而tty设备又是char 设备。因此,tty驱动

2013-01-17 10:23:03 6799

Google GFS 文件系统(英)

Google GFS开发者写的论文,描述了GFS设计理论

2012-11-09

A COMPACT GUIDE TO LEX & YACC

This document explains how to construct a compiler using lex and yacc.

2010-10-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除