自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 资源 (2)
  • 收藏
  • 关注

原创 基于rt-smart和树莓派4b的摄像头实现

前段时间,RT-Thread Smart(简称 rt-smart)操作系统发布并且开源,该系统体积小,启动快,适合做有快速启动需求的产品,正好手头有一块树莓派4b的板子,就想着做个摄像头玩玩,第一阶段的目标是实现出图。1.熟悉rt-smart并下载源码rt-smart的官网文档还是比较给力的,可以参考RT-Thread Smart 入门指南,网址如下:https://www.rt-thread.org/document/site/rt-smart/rt-smart-quickstart/rt

2021-01-10 19:53:52 356

原创 linux内存的反向映射

逆向映射是指在已知page frame的情况下(可能是PFN、可能是指向page descriptor的指针,也可能是物理地址,内核有各种宏定义用于在它们之间进行转换),找到映射到该物理页面的虚拟页面们。由于一个page frame可以在多个进程之间共享,因此逆向映射的任务是把分散在各个进程地址空间中的所有的page table entry全部找出来。之所以建立逆向映射机制主要是为了方便页面回收。

2023-03-28 09:40:48 662

原创 atomic 原子操作

修改一个变量会经过读、修改、写的操作序列。但有时该操作序列在执行完毕前会被其他任务或事件打断。比如在多CPU体系结构中,运行在两个CPU上的两个内核控制路径同时并行执行上面操作序列,有可能发生下面的场景:linux专门定义了一种只进行原子操作的类型atomic_t。

2023-03-02 10:03:32 1880

原创 内核数据结构-XArray

XArray是一种抽象数据类型,类似于一个大的指针数组,它满足了许多与哈希或常规可调整大小数组相同的需求。由于 xarray 中的数据都是指针,使用 RCU 这种无锁的方法查找数据是再合适不过了。xarray 数据结构主要的应用场景是在文件缓存。我们知道在Linux内核中,为了加快文件的访问速度,将空闲的内存页就用做了磁盘的 cache。一个文件的缓存通过 address_space 数据结构进行管理,而这里面用于记录文件数据与内存页之间映射关系的数据结构就是采用了 xarray。

2023-02-09 10:00:03 971

原创 GCC工具集的使用

通过使用 -f 选项,可以告诉工具输出函数名。Addr2line 工具是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。ar是一个归档工具,用于建立、修改、提取归档文件(archive)。strip工具用于删除文件中的符号,在资源有限的系统中,可以使用这种方法为程序进行瘦身。nm工具用于显示文件中的符号,可以用于各种ELF格式文件。objdump工具用来查看编译后目标文件的组成。objcopy工具用于对目标文件的内容进行转换。strings工具用于查看文件中的字符串。

2023-01-19 08:44:25 1318

原创 kmemleak工具

内存泄漏分为用户态的内存泄漏和内核态的内存泄漏,我们本文主要关注的是内核态的内存泄漏。工作中比较常见的内存泄漏按照发生泄漏的频率可以划分以下几种类型:1、一次性内存泄漏,只在初始化过程中或某一次条件触发产生的内存泄漏。2、偶发性内存泄漏,在某种条件下偶尔触发产生的内存泄漏。3、频发性内存泄漏,内存泄漏点被频繁的触发。对于频发性内存泄漏我们有比较多的调试手段去定位,比如我们可以先通过/proc/meminfo信息大致确定下内存泄漏发生在哪个模块中,再通过其他手段进一步定位。

2023-01-18 09:51:36 853

原创 ftrace工具

Ftrace是Linux进行代码级实践分析最有效的工具之一,比如我们进行一个系统调用,出来的时间过长,我们想知道时间花哪里去了,利用Ftrace就可以追踪到一级级的时间分布。

2023-01-11 09:48:07 191

原创 Linux oom机制

Linux oom是由于内存泄漏或者内存使用不合理而导致的问题。在讲OOM之前,我们先来了解一下内核内存回收的总体框架。

2023-01-05 09:46:54 1395

原创 kprobe调试工具

debug内核函数变量的时候最常用的是添加log,用printk看下相关的信息,但是这种方式往往需要重新编译内核,然后再启动设备。而Kprobe可以在运行的内核中动态插入探测点,执行你预定义的操作。可以跟踪内核几乎所有的代码地址,并且当断点被击中后会响应处理函数。使用kprobe最常用的就是查询函数调用的参数和返回值。目前,使用kprobe可以通过自行编写内核模块,向内核注册探测点,探测函数可根据需要自行定制,使用灵活方便;

2022-12-28 09:19:58 646

原创 Linux抢占(PREEMPTION)

进程切换有自愿(Voluntary)和强制(Involuntary)之分,简单来说,自愿切换意味着进程需要等待某种资源,强制切换则与抢占(Preemption)有关。抢占(Preemption)是指内核强行切换正在CPU上运行的进程,在抢占的过程中并不需要得到进程的配合,在随后的某个时刻被抢占的进程还可以恢复运行。发生抢占的原因主要有:进程的时间片用完了,或者优先级更高的进程来争夺CPU了。

2022-12-24 19:06:16 1158

原创 softlockup与hardlockup

所谓lockup,是指某段内核代码占着CPU不放。Lockup严重的情况下会导致整个系统失去响应。首先只有内核代码才能引起lockup,因为用户代码是可以被抢占的,不可能形成lockup(下文“实时进程会不会造成系统lockup”会介绍一种例外)其次内核代码必须处于禁止内核抢占的状态(preemption disabled),因为Linux是可抢占式的内核,只在某些特定的代码区才禁止抢占,在这些代码区才有可能形成lockup。

2022-12-24 16:57:56 449

原创 kdump功能

kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump会将内存导出为vmcore保存到磁盘。在kernel1运行的时候,在内存中给kernel2(捕获内核)预留空间。在kernel1 crash的时候,就会进入kernel2,kernel2 执行用户态程序makedumpfile对kernel1的内存镜像进行裁剪和压缩,最后将kernel1的vmcore保留在磁盘中并重启。

2022-12-24 13:19:29 1460

原创 vim+cscope阅读源码

做嵌入式开发时,可以使用vim+cscope打造一个舒适的源码阅读环境。1.添加自定义的vim配置文件使vim更易用。2.cscope是查看代码的利器。可以定位函数、变量定义及被引用的代码位置。

2022-12-23 18:25:15 882

原创 QEMU环境搭建

为了方便编译和运行linux,搭建一个用于学习linux的QEMU环境。

2022-12-23 15:57:02 776

原创 Hungtask

hungtask表现为某些重要进程一直不能运行,如长期处于uninterruptible sleep状态(也就是常说的D状态。可以采取多种方法检测:定时轮询系统中的所有task,然后判断处于D状态的task的上下文切换次数是否和之前轮询时的相等,如果相等则表明该task两个轮询间隔期间一直处于D状态,可以认为该task有hang的情况;或只关注重要进程的运行情况,让这个重要进程在规定时间内模拟喂狗操作,若发现没有及时喂狗,则认为其有hang的情况。

2022-12-19 22:04:16 885

原创 内核mutex实现原理

mutex锁的特点1.不同于信号量,mutex需要谁拿的锁谁来释放锁。2.不同于自旋锁,mutex临界区允许睡眠。3.不同于自旋锁,mutex在拿锁时若锁被别人持有,会根据锁的持有者是否正在运行来决定是乐观自旋或是睡眠等待。

2022-12-16 09:33:39 354

原创 内核定时器(timer)实现

定时器层是基于tick层(高精度定时器)之上的,是根据系统jiffies来触发的,精度相对比较低。利用定时器,我们可以设定在未来的某一时刻,触发一个特定的事件。经常,也会把这种低精度定时器称作时间轮(Timer Wheel)。参考链接:linux 内核 定时器(timer)实现机制。

2022-12-16 09:26:53 104

原创 可强占RCU

RCU机制属于无锁编程的一种,在访问读端临界区时不需要加锁,故不存在上面提到的锁的问题,所以拥有极好的扩展性,且可以多个读者同时存在。那为什么不用RCU锁取代其他锁呢?前面说到读端不用加锁,但是写端是需要加锁的,用来保证写者之间的同步,这一特点限制RCU的适用场景一定是读多写少的,否则相对其他锁优势就没那么明显了。且由于读端无锁写端才需要加锁,RCU又是可以读者写者共存的,即多个读者一个写者同时存在。

2022-12-15 09:46:14 776

原创 基于printk问题调试

printk()是Linux内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试 的最基本方法。所有的printk()消息都会被打印到内核日志缓冲区,这是一个通过/dev/kmsg输出到用户空间的环 形缓冲区。读取它的通常方法是使用 dmesg。

2022-12-14 09:30:10 290

原创 内核地址消毒剂(KASAN)

KernelAddressSANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是 检查内存越界访问和使用已释放内存的问题。

2022-12-14 09:22:26 906

原创 稳定性开发常用网址

内核稳定性开发常用的一些网站汇总

2022-12-14 08:46:28 190

原创 踩内存问题

问题难点:A发生踩内存时,系统不一定马上崩溃,当B再去访问内存时发生crash。A和B没有关系,所以抓到真凶A是问题的关键。

2022-12-13 09:21:36 961

原创 内核稳定性

内核稳定性问题指的是系统发生了死机或异常重启(oops/panic等软硬件问题),影响用户体验,甚至造成生命财产的损失。

2022-12-13 08:51:55 2023

原创 Linux内存模型

内存模型的设计则主要是权衡以下两点(空间与时间):1. 尽量少的消耗内存去管理众多的struct page2. pfn_to_page和page_to_pfn的转换效率。

2022-12-11 22:55:19 625

原创 Linux 伙伴系统

本文介绍linux伙伴系统的主要实现

2022-12-10 21:17:42 706

原创 slub debug

slub debug工具介绍

2022-12-09 08:29:38 799

原创 pstore

pstore最初是用于系统发生oops或panic时,自动保存内核log buffer中的日志。

2022-12-09 08:20:40 2260

原创 Linux stability

创建该专栏目的:系统地整理遇到的linux稳定性问题以及相关的知识点,便于回顾和查缺补漏

2022-12-08 09:49:04 441 1

原创 树莓派4b移植64位uboot

1.安装环境及软件版本:虚拟机:Ubuntu 18.04 (之前使用ubuntu16.04编译时,提示libc库版本低)交叉编译器:gcc-linaro-10.2.1-2021.02-x86_64_aarch64-linux-gnu.tar.xz下载地址:https://snapshots.linaro.org/gnu-toolchain/10.2-2021.02-1/aarch64-linux-gnu/Uboot:u-boot-2021.04.tar.bz2下载地址:ftp://.

2021-07-27 08:47:52 1453 2

原创 相机的硬件接口以及传输协议介绍

CSI 定义了一个位于处理器和相机sensor之间的高速串行接口。1.CSI(CameraSerialInterface)的分层结构•PHY 定义了传输媒介,输入/输出电路和和时钟和信号机制。•Lane Management层:发送和收集数据流到每条lane。•Low Level Protocol层:定义了如何组帧和解析以及错误检测等。•Application层:描述高层编码和解析数据流。树莓派4b支持CSI-2 D-PHY 1.1相机接口。2.D-PHY介绍D-PH...

2021-01-10 23:28:26 3234

原创 通用的Makefile文件

本程序的Makefile分为3类:    1. 顶层目录的Makefile    2. 顶层目录的Makefile.build    3. 各级子目录的Makefile一、各级子目录的Makefile:   它最简单,形式如下:    obj-y += file.o    obj-y += subdir/      "obj-y += file.o"表示把当前目录下的file.c编进程序里,   ...

2018-06-27 15:52:46 330

转载 十四 制作http服务器端

HTTP概要理解Web服务器端: 编写HTTP(超文本传输协议)服务器端,即Web服务器端,我们可以这样定义它:基于HTTP协议,将网页对应文件传输给客服端的服务器端。HTTP是以超文本传输为目的而设计的应用层协议,这种协议同样属于基于TCP/IP实现的协议。 好,再来看看这样一个例子帮助我们理解:想想我们平时用浏览器打开某个网页,首先浏览器地址栏输入url确认,这其实就是向Web服务器端发送请求...

2018-05-30 22:10:17 762

原创 十三 多线程服务器端的实现

线程相比于进程具有如下优点:1.线程的创建和上下文切换比进程的创建和上下文切换要快.上下文切换时不需要切换数据区和堆.2.线程间交换数据时无需特殊技术.可以利用数据区和堆交换数据.线程同步(两方面)1.同时访问同一内存空间时发生的情况.2.需要指定访问同一内存空间的线程执行顺序的情况.信号量示例(控制访问顺序的同步)示例场景:                线程A从用户输入得到值后存入全局变量nu...

2018-05-30 21:44:10 288

原创 十二 优于select的epoll

基于select的I/O复用技术速度慢的原因:调用select函数后常见的针对所有文件描述符的循环语句。每次调用select函数后都需要向该函数传递监视对象信息。epoll函数的优点正好与select缺点相反:无需编写以监视状态变化为目的的针对所有文件描述符的循环语句。调用对应于select函数的epoll-wait函数时无需每次传递监视对象信息。实现epoll时必要的函数:epoll_creat...

2018-05-30 20:12:32 344

原创 十一 I/O复用

多进程服务器端的缺点:1.创建进程的开销2.进程间数据交换复杂(每个进程有独立的内存空间)理解select函数并实现服务器端select函数的调用方法和顺序:设置文件描述符:调用select函数后查看结果:实现I/O复用服务器端:#include <stdio.h>#include <stdlib.h>#include <string.h>#include...

2018-05-30 14:09:27 217

原创 十 进程间通信

进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应该提供两个进程可以同时访问的内存空间。通过管道实现进程间通信为了完成进程间通信,需要创建管道。管道并非属于进程的资源,而是和套接字一样,属于操作系统。一个管道有两个文件描述符,用作管道的出口和入口。如下图,父子进程都可以访问管道的I/O路径,但子进程仅用输入路径,父进程仅用输出路径。通过管道进行进程间双向通信1个管道无法完成双...

2018-05-30 13:32:30 191

原创 九 多进程服务器端

并发服务器端的实现方法并发服务器可同时向发起请求的客户端提供服务,以提高平均满意度和有效利用cpu。实现模型和方法:多进程服务器 ,多路复用服务器 ,多线程服务器。理解进程进程:占用内存空间的的正在运行的程序。如果父进程终止,处于僵尸状态的子进程将同时销毁。父进程往往与子进程一样繁忙,因此不能只调用waitpid函数以等待子进程终止。可利用信号处理技术消灭僵尸进程,子进程终止时将产生SIGCHLD...

2018-05-30 10:57:31 177

原创 八 套接字的多种可选项

8.1 I/O缓冲大小SO_RCVBUF是输入缓冲大小相关可选项,SO_SNDBUF是输出缓冲大小相关可选项。用这2个可选项既可以读取当前I/O缓冲大小,也可以进行更改。系统不会100%按照我们的请求设置缓冲大小,因为要实现流控制和错误发生时的重传机制,至少要有一些缓冲空间吧?8.2 SO_REUSEADDR选项SO_REUSEADDR选项及其Time-wait状态很重要。在服务器端控制台输入CT...

2018-05-29 22:04:24 198

原创 七 域名及网络地址

DNS是对IP地址和域名进行转换的系统,其核心是DNS服务器。所有计算机中都记录着默认DNS服务器地址,就是通过这个默认DNS服务器得到相应域名的IP地址信息。Linux系统中:输入nslookup后再输入server可得到默认DNS服务器地址。计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址信息。若该DNS服务器无法解析,则会询问其他DNS服务器,并提供给用户,如下图:...

2018-05-29 19:47:46 203

原创 六 基于UDP的服务器端/客户端

在更重视性能而非可靠性的情况下,UDP是一种很好的选择。实现基于UDP的服务器端/客户端UDP中的服务器端和客户端没有连接,因此每次传输数据都要添加目标地址信息。UDP服务器端和客户端均只需1个套接字服务器端: /* UDP回声服务器端uecho_server.c */ #include<stdio.h> #include<stdlib.h> ...

2018-05-29 19:34:32 330

busybox根文件系统

busybox根文件系统

2022-12-23

骨骼关节点数据

Matplotlib之3D骨骼关节的动画显示的数据文件,欢迎大家下载

2017-11-30

computation autonomous mental development

computation autonomous mental development

2017-04-18

空空如也

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

TA关注的人

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