
android
文章平均质量分 55
szembed
这个作者很懒,什么都没留下…
展开
-
全志Android系统编译及镜像生成过程分析
/命令在”android/device/softwinner/common/vendorsetup.sh”文件。//命令在”android/device/softwinner/common/vendorsetup.sh”文件。out/ //进入lichee/tools/pack/out目录。//执行lichee/tools/pack/目录下的pack脚本。//主要执行build/core/main.mk。//在build/envsetup.sh。//编译Android源码。转载 2023-05-24 11:50:43 · 576 阅读 · 0 评论 -
Android JNI学习(二)——实战JNI之“hello world”
如下:模式.png里面有个三个项目:即C++标准,使用下拉列表选择你希望使用的C++的标准,选择Toolchain Default 会使用默认的CMake设置。:如果你希望启用对C++异常处理的支持,请选择此复选框。如果启动此复选框,Android Studio 会将标志添加到模块级文件的cppFlags中,Gradle会将其传递到CMake。:如果开发者希望支持RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将-frtti标志添加到模块级。转载 2023-02-16 15:21:34 · 224 阅读 · 0 评论 -
Android JNI(一)——NDK与JNI基础 (一)
那我们先来看下Android NDK官网是对NDK怎么解释的NDK官网.png关键文字如下:Android NDK 是一套允许您使用原生代码语言(例如C和C++) 实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。简单的来说:Android NDK 就是一套工具集合,允许你使用C/C++语言来实现应用程序的部分功能。NDK 是Native Develop Kit的含义,从含义很容易理解,本地开发。转载 2022-09-07 16:44:34 · 258 阅读 · 0 评论 -
0 android bringup过程梳理
主要是工作中需要在现有的android系统代码中添加一款产品,梳理一下android系统添加一个产品的移植步骤,此处已经假设你下载完了aosp的代码。转载 2022-09-02 09:53:47 · 346 阅读 · 0 评论 -
wakelock锁
而wakeup_source_drop则主要负责把对应timer从激活链表中删除(如果是出于激活状态),以及释放wakelock锁,而且该函数注释也提醒了,调用该函数时,一定要确保__pm_stay_awake() or __pm_wakeup_event()两个函数没有并行被调用,否则删除状态未知。而wakeup_source_add则完成的工作比较多,包括自旋锁的初始化,添加到wakelock锁的全局控制链表中,超时timer的初始化等。4)wake_lock_timeout:投超时锁,超时后释放锁。.转载 2022-08-05 15:57:28 · 1388 阅读 · 0 评论 -
信号量工作原理
一、内核相关文件为include/linux/semaphore.h和kernel/semaphore.c二、主要结构体:static inline void sema_init(struct semaphore *sem, int val){ static struct lock_class_key __key; *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val); lockdep_init_map(&sem->lock.转载 2022-08-05 15:57:07 · 188 阅读 · 0 评论 -
开关中断与cpsid/cpsie指令
最常见的这两个命令的使用处是在关中断、开中断的实现中,我们经常用的local_irq_enable和local_irq_disable最终都是调用了以下两个实现,即关/开中断只是操作了CPSR中的中断标志位而已,并没有去对GIC做操作,只是简单的不让CPU响应中断,具体实现在arch/arm/include/asm/irqflags.h文件中。在汇编代码中,CPSID CPSIE 用于快速的开关。......转载 2022-08-05 15:56:36 · 741 阅读 · 0 评论 -
反汇编工具使用
2) prebuilts/gcc/linux-x86/arm/gcc-linaro-aarch64-linux-gnu/bin/aarch64-linux-android-addr2line -a 要查询的地址 -e vmlinux。/gcc-linaro-aarch64-linux-gnu/bin/aarch64-linux-android-objdump vmlinux > 1.txt可把内核镜像反汇编,可以根据oops打印出的PC搜索在哪里出错了;该反汇编工具存在于prebuilts/..转载 2022-08-05 15:56:22 · 1040 阅读 · 0 评论 -
(一)内核锁的使用之自旋锁
使用场景:多个任务有可能对共享资源同时访问,这个时候需要进行互斥操作,可以使用本组接口来实现互斥,但是本人强烈不建议使用此接口进行互斥(内核也不建议),原因是如果一个任务正在访问临界资源,使用了本组接口,但是在spin_lock后,spin_unlock前来了中断,恰巧中断上下文中也会调用spin_lock来获取这个锁,这个时候就抓瞎了,中断上下文将永远获取不到那个锁了,因为中断优先级较高,在任务未释放锁之前进入到了中断上下文中,中断上下文中spin_lock将永远不会返回,从而死锁;......转载 2022-08-05 15:55:50 · 181 阅读 · 0 评论 -
一点点读懂regulator(二)
本章我们介绍Regulator Driver Interface相关接口使用。The regulator driver interface相对简单,旨在允许向核心框架注册其服务。转载 2022-08-04 10:31:09 · 186 阅读 · 0 评论 -
一点点读懂regulator(一)
这使用了一个与内核时钟接口类似的API,因为consumer drivers可以get和put a regulator(就像他们可以使用时钟atm一样),并获取/设置电压、电流限制、模式、启用和禁用。如果不使用,这也会编译出来,以便驱动程序可以在没有基于调节器的电源控制的系统中重复使用。它还允许创建一个调节器树,其中一些调节器由其他调节器提供(类似于时钟树)。大多数调节器可以使能和禁用其输出,而有些调节器可以控制其输出电压和/或电流。由调节器、开关的输出功率或另一个电源域提供输入功率的电子电路。......转载 2022-08-05 15:55:18 · 334 阅读 · 0 评论 -
一点点读懂regulator(四)
本章节我们主要介绍Regulator Consumer Driver Interface,因为发现把英文翻译成中文,有些词语的含义总是不能准确的表达出来,所以这个章节,还是建议大家直接阅读英文原版,这样可能才会收获更多。......转载 2022-08-04 10:30:17 · 66 阅读 · 0 评论 -
一点点读懂regulator(三)
本节我们主要介绍Regulator Machine Driver Interface。和B的驱动器必须映射到正确的。现在,可以通过为每个。转载 2022-08-04 10:30:46 · 208 阅读 · 0 评论 -
一点点读懂thermal(一)
thermal模块主要负责温度控制,温度低时想办法升温,温度高时想办法降温,甚至复位系统。Linux kernel有个通用的思想就是抽象分层,比如把该子系统所有资源和信息综合在一起的一层叫core层,不同的设备的操作叫device层,对设备的操作的屏蔽层叫driver层或者governor。同样thermal子系统也是采用了该思想:核心为 thermal_core,可以获取温度的设备抽象为 thermal_zone_device, 如Temp Sensor、NTC(板上的热敏电阻)等。......转载 2022-08-04 10:29:41 · 1702 阅读 · 0 评论 -
一点点读懂Thremal(二)
算法在计算 target cooling state 的过程中,除了需要知道是否 throttle,还添加了一个 trend 作为参考条。转载 2022-08-04 10:29:10 · 542 阅读 · 0 评论 -
一点点读懂cpufreq(一)
和ondemand管理器不同的是,在CPU负载高的时候conservative并不直接跳上最高的主频,而是采用步进的方式来升高主频。1)在需要增加Freq,over drive的情况下:软件首先决定最小的clock frequency,再决定最小的voltage供应。新的freq,可以是clock divider或者PLL,如果是PLL,则需要花费更多时间等待PLL稳定。总之Freq只有在voltage增加之后,才能提高,Freq必须在voltage减小前,先降低。体现的是对系统高性能的最大追求,而使用。.转载 2022-08-04 10:28:19 · 1371 阅读 · 0 评论 -
一点点读懂cpufreq(二)
本章节主要介绍cpufreq中的通知链实现,在调频策略以及频率变化时来通知对该事件敏感的模块,各个模块可以通过注册和去注册接口来加入到通知链中。转载 2022-08-04 10:27:47 · 522 阅读 · 0 评论 -
功耗控制之DVFS介绍
需要说明的是,DVFS调整电压和频率仍然是采用固定的几个数值来调节,而对应的还有AVFS(Adaptive Voltage Frequency Scaling)尽管可以更精细地调节,但是在实际中应用却不多,原因在于AVFS会极大地增加timing signoff的难度,一方面很难用少数PVT条件去覆盖所有电压和频率的组合,另一方面想要增加PVT条件可能面临signoff corner过多。当芯片的最高频率超出既定指标,那么想通过降低电压来保证性能不变的前提下获得更小的功耗就成了自然而然的想法。......转载 2022-08-04 09:51:00 · 1234 阅读 · 0 评论 -
linux电源管理--task freeze
内核线程和work_queue默认是不能被冻结的,少数内核线程和work_queue在创建时指定了freezable标志,这些任务需要对freeze状态进行判断,当系统进入freezing时,主动暂停运行。所有,最好还是设计成UNINTERRUPTIBLE的task在freeze时失败,并循环检测几次(freeze_timeout_msecs = 20s)等待IO完成,如果IO一直没有完成,退出suspend,一个task处于suspend时间过长也是有问题的。有可能导致进程感知系统休眠。......转载 2022-08-04 09:50:30 · 271 阅读 · 0 评论 -
linux电源管理--psci
定义的电源管理接口规范,ARM也提供了官方的设计文档《Arm Power State Coordination Interface Platform Design Document》,全文有87页之多,由此可见PSCI框架的繁琐和复杂,感兴趣的同仁可以去ARM官方网站进行下载参阅。在本文中,我们仅仅从一个开发者的角度来对PSCI框架进行分析和学习。这2个文件的关系以及其与ATF\SR主流程的关系如下图所示,最终都会陷入到ATF中进行对应操作。CPU的热插拔,CPU启动、SR主流程都需要PSCI框架的支持。.转载 2022-08-04 09:50:14 · 544 阅读 · 0 评论 -
linux电源管理-pm core主流程
PM Core,SR(suspend/resume)主流程,顾名思义就是把Linux Kernel中各个低功耗模块组合在一起,成为睡眠和唤醒流程的主干道,我们称之为SR主流程。其在内核中特性的开关主要受以下宏控制:相关代码主要在kernel/power/目录下main.c----提供用户态接口,以及pm notifier相关接口.c----Suspend功能的主流程.c----Suspend过程中对控制台的处理逻辑.c----Suspend过程中对进程的处理逻辑。......转载 2022-08-04 09:49:48 · 1198 阅读 · 0 评论 -
linux电源管理--wakesource
1)结构体原型:struct{constchar*name;intid;转载 2022-08-04 09:49:18 · 2462 阅读 · 0 评论 -
linux电源管理--syscore
实现包括注册和去注册接口,suspend和resume接口,以及shutdown接口,如果需要注册相关实现,首先包含该头文件,然后通过resister来注册自己的syscore回调。Shutdown回调会在kernel_power_off或者reboot时进行回调,相关实现可以评估是否需要注册shutdown回调函数。该机制的实现在drivers\base\syscore.c中,实现非常简单,不在此过多解析。相关实现在drivers\base\syscore.c中。在头文件中,声明了函数原型以及相关。...转载 2022-08-04 09:48:44 · 351 阅读 · 0 评论 -
当panic或者die被执行时,或者发生未定义指令时,如何被回调到
附:同样,在die函数被调用时,也有类似的机制,不做详细介绍,大家可以看一下register_die_notifier/ unregister_die_notifier的相关实现。另外,还有一部分模块或者子系统,希望系统在panic时,能主动通知一下本模块,以便做一些复位前的准备动作,相应的kernel也提供了该机制,就是让大家注册。3、注册完成后,当系统中有调用panic函数时,panic在执行过程中就会回调注册的函数。该链表存储各个模块注册的panic回调函数,以便panic在发生时回调对应回调函数。.转载 2022-08-04 09:48:20 · 281 阅读 · 0 评论 -
kernel hung_task死锁检测机制原理实现
Linux的进程存在多种状态,可在include/linux/sched.h中查看。static noinline void __sched__mutex_lock_slowpath(struct mutex *lock){ __mutex_lock(lock, TASK_UNINTERRUPTIBLE, 0, NULL, _RET_IP_);} static noinline void __sched __down(struct semaphore *sem){ __down_common(sem, T转载 2022-08-04 09:46:25 · 354 阅读 · 0 评论 -
Kernel函数解析之kernel_restart
主要功能为回调注册到reboot_notifier_list链表中的回调函数,因为有部分模块,需要在重启系统前做一些模块相关的工作,举个简单的例子,比如系统要重启时edma正在搬移数据,那么回调后可以把EDMA停下来,以防止系统挂死。回调所有注册syscore shutdown回调的回调函数,通常注册syscore的回调有3个:suspend\resume\shutdown,其中suspend和resume在低功耗流程中调用,shutdown则在此处调用。回调,注册的模块可能会保存一些自己关心的数据。...转载 2022-08-04 09:33:01 · 1926 阅读 · 0 评论 -
如何根据地址获取函数名
之前有做过一个通过截取内核信号,获取程序出错所在函数位置信息(如段错误),然后进行栈回溯的功能(之前的blog有写),那个虽然成功了,但仍有一些不合人意的地方。就是手动回溯结果显示的只是函数地址,如果要看是哪个函数,那还要用objdump或addrline工具用地址找到是哪个函数,比较麻烦。最近折腾了两天时间,终于搞定了根据地址自动获取函数名称的功能。......转载 2022-08-04 09:32:18 · 1331 阅读 · 1 评论 -
Linux中mprotect()函数的用法
这是可能发生的,比如,如果你 mmap(2) 映射一个文件为只读的,接着使用 mprotect() 标志为 PROT_WRITE。如果调用进程内存访问行为侵犯了这些设置的保护属性,内核会为该进程产生 SIGSEGV (Segmentation fault,段错误)信号,并且终止该进程。需要指出的是,指定的内存区间必须包含整个内存页(4K)。区间开始的地址start必须是一个内存页的起始地址,并且区间长度len必须是页大小的整数倍。start 不是一个有效的指针,指向的不是某个内存页的开头。...转载 2022-08-03 11:13:17 · 1001 阅读 · 0 评论 -
Kernel函数解析之panic
panic()函数在panic.c文件中,该文件位于kernel/目录下;该函数的主要作用是停止当前的系统运行,供系统监测到异常时调用。转载 2022-08-03 11:09:55 · 552 阅读 · 0 评论 -
Linux中的preempt_count
在中断上下文中,调度是关闭的,不会发生进程的切换,这属于一种隐式的禁止调度,而在代码中,也可以使用preempt_disable()来显示地关闭调度,关闭次数由第0到7个bits组成的preemption count(注意不是preempt count)来记录。preempt_count中的第8到15个bit表示softirq count,它记录了进入softirq的嵌套次数,如果softirq count的值为正数,说明现在正处于softirq上下文中。的宏专门用来判断当前是否在中断上下文中。...转载 2022-08-03 11:05:37 · 414 阅读 · 0 评论 -
linux内核中的__read_mostly、__must_check、asmlinkage、fastcall
linux内核中的fastcall和asmlinkage宏:转载 2022-08-03 10:37:14 · 229 阅读 · 0 评论 -
仿照linux dpm机制,实现自己的dpm
前边我们讨论分析了linux 内核的dpm实现,分析的目的在于学以致用;在好多实时操作系统中,并没有dpm这个框架,所以我们可以仿照linux的dpm框架,来实现我们自己的dpm,可以运用到需要dpm的系统中。...转载 2022-08-03 10:32:23 · 145 阅读 · 0 评论 -
二级中断实现机制
知识点:函数指针,回调函数,中断转载 2022-08-03 10:29:58 · 296 阅读 · 0 评论 -
如何记录并发现异常唤醒系统的中断源
为什么选择syscore级别的回调函数呢,主要是syscore级别的suspend和resume回调是完全处于锁中断的,此时系统是不响应中断的,我们可以在此记录中断状态。异常唤醒的情形,系统被唤醒有时是正常的唤醒,比如定时器到时来中断唤醒系统来处理业务,有时是异常的唤醒,比如定时器设置超时时间不合理,频繁唤醒系统会导致系统耗电量增加,电池电源很快被耗尽,减短终端待机或者使用时间,此时我们需要一定的手段来记录是谁唤醒的系统,然后分析是否合理唤醒,不合理就让相关责任人修改。1、首先,定义自己的回调函数。...转载 2022-08-03 10:26:49 · 287 阅读 · 0 评论 -
编程中宏的使用
这样可以防止头文件被重复包含或者某个变量被重复定义,因为一般一个项目中,代码量、文件都是很多,流程很复杂繁琐的,难免会有头文件被重复包含,加上这个宏的限制后,我们就不用担心编译警告或者错误了;这样,我可以在任何需要检查参数的地方,调用这个宏就可以了,代码看起来也更简洁。3、用宏来定义一些通用的代码,比如好多个函数都需要参数类型检查,我可以定义一个宏来实现。1、定义一些常量,或者一些基地址,方便在版本更换时,只需要适配宏,而不需要修改代码。需要注意的是,宏中如果有。的话,一定要加上括号;...转载 2022-08-03 10:21:24 · 384 阅读 · 0 评论 -
linux内核链表使用
孤陋寡闻的我自己在结构体中弄了个*pre和*next指过来指过去,到最后虽然功能实现了,但是代码看起来好冗余,一不小心链表操作就会错误,一位大师告诉我,内核有链表操作,非常简洁,一开始其实我是不愿意替换的,因为那时候工作进度紧,对内核链表使用不熟悉,怕出错,结果迫于老大压力,给替换为内核的链表了,替换完之后感觉真不错,于是乘胜追击,把链表操作也移植到另外一个系统中继续使用了,本文简单介绍几个内核链表使用接口,承认确实没什么技术含量,但是也算是给大家共享一点经验吧。5、遍历的同时需要删除节点。...转载 2022-08-03 10:18:04 · 583 阅读 · 0 评论 -
linux dpm机制分析(下)
否则,如果dev->class 和 dev->class->pm两处都注册回调函数的话,会选择dev->class->pm的回调函数。dpm_suspend_end():执行suspend_late和suspend_noirq设备的回调函数,进行睡眠前的准备工作。否则,如果dev->type域和dev->type->pm域都注册的话,会选择dev->type->pm处的回调函数。如果dev->bus 和 dev->bus->pm两处都注册回调函数的话,会选择dev->bus->pm的回调函数。...转载 2022-08-03 10:15:56 · 522 阅读 · 0 评论 -
linux dpm机制分析(上)
这些阶段结束后,驱动程序必须停止所有的I/O事务(DMA,IRQs),保存足够的状态信息以便它们能被重新初始化或回复之前的状态(按应将的需要而定),然后让设备进入低功耗状态。(3) Suspend_late顾名思义,是在其他设备suspend之后,再进行suspend操作,也就是说如果设备注册了本回调意味着本设备的suspend要晚于其他设备的suspend操作。Suspend:回调各设备的suspend回调函数,保存各设备必要信息,在系统唤醒时能恢复这些信息使该设备能实现睡眠前的功能。...转载 2022-08-03 10:13:06 · 687 阅读 · 0 评论 -
(二)内核锁的使用之信号量
举个例子,银行有5个业务窗口,这就好比值为5的信号量,这个时候可以有5个人可以同时得到服务,第6个往后就得等待信号量的释放了,直到有人办完业务(释放信号量),他才能去办理业务(访问资源);上节中所说的自旋锁是非睡眠锁,他会一直占有CPU直到获取到对应的锁。作为同步使用时,通常是中断和任务搭配完成的,任务一般是一个死循环,最开始是一个down信号量的操作,通常情况下任务会卡在此处,当配对的中断到来时,也就意味着任务到了运行的时机,这个时候中断上下文中会释放一个信号量,中断上下文退出时,任务就会被调度到执行。.转载 2022-08-03 10:10:38 · 111 阅读 · 0 评论 -
64位内核注册tty设备
同时,内核在接收用户态传进来的参数时,要做get_user和copy_from_user处理,主要是在64位内核中,指针是8个字节,用户态指针是4个字节,需要做一下适配,具体使用可以参考内核代码,内核中有很多使用的地方。在64位系统中,注册tty设备需要注意的是,Android跑在EL0并且在32位模式下,kernel跑在EL1并且在64位模式下,不但内核需要打开CONFIG_COMPAT选项,很多android上层应用调用的ioctl在底层驱动模块也要提供相应的compat_ioctl()函数;...转载 2022-08-03 10:07:57 · 173 阅读 · 0 评论