自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Burning Water

没有什么能够阻挡,你对自由的向往

  • 博客(44)
  • 收藏
  • 关注

原创 Binder系列()——addService——代码分析

概述addService的过程涉及三个模块:Service,service通过调用service manager的addService接口将自己注册到SM,本质上是client;SM,接收service的注册请求,本质上是server;Binder Driver,负责CS之间的数据传输和kernel中关键数据结构的建立。client看了网上很多资料都是以media service为...

2019-05-16 15:51:32 716

原创 Binder系列(1)——ServiceManager

1. 概述在一台Android 8.1的手机中,能看到三个servicemanager:servicemanager,管理系统服务,本文只讨论servicemanager;vndservicemanager,管理厂商服务,对应的文件节点是/dev/vndbinder,servicemanager和vndservicemanager使用的是同一份代码,都是由service_manager.c...

2019-04-07 16:21:27 838

原创 kernel 系统调用----system call

Init在trap_init中对SYSCALL_VECTOR(编号0x80)的向量进行初始化。 808 set_system_trap_gate(SYSCALL_VECTOR, &system_call);将system call初始化为trap门,加入到IDT table中,发生中断以后,会跳转到对应system_call的地址去执行后续的中断流程。发生中断到跳转执行中断向量的过程在ker

2017-02-28 15:56:05 1537

原创 Linux进程创建三——fork、vfork、clone、kernel_thread

前言Linux创建线程的API主要有fork、vfork、clone、kernel_thread,最终都调用了do_fork。 do_fork的具体流程在上一篇已经分析完毕Linux进程创建二——do_forkfork、vfork、clone都是系统调用,用来实现用户空间的进程创建。 内核空间创建的进程称为内核线程,主要通过kernel_thread,对kernel_thread进行包装的API

2017-01-17 22:53:15 1656

原创 Linux进程创建二——do_fork

前言kernel在启动初期并没有“进程”这个概念,如果不涉及支持多任务并发、调度,kernel可以一直以一个控制流运行。本篇从内核初始化时的0进程开始分析,延伸到多进程的创建。0 进程内核中的所有进程都存在依赖关系,进程有父进程、子进程、兄弟进程。0号进程为所有进程的祖先进程,又称为idle进程、swapper进程。init_task如前文所述,内核在初始化初期没有进程的概念,

2017-01-17 21:12:46 915

原创 What are threads (user/kernel)?

What are threads (user/kernel)?Threads are “light weight processes” (LWPs). The idea is a process has five fundamental parts: code (“text”), data (VM), stack, file I/O, and signal tables. “Heavy-weig

2017-01-13 11:08:27 404

原创 Linux进程创建一——进程、线程、LWP

前言本篇主要对进程和线程的概念进行分析,kernel中的进程、线程模型,涉及进程、用户态线程、内核态线程、轻量级进程(LWP),在分析之前,需要阅读What is Thread?,该文章有便于理解操作系统中线程、用户态线程和内核态线程的对应关系。 根据资料和我的理解,不同操作系统对线程和进程的理解及对应关系稍有不同,本篇只针对Linux操作系统。 本篇文章是阅读ULK3及网上相应文章后的个人总结

2017-01-12 23:20:23 913

原创 kernel中断分析七——tasklet

Abstract在Kernel 中断分析六——softirq中,分析了软中断的处理流程,那么bottom half还剩下tasklet与waitqueue。tasklet是在软中断基础上实现的一种延迟机制,当然同样运行在中断上下文,而waitqueue运行在进程上下文,允许睡眠。Taskletkernel中有定义了十种软中断类型,其中HI_SOFTIRQ、TASKLET_SOFTI

2017-01-10 09:58:24 1472

原创 Kernel 中断分析六——softirq

Abstract目前kernel中的中断机制主要有top half、bottom half(softirq、tasklet、waitqueue)、threaded irq handler。top half不用赘述,我把threed irq handler与bottom half区分开,是因为他们有以下区别: 1、调度方式 threaded irq handler被系统调度器调度,botto

2017-01-08 23:47:05 2316

原创 kernel 中断分析五——irq_thread

前言在x86 kernel 中断分析三——中断处理流程中,对于线程化中断处理函数,handle_irq_event_percpu调用了irq_wake_thread唤醒action->thread,此处唤醒的thread创建于__setup_irq,代码如下: 947 t = kthread_create(irq_thread, new, "irq/%d-%s", ir

2017-01-06 11:27:50 4099

原创 kernel 中断分析之四——中断申请 [下]

前言在kernel 中断分析之四——中断申请 [上]中,request_irq、request_threaded_irq、setup_irq、setup_percpu_irq、request_percpu_irq最终都调用了__setup_irq,本篇对该API进行分析,由于代码比较长,分段分析。请注意,在分析过程中,遇到一些拿捏不定的地方,以用粗体表示,如果有理解错误,欢迎指正。__

2017-01-05 10:28:03 3447

原创 kernel 中断分析之四——中断申请[上]

前言从分析三可知,中断处理最终调用了irqaction的handler和thread_fn,分别对应interrupt context和process context。 对应的中断服务例程是在驱动初始化阶段,通过request_irq或者request_threaded_irq进行申请,注册的,本篇主要对这两个接口进行分析。request_threaded_irq关于中断线程化的目的

2017-01-04 22:43:13 3283

原创 x86 kernel 中断分析三——中断处理流程

CPU检测中断CPU在执行每条程序之前会检测是否有中断到达,即中断控制器是否有发送中断信号过来查找IDTCPU根据中断向量到IDT中读取对应的中断描述符表项,根据段选择符合偏移确定中断服务程序的地址见附录2interrupt数组在分析一中,我们看到,填充IDT中断服务程序的是interrupt数组的内容,所以第2步跳转到interrupt数组对应的表项,表项的内容之前也已分析过push vector

2017-01-03 15:12:59 3623

原创 x86 kernel 中断机制分析二——irq_desc

简介irq_desc数据结构用于描述一个irq对应的各种信息,主要有以下方面: irq_data,描述该irq的irq number,irq chip,irq domain,处理器亲和力等等 handle_irq,highlevel irq-events handler,流处理函数 irq_action,一个链表,每个成员包含该irq中断处理函数等信息 depth,中断嵌套深度 name,

2016-12-29 16:29:58 2530

原创 x86 kernel 中断机制分析一——IDT

本篇主要分析IDT的初始化流程。IDT简介IDT——interrupt description table,用来描述中断异常向量,表中的每一个entry对应一个向量。IDT entry:每个entry为8bytes,有以下关键bit: 16~31:code segment selector 0~15 & 46-64:segment offset (根据以上两项可确定中断处理函数的地址) Typ

2016-12-29 15:06:05 3517

翻译 Moving interrupts to threads(翻译)

翻译一篇来自lwn.net上关于kernel中断线程化的文章,比较老(08年),但还是很有学习意义。kernel中的响应延迟主要来自于处理硬件中断,因为处理中断的过程中,其他中断被block。为此,realtime tree有一个叫做“线程化中断处理(threaded interrupt handler)”的新功能,目的在于将关闭中断的时间减小到最低,将其余的处理过程(其实就是bottom half

2016-12-28 11:07:42 550

翻译 Android Developer Sensor Overview(翻译)

通过Android framework层,你可以获取可用的Sensor的Raw data。Sensor framework层提供了一些类和接口以便于开发者实现各种需求,比如,你可以完成以下实现:1. 选择设备上的哪个sensor可用2. 制定一个独立的sensor所具备的功能属性,比如,最大测量范围,制造商,功耗需求,解析度(resolution)等3. 获取raw data并且定义数据采集的最小

2016-11-08 10:48:19 800

原创 windows下cygwin+ctags+cscope

安装cygwin a.官网下载,安装(先不用着急选源和package,后面可以统一配置安装) b.下载apt-cyg,这个工具在源上好像下载不到,CSDN上有,附链接:http://download.csdn.net/detail/u011836061/8694571 b1、将下载好的apt-cyg拷贝到/bin目录下 b2、修改权限 (chmod +x /bin/apt-c

2016-06-05 22:54:57 953

原创 Linux cmdline 解析(CMA 预留内存)

Linux Version:3.14 Android : Lcmdline在kernel启动的时候被解析. cmdline启动的log中可以看到,比如我的是command_line = androidboot.bootloader=1537.100_M1S1 androidboot.serialno=004999010640000 bl_shared_ram=4k@0xfff4f000 con

2015-09-25 10:55:23 4795

原创 start_kernel——setup_per_cpu_areas

setup_per_cpu_areas是为了对内核的内存管理(mm)进行初始化而调用的函数之一。只在SMP系统中调用,UP中不执行任何操作。 setup_per_cpu_areas函数为SMP的每个处理器生成per-cpu数据。 per-cpu数据按照不同的CPU类别使用,以将性能低下引发的缓存一致性(cache coherency)问题减小到最小。per-cpu数据由各cpu独立使用,即使不锁

2015-07-07 12:29:27 1832

原创 start_kernel——setup_nr_cpu_ids

kernel/smp.c/* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */void __init setup_nr_cpu_ids(void){ nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) +

2015-07-06 18:58:18 2686 2

原创 start_kernel——mm_init_owner

所有任务都具有自己的内存,启动阶段中的当前任务必须具备属于自己的内存。 mm_init_owner()函数传递init_mm和init_task参数 mm/init-mm.cstruct mm_struct init_mm = { .mm_rb = RB_ROOT, .pgd = swapper_pg_dir, .mm_users = ATOM

2015-07-06 17:49:46 1188

原创 start_kernel——page_address_init

mm/highmem.cvoid __init page_address_init(void){ int i; for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) { INIT_LIST_HEAD(&page_address_htable[i].lh); spin_lock_init(&page_

2015-07-06 16:12:58 739

原创 start_kernel——boot_cpu_init及PER_CPU

init/main.c/* * Activate the first processor. */static void __init boot_cpu_init(void){ int cpu = smp_processor_id(); /* Mark the boot cpu "present", "online" etc for SMP and UP case */

2015-07-06 14:31:34 2146

原创 start_kernel——local_irq_disable

在启动初期需要关闭CPU的IRQ,原因: 由于尚未对中断代码,向量表,中断处理器进行初始化,所以必须关闭中断。我的源代码里面定义了 CONFIG_TRACE_IRQFLAGS_SUPPORT,所以调用的是 include/linux/irqflags.h#define local_irq_disable() \ do { raw_local_irq_disable(); trace_ha

2015-07-03 15:03:52 744

原创 从cgroup_init_early函数学习cgroup——初始化代码

前面分析了cgroup机制的框架及数据结构之间的关系,现在看代码就比较见简单了。 代码部分 在init/main.c的start_kernel函数中会调用cgroup_init_early函数进行cgroup的初始化。其实对cgroup的初始化分两次,分别是cgroup_init_early和cgroup_init。这么做的原因是,系统初始阶段需要使用一些 subsystem,先对这一部分进行初

2015-07-03 13:51:38 1813

原创 从cgroup_init_early函数学习cgroup——框架

一些概念的理解cgroup cgourp是一种机制 作用:集成各个进程,对进程分组实现进程组,分配或限制进程组使用的资源(这部分主要有个各个subsystem完成)。 另一个角度,在研究代码的时候,我们更愿意将cgroup理解为一种控制资源的行为。比如:我想要控制进程的CPU使用率为20%,那么我可以创建一个cgroup,这cgroup的作用就是控制指定进程的cpu使用率为20%。subsys

2015-07-02 19:27:41 1776

原创 start_kernel----smp_setup_processor_id(以及weak属性)

在init/main.c中有定义void __init __weak smp_setup_processor_id(void){}这是一个__weak属性的空函数。 先了解一下__weak属性:和gcc编译器相关: weak属性可以让编译器在编译的时候忽略函数未定义的错误弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局

2015-07-02 16:24:09 1277

原创 start_kernel——boot_init_stack_canary

/* * Initialize the stackprotector canary value. * * NOTE: this must only be called from functions that never return, * and it must always be inlined. */static __always_inline void boot_init_stac

2015-07-01 20:15:28 1676

原创 start_kernel----lcokdep_init

void lockdep_init(void){ int i; /* * Some architectures have their own start_kernel() * code which calls lockdep_init(), while we also * call lockdep_init() from the start_kernel

2015-07-01 18:53:53 1147

原创 修改android usb的VID PID

VID: Vendor ID PID: Product ID查看VID和PID: device链接Ubuntu,终端下输入lsusbyin123@yin:~$ lsusb Bus 001 Device 005: ID 04d9:1605 Holtek Semiconductor, Inc. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation

2015-06-17 13:54:52 6446

原创 __init属性的函数

内核中有众多__init属性的函数,这些函数被用作初始化。 比如:/*******************************************************Function: Driver Install function.Input: None.Output: * Executive Outcomes. 0---succeed.********

2015-06-16 18:40:38 1018

原创 CPU动态调频三:interactive governor如何选频

choose_freq函数用来选频,使选频后的系统workload小于或等于target load. 核心思想是:选择最小的频率来满足target load. 影响选频结果的因素有两个: 1.两次统计时间内系统频率的平均频率loadadjfreq, 2.系统设定好的target load,在INIT的时候设定,tunables->target_loads = default_target_

2015-05-15 11:06:17 5302

原创 CPU动态调频二:interactive governor

Linux提供了多种governor供用户选择,这里以interactive为例,毕竟现在的android手机中都是采用该governor. 基于linux 3.14 以下代码若未指明位置则默认在drivers/cpufreq/cpufreq_interactive.c中.首先需要定义一个cpufreq_governor类型的结构体用来描述interactive governor.struct

2015-05-13 19:33:46 9355 1

原创 CPU动态调频(linux 3.14.0)一

cpufreq 动态调频 android

2015-04-21 10:42:10 3357

原创 内核panic后使用GDB调试

GDB panic

2015-04-20 16:51:52 1662

原创 将安卓驱动编译成moudle开机后自动启动

module 安卓 insmod

2015-04-20 15:48:21 740

原创 内核读写文件

filp_open fp->f_op->read fp->f_op->write

2015-04-20 14:40:50 1043

原创 uboot——start_armboot——init_sequence——board_init

Mini2440.c (kangear-u-boot-2009.11\board\tekkamanninja\mini2440)6810 2014/9/1

2014-11-12 14:28:23 974

原创 uboot源码分析——启动linux内核

如果板子启动以后不按任何键,将会默认启动Linux内核。我们回到/common/main.c中,首先s = getenv ("bootcmd");然后run_command (s, 0);bootcmd是一个环境变量,它的值对应一些命令,用来启动linux"bootcmd=" CONFIG_BOOTCOMMAND "\0"/include/configs/mini244

2014-11-03 10:33:55 1054

空空如也

空空如也

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

TA关注的人

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