摘要: 前言 我之前总是分不清class Thread和class Object,以为它们是实现多线程和通信的两种方案。 现在看来它俩并不是对立的,它们的作用完全不同:前者用来创建线程,后者用来线程间通信。 Object表示线程归属的概念。 创建新线程1 继承class Thread 实现A::run() 阅读全文
posted @ 2026-07-17 17:37 moonのsun 阅读(7) 评论(0) 推荐(0)
摘要: 整体介绍 libcamera 的 control 体系是“定义(ControlId)+ 约束(ControlInfo)+ 值(ControlValue)+ 集合(ControlList)” 以key-value的形式呈现,和meta有一些区别:control更倾向于输入控制,meta更倾向于获取输出 阅读全文
posted @ 2026-04-20 10:35 moonのsun 阅读(18) 评论(0) 推荐(0)
摘要: 1 LOG等级 DEBUG, INFO, WARN, ERROR, FATAL,对应数字0~4; 下面所有的export设置全局变量,都可以把DEBUG,INFO替换成对应的数值; 默认log在这里设置: // src/libcamera/base/log.cpp LogCategory::LogC 阅读全文
posted @ 2026-02-12 12:32 moonのsun 阅读(8) 评论(0) 推荐(0)
摘要: 一个库为什么会有三个so? 库xxx发布的时候,会三个so: libxxx.so.1.0.0 libxxx.so -> libxxx.so.1.0.0 libxxx.so.1 -> libxxx.so.1.0.0 libxxx.so.1.0.0 真实的库,后缀分别是主版本号,次版本号,修订版本号 l 阅读全文
posted @ 2026-01-23 09:41 moonのsun 阅读(29) 评论(0) 推荐(0)
摘要: 1 四种api调用 在libcamera中,类和线程通过Object绑定,它们的关系为: Object中有Object *parent_和Object *thread_,分别记录了当前Object绑定的父线程和当前线程 类继承Object,类的对象就可以绑定线程 Object默认绑定创建Object 阅读全文
posted @ 2025-12-12 13:46 moonのsun 阅读(15) 评论(0) 推荐(0)
摘要: 前言 v4l2的用户侧使用方法的简单demo,参考:media/v4l/v4l2grab.c 实际上,v4l2的用户侧有libv4l开源库。用户可以使用此开源库快速搭建其用户侧代码。 流程 int main() { // open fd = v4l2_open("/dev/video0", O_RD 阅读全文
posted @ 2025-11-13 20:41 moonのsun 阅读(28) 评论(0) 推荐(0)
摘要: 规则 每个video_device或者v4l2_subdev就是一个entity 链接关系其实就是不同entity的pad之间的连接 v4l2的pad连接约定:不同entity的pad之间是source -> sink,这和一些地方的约定相反 如果video_device是输出设备,其pad就是so 阅读全文
posted @ 2025-11-12 13:58 moonのsun 阅读(24) 评论(0) 推荐(0)
摘要: 相关规则 video_device是用户空间可见的设备节点,如摄像头、编解码器; v4l2_subdev是不可见于用户空间的中间硬件模块,比如sensor、ISP 一个实体硬件(entity),也可以是 video_device或者v4l2_subdev;两者的结构体内都有media_entity; 阅读全文
posted @ 2025-11-11 21:05 moonのsun 阅读(43) 评论(0) 推荐(0)
摘要: 分类 C++的模板分为函数模板和类模板。 这是一个普通类模板: // 主模板(通用版本) template<typename T> class MyContainer { public: void print() { std::cout << "Generic\n"; } }; 这是一个普通函数模板 阅读全文
posted @ 2025-10-20 11:17 moonのsun 阅读(30) 评论(1) 推荐(0)
摘要: 1 管道 1.1 特点 生产者/消费者模型 半双工:双向,每次都能朝一个方向传输数据 管道作为一组VFS对象,可以使用VFS通用结构访问(比如读写);管道被组织为pipefs这种特殊文件系统,在系统目录树没有安装点,用户看不到它们 管道创建后,返回一对文件描述符,分别用来读和写;然后通过fork() 阅读全文
posted @ 2025-04-24 00:03 moonのsun 阅读(41) 评论(0) 推荐(0)
摘要: 1 块设备磁盘结构 页框:物理内存会分成大小相等的分区,称为页框 页:用户进程的地址空间分成大小相等的区域,且大小和页框相等 段: 块:VFS和文件系统传送数据的基本单位,必须是扇区的整数倍 扇区:硬件设备传送数据的基本单位 2 IO调度程序 块设备驱动程序每次可以传输一个扇区,但是并不是每次需要访 阅读全文
posted @ 2025-04-20 22:21 moonのsun 阅读(23) 评论(0) 推荐(0)
摘要: 1 IO端口映射 IO端口与CPU直连,CPU读取IO端口时需要一个地址,就是IO端口物理地址的映射。 IO映射有两种方式: 内存映射:ARM架构芯片只有一个物理地址空间,因此IO端口直接被内存的一部分,内核像访问内存一样访问端口 IO空间映射:X86架构有专门的IO空间,CPU通过设立专门的I/O 阅读全文
posted @ 2025-04-18 09:17 moonのsun 阅读(124) 评论(0) 推荐(0)
摘要: 1 简介 VFS:Virtual Filesystem Switch,虚拟文件系统转换,VFS 2 VFS支持的文件系统 2.1 磁盘文件系统 Linux使用的文件系统:Ext2(Linux的根文件系统通常是Ex2或Ex3) 微软公司的文件系统:MS-DOS、VFAT、NTFS …… 2.2 网络文 阅读全文
posted @ 2025-04-14 23:49 moonのsun 阅读(52) 评论(0) 推荐(0)
摘要: 1 信号是什么 信号是Unix系统中进程间通信的工具,每个信号对应一个ID; 进程收到某个信号后,会调用设定好的回调函数,以实现进程间的通知和响应。 2 信号的特点 2.1 常规信号和实时信号 Linux中有31个常规信号,以及一些实时信号 信号的一个重要特点是可以被发送给状态未知的进程 —— 如果 阅读全文
posted @ 2025-04-11 00:19 moonのsun 阅读(59) 评论(0) 推荐(0)
摘要: 1 系统调用的流程 在内核态保存大多数用户态寄存器的内容 调用系统服务例程处理系统调用 退出系统调用:把保存在内核栈中的内容加载到寄存器,CPU切回到用户态 2 系统调用的代码示例 // 用户态 xyz() // 内核态 SYSCALL(id, param) // 进入系统调用,用户态 -> 内核态 阅读全文
posted @ 2025-04-08 23:04 moonのsun 阅读(65) 评论(0) 推荐(0)
摘要: 1 思考 我们都知道处理器会在用户态和内核态之间切换;进程调度的时候,也会在用户进程和内核进程之间进行切换。 它们有什么关系呢?是不是用户进程和内核进程之间的切换,才导致处理器在用户态和内核态之间的切换呢? 其他人和我也有一样的困惑: 内核态是指一个特殊的进程,还是指进程的一种特殊状态? 内核是内存 阅读全文
posted @ 2025-04-01 23:56 moonのsun 阅读(238) 评论(0) 推荐(0)
摘要: 1 规则简介 进程地址空间:允许进程使用的全部线性地址,也叫进程的线性区 2 内核和用户进程地址空间的区别 内核的地址空间是共享的,所有内核线程使用一个地址空间;每个用户进程的地址空间是独立的 内核申请动态内存,会立刻进行内存分配;用户进程申请内存会尽可能推迟分配内存 因此,内核要随时准备捕获用户态 阅读全文
posted @ 2025-04-01 09:14 moonのsun 阅读(130) 评论(0) 推荐(0)
摘要: 1 内存和页框管理 RAM的某些部分永久分配给内核,用来存放内核代码和静态内核数据结构; RAM的其他部分称为动态内存,内存管理指的是这块部分内存的管理,不管是内核进程的内存申请还是用户进程。 2 页框 Linux使用4KB页框大小作为标准的分页单元; 页描述符struct page记录了页框的信息 阅读全文
posted @ 2025-03-11 23:54 moonのsun 阅读(52) 评论(0) 推荐(0)
摘要: 1 Linux进程简介 Linux中,进程的优先级是动态的 Linux 2.6开始,内核是抢占式的 内核线程没有自己的地址空间,整个内核共享内核的虚拟地址 Linux采用对称多处理模型,每个CPU地位相同 2 进程分类 进程可以分为普通进程(包括交互式进程、批处理进程)、实时进程。 交互式进程和实时 阅读全文
posted @ 2025-03-03 22:41 moonのsun 阅读(38) 评论(0) 推荐(0)
摘要: 1 内核抢占 定义:内核控制路径被其他内核进程抢占,称为内核抢占 条件:进程描述符thread_info的抢占计数器preempt_count字段<=0 && 中断打开 发生时机: 结束内核控制路径(通常是中断处理程序)时 异常处理程序调用preempt_enable()时 启用可延迟函数(软中断, 阅读全文
posted @ 2025-02-23 12:45 moonのsun 阅读(55) 评论(0) 推荐(0)