- 博客(28)
- 资源 (2)
- 收藏
- 关注
原创 Atomics探究(五)-- Operations on atomic types
本文介绍内容围绕标准《ISO/IEC 9899:201x》7.17.7 Operations on atomic types展开介绍原子操作函数,特别是其底层汇编实现,分析各函数使用哪些汇编指令
2026-02-22 22:22:23
649
原创 epoll_wait使用--自适应缓冲区的批量事件读取机制
上述摘录代码片段通过动态扩容缓冲区、非阻塞续读、扩容上限限制,平衡了事件读取的完整性、内存占用、IO 效率。
2026-01-27 21:39:33
709
原创 一种libc库线程安全函数的封装
libc库线程安全函数的易用性封装。1、本篇以asctime/asctime_r为例进行简单介绍,其他libc函数也可以类似实现2、本篇介绍的2.3及2.4方案都是可行的,但是个人还是比较推荐2.3方案3、api接口设计需要考虑线程安全,性能以及接口易用性4、通过__builtin_alloca使用栈空间比malloc使用堆空间效率更高,当然其有使用局限,后续其他文章再展开介绍。5、__thread还有些使用限制,这里不再展开,后续文章再详细介绍其相关TLS等机制。
2026-01-11 20:35:15
687
原创 Atomics探究(四)-- atomic flag
本篇将研究atomic_flag相关函数底层汇编指令,以及与其他原子操作函数进行比较,探讨其存在的意义。gcc 头文件中定义如下#else#endifclang中定义类似如下3、汇编分析我们将分析如下C代码的汇编// {// }// {// }3.1、测试代码(函数使用)说明从汇编代码的角度看使用atomic_flag代码性能应该是会略微高些的。
2026-01-10 23:24:03
884
原创 Atomics探究(三)-- atomic lock-free
基于本篇介绍函数在linux嵌入式开源工程中几乎没有使用踪迹,再结合汇编代码分析结果,建议无需深究,可以一扫而过。
2026-01-09 20:41:19
432
原创 Atomics探究(二)--Fences
模型,使用无锁(Lock-Free)设计,通过Dirty Backup 机制实现了读写一致性("半写"数据问题)2、atomic_thread_fence使用罕见,使用上有一定的难度,需要一定的逻辑功底,建议慎用。atomic_thread_fence在android bionic工程中有两处使用。atomic_signal_fence未找到相关开源工程代码使用。,主要涉及atomic_thread_fence及原子操作函数。1、atomic_signal_fence基本没有,忽略即可。
2026-01-08 21:47:09
322
原创 巧用gcc查找系统头文件路径
最近想研究一下C语言的原子操作,想查看stdatomic.h时在默认路径/usr/include中发现有好几个clang的,newlibc的,却好像没有gcc的......于是有了如下编译操作。
2026-01-05 21:44:39
164
原创 C语言编码--资源释放
此外,类似的情况还包括未关闭的网络套接字、未销毁的互斥锁等。这些未被正确释放的资源会逐渐累积,最终可能导致程序运行缓慢、内存耗尽或系统资源不足,影响程序的稳定性和性能。在函数do_accept中可以看到,代码并不需要显示调用close,但是fd_accepted也不会出现资源泄露情况。Q1:在C语言编码中,资源忘记释放是一个常见问题,尤其在手动管理资源的场景下。Q2:略微复杂代码逻辑中,可能需要多次添加释放资源代码(注:goto可能是被禁用的)如下。局部变量表示的资源作为返回值或作为出参数情况,如下代码。
2025-12-20 20:15:27
286
原创 systemd代码赏析-C函数的重载
代码路径systemd-259\src\fundamental\logarithm.h_Generic 是 C 语言中一个关键字,由 C11 标准引入,是泛型选择,一种编译时机制,用于根据控制表达式的类型选择不同的表达式。C11标准中相关定义如下。
2025-12-20 16:17:17
653
原创 systemd代码赏析-宏STRLEN-计算字符串长度效率探讨
编译-O2 -O3不再展开,有兴趣可以自行分析一下,需要注意的是有些函数中__builtin_strlen会被编译成call strlen。systemd工程中定义了一个特点场合使用的宏,编译阶段计算了符串长度,有小提升运行效率。2、sizeof(typeof(x[0]))值为1,即减去结束符('\0')长度。2、使用变量作为宏STRLEN参数会导致编译失败,代码中直接return 0。1、systemd采用宏限制参数,限制使用条件,不受编译选项影响。1、""x"" 保证宏参数为常量字符串,而非变量。
2025-12-19 21:01:08
845
原创 libcoap编译及Makefile分析
1、编译可以看下文件BUILDING(v4.3.0) 可以通过如下命令快速编译 ./autogen.sh ./configure ......2、Makefile分析 Makefile由./configure生成的,其编译目标有点绕,本文记录一下分析过程,具体路径如下all: -->all-recursive: # RECURSIVE_TARGETS = all-recursive ......
2025-12-19 20:05:59
170
原创 systemd代码赏析-内存池Mempool
1、改内存池实现小巧,易移植使用2、缺点:从系统分配内存后,只能销毁内存池才能释放内存,不适合有尖峰场景业务3、注意:由于freelist的复用,内存单元大小必须大于sizeof(void *)
2025-12-11 19:20:00
437
原创 参数个数计算宏
glibc中通过巧妙的宏定义实现了可变参数个数的计算。核心机制是利用__INLINE_SYSCALL_NARGS_X宏的固定参数位置,将数字序列倒序排列,当__VA_ARGS__展开后会"推动"数字序列,通过位置偏移获取参数个数。原实现最多支持7个参数,当参数超过7个时需要扩展宏定义:1)增加__INLINE_SYSCALL_NARGS_X的参数数量;2)调整倒序数字序列。如示例中通过添加参数m将支持数扩展到8个。这种方法通过预处理阶段的文本替换实现参数计数,是C语言中处理可变参数的常见
2025-11-13 22:23:23
210
原创 Linux 5.15 arm64 系统调用代码详解
已平台架构相关宏定义在sysdeps/unix/sysv/linux/aarch64/sysdep.h。__arm64_sys_sendto函数中进行了参数转换,再调用__se_sys_sendto。SYSCALL_CANCEL 等宏定义在 sysdeps/unix/sysdep.h。invoke_syscall函数通过系统调用号找到kernel系统调用回调函数。(__VA_ARGS__)是参数数量计算,展开后值为6。__sys_sendto由网络协议栈模块实现了。以SINGLE_THREAD_P展开。
2025-11-13 21:51:45
382
1
原创 u-boot ARMv7 程序入口问题
网络上资料开篇都是_start开始启动u-boot,对比armv8的start.S,他确实是_start开始的。这笔修改中将start.S中的_start:标签等移出了,同时新增了vectors.S。总的来说u-boot的程序入口还是没有变的。start.s汇编中看好像入口是reset。而链接脚本确是ENTRY(_start)
2025-06-25 16:02:40
185
原创 ARMV7-指令官方文档
Application-Level: https://developer.arm.com/documentation/ddi0406/b/Application-Level-Architecture/Instruction-Details/Alphabetical-list-of-instructions?lang=enSystem-Levelhttps://developer.arm.com/documentation/ddi0406/b/System-Level-Architecture/System-
2025-06-23 14:14:57
234
原创 Yocto编译systemd
想研究一下systemd,Yocto工程还是有些不一样,于此简单记录一下。这里会创建build/workspace。3、添加debug代码。# 生成补丁并更新配方。
2025-04-24 19:42:56
294
原创 gcc9.4.0编译及plugin开发环境
2.2 添加参数执行./contrib/download_prerequisites --no-isl。当前目录手动在https://ftp.gnu.org/pub/pub/gnu/中找对应包用浏览器下载。注:我的gcc版本是9.4.0因此gcc-9-plugin-dev。先用gcc plugin搞点事情,参考网上文档先编译gcc。此处网络异常打印:服务器响应时发生错误,正在关闭控制连接。1、下载了本地gcc版本代码gcc-9.4.0。4、但是搞gcc plugin还是有问题。
2025-04-18 19:31:45
447
原创 C lib程序入口
glibc 与 ulibc基本差不多,代码中的注释很重要。注:语法AT&T风格,使用 %% 表示寄存器。参考musl lib 写个hello。musl lib 比较简洁。对比几个开源c lib库。编译:重点是链接选项。
2025-03-27 19:42:38
260
原创 C++ 左值 右值 引用
右值引用(rvalue reference):C++11引入的新特性,用于引用rvalue,使用双&&符号。双重拷贝开销:参数 t 本身是值传递的副本(可能触发一次拷贝/移动构造),初始化 tt 时再次触发 拷贝构造(因 t 是左值)。拷贝开销:对不可拷贝或拷贝成本高的类型(如 std::unique_ptr),此函数无法编译或效率低下。拷贝而非修改:参数为非 const 左值引用,暗示函数可能修改 t,但实际仅拷贝到 tt,易引发误解。无法接受右值:若尝试传递右值(如 test(T{})),会编译失败。
2025-03-25 19:54:14
566
原创 linux各种锁笔记
1、内核态常用锁A、struct mutex m_stMutex;说明:该锁可以睡眠mutex_init(&m_stMutex);mutex_lock(&m_stMutex);mutex_unlock(&m_stMutex);B、其他待更新2、用户态锁A、文件锁说明:适应于进程间保护临界资源;文件XX_LOCKFILE需要读写权限
2014-03-27 22:41:18
748
T-REC-G1.984.3-200507-S!Amd1!PDF-E.pdf
2020-01-04
T-REC-G[1].984.4-200603-S!Amd2!PDF-E.pdf
2020-01-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅