- 博客(44)
- 资源 (18)
- 收藏
- 关注
原创 Linux下内存泄漏定位方法
Linux下内存泄漏可分为用户空间的内存泄漏和内核空间的内存泄漏。用户空间内存泄漏的查找方法: 第一步,查找内存泄漏的应用程序。 首先,写一个简单的内存泄漏程序(每秒钟泄漏4MB)umemleak.c:#include <stdio.h>#include <malloc.h>#include <unistd.h>#include <string.h>int main(){ char *ptr = NULL;...
2021-04-13 16:10:59 8106
原创 一种usb转串口热拔插支持方法
硬件上来说,可热插拔的设备一般都会对电源部分格外重视,除了包含防止插拔的过程中对正负极可能造成的意外短路之外,热插拔还要保证电源负极先于其他引脚连接进系统,提供ESD放电回路。然后连接进的是电源正极,为系统供电。稍稍延时后,再将整个电路连接进主系统。尽量确保在数据线上不会产生有害的浪涌损坏设备。而对于DB9串口来说,它的所有脚是同时引入系统的。而且在接口电路中没有任何保护措施,这样的话在热插拔之后,可能会对系统造成不良影响甚至损坏系统。 软件方面,以USB为例。操作系统对于USB设备有着非...
2020-12-01 10:01:02 1248
原创 一图讲解FAT文件系统的存储空间分布
一图讲解FAT文件系统的存储空间分布:(注:详细了解各种文件系统,请参考书籍:《数据重现:文件系统原理精解与数据恢复最佳实践》)
2020-11-20 10:23:55 783
原创 介绍一下内存泄漏工具valgrind的使用
valgrind是一款开源内存检测的工具,里面包含了很多的工具,一般使用Memcheck这个工具偏多;Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。注:代码编译时我们要带上参数-g,有了符号表才可以显示行号这些东西;valgrind工具命令参考:valgrind --tool=memcheck --leak-check=full --show-..
2020-09-15 15:39:38 436
原创 Linux信号量+共享内存(有名,非匿名)使用示例
信号量+(有名,非匿名)共享内存使用示例:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>...
2020-04-23 11:43:47 444
原创 uinput使用示例
uinput示例,编译好后运行,10秒内打开空白文本文件,10秒后会在文本文件里输入“l”字符。示例源码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <l...
2020-04-23 11:33:05 982 1
原创 linux 应用程序的毫秒级延时函数实现
已验证。供参考:头文件:#include <sys/select.h>函数:static void sleep_ms(unsigned int secs){ struct timeval tval; tval.tv_sec=secs/1000; tval.tv_usec=(secs*1000)%1000000; select(0,NULL,NULL,NULL...
2020-04-23 11:28:57 1324
原创 利用宏定义在源程序中转化已定义函数增加调试信息的方法
有段时间没写博客了,写个调试方法留作纪念。下面这个方法,特别是内核驱动代码,在去查某个源文件中,所有调用读写寄存器,readl、writel等,挺有用。方法类似,在printk加入一个 count++的静态寄存器,可在log显示读写的过程顺序。方法简单提取如下://a.cint func(int n){ return 34;}//a.h#ifndef _A_...
2019-10-19 15:05:45 230
原创 64位Linux系统跑32位程序,arm-linux-gnueabi-gcc: error trying to exec ‘cc1’解决
arm-linux-gnueabi-gcc: error trying to exec ‘cc1’: execvp: 没有那个文件或目录因为我的系统是Linux 64位的,而以上运行的程序是32位的。解决办法,安装lib32ncurses5 lib32z1lib32stdc++6:soduapt-getinstalllib32z1sudoapt-getinst...
2019-05-30 07:50:12 2920
原创 Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)
以下讲的pinctrl子系统框架包括3点,1. pinctrl子系统简介;2.pinctrl子系统的注册;3. 设备驱动匹配时,probe执行前的管脚自动配置。写博客不易,如若转载,请注明出处。一、pinctrl子系统简介 在arm的各种soc芯片中,往往可以看到1个pin引脚,既可以作为GPIO,也可以作为spi、i2c、uart总线中的1根引脚,即该引脚是可以复用为不同功...
2019-05-08 01:59:34 3351 3
原创 Linux中断子系统框架流程详解(基于Kernel 3.16,arm,设备树)
这里主要讲3点,1. 中断的初始化详细过程;2. request_irq、request_threaded_irq等中断函数的注册;3. 硬件中断产生时从中断向量入口开始的处理流程。写博客不易,如若转载,请注明出处。一、中断控制器的初始化详细过程从main.c (init) 中的 asmlinkage __visible void __init start_kernel(void)开始,看...
2019-05-01 12:58:38 1107
原创 关于int open(char *filename, int flags, mode_t mode); 的flags参数说明
这里写自定义目录标题关于int open(char *filename, int flags, mode_t mode); 的参数flags:关于int open(char *filename, int flags, mode_t mode); 的参数flags:O_RDONLY :没有文件时返回 -1;有文件时跳过,并且保留文件原来内容O_WRONLY :没有文件时返回 -1;有文件时跳过...
2019-02-22 23:39:24 2026
原创 关于gcc的扩展宏定义中, "#" 和 "##"的含义
"#" 代表和一个字符串相连接 "##" 代表和一个符号相连接,符号可以是变量,或另一个宏符号举例如下:#include<stdio.h>#define FILE_NAME "/dev/tty"#define FILE_NAME2 "/dev/console"// '#' use example#define FILE_OPEN1(fd,n) \{ \ fd =...
2018-03-19 22:10:18 1875
原创 一种编译时自动生成时间来实现软件版本管理的方法
多数情况下,我们在进行软件版本的迭代更新时,除了定义软件版本号外,还会定义个编译的时间点。但是如果通过数组定义编译时间,每次编译我们都需要手动修改,非常麻烦,而且有时候,还会忘记。其实我们不需要这么复杂,编译器一般都会提供一个宏用于自动获取编译时间。例进行说明:ANSIC标准定义了以下6种可供C语言使用的预定义宏: __LINE__ ...
2018-03-19 20:56:43 1480 1
转载 块设备剖析之BIO
原文链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=30282771&id=5144166本文所有内容均基于内核版本Linux-v3.2.40。 本文主要对BIO结构体作基本说明,并重点分析bi_io_vec向量及其用法。 1. BIO结构体如下所示:struct bio { sector_t...
2018-03-17 22:29:55 932
原创 linux块设备驱动程序示例(适用于高版本内核3.16.0 - 3.19.0等,亲测可用)
1. 字符设备与块设备的 I/O 操作主要有如下不同点: (1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作。 (2)块设备对于 I/O 请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写。对于存储设备而言调整读写的顺序作用巨大,因为在读写连续的扇区比分离的扇区更快...
2018-03-16 07:21:46 1861 1
原创 Linux kernel bootargs全解
使用命令:man bootparam,可以看kernel支持的所有的bootargs。下面展示其运行后的结果:BOOTPARAM(7) Linux Programmer's Manual BOOTPARAM(7)
2017-12-10 14:15:27 4444
原创 BootLoader给Linux kernel传递的启动参数详解
根文件系统相关启动参数:root #指出启动的根文件系统 如:root=/dev/sda1ro #指定根设备在启动过程中为read-only,默认情况下一般都是这样配的rw #和ro类似,它是规定为read-write,可写rootfstype #根文件系统类型,如:rootfstype=ext4Console和kernel log相关启动参数:co
2017-11-18 16:30:10 3961
原创 程序员提问的智慧(How-To-Ask-Questions-The-Smart-Way)
提问的智慧How To Ask Questions The Smart WayCopyright © 2001,2006,2014 Eric S. Raymond, Rick Moen本指南英文版版权为 Eric S. Raymond, Rick Moen 所有。原文网址:http://www.catb.org/~esr/faqs/smart-questions.h
2017-09-16 08:32:11 1972
原创 一个移植十分方便的malloc函数族的实现
相信学习过c语言的人都知道malloc、free函数,这里就不多说怎么用了。这里要说的是:提供它们的实现。 该实现方法由uboot中malloc等函数的实现改编而来。已经过验证,没有问题。 ------多说一句,该实现支持物理地址malloc、free。。。,不支持虚拟地址的映射 该malloc的源码实现,很方便移植。特别是在BootLoader或者单片机开发过程中,
2017-08-05 08:57:06 6029
原创 kprobes查看内核内部信息的使用方法
优点:以内核模块的方式使用kprobes,可以在任意地方插入探测器,执行包括printk在内的各种调试工作,而无须重新构建内核,也无须重启。相比于printk,是调试内核的有效方法之一。前提:内核必须支持kprobes、jprobes:#make menuconfigGeneral setup --->[*] Kprobes ------这项要选上使内核支持
2017-07-22 18:05:33 555
原创 使用/dev/uinput的简要介绍(含demo程序)
uinput机制有2个很大的优点:1) 不用自己写驱动(比如弄个红外遥控器、车载线控)。2) 创建/dev/input/eventX节点,在用户态下向/dev/input/eventX写入事件,即可模拟键盘、鼠标等的事件输入。操作流程:1)打开UInput Device2)设置UInput Device3)写入设备信息4)创建Input Devi
2017-07-15 08:47:41 5313 4
原创 Linux内核调试之lsof命令和fuser命令
lsof命令简介:lsof(list open files)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以,lsof的功能很强大。一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”。因此通过lso
2017-05-13 09:44:10 4679
原创 一张图看懂Linux内核的“总线-设备-驱动”架构中的设备、驱动函数调用
一张图看懂Linux内核的“总线-设备-驱动”架构中的设备、驱动函数调用:
2017-04-08 00:51:53 1726 1
原创 如何删除svn下载后留下的.svn文件夹
系统:Ubuntu,如何删除svn下载后留下的.svn文件夹?进入要删除的文件夹,输入:find . -type d -name ".svn"|xargs rm -rf这样,就可以递归地删除该文件夹及其子文件夹下的所有.svn文件夹。
2017-04-08 00:34:41 3345 1
原创 make modules_install指定ko安装路径
一句话,如下:make modules_install INSTALL_MOD_PATH=/home/ubuntu/WorkSpace/qemu-rootfs/lib/modules
2017-04-04 22:10:00 16890 3
原创 聊一聊单片机应用程序架构(深度好文)
对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。发现真正使用架构的并不多,而且这类书籍基本没有。好不容易找到份资料,可以参考:《谈谈怎样架构你的单片机程序》。 本人经过摸索实验,并总结,大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直
2017-03-11 00:59:11 10254 5
原创 c程序中多层if嵌套结构的几个优化方法(深度好文)
关于c程序中多层嵌套结构的优化方法,在百度中找来找去,发现写这方面的文章不多。下面就我个人总结出来的几个方法,写出来,与大家分享。也希望看到这篇文章的人,要是有更好的方法,也在底下评论留言。您的一点贡献,也许会帮到困扰中的程序员^_^。有什么不足,也麻烦指出来下,共同进步。最后,打字不易,希望转发的人,注明下原出处,谢谢!
2017-02-19 20:02:31 19321 3
原创 使用gcc给待编译C/C++源码注入宏的2种方法
第一种方法:gcc “源码” -D“你要定义的宏” -o “可执行文件”示例源码://test.c:#include int main(int argc,char *argv[]){#ifdef ZKJprintf("===ZKJ has been defined===\n");#elseprintf("===ZKJ has not been defin
2017-01-21 16:33:39 1361
原创 关于如何在make一个Linux下的C/C++工程时,自动添加版本号、编译日期等信息
本篇的目的:在makefile里,将系统当前的时间传递进待编译的C/C++工程中,用以指示编译执行的时间,以及版本信息等。不多说了,先来看效果:当前时间:编译完成后运行效果:。。。。。。过了3分钟后,再次编译运行:注意箭头指向的时间的变化。下面贴代码:这就是关于如何make一个Linux下的C/C++工程时,自动添
2017-01-20 00:35:23 8173
原创 一句printf搞定一个数组的矩阵输出。
今天在工作的时候,看到一位同事写的一个打印数组输出,矩阵格式的。写得一堆堆的。功能是实现了,但是代码个人感觉不太简洁。。。因此,自己也想了一下。做出了下面的方法,供大家参考。先看下怎么回事:打印输出格式示意:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2
2016-12-16 22:25:01 11776 1
原创 dump_stack介绍以及内核符号表的生成和查找过程
内核中的dump_stack()获得内核中当前进程的栈回溯信息需要用到的最重要的三个内容就是:栈指针:sp寄存器,用来跟踪程序执行过程。返回地址:ra寄存器,用来获取函数的返回地址。程序计数器:epc,用于定位当前指令的位置。本文的内容都是基于mips体系架构的,如果你不搞mips,就只看个大致流程就可以了,不然可能会被某些内容误导。在ARM中,这三个寄
2016-12-11 22:12:18 4220 2
原创 linux内核学习的屠龙刀、倚天剑(需要搭配硬件调试环境)
好久没来这里写博客了。看到浏览量有所增加,十分开心。希望自己的点滴付出对他人能有所帮助。要是有不对的地方,也希望博友能给予点出纠正。要是能获得博友的转发,也希望能注明下原出处。打字不易,在此谢过啦! 下面介绍下2个学习内核时很有用的工具(方法):1.函数:dump_stack(); 内核中,在调试过程中使用printk打印信息当然是最直接的办法。但当我们在刚开始学习内核
2016-10-27 18:21:05 749 1
转载 全面了解 ARM CP15协处理器 (深度好文)
转载自:http://blog.chinaunix.net/uid-14114479-id-3110951.htmlARM926EJ-S/ARM920T 协处理器 CP14, CP15 详解 ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器
2016-07-02 17:22:32 5597 1
原创 下面放一段可以启动的,位置无关的arm bootloader简易启动:
非常好。谢谢分享。下面放一段可以启动的,位置无关的bootloader启动://MakefileFILE_NAME = zkj-loaderSCRIPT_FILE = zkjloader.ldsCROSS_COMPILE=arm-linux-####################################################C compi
2016-06-29 17:18:18 957
原创 汇编和c函数交叉混合调用
有转载的话希望能尊重原创,谢谢各位!以下运行在Ubuntu环境下,需要安装qemu-user,使用arm-linux-gcc编译。////////////////////////////////////////////////////////////////c文件中调用汇编文件中的汇编“函数”/////////////////////////////////////////////
2016-06-19 09:31:58 611
原创 一个优秀的debug宏,更新
调试用的debug宏,更新。可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define MYDEBUG#ifdef MYDEBUG#define myDebug(fmt,...) printf("%s:%s:%05d=>"fmt"",__FILE__,__func__,__
2016-05-18 22:34:18 541
原创 一个移植十分方便的类似printf函数,升级版
升级版,不包含任何头文件,“独立生存\(^o^)/~”。一个十分便于移植的类似printf函数,就当做printf使用就可以了(注:不支持浮点型数),已测试通过。只需要实现SendChar()函数,把你要外发的字符(比如:发送到串口,显示屏等)写在这里即可。供大家使用。打字不易,转载请注明出处,谢谢!//Printf.c/*---------------------------------
2016-05-05 01:32:47 772 1
原创 arm编程,关于C函数中嵌入汇编和寄存器变量的混合使用方法。用汇编透视c语法操作
arm编程,关于C函数中嵌入汇编和寄存器变量的混合使用方法,例子简单,但是十分有启迪作用,自己看就明白了,编译工具:arm-linux-gcc,方式:arm-linux-gcc -S main.c -o main.s。源码如下。编写不易,倘若转载,请注明下出处,谢谢!//main.c#include void main(void){ register int Regx asm("r
2016-04-29 00:26:44 952 1
原创 一个优秀的debug函数(宏)
调试用的宏debug函数(宏),可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define debug(argc,argv...) ({printf("%s:%s:%05d=>",__FILE__,__func__,__LINE__);printf(argc,##argv); })
2016-04-24 10:26:53 4826
malloc的实现源码
2017-08-03
可方便移植的printf,升级版.c
2016-05-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人