android/linux内核
文章平均质量分 58
小小小小小小小小熊
497403165@qq.com,欢迎交流
展开
-
linux 中断机制分析(一)
在Linux内核的中断管理机制中,涉及的主要数据结构有struct irq_desc、struct irq_common_data、struct irq_data、struct irq_chip、struct irq_domain、struct irq_domain_ops等。每一个中断都对应一个struct irq_desc类型的描述符,记录该中断的所有对应信息。原创 2022-08-23 22:23:05 · 464 阅读 · 1 评论 -
一点点读懂regulator(四)
本章节我们主要介绍Regulator Consumer Driver Interface,因为发现把英文翻译成中文,有些词语的含义总是不能准确的表达出来,所以这个章节,还是建议大家直接阅读英文原版,这样可能才会收获更多。Regulator Consumer Driver Interface...原创 2022-04-08 20:34:47 · 377 阅读 · 0 评论 -
一点点读懂regulator(三)
本节我们主要介绍Regulator Machine Driver InterfaceThe regulator machine driver interface用于配置regulator subsystem的board/machine特定初始化代码。Consider the following machine:Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V] | ...原创 2022-04-08 15:32:42 · 589 阅读 · 0 评论 -
一点点读懂regulator(二)
目录1、Registration2、Regulator Events本章我们介绍Regulator Driver Interface相关接口使用。The regulator driver interface相对简单,旨在允许Regulator Driver向核心框架注册其服务。代码实现在regulator/core.c中1、Registration驱动程序可以通过调用以下接口注册调节器:struct regulator_dev *regulator_register(struc原创 2022-04-08 15:14:17 · 517 阅读 · 0 评论 -
一点点读懂regulator(一)
目录1、关于2、命名法2.1 Regulator2.2 PMIC2.3 Consumer2.4 Power Domain2.5 Constraints3、Design3.1 Consumer driver interface3.2 Regulator driver interface3.3 Machine interface3.4 Userspace ABI1、关于此框架旨在提供一个标准内核接口来控制电压和电流调节器。其目的是允许系统动态控制调翻译 2022-04-08 10:04:06 · 5786 阅读 · 0 评论 -
一点点读懂Thremal(二)
目录1、基本术语概念1.1 trip point1.2 cooling state1.3 zone device state2、Governor实现介绍3、step_wise governor执行流程本章节分析governor之一的step_wise。1、基本术语概念在介绍之前,先介绍几个术语概念来帮助大家理解:1.1 trip point 可以理解为一个阈值吧,每一个温度区间的阈值可以理解为一个trip point。1.2 co...原创 2022-03-30 22:56:39 · 952 阅读 · 0 评论 -
一点点读懂thermal(一)
目录1、thermal简介2、thermal_core分析2.1 zone_device注册相关接口2.1.1 关键结构体2.1.2 接口2.2 Cooling_device注册相关接口2.2.1关键结构体2.2.2 接口2.3 Governors注册相关接口2.4 关于critial事件和非critial事件的处理流程1、thermal简介 thermal模块主要负责温度控制,温度低时想办法升温,温度高时想办法降温,甚至复位系统。Linu...原创 2022-03-29 19:22:43 · 5017 阅读 · 0 评论 -
一点点读懂cpufreq(二)
在Cpufreq中提供了消息通知机制,在调频策略以及频率变化时来通知对该事件敏感的模块,各个模块可以通过注册和去注册接口来加入到通知链中。1、注册接口:/*** cpufreq_register_notifier - Register a notifier with cpufreq.* @nb: notifier function to register.* @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER...原创 2022-03-25 18:21:12 · 1092 阅读 · 0 评论 -
一点点读懂cpufreq(一)
Linux针对CPU的DVFS,主要在cpufreq中实现,Linux内部共有6种对频率的管理策略userspace,conservative,ondemand,powersave,performance和Interactive1.performance:CPU会固定工作在其支持的最高运行频率上;2.powersave:CPU会固定工作在其支持的最低运行频率上。因此这两种governors都属于静态governor,即在使用它们时CPU的运行频率不会根据系统运行时负载的变化动态作出...原创 2022-03-25 18:14:24 · 3147 阅读 · 0 评论 -
功耗控制之DVFS介绍
我们知道所有芯片在设计之初都需要规划好芯片的参数和应用场景,统称为芯片的spec。在spec中通常会定义一个或几个典型的应用场景以及它对应的工作条件如电压、频率和功耗上限等。因此绝大多数芯片的工作条件尤其是电压和频率在一开始就是比较固定的。然而在实际流片后,往往会出现不同芯片的最高频率不同的情况,最主要的原因相信很多人能猜到:process variation。一般来说这种variation会导致不同芯片达到相同性能所需要的电压也呈现正态分布. 这就导致有的芯片比目标频率...原创 2022-03-22 21:24:35 · 12517 阅读 · 0 评论 -
linux电源管理--task freeze
在Linux kernel的睡眠主流程中,有一个关键动作就是冻结进程,为什么要冻结进程?假设没有冻结技术,进程可以在任意可调度的点暂停,而且直到cpu_down才会暂停并迁移。这会给系统带来很多问题:(1)有可能破坏文件系统。在系统创建hibernate image到cpu down之间,如果有进程还在修改文件系统的内容,这将会导致系统恢复之后无法完全恢复文件系统;(2)有可能导致创建hibernation image失败。创建hibernation image需要足够的内存空间,但是在这期间如原创 2022-03-18 20:12:29 · 453 阅读 · 0 评论 -
linux电源管理--psci
PSCI, 是Power State Coordination Interface的缩写,是由ARM定义的电源管理接口规范,通常由Firmware来实现,而Linux系统可以通过smc/hvc指令来进入不同的Exception Level,进而调用对应的实现。在ARMv8架构,引入了Virtualization,Security等概念,CPU boot、shutdown、suspend/resume等操作需要根据架构的演进来满足安全要求。代码目录部署:Arch/arm64/kernel/psci.c原创 2022-02-17 17:26:49 · 2720 阅读 · 1 评论 -
linux电源管理-pm core主流程
全流程涉及的交互时序:suspend流程:唤醒流程:suspend流程的逆流程既是,在此不做过多介绍,后边我们会对全流程的每个组成部分进行拆解介绍原创 2022-02-14 19:37:11 · 1771 阅读 · 0 评论 -
linux电源管理--wakesource
1、框架介绍实现所在文件:drivers\base\power\wakeup.c函数所在文件:include\linux\pm_wakeup.h该文件函数较多,主要实现了wakesource的功能,用于系统判断当前是否有事件阻止睡眠。整套框架基本上是围绕着combined_event_count这个变量在处理逻辑,在此变量中,高16位记录系统所有的wakeup event总数,低16位记录是否有wakeup events在处理中。在每次调用wakeup_source_activate时,wake原创 2021-12-08 19:47:02 · 5019 阅读 · 0 评论 -
linux电源管理--syscore
目录框架位置数据结构及接口原型实现解析使用场景框架位置相关实现在drivers\base\syscore.c中函数声明在include\linux\syscore_ops.h中。依赖宏CONFIG_PM_SLEEP的使能数据结构及接口在头文件中,声明了函数原型以及相关结构体:struct syscore_ops { struct list_head node; int (*suspend)(void); void (*resume)(void); v原创 2021-12-07 19:46:22 · 1591 阅读 · 0 评论 -
当panic或者die被执行时,或者发生未定义指令时,如何被回调到
Panic是Linux kernel提供的一种复位机制,内核开发者在开发过程中,可以在异常流程中主动调用。 另外,还有一部分模块或者子系统,希望系统在panic时,能主动通知一下本模块,以便做一些复位前的准备动作,相应的kernel也提供了该机制,就是让大家注册回调。每次panic在执行过程中,会遍历注册的回调函数并回调之。实现机制:1、在panic.c代码中,有一个链表的定义,ATOMIC_NOTIFIER_HEAD(panic_notifier_list);EXP...原创 2021-11-01 17:06:47 · 409 阅读 · 0 评论 -
kernel hung_task死锁检测机制原理实现
1、实现原理分析Linux的进程存在多种状态,可在include/linux/sched.h中查看。/* Used in tsk->state: */#define TASK_RUNNING 0x0000#define TASK_INTERRUPTIBLE 0x0001#define TASK_UNINTERRUPTIBLE 0x0002#define __TASK_STOPPED 0x0004#define __TASK_TRACED 0x0008/* Used原创 2021-10-23 16:25:15 · 688 阅读 · 0 评论 -
kernel问题定位手段总结
从事kernel底层研发工作,最基础的调试工具就是仿真器,仿真器功能非常强大,可以让研发人员很容易的查看内存、查看函数调用栈、查看内存属性、查看当前寄存器值、设置函数断点、设置内存读写断点等等,那么在没有仿真器的情况下,同样也有很多问题定位手段:内存被踩1)kasan:Kasan是Kernel Address Sanitizer的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存问题。使用方法可参考https://cloud.tencent.com/develo...原创 2021-09-04 18:02:04 · 705 阅读 · 0 评论 -
Kernel函数解析之kernel_restart
该函数实现在kernel/reboot.c中,主要功能为重新启动kernel,比如发现kernel进入到了一个异常场景,此时我想重启kernel,那么该函数就可以调用。void kernel_restart(char *cmd){ kernel_restart_prepare(cmd); migrate_to_reboot_cpu(); syscore_shutdown(); if (!cmd) pr_emerg("Restarting system\n"); else pr_em原创 2021-09-04 15:34:46 · 3938 阅读 · 0 评论 -
如何根据地址获取函数名
https://blog.csdn.net/Chasing_Chasing/article/details/96750109?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlo转载 2021-08-31 21:21:53 · 654 阅读 · 0 评论 -
linux之early_param()和__setup
https://blog.csdn.net/eZiMu/article/details/52334258转载 2021-08-30 16:17:20 · 139 阅读 · 0 评论 -
Linux中mprotect()函数的用法
https://blog.csdn.net/Roland_Sun/article/details/33728955转载 2021-08-24 15:02:45 · 235 阅读 · 0 评论 -
Kernel函数解析之panic
位置:panic()函数在panic.c文件中,该文件位于kernel/目录下;作用:该函数的主要作用是停止当前的系统运行,供系统监测到异常时调用。流程:【源码】:/** * panic - halt the system * @fmt: The text string to print * * Display a message, then perform cleanups. * * This function never returns. */void panic.原创 2021-08-14 18:03:11 · 2978 阅读 · 0 评论 -
Linux中的preempt_count
https://zhuanlan.zhihu.com/p/88883239转载 2021-08-14 16:27:35 · 171 阅读 · 0 评论 -
linux内核中的__read_mostly、__must_check、asmlinkage、fastcall
__read_mostly的说明,有篇博客解释的比较清楚:https://blog.csdn.net/ce123_zhouwei/article/details/8431995__must_check说明可参考:https://www.cnblogs.com/embedded-linux/p/5891847.html原创 2021-01-07 11:29:07 · 223 阅读 · 0 评论 -
仿照linux dpm机制,实现自己的dpm
前边我们讨论分析了linux 内核的dpm实现,分析原创 2014-04-15 22:14:37 · 1036 阅读 · 0 评论 -
二级中断实现机制
转载请注明出处;在很多芯片平台上,为了节省中断线的使用,时常会有些二级中断,本文简单给大家介绍一下二级中断驱动的实现。思想: 使用一根中断线,来实现多个中断传达的目的(通常是32个,因为一个寄存器是32位,每一个bit代表一个中断标志)。 实现: 首先,我们需要一个结构体: typedef v原创 2014-04-22 23:06:45 · 2489 阅读 · 0 评论 -
如何记录并发现异常唤醒系统的中断源
无论是android系统还是VxWorks等实时系统,在开发调试过程中原创 2014-05-06 22:56:03 · 2720 阅读 · 0 评论 -
编程中宏的使用
编写代码中,宏的使用无处不在,总结一下大概以下几种:1、定义一些常量,或者一些基地址,方便在版本更换时,只需要适配宏,而不需要修改代码 #define GIC_CPU_BASE_ADDR (0xA0000000+0x1000) #define PAI 3.14 需要注意的是,宏中如果有运算符的话,一定要加上括号; 2、头文件的定义原创 2014-04-19 19:56:15 · 2142 阅读 · 0 评论 -
linux内核链表使用
作为职场菜鸟,刚开始写驱动时,有地方需要使用双向循环链表,孤陋寡闻的我自己在结构体中弄了个*pre和*next指过来指过去,到最后虽然功能实现了,但是代码看起来好冗余,一不小心链表操作就会错误,一位大师告诉我,内核有链表操作,非常简洁,一开始其实我是不愿意替换的,因为那时候工作进度紧,对内核链表使用不熟悉,怕出错,结果迫于老大压力,给替换为内核的链表了,替换完之后感觉真不错,于是乘胜追击,把链表操原创 2014-04-17 23:26:55 · 1450 阅读 · 0 评论 -
linux dpm机制分析(下)
1 设备注册到dpm_list路径(Platform_device->device->device_driver指向platform_driver->driver)2 低功耗接口dpm_suspend_start():调用注册到dpm_list的设备的回调函数,执行睡眠前的准备和保存工作;dpm_suspend_end():执行suspend原创 2014-04-14 21:46:35 · 2164 阅读 · 0 评论 -
linux dpm机制分析(上)
1 DPM介绍1.1 Dpm: 设备电源管理,device power management主要功能:系统在对外设下电前,需要做一些准备工作,保存一些设备的必要信息,以便在系统退出低功耗状态时能够恢复这些信息,使本设备在上电后能像睡眠前那样正常工作。驱动程序作为一部分,跟随系统级别的低功耗状态。1.2 系统睡眠模式System Sle原创 2014-04-14 21:44:18 · 4509 阅读 · 0 评论 -
(二)内核锁的使用之信号量
信号量是一种睡眠锁,也就是说我调用了获取信号量的接口,但是这个时候信号量获取不到,那么对应原创 2014-04-14 22:21:17 · 831 阅读 · 0 评论 -
64位内核注册tty设备
目前Android跑在EL0并且在32位模式下,kernel跑在EL1并且在64位模式下,不但内核需要打开CONFIG_COMPAT选项,很多android上层应用调用的ioctl在底层驱动模块也要提供相应的compat_ioctl()函数;原创 2014-08-26 22:35:01 · 1182 阅读 · 0 评论 -
cache与buffer的差别
简单说,Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加转载 2017-05-06 14:52:29 · 756 阅读 · 0 评论 -
kernel syscore
syscore作为低功耗流程的一部分,其涉及的文件主要有syscore_ops.h和syscore.c,这一级别的回调函数是在完全屏蔽中断的场景下进行的。1、主要结构体struct syscore_ops,该结构体是syscore操作的对象类型。struct syscore_ops { struct list_head node;//用于链表控制,注册和删除syscore对象时操作此链原创 2015-05-10 22:21:59 · 3216 阅读 · 0 评论 -
你知道底层自旋锁是如何实现的吗
为尊重原创,转载请注明出处。我们在开发中,经常会用到自旋锁,对于使用接口来讲,仿照例子谁都会用,但是你知道其是如何实现自旋的吗?今天我们就来讨论一下其实现原理。1、首先,我们需要实现一个结构体用于自旋锁的使用 typedef struct spinlock{ volatile unsigned int slock; }spi原创 2014-04-21 22:19:35 · 3554 阅读 · 0 评论 -
内核延时函数
1) msleep:实现毫秒级的延时,该延时保证至少延时所设置的延时时间,不会提前超时返回,会让出CPUvoid msleep(unsigned int msecs){ unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) timeout = schedule_timeout_uninte原创 2015-03-12 23:09:13 · 2752 阅读 · 0 评论 -
linux中likely与unlikely
看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/include/linux/compiler.h中,具体定义如下:#define likely(x) __builtin_e转载 2015-03-11 21:49:42 · 518 阅读 · 0 评论 -
CLOCK_MONOTONIC and CLOCK_REALTIME .
Middleware对POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装。一种是CLOCK_REALTIME,另一种是CLOCK_MONOTONIC。对与man手册的解释是:CLOCK_REALTIME: Systemwide realtime clock. 系统范围内的实时时钟。CLOCK_MONOTONIC:Represents monotonic time. C转载 2015-03-11 21:57:02 · 1433 阅读 · 0 评论