![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 66
侵蚀昨天
https://mp.weixin.qq.com/s/2f8b5pAwEZ6lnpiITZhakQ
展开
-
ELF文件格式解析
ELF格式分析原创 2023-07-11 11:15:21 · 4178 阅读 · 0 评论 -
shell脚本中getopt介绍
getopt命令原创 2022-12-02 14:10:23 · 1557 阅读 · 0 评论 -
linux等待队列wait queue
linux内核的等待队列是在内核中运用非常广泛的数据结构,它是以双循环链表为基础的数据结构,与进程的休眠---唤醒机制紧密相连,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。假设进程A想要获取某资源(读网卡数据),但是此时资源没有准备好(网卡还未接收到数据),这时内核必须切换到其他进程进行,直到资源准备好再唤醒该进程。1、等待队列头struct __wait_queue_head { spinlock_t lock; //...原创 2022-03-29 17:05:20 · 4798 阅读 · 0 评论 -
一段代码计算余弦距离
在NPU的接入过程中,经常会遇到最终结果精度不足的情况,这个时候我们就需要dump每层数据和原始框架float结果对比,可能很多人直接beyond compare,有时候肉眼可以看出来,不过最好的方法还是看它的余弦相似度。基本上所有NPU的发布包里或多或少都提供了类似的功能,比如rknn、nnie等。 NPU跑的是量化网络,dump下来一般已经做了反量化,所以得到的也是float结果,所以可以直接比较。通常相似度的比较可以用余弦距离和空间欧式距离表示,一般用的多的可能是余...原创 2022-03-18 17:45:51 · 2402 阅读 · 0 评论 -
v4l2摄像头采集流程及应用程序
V4L2是linux上用于采集图片、视频、音频数据的一套框架,在远程会议、视频监控系统、嵌入式多媒体终端中都有广泛的应用。V4L2通过打开驱动中创建的/dev/videoX设备,就可以进行一系列的操作,比如申请内存、设置格式、设置属性、开启采集等等。通过v4l2采集步骤示例代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fc...原创 2022-03-17 09:55:41 · 4269 阅读 · 4 评论 -
linux进程写时拷贝技术cow(copy-on-write)
Linux程序中,创建进程使用的是fork()函数,它会产生一个核父进程基本完全相同的子进程,这里先记住有相同的物理内存,区别仅仅在于pid、ppid和某些统计量。子进程后面基本都会执行exec系统调用,它会引起子进程另起内存拷贝一份,如果创建子进程都需要拷贝内存的话,辛苦拷贝的又完全放弃了,出于效率考虑,Linux引入了写时复制技术,也就是只有进程空间的各段内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存...原创 2022-02-18 13:56:07 · 1403 阅读 · 0 评论 -
linux内核管理算法---buddy系统算法概念初探
Buddy Systemlinux伙伴算法解决的问题是频繁地请求和释放不同大小的一组连续页框,必然导致在已分配的页框块内分散了很多小块的空闲页面,导致程序运行到后面,无法分配出满足要求的大块连续页框。为了避免这种情况,linux引入了伙伴系统算法,它把所有的空闲页框分为11个块链表,每个块链表分别包含大小为2^0、2^1、2^2……2^10,即1、2、4、……、1024个连续页框的页框块,每块能申请最大的1024个页框对应4M大小的连续内存。另外伙伴算法每次只能分配2的幂次页的空间,...原创 2022-02-18 09:30:45 · 736 阅读 · 0 评论 -
create_singlethread_workqueue与create_workqueue的区别
使用create_singlethread_workqueue创建工作队列即使对于多CPU系统,内核也只负责在一个cpu上创建一个worker_thread内核线程;而使用create_workqueue创建工作队列对于多CPU系统,内核将会在每个CPU上创建一个worker_thread内核线程,使得线程处理的事务能够并行化转载 2021-12-01 16:37:10 · 3974 阅读 · 0 评论 -
交叉编译sysstat工具(mpstat、iostat、sar等)
linux下经常需要分析cpu占用率、io使用情况、内存使用情况等系统相关状态,sysstat是一个工具包,里面集成了很多条工具命令。有的嵌入式设备中不带sysstat里面的命令,这个时候就需要我们根据开发板的编译链手动编译一下就可以使用了。iostat - 提供CPU统计,存储I/O统计(磁盘设备,分区及网络文件系统)mpstat - 提供单个或组合CPU相关统计pidstat - 提供Linux进程级别统计:I/O、CPU、内存等sar - 收集、报告、保存系统活动信息:CPU、内存、磁盘、中原创 2020-10-10 17:38:20 · 2830 阅读 · 0 评论 -
container_of解析
宏定义位于:include/linux/kernel.h #define container_of(ptr, type, member) ({ / const typeof( ((type *)0)->member ) *__mptr = (ptr); / (type *)( (char *)__mptr - offsetof(type,member) );})...原创 2020-03-23 09:22:06 · 211 阅读 · 0 评论 -
如何在linux C代码中查询剩余内存
前言在嵌入式linux开发板中,内存等资源往往是有限的。经常需要查询程序所耗费的内存多大。 “free -m”等linux命令只能查询静态的剩余内存。换句话,这些命令不能查询程序运行过程实时所消耗的内存。代码实现所以一个较好且准确的做法,就是在程序代码调用linux系统API来获取剩余内存,通过剩余内存值得变化就能获知程序实时运行过程中所需要得最大内存。代码中获取剩余内存往往有两种做法...转载 2019-11-29 10:23:52 · 1093 阅读 · 0 评论 -
linux常见进程调度算法
进程调度:在操作系统中调度是指一种资源分配。调度算法是指: 根据系统的资源分配策略所规定的资源分配算法。操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。 那么我们看一下常见的进程调度算法: 1. ...转载 2018-12-23 23:42:15 · 705 阅读 · 0 评论 -
linux进程间通信之------管道、命名管道
管道概述管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,shell中管道符“|”及tee命令就用到了管道。具有以下特点:1、单向:数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建立两个管道。2、亲缘性:管道只...原创 2019-02-12 23:32:44 · 263 阅读 · 0 评论 -
linux进程间通信总结
进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享 多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制...转载 2019-02-12 22:42:15 · 298 阅读 · 0 评论 -
linux进程间通信之------共享内存
概述 共享内存是进程间通信最简单的方式之一,是在两个独立的进程用户地址空间中映射到同一块物理内存,因为数据字节由内存映射到用户空间,所以它也是进程通信最快的IPC方式。但是由于内核没有提供对访问共享内存进行同步,所以需要我们自己实现同步机制,一般是使用信号量。所以一般操作模型是: 获取mutex,锁定共享内存。 将要通信的数据写入(读取)共享内...原创 2019-02-12 22:25:31 · 189 阅读 · 0 评论 -
linux c奇淫技巧v1
数组相关零长数组:struct b{ int a; int b[0]; //不占空间}/*1、动态分配可变长度的数组2、方便释放,原地及数据3、提高访问速度*/为什么不用指针代替零长数组?struct buffer1{ int len; int a[0];};struct buffer2{ int len; ...原创 2019-01-27 22:45:26 · 386 阅读 · 0 评论 -
gdb调试使用小结
gdb安装一般linux系统中都安装好了,如果没有可以使用下面命令#:apt-get update#:apt-get install gdbgdb使用一般要使用gdb调试某个程序,都需要程序中带了符号表,这样才能清晰的看到调试的每一行代码、调用的堆栈信息、变量名、函数名、寄存器、内存信息等,所以使用gcc编译程序时,需要加上 -g 选项:gcc test.c -g -...原创 2019-01-27 00:06:53 · 649 阅读 · 0 评论 -
Linux中的5种I/O模型
1 概念说明在进行解释之前,首先要说明几个概念:用户空间和内核空间进程切换进程的阻塞文件描述符缓存 IO1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直...转载 2019-01-10 16:58:24 · 198 阅读 · 0 评论 -
linux内存管理之内存分配函数区别
malloc 、calloc、kmalloc、kzalloc、vmalloc、和get_free_page() 等区别用户/内核 API名称 物理连续? 大小限制 单位 场景 用户空间 malloc/calloc/realloc/free 不保证 堆申请 字节 calloc初始化为0;realloc改变内存大小。 all...转载 2018-12-24 20:32:32 · 805 阅读 · 0 评论 -
linux中逻辑地址、线性地址、虚拟地址、物理地址
逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址,这种寻址方式在80x86著名的分段结构中表现得尤为具体,它促使windows程序员把程序分成若干段。每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。例如我们常说的结构体中某个参数的地址其实就相当于:结构体首地址 + 偏移量。逻辑地址是相对于应用程序而言的。线性地址/虚拟地址是一个32位...原创 2018-12-24 17:23:22 · 794 阅读 · 0 评论 -
对虚拟地址空间对应实际物理地址的理解
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。一 早期的内存分配机制在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序...转载 2018-12-18 23:22:16 · 9553 阅读 · 6 评论 -
linux进程间通信之------消息队列
概述消息队列是消息的链接表,存储在内核中,由消息队列标识符标识。尽管消息对了在某些方面与管道和FIFO类似,但是它们还是存在显著的差别消息队列有system V和posix接口之分,这里我们讨论的是systemV中的消息队列。1、引用消息队列的句柄是由msgget()调用返回的标识符,这些标识符和其他UNIX系统上其他形式的I/O所使用的文件描述符是不同的;2、消息队列是面向...原创 2019-02-13 22:11:52 · 228 阅读 · 0 评论 -
Linux下命令行解析函数getopt简单使用
以前写一些调试程序的时候解析命令都是使用strtok作分割再判断,偶然间看到由一个getopt函数,可以很快的实现这个功能。 #include <unistd.h>int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;extern int optind...原创 2019-02-13 23:08:26 · 227 阅读 · 0 评论 -
__attribute__用法解析
attribute是GNU C特色之一,在linux开发中用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.函数属性(Function Attribute)noreturn noinline always_inline p...转载 2018-10-13 11:54:33 · 2068 阅读 · 0 评论 -
linux虚假唤醒(spurious wakeup)
1.Linux对虚假唤醒的说明On a multi-processor, it may be impossible for an implementation of pthread_cond_signal() to avoid the unblocking of more than one thread blocked on a condition variable.The effect i...转载 2019-04-22 22:52:05 · 1075 阅读 · 0 评论 -
Linux内核的文件预读(readahead)
编者按:Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻 道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习 Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被...转载 2019-04-22 10:33:18 · 2324 阅读 · 0 评论 -
gcc编译选项总结
常用编译选项#--------------------------------------------------------------------------------[介绍]gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生...转载 2019-04-10 13:33:42 · 1030 阅读 · 0 评论 -
__wrap_malloc动态替换malloc函数
调试过程中经过会遇到各种各样的内存问题,内存泄漏、重复释放、内存溢出等,当然技术手段也有很多总,比如mtrace、Valgrind等,但是GUN链接器实际提供了一个好用的方法--wrap=symbol函数名定义为__wrap_symbol ,symbol也是一个函数,那么编译的时候如果添加了链接参数,函数调用symbol时,会调用到__wrap_symbol函数,另外还有一个相关函数_...原创 2019-03-19 14:32:29 · 3961 阅读 · 2 评论 -
负数在内存中存储方式
大家平常写程序有时候使用有符号int,有时候使用无符号unsigned int,那么它们在内存中究竟怎么存放的呢?无符号:因为没有负数,还是按照该数字存放有符号带符号最高位为符号位:0:正数1:负数先灌输几个概念,学过通信原理的应该都知道原码:正数是二进制本身,负数是它绝对值,加上最高位的符号位5:0000 0000 0000 0000 0000 0000 0000...原创 2019-03-11 20:04:06 · 6179 阅读 · 0 评论 -
linux硬链接与软链接
首先说一下linux中的文件由什么组成:user data(用户数据)+ meta data(元数据)用户数据即文件数据块,数据块是记录文件真实内容的地方元数据包含了文件的附加属性,比如索引节点号inode、所有者、创建时间、文件大小等。inode才是文件的唯一标识,而非文件名。 通过文件名打开文件:使用ls -i或者stat命令可以查看inode号。...转载 2018-12-17 22:44:50 · 117 阅读 · 0 评论 -
使用mkfifo实现外部调试接口
使用mkfifo及fgets实现写管道用来处理外部debug命令例如: echo encyuv -i /home/test.yuv -w 1920 -h 1080 > debugNodedebugNode即为mkfifo创建的实名管道。 下面介绍一个简单的示例程序:#include <sys/types.h>#include <sys/stat.h&...原创 2018-12-26 20:39:31 · 346 阅读 · 0 评论 -
Linux线程优先级及属性小结
介绍同一进程中的多个线程如何保持数据的私有性Linux内核的几种调度策略: 1.SCHED_OTHER 分时调度策略 2.SCHED_FIFO 实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪...转载 2018-11-15 00:10:02 · 7870 阅读 · 0 评论 -
source和export区别
背景:当我们启动linux后,将启动一个用户shell,在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序,运行shell脚本时,系统将创建一个子shell用来执行,每个shell都是由某个shell(称为父shell)派生的#a.sh#! /bin/shecho “hello world!”echo "PID of this script: $...原创 2018-10-30 11:49:07 · 4159 阅读 · 0 评论 -
fork和vfork解析
linux操作系统中,这两个函数都是用来创建子进程# include <unistd.h>pid_t fork(void);pid_t vfork(void);成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。失败:返回 -1。 fork和vfork的区别fork特点:fork创建子进程的时候是完全拷贝一份父进程的资源,子进程...转载 2018-10-24 14:10:04 · 581 阅读 · 0 评论 -
linux中断介绍(概念、顶半部和底半部、linux中断编程)
中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行.中断的分类:内部中断:来自cpu内部(软件中断、cpu溢出、触发错误等)外部中断:来自cpu外部,由外设触发屏蔽中断和不可屏蔽中断可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后该中断不再触发响应不可屏蔽中断:中断无法...原创 2022-02-23 13:34:02 · 2302 阅读 · 0 评论 -
linux驱动中probe函数是怎么调用的
linux驱动的三个概念:设备、驱动、总线probe何时被调用:在总线上驱动和设备的名字匹配,就会调用驱动的probe函数probe函数被调用后,系统就调用platform设备的probe函数完成驱动注册最后工作。下面是probe被调用前的一些流程。device一般是先于driver注册,但也不全是这样的顺序。Linux的Device和Driver的注册过程分别枚举挂在该BUS上所...转载 2018-10-17 16:59:00 · 29077 阅读 · 0 评论 -
linux如何通过ioctl调用驱动的
ioctl作用:应用层的ioctl函数传入的cmd和arg参数会直接传入驱动层的ioctl接口,在对应驱动文件里会对相应的命令进行操作对于传递的ioctl命令有一定的规范,具体可以参考:/include/asm/ioctl.h,/Documentation/ioctl-number.txt 这两个文件 应用层和驱动程序联系如下:最终ioctl是通过系统调用sys_ioctl软中断陷...原创 2018-10-19 13:56:36 · 3293 阅读 · 4 评论 -
linux驱动中读写硬件寄存器(例如__raw_writel)
设备通常会提供一组寄存器来控制设备、读写设备和获取设备状态,即控制寄存器、数据寄存器和状态寄存器。这些寄存器可能位于I/O空间,也可能位于内存空间。当位于I/O空间时,通常被称为I/O端口,位于内存空间时,对应的内存空间被称为I/O内存。再内核访问I/O内存前,需要将设备所处的物理地址映射到虚拟地址 __iomem源码位置:include/linux/compiler.h# defi...原创 2018-10-15 20:30:36 · 7761 阅读 · 1 评论 -
__attribute__((weak)) 简介及作用
最新在看项目新架构代码上看到了有使用到weak,以前没有看到过,所以写一篇文章以作记录。场景:A,B两个模块,A模块调用了不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。 弱符号:若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak属性,则这些全局符号不会引...原创 2018-10-13 11:49:25 · 20737 阅读 · 2 评论 -
C语言结构体中冒号(位域)用法
位域出现的原因是由于某些信息的存储表示只需要几个bit位就可以表示而不需要一个完整的字节,同时也是为了节省存储空间和方便处理。 typedef struct bit_struct{ int bit1:3; int bit2:5; int bit3:7;}data; bit1、bit2、bit3表示对应的位域整个位域结构体占用2个...转载 2018-08-07 11:51:53 · 7448 阅读 · 1 评论