- 博客(232)
- 资源 (8)
- 收藏
- 关注
原创 硬件中断、内核IRQ与用户信号的关系图解
硬件中断、内核IRQ与用户信号的关系图解 摘要:计算机系统中存在三级中断机制:硬件设备产生中断信号(如键盘输入)触发CPU处理;内核通过中断向量表调用驱动程序(ISR)处理IRQ,可能唤醒进程或生成信号;最终用户进程接收信号(如SIGINT)执行异步响应。三者形成硬件→内核→用户空间的完整事件链,硬件中断是源头,内核IRQ是枢纽,信号是用户态通知机制,共同实现系统事件的层级传递与处理。
2025-06-12 17:24:34
1
原创 C 如何将当前进程的时区初始化并标准化?或者怎么时间统一为 UTC
《系统时区初始化函数init_tz()解析》摘要:该函数用于标准化系统时区环境变量TZ,确保localtime()等时间函数行为一致,适用于网络程序和嵌入式系统。主要流程包括:调用tzset()初始化时区、获取当前时间并转换、通过strftime提取时区偏移、构建POSIX格式TZ变量(如"TZ=UTC-08:00")、用putenv设置全局环境,最后触发时间函数缓存更新。该技术特别适用于需要固定UTC基准的嵌入式系统、网络协议实现和跨平台代码,但需注意putenv仅影响当前进程,且%z
2025-06-12 15:12:14
6
原创 交换机嵌入式 Linux 系统中的动态链接库
本文介绍了Linux系统中的.so共享对象文件(类似Windows的.dll)。.so文件分为标准库、驱动适配库、业务功能库等类型,存储在/usr/lib目录,具有模块化、内存共享和平台抽象的优势。它们通过动态链接在程序运行时加载,如CLI命令执行时会链式调用多个.so库(解析→业务→驱动)。这种机制实现了功能模块热更新、多进程共享和跨平台支持,是嵌入式系统的重要设计特点。
2025-06-12 14:14:13
44
原创 面向交换机系统的 Pure-FTPd 集成指南
嵌入式交换机运行一个基于 Linux 的定制操作系统(如 Buildroot、Yocto、自研 Linux)系统通常由如下模块构成:内核(Linux Kernel)根文件系统(RootFS)Bootloader(如 U-Boot)自研系统守护进程和网络协议栈第三方组件(如 FTP、SSH、WebUI)步骤动作①拷贝源码至②使用configure和交叉编译生成pure-ftpd③在Makefile中加入install规则,打入 image④编写 CLI 接口控制 FTP 启动/停止。
2025-06-12 14:09:22
3
原创 vsftpd 嵌入式移植全流程教程
《嵌入式Linux系统移植vsftpd详细指南》摘要:本文详细介绍如何在嵌入式Linux设备上移植vsftpd FTP服务器。从获取源码、配置交叉编译工具链,到修改Makefile实现静态编译,重点讲解了功能裁剪方法(关闭PAM/SSL等非必要模块)。提供最小化配置文件示例,说明关键参数设置和启动/测试流程。适用于OpenWRT、定制板等无包管理器的嵌入式环境,帮助开发者在资源受限设备上构建轻量级FTP服务。包含编译参数调整、权限配置等实用技巧,确保移植后的vsftpd稳定运行。(150字)
2025-06-12 08:59:34
6
原创 怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
摘要:对象池是一种高效管理资源的设计模式,通过预分配对象数组(operEntryTbl[])实现。系统包含四个核心组件:空闲链表(operFreeTbl)初始包含所有对象,使用中的对象存入AVL树(operUsedTbl)实现O(logN)检索,待更新对象加入队列(operUpdateTbl)。对象生命周期包含:分配时从空闲链表移除并插入AVL树,修改时加入更新队列,回收时返回空闲链表。这种模式适用于VRRP、网络连接池等高并发场景,有效减少内存分配开销和碎片,实现资源复用。关键优势在于通过组件分工实现高效
2025-06-09 19:24:28
95
原创 设计 IGMP Report/Leave 报文抑制的状态机模型
摘要 本文提出了IGMP报文抑制状态机的设计方案,通过状态机机制有效管理组播组成员加入/离开事件,避免重复转发Report和Leave报文。状态机包含NO_MEMBER、MEMBER_PRESENT、SUPPRESS_REPORT和SUPPRESS_LEAVE四种状态,通过定时器控制10秒抑制期。针对定时器管理问题,建议采用统一软件定时器管理器,通过定时器池、状态标志保护、延时重启机制和软定时器等技术,解决嵌入式网络设备中频繁开关定时器导致的资源竞争问题。文中还提供了状态机伪代码和定时器管理器的具体实现方案
2025-06-09 18:02:51
49
原创 不干扰系统原生 OpenSSH 9.0 和 zlib 1.2.11 的情况下,安全编译并安装旧版 OpenSSH 6.6p1 和 OpenSSL 1.0.2u
以下是详细步骤,用于在 。
2025-06-09 09:37:22
295
原创 开发一个配置文件模块比较功能(附带源码)
增加show running-config compare命令来确认当前配置与start-config的区别
2025-06-03 20:04:36
23
原创 怎么开发一个网络协议模块(C语言框架)之(五) ——通用对象池 + 活跃集管理模式
这段代码展示了VRRP协议实现中的内存管理机制:使用calloc预分配对象池(operEntryTbl数组)来避免运行时频繁内存分配,通过三种数据结构协同管理——空闲链表(operFreeTbl)维护可用对象,AVL树(operUsedTbl)提供高效查找(O(logn)),更新链表(operUpdateTbl)处理状态变更。设计采用双重索引(链表+AVL)兼顾遍历和查询效率,初始化时所有对象加入空闲链表,使用时通过节点转移实现动态复用。关键点包括:比较函数需保证AVL键值唯一性、操作需线程安全、需规范释放
2025-05-28 23:03:24
25
1
原创 链表的初始化和节点的管理
这段代码展示了Linux内核中双向循环链表的初始化过程。通过调用list_add()函数,将预分配的gVrrpInstance.operEntryTbl数组中的所有节点依次插入到operFreeTbl空闲链表中,形成头插方式构建的循环链表结构。该模式常用于对象池管理,实现资源的高效复用,特别适用于VRRP等高可用协议中的状态表管理。最终形成的链表以operFreeTbl为头节点,按逆序连接所有操作表节点,构成完整的双向循环结构。
2025-05-28 22:48:02
28
原创 为什么指针类型成员可以像数组一样用 [] 操作
本文解答了指针类型成员operEntryTbl可以像数组一样使用[]操作访问.node成员的原因。关键点如下: VrrpOperEntry_t* operEntryTbl是指针而非数组 通过malloc分配内存后,指针可以用下标访问元素:ptr[i]等价于*(ptr+i) 访问结构体成员语法合法:operEntryTbl[i].node 前提是必须确保指针已分配连续内存 这种用法在C语言中是合法的,但需要注意在访问前正确分配内存,否则会出现未定义行为。
2025-05-28 22:34:27
26
原创 彻底理解并记住:数组 vs 指针:相同?不同?如何使用?如何避免坑?
摘要:数组和指针在C语言中存在密切关系但本质不同。数组名在表达式中退化为首元素指针,支持指针运算和下标访问,但其内存固定且不可赋值;指针可指向动态分配的连续内存,同样支持数组式访问。关键区别包括:数组是静态内存(sizeof返回总大小),指针是动态接口(sizeof返回地址大小);指针可重定向,数组名不能赋值。典型误区包括未初始化指针访问或试图修改数组名。核心口诀:数组名即首元素指针,指针+索引等同数组访问,二者sizeof结果不同,指针灵活而数组固定。示例中,2[arr]等价arr[2],体现了访问语法的
2025-05-28 22:18:12
27
原创 画图解释avl_create() 中使用 offsetof()
在中使用是为了告诉 AVL 树:每个元素中,哪个字段(偏移量)用作树节点的连接结构。这句的作用是:计算MEMBER字段在TYPE类型中从结构体起始地址开始的偏移量(以字节为单位)。假设node是结构体的第32个字节起始位置,那么这个宏就返回32。结构体插树有技巧,node字段做记号;offsetof偏移量,告诉AVL它在哪。
2025-05-28 19:46:20
104
原创 使用 gdb 时,在输入命令时终端没有即时显示字符,只有按下回车后才显示整行输出
恢复终端到标准模式(包含 echo、换行处理等);🔁 你可以在一个新终端里输入这条命令来恢复当前会话。GDB 被某些程序/插件修改了输入流控制;你启动了某些程序,比如 GDB 附加调试。被重定向,导致输入不再直接回显。:单独启用输入回显。
2025-05-26 16:00:19
159
原创 删除链路本地地址(IPv6 link-local address)时直接删除整个 VRRP 实例 的问题解决。
优势说明☁️ 配置持久不会因系统动态事件丢失配置🧠 可恢复性强接口上下、地址波动自动恢复🔄 支持无中断升级实例状态与配置独立📉 降低误操作影响不再因误删 link-local 地址导致业务掉🤖 更好自动化对接配合 NETCONF/YANG 实现配置状态精准管理下面是完整的一套的参考实现,目的是实现VRRP 实例在链路变化(如 link-local IPv6 地址临时丢失)时不销毁,只暂停运行,待条件恢复后自动恢复运行。
2025-05-26 13:41:03
26
原创 avl_create() 函数深度解析
AVL树通用容器实现的核心是:通过结构体大小和节点偏移量实现泛型管理。主要包含avl_tree_t(存储树元信息)和嵌入用户结构体的avl_node_t节点。其设计理念类似Linux内核的list_head,利用offsetof计算内嵌节点偏移量,配合比较函数实现类型安全的通用数据结构。这种纯C实现方式无需模板/继承机制,通过void*和偏移量访问即可管理任意包含AVL节点的自定义结构体,体现了高效的内核级容器化设计思想。
2025-05-25 22:13:01
26
原创 AVL树最详细图示讲解(含 C 伪代码)
AVL树是一种自平衡二叉搜索树,通过旋转操作保持左右子树高度差不超过1。本文详细解析了AVL树的四种旋转情况(LL、RR、LR、RL)及其处理方式,并提供了C语言风格的伪代码实现,包括节点插入和删除操作。插入和删除时需要更新高度并检查平衡因子,必要时进行旋转以恢复平衡。AVL树保证了O(logn)的时间复杂度,适合需要频繁插入、查找的场景,常用于数据库索引等对性能要求较高的应用中。文中通过具体示例和图解,直观展示了AVL树的平衡维护机制。
2025-05-25 17:04:15
38
原创 图示讲解二叉搜索树的中序遍历代码
本文演示了二叉树的中序遍历递归过程。以AVL树(20,10,30,25)为例,中序遍历顺序为左-根-右,预期输出10 20 25 30。通过递归代码分析,详细追踪了函数调用栈的执行步骤:先递归访问左子树到底部,打印节点后转向右子树。最终输出验证了遍历的正确性,并图示了递归调用的压栈与回溯过程,展示了深度优先搜索的特性。
2025-05-25 16:24:50
24
原创 关于AVL树插入算法解析的几个疑问解析心得
本文解析了AVL树插入操作的源码实现。插入过程分为4步:1)标准BST插入;2)更新节点高度;3)计算平衡因子;4)根据失衡类型进行旋转调整。文章重点解答了三个关键问题:1)更新高度时必须"+1",因为节点高度定义包含当前层;2)必须在旋转前更新高度,因为递归插入可能改变子树高度;3)判断失衡类型时只需比较当前节点与子节点的键值,无需追踪最底层叶子节点。通过递归回溯机制,算法能自动检测首个失衡点并正确判断LL/LR/RR/RL四种失衡类型,确保树保持平衡。
2025-05-25 16:02:30
20
原创 二叉搜索树(Binary Search Tree,BST)—— 笔记整理
本文介绍了二叉搜索树(BST)的基本概念和操作特性。BST是一种每个节点最多有两个子节点的树结构,具有左子树值小于根节点、右子树值大于根节点的特性。文章详细讲解了BST的查找、插入和删除操作流程,展示了构建BST的过程,并指出当输入序列有序时BST会退化为链表的局限性。重点强调了BST的中序遍历能产生升序序列的特性,以及删除节点时需处理三种不同情况的策略。最后总结了BST各操作的时间复杂度,平均为O(logn),最坏情况下退化为O(n),为后续学习平衡二叉树做了铺垫。
2025-05-25 12:50:50
21
原创 怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化
摘要:该代码片段展示了VRRP模块中信号量的创建与使用。原始代码通过注释将二进制信号量(BSem)改为互斥信号量(MSem),原因在于MSem更适合互斥访问场景,且支持删除安全特性。信号量用于保护全局共享资源(如gVrrpInstance)的多线程访问,创建失败时会打印错误并跳转清理。建议统一封装加锁/解锁宏,简化开发并确保线程安全。结论表明MSem比BSem更安全可控,适合协议栈开发需求。
2025-05-24 19:20:32
114
原创 怎么开发一个网络协议模块(C语言框架)之(三) 全局实例
本文介绍了VRRP协议的全局控制结构体vrrpGlbInstance_t及其设计模式。该结构体作为单例管理VRRP运行时的核心资源,包括网络套接字(IPv4/IPv6通信、路由监控等)、统计信息、AVL树资源池(用于VRRP实例、VIP绑定等对象管理)、定时器系统和控制字段。文章提供了初始化伪代码,并总结出通用设计模板:资源句柄+数据结构+统计信息+控制开关+定时器的组合模式,建议可复用于其他协议(如HSRP、LACP)开发。对于多实例场景,推荐采用VRF→instance_map的哈希表扩展方案。
2025-05-24 16:47:55
132
原创 怎么开发一个网络协议模块(C语言框架)之(二) 数据结构设计
本文分析了VRRP协议的数据结构设计模板,总结了网络协议开发的通用设计模式。核心内容包括:1)全局上下文和实体结构设计,采用内存池+三表(Free/Used/Fast)机制;2)实体管理采用自足状态机模型,包含定时器、统计数据和功能链表;3)典型操作流程模板,强调内存复用和状态清理。设计建议包括:统一命名规范、使用链表/AVL树替代动态分配、多路索引优化查找效率。整体呈现了网络协议开发中的资源管理、状态控制和性能优化等关键设计模式。
2025-05-24 16:20:17
121
原创 怎么开发一个网络协议模块(C语言框架)之(一) 整体框架
阶段内容目的配置解析读取启用标志 / 表容量控制是否加载,决定资源规模参数解析优先使用命令行传入参数支持调试灵活性资源初始化建立对象池 / 表 / 链表 / AVL内存静态分配、结构清晰信号处理注册忽略SIGPIPE、处理 crash提高稳定性模块注册注册模块功能、日志、补丁等融入主控进程或框架。
2025-05-24 15:10:58
109
原创 为什么 inet_ntop的 size 不用减 1
不需要-1;会自动处理\0;使用结论说明❌ 不要用会导致误传 buffer 长度,尤其 IPv6 时容易截断✅ 用传入函数会保证不会越界写入✅ 自动加 '\0'所以 buffer 长度要大于等于最大地址字符串长度如你需要兼容 IPv4 和 IPv6,推荐(长度为 46 字节)是最安全的选择。
2025-05-23 09:15:21
25
原创 为什么?mac地址修改,需要会删除 ipv6 vrrp配置其逻辑原因
修改MAC地址后自动删除IPv6 VRRP配置,是出于对虚拟MAC计算依赖、状态一致性、系统稳定性以及安全性的综合考虑。
2025-05-21 09:53:49
349
原创 MLD 组播报文
类型目的地址ICMPv6类型描述要加入的组地址本身(比如 ff3e::abcd:1234)131我要加入MLDv1 Doneff02::2 (所有路由器)132我要退出。
2025-04-28 11:22:28
75
原创 SSH功能移植在编译和部署过程中一点心得
需要在交换机上安装 OpenSSL 1.0.2,并确保 OpenSSH 能够链接到该版本的 OpenSSL。通常情况下,如果交换机没有直接支持的 OpenSSL 版本,你可以通过交叉编译的方式将 OpenSSL 移植到交换机上。5、有更简单的方法吗?编译方式是否需要拷贝 OpenSSL 静态库到交换机是否需要设置环境变量推荐与否静态链接(.a❌ 不需要❌ 不需要✅ 推荐动态链接(.so✅ 需要✅ 需要 LD_LIBRARY_PATH⚠️ 有风险。
2025-04-16 09:43:35
1067
原创 怎么控制在交换机上到底使用哪一个 OpenSSL 版本
自定义的 OpenSSL,这样无论系统是否有 OpenSSL,它都不会受影响。等链接指向新的 OpenSSL。但这种做法风险较大,不推荐在线系统上直接操作。❗注意:程序必须动态链接 OpenSSL,且未使用 RPATH 写死路径。✔️ 优点:部署后不依赖系统 OpenSSL,非常稳定。文件),并处理可能的依赖问题(如 zlib 等)。❗注意:编译过程需要静态版本的 OpenSSL(控制优先使用工程自带的 OpenSSL。✔️ 优点:不影响系统,灵活切换。下的 OpenSSL 动态库。,可能导致系统命令如。
2025-04-10 15:40:09
53
原创 SSH(如 OpenSSH)运行时到底依赖哪一个 OpenSSL
多版本共存(比如 SSH1 用 1.0.2,SSH2 用 1.1.1);静态链接 → 不再需要系统安装 OpenSSL;不管系统环境,在哪都能跑(适合嵌入式);检查就能看到是否链接到系统库。,而是链接你项目里的版本(比如。我这个就是依赖系统自带的。然后部署时别忘了带上。
2025-04-10 15:32:10
77
原创 嵌入式设备运行环境中带的 OpenSSL 1.1.1 是 Linux 系统本身自带的?还是从你工程打包进去的整包文件?
典型输出: → 多半是系统原生带的 → 工程自带打包进去的如果输出类似这样:说明是 系统级库(/lib 或 /usr/lib),很可能是系统自带。如果是:说明是你项目打包进去的路径(例如 或 等),那就是你构建工程时带进去的。检查工程打包目录(可能是 , , 等)有没有以下路径和内容:例如你发现:那说明 OpenSSL 是被打包进 rootfs 的 → 交换机运行环境中是你工程带进去的。如果是某个嵌入式 Linux 系统,比如:再结合上面 的路径,有很大可能是你工
2025-04-10 15:18:21
59
原创 怎么判断当前工程中 openssl 1.1.1(openssh111)是怎么封装/集成/构建的?
找出它是怎么在配置系统里启用的。,我们验证并看下里面有啥。→ 控制是否参与构建。
2025-04-10 15:02:12
370
原创 LDFLAGS=“-Wl,-rpath=/opt/openssl-1.0.2/lib“ 是干什么的?
目标用途是否保留-rpath自己调试开发✅ 建议保留,省事,直接能运行部署/嵌入式系统打包✅ 建议保留,或者用灵活控制多人共用或共享构建❗ 建议去掉,用动态链接方式+显式环境变量或 wrapper 脚本如果后续要写成 Makefile 或.mk。
2025-04-10 14:57:58
216
原创 makefile中的export
部分含义与作用定义变量,在当前 Makefile 中使用导出变量,使其对子 Makefile、子 shell 脚本都可见两步合一:定义 + 导出。
2025-04-09 20:02:53
344
原创 安装OpenSSH 6.6报错
编译时候不报错,安装时候报错解决:环境和依赖检查:二 修改 /opt/openssh-6.6/etc/sshd_config注意:配置了:AuthorizedKeysFile .ssh/authorized_keys就不要配置:#HostKey /opt/openssh-6.6/etc/ssh_host_rsa_key # 密钥路径两者2选1修改后重新安装(不需要make编译)
2025-04-08 16:38:27
330
原创 解决 OpenSSH 6.6p1 配置过程中因 config.sub 过旧导致的失败问题
不干扰系统原生 OpenSSH 9.0 的情况下,安全编译并安装旧版 OpenSSH 6.6p1 和 OpenSSL 1.0.2u已编译安装 OpenSSL 1.0.2u解决办法。
2025-04-08 14:13:10
377
软件开发工具实验-数制转化.rar
2021-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人