- 博客(232)
- 资源 (3)
- 收藏
- 关注
原创 core dump
可以修改host侧的core_pattern值(会同步映射到容器中)。我们可以通过core_pattern文件调整。必须启用,支持 ELF 格式的 core 文件生成(大多数 Linux 默认开启)。2、frame N(N为栈帧号):切换到第N栈帧,一般选0,即当前崩溃的栈帧。该文件路径:/proc/sys/kernel/core_pattern。控制是否允许生成 core 文件(通常默认开启)。文件系统支持,core 文件生成和参数控制依赖。:core 文件生成的时间(Unix 时间戳)
2025-10-10 23:17:21
421
原创 crash-utility
示例如下,通过该命令可以查看系统触发dump时的trace信息,但是这依赖于系统在进dump时trace-event系统正在往外面吐数据的,如果彼时trace-event根本就没有使能的话,也就没有trace信息输出了。,要知道调度一般是以ms级别为单位的,而这里连续运行19+秒,肯定是存在问题了,在后面的分析过程中也要。”的技术,即只有在需要使用某一段dump文件时才将该段加载到内存中,因此对内存的消耗较小。,那么这个线程很可能是触发dump的罪魁祸首,后面在分析的过程中需要重点关注。
2025-10-09 22:44:42
806
原创 kdump
其将dump导出为一个ELF格式的文件,你可以直接通过cp后scp将其拷出,然后通过makedumpfile、crash或者gdb工具来调试这个dump的内存镜像文件。前面的配置都执行完后,如果内核发生crash,则会进入我们预先加载的dump-capture kernel中。在需要的时候,Kexec -p命令会拷贝dump-capture kernel到预留的内存。不过有时候,供应商会自己预先设置命令行,并且为了避免机器的内存被移除一部分后,就不能开机的情况,本种方式更加适用。起来之后,你可以使用诸如。
2025-10-09 22:40:18
635
原创 top介绍
Shared Memory Size (KiB),与其他进程共享的物理内存(匿名、文件),也包括私有映射的program images and shared libraries文件。: Priority, 进程调度优先级;如果显示“rt”,则说明是实时调度。:Virtual Memory Size (KiB),包括all。:Command Name or Command Line,可以。切换完整的command line和command name。,进入自定义显示列界面;,移动到需要显示的项,然后按。
2025-10-09 22:29:49
745
原创 perf_event_paranoid
这是为了防止应用程序或恶意程序通过性能监控工具获取过多的系统信息,特别是内核级的操作,这可能会暴露一些敏感数据或导致隐私问题。: 允许所有用户收集大部分性能事件,但会有一些限制,例如对于内核性能事件(比如与内核相关的性能计数器)会有一些权限控制。普通用户只能收集与自己相关的性能数据(例如用户空间的事件),无法获取内核级别的事件。这是最严格的权限设置,通常是为保护系统和数据的隐私而设置的。控制着在系统中对性能事件的访问权限。等性能工具时的权限,以防止普通用户收集系统性能数据,特别是在涉及系统敏感信息时。
2025-10-09 22:28:02
374
原创 simpleperf
如果要生成函数符号报告,simpleperf 需要读取被监视的进程使用的可执行二进制文件来获取符号表和调试信息。默认情况下,路径是记录时被监视的进程使用的可执行二进制文件,然而,在生成报告时这些二进制文件可能不存在,或不包含符号表和调试信息。Simpleperf是Android开源项目(AOSP)的一部分,可以剖析 Android 客户端 Java 和 C++ 代码,是 Android NDK 工具的一部分。通过传入选项,我们可以选择使用哪些事件,监视哪个进程/线程,监视多长时间,以及打印的间隔。
2025-10-09 22:23:07
923
原创 Perf tutorial
提供类似linux top工具的功能,默认监控的event是cycles。默认是processor-wide mode,可以使用 -C 参数来监控指定cpu subset。按‘s’键的方式是否是历史?因为新版(ubuntu22 linux6.8)可以直接通过。如果app使用-ggdb 参数编译,则perf annotate可以提供。还可以使用 -p 或 -t 分别指定进程或线程来profiling。perf annotate可以提供。' 会打印出当前界面支持哪些操作。
2025-10-09 22:20:32
648
原创 Linux Perf
它能对运行在 CPU 上代码调用栈(stack traces)进行采样,以确定程序在 CPU 上的运行情况,软件定义的一些events,包括:pagefault、cpu-clock、context-switch等。:是 tracepoints 在用户空间的对应技术,是应用程序和库在它们的代码中提前加入的静态追踪代码。现有的内核tracing event,这点和ftrace相同,可以通过tracefs来查看。glibc 没有提供对系统调用 perf_event_open 的包装,perf 在。
2025-10-09 22:10:56
794
原创 Cache Operation
通过读取CLIDR (Cache Level ID Register),可以获取最多7级缓存的实现状态(只实现了I cache、只实现了D cache,还是I+D cache都实现了,或者是Unified cache)。不过不同的架构和文档对其功能解释不一致,导致会引起一定的误会。而指令cache(如热补丁技术)的操作则只需到PoU即可!寄存器值,就可以查看选择的cache的支持情况(如set数量、LineSize等)。寄存器,选择要查询的cache level以及指令还是数据cache;
2025-10-09 22:00:45
832
原创 Cache Coherency Mechanisms
Cache一致性,就是要保证当不同处理器core以及bus master访问相同数据时,该数据在cache中的状态是一致的。那么如何管理这个一致性呢?不同的架构,使用的cache一致性协议可能不同。来由硬件维护缓存一致性,但是端口有限,只提供给少量重要外设,如。上图是ARM ACE协议矩阵图,其与MOESI是对应的。只支持一个cluster的inner shareable。
2025-10-09 21:55:27
881
原创 Cache Policies
当一个写操作执行时,只更新cache,并将cacheline标记为dirty。只有当eviction(逐出、替换)发生时,或者显示的执行cache clean操作,cache中数据才会更新到物理内存中。在cache的分配策略中,Read-Allocation是绝大部分架构默认的策略。除非有特殊说明是Write-Allocation,否则,都是Read-Allocation。当一个写操作发生时,cache和外部物理内存都会被更新。cacheline不会设置为dirty。
2025-10-09 21:51:31
747
原创 Cache Type
那么我们cacheline进行设计时,set的index位数加上cacheline的offset位数,就不能超过12bits。虚拟地址空间在分配的时候,限制其为16KB对齐,以其16KB对应物理地址空间的4KB。也就是虚拟地址空间申请的16KB空间的高2bits可以为(00,01,10,11)的任意值,但只取一个。2)如果超过了(假设set index+cacheline offset采用14bits),那么VI就不等于PI,因为超过的bit数(bit12~bit13)对应的虚拟地址就不等于物理地址。
2025-10-09 21:48:30
775
原创 Cortex-M3平台嵌入式程序的几点心得体会
注:以下所有应用实例均以MDK4.60为开发编译工具1. norFlash的应用(以SST39x640x为例)a) ini文件的添加下载针对你平台(例如M3)的外设(主要是EMC)初始化的ini文件,或近似文件来修改。推荐网址:www.keil.com。修改后添加至如下图所示位置:这一步的目的是为了让MDK编译器烧写程序之前初始化norflash外设用。打开“xflash.in...
2025-10-09 21:47:39
883
原创 Cache and Buffer
上面的Store buffer模型,在store buffer和cache中存在不同版本的copy时,就会存在问题。下图是当loading请求时,硬件增加了snooping功能来检测store buffer中是否有对应的copy。换句话说,loading after store的场景,会首先去store buffer中读取这个值,而不是直接从cache中。初始化时,a和b都被设置为0,且a在cpu1的cacheline中,b在cpu0的cacheline中;最终,你会发现b的值是1,而不是2!
2025-10-08 22:01:43
982
原创 Memory type attribute
高4bit用于指示是device内存还是normal内存;0000表示device内存,非全0表示normal内存。针对device内存和normal内存,低4bit分别有不同的含义。device内存主要是GRE属性不同;normal内存则高4bit表示outer cache属性、低4bit表示inner cache属性。来映射物理页面时,你可以使用memory type attribute来指定cache属性。的定义和pte页表属性,以及mair_el1中设置的值对应起来了!mair_el1的值是在。
2025-10-08 21:56:47
600
原创 Preemptible RCU
上图中第一个qs record会被忽略,因为当前的gp还没开始;第二个schedule tick时(X位置),由于还处于rcu_read section所以不会record qs;第三个schedule tick时会记录有效的qs,并report给rcu_data。下图展示了在使用可抢占式 RCU 的情况下,在以下三个位置调用的函数之间的关系,这些函数用于在 RCU 读端关键区内管理被抢占的任务。preemptible kernel默认会配置CONFIG_PREEMPT_RCU,这会导致RCU。
2025-10-08 21:44:40
745
原创 Expedited GP
不过This method has。在 Linux RCU(Read-Copy-Update)代码中,funnel-lock 通常指:多个线程或 CPU 在访问树状结构(如 rcu_node 层级)时,逐层向上“汇聚”到一个全局锁(如根节点的 mutex),以保证关键操作(如 grace period)只由一个线程执行,其他线程则等待或复用已有结果。Funnel-lock 是一种分层加锁、汇聚到全局锁的机制,常用于树形结构的并发控制,既保证了高效的局部操作,又能安全地进行全局同步。
2025-10-08 21:41:29
1000
原创 Callback list
) *//** empty.*/#define0#define1#define2#define3#define4The callback list is divided into four sections: 首先需要区分下:tails[0]*tails[0]headtails[0]*tails[0]CB1—–>CB2—–>CB3—–>CB41stdonesegment:2ndwaitsection3rdnext-ready。
2025-10-08 21:38:22
444
原创 RCU NOCB
For cbFor no-cb/**/__initvoid/**/static intvoid *arg/**/structrcu_datardp/**/static intvoid *arg/**/structrcu_datardpstructrcu_headrhpbool *flags。
2025-10-08 21:33:41
933
原创 callback
3 level的数据结构中都有一个gp_seq变量。Local cpu data(rcu_data)只有在该cpu需要的时候,才会更新,所以rcu_data中的gp_seq可能会落后全局gp_seq一个数。Root node的gp_seq一般是和rcu_state同步更新的,其他node的gp_seq稍微落后一点时间(主要是竞争node锁)。==》gp_seq的低2bit为状态位,所以,上一个gp和下一个gp从数值上来看。没看懂下图中rcu_seq_end()之后,pg_seq为什么变为12了?
2025-10-08 21:25:20
981
原创 RCU-basic
需要注意的一点,是尽量避免增加额外的工作,从而降低read-side的性能。于是,内核粗略的认为当所有的cpu都经历了一个 Quiescent State (QS)之后,那么这个GP一定就结束了。对于使用preemptible RCU的场景,GP的结束检测,除了上述的所有cpu都经历一个QS(如下图)之外,还需要检测在read-side临界区被抢占的所有task的状态。就是当RCU的updater更新了新值之后,等待在更新之前就已经进入reader区域的reader全部结束,之后再回收旧值的过程。
2025-10-08 21:20:07
623
原创 Memory barrier
内存屏障分几个level:inner-shareable、outer-shareable、full-system等。不过,cpu可能并不知道这个store和load之间是有依赖关系的,这个order是可能被改变的。当使用设备的地址寄存器和数据寄存器来读取设备内容时,我本来想,Compiler Barrier 用于防止编译器。ldar/stlr指令。
2025-10-08 21:13:36
976
原创 percpu
其设计初衷是,对于某一特定功能的变量,每个cpu都有一个备份,各自玩各自的;下图左边是内核中静态定义的percpu变量,放入static区域;右边是module中静态定义的percpu变量,放入reserved区域。如上,为module的percpu区域reserved的空间是8K;每个cpu访问各自空间的对应变量,这样,不需要同步机制,且提高了cpu的cache命中率,会大大提高访问效率。如果要求相同,还是需要用共享变量。就是所有组的nr_units成员之和。的逻辑拓扑结构,比如大小核心、分簇、
2025-10-08 18:09:40
926
原创 Reverse Mapping
当你想移出一个共享物理page的所有映射时(比如movable页面),如果没有rmap,则需要遍历所有用户进程的page table来寻找有哪些虚拟地址映射到了此物理页,然后进行一一解除映射。当该page是file page的时候,它确实如它本来的样子,指向“文件地址空间”(mapping->host 可以获取对应的 inode)。当该page为匿名页的时候,这个指针就变了,变成了struct anon_vma *mapping;)的anon_vma,则复用,只需新建一个AVC来建立联系即可。
2025-10-08 17:58:07
810
原创 Rmap的演进
有了前面的铺垫,这并不复杂,通过struct page中的mapping成员可以找到该page对应的AV,在该AV的红黑树中,包含了所有的可能共享匿名页面的VMAs。这时候由于写操作,父子进程原本共享的page frame已经不再共享,然而,这两个page却仍然指向同一个anon_vma,不仅如此,对于B这样的页面,一开始就没有在父子进程之间共享,当首次访问的时候(无论是父进程还是子进程),通过do_anonymous_page函数分配的page frame也是同样的指向一个anon_vma。
2025-10-08 17:54:23
603
原创 arm中断
传统ARM中断分为三个域:SGI、PPI、SPI,每个域中断的编号都从0开始。interrupts = <0x01 13 0x04 >, //PPI中断号13+16,高电平触发,Physical Secure PPI。<0x01 14 0x04 >, //PPI中断号14+16,高电平触发,Physical Non-Secure PPI。//PPI中断号10+16,高电平触发,Hypervisor PPI。<0x01 11 0x04 >, //PPI中断号11+16,高电平触发,Virtual PPI。
2025-10-07 22:28:19
308
原创 Locality-specific Peripheral Interrupts (LPIs)
每个外设都需要拥有其自身的DeviceID,才能向ITS发送中断;每个DeviceID需要一个ITT表,来维护它EventID to INTID的映射。一个外设,可以产生多个事件,这由EventID标识;前面也提到,一个CollectionID其实唯一标识了一个cpu(或Redistributor)。EventID and INTID相等场景。
2025-10-07 22:26:10
885
原创 gicv3/v4
maint中断是level-sensitive interrupts。虚拟机里vcpu都是通过ICC_*来访问gicc,但具体访问的是虚拟的(ICV_*),还是物理的(ICC_*)是通过。来判断的,如果其设置为1,表示虚拟化中断路由开启,访问的是ICV,否则访问的是ICC。gicv3逻辑组件图。
2025-10-07 22:23:42
475
原创 DMA mapping
If you use Streaming mapping instead of Coherent mapping, you will need to map and unmap (sync operation) every time before and after DMA transfer.DMA Mapping TypeSelect and use one of the two types of DMA mapping as follows:Streaming DMA mapping typessing
2025-10-07 22:14:05
800
原创 DMA pool
allocation的值,至少设置为1页。不过dma_pool_create()函数,只是设置和初始化相关数据结构,并不分配实际内存!上图中应该是pool_alloc_page(),不是dma_alloc_page()
2025-10-07 22:11:09
757
原创 DMA基础
consistent (coherent) DMA mapping一般是驱动初始化时,执行一次,全部map,然后直接使用;这种映射的内存,cpu和设备可以同步的操作它,并且可以看到对方的修改,而不需要显示的软件flush动作。:这种方式的映射,在cpu和设备同时操作该段内存时,可能出现不一致情况!所以,需要用户手动的保证cpu和设备串行化的操作该段内存,且需要软件手动执行clean、invalid和flush等操作!DMA coherent devices是指其在硬件级别与cache一起工作的设备。
2025-10-07 22:05:44
504
原创 连续物理内存管理CMA
函数返回的mask结果为3(0b11),可以理解为在bitmap中查询空闲页面时索引(index)的低两位需要保证为0,即从第三位(4的倍数)开始有效。下图表示,通过cma_init_reserved_mem()初始化的cma区域,其base和size都必须与4M和2^order_per_bit pages对齐。cma用bitmap来管理其区域,已分配的区域设置为1,未分配的区域保留为0。在分配时,只需要在bit为0的区域里查找满足需求的连续为0(即为空闲)的bit即可。宏定义默认的CMA区域大小。
2025-10-07 22:01:33
1065
原创 虚拟内存空间VMA
以下图为例,首先通过execve()执行elf,则该可执行文件的text段,data段,stack段就建立了,在进程运行过程中,可能需要借助ld.so加载动态链接库,比如最常用的libc,则libc.so的text段,data段也建立了,而后可能通过mmap()的匿名映射来实现与其他进程的共享内存,还有可能通过brk()来扩大heap段的大小。vma是通过一个双向链表(早期的内核实现是单向链表)串起来的,现存的vma按起始地址以递增次序被归入链表中,每个vma是这个链表里的一个节点。(都是虚拟地址哈)。
2025-10-07 21:55:39
715
GPS速度和航向计算
2018-04-22
设备树规范及GICv3v4
2018-08-03
显控终端程序
2018-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅