大多数人在 30 岁左右,会遇到一个人生大坎。站在 30 岁的十字路口,回首过往,青春的肆意与懵懂仿佛还在昨日;展望未来,却只见迷雾重重,压力如山。
事业上,曾经的雄心壮志在现实的礁石上屡屡碰壁。看着同龄人升职加薪,自己却仍在原地徘徊,对未来的职业发展充满迷茫与焦虑。当初怀揣的梦想渐渐被消磨,不知是该坚守初心,还是随波逐流,重新规划人生方向。
家庭里,父母日渐年迈,健康问题频出,需要更多的关心与照顾。而组建了家庭的人,家庭责任如同一副沉重的担子,压得人喘不过气来。经济上的压力也接踵而至,房贷、车贷、育儿费用等,每一项都如紧箍咒般束缚着生活。 人际关系中,曾经纯粹的友情在忙碌的生活中渐行渐远。儿时的玩伴已难得相聚,同学间的联系也日益稀疏。新结识的朋友又似乎总隔着一层看不见的膜,难以交心。
在社交场合中,时常感到孤独与格格不入,渴望真诚的情感交流,却又总是事与愿违。 然而,30 岁的坎,也是成长的契机。它如同一把烈火,能淬炼出更加坚韧的灵魂;又似一阵狂风,吹走生活的轻浮与浅薄。在困境中,有人选择沉沦,让岁月在叹息中蹉跎;但也有人勇敢奋起,以无畏的勇气和坚定的信念去破局。他们重新审视自己的 ...
Linux内存管理
未读
前言:还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~
本系列分析的源码都遵循如下的约定:
芯片架构:ARM64
内存架构:UMA
内核版本:如无特别说明,本系列源码基于Kernel 5.15
CONFIG_ARM64_VA_BITS=39
CONFIG_ARM64_PAGE_SHIFT=12
CONFIG_PGTABLE_LEVELS=3
CONFIG_ARM64_PA_BITS=48
CONFIG_SPARSEMEM=y
…
本系列的源码opengrok:iliuqi的linux-5.15
1. 内存管理的一些预备知识
[linux内存管理] 第001篇 内存与内存管理机制
[linux内存管理] 第002篇 页表查询过程简述
[linux内存管理] 第003篇 内存分布
[linux内存管理] 第004篇 内存架构和内存模型
[linux内存管理] 第012篇 zone简介
2. 物理内存初始化流程这个阶段会详细从源码剖析,这部分主要为转载到的优秀的博文(部分博文内容会根据kernel- ...
Android稳定性
未读
0. 前言还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~
1. 方法篇
[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍
[Android稳定性] 第017篇 [方法篇] 高通watchdog分析流程
[Android稳定性] 第020篇 [方法篇] crash实战:手把手教你使用crash分析内核dump
[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析?
2. 原理篇
[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍
[Android稳定性] 第003篇 [原理篇] mtdoops的原理介绍
[Android稳定性] 第004篇 [原理篇] minidump的原理介绍
[Android稳定性] 第008篇 [原理篇] 动态设置kernel cmdline
[Android稳定性] 第011篇 [原理篇] minidump的原理介绍补充
[Android稳定性] 第012篇 [原理篇] blackbox的原理介绍
[Andro ...
一、安装python工具前往网站(https://www.python.org/downloads/)下载python安装包,python >= 3.6.8即可
安装python工具到一个目录,比如:C:\Python36
进入到C:\Python36\Scripts目录中,使用pip指令安装库12pip install psutilpip install pyelftools
二、获取linux ramdump parser工具2.1 Opensourcevendor/qcom/opensource/tools
12git clone e https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/tools.gitgit checkout -b opensource-tools.lnx.1.0 remotes/origin/opensource-tools.lnx.1.0
2.2 proprietaryvendor/qcom-proprietary& ...
Linux内存管理
未读
0. 前言简单来说,在使用zoned page frame allocator分配页面时,会将可用的free pages与zone的watermark进行比较,以便确定是否分配内存。同时watermark也用来决定kswapd内核线程的睡眠与唤醒,以便对内存进行检索和压缩处理。
回忆一下之前提到过的struct zone结构体:
1234567891011121314151617181920212223struct zone { /* Read-mostly fields */ /* zone watermarks, access with *_wmark_pages(zone) macros */ unsigned long watermark[NR_WMARK]; unsigned long nr_reserved_highatomic; ....}enum zone_watermarks { WMARK_MIN, WMARK_LOW, WMARK_HIGH, NR_WMARK};#define min_wmark_pages(z ...
一、问题背景kasan版本
corgi: 4967550
刚跑测出现4台死机,看着都是一样问题
概率4/7
二、问题分析2.1 dmesg_TZ.txt1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586[ 1776.466411][T12145] BUG: KASAN: slab-out-of-bounds in usbpd_mi_vdm_received_cb+0x478/0xb84 [usbpd][ 1776.466641][T12145] Read of size 4 at addr ffffff808d6c0a60 by task kworker/u17:3/12145[ 1776.466686][T12145] CPU: 7 PID: 12145 Comm: kworker/u17:3 Tai ...
Linux内存管理
未读
0. 前言在上一篇文章中我们分析了__alloc_pages中的get_page_from_freelist,也就是快速分配部分。这个函数会根据分配掩码和分配order进行快速分配,若快速分配过程并不能分配到合适的内存时,则会进入慢速分配的过程。
本文紧接前文继续分析__alloc_pages函数,继续剖析buddy内存分配的另一个过程:慢速分配
1. __alloc_pages_slowpath当快速路径分配内存失败时,内核会调用这个函数来尝试各种方法(如回收内存、整理内存碎片、甚至启动 OOM 杀手)来成功分配内存
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411 ...
一、什么是RCU?RCU(Read-Copy-Update,读-复制-更新)是一种 高效的内存同步机制,用于在多核、多线程环境下,解决读写并发问题。它特别适合读多写少的场景,可以显著提高系统的并发性能和效率。RCU 的核心思想是:
读操作不加锁:读操作可以在不阻塞的情况下完成,因为它不会直接修改数据。
写操作创建副本:写操作在更新数据前,会创建原数据的副本,并对副本进行修改。
延迟释放旧数据:在确保所有读操作完成后,旧数据才会被安全地释放。
通过这种机制,RCU 实现了高效的读写操作分离,避免了传统锁机制可能引发的性能瓶颈。
二、什么是RCU stall?当 RCU 子系统检测到以下任一问题时,会触发 RCU Stall:
RCU Grace Period 未结束: RCU 的宽限期(Grace Period)超出预期时间,可能是某个 CPU 或任务未能退出其 RCU 临界区,导致 RCU 回调无法执行。
RCU Callback 堆积: RCU 的回调函数无法按时处理,可能是由于系统负载过高或 CPU 长时间未运行相关线程。
长时间调度延迟: 某些任务或内核线程被阻塞,导 ...
Linux内存管理
未读
0. 前言在前一文[linux内存管理] 第19篇 buddy分配器基础知识以及分配器api接口中,对buddy分配器的基础知识做了简单的介绍,包括涉及到的分配掩码、分配标志、分配入口函数、释放入口函数,而buddy分配的工作是分为快速分配和慢速分配两种的
快速分配:指现有的buddy系统中的free_list中有足够的内存,可以满足申请的需要,或者是通过简单的迁移就能达成申请内存的目的。
慢速分配:指中间经历了内存碎片整理、内存回收、OOM等耗时的操作,而这些操作只是为了让buddy系统获得足够的空闲内存。
注意:
正如前文我们所提到的分配函数alloc_pages、alloc_page以及get_zeroed_page函数追本溯源之后,可以知道都可以溯源到alloc_page,所以本章将会以alloc_pages函数开始剖析buddy的分配算法
1. alloc_pages函数剖析1234567891011121314151617181920212223static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned ...
1. 前言在工作中,经常会遇到由于越界导致的各种奇怪的问题。为什么越界访问导致的问题很奇怪呢? 在工作差不多半年的时间里我就遇到了很多越界访问导致的问题(不得不吐槽下IC厂商提供的driver,总是隐藏着bug)。比如说越界访问导致的死机问题,这种问题的出现一般需要长时间测试才能发现,而且发现的时候即使有panic log。你也没什么头绪。
这是为什么呢?假设驱动A通过kmalloc()申请了一段内存,不注意越界改写了与其相邻的object的数据(经过我之前一篇SLUB的文章分析,你应该明白kmalloc基于kmem_cache实现的),假设被改写的object是B驱动使用的,巧合B驱动使用object存储的是地址数据,如果B驱动访问这个地址。那么完了,B驱动死了,panic也是怪B驱动。试想一下,这块被改写的object是哪个驱动使用,是不是哪个驱动就倒霉了?并且每一次死机的log中panic极有可能发生在不同的模块。但是真正的元凶却是A驱动,他没事你还不知道,是不是很恐怖?简直是借刀杀人啊!
当然,越界访问也不一定会死机。之前就遇到一个很奇怪的问题。有两个全局数组变量(用作存储字 ...