魅族内核团队

一个有内涵的技术分享平台

BFS 调度器移植体验

IntroductionBFS 全称 Brain Fuck Scheduler. 至于为什么叫这个名字,可以参考 BFS-FAQFAQ. 作者 Con Kolivas 在介绍中表示,BFS 的设计的初衷是带来更好的桌面交互式体验,特别是对于大多数的低规格机器. Android 也曾经评估过 BFS, 测试的结果对用户体验没有明显的改进,因此并没有最终导入. 通过一些第三方机构的测试数据来看,......

Linux 死锁检测模块 Lockdep 简介

死锁概念死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。 Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。 D 状态死锁 进程等待 I/O 资源无法得到满足,长时间(系统默认配置 120 秒......

Linux Tick 和 Tickless

Tick,即周期性产生的 timer 中断事件,可用于系统时间管理、进程信息统计、低精度 timer 处理等等。这样就会有一个问题,那就是在系统空闲的时候也还是周期性的产生中断,系统会被周期性的唤醒导致功耗的增加,这对于追求低功耗的嵌入式设备来说是很难接受的。为此,内核开发者提出了动态时钟的概念,即在系统空闲阶段停掉周期性的时钟达到节省功耗的目的。内核可以通过配置项 CONFIG_NO_HZ......

Linux Thermal 框架解析

Linux Thermal 是 Linux 系统下温度控制相关的模块,主要用来控制系统运行过程中芯片产生的热量,使芯片温度和设备外壳温度维持在一个安全、舒适的范围。 那下面我们就来一起看看对于温度控制这样一个需求,Linux 内核是怎么实现的。 Thermal 的主要框架要实现一个温度控制的需求,试想一下我们是不是最少要有获取温度的设备和控制温度的设备这两个最基本的东西?当然附带的也会产生一......

Linux 进程中 Stop, Park, Freeze

在调试内核的时候,经常会碰到几个相近的概念:进程 stop、进程 park、进程 freeze。这几个名词看起来都是停止进程,那么他们之间的区别和应用场景在分别是什么呢?下面就来分析一番。 本文的代码分析基于 Linux kernel 3.18.22,最好的学习方法还是 “RTFSC” 1. 进程 stop进程 stop 分成两种:用户进程 stop 和内核进程 stop。 用户进程 s......

Linux Signal

信号的基本使用场景:使用 ctrl+c 中止一个程序,或者使用 kill pid 命令杀掉一个进程。Linux 信号机制基本上每个同学都用过,但是信号的具体实现机制还是有很多人不清楚的。在很多人的概念中信号是一种异步机制,像中断一样。但是除了硬中断,信号也是由中断实现的吗?如果不是中断,系统又怎么样来利用软件机制模拟类似如异步中断的动作? 本文的代码分析基于 Linux Kernel 3.......

剖析 Android M 锁屏密码存储方式

Android M 之前锁屏密码的存储在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 SQLite 数据库 /data/system/locksettings.db 中。密码在存储的时候,会将输入的密码加上此随机数组成新的字符串。然后对新的字符串分别进行 SHA-1 和 MD5 加密,将加密后的密文通过 MD5 +......

球面拟合算法

引言在传感器数据融合以及工业测量中,常常需要对已知的数据或者是已知的结构的特征参数进行检测,来评估数据的信噪比或者结构的质量是否符合产品的需求。一般的,可以通过记录大量数据或者通过结构的离散点,来反解出它的特征参数。以球面为例,这些特征参数可以是球的半径,或者是球心等。对于球体拟合算法,通常有代数拟合和几何拟合。在本例中,以一般的代数拟合方法为主进行介绍。 原理分析以下图的数据为例,我们可以......

相机系统综述 —— ISP

ISP(Image Signal Processor),即图像信号处理器,用于处理图像信号传感器输出的图像信号。它在相机系统中占有核心主导的地位,是构成相机的重要设备。 主要内部构成如下图所示,ISP 内部包含 CPU、SUP IP、IF 等设备,事实上,可以认为 ISP 是一个 SOC,可以运行各种算法程序,实时处理图像信号。 CPU CPU 即中央处理器,可以运行 AF、LSC 等各种......

CPUIDLE 之低功耗定时器

在 Linux 操作系统中,Idle 进程(又叫 Swapper 进程)的 pid 号是 0,是所有进程的祖先,它是在 Linux 初始化阶段从无到有创建的一个内核线程。stark_kernel() 函数初始化内核需要的所有数据结构,激活中断,创建另一个叫进程 1 的内核线程(init 进程)。新创建内核线程的 PID 为 1,并与进程 0 共享进程所有的内核数据结构。创建 init 进程后......