自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)
  • 资源 (1)
  • 收藏
  • 关注

原创 linux内存管理之CMA

CMA,Contiguous Memory Allocator,是内存管理子系统中的一个模块,负责物理地址连续的内存分配,一般我们把这块区域定义为reserved-memory。一般系统会在启动过程中,从整个memory中配置一段连续内存用于CMA,然后内核其他的模块可以通过CMA的接口API进行连续内存的分配。1、解析DTS或者命令行中的参数,确定CMA内存的区域,这样的区域我们定义为CMA area2、提供cma_alloc和cma_release两个接口函数用于分配和释放CMA pages。

2024-03-14 17:54:18 847

原创 linux pstore 存储内核崩溃日志

在系统运行过程中,如果内核发生了panic,那么开发人员需要通过内核报错日志来进行定位问题。但是很多时候出现问题的时候没有接调试串口,而报错日志是在内存里面的,重启后就丢失了。所以需要一种方法,可以在系统发生crash时,将crash info保存于非易失存储器中。这对分析那种小概率且没办法抓到现场的问题非常实用,尤其是现在智能互联网的设备逐渐普及的时候,远端的设备可以自己捕抓崩溃日志再通过网络传输到服务器,维护人员就可以根据收集来的日志定位和解决问题,然后通过OTA让设备升级迭代。内核使用。

2024-03-03 23:11:55 964

原创 ubi子系统的块清洗(scrub)处理

除了nand本身提供硬件ECC保证一定程度的位翻转纠正,当遇到超过设置的位翻转阈值但还能被ECC纠正的物理块,软件上可以做一次物理块移动动作,把数据拷贝到其他物理块,以避免原来的块一段时间之后出现位翻转超出ECC纠正能力而导致数据丢失的问题。ubi模块设计中,进行块清洗的子模块为磨损平衡子模块,这是因为对块清洗的动作与磨损平衡执行的动作是一致的,同样是把一个物理块的数据移动到另一个块。在了解内核ubi子系统的源码之后,发现内核已经实现了这种处理,下面把这种处理叫做块清洗处理。

2024-03-03 22:56:34 914

原创 ubifs掉电老化测试mount失败

这款NOR的擦除算法是先对整个块写0,然后再全部写1,并且写0和写1都是从块的末尾往前写的。因此,当在擦除的过程中断电,由于块的前两页数据有效,ubi把这个块识别成有效物理块,到ubifs挂载时判断文件系统数据损坏而导致挂载失败。从nanddump的报错信息,可以知道data分区中出现ECC error的block地址是0xAA0000,page地址是0xAA8800,该页数据损坏(可以确认该块不是坏块)。在出现问题的板子,手动改写data分区和log分区出问题块的前两页数据,重新挂载即可成功。

2024-03-03 22:54:18 958

原创 内存泄漏mtrac使用

上下文分析:在函数update_change_node()打印完 updata_change_node start之后就没报异常了。

2024-03-03 22:50:13 363

原创 linux 应用异常堆栈捕获

概述本文档讲述两种应用死机堆栈的方法,堆栈跟踪可以帮助开发人员快速定位导致死机的代码位置,从而更快地解决问题。方便后续有工程师在其他应用代码出现死机时,可以参考此文档快速的进行代码移植。该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小,为了取得全部的函数调用列表,应保证buffer和size足够大。

2024-03-03 22:48:24 943

原创 linux移植cm_backtrace

而使用ca_backtrace,可以跟踪定位此前更多的调用栈,并且知道了导致崩溃的位置为./demo(glibc_strlen_null+0x1b)[0x11740]代码移植完成,使用backtrace同样的测试程序,glibc使用原生的Linaro的C库(不支持FP指针),再次追踪strlen(NULL)崩溃。cm_backtrace可以支持多种编译器,并不像c库里的backtrace函数依赖于FP指针的编译参数,对于所有的编译器和优化选项都可以通用。再次运行demo程序,得到以下打印。

2024-03-03 22:43:57 845

原创 kernel hung问题定位分析

内核线程无法直接获取到PC等指针,但可获取到其backtrace,来找到对应的PC指针;触发hung的task,其lswc、lswt均不为0;可获取到线程的PC等指针信息;无法获取到应用线程的backtrace,每个进程有独立的地址空间,CPU看到的虚拟地址,通过当前应用线程的PC指针无法获取到其backtrace;

2024-03-03 22:41:08 826

原创 MCU GCC环境代码空间优化

不同于传统的MCU的FLASH ROM,AM890中小核是没有实际意义上的ROM的,小核的所有内存空间均为可读写的RAM区,存访代码的ROM区是软件上认为划分的区域。我们使用到了一些标准C库的函数,这些函数在写代码时虽然仅仅是增加了一个头文件,然后调用了一下,但是实际编译出来的固件可能就会大好几KB,这些问题都是软件开发人员很少注意到的。基于上述情况,可以将ROM区改为可读写,让data段只在ROM区保存一份,对data进行读写时直接操作ROM区。代码结构优化需要各位编写软件的同事进行。

2024-03-03 22:33:33 894

原创 v4l2_buffer cache属性优化

线激光算法使用v4l2_buffer需做较大的计算量,此内存是否带有cache属性,其性能存在较大的差异,现需对此进行分析及优化。1)新加一种内存分配方式 **vb2_dc_alloc_non_coherent,**暂未找到其具体实现的地方。,故此属性为:**L_PTE_MT_BUFFERABLE **| L_PTE_XN。此方案怀疑是cache刷新存在问题,alloc异常的问题,还需进一步分析。,结合内核属性配置可知:此属性是 **MAP_TYPE_NCB,旧版本库,无明显的变化。测试结果一:图像错乱。

2024-03-03 22:28:06 861

原创 GDB Linux Kernel Awareness

GDB Linux Kernel Awareness称为GDB内核感知,它属于GDB调试的扩展部分,它有什么作用呢?我们平常使用GDB调试的时候,一般都是查看某些寄存器,打一些断点,看某些内存空间,一步一步调试驱动或者应用程序;那么对于Linux这么庞大的系统,我们调试时,很多数据结构相互包含,我们调试的时候,GDB并不知道我们调试的是什么,不知道是在调试线程,还是在调试时钟等,这就是GDB Linux Kernel Awareness的作用。

2024-03-03 22:20:50 871

原创 linux内存管理——内存初始化4---mm_init函数分析

而这些页都有一个具体的页帧号与之对应。页帧号一般用pfn来表示,那么由于每个页都有一个页帧号,那最小的页帧号和最大的页帧号为多少呢?需要特别注意的是,页帧号也是与mem_map数组的index相对应。我们一般认为pfn_min为0,而最大pfn_max为mem_map数组下标的最大值,这个最大值也就是max_pfn,这个值跟内核的max_mapnr相对应。mem_map作用,其是描述所有的物理内存采用的struct page结构的数组的基指针。比如说,对于4GB的内存来说,如果一个页定义为4KB,即2。

2024-02-06 10:28:31 401 1

原创 linux内存管理——内存初始化3---paging_init

从Linux内存管理之物理内存初始化中,可知在paging_init调用之前,存放Kernel Image和DTB的两段物理内存区域可以访问了(相应的页表已经建立好)。尽管物理内存已经通过memblock_add添加进系统,但是这部分的物理内存到虚拟内存的映射还没有建立,可以通过memblock_alloc分配一段物理内存,但是还不能访问,一切还需要等待paging_init的执行。最终页表建立好后,可以通过虚拟地址去访问最终的物理地址了。

2024-02-06 10:27:25 892

原创 linux内存管理——内存初始化2---分页机制

pgd_ctor(mm, pgd) //将swapper_pg_dir全局页目录(部分后256项–即内核最后1G的虚拟地址,这里指的是内核的页表)拷到pgd里,则可以看出,linux下所有进程的内核页全局目录是一样的,都是swapper_pg_dir里最后的1/4的内容,而每个进程的用户态的页表确是不同的,所以在dup_mmap会去将父进程的页表一项一项的爬出来设置为当前进程的页表。相反页表级数越多,需要的存储的页表数据就会越少,而且能支持到比较大的地址空间,但是虚拟地址到物理地址的映射就会越慢。

2024-02-06 09:53:22 866

原创 linux内存管理——内存初始化1---物理内存初始化

备注:1. Kernel版本:5.4.952. 使用工具:Source Insight 4.0。

2024-02-06 09:51:15 916

原创 Linux IO优化之调度器

每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request。I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动,提高效率。每个设备的请求队列里的请求将按顺序被响应。实际上,除了这个队列,每个调度器自身都维护有不同数量的队列,用来对递交上来的request进行处理,而排在队列最前面的request将适时被移动到请求队列中等待响应。

2024-02-06 09:37:22 877

原创 Linux cpufreq子系统

修订记录日期作者版本修改说明2023.08.15枫潇潇V1.0.0初始版本Cpufreq framework的功能称作动态电压/频率调整(Dynamic Voltage/Frequency Scaling, DVFS)。通过调整CPU的电压和频率,可以在功耗和性能之间找到一个平衡点。在不需要高性能时,降低电压和频率,以降低功耗;在需要高性能时,提高电压和频率,以提高性能。1)如何控制CPU core的电压和频率;2)何时改变CPU core的电压和频率。

2024-02-06 09:31:23 841

原创 ubifs使用

本文档主要介绍Linux ubi/ubifs子系统的使用方法。

2024-02-06 09:13:42 807

原创 ubi子系统FAQ

概述本文档主要介绍Linux UBI子系统常见FAQ等。修订记录日期作者版本修改说明2023.10.10枫潇潇V1.0.0初始版本2024.01.22枫潇潇V1.0.1增加ubi使用只读块设备2024.01.23枫潇潇V1.0.2增加ubifs做rootfs2024.01.24枫潇潇V1.0.3增加fastmap使用。

2024-02-06 09:08:34 821

原创 图像矩阵转置性能优化实例

1)由于NEON硬件设计,需要先将源数据加载到D/Q寄存器,运算完之后还需将数据拷贝到目标内存,这将额外增加内存拷贝的流程;2)cpu对读写动作的开销不一致,因架构而已;3)neon的并行运算有助于提高性能;

2023-04-02 16:19:54 643 1

原创 Linux ARM系统调用过程分析(三)——Linux中open系统调用实现原理

sys_open是经过宏替换定义的,源码在fs/open.c中。注意:这里name已经变成了”_name”,加上了下划线了,所以”open”变成了“_open”了。如果未定义了,则{ \}, \{ \}, \#elsereturn 0;} \VA_ARGS)),此时已变成了“sys_open”。sys_open的实现。

2023-04-02 16:18:28 653

原创 Linux ARM系统调用过程分析(二)——Linux系统调用流程分析

在 linux 中,软硬件是有明显的分层的,出于安全或者是资源统筹考虑,硬件资源由内核进行统一管理,内核拥有绝对的权限,而用户空间无法直接访问硬件.在实际的应用中,用户进程总是无法避免需要操作到硬件,这个硬件可能是磁盘文件,USB接口等,这时候就需要向内核递交申请,让内核帮忙做硬件相关的事情,这个过程就由系统调用完成.

2023-04-02 16:18:03 487

原创 Linux ARM系统调用过程分析(一)——Linux编程中的API函数和系统调用的关系

API:(Application Programming Interface,应用程序编程接口)指的是我们用户程序编程调用的如:open(), read(), write(), malloc(), free()之类的调用的是glibc库提供的库函数。API直接提供给用户编程使用,运行在用户态。我们经常说到的POSIX(Portable Operating System Interface of Unix)是针对API的标准,即针对API的函数名,返回值,参数类型等。

2023-04-01 12:06:02 225

原创 linux文件系统——ubifs之ubi子系统(1)

UBIFS 是一种针对 FLASH 重新设计的日志型文件系统。UBIFS 可看做是JFFS2 的下一代文件系统, UBIFS 对于 JFFS2 中诸如节点存储、 实时压缩(on the fligh compression)、异常断电修复等优秀设计进行了继承,针对 JFFS2 文件系统无法快速挂载大容量 FLASH、写操作较慢的情况进行了的许多重新设计, 使得UBIFS在搭载大容量NANDFLASH 时挂载速度更快, IO 效率更高、可靠性更强。

2023-04-01 11:52:21 2321

原创 linux文件系统——ubifs之ubifs简介(3)

e:LEB size,说的是逻辑擦除块大小,大家知道nand flash页读页写块擦,一个设备多个块,一个块多个页,一般也都是一个块是64个页,这样算一下无论擦除块大小就是2048 * 64=131072,-e的算法是物理擦除块大小 -2 * 页大小(block size - 2 x page_size)),这里就是131072 - 2 * 2048 = 126976(124KB)个,需要减去2个坏块保留块,减去1个wear-leveling块,还要减去1个eba的块,等等,比如最终的值是1020。

2023-04-01 11:52:08 1378

原创 linux文件系统——ubifs之ubi子系统初始化(2)

UBIFS使用日志的目的是为了减少对flash index(main area区的文件的索引,实际索引)的更新频率,因为更新文件系统时,一旦添加叶子节点,整个文件系统的索引节点都要定期更新,这样的话会非常影响效率。TNC树是日志区在内存中的一个拷贝。Ubi用户卷上一般分6个区域,sb占一个PEB(该卷的LEB0),master占用两个PEB(改卷的LEB1和LEB2),Journal区占PEB数量不定,LPT占用PEB数量在创建文件系统后确定,孤儿区一般占用一个PEB,其余PEB供main area用。

2023-04-01 11:50:46 808

原创 linux trace学习(二)——trace使用

备注:1. Kernel版本:4.19.1232. 使用工具:Source Insight 4.0。

2023-04-01 11:45:32 4791

原创 linux trace学习(一)——trace配置及描述

备注:1. Kernel版本:4.19.1232. 使用工具:Source Insight 4.0。

2023-04-01 11:42:36 4480

原创 linux之oops

【代码】linux之oops。

2023-04-01 11:39:59 255

原创 linux oops案例分析

第一行含义:这个oops 发生在cpu0,当前运行的进程是 732号 进程 alpha_vslam,Tainted 标识为 “G” 和 “O”,内核版本号是4.19.123。由上可知,函数 arobot_msgctl_open的地址为 0x00001730,若 0x00001730 + 0x6c = 0x0000179c,由此可知问题出处为——由于我们的是驱动出现的问题, 那么我们就用gdb直接调试驱动的 KO 文件, 如果是源内核出现的 OOPS, 那么只能用 gdb 对 vmlinux 文件进行调试。

2023-04-01 11:39:21 575

原创 linux之panic与oops

panic 是英文中是惊慌的意思,正如其名,不知道如何走了, 它会尽可能把它此时能获取的全部信息都打印出来, 为开发人员调试提供帮助.有两种主要类型 Kernel panicHard Panic(也就是Aieee信息输出)Soft Panic(也就是Oops信息输出)

2023-04-01 11:35:55 416

原创 linux pstore 存储内核崩溃日志

在系统运行过程中,如果内核发生了panic,那么开发人员需要通过内核报错日志来进行定位问题。但是很多时候出现问题的时候没有接调试串口,而报错日志是在内存里面的,重启后就丢失了。所以需要一种方法,可以在系统发生crash时,将crash info保存于非易失存储器中。这对分析那种小概率且没办法抓到现场的问题非常实用,尤其是现在智能互联网的设备逐渐普及的时候,远端的设备可以自己捕抓崩溃日志再通过网络传输到服务器,维护人员就可以根据收集来的日志定位和解决问题,然后通过OTA让设备升级迭代。内核使用。

2023-04-01 11:32:57 2484

原创 linux V4L2子系统——v4l2架构(7)之V4L2应用编程

V4L2子系统向上提供了很多访问Video设备的接口,应用程序可以通过系统调用访问Video设备。但由于Video设备千差万别,很少有设备驱动程序能支持所有的接口功能,因此在使用之前,需要了解设备驱动程序支持的功能。...

2022-06-19 17:44:02 1280 1

原创 linux V4L2子系统——v4l2架构(6)之videobuf2

videobuf2抽象层向用户空间提供了标准POSIX I/O系统调用,包括read、poll及mmap等,同时还提供了大量与流式I/O相关的V4L2 ioctl调用,包括缓冲区分配、缓冲区入队、缓冲区出队及流控制。

2022-06-19 17:42:05 1048

原创 linux V4L2子系统——v4l2架构(5)之v4l2_device与v4l2_subdev异步机制

在soc中的视频处理一般由多个ip组成,比如cis_dphy、mipi_cis、isp、sensor等,甚至更多的ip, 这样就导致了v4l2的复杂性。在v4l2中的视频数据流是有方向和顺序的,因此在linux中引入了异步注册机制。异步注册的核心在于设备树引入port接口,在子设备中有一个或多个port接口,port接口就是子设备的纽带。...

2022-06-19 17:34:51 2711 1

原创 linux V4L2子系统——v4l2架构(4)之v4l2_subdev

V4L2从设备使用struct v4l2_subdev结构体表示。一个V4L2主设备可能对应多个V4L2从设备,所有主设备对应的从设备都挂到v4l2_device结构体的subdevs链表中。对于视频设备,从设备就是摄像头,通常情况下是I2C设备,主设备可通过I2C总线控制从设备,例如控制摄像头的焦距、闪光灯等。...

2022-06-19 17:32:11 3919 2

原创 linux V4L2子系统——v4l2架构(3)之video_device

在V4L2子系统中,Video设备是一个字符设备,设备节点为/dev/videoX,主设备号为81,次设备号范围为0-63。在用户空间,应用可以通过 `open/close/ioctl/mmap/read/write` 系统调用操作Video设备。

2022-06-19 17:29:54 2930

原创 linux V4L2子系统——v4l2架构(2)之v4l2_device

V4L2主设备实例使用struct v4l2_device结构体表示,v4l2_device是V4L2子系统的入口,管理着V4L2子系统的主设备和从设备。简单设备可以仅分配这个结构体,但在大多数情况下,都会将这个结构体嵌入到一个更大的结构体中。...

2022-06-19 17:15:52 912

原创 linux V4L2子系统——v4l2架构(1)之整体架构

V4L(Video for Linux)是Linux内核中关于视频设备的API接口,涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本,经过修改bug和添加功能,Linux内核2.5版本推出了V4L2(Video for Linux Two)子系统,功能更多且更稳定。...

2022-06-19 17:12:25 3814

原创 linux V4L2子系统——v4l2的结构体(6)之整体拓扑关系

linux V4L2子系统——v4l2的结构体(6)之整体拓扑关系

2022-06-19 17:06:19 432

USB转VGA驱动

万能的VGA驱动

2017-06-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除