自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 cpuset参数说明

cpuset下面参数:-rw-r--r-- 1 root   root   0 1970-01-01 19:15 cgroup.clone_children-rw-r--r-- 1 root   root   0 1970-01-01 19:15 cgroup.procs-rw-r--r-- 1 root   root   0 1970-01-01 19:15 cpu_exclusiv

2017-08-11 16:30:14 6529 1

原创 几个调度器参数说明:

1. /proc/sys/kernel/sched_short_sleep_ns调度器在任务运行短暂峰值时总是试图避免唤醒idle cpu。如果任务平均峰值小于sysctl_sched_short_burst纳秒,并且睡眠平均时间大于sysctl_sched_short_sleep纳秒,那么此任务倾向被打包。提高这个值会导致任务更频繁被打包,有利于功耗,但是会损害性

2017-08-11 14:40:01 5069

原创 perf工具使用

perf用法:1.编译perf:直接在android下执行make perf2.perf支持的命令如下:root:# perf usage: perf [--version] [--help] COMMAND [ARGS] The most commonly used perf commands are:   annotate      

2017-07-31 09:07:13 2619

原创 优先级反转及解决方法探讨

1. 什么是优先级反转(Priority Inversion)    由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。2. 产生原因      其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被

2017-06-30 17:41:18 4448

转载 一则利用内核漏洞获取root权限的案例

kernel 最近出了一个新的本地提权安全漏洞CVE-2013-1763,影响范围比较广泛,ubuntu,Arch,fedora都受到其影响,漏洞刚公布就有牛人发布了利用该漏洞获取root权限的攻击代码,下面会分析该代码是如何获取root权限的。首先对CVE-2013-1763这个安全漏洞简单介绍一下。1. 漏洞描述在net/core/sock_diag.c中,__sock_dia

2017-06-30 10:02:00 3731

原创 linux tracepoint用法

在kernel中经常会看到trace_XX形式的函数,但是又找不到它的定义。这个其实是kernel的tracepoint,定义在include/linux/tracepoint.h中。#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \extern struct tracepoint

2017-06-29 14:53:50 5542

原创 binder驱动代码注释下

//将new_buffer插入proc 的allocated_buffers rb tree中static void binder_insert_allocated_buffer(struct binder_proc *proc,  struct binder_buffer *new_buffer){struct rb_node **p = &proc->allocated_buf

2017-06-29 08:49:21 2836

原创 binder驱动源码全注释上

本文主要是自己阅读binder驱动时的注释。大概会先描述下数据结构,然后贴上主要的代码部分。 //描述一个binder对象struct flat_binder_object { /* 8 bytes for large_flat_header. */ __u32 type;//binder类型,如BINDER_TYPE_BINDER __u32 flags;//只对第一

2017-06-29 08:42:32 937

原创 UEFI在高通平台实现

UEFI(Unified extensible firmware interface)统一的可扩展固件接口,是一种详细描述类型接口的标准。可扩展固件接口(Extensible Firmware Interface,EFI)是 Intel 为 PC固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 OS加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做

2017-06-23 11:42:22 19916 1

原创 selinux在android中用法以及内核中代码实现

selinux(security enhance linux)是由美国国家安全局开发的,用来进行强制访问控制,增强linux系统安全性。传统的linux访问控制采用的是DAC(Discretionary Access Control)模型,这里面主要用的是uid控制。在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。文件所有者对文件有所有

2017-06-09 17:05:18 2160

原创 slub分配器实现

slub分配器对外主要提供几个接口://创建一个高速缓冲区struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,unsigned long,void (*)(void *));//销毁高速缓冲区void kmem_cache_destroy(struct kmem_cache *);/

2017-05-27 16:32:40 1398

原创 slub数据结构

手机测试过程中,发现某个场景下,手机会概率性死机,初步调试分析发现内核打开CONFIG_SLUB_DEBUG后,死机问题消失。最终经过分析定位确定内核某个模块使用内存时越界了一个字节,导致了kernel panic。这里面就涉及到了slub在内存中存储结构。        slub可以认为是一块内存,在内核中除了大块内存按页框从伙伴系统获取外,内核中还有大量频繁使用的数

2017-05-27 11:24:40 789

原创 linux待机流程

linux待机是通过上层应用往sysfs节点/sys/power/state中写入mem,从而执行整个系统的待机流程。待机过程首先是冻结用户进程,内核线程,workqueue,接着依次执行各种设备的suspend操作,最后cpu core进入low power模式,等待外部中断或者事件唤醒整个系统。恢复的过程跟待机过程刚好相反,首先cpu core收到中断后,唤醒cpu cor

2017-05-18 17:38:13 2380

原创 arm 待机指令 WFI和WFE

百度百科上对于待机的解释:待机是将当前处于运行状态的数据保存在内存中,机器只对内存供电,而硬盘、屏幕和CPU等部件则停止供电。由于数据存储在速度快的内存中,因此进入等待状态和唤醒的速度比较快。对于手机而言,待机就是除了DDR保持低频刷新,维护DDR中数据以外,其他的外围设备都断电,cpu core也进入low power 模式,停止工作,等待外部事件唤醒。arm core进

2017-05-18 16:30:43 10969

原创 linux CONFIG_DEBUG_OBJECTS 用法

该选项用来开启debugobjects模块,对应内核代码中的debugobjects.c,这个模块是个通用的调试框架,用来跟踪object的生命周期。kernel中已有的应用该功能的object有timer,workqueue等,当然自己也可以定义自己的模块使用这个调试功能。一个object有下面几种状态:enum debug_obj_state {ODEBUG_S

2017-05-16 11:15:11 2630

原创 内核栈溢出保护

linux内核中有个编译选项CC_STACKPROTECTOR用来开启GCC的stack-protector功能,这个功能是在GCC4.1版本中引入,用来检测栈是否遭到溢出攻击。目前我们用的版本中开启了这两个选项CONFIG_CC_STACKPROTECTOR、CONFIG_CC_STACKPROTECTOR_REGULAR。编译器栈溢出保护原理:函数栈存储结构,从

2017-04-28 14:37:40 5333 2

原创 linux module解析

内核模块操作主要在kernel/module.c中,首先我们看下几个主要的宏定义:module_init,module_exit。这两个宏定义取决于是否有定义MODULE,没定义的话,表示模块静态编译进内核中。我们看下宏定义展开后的表示。#define module_init(x) __initcall(x);#define __initcall(fn) dev

2017-04-13 11:05:16 968

原创 objdump用法

objdump是个gcc的工具,用于解析二进制目标文件。具体的用法可以man objdump查看。下面简单介绍几个常用的用法,以kernel ko文件为例:-d 反汇编mmc_block_test.ko:     file format elf64-littleaarch64Disassembly of section .text:

2017-04-12 17:28:09 5743

转载 cpu 拓补结构

1. 前言在“Linux CPU core的电源管理(1)_概述”中,我们多次提到SMP、CPU core等概念,虽然硬着头皮写下去了,但是蜗蜗对这些概念总有些似懂非懂的感觉。它们和CPU的进化过程息息相关,最终会体现在CPU topology(拓扑结构)上。因此本文将以CPU topology为主线,介绍CPU有关(主要以ARM CPU为例)的知识。另外,CPU topolo

2017-03-31 10:39:22 4404

原创 linux cpufreq interactive调频代码实现下

上一篇文章简单介绍了cpufreq初始化过程,最后会调用到cpufreq_init_policy,在这里面会启动对应的governor。static void cpufreq_init_policy(struct cpufreq_policy *policy){ struct cpufreq_policy new_policy; int ret = 0; memcpy(&new_

2017-03-30 17:32:31 3452

原创 linux cpufreq interactive调频代码实现

Android使用的调频governor都是interactive,我们就以interactive为例,看下整个调频的代码实现。我们沿着driver初始化往下分析代码流程,高通平台对应的驱动文件qcom-cpufreq.c。初始化首先调用:msm_cpufreq_register//依次初始化每个cpu suspend_mutex和device_suspended,注册驱动,最

2017-03-27 19:44:41 2234

原创 linux cpufreq 调频实现

目前的cpu频率越来越高,但实际上大部分场景并不需要cpu一直工作在最高频率。因为cpu工作频率越高,功耗越大,尤其是对手机等移动设备,更需要降低功耗,延长手机电池使用时间。在linux中,通过cpufreq来实现频率的动态调节。1. 先直观看下cpufreq提供的功能。在/sys/devices/system/cpu/中定义了相关的接口,root:/sys

2017-03-24 18:58:26 1268

原创 linux cgroups概念及用法

1.什么是cgroup?Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO 等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgr

2017-03-17 17:16:59 1074

原创 linux mount过程

接下来我们以ext4 文件系统mount过程为例,讲解下文件系统的几种数据结构之间的关联。如果linux版本有支持ext4 fs,那么在linux初始化时会调用static int __init ext4_init_fs(void),这个函数会通过register_filesystem(&ext4_fs_type)向系统注册ext4文件系统到全局file_systems结构中。

2017-03-09 19:03:01 1720

转载 linux性能分析工具

参考资料:https://www.slideshare.net/brendangregg/linux-performance-analysis-and-tools/16-Analysis_and_Tools_strace_Operating

2017-03-08 19:50:34 582

原创 linux文件系统数据结构

/*super_block 超级块对象,存储文件系统的信息,通常对应于存放在磁盘特定扇区的文件系统超级块或者文件系统控制块。*/struct super_block {struct list_heads_list; /* 所有超级块链表 */dev_t s_dev;/* 设备标识符 */unsigned char s_blocksize_bits; //位标

2017-03-08 19:45:51 2334

转载 CPU访问各个部件的延时时长

转载:http://www.lenky.info/archives/2012/07/1784对cpu访问操作时间有个大概认识,对性能优化以及效率能有个更清晰的认识,例如调度器负载均衡时优先在调度组内进行,然后才是调度域。被普遍引用得比较多的数据如下:L1 cache reference 0.5 nsBranch mispredict 5 nsL2 cache ref

2017-03-02 15:10:45 3417

原创 lowmemkiller 分析

Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内存肯定会出现不足,lowmemorykiller就是在系统内存低于某值时,清除相关的程序,保障系统保持拥有一定数量的空闲内存

2017-03-01 19:02:34 2703

原创 中断不能睡眠/调度的原因

操作系统以进程为调度单位,以进程描述符管理进程,进程调度就是调度器在不同的进程栈中切换。中断运行在中断上下文,没有类似中断描述符的数据结构,另外一点,有些架构(如X86)中断运行在独立的中断栈中,如果发生调度之后,没办法再调度回来,调度器无法切换到中断栈。还有中断对时间的要求,效率的原因都不允许其睡眠。参考文章:http://kyang.cc/2016/08/2

2017-03-01 14:40:44 953

原创 linux 使用copy_from_user而不是memcpy拷贝用户空间数据原因

我们平时在内核中访问用户进程的地址的时候一般会用到copy_from_user,而不是用memcpy直接拷贝。为什么有这样的要求?另外在走读代码的时候发现有同事直接用了memcpy将用户空间数据直接拷贝到内核空间,但是并没有发现导致死机,这是什么原因呢?接下来我们从代码实现中找到问题答案。//这个函数首先检查用户空间地址范围是否满足要求,接下来再去调用__copy_fr

2017-02-21 08:54:22 8241 1

原创 linux 内核同步

现在抢占式多核环境下,需要有同步方法来保证共享数据修改正确性。这些数据同步方法需要处理器的支持,简单的可以理解为锁总线,保护共享数据在同一时刻访问的排他性。linux内核提供了两种锁,原子锁和同步锁。原子锁指的是指令执行是以原子操作的方式,不会被打断,保证了临界资源的同步。原子操作支持两组操作,一组是针对整数类型,一组是数据位。针对整数类型,定义了专门的数据

2017-02-17 19:02:18 431

原创 linux 时钟定时器

linux系统有两个时钟:一个是由电池驱动的RTC,被称为硬件时钟,断电后还是继续计时。另一个是内核时钟或者软件时钟,软件根据时钟中断来计数,断电后不存在。时钟周期:晶体振荡器在1秒内产生的时钟脉冲个数。时钟中断:当时钟计数器减到0时就会产生一次中断。时钟中断频率(HZ):1秒内timer产生的时钟中断个数。jiffy作为全局

2017-02-15 19:33:55 556

原创 linux 进程状态

执行top后会显示进程状态process state,state有R, S, D, T, Z, X,  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    1 root      20   0 24456 1476  648 S    0  0.0   0:05.10 init    2 r

2017-02-14 19:24:07 801

原创 linux cfs负载均衡

前一篇文章介绍了RT调度器的负载均衡,CFS调度器负载均衡实现更复杂,下面将一步步介绍下CFS 普通进程的负载均衡。普通进程的负载均衡在以下情况下会被触发:1、当前进程离开TASK_RUNNING状态(进入睡眠或退出),而对应的run_queue中已无进程可用时。这时触发负载均衡,试图从别的run_queue中pull一个进程过来运行。调用的路径idle_balance->

2017-02-07 19:10:31 2244

原创 linux 调度器负载均衡

每个cpu上都有一个运行队列rq,运行队列里面又具体再分成rt_rq、cfs_rq等,在运行的过程中每个cpu上面task数量是不同的,这个用负载来衡量。cpu上rq内task越多,代表这个cpu 负载越重。负载均衡就是用来将task均匀分布在每个cpu上,使每个cpu负载大致均衡,提升task相应速度。负载均衡中有两个主要的操作,pull和push。当本地rq上tas

2017-02-06 19:02:10 1895

原创 linux 非实时性

linux是非实时操作系统,虽然支持RT调度策略,但是并非是硬实时系统。linux非实时性主要表现在下面几个方面:1. 虚拟内存管理,导致实际物理内存分配的滞后性;2.调度策略问题,实时调度策略不能立即抢占,一般要在中断返回,系统调用返回用户空间时通过检查need_resched标记,进行重新调度,或者进程主动放弃cpu时,调用schedule,抢占性不强。3.关中断处

2017-02-04 18:43:32 1521

原创 linux rt调度器

RT(RealTime scheduler)实时调度器,对应用户设定的调度策略为 SCHED_FIFO/SCHED_RR。SCHED_FIFO 先进先出队列调度,高优先级任务一直运行,直到任务阻塞,或者主动退出,或者被更高优先级任务抢占。SCHED_RR 时间片轮转调度,每个实时任务划分一个时间片,时间片用完会切换到其他任务执行。进程几种状态表示:1.

2017-02-04 18:41:25 3314

原创 linux cfs调度器

CFS(completely fair scheduler)完全公平调度器,对应应用设置的调度策略为SCHED_NORMAL/SCHED_BATCH。这种调度策略区别于实时调度,进程优先级低于实时调度进程,用nice值来表示进程的重要程度,nice值得范围-20~19,转换成优先级为100~140。应用程序有多种类型,cpu 消耗型,交互型,nice值一般也不同。cfs调度器如

2017-01-19 15:59:12 847

原创 linux 调度器分析

cpu也是一种资源,linux 调度器负责不同进程在cpu上面的运行。进程的调度时机发生在下面几种情况:1、进程状态转换的时刻:进程终止、进程睡眠;2、当前进程的时间片用完时(current->counter=0);3、设备驱动程序主动调用schedule,让出cpu4、进程从中断、异常及系统调用返回到用户态时;调度器实现主要在kernel/sched/core.c

2017-01-17 19:03:32 537

原创 linux schedule 数据结构

以3.10版本内核为例,linux为了提升多核调度的效率,每个cpu上都有一个runqueue结构,这样就避免了多核争抢同一个runqueue造成的瓶颈。在每个runqueue中,包含了多个调度类(sched_class)的runqueue,调度类下面的子类主要有cfs(完全公平调度器),RT(实时调度器),其他的子类使用不多。几个调度器子类间的优先级顺序:deadline cla

2017-01-17 11:50:49 1513

空空如也

空空如也

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

TA关注的人

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