spi nor flash使用汇总 OverviewSPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash,3-wire spi, 4-wire spi, 6-wire spi. 在clock一定的情况下, 理论上线数越多速度越快NOR flash和Nand flash相比 NOR缺点: 价格贵, 容量小, 擦除块大, 擦除速度慢, N
uboot sf 命令用法 uboot中如果支持spi/qspi flash, 那么可以使用sf的erase, read, write命令操作spi flashsf read用来读取flash数据到内存sf write写内存数据到flashsf erase 擦除指定位置,指定长度的flash内容, 擦除后内容全1具体用法sf probe [[bus:]cs] [hz] [mode] - i
内存分配器memblock 背景在Linux内核开发过程中, 多少都会存在一个patch, 引入了远超预期的麻烦. 内核2.6.34开发过程中, 这个奖项非CONFIG_NO_BOOTMEM莫属bootmem本身是个简单的,低级的内存分配器. 在引导程序的初期用来分配内存. 有人可能会想, 没有必要再增加一个内存分配器, 但是由于内存管理代码在被调用前需要很多内核功能都准备好, 要想在启动初期使用内存管理代码会大
linux kernel内存管理数据结构 mem_map 是一个全局变量, 指向一个struct page数组, 管理着系统中的所有物理页面, 数组中的每个page结构,对应一个物理页框.mem_map仅当系统为单NODE时有效NODE_DATA(0)->node_mem_map系统中的每个内存node的node_mem_map都指向一个struct page数组, 用来描述这个node所有zone的物理内存页
dts中memreserve和reserved-memory的区别 Devicetree 提供了两种方式保留内存:, reserved-memory示例如下:memreserve示例/memreserve/ 0x40000000 0x01000000reserved-memory示例 reserved-memory { #address-cells = ; #size-cells = ;
printk 输出函数调用栈的方法 有时在linux kernel过程中, 想知道当前函数的调用者是谁, 一直没查到内这个功能, 今天终于发现了这个好东西void * __init memblock_virt_alloc_try_nid_nopanic( phys_addr_t size, phys_addr_t align, phys_addr_t min_a
linux file命令查看elf文件信息 使用file命令查看动态链接库, 得到如下结果:#/usr/libx32$ file ../lib32/libgomp.so.1.0.0../lib32/libgomp.so.1.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=57e
FIQ和IRQ区别 FIQ和IRQ区别 FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。如果该中断设置为了I
Linux EMMC子系统分析-初始化流程 最近在解EMMC的一个bug,发现Linux EMMC有点小复杂,先整理个文档出来吧用的是TI 平台,仅分析MMC,不分析SD和SDIO1初始化1.1mmc_init2769 static int __init mmc_init(void)2770 {2774 2775 workqueue = alloc_ordered_workqueue("kmmcd",
Out of memory, OOM killer输出信息分析 当out of memory发生时,out_of_memory函数会选择一个内核认为犯有分配过多内存 “罪行”的进程,并杀死该进程。这就有很大的几率腾出较多的空闲页,然后再跳转回重试内存分配的操作。这里我们不讨论out_of_memory的:1. 函数流程2. 选择要牺牲进程的策略方法。我们仅讨论out of memory发生时,内核输出信息的含义。以下是一段典型的ou
pdflush 几个参数的含义 参考3.4内核文档pdflush是Linux 内核的数据同步机制,系统通常会有多个pdflush内核线程存在,当前没有研究内核线程的数目是由什么决定的。系统内脏页积累到一定程度,或者系统需要释放脏页占用的内存时,需要把脏页中的数据写回磁盘,这个写回机制由内核线程pdflush实现。pdflush受多个控制参数控制,分别是:dirty_background_bytesdi
APK签名原理 网上已有多篇分析签名的类似文章,但是都有一个共同的问题,就是概念混乱,混乱的一塌糊涂。在了解APK签名原理之前,首先澄清几个概念:消息摘要 -Message Digest简称摘要,请看英文翻译,是摘要,不是签名,网上几乎所有android签名分析的文章都对这两个概念乱用摘要的链接http://en.wikipedia.org/wiki/Message_digest简
移植ubuntu core到Arm开发板 最初是想把整个ubuntu移植到MX51开发板,项目不需要运行桌面系统,所以只移植了一个基本的ubuntu core系统 1. 下载ubuntu core rootfs,关于ubuntu core参考https://wiki.ubuntu.com/Corehttp://cdimage.ubuntu.com/ubuntu-core/releases/12.04/release/ubunt
移植apache2 ARM版 - 交叉编译apache2 下载apache2 http://apache.fayea.com/apache-mirror//httpd/httpd-2.4.6.tar.bz21. tar jxvf httpd-2.4.6.tar.bz22. cd httpd-2.4.63. ./configure --host=arm-linux --prefix=/usr/local/arm/4.4.3 --with-a
移植apache2 ARM版 - 交叉编译apr-util 下在apr-util-1.5.2 http://apache.fayea.com/apache-mirror//apr/apr-util-1.5.2.tar.gz1. tar zxvf apr-util-1.5.2.tar.gz2. cd apr-util-1.5.23. ./configure --host=arm-linux --prefix=/usr/local/arm/4.
移植apache2 ARM版 - 交叉编译apr-1.4.8 1. 下载apr-1.4.8, http://mirrors.hust.edu.cn/apache//apr/apr-1.4.8.tar.gz2. tar zxvf apr-1.4.8.tar.gz3. cd apr-1.4.84. ./configure --host=arm-linux --prefix=$PREFIX --enable-static5. export PREF
移植apache2 ARM版 - 交叉编译pcre-8.33 1. 下载pcre-0.83, http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz2. tar zxvf pcre-8.33.tar.gz3. cd pcre-8.33我的交叉编译工具链位置在/work/icar2/prebuilt/linux-x86/toolchain/arm-eabi-
lowmemorykiller的几点思考 lowmemkiller的实现机制调用lowmemkiller的时机如何设置应用程序的oom_adjlowmemkiller的现存问题在lowmemkiller.c源代码有如下注释: * The driver considers memory used for caches to be free, but if a large *
CD-ROM Red book, Yellow Book, White Book, Green Book Red book红皮书标准是专门定义数字audio CDs。所有的audio CDs使用这个标准,以确保任意的audio CD-ROM能够被任意的audio CD-player播放。红皮书是由Phillips和Sony开发的。红皮书定义了CD的物理参数和属性,激光笔的参数,背离和出错率,调制系统(Eight-to-fourteen modulation, EFM)以及纠错设施,和八个子码通
MingW编译virt-viewer 在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer,virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi是使用MingW编译出来的,源码就是使用virt-viewer-0.5.7.tar.gz如果需要定制自己的virt viewer,就需要从源码编译出可执行的二
virt viewer Usbredir USB重定向 编译virt viewer之前执行的configure命令,是没有使能usb-redir相关的功能,virt viewer是否支持usbredir是完全依赖于spice-gtk的。virt viewer对spice-gtk的依赖关系,可以从virt viewer的configure结果看出来configure: Configuration summaryconfigure: ====
GTK - 隐藏Titlebar 需求:碰到客户非要把GTK标准的titlebar换成自己的贴图栏,因此需要在显示窗口时把title去掉。在缺省情况下,窗口是带有一个 title bar的,用来进行缩放控制,最大化,最小化,关闭等等,有些window managers允许GTK+ disable掉边框和titlebar。应用程序可以调用gtk_window_set_decroated进行设置,GTK+将尽力和window ma
红帽Spice 入门 IntroductionSPICE(独立计算环境的简单协议)- Simple Protocol for independent Computing EnvironmentSpice 是一个开放的远程计算解决方案,使得客户端可以访问远程机器桌面和设备(比如键盘,鼠标,audio和USB)。通过Spice我们可以像使用本地计算机一样访问远程机器,这样可以把CPU GPU密集工作从客户端移交
linux进程调度 - 周期性调度器 周期性调度器是在scheduler_tick中实现。如果系统正在活动中,内核会按照频率HZ自动调用该函数。如果没有进程在等待调度,那么在计算机电力供应不足的情况下,也可以关闭该调度器以减少电能消耗。3469 /*3470 * This function gets called by the timer code, with HZ frequency.3471 * We call i
linux进程调度 - 完全公平调度类 完全公平调度类是调度类的一个实例static const struct sched_class fair_sched_class = { .next = &idle_sched_class, .enqueue_task = enqueue_task_fair, .dequeue_task = dequeue_task_fair
linux进程管理 - 核心调度器 linux内核进程调度器基于两个函数:周期性调度器函数和主调度器函数.周期性调度器所谓周期性调度器就是scheduler_tick中实现。如果系统正在活动中,内核会按照HZ自动调用这个函数。实际上在每个滴答的handler中会调用这个函数。如果在没有进程等待调度,那么在计算机电力供应不足的情况下,也可以关闭该调度器以减少电能消耗。该函数会激活负责当前进程的调度类的周期性调度方法。
Linux 进程调度 CFS调度器传统的调度器使用时间片的概念,对系统中的进程分别计算时间片,使得进程运行至时间片结束。在所有的进程时间片都以用尽后,重新计算时间片。而CFS调度器完全摒弃了时间片,会重点考虑进程的等待时间。CFS调度器的目的是,向系统中每个激活的进程提供最大的公正性,或者说确保没有进程被亏待。CFS引入了虚拟时钟的概念,该时钟的流逝速度小于实时时钟,精确的速度依赖于当前等待
Linux 文件系统 - Ext4 Howto 去年就发现项目Android系统中已经用上了Ext4文件系统,当时并没有深究为什么要使用Ext4文件系统,使用ext4带来的优点和缺点。最近有时间,正好整理下Ext4对于Ext2/Ext3带来的变化。网上关于Ext4的文章并不多,只找到了来自http://kernelnewbies.org/Ext4/的Ext4 Howto,是一篇概括性的文章。1. 介绍Ext4是Linux操作
理解linux虚拟文件系统VFS - 路径查找 path_lookup VFS的一个主要操作,是给定一个文件名,获取该文件名的inode。路径查找是VFS中相当繁琐的一部分,主要是符号链接,文件系统装载点,已经. ..和//等奇怪路径带来了一些额外处理。nameidata数据结构查找过程涉及到很多函数调用,在这些调用过程中,nameidata起到了很重要的作用:1. 向查找函数传递参数;2. 保存查找结果。struct nameidata {
理解linux虚拟文件系统VFS - 数据结构 file_system_type1406 struct file_system_type {1407 const char *name;1408 int fs_flags;1409 int (*get_sb) (struct file_system_type *, int,1410 const
理解linux虚拟文件系统VFS - 概述 当前,除了linux标准的文件系统Ext2/Ext3/Ext4外,存在很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层最这些文件系统提供了完美的支持。对于用户来说,这些文件系统是几乎透明的,在大部分情况下(比如fat vfat不支
进程地址空间 - 地址空间布局 虚拟地址空间包含了若干区域,其分布方式是特定于体系结构的。但是基本都包含下列共同的成分。当前运行代码的二进制代码,代码段又称为text,所处的地址空间由称为text段。程序使用的动态库的代码存储全局变量和动态产生的数据的堆。用于保存局部变量和实现函数/过程调用的栈环境变量和命令行参数的段将文件内容映射到虚拟地址空间的内存映射。是由elf标准确定。每个体系结构都指定了一个特定起始
内核映射 - 持久内核映射 持久内核映射 permanent kernel mappings内核提供了其他函数用于把Highmem内存映射到内核地址空间:持久内核映射和临时内核映射。而这些函数和vmalloc无关。因此网络上对持久内核映射和临时内核映射的理解非常的混乱持久内核映射允许内核建立高端物理内存帧到内核地址空间的长期映射。和其他kernel地址空间一样,持久内核映射使用kernel一个pte页表来
内核分配不连续页 - vmalloc 当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需
linux 内存管理中的PG_Compound和GFP_COMP 当__alloc_pages分配的gfp_flags制定了__GFP_COMP,那么内核必须将这些页组合成复合页compound page。第一个页称为head page,其余所有的页称为tail page。复合页的尺寸要远大于当前分页系统支持的页面大小。并且一定是2^order * PAGE_SIZE大小。复合页主要用在HugeTLB相关的代码。复合页的引入是因为随着计算机物理内存容量不断增
伙伴系统分配器 - buffered_rmqueue 在__alloc_pages过程中,操作分为两个部分,第一部分是找到适当的内存域,接下来的一部分就是按照伙伴系统的分配方式,从free_lists中移除这些页。buffered_rmqueue就是用来完成第二部分工作的。1. 首先判断要分配的页面数是否为 1,如果为1 的情况下,那么并不需要从buddy系统获取,因为per-CPU的页缓存提供了更快的分配和释放机制。per-CPU cach
内存管理中的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以及其他人提交
伙伴系统分配器 - PF_MEMALLOC 标志位 这是一个进程标记位,除了在内存管理子系统中使用外,还在其他的内核子系统中使用。之所以在伙伴系统分配器中讨论,是因为这个标记和内存管理密不可分。当一个进程被设置PF_MEMALLOC后,那么对进程会有如下影响:1. 当进程进行页面分配时,可以忽略内存管理的水印进行分配,这是告诉内存管理系统,给我一点紧急内存使用,我将会释放更多的内存给你。2. 如果忽略水印分配仍然失败,那么直接返回ENO
伙伴系统分配器 - __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
伙伴系统分配器 分配掩码 kernel伙伴系统分配的函数,只能分配2的整数幂个页,更细力度的分配只能借助与slab或者slub分配器常见的分配函数是:alloc_pages(mask, order) 分配2的order幂次个页面,如果成功返回第一个页框对应的page结构,失败则返回NULLget_zeroed_page(mask)分配一个页面,成功则返回这个页框对应的page结构,失败返回NUL
线程栈和进程栈 区别 要搞清线程栈和进程栈的区别,首先要弄清线程和进程之间的关系。线程和进程有很多类似的地方,人们习惯上把线程称为轻量级进程,这个所谓的轻量级是指线程并不拥有自己的系统资源,线程依附于创建自己的进程。我们可以从三个方面来理解线程的轻量级1. 调度由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免了昂贵的进程切换。当然不
避免物理内存碎片化 - 内存紧缩 原文地址 http://lwn.net/Articles/368869/长期存在的内存碎片问题,已经有多篇文章提及了。简单的说:当系统运行一段时间后,空闲页面趋向于散落在不连续的空间,很难再有足够长的连续物理内存页面分配。内核开发者已经下了很多工夫,减少大块连续物理内存的分配,因此大部分内核功能并不会受到页面碎片化的影响。但是仍然存在对大块连续物理内存的需要,在内存碎片化系统上的内存分
mlock对page MOVABLE和RECLAIMABLE特性的影响 系统调用mlock允许应用进程锁住某一个地址空间,这将阻止Linux内存回收进程回收这个地址空间的页面。mlock仅仅在kernel层对给定地址范围所在的VMA增加 VM_LOCKED标记,当linux kernel进行内存回收时,会首先判断VMA是否有VM_LOCKED标记,如果存在,那么不会对这个地址范围内的页面进行回收锁定后,这个地址范围内的物理页面,就从RECLAIMABL
避免物理内存碎片化 以前的项目碰到了buddy内存分配失败的情况,最近面试的两家公司也提到了这个问题。物理内存碎片化,是指系统空闲物理内存被使用过的物理内存分割开,导致buddy系统无法满足page分配申请,尤其是申请的连续空间较大的情况下。一般情况下,出错信息如下:[ 3308.564000] lowmem_reserve[]: 0 0 0[ 3308.564000] Normal: 7
内核线程和普通进程的区别 内核线程的主要作用1. 周期性的将dirty内存页同步到磁盘设备上。 比如 bpflush线程周期性的把dirty数据写回磁盘2. 内存页很少的情况下,把内存page 交换到磁盘空间。 比如kswapd,系统会为每一个NUMA创建一个kswapd进程,但是在非NUMA系统上,则仅有一个kswapd3. 管理延时动作4. 实现文件系统的事物日志有两种类型的线程:
ARM指令STMFD和LDMFD STMFDST - storeM - MultipleF - FULLD - DescendingLDMFDLD - LoadM - MultipleF - FULLD - Descending栈指针通常可以指向不同的位置。栈指针指向栈顶元素(即最后一个入栈的数据元素)时称为FULL栈;栈指针指向与栈顶元素相邻的一个可用书局单元时称为EMPT
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
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
Android binder系统架构 1. binder驱动是客户端和服务器端交换请求和处理结果的中介,客户端先获得服务器端的代理对象,通过调用代理对象的方式向服务器端发送请求。代理对象将用户的请求通过Binder驱动发送到服务器端服务器进程处理用户请求,通过BInder驱动返回处理结果给客户端的服务器代理对象。2. Binder Adapter 是对Binder驱动的封装,主要用于操作Binder驱动,实现包
存储器层次结构 - cache基本原理 局部性原理局部性原理表明了在任何时间内,程序访问的只是地址空间相对较小的一部分内容。以下是两种类型的局部性:时间局部性如果某个数据被访问,那么在不久的将来它可能再一次的被访问。例如大多数程序都包好了循环结构,因此这部分指令和数据将被重复的访问,呈现出了很高的时间局部性。空间局部性如果某个数据项被访问,与他地址相邻的数据项可能很快被访问。由于程序通常是顺序执行的,因此程序也呈现了
内存屏障 写的不错,转来看看。http://www.spongeliu.com/233.html当你看到“内存屏障”四个字的时候,你的第一反应是什么?寄存器里取出了错误的值?ifence,sfence之类的指令?还是诸如volatile之类的关键字?好吧,我第一次看到这四个字的时候,脑子里浮现出的是魔兽争霸里绿油油的铺满苔藓的岩石屏障- -#,并且,当我搞明白内存屏障具体是什么,而且自认
dump 函数调用trace dump函数调用trace:可以获取函数的调用关系图,某些时候对于跟踪bug,理解程序结构有特别重要的意义。内核函数调用trace内核提供了dump_stack()函数,利用该函数,可以打印出当前函数的调用路径。dump_stack是一个架构相关的函数,对于arm平台,该函数的实现位置是arch/arm/kernel/traps.c应用层函数调用trace
uboot 内核传参 uboot在启动内核时,会向内核传递一些参数。据说bootloader有两种方式向内核传递参数,另外一种我不了解,本文仅介绍arm架构下tag结构的传参方式。uboot在启动内核时,会传递一些参数,包括:RAM位置和尺寸,命令行参数,initrd起始位置和尺寸,framebuffer物理地址和尺寸,开发板版本等。uboot把每一个参数打包到一个tag结构中(tag结构参见表1),tag列表
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
函数foorprint足迹和高速缓存 内核函数对硬件高速缓存的影响就是所谓的函数足迹(foorprint),定义为函数执行后重写高速缓存的百分比。执行大的函数或者调用层次比较多的函数,都会导致硬件高速缓存icache被更新的百分比更高,这就导致其后的代码有很大的几率不在高速缓存中,因为硬件高速缓存中都是大足迹函数代码。
Linux mmap内存映射 Linux系统调用mmap和mmap2,创建一个进程地址空间的映射,mmap/mmap2几个常用的场景:1. 文件映射普通文件I/O操作,读写mmap映射后的内存,即可完成文件的读写操作,kernel和userspace操作同一块物理内存;而常规的文件读写,需要循环调用read write lseek接口,每一次读写都需要kernel到userspace,或者userspace到kernel的
Linux kernel和TLB TLB - translation lookaside buffer快表,直译为旁路快表缓冲,也可以理解为页表缓冲,地址变换高速缓存。由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据。提高访存性能的关键在于依靠页表的访问局部性。当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到,。TLB是一种高速缓存,内存管理硬件使用它来改善
Linux Fixmap 的作用 Fixmaps是内核(虚拟)地址空间地址固定的映射到物理内存,同DMA/Normal zone物理内存的直接地址映射有点类似。但是4GB开始部分的直接地址映射是线性的,也就是说物理地址和线性映射地址间存在着计算公式paddr = vaddr - PAGE_OFFSET;而固定地址映射则可以映射任意的物理地址,包括DMA Normal Highmem。Fixmaps的存在意义每个
避免物理内存碎片化 - 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
framebuffer xres和xres_virtual区别 xres yres是可视区间大小,对应着LCD的显示尺寸。xres_virtual yres_virtual定义了framebuffer内存中一帧的尺寸。xres_virtual yres_virtual必定大于或者等于xres yres,可以通过pan操作来显示xres_virtual和yres_virtual定义的显示区域。
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
ARM处理器 的linux分页机制 ARM MMU只支持两级页表地址转换,也就是采用三级分页映射,能够满足32bitCPU的存储管理需求ARM支持的页大小有几种 - 1M, 64K, 4K, 1K。在linux kernel中,ARM采用了4K大小的页,4K大小的页决定了虚拟地址的低12bit留作偏移地址。从上图可以看出,页全局目录索引有效位数是12bit,二级索引有效位数是8bit,页内偏移量为12bit。
Android pmem分析 最近在优化mx51项目中内存的使用,512MB RAM的划分为:64MB pmem_adsp64MB pmem gpu96MB DMA zone96MB GPU memory这样只剩下192M给kernel 的Normal zone,由于普通的alloc_pages无法使用DMA zone的空间,内存相当紧张,想从pmem中释放一些内存出来,因此花了点时间了解pmem.
SDRM/DDR 寻址 DDR内部组成DDR内部是由多个存储阵列组成的,我们称这些存储阵列为bank,早期的SDRAM内部分割成两个bank,后来是4个,这是SDRAM规范中规定的最大bank数,在DDR2标准中,BANK的数目提高到8个。每一个存储阵列就像表格一样,表格的每一个单元格是最小存储单元,大小可以为4, 8, 16,也就是位宽,位宽决定了数据线位数。如果想使用32bit的数据总线宽度,那么可以使用
Linux Highmem的使用 Linux kernel zone有如下类型:ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM。每一种zone类型适合不同的使用类型:ZONE_DMA是低端物理内存范围适合于ISA设备的请求,ZONE_DMA的物理页框映射到kernel线性地址空间。ZONE_NORMAL则被直接映射到kernel线性地址空间,常见的内核操作都发生在ZONE_NORMAL。ZON
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),
linux 终端设备 - 线路规程 line discipline(LDISC) 线路规程,是linux和类unix系统终端子系统的一个软件驱动层。终端子系统从上到下可划分为三层:顶层tty core驱动层提供字符设备接口(因为所有的终端设备都是字符设备);最底层是tty driver层用来和硬件进行通讯,实现tty_operations供tty core和 LDISC层调用;中间层line discipline实现终端输入
linux uart终端 - 调用关系 内核函数调用关系可以通过dump_stack()函数分析出来uart设备是tty设备的一种,主从设备号的分配依赖于平台实现,在我的mx51板上,主设备号是217,从设备号范围为16-23终端驱动设备号分配信息可以通过proc文件系统查看:cat /proc/tty/driveruart serial是tty设备的一种,而tty设备又是char 设备。因此,tty驱动
linux 终端设备:系统终端设备 在tty core代码tty_io.c中,有如下几行代码/* * Ok, now we can initialize the rest of the tty devices and can count * on memory allocations, interrupts etc.. */static int __init tty_init(void){ cdev_ini
V4L2 soc camera 分析 - 系统架构图 图1 soc camera 子系统 系统架构图Soc camera sub-system对应着drivers/media/video/下的soc_camera.c soc_camera_platform.cSoc camera host 是host端实现,是由平台厂商实现的,向上实现soc_camera_host_ops接口,向下操作Camera host硬件以及通过平台特定的
V4L2 soc-camera 分析 - 调用关系 应用层通过设备节点/dev/videoX打开video4linux devices。/dev/videoX是一个字符设备,主设备号81,次设备号: (0~63)分配给capture设备,64~127分配给radio设备,223~255分配给VBI设备,128~191分配给其他类型的。如果驱动要注册一个video4linux设备,那么需要调用video_register_device函数。
v4L2 soc-camera 分析 - soc_camera.c soc_camera.c1455 static struct platform_driver __refdata soc_camera_pdrv = {1456 .remove = __devexit_p(soc_camera_pdrv_remove),1457 .driver = {1458 .name = "soc-camera-pdr
V4L2 soc-camera 数据结构 static LIST_HEAD(hosts)所有的host都在hosts指向的链表上static LIST_HEAD(devices);所有soc camera device都挂在devices指向的链表上。系统内可能有多个soc_camera_host,每个soc_camera_host可以对应1 ~ n个soc_camera_device。每个soc_camera_d
V4L2 soc-camera 子系统 soc-camera的作者之所以引入这个子系统,我想一个主要目的就是把camera驱动划分为camera host端,camera device端,这样同一个camera sensor驱动就可以方便的移植到多个camera host下,而无须做较多的改动。本译文取自kernel文档:Documentation/video4linux/soc-camera.txt术语
YUV YCbCr 区别 YUV是图像色彩空间的一种色彩模型,该模型将亮度和色度分开,常用的三种色彩模型为RGB CMYK和YUV。YCbCr是ITU-R BT601的一部分,是YUV经过缩放和偏移处理后的结果。其中Y与YUV中的Y含义一致,Cb Cr同样都指色彩。二者到RGB空间的转换公式也不一样Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16Cb' =
深入了解ALSA 原文 http://www.volkerschatz.com/noise/alsa.htmlIntro任何人如果经常的使用linux机器处理音乐,那么他迟早会和ALSA打交道。ALSA是Advanced Linux Sound Architecture的简称,和过时的Open Sound System(OSS)比起来更强大功能更多。事实上,你可能已经不知不觉的使用了ALSA,比
ALSA asoundrc官方文档 原文地址 http://www.alsa-project.org/main/index.php/AsoundrcWhy asoundrc?.asoundrc和asound.conf对于ALSA能供正确工作不是必需的。大部分应用都可以在没有他们的情况下正常运行。这两个文件用来提供特定的额外功能,比如在alsa-lig层进行路由和采样率转换。The .asoundrc
ALSA plugin 文档 原文地址 http://alsa.opensrc.org/Plugin_DocumentationOfficial documentationALSA plugins的官方文档地址是http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html此外还可以在下面地址发现有用的信息:http://www.alsa-p
ALSA声音编程介绍 ALSA是Advanced Linux Sound Architecture简称。它包含一组kernel 驱动,一个应用编程接口(API)库以及一组工具函数。本文中,我们会向读者展示ALSA项目和组成部件的概况。后面会重点介绍ALSA PCM接口的编程。ALSA不仅仅是sound API。选择ALSA可以让你最大程度的控制和执行执行低级的audio函数,或者使用其它sound API不支持的特
音频处理的基本概念 采样(sample):PCM audio不论是输入还是输出,都包含采样,采样达标声音的一个声道在某个特定时间点的振幅。 很多这样的采样组成了声音。样本是记录音频数据的最基本单位。对于CD audio,每秒有44100个采样。采样的尺寸从8bit 到64bit精度。采样的格式也各式各样: 大端整形,小端整形或者浮点数。采样尺寸决定动态声响范围。动态声响范围是指最静和最大声之差通道
tw9912 寄存器配置 给出4组,还是以FAE给的配置给为准NTSC_in_656i_output: 输入为CVBS NTSC模拟信号,输出为隔行BT656w FF 00 ; Page 00w 01 78w 02 40w 03 20w 04 00w 05 01w 06 03w 07 02w 08 14w 09 F0w 0A 1Bw 0B D0w 0C CCw 0D 15w
一个简单的ALSA示例代码 代码如下,注释可参看原文http://users.suse.com/~mana/alsa090_howto.html#include int main(){ int ret; snd_pcm_t *pcm_handle; snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_hw_params_t *hwpa
HDFS Append/Hflush/Read design 原文位置https://issues.apache.org/jira/secure/attachment/12445209/appendDesign3.pdf1. Design challenges对于hflush,HDFS需要使得未关闭文件的最后一个block对所有readers可见。当前存在两个挑战:1. 读一致性问题。在一个给定时间最后一个block的不同rep
Hadoop体系结构指南 英文原文 HDFS Architecture Guide简介Hadoop Distributed File System(HDFS)是一个运行在商用硬件平台上的分布式文件系统。它和很多现存的分布式文件系统有很多相似之处。当然,和其他的分布式文件系统的区别也是很明显的。HDFS在廉价硬件平台上提供高可靠的文件服务,提供数据访问的高吞吐量,适合那些运行在大数据集上的应用。HDFS并
深入理解Hadoop集群和网络 原文地址 http://bradhedlund.com/2011/09/10/understanding-hadoop-clusters-and-the-network/本文侧重于Hadoop集群的体系结构和方法,以及它与网络和服务器基础设施这件的关系。文章的素材主要来自于研究工作以及同现实生活中运行Hadoop集群客户的讨论。如果你也在你的数据中心运行产品级的Hadoop集群,那
mx51 reboot是如何实现的 以前觉得 reboot命令能让系统重启动 是件很神奇的事情,今天看了下电路和代码,从底层搞清楚了reboot的整个流程平台是imx51,PMIC是MC138921. 当linux操作系统下使用reboot命令后,会调用到arch_reset的函数,这个函数是平台特定的,对于imx51芯片一定会去reset CPU内的watchdog,2. arch_reset中设置Watchd