- 博客(32)
- 资源 (10)
- 收藏
- 关注
原创 一个alignment trap的解决办法
原因是ARM对ldr指令访问内存时要求4字节对齐,根据r4+0x181=0xd0b02181,这个地址不是4字节对齐的,所以arm触发了alignment异常。由于使用了1字节对齐(为了节省内存),所以访问status成员时,就访问了4字节对齐偏移1字节的地址了。运行效率变低了(时间换空间)。
2025-04-03 14:35:53
840
原创 Linux启动之__vet_atags
__vet_atags是ARM Linux启动流程中的关键验证环节,通过严格的指针检查保障内核稳定启动。其设计平衡了传统ATAGS与现代DTB的兼容性,同时为未来安全性和灵活性扩展预留空间。
2025-03-24 20:46:42
284
原创 如何通过crash工具查看中断发生的次数
由于内核开启了CONFIG_SPARSE_IRQ选项,gic采用radix tree管理irq_desc,并保存在了全局变量。找到我关心的arch_timer中断,这里有两个中断号16、17,为简便,我只分析中断16发生的中断次数。这样我们就查到了中断16分别在CPU0和CPU1上发生的中断次数了。radix tree的数据都存在rnode中。硬件:ARM GIC V2 / 双核CPU。,它就是我们要找的统计中断发生次数的成员。结构体很长,但我们只需要关心。Linux版本:4.19。
2025-03-22 12:07:45
694
原创 对于DeepSeek关于中断线程化提问的回答,你给几分?
否则,即使中断已经被处理,硬件可能仍然认为有未处理的中断,导致中断处理程序被重复调用,甚至可能阻止新的中断触发,因为某些硬件设计需要在清除标志位后才能接收新的中断。通常,硬件中断被触发后,需要软件清除中断标志,否则硬件可能会持续触发中断,导致中断风暴。如果不清除,可能会导致后续的中断处理逻辑混乱,比如重复处理同一个中断,或者在中断共享的情况下影响其他设备的中断处理。但即便如此,如果中断处理程序没有正确清除状态,可能会导致后续的中断无法正确识别,或者状态寄存器中的标志位残留,影响后续的中断处理。
2025-03-15 00:28:31
578
原创 mmap引起的内存泄漏分析
根据客户提供的/proc/meminfo数据发现,MemAvailable 由294072kB减小至18128kB,减小约269MB,引起该变化的最直接原因是PageTables由61416KB增加到了334460kB,增加约266MB。同时观察Aon和Slab的变化,均未出现明显的增加,由此可判定,内存单纯的消耗在了PageTables项了。为进一步分析,让客户提供了/proc/vmallocinfo信息,发现ioremap的次数并不多,所以推测可能是用户态做了重复的mmap映射,并让客户自查代码。
2024-06-14 14:05:45
491
原创 linux container_of宏
通过Student stu定义stu变量后,我们可以通过stu.id或stu.name来获取stu的成员。但如果想反过来,通过stu.id或者stu.name来获取stu的起始地址好像就没那么简单了,linux中的container_of宏的作用就是为解决此问题而生的。idPtr实际就是stu变量的地址,namePtr对应的是stu.name地址,mathPtr对应的是stu.math地址。ptr: 第三个参数member的地址,这里可以理解为&stu.id或&stu.name;
2024-05-08 21:55:12
421
原创 linux fixmap分析
Linux内核启动过程中,经过汇编阶段后,mmu功能已经开启,后续只能通过虚拟地址来访问DDR,但是此时能够访问的地址范围有限,只有idmap和swapper部分可以找到物理地址,其他没有通过MMU映射的虚拟地址是无法访问的。fixmap就是为了解决在正式建立所有物理内存映射之前,实现early console、FDT映射、early ioreamp、paging init等过程中使用虚拟地址问题的。
2024-04-08 10:44:04
346
原创 linux启动之__lookup_processor_type
_lookup_processor_type_data描述了__proc_info的信息:1. __lookup_processor_type_data地址;2. __proc_info_begin地址;3. __proc_info_end地址;4. __lookup_processor_type_data的大小;/** Note!* NOTE!*/
2024-03-29 20:03:11
851
原创 Linux启动之__mmap_switched
总结下来,主要干了两件事情:1. 清除.bss2. 保存process ID/Machine type/DTB地址。
2024-03-28 20:50:45
178
原创 gdb 定位coredump中so库的位置
libddd.c#include <stdio.h>#include <string.h>int fun_dll(){ void *pTmp = NULL; printf("In dll\n"); memcpy(pTmp, 0, sizeof(100)); return 1;}gdbso.c#include <dlfcn.h> #include <stdio.h>typedef int (*LPFun) (
2022-03-12 12:12:25
4838
原创 Linux pstore实现自动“抓捕”内核崩溃日志
说明:本文基于内核:linux-4.19.125概述最近因工作关系,启用了linux的pstore功能。pstore的主要功能是存储linux内核崩溃前的内核日志,具体可参考内核文档介绍:linux-4.19.125\Documentation\admin-guide\ramoops.rst也可以参考宋宝华老师的博客:Linux pstore 实现自动“抓捕”内核崩溃日志_宋宝华-优快云博客在原理方面,宋宝华老师写的非常详细。我这里仅记录我的操作总结。总体来说,分为4步
2021-10-22 17:02:32
6742
5
原创 在glibc中添加自定义so
需求在glibc中添加一个mytest so文件1. 创建mytest文件夹~/projects/tstglib/glibc-2.25$ mkdir mytest2. 修改Makefile~/projects/tstglib/glibc-2.25$ vi Makeconfig2.1 确保生成libmytest.so# List of non-library modules that we build.built-modules = iconvprogs iconvdata l..
2021-09-17 16:16:12
384
转载 Linux Hung Task分析
Linux Hung Task分析来源:Linux Hung Task分析本文章向大家介绍Linux Hung Task分析,主要包括Linux Hung Task分析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。经常会遇到内核打印“INFO: task xxx:xxx blocked for more than 120 seconds.”这样的log信息,这是内核的hung task机制在起作用。hung task机制通过内核线程khungt
2021-09-14 15:25:29
1141
原创 编译busybox
本文基于:busybox-1.32.0交叉编译器:arm-linux-gnueabi-下载busybox-1.32.0后解压:tar xjvf busybox-1.32.0.tar.bz2选择[*] Build static binary (no shared libs)保存退出,生成.config文件。编译# make CROSS_COMPILE=arm-linux-gnueabi-# make install CROSS_COMPILE=arm-linux.
2021-09-10 19:50:28
249
原创 busybox添加自定义applet
本文基于:busybox-1.32.0添加自定义applet的说明请参考busybox源码下的 docs/new_applet-HOWTO.txt 文档步骤:(1) 、在适当的目录编写 applet 代码#~/projects/busybox-1.32.0$ mkdir myapplet#~/projects/busybox-1.32.0$ cd myapplet#~/projects/busybox-1.32.0/myapplet$ vi myapp.cmyapp.c#inc
2021-09-10 19:36:17
444
原创 Linux kernel模块(.ko)实现unix domain socket通信(server)
Linux kernel模块(.ko)实现unix domain socket通信(server)ko server代码:srv.c#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/socket.h>#include <linux/net.h>#include <linux/un.h>
2021-09-08 16:09:55
899
转载 [转]ARM MOV指令对立即数的要求
MOV R1,#9 以上指令表示把9传送到寄存器R1中。需要注意的是,这里的立即数是有要求的,不是说任何一个立即数都可以。要求是:立即数可以由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作immediate,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则immediate=immed_8循环右移(2*rotate_imm)所以,MOV r0, #0xFF, 2这里2是循环右移数,必须...
2021-05-08 07:47:48
1501
原创 RT-Thread MDK开发环境搭建
1. MDK安装MDK下载路径:https://www.keil.com/download/product/注意:安装路径不能有空格否则会安装失败。安装成功2.Keil MDK模拟器STM32F103下载地址:https://www.rt-thread.org/document/site/tutorial/quick-start/stm32f103-simulator/rtthread_simulator_v0.1.0.7z然后等待导入结束3. 下..
2021-05-02 10:50:23
2713
原创 标准及论文获取方法
标准及论文是工程师进行研发及创新的重要依据。标准可以分为国际标准、国家标准、行业标准、地方标准或团体标准等不同的层级,论文也包括会议论文及期刊论文等不同类型。1 国际标准国际标准是指国际标准化组织(ISO)、国际电工委员会(IEC)和国际电信联盟(ITU)制定的标准,以及国际标准化组织确认并公布的其他国际组织制定的标准。比如我们熟悉的3GPP制定的LTE-Advanced标准,经过ITU评估认证为IMT-Advanced后,才正式确认为国际认可的4G标准,在全世界范围内通用。1.1 ITU国
2021-04-30 10:48:10
806
原创 arm 将全局变量指定到固定地址
1. 定义全局变量sensorhub_dynamic_table#pragma arm section rwdata="sensorhub_extern_call"volatile xxx_t sensorhub_dynamic_table = { copy_fun_ptr, i2c_rd, i2c_wr, ...};#pragma arm section rwdata关于#pragma arm section的使用可以参考《#pragma arm sec...
2021-04-30 10:44:29
2153
原创 Crash 工具使用
1. cat sysdump.core* > vmcore2. crash -m phys_base=0x80000000 vmlinux vmcore crash -m phys_base=0x80000000 --cpus=2 --no_data_debug sysdump vmlinux crash64 -m phys_offset=0x80000000 --no_data_debug sysdump.core symbols/vmlinux3. crash常用命令: .
2021-04-19 10:06:08
1148
原创 Python获取行号/函数名/文件名
实现:import inspectget_line = lambda :inspect.getframeinfo(inspect.stack()[1][0]).linenoget_file = inspect.__file__get_func = lambda :inspect.getframeinfo(inspect.stack()[1][0]).function调用get_line()测试#encoding=utf-8import inspectget_line =
2021-03-05 18:23:55
1055
原创 百度AI 文字识别示例
百度AI 文字识别示例#encoding=utf-8from aip import AipOcr""" 你的 APPID AK SK """APP_ID = '你的app id'API_KEY = '你的api key'SECRET_KEY = 'CkuOy82dFdkg50bsIivmz4jRdf1xCXZ0'img_file="C:\\1.jpg"client = AipOcr(APP_ID, API_KEY, SECRET_KEY)""" 读取图片 """def get_f
2021-03-04 10:30:43
419
1
原创 Python读写tty设备
环境Linux + Python 2.7import osimport sysimport selectMAX_READ_CNT = 256def write(dev, endl="\r", timeout=5 #seconds ): try: tty = os.open(dev, os.O_RDWR) while True: at = raw_input() #input() Python 3.x if at.lower() in ["quit",
2021-03-02 17:58:15
1124
原创 如何使用C/C++为Python编写DLL
1. 使用C/C++编写DLLVS创建一个Win32 Project选择DLl,勾选Empty Project新建test.h#ifndef _TEST_H_#define _TEST_H_int sum(int, int)int sub(int, int);#endif新建test.cpp#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int sum(int a, int b) { re
2021-02-26 14:52:49
353
原创 OpenCv漫水填充floodFill详解
函数原型int cv::floodFill ( InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect * rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), ...
2018-07-09 10:56:27
33406
10
原创 OpenCV threshold函数详解
threshold函数作用:去掉噪,例如过滤很小或很大像素值的图像点。threshold函数原型:double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );参数说明:src:原图像。dst:结果图像。thresh...
2018-07-03 17:33:56
100959
3
C Programming.rar
2021-04-14
OpenCV threshold Demo code V2
2018-07-04
OpenCV threshold Demo code
2018-07-03
Computer Vision with OpenCV 3 and Qt5 pdf + code
2018-05-29
Learning Image Processing with OpenCV pdf + code
2018-05-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人