自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Amelio Ming

linux 菜鸟

  • 博客(58)
  • 收藏
  • 关注

原创 linux mutex 互斥锁实现

虽然MCS算法的设计是针对自旋锁的,但是目前Linux4.0内核中依然没有把MCS算法用在自旋锁上,但是在互斥锁上使用了MCS算法。自旋锁是Linux内核使用最广泛的一种锁机制(在笔者《linux spinlock自旋锁实现》一文中有详细描述),在多处理器和NUMA系统中,排队自旋锁仍然存在一个比较严重的问题。linux内核版本的MCS锁最早由社区专家Waiman Long在linux3.10中实现,后来经过社区其他专家不断优化称为现在的osq_lock,可以说OSQ锁是MCS锁机制的一个具体实现。

2025-05-08 14:40:38 431

原创 rk3568 A/B系统 OAT升级 实践

但是SDK并不知道,所以需要修改脚本中的内容,动态修改/etc/fstab中的内容,当从A分区系统启动时挂载userdata_a,oem_a分区,当从B分区系统启动时挂载userdata_b,oem_b分区。以笔者的设备为例,SDK编译出来的userdata.img只有几百K,但是userdata_a/b分区的大小是100M。由于瑞芯微配置了oem和userdata分区,而在A/B分区方案中,修改为oem_a/_b和userdata_a/_b导致配置的/etc/fstab文件错误,错误挂载了分区信息。

2025-04-30 17:43:31 524

原创 rk3568安全启动功能实践

其中主要参考瑞芯微官方文档《Rockchip_Developer_Guide_Secure_Boot_for_UBoot_Next_Dev_CN.pdf》。文档中描述逻辑不是很清晰而且和当前瑞芯微的sdk中安全启动的流程匹配度不高。在瑞芯微sdk目录下执行 make menuconfig->Security feature (secureboot, encryption, verity, etc.) 来进行安全启动相关配置的配置,配置了这些内容后,编译SDK时会自动对uboot和kernel进行签名。

2025-04-30 15:49:48 1170

原创 linux 内核 ida机制分析

ida只处理id的分配,不关注与id关联的item,id在shift=0层radix_tree_node节点上的slots[]无需存储item所以就就空闲出来了,ida在对应的slots[]上存放bitmap,因为标记bitmap内的id的分配情况。ida_simple_get内部在关开中断的条件下调用的ida_pre_get ida_get_new_above来进行id分配.2.2、ida分配id(ida_pre_get/ida_get_new/ida_get_new_above)2.1、ida初始化。

2025-04-15 17:27:00 732

原创 linux内核idr 机制分析

idr或者ida是在[start,end)范围内分配id,根据radix-tree中id分配情况,最终分配出来的id可能>=start.如果node->tag[IDR_FREE][1] offset bit位置0表示node下无空闲数据供分配使用,只有node的下层所有子节点的tag[IDR_FREE][1]为0,2.2、idr分配id,idr分配满足范围[start,end)的index,同时存储index关联的ptr到radix-tree中。2.4、idr删除id,从idr中删除id。

2025-04-15 17:18:10 520

原创 linux 内核 static-key机制分析

地址4字节对齐,意味着地址的低2位总是为0,正是利用这一点,struct static_key::type用低位的2位来存储相关struct jump_entry(即static_key::entries指向的struct jump_entry)的类型。当arch_static_branch/arch_static_branch_jump()函数被编译时,内嵌汇编中1:标签处的内容为nop指令或者b指令在内核的代码段中,内核加载时,其被加载到内存中的某个地址上。

2025-04-15 17:07:51 908

原创 linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之五 trace-events-sample.h预编译后的文件

本文会将 trace-events-sample.h预编译后的文件贴出来,其中删除了很多包含的其他头文件内容,如果你感兴趣可以看看,对比下是否和你自己展开的一致。当然这也是一个体力活儿。

2025-04-14 14:37:43 169

原创 linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之四 trace_events.h头文件

在trace_events.h中会使用#include来包含trace-events-sample.h 七次意味着会对其中的TRACE_EVENT(...)系列宏定义进行7次展开。每次展开起到的作用都是不一样的。在 trace_events.h中主要是处理参数空间的分配,参数格式化,以及一大推结构体的定义。由于这个过程很漫长,对读者也是一个挑战,只有真正对tracepoint感兴趣的读者才会化时间和精力来进行宏定义的展开。所以我将直接将注释过的trace_events.h文件内容贴出来。

2025-04-14 14:32:44 182

原创 linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件

define_trace.h头文件在每个定义tracepoint的.h头文件中只有第一次的包含是有效的,因为 #undef CREATE_TRACE_POINTS会使define_trace.h再出进入时无效,除非明确定义CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS才有效。在trace-events-sample.h文件的结尾使用#include <trace/define_trace.h> 包含了define_trace.h有文件,意味着在。

2025-04-14 14:06:56 339

原创 linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之二 tracepoint.h头文件

linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之二 tracepoint.h头文件

2025-04-14 11:58:44 456

原创 linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之一 tracepoint实现原理

linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之一 tracepoint实现原理。在开始描述之前,我们先介绍下linux tracepoint是什么?以及为什么需要tracepoint?TRACE_EVENT系列宏定义的展开基本上是笔者当前见过的最复杂的宏定义了,没有之一。1、tracepoint概念        跟踪点(tracepoint)是放置在内核代码中较重要位置的硬编码检测点。例如,在系统调用、调度程序事件、文件系统操作和

2025-04-14 11:46:41 769

原创 车载摄像头+max96712 + rk3568 调试过程中遇到的问题

本文主要讲述本人在调试rk3568通过mipi-csi2链接max967812,max96712再外接4路车载摄像头过程中遇到的问题,以及最终如何解决这些问题。图中会贴上很多重要且关键的波形图,以便读者在调试过程中进行比对,分析。 如果在调试过程中,mipi总线上的波形没得什么问题的话,还是抓图失败的情况下,需要着重检查 频率,lane数,摄像头分辨率,摄像头输入图像格式等重要配置。

2025-02-21 11:06:53 915 2

原创 伙伴系统物理页面分配与释放

 伙伴系统的概念这个就不在描述了,具体内容可以在deepseek上进行搜索,可以得到详细的答案。   本文主要聚焦于linux下伙伴系统用于内存的分配和释放的实现。

2025-02-08 16:26:14 282

原创 max96712 Video Pattern Generator 寄存器配置

 本文的重点是如何使用max96712的Video Pattern Generator功能,不会详细描述介绍max96712芯片功能,具体内容可以参考max96712芯片手册。摄像头调试时,整个数据链路很长,图像数据传递过程中依次通过camera,串行器,解串器,soc,最终在soc侧看到最终的图像数据以及经过编码后的视频数据。数据链路太长,一旦调试不顺畅,容易造成阻塞。max96712可以在GMSL没有link lock情况下,通过配置max96712内部的视频模式生成颜色渐变以及棋盘格图案通过mipi输

2025-02-08 16:11:00 848

原创 V4L2框架对视频采集配置流程

完成摄像头驱动的调试后,就需要进行视频图像采集,采集的图像送入编码器进行编码。采集过程中需要用到Linux内核的V4L2框架。我们只需要进行适当的配置即可开启视频采集工作。应用程序基于V4L2框架对视频采集配置流程

2024-12-30 10:16:25 1445

原创 buildroot编译时错误输出:You seem to have the current working directory in your PATH

buildroot编译时出现如下打印信息:You seem to have the current working directory in your PATH

2024-12-18 18:28:21 297

原创 Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决

代码上库公司git后,将项目上出的程序烧录到设备中,wifi能够正常链接,但是ssd登录失败。把调试串口引出,查看linux启动log,发现如下打印信息:Permissio@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: UNPROTECTED PRIVATE KEY FILE! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

2024-11-04 16:04:19 1135

原创 linux softirq tasklet 软中断实现

linux内核中断管理分为上下半部机制(top half,bottom half)。中断上半部主要关注中断的响应,而把具体需要关注的任务放到中断下半部中来处理,其中网卡MAC控制器中断的处理是使用软中断来进行下半部处理的典型。硬件中断属于上半部的范畴,而软中断,tasklet和工作队列等为下半部机制。中断处理程序ISR中不允许进行睡眠,同理在软中断中也是不允许进行睡眠。

2024-10-23 13:59:39 1050

原创 linux 内存管理-slab分配器

伙伴系统用于分配以page为单位的内存,在实际中很多内存需求是以Byte为单位的,如果需要分配以Byte为单位的小内存块时,该如何分配呢?slab分配器就是用来解决小内存块分配问题,也是内存分配中非常重要的角色之一。slab分配器最终还是由伙伴系统分配出实际的物理内存,只不过slab分配器在这些连续的物理页面上实现了自己的算法,以此来对小内存块进行管理。slab分配器把对象分组放进高速缓存,每个高速缓存都是同种类型对象的一种"储备"。包含高速缓存的主内存被划分为多个slab,每个slab由一

2024-10-16 10:04:17 1015

原创 ARM 中断控制器 GIC-V2

GIC-V2 中断控制器架构参考文档:《ARM®Generic Interrupt Controller Architecture version 2.0》GIC:Generic Interrupt Controller(GIC)

2024-10-16 09:35:25 1181

原创 linux spinlock自旋锁实现

spinlock同一时刻只能被一个内核代码路径持有,如果有另外一个内核路径代码试图获取一个已经被持有的spinlock,那么内核代码路径需要一直自旋忙等待,直到自旋锁持有者释放该锁。如果该锁没有被别人持有(或争用),那么可以立即获得该锁

2024-10-12 16:59:04 521

原创 linux rwlock 读写锁实现

inux 内核中的rwlock类型的读写锁是基于spinlock来实现的。读写锁具有如下特性:允许多个读者同时进入临界区,但同一时刻写者不能进入。同一时刻只允许一个写者进入临界区。读者和写者不能同时进入临界区。

2024-09-29 10:04:16 314

原创 linux READ_ONCE/WRITE_ONCE/ACCESS_ONCE和smp_store_release/smp_load_acquire宏定义实现

READ_ONCE,WRITE_ONCE和 ACCESS_ONCE 宏在linux内核中出现的频率极高。那么这三个宏到底起了什么样的作用呢?smp_store_release/smp_load_acquire又如何呢?

2024-09-26 12:06:13 723

原创 linux semaphore信号量实现

信号量(semaphore)是操作系统中最常见的同步原语之一。spinlock是实现忙等待锁,而信号量则允许进程进入睡眠状态。下面将分析信号量的获取是释放操作。

2024-09-25 16:26:20 476

原创 linux _RET_IP_ 和_THIS_IP_ 实现

在Linux内核中,有两个罕见的宏定义_RET_IP_ 和_THIS_IP_。但是这两个宏在内核代码中又时不时的出现,那么它们到底是什么含义呢?

2024-09-25 13:02:51 874

原创 linux barrier 内存屏障实现

谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏,栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔离用的工具。再进一步,既然是防止闯入,那就是要保护栅栏内的东西。所以在linux 内核中,内存屏障用于保护内存的访问。

2024-09-23 15:10:59 770

原创 linux atomic 原子变量实现

原子操作是指指令以原子的方式操作,执行过程不会被打断。linux内核提供了atomic_t类型的原子变量,它的实现依赖于不同的体系结构。include/linux/types.htypedef struct {int counter;} atomic_t;#ifdef CONFIG_64BITtypedef struct {long counter;} atomic64_t;#endifARM使用ldrex和strex指令来保证操作的原子性:ldrex Rt,[R

2024-09-23 11:32:05 689

原创 linux CFS调度器 虚拟运行时间vruntime和时间片slice的计算

下面通过一个举例来说明CFS调度器虚拟运行时间vruntime和时间片slice是如何计算的

2024-09-03 13:54:40 681

原创 preempt_count说明

linux系统在运行时,总会处于某一种特定的上下文中,例如,进程上下文,中断上下文等。为了判断系统当前运行的上下文状态,内核提供了preempt_count变量来记录当前系统运行的上下文信息。注意,对于preempt_count的操作一般都是在最外层包了一层皮来关闭中断的情况下进行的,操作完成后开启中断。

2024-07-30 11:11:02 347

原创 linux radix-tree 基数树实现详解

radix tree,又称做基数树,是一种适合于构建key(index)与value(item)相关联的数据结构。内核中使用非常广泛。本文主要聚焦linux内核基数树的代码实现,大量注释过的代码。

2024-07-10 16:57:53 866

原创 linux 内核 红黑树接口说明

红黑树(rbtree)在linux内核中使用非常广泛,cfs调度任务管理,vma管理等。本文不会涉及关于红黑树插入和删除时的各种case的详细描述,感兴趣的读者可以查阅其他资料。本文主要聚焦于linux内核中经典rbtree和augment-rbtree操作接口的说明。

2024-07-10 16:41:15 1824

原创 三目运算符中间的表达式可以省略吗(a?:c)?

熟悉C语言的童靴对三目运算符都非常熟悉,a?如果表达式a为true,则整个运算符的值为表达式b,否则为表达式c;那么问题来了,三目运算符中间的表达式可以省略吗?其中标红部分是一个三目运算符,而且还是一个省略的三目运算符。: c如果a为true的情况下,整个三目运算符的值到底是什么?: "i am fine" 的运算结果是"how are you?"是变量c初始化的值。所以可知,三目运算符(a?b:c)出现省略的情况下(a?:c),被省略的表达式b的值就是第一个表达式a的值。如果将c省略,即a?

2024-06-19 15:27:04 749

原创 local_irq_enable/local_irq_disable local_irq_save/local_irq_restore实现细节

local_irq_enable/local_irq_disable和local_irq_save/local_irq_restore两对函数在内核代码中出现的频率非常之高。每个函数的功能描述如下:local_irq_enable/local_irq_disable:开关本地CPU总中断。local_irq_save:保存当前CPU CPSR寄存器值,然后关闭本地CPU总中断local_irq_restore:恢复之前的CPSR寄存

2024-04-15 19:06:36 1407

原创 kworker(kworker/u2:1,kworker/0:13,kworker/0:1H) 工作队列的命名

kworker(kworker/u2:1,kworker/0:13,kworker/0:1H) 工作队列的命名

2024-04-15 18:56:42 3346

原创 typeof((fifo) + 1),typeof高级用法

typeof(param)的作用就是获取param的数据类型。这个是大家都知道的。在阅读内核kfifo.h文件时看到下面的定义:#define kfifo_reset(fifo) \(void)({ \ typeof((fifo) + 1) __tmp = (fifo); \ __tmp->kfifo.in = __tmp->kfifo.out = 0; \})其中typeof((fifo) + 1) 的用法有点违背我们平时看到的代码的使用方法

2024-03-15 18:42:41 382

原创 Using the TRACE_EVENT() macro (Part 3)

Using the TRACE_EVENT() macro (Part 3)

2024-03-14 14:16:35 459

原创 Using the TRACE_EVENT() macro (Part 2)

Using the TRACE_EVENT() macro (Part 2)

2024-03-14 14:15:55 595

原创 Using the TRACE_EVENT() macro (Part 1)

Using the TRACE_EVENT() macro (Part 1)

2024-03-14 14:14:52 557

原创 fec mac初始化流程中涉及new api的接口

下面主要介绍mac接收网络数据帧中使用的new api接口以及对其流程的分析。

2024-03-08 17:18:34 933

原创 通过sysfs文件系统来调试phy

kobjetc是linux操作系统中非常重要的对象。我们知道,linux内核中有一个通用的惯例就是:对象一般都是嵌入到被管理的数据结构中去。如struct list_head,struct rb_node...等对象都是嵌入到数据结构中,然后通过struct list_head,struct rb_node...等对象将被管理的数据结构挂载到链表或者插入到红黑树中。

2024-03-08 16:56:32 564

空空如也

空空如也

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

TA关注的人

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