- 博客(697)
- 资源 (1)
- 收藏
- 关注
原创 Linux基础 -- 进程调度之 CFS 简介
CFS 不再有“固定时间片 + 线性优先级”的老套路,而是用权重(weight)来做“按比例分蛋糕”。
2025-12-12 02:00:00
558
原创 Linux基础 -- 内核对象管理通用工具之 IDR
* 静态定义 *//* 或者动态在结构体里嵌入 */// 初始化/* 释放时 *//* 确保已经移除所有entry(见后面),然后 destroy */只释放 IDR 内部的元数据结构,不会帮你 free 你存进去的对象,真正的对象要自己释放。
2025-12-09 02:00:00
870
原创 Linux基础 -- eBPF 之 BPF_CALL_0 宏用法及设计思想
无参 helper然后配套一个对于 BPF VM / JIT / 解释器它只知道有一个 helper ID;;调用时按 BPF ABI 把 r1…r5 填上,然后call。对于内核 C 代码实现者只需要写一个看起来完全普通的;不必关心 r1…r5、寄存器布局、架构 ABI 等问题。BPF_CALL_0 的日常用法就是写无参 helper的模板。
2025-12-06 01:00:00
630
原创 Linux基础 -- GCC编译优化之 __builtin_constant_p 函数
可以把看成 GCC 给 C 语言加的一个穷人版模板 / constexpr 反射接口它让宏 / 内联函数能够根据参数是否是编译期常量编译期直接算死 → 生成零成本代码;运行期走通用路径 → 保持接口通用性。再配合等,可以在编译期做分支选择,而不是运行时if。对 Linux 内核这种极端追求性能 + 强 GCC 绑定的项目来说,这是个很关键的武器。只把它当作优化 hint + 编译期断言辅助工具**,不要把程序 correctness 建立在它必须识别出常量之上。
2025-12-04 01:00:00
1693
原创 Linux基础 -- 进程运行状态 之 fatal_signal_pending函数
先看当前 task 是否有 pending 信号(包括线程自己的和整个线程组的);很多人想用信号(尤其 SIGUSR1)当作“取消 IO / 取消任务”的手段,等,但因为被屏蔽/忽略/有 handler,不一定被视为“fatal”。只要有任何未决信号(包括可捕获/非致命的),就返回 true;“进程是不是已经要被杀了”,好尽早退出、释放资源,配合。,不要用来处理正常业务上的“取消”“停止”需求。“明明是 kill -9 的结果,怎么返回。,以及经处理后确定为“致命”的信号),
2025-11-30 23:00:00
1704
原创 Linux基础 -- 用户态信号处理之 rt_sigprocmask 函数
所以 strace 打印的这两个只是“人类可读格式”的一个表现,实际在内核层面它们不会真的被阻塞。简单理解:这两条日志说明这个线程在“精细控制”自己的信号屏蔽集合,但不改变 SIGKILL/SIGSTOP 的真实行为。也就是说:当前线程把“几乎所有信号都阻塞了”,只留下这些关键的致命/调试类信号和两个特定的实时信号不阻塞。glibc、JVM、某些 server 程序会在启动时调整默认的信号屏蔽集合,比如屏蔽。就是某个库/运行时在初始化阶段,把一大堆信号给屏蔽掉,仅保留少数“致命信号”。
2025-11-30 01:00:00
1015
原创 Linux基础 -- 用户态消息队列之 mq_timedsend 函数
1,往已经mq_unlink过的队列(仍然存活,fd=62)里,发送一条长度 8 字节、优先级 1 的消息(内容是某个二进制协议);要求 “队列一旦满就立刻超时,不等待”(超时点设成过去的{0,0}此时队列没有满,所以直接入队成功,返回 0。
2025-11-30 01:00:00
916
原创 Linux基础 -- cBPF 笔记整理
面向对象:本文重点:在 Linux 内核中,“BPF” 这个词现在包括两代:classic BPF(cBPF)32 位虚拟机模型寄存器:A(累加器)、X(索引寄存器)少量指令(几十条),无循环(通过指令条数限制保证可终止)典型应用:extended BPF(eBPF)64 位寄存器(R0–R9 + R10),可调用 helper 函数,有 map 等复杂数据结构用 系统调用加载、Verifier 校验应用场景:本笔记文档只记录 cBPF,但会顺带指出一些和 eBPF 的边界。cBPF 可以理解成一个极简的
2025-11-26 02:00:00
410
原创 Windows基础 -- `dir` `ren` `rmdir` `reg query`查询与操作文件的命令
用于「拿回」系统文件/目录的控制权,然后修改 ACL。适合处理驱动文件、日志目录、AppData 下的文件访问权限。确认目标目录下没有同名文件/目录,否则会失败或覆盖冲突。:普通用户可能看不到某些目录(如其他用户配置目录)。修改系统目录权限前,强烈建议先在非系统目录练手。:写错可能导致系统无法正常启动。代表的是哪一项(一般就是当前系统)。对系统目录/重要日志目录改名前要三思。:删除键或值(需要非常谨慎);:在命令行查看注册表键/值;之类的操作,安全性会崩。:不再询问,直接覆盖。,相当于「永久删除」。
2025-11-17 00:29:11
967
原创 CICD基础 -- GitLab Runner 的安装以及使用
是旧模式(项目/组注册 Token),现在官方建议迁移为 UI 创建 Runner → 拿 authentication token → register。现在语义是“这个 Runner 只能被当前作用域使用”。如果你用的是项目级 runner,本来就是给这个项目用的,锁不锁看你需求。后面 GitLab 派 Job 给这个 Runner,全靠这里这堆信息。在 GitLab UI 的 Runner 列表会看到这一串。拿这段命令到你那台 CI 服务器上执行即可。这是关键选项,决定 Job 在哪儿怎么跑。
2025-11-12 02:00:00
1815
原创 CICD基础 -- gitlab-runner 之 executor 字段解析
是在告诉 GitLab Runner:“以后我拿到 CI Job,要用哪种方式、在哪个环境里执行这些脚本。”现在场景密切相关的,按实战优先级排。含义:特点:现在的架构是: 以 Docker 容器形式跑。它通过挂载 去控制宿主机 Docker。当有 Job:所以注册时用:2. 含义:特点:适合:含义:特点:含义:一般不推荐,用得少,管理和安全都麻烦。启动 Runner 容器:在 Runner 容器里注册(关键点是 ):项目 :参数详细解析有三个要点:容器内的 是 gitlab
2025-11-11 01:00:00
1165
原创 Linux基础 -- 零拷贝之 splice
.splice_read` / `.splice_write` 是 VFS 为 `splice(2)` 提供的“**非管道端零拷贝**”钩子。设计思想是**以管道为中心**,通过 **pipe buffer 对页的“引用转移/克隆”** 来搬运数据,避免用户态往返复制;两侧对象只需实现“如何把自己的数据变成/消费成 pipe buffer”,其余由 VFS/pipe 框架负责队列、背压与生命周期管理。
2025-10-31 23:00:00
672
原创 Linux基础 -- 低功耗之如何判定设备空闲 pm_runtime_get_sync
的意思是“刚刚我还在干活,把‘最后一次活跃时间戳’记成现在”,方便 autosuspend 以“上次活跃点”为起点计时。ISR 里会说“OK,本次传输完成,我最后一次忙是此刻,之后可以按 autosuspend 延迟倒计时”。然后 usage_count++ 已经在 get 的时候加过了,表示“现在有人在用它了,别睡”。这等于是说:“我支持 runtime PM,并且上电后如果闲了,按这个超时时间自动睡。你可以把它理解成“我要用这个外设了,先把电打上,把时钟打开”。这一步才是“真正省电”的动作。
2025-10-31 02:00:00
729
原创 Linux基础 -- 进程与线程销毁之 do_exit
do_exit()不是“杀掉进程的函数”,而是“当前线程亲手把自己从一个活的调度实体,变成一个对父进程可回收的僵尸对象,并且在这个过程中按严格顺序释放/解绑一切资源引用”的状态机。谁来清理资源?——> 线程自己(保证一致性和安全性)。父进程如何拿到退出信息?——> 僵尸态 + exit_notify。内核如何让子系统往退出流程里插私货?
2025-10-31 01:00:00
721
原创 Linux基础 -- 快速与用户态共享内核字符串读写之 module_param_string
用是最干净稳妥的方式去导出“可读可写的字符串参数”。把perm设成0644,就可以运行时通过动态更新。你可以在不重启系统、不重载模块的情况下,往内核里塞一段“当前session标签/trace过滤关键字/触发阈值表达式”之类的字符串。你的内核逻辑在关键路径里随时读这个字符串来决定行为,比如“只抓这个会话ID的ftrace调用链”。
2025-10-28 01:00:00
864
原创 Linux基础 -- 内核性能分析之 kprobe 与 kretprobe
kprobe/kretprobe 是内核级的动态探针:不用改内核源码,运行时就能 hook 指定函数。kprobe = 入口拦截;kretprobe = 入口 + 返回成对,可以算耗时,是我们要的。只需开,不用开整套 ftrace 大缓冲。用 kretprobe 钩你的关键函数入口记 start_ns返回记 duration写入我们自己的 per-CPU 小 ring buffer(几十 KB 总占用)用 debugfs 导出来再加 enable 开关来做“按需抓一段窗口”
2025-10-28 01:00:00
744
原创 Linux基础 -- 调度系统之 cond_resched 函数
条件式调度点。在可睡的位置放一个“如果需要就立即让出 CPU”的钩子,既能降低内核长路径的调度延迟,又不改变逻辑语义。持自旋锁/RCU/软中断等场景,用它的专用变体)更安全。
2025-10-25 02:00:00
874
原创 Linux基础 -- 最快暴露模块参数之 module_param
最快捷(无需 show/store,自带读写 u32/atomic_t API),但。,不依赖 device 对象;想在写入时校验/联动?
2025-10-22 01:00:00
253
原创 Linux基础 -- UBIFS文件系统之 ubifs_write_begin
下面把 ubifs_write_begin()的定位、设计思想、内部原理与“怎么用(从调用者与调试者视角)”
2025-10-22 01:00:00
574
原创 Linux基础 -- 文件系统之 PageUptodate
Uptodate=这页里的数据是完整可信的。文件系统据此决定是否要先读满/补零,从而保证页缓存语义正确,避免把垃圾字节写回到底层存储。这是等写入前置逻辑做分支选择的关键标志。
2025-10-22 01:00:00
263
原创 FPGA基础 -- 无毛刺时钟切换(glitch-free clock switching)
FPGA项目优先用官方时钟控制原语(BUFGCTRL/ALTCLKCTRL/CLKMUX2…),在其外围用互斥CE + 低相位更新 + 双域同步的模板即可。ASIC项目:用ICG + 低电平锁存的门控结构替代&/|,维持同样的状态机互斥与更新时机;在STA里做好生成时钟最小脉宽与时钟组隔离约束。若有“输入卡死也要切”的强需求,选用带忽略/强制切换能力的专用单元(不同工艺/FPGA原语的具体脚位名称不同),或增加看门狗配合强制降级策略。
2025-10-17 23:30:00
880
原创 FPGA基础 -- cocotb仿真之任务调度cocotb.start_soon与asyncio的使用注意事项
为什么在 cocotb 里用asyncio、而要用”讲透彻——从调度机制、时间语义、线程安全、异常传播与收尾、以及可替代方案全覆盖。
2025-10-14 23:30:00
665
原创 Python基础 -- Python生成器表达式 next函数与多值筛选实战
特点:可绑定方法(如验证、格式化),适合复杂业务逻辑(如协议解析)。示例(CSI-2包头类):class CSI2Header:def is_valid(self): # 验证包头合法性的方法= 0 # 示例规则# 生成器返回类实例first_header = next(CSI2Header(i, w, csi2_header_kind(w)) for i, w in enumerate(self.words) if 条件)
2025-10-14 23:30:00
875
原创 FPGA基础 -- CDC(Clock Domain Crossing)实战教程
CDC(Clock Domain Crossing)实战教程。7. 验证建议随机相位仿真:两个时钟不整数相关;随机插入事件,统计“事件数==接收脉冲数”。SVA:7.2 事件(脉冲)同步(Toggle)7.3 事件握手(Req/Ack)7.4 异步 FIFO(80b 核心片段,灰码指针)使用案例 1:像素域“行开始/行结束”事件 → 发送域 FSM场景: 下由 边沿产生行开始/结束事件,需要在 域驱动 CSI 发包状态机的开始/收尾。约束与验证LPF:对 双向 。
2025-09-20 23:30:00
834
原创 FPGA基础 -- 源极、漏极、N 型扩散区、浮栅等 MOSFET/半导体器件原理学习路线
半导体物理 → MOSFET 基础 → 工艺流程(扩散区等) → CMOS 电路 → FPGA/IC 应用。这样你不仅知道“源极/漏极/N 型扩散区是什么”,还能真正理解 FPGA、ASIC、存储器件的物理基础。
2025-09-08 12:31:57
1159
原创 嵌入式基础 -- I²C 信号与位层规则
I²C总线协议采用SCL时钟线和SDA数据线双线结构,均需上拉电阻。数据在SCL高电平时有效,低电平时可变化。协议定义了START/STOP条件、ACK/NACK响应机制以及时钟拉伸功能。典型操作包括主机写寄存器、主机读寄存器和顺序读取三种流程。FPGA实现时需注意开漏输出设计、信号同步处理、状态机控制和时序约束。常见问题涉及总线挂起、NACK响应、上拉电阻选型和仲裁丢失处理,需遵循协议规范确保可靠通信。
2025-09-04 23:30:00
1653
原创 USB基础 -- 字符串描述符 (String Descriptor) 系统整理文档
本文系统介绍了USB字符串描述符(String Descriptor)的体系与应用。主要内容包括:1)概念与作用,解释其作为设备可读文本信息的重要性;2)标准格式,采用UTF-16LE编码;3)语言ID描述符机制;4)索引映射原理,说明如何在Device/Config/Interface描述符中引用字符串;5)类扩展应用,如HID、Audio等特定类中的字符串字段;6)厂商自定义扩展方法;7)实战示例展示索引分配与解析流程;8)注意事项包括编码要求、长度限制等;9)总结建议,强调合理的字符串设计对设备识别的
2025-08-18 23:30:00
1295
原创 USB基础 -- USB相关协议字段解析
摘要: USB协议字段分为物理层、协议层包、描述符和状态机四部分。物理层包含SYNC、PID、PAYLOAD等基础字段;协议层包分为Token(IN/OUT/SETUP)、Data(DATA0/1)、Handshake(ACK/NAK)和Special(SOF/PING)四类,各具特定字段结构。描述符(设备、配置、接口、端点)通过固定字段定义设备能力,如版本、类、端点属性等。状态机涉及地址分配、数据交替标志等动态字段。高速模式新增NYET响应和微帧间隔等特性,支持更复杂的传输控制。
2025-08-13 23:30:00
783
原创 USB基础 -- USB2.0设备插入的过程
USB2.0设备插入后,主机首先检测物理连接(D+/D-上拉状态),进行10ms复位。高速设备通过Chirp信号协商速率。主机随后通过地址0的端点0发起控制传输,读取设备描述符获取EP0包大小(bMaxPacketSize0),再通过SET_ADDRESS分配新地址。关键事务包括:SETUP(固定DATA0)、DATA(交替DATA0/DATA1)和STATUS(反向ZLP)。主机以1ms(FS)或125μs(HS)周期发送SOF帧,通过令牌包(IN/OUT/SETUP)调度传输。抓包可见SYNC-PID-
2025-08-13 23:30:00
1602
原创 Linux基础 -- 内核快速向用户态共享内核变量方案之ctl_table
本文提供了一份简洁实用的/proc/sys与sysctl接口使用指南,涵盖核心机制、适用场景及实现方法。主要内容包括: 快速入门:通过注册ctl_table并选择合适的proc_handler,即可创建可调参数,支持sysctl命令和/proc/sys文件操作。 适用场景:适用于系统级可调参数(如调度、缓存、协议超时等),但不适合高频操作或需要稳定设备语义的场景。 核心机制:通过ctl_table结构体定义参数属性,包括参数名、变量地址、权限及解析处理器等。 常用处理器:列举了proc_dointvec、p
2025-08-01 23:30:00
848
原创 硬件基础 -- PLL锁相环
锁相环(PLL)是一种自动控制系统,通过闭环反馈实现输出信号与参考信号的相位同步。其核心结构包含相位检测器、环路滤波器、压控振荡器和分频器,数学模型则通过相位误差方程和闭环传输函数描述。PLL分为模拟、数字和全数字等类型,广泛应用于嵌入式系统的CPU主频生成、DDR时钟控制、MIPI接口和USB通信等场景。设计中需注意晶振选择、电源去耦、布线优化和带宽配置,调试时重点关注锁定状态和输出稳定性。作为时钟生成与同步的核心模块,PLL的合理设计对系统性能至关重要。
2025-07-24 23:30:00
1494
原创 硬件基础 -- 信号完整性
摘要: 信号完整性(SI)问题源于高速信号传输中电信号偏离理想方波,受电磁、物理等因素影响导致波形失真,引发数据错误或系统失效。低速系统(如8051)中导线可视为理想模型,而高速系统(如DDR4、USB 3.0)因频率提升,面临反射、串扰、抖动等问题。根源包括阻抗不连续、电容/电感耦合及电源噪声等。典型高速接口(如PCIe、MIPI)需通过阻抗控制、眼图分析等工具调试。解决方案涵盖布线优化(等长差分线、层叠设计)、终端匹配及电源完整性设计。SI问题标志着硬件设计从功能逻辑转向物理可靠性的关键挑战,需系统性仿
2025-07-23 23:30:00
1154
原创 嵌入式基础 -- ADC(模数转换器,Analog to Digital Converter)
摘要: 本文系统介绍了ADC(模数转换器)的核心知识,涵盖基础原理、架构类型(SAR、Σ-Δ、Flash ADC)、嵌入式应用场景及硬件设计要点(信号链保护、滤波、接地)。针对软件配置(STM32示例)和调试(抖动、精度问题)提供实用方案,推荐典型芯片如ADS1115、MCP3008,并扩展工业级增强设计(隔离、同步采样)。适用于嵌入式开发人员快速掌握ADC选型、优化与故障排查。(150字)
2025-07-17 23:00:00
1285
原创 FPGA基础 -- Verilog 访问寄存器数组的指定位示例
本文介绍了 Verilog 中多维寄存器数组的访问 方法,主要涵盖五种场景:1)访问指定偏移寄存器;2)访问寄存器某一位;3)修改寄存器某一位;4)访问寄存器连续多位;5)组合访问多个寄存器的位。通过示例代码和表格总结,详细说明了不同访问方式的语法格式和应用场景,包括动态索引和位切片操作。这些技巧适用于处理寄存器数组的读写操作,是硬件描述语言编程的基础知识。
2025-07-16 23:00:00
913
原创 Linux基础 -- NAND Flash UBIFS基础特性及注意点
本文系统介绍了NAND Flash存储技术及其UBI/UBIFS管理方案。主要内容包括:1) NAND Flash物理特性分析,重点阐述页/块结构、坏块管理和擦除均衡机制;2) UBI层工作原理,详述其逻辑块映射、坏块管理等功能;3) UBIFS文件系统特性,包括压缩、日志恢复等优势;4) 完整操作流程,涵盖分区设置、格式化、挂载等关键步骤;5) 常见问题解决方案及与其他闪存文件系统的对比。该方案特别适用于大容量NAND Flash的嵌入式系统,能有效解决频繁写入、断电保护等关键需求。
2025-07-04 23:30:00
1119
原创 Linux基础 -- UBI(**Unsorted Block Images**)
UBI(Unsorted Block Images)是Linux中为NAND Flash设计的逻辑管理层,位于MTD层之上,提供坏块管理、擦写均衡和逻辑地址映射等功能。UBI通过PEB、LEB和Volume等概念抽象NAND特性,支持UBIFS文件系统。常用工具包括ubiformat、ubiattach等,适用于嵌入式设备的rootfs和工业存储管理。UBI解决了NAND闪存的坏块、擦写寿命等问题,为上层提供可靠存储支持。
2025-07-03 23:00:00
669
原创 FPGA基础 -- Verilog TCM的概念与实现
TCM(紧耦合存储器)是一种直连CPU核心的高速存储区域,具有低延迟(单周期访问)、高确定性和高性能的特点,常用于实时系统关键数据存取。与AXI总线或普通BRAM相比,TCM无需仲裁,直接耦合CPU,特别适合中断处理、DSP运算等场景。在ARM架构中,ITCM和DTCM分别对应指令和数据存储。Verilog实现上,TCM表现为简单存储接口,通常1周期完成读写。在SoC设计中,TCM可配置为特定地址范围的专用存储器。测试时需验证其单周期响应特性。TCM弥补了缓存不可控的缺陷,是提升实时系统性能的有效方案。
2025-06-27 02:00:00
970
原创 FPGA基础 -- Verilog 建模示例之通用移位寄存器
本文介绍了一种可综合的通用移位寄存器Verilog设计。该模块支持并行加载、串行移位、使能控制和异步复位功能,采用参数化位宽配置,具备良好的可扩展性。文章详细讲解了代码实现要点,包括可综合性、配置灵活性和功能完备性的设计考量,并提供了仿真验证方法和扩展方向建议,如双向移位、环形移位等。该移位寄存器适用于串并转换、延迟线和序列检测等多种应用场景,是FPGA开发中的基础模块。
2025-06-25 23:00:00
938
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅