- 博客(84)
- 资源 (16)
- 收藏
- 关注

原创 高通ais over hab高概率导致安卓系统起不来原因分析及解决方案
原因在于ais的数据通道内存是安卓分配, client进程crash后,释放流程很大概率会先释放数据通道,再释放控制通道。如果数据通道释放后,这块内存又被分配给内核其他模块使用,但此时控制通道还没有释放,即qnx不知道数据通道释放了,他还往上面填充摄像头数据,导致安卓kernel panic。b)ais的数据通道的建立。安卓端会从ion申请dma_buf(一个buf存放一帧数据),然后会将dma_buf的物理页帧号告知qnx,然后qnx端就可以将摄像头数据放到这块内存上,再通过控制道通通知安卓端。
2024-01-10 17:10:47
2024

原创 高通guestOS与hostOS通信框架HAB源码分析——概述
相当于俩端建立了一个连接。如下图所示,qnx,quest_shm@开头的都是HAB physical channel对应的共享内存设备树节点,qnx,quest_shm@xxx节点保存有共享内存的地址(即guestOS看到的物理地址,实际是hostOS的虚拟地址)和通信相关的中断向量信息(guestOS和hostOS通过中断通知对方共享内存上有数据处理)。首先是不同服务的physical channel不同,比如摄像头服务有专门的physical channel,硬编解码服务也有专门的物理channel。
2024-01-04 15:40:12
4994
4

原创 深入内核buddy分配器(芯驰X9/杰发8015 buddy系统明明还有几十M到100多M内存,却分配4k内存失败)
根据log+faddr2line定位到,调用栈为__alloc_pages_slowpath——》get_page_from_freelist——》zone_watermark_fast。2)可以看到28.489040] 265014 total pagecache pages 很大,可以手动drop cache释放内存。可以看到buddy内存低于一定水平,又不能立即触发kswapd回收内存就会失败。如上图内核打印分配4K内存失败,但是normal 类型的buddy系统还有大量内存。
2023-10-31 17:35:12
352

原创 rtos移植到英飞凌tc27x 多核板子(CSA需要注意的问题)
最近freertos已支持SMP,项目需要将它移植到英飞凌tc27x。发现任务没有绑定核,总是会crash。翻了很久文档才找到原因。修正后,运行效果如下图,原因如下下图:运行效果:原因:这是官方datasheet,如上所示,只能在core1和core2之间任务可以在俩个核上调度,任务在core1或core2上跑后,不能再被core0调度,否者会crash。因此,可以将某些任务绑定到core0,某些任务同时绑定core1和core2俩个核。printf(" Starting co
2022-03-28 14:17:48
2462
5

原创 全志r328s1 freertos平台,slab内存管理源码剖析
Linux的内存管理其实也是slab。但是相比较rtos,Linux做了虚拟内存管理(需要硬件MMU,比如MMU的缺页异常)。这里我们只分析slab,个人感觉从rtos入手来学习操作系统是比较明智的,这都是题外话。内存管理分为页管理(每页4k)和slab管理(每个slab_zone 32k,即8个pages)。比如程序需要申请8字节内存,需要先申请一个slab_zone,即8个pages的内存,再从该slab_zone分配8字节出来。首先,我们看内存管理的入口,如下:很明显,入口函数先确
2021-06-27 11:47:16
879
1

原创 精通安卓 linux USB编程
安卓USB编程从入门到精通,安卓USB转串口编程。linux USB编程。了解原理,拒绝做代码的搬运者。https://edu.youkuaiyun.com/course/play/23771
2019-07-07 16:46:15
387
1

原创 安卓自定义view之——可滑动时间轴(时间刻度尺)
如果需要解决在viewpager,horizontalscrollview中滑动事件的冲突,可注入viewpager,horizontalscrollview对象,在down的时候调用requestdisallowInterceptDispatch() 好了先看效果图 看代码:自定义view类package com.example.viewpager;impor
2015-08-21 14:38:12
8789
原创 安卓给新添加的native进程配置SeLinux policy
mk文件添加SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS += vendor/xxx/app/apnState/sepolicy/xx/private。
2024-10-28 09:03:44
171
原创 c++模板偏特化及function_traits检测模板函数返回值和参数合法性
【代码】c++模板偏特化及function_traits检测函数返回值和参数合法性。
2024-10-14 16:12:12
143
原创 c语言如何回调c++非静态成员函数
最开始直接将类成员函数指针强转为普通的函数指针,发现在某些平台编译器会报错。在ubuntu、安卓、MTK LINUX测试未发现问题。如何将c++成员函数作为回调函数,传递给c语言调用?最终发现如下方式可以骗过编译器,不再报错。方案有效,可以参考借鉴。
2024-09-24 19:30:28
469
原创 iceoryx内存管理之——mempool的管理方法
第一次分配,将分配mHead= 0 ,即ID等于0的这块内存,分配后,mHead=m_NextFreeIndex[0]=1,然后m_NextFreeIndex[0]=0用于标记内存已被分配。如下图所示,iceoryx将内存划分为不同大小的内存池进行管理,比如,你需要申请120个字节的内存,最终将从memPool-1中分配一块内存给你。举例说明,如上图,它使用名为m_NexrFreeIndex的数组来链接所有可分配的内存,他的管理思想是,数组的每一项保存了下一块可分配内存的ID。
2024-08-15 16:50:27
296
2
原创 f_iap2.c
** Author:*/int online;int error;NULL,NULL,NULL,if (!req)if (!return req;if (req) {return 0;} else {return -1;req = 0;} else {return req;= 0)= 0)int i;if (!ep) {if (!
2024-08-12 16:21:36
366
2
原创 ss工具dump出vsock 端口号异常分析
难道是内核把端口改了?分析内核态源码,ss最终获取的vsock信息通过内核态vsock_dia_dump函数得到,该函数dump了vsock_dump_table(这是个数组链表),vsock_bind函数最终会把vsock信息保存到其中,期间并没有修改port。发现它修改了port,板子是小端,调用htons后,port变为大端,即9000(0x2328)被修改为0x2823(也就是10275)
2024-07-12 11:24:09
316
原创 mtk8675 安卓端assert函数的坑
8675 安卓端, assert(pthread_mutex_init(&mutex_data_, &mattr) == 0);用这行代码发现pthread_mutex_init函数没有被调用,反汇编发现不光没调用assert,pthread_mutex_init也没调用。直接pthread_mutex_init(&mutex_data_, &mattr) 这样调用就正常。
2024-06-18 14:03:22
251
原创 数据溢出导致的pthread_cond_timedwait工作异常
/tv_nsec的最大值是999999999,这里直接加300毫秒,大概率会溢出,如果溢出应该把ts.tv_sec加1。
2024-06-17 13:59:55
309
原创 编写一个llvm编译器插件,完成在store汇编指令前对内存合法性的check。
本插件可以检测到app是否在写共享内存,如果是,我们可以让app assert。// 生成日志函数 的参数列表。// 可以在这里添加插桩的相关信息,例如标记插桩的名称或其他属性。// 如果需要追踪插桩的执行情况,可以在这里添加分析或者断言。// 在mov指令前插入一个空的call指令作为插桩。// 创建自己的日志函数 并传入 本函数的函数指针。// 自己定义的 日志函数。// 该函数的指针变量。
2024-05-24 17:42:22
1077
2
原创 如何在yocto编译环境,让你的工作效率提升100倍甚至1000倍
bitbake工作流程基本就是,把代码,和工具链,和依赖的其它模块拷贝到build目录下,然后在build目录下执行编译工作。既然这样,我们可不可以直接在build目录下,修改项目源代码,并编译它呢?痛点2)如果编译的源码是从服务器下载下来的,而且假设它有bug的话,我们无法修改源代码。痛点1)每次执行bitbake xxxModule 都很耗时。
2024-05-20 10:03:25
469
原创 yocto bb文件直接编译压缩包里面的源码
# FILES 表示这个软件包,需要打包进映像的文件是hellocmake,但决定这个软件包是否参与打包,需要在其他地方配置。# # FILES 表示这个软件包,需要打包进映像的文件是hellocmake,但决定这个软件包是否参与打包,需要在其他地方配置。# 默认就已经继承base.bbclass,以下语句可以省略。# 默认就已经继承base.bbclass,以下语句可以省略。# 这里必须添加,默认S路径不一样为 ${B}# 这里必须添加,默认S路径不一样为 ${B}readline库编译。
2024-04-03 17:27:28
636
原创 yocoto bb文件传自定义变量给cmakelist.txt
这里 MY_CUSTOM_VARIABLE 是你想要在 CMakeLists.txt 中使用的变量名,而 ${MY_CUSTOM_VALUE} 是你想要传递的值。这通常是通过设置 EXTRA_OECMAKE 变量来实现的,该变量允许你向 CMake 命令行添加额外的参数。然后,它打印出变量的值,以便你可以在 CMake 的配置输出中看到它。# FILES 表示这个软件包,需要打包进映像的文件是hellocmake,但决定这个软件包是否参与打包,需要在其他地方配置。bb+cmake的bb文件demo。
2024-04-03 17:16:05
943
原创 linux gles+egl+wayland demo
代码直接用安卓开机动画源码修改的,将surfaceflinger修改为wayland。// 是否为一个有效的压缩纹理信息。
2024-03-28 08:36:15
991
原创 Linux系统明明还有足够的物理内存,调用fork却返回ENOMEM
overcommit_ratio可以在/proc/sys/vm里设定,默认是50,也就是CommitLimt默认是0.5倍的总物理内存。使用systemtab hook fork,定位到报错调用路径SYSCALL_DEFINE0(fork)-》kernel_clone-》copy_process-》copy_mm-》dup_mm-》dup_mmap-》security_vm_enough_memory_mm-》__vm_enough_memory。如果有足够可用的物理内存供使用,则内存分配成功,否则失败.
2024-01-28 19:05:30
771
原创 如何从RTP包的AP类型包,获取h265的PPS、SPS、VPS信息
ffmpeg播放rtp流,为了降低首开延迟,需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。下图中红色部分是分隔符,橙色是VPS,黑色是SPS,黄色为PPS。根据如上信息,我们可以解析AP包,效果如下。
2023-12-28 17:26:36
1697
原创 pulseaudio是如何测试出音频延迟的
我们可以实时获取声卡的clock,计算出声卡实际已经处理了多少音频数据,然后应用层往驱动write了多少数据。这俩个数据的偏差,其实就是音频延迟。那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。
2023-11-24 16:39:12
1188
1
原创 PulseAudio 异步方式播放音频,并控制流的软件音量
default:break;break;break;v += 10000;v = 30000;lastT = tm;int neg;int r;double amp;#if 0for (a=0;a++) {
2023-10-25 16:07:02
666
原创 cmake获取git tag和commid id作为软件版本
通过git获取版本宏 BUILD_TAG_VERSION。# 通过git获取版本宏 BUILD_LOG_VERSION。
2023-08-24 11:19:34
289
原创 安卓如何快速定位native内存泄露。
步骤2)setprop libc.debug.malloc 1 && setprop libc.debug.malloc.options "backtrace leak_track verbose" && setprop libc.debug.malloc.options.program ais_test_hidl(要测试的可执行文件名)后面的泄露比前面的泄露多大概20次,就大概率是泄露。通过泄露的stack快速定位到泄露点。步骤1)cat /proc/pid/status,观察下面俩个指标。
2023-08-11 15:50:47
539
原创 多开引擎virtualAPP适配安卓9到安卓11
github上的virtualApp只兼容到了安卓8,需要自己适配安卓9到11的hook机制。
2023-06-28 15:47:30
1139
6
原创 记录一次安卓unix domain socket卡死,导致整个系统卡死的问题
2)使用ss工具查看该uds的缓冲区,发现居然是0。猜测是需要打开内核模块的某个配置才行。找到缓冲区数据结构的关键信息,反推内核源码,发现是需要打开CONFIG_UNIX_DIAG。1)dump出monkey的call trace,发现是unix socket write阻塞。分析内核源码,发现只有缓冲区满了,才会阻塞。
2023-04-13 20:58:07
423
原创 android native层使用mediacodec(硬编解码) mediamuxer mediaExtractor做转码工具。
native mediacodec
2022-08-17 11:14:00
1358
原创 Linux 动态库更新需要注意的坑
linux VFS快速入门,请参考我的博客如何在linux添加一个最简单的自己写的文件系统。源码今日头条,视频演示https://m.toutiaoimg.com/i6753964400429761031/?gd_ext_json=%7B%22enter_from%22%3A%22click_creation_center%22%2C%22category_name%22%3A%22creation_center%22%7D&enter_from=click_creation_center&am..
2022-04-02 11:13:21
5016
1
转载 arm 1b
在启动脚本里面经常出现1b 这个东西,找了很久一直不知道是什么,下面帖子讲的很好,于是转载了转载地址:http://blog.chinaunix.net/uid-20551291-id-1926997.htmlhead.S中初始化内存有以下一段程序:ENTRY(memsetup)@ initialise the static memory@ set memory control registersmovr1, #MEM_CTL_BASEadrlr2, mem_cfg_v...
2022-03-14 11:44:09
157
原创 打通Linux内存管理任督二脉
1)MMU的作用?什么是页表?如何编程使用MMU?什么是虚拟地址、物理地址、链接地址? 2)内核的MMU初始化过渡阶段,即CPU使用物理地址转换为使用虚拟地址的过程。 3)内核内存管理buddy+slub是如何管理内存?(struct page结构体如何关联虚拟地址与物理地址) a)虚拟地址与物理地址的转换。 b)高低端内存映射。 4)用户空间进程如何做到3G虚拟地址空间独立? 5)用户空间内存申请过程。为什么要这么做? 6)dma_alloc_coherent 与kmall...
2022-03-04 16:05:10
808
原创 cmake获取git tag,git log
# 通过git获取版本宏 BUILD_TAG_VERSIONexecute_process(COMMAND git describe --tags TIMEOUT 5 OUTPUT_VARIABLE GIT_TAG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)message(STATUS "building from git tag ${GIT_TAG_VERSION}")add_definitions(-DBUILD_TAG_VERS.
2022-01-29 14:49:14
790
ksoap2-android-assembly-3.4.0-jar-with-dependencies
2015-11-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人