![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
等待删除
文章平均质量分 59
生活需要深度
这个作者很懒,什么都没留下…
展开
-
耳机指标电梯测试
测试efsd。原创 2024-07-22 11:06:56 · 123 阅读 · 0 评论 -
Perfetto详细解析重复
所以下面的文章除了一些网图之外,其他的我会多以 Perfetto 来展示。Choreographer 的引入,主要是配合 Vsync ,给上层 App 的渲染提供一个稳定的 Message 处理的时机,也就是 Vsync 到来的时候 ,系统通过对 Vsync 信号周期的调整,来控制每一帧绘制操作的时机 ,Vsync 信号到来唤醒 Choreographer 来做 App 的绘制操作 ,如果每个 Vsync 周期应用都能渲染完成,给用户的感觉就是非常流畅,这就是引入 Choreographer 的主要作用.原创 2024-07-04 10:03:27 · 458 阅读 · 0 评论 -
Linux调试与性能分析
linux性能分析和debug调试原创 2023-03-08 16:22:01 · 503 阅读 · 0 评论 -
自旋锁spin_lock和raw_spin_lock
对于没有打上Linux-RT(实时Linux)的patch的系统,spin_lock只是简单地调用raw_spin_lock,实际上他们是完全一样的,如果打上这个patch之后,spin_lock会使用信号量完成临界区的保护工作,带来的好处是同一个CPU可以有多个临界区同时工作,而原有的体系因为禁止抢占的原因,一旦进入临界区,其他临界区就无法运行,新的体系在允许使用同一个临界区的其他进程进行休眠等待,而不是强占着CPU进行自旋操作。但常用的就上面几种。原创 2022-12-09 11:36:24 · 888 阅读 · 0 评论 -
Linux 中的 waitqueue 机制详解
等待队列(waitqueue) 这个机制在Linux 内核中使用的频率很高,与进程调度机制紧密相关联,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。网上关于等待队列使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的拙见,方便自己回头查看,也希望能有助于后来读者。原创 2024-05-16 08:58:02 · 973 阅读 · 0 评论 -
complete完成量
通过完成量实现内核驱动开发工作,完成量底层分装了等待队列内容,实现了驱动多进程之间消息互通。实际在裸机驱动开发过程中,如果一个中断信号过来,我们通过将一个标识位置为来实现。原创 2022-08-23 13:54:52 · 412 阅读 · 0 评论 -
高低电平触发,(边沿触发)上升沿触发和下降沿触发 中断区别
在允许中断操作进行之后,如果有好几个中断应该怎么怎么办呢,如果谁也不服谁,都抢着说我先,那么MCU估计没两天就罢工告竭了,这时候便需要设置中断优先级,告诉每个中断谁应该先,谁应该后,大家礼尚往来,系统才能正常工作 当然在51中有着一个默认的优先级,依次是:外中断0,定时器0,外中断1,定时器1,串口 有多个中断时,会先进行前面的中断。这也是为什么边沿触发只能触发一次的原因。而我们的外部中断,定时器中断,串口中断,等等,都只是中断的一个分支,在打开分支之后,相对应的要打开“总闸” EA。原创 2022-09-08 14:04:23 · 17219 阅读 · 0 评论 -
AHB总线
AHB:Advanced High-performance Bus(先进高性能总线)高速高性能总线;支持2级流水操作(优势)APB:Advanced Peripheral Bus(先进外围总线)低速总线、低功耗;接口简单ASB:Advanced System Bus(先进系统总线)有需要占用总线的**Master向arbiter发出请求**,arbiter授权给指定的master。任一时间周期只有一个master可以接入总线,对其指定的slave进行读写操作。1。原创 2023-11-14 15:17:00 · 988 阅读 · 0 评论 -
接口总线对比表
对比表同步方式与异步方式的主要区别在于:是否传输时钟信号。只要是通訊前雙方需要設定相同波特率的,都是異步傳輸方式。异步传输(Asynchronous Transmission): 每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束时,一个停止位表示该次传输信息的终止。每8个比特要多传送两个比特,总的传输负载就增加25%。因此,异步传输常用于低速设备。同步传输(Synchronous Transmission):.原创 2021-12-19 13:59:05 · 221 阅读 · 0 评论 -
DMA数据搬运 - SOC裸机
在 ARM 6(和以后)的 32 位模式下可获得的寄存器有:User26 SVC26 IRQ26 FIQ26 User SVC IRQ ABT UND FIQR0 ----- R0 ----- R0 ----- R0 -- -- R0 ----- R0 ----- R0 ----- R0 ----- R0 ----- R1R1 ----- R1 ----- R1 ----- R1 -- -- R1 ----- R1原创 2022-03-01 18:10:32 · 1211 阅读 · 0 评论 -
USB、UART、SPI PCI/PCIE等总线速率
总线实现数据的传出,传输接口参数主要是速率和距离,以太网逐渐进入到高速设备,最开始的串口低速设备也是有存在的价值的。最开始低速接口都是通过串行,速度提高没有办法实现使用并行差分线实现数据传输。 USB总线 USB1.1:——-低速模式(low speed):1.5Mbps——-全速模式(full speed): 12MbpsUSB2.0:向下兼容。增加了高速模式,最大速率480Mbps。——-高速模式(high speed): 25~480MbpsUSB3.0:向下兼容。——-supe原创 2022-03-12 12:08:40 · 4939 阅读 · 0 评论 -
bootmem管理器 - 初始化bootmem_init(上)
bootmem_init |---->bootmem_init_node |---->map_memory_bank(bank) 对内存0x3000_0000,64M空间进行映射 | | |---->bootmem_bootmap_pages |---->find_bootmap_pfn | | |---->init_bootm.原创 2022-04-08 18:04:02 · 624 阅读 · 0 评论 -
Linux 获取虚拟地址对应的物理地址【转】
一个虚拟页映射到一个物理页。以常见的4KB的页大小为例,如果一个虚拟地址0xfe0000对应物理地址的0x40000,那么接下来的虚拟地址0xfe0000+i就对应物理地址的0x40000+i,i=0,1,2,...,4095。也就是说,在虚拟地址中连续的地址,在物理上可能是碎片似的分散在内存条的各个地方,但是在一个页内,地址是连续地一一对应的。从此处读取一个8字节的数据,先检查最高位'page present',如果是1,那么说明该页处于物理内存中,那么该8字节的第0-54位就是物理页号。原创 2023-03-07 18:05:51 · 1387 阅读 · 0 评论 -
DMA缓存共享机制
这是一个可选的op,它可以允许导出器收集有关连接设备的信息,它们对缓冲区的需求(如支持存储约束等),然后相应地做出决定。这是一个可选的op,它可以允许导出器决定是否需要迁移后备存储,以及根据仍然连接的设备的更新需求对缓冲区做出类似的决定。调用dma_buf_detach()后,通过调用dma_buf_put()减少此缓冲区的引用计数。内部调用exporter提供的map_dma_buf()dma_buf_op。内部调用导出器提供的unmap_dma_buf()dma_buf_op。原创 2023-07-10 09:39:16 · 793 阅读 · 0 评论 -
Cache和DMA一致性
DMA应该多多少少知道点吧。DMA(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到内存的技术。这个过程中可以把CPU解放出来,可以很好的提升系统性能。那么DMA和Cache有什么关系呢?这也需要我们关注?原创 2023-06-19 17:11:06 · 639 阅读 · 0 评论 -
Linux内存管理 —— DMA和一致性缓存(dma_alloc_coherent(),dma_map_sg())
还有一个接口dma_cache_sync(),可以手动去做cache同步,上面说dma_alloc_coherent()分配的是uncached内存,但有时给DMA用的内存是其他模块已经分配好的,例如协议栈发包时,最终要把skb的地址和长度交给DMA,除了将skb地址转换为物理地址外,还要将CPU cache写回(因为cache里可能是新的,内存里是旧的)。DMA需要的内存由内核去申请,内核可能需要对这段内存重新做一遍映射,特点是映射的时候标记这些页是不带cache的,这个特性也是存放在页表里面的。原创 2022-10-29 15:54:49 · 4845 阅读 · 0 评论 -
Cache一致性
数据不走cache,直接由地址空间中读取。这时,内存在给DMA使用之前,就要调用一次dma_map_sg()或dma_map_single(),取决于你的DMA引擎是否支持聚集散列(DMA scatter-gather),支持就用dma_map_sg(),不支持就用dma_map_single()。由于协议栈下来的包的数据有可能还在cache里面,调用dma_map_single()后,CPU就会做一次cache的flush,将cache的数据刷到内存,这样DMA去读内存就读到新的数据了。原创 2023-08-16 16:04:58 · 177 阅读 · 0 评论 -
Linux内存管理 page fault
上篇文章分析到函数中,内核实现只是在进程的地址空间建立好了vma区域,并没有实际的虚拟地址到物理地址的映射操作。这部分就是在Page Fault异常错误处理中实现的。Linux内核中的Page Fault异常处理很复杂,涉及的细节也很多,的物理内存映射只是它的一个子集功能,下图大概涵盖了出现Page Fault的情况:下边就开始来啃啃硬骨头吧。原创 2024-04-10 16:11:59 · 405 阅读 · 0 评论 -
《深入理解LINUX内存管理》学习笔记(一)
引子为什么要写这个笔记:1,这本书的中文版翻译了太垃圾,没法阅读。阅读英文原版,可以很好的理解作者的思路。作此笔记备忘2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUX kernel。3,自己一直在做一个too small,too simple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader, 构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。4,克服原创 2022-04-09 16:37:53 · 849 阅读 · 1 评论 -
内存分配接口汇总
对于160M的系统而言,vmalloc_start位置应在3G+160M附近(在物理内存映射区与vmalloc_start期间还存在一个8M的gap来防止跃界),vmalloc_end的位置接近4G(最后位置系统会保留一片128k大小的区域用于专用页面映射),kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址。...原创 2022-08-12 13:48:31 · 1229 阅读 · 0 评论 -
设备区域映射
我们知道默认外设I/O资源部在linux的内核空间中,如果我们想要访问外设I/O,必须先将其地址映射到内核空间中,然后才能在内核空间中访问它。Linux内核访问外设I/O内存资源的方式有两种动态映射(ioremap)静态映射(map_desc)动态映射的方式是我们使用的比较多,而且比较简单的方式,即直接通过内核提供的ioremap函数动态创建一段外设I/O内存资源到内核虚拟地址的映射表,从而就可以在内核空间中访问了。同时内核也提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核空间的原创 2022-04-13 09:24:01 · 623 阅读 · 0 评论 -
内存映射:mmap与ioremap
对于提供了MMU(存储管理器,辅助操做系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。 进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。 1.无论是在用户空间仍是在内核空间,软件一概不能去直接访问设备的物理地址; 2.在内核驱动中若是要访问设备的物理地址,须要利用ioremap将原创 2022-04-14 08:59:30 · 1083 阅读 · 0 评论 -
MMAP基本概念
换言之,CPU 进行一次磁盘读写操作涉及的数据量至少是 4KB,但是进行一次内存操作涉及的数据量是基于地址的,也就是通常的 64bit(64 位操作系统)。mmap 受限于操作系统内存大小:例如在 32-bits 的操作系统上,虚拟内存总大小也就 2GB,但由于 mmap 必须要在内存中找到一块连续的地址块,此时你就无法对 4GB 大小的文件完全进行 mmap,在这种情况下你必须分多块分别进行 mmap,但是此时地址内存地址已经不再连续,使用 mmap 的意义大打折扣,而且引入了额外的复杂性;原创 2022-08-24 14:07:01 · 1819 阅读 · 0 评论 -
malloc用户态内存分配
学习完了用户进程地址空间,那么从本章开始学习下用户空间的内存分配。对于我们来说,对是进程中用于动态分配变量和数据的内存区域,堆的管理对应用程序员来说是不可见的。因为它依赖于标准库提供的各种辅助函数(malloc)来分配任意长度的内存区。使用malloc,相对于栈空间而言,堆内存面临着更为复杂的情况。那么malloc在堆上分配内存到底是如何实现的呢?主要内容包括如下:堆的内存怎么从内核中申请怎么有效地进行堆内存管理1. malloc简介malloc函数使C/C++中常用内存分配库函数,使用mallo原创 2022-04-14 08:58:33 · 3280 阅读 · 1 评论 -
ARM32内存空间分配
Linux内核一般将处理器的虚拟地址空间分成两部分,在32系统上,地址空间在用户进程和内核之间划分的典型比例为3:1,在给出的4GB的虚拟地址空间中,0 ~ 3GB将用于用户空间而3GB ~ 4GB将用于内核空间,内核提供了相关的配置项来修改该比例,也就是说Kernel最多寻址1GB的虚拟地址空间。当CPU启动MMU后,CPU访问的时虚拟地址空间,然后由MMU根据页表转换成物理地址,页表是由Kernel维护的,所以Kernel可以决定1GB的虚拟地址空间具体映射到什么物理地址。但是不管Kernel怎么映原创 2022-04-11 17:00:55 · 1274 阅读 · 0 评论 -
linux内核内存管理框架
内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬件架构、地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理的软硬件架构做一些宏观上的分析总结。内存管理硬件架构因为内存管理是内核最为核心的一个功能,针对内存管理性能优化,除了软件优化,硬件架构也做了很多的优化设计。下图是一个目前主流处理器上的存储器层次结构设计方案。从原创 2022-04-10 12:40:34 · 255 阅读 · 0 评论 -
堆与栈 - 程序运行
文章目录0.前言1.程序内存分区中的堆与栈1.1 栈简介1.2 堆简介1.3 堆与栈区别2.数据结构中的堆与栈2.1 栈简介2.2 堆简介2.2.1 堆的性质2.2.2 堆的基本操作2.2.3 堆操作实现2.2.4 堆的具体应用——堆排序参考文献杂注0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;原创 2022-08-13 14:28:06 · 805 阅读 · 0 评论 -
[trustzone]-TZC400学习总结
如果硬件是这种连接cpu–>tzc–>dmc–>ddr, 那么配置某块region对cpu的nsaid权限后,cpu再次读写该region范围的内存时,cache中已经缓存了该数据,那么这个数据流在cache中就完成了,不会经过TZC,那么是怎么保证安全的呢?nsaid权限访问的路由规则 : 先检查Master的身份,若是secure发起的访问,则去检查Secure access permissions, 如果是non-secure发起的访问,则取检查nsaid权限。原创 2023-08-21 15:07:39 · 362 阅读 · 0 评论 -
linux内核进程切换(二) - 进程管理(十九)
我们知道当调用schedule函数进行主动调度时,首先会调用通过调度类找到下一个要被调度的进程,然后将当前进程切换状态放入对应调度类的调度队列里面,等待再次被唤醒。而对于被调度的这个队列我们就要对其进行上下文切换,上一章节我们学习了上下文切换的时候的基本原理后,本章主要是学习在最新的内核上基于ARM架构学习完整的进程上下文切换的过程,本文的内核版本号为linux4.9.88。1 context_switch代码分析在操作系统中把当前正在运行的进程挂起并恢复以前挂起的某个进程的执行,这个过程叫进程切换或原创 2022-04-16 21:58:04 · 1578 阅读 · 0 评论 -
进程创建接口fork+vfork+clone+Kthreadd+ - 进程管理(十一)
fork,vfork,clone都是linux系统调用,这三个函数分别调用sys_fork,sys_vfork,sys_clone,最终都会调用到do_fork函数。差别就在于参数的传递和一些准备工作的不同,上一章节已经详细学习了fork的流程,本章主要专注学习这三个接口函数的使用方法和差异点。1 进程的四要素linux进程所必须的四个要素:程序代码,有一段程序供其执行: 代码不一定是进程专有,可以与其它进程共享有自己专用系统堆栈空间:有进程控制块(task_struct):有独立的存储空间原创 2022-04-16 12:37:42 · 707 阅读 · 0 评论 -
linux内存模型
前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析内存模型。在Linux内核中支持3种内存模型,分别为flat memory modelDiscontiguous memory modelsparse memory model所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理内存。某些体系架构支持多种内存模型,但在内核编译构建时只能选择使用一种内存模型。1. 基本概念1.原创 2022-04-13 09:28:13 · 1632 阅读 · 0 评论 -
内存管理 初始化(七)kmem_cache_init_late 初始化slab分配器(下)
我们知道kmem_cache中对于每CPU都有一个array_cache,已作为每CPU申请内存的缓存. 此函数的目的在于:每个kmem_cache都有一个kmem_list3实例,该实例的shared作为一个kmem_cache上所有CPU的内存申请缓存. 但是在此之前,seup_cpu_cache中对于kmem_cache中array_cache的值初始化体现不出缓存思想,而且对于kmem_cache中的kmem_list3.shared也没有利用.kmem_cache_init_late的...原创 2022-04-09 17:54:25 · 277 阅读 · 0 评论 -
zonelist初始化
在bootmem_init初始化的时候,已经初始化了内存节点的zone成员,该成员是struct zone数组,存放该内存节点的zone信息。在linux的内存管理中,分几个阶段进行抽象,用数据结构来管理。先用结点集合管理内存,然后用zone管理结点,再用页的管理zone。此时使用的数据结构分别为pglist_data、zone、page结构体,本章的主要是来分析内核是如何完成zonelist的初始化。1. 数据结构在结点的pglist_data数据结构中有一个node_zone_list[]类型的s原创 2022-04-13 12:10:01 · 616 阅读 · 0 评论 -
init_bootmem_node
unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn, unsigned long startpfn, unsigned long endpfn){ return init_bootmem_core(pgdat->bdata, freepfn, startpfn, endpfn);}该函数作用:调用init_bootmem_core函数,初始化pgd...原创 2022-04-04 19:33:46 · 126 阅读 · 0 评论 -
bootmem位图分配器建立及使用 - linux内存管理(五)
阿加内存管理 初始化(二)bootmem位图分配器建立 及 使用本地的笔记有点长,先把bootmem位图分配器的建立 及 使用过程做下梳理。都是代码,上面做了标注。开始的汇编部分省略了(涉及的内容不多,除了swapper_pg_dir的分配)。该记录不会再添加说明,看下记录中的注释就明白了bootmem的建立及使用。该记录中考虑了高端内存……从start_kernel开始……start_kernel() |---->page_address_init()...原创 2022-04-09 17:40:15 · 423 阅读 · 0 评论 -
ARM32内存空间分配
Linux内核一般将处理器的虚拟地址空间分成两部分,在32系统上,地址空间在用户进程和内核之间划分的典型比例为3:1,在给出的4GB的虚拟地址空间中,0 ~ 3GB将用于用户空间而3GB ~ 4GB将用于内核空间,内核提供了相关的配置项来修改该比例,也就是说Kernel最多寻址1GB的虚拟地址空间。当CPU启动MMU后,CPU访问的时虚拟地址空间,然后由MMU根据页表转换成物理地址,页表是由Kernel维护的,所以Kernel可以决定1GB的虚拟地址空间具体映射到什么物理地址。但是不管Kernel怎么映原创 2022-04-13 09:25:28 · 2241 阅读 · 0 评论 -
内核临时页表的创建
前面几节,我们已经看到了x86的分段和分页硬件单元把逻辑地址转换为线性地址,再由线性地址转换到物理地址的基本原理,那么这几章我们来主要是内核是怎么实现页表的创建,本章基于imx6ull和qemu来学习整个过程,其主要内容如下:imx6ull的映射机制内核启动主要概述内核临时页表1. imx6ull的映射机制在之前页式存储管理中,我们主要是针对x86处理器来描述虚拟地址到物理地址的转换,对于ARM来说原理基本类似,下面是我们使用armv7架构图,这张图展示了ARM使用不同方式映射的地址查找过程原创 2022-04-12 12:48:01 · 611 阅读 · 0 评论 -
内存组织结构体
上一章我们梳理了Node, Zone, Page Frame的整个流程,本章就来整理其关系和数据结构之间的关系。1. 基本概念NUMA(Non-Uniform Memory Access,非统一内存访问)和UMA(Uniform Memory Access,统一内存访问):NUMA是从处理器对内存访问速度不同的结构UMA是处理器与所有内存的访问速度相同的结构结点Node:从1个CPU访问速度相同的内存集合每个CPU对应一个本地物理内存在内核中用pg_data_t类型,表示节点的结构体成原创 2022-04-13 09:32:28 · 233 阅读 · 0 评论 -
物理内存与硬件内存组织 - linux内存管理(三)
上一章我们梳理了Node, Zone, Page Frame的整个流程,本章就来整理其关系和数据结构之间的关系。1. 基本概念NUMA(Non-Uniform Memory Access,非统一内存访问)和UMA(Uniform Memory Access,统一内存访问):NUMA是从处理器对内存访问速度不同的结构UMA是处理器与所有内存的访问速度相同的结构结点Node:从1个CPU访问速度相同的内存集合每个CPU对应一个本地物理内存在内核中用pg_data_t类型,表示节点的结构体成原创 2022-04-09 10:22:31 · 1085 阅读 · 0 评论 -
物理内存和虚拟内存的理解
https://blog.csdn.net/u011644231/article/details/105837551?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-原创 2022-04-12 09:33:08 · 229 阅读 · 0 评论