嵌入式Linux中文站

深入理解连续地址内存分配(CMA)

阅读(241)

连续内存分配(简称CMA) 是一种用于申请大量的,并且物理上连续的内存块的方法,在LWN上可以追溯到2011年6月。原理虽简单,但是其实现起来却相当复杂,因为需要许多子系统之间相互协作。基于不同人的视角,有很多不同的事需要完成和注意。

USB设备被识别流程

阅读(367)

USB模块包括usb core,host,hub,device驱动,其中hub会启动一个内核线程名曰:khubd(hub_events一直在查询(hub使用的是中断传输), 当usb 设备连接在 hub 的某个端口上,hub检测到有设备连接了进来,hub会去调用hub_port_status函数去获取hub端口状态,要是真有设备了,会调用hub_port_connect_change函数会调用usb_alloc_dev函数为设备分配一个struct usb_device结构的对象并初始化,这个初始化将us

用户态与内核态 & 文件流与文件描述符

阅读(196)

用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib :标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好; System Function :系统调用函数,与系统内核进行交互,不同平台具备不同的函数接口,因此可移植性较差 区分用户态和内核态主要是由于系统资源的有限性,不能无限制的随意分配给用户使用,必须由系统进行统一管理 User mode :不能直接对系统资源进行访问,如果要操作系统资源,必须转化为内核态 Kernel mode :管理系统资源,可直接对系统资源进

Linux内核最新的连续内存分配器(CMA)——避免预留大块内存

阅读(297)

在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。目前,Marek Szyprowski和Michal Nazarewicz实现了一套全新的Contiguous Memory Allocator。通过这套机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才被分配给Camera,HDMI等设备。下面分析它的基本代码流程。 声明连续内存 内核启动过程中arch/arm/mm/

深入分析Linux自旋锁

阅读(303)

一、自旋锁 spinlock 的由来 众所周知, 自旋锁最初就是为了 SMP 系统设计的,实现在多处理器情况下保护临界区。 所以 在 SMP 系统中,自旋锁的实现是完整的本来面目。 但是 对于 UP 系统,自旋锁可以说是 SMP 版本的阉割版。因为只有 在 SMP 系统中的自旋锁才需要真正自旋。 二、自旋锁的目的 自旋锁的实现是为了保护一段短小的临界区操作代码,保证这个临界区的操作是原子的,从而避免并发的竞争冒险。在 Linux 内核中,自旋锁通常用于包含内核数据结构的操作,你可以看到在许多内核数据结构中

Linux内存分配小结--malloc、brk、mmap

阅读(235)

Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进

Linux内核驱动之延时---内核超时处理

阅读(214)

jiffies计数器 定时器中断由系统定时硬件以规律地间隔产生;这个间隔在启动时由内核根据HZ值来编程, HZ是一个体系依赖的值,每次发生一个时钟中断,一个内核计数器的值递增.这个计数器在系统启动时初始化为0,因此它代表从最后一次启动以来的时钟嘀哒的数目. 这个计数器和来读取它的实用函数位于,尽管你会常常只是包含, #include unsigned long j, stamp_1, stamp_half, stamp_n; j = jiffies; /* read the current value *

mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系

阅读(115)

我们先来看一个公式:Mipiclock = [ (width+hsync+hfp+hbp) x (height+vsync+vfp+vbp) ] x(bus_width) x fps/ (lane_num)/2 即mipi 屏的传输时钟频率(CLKN,CLKP)等于(屏幕分辨率宽width+hsync+hfp+hbp)x ( 屏幕分辨率高height+vsync+vfp+vbp) x(RGB显示数据宽度) x 帧率/ (lane_num)/2 简单解释下: 一帧画面需要的数据量为(单位bit):FRAME