自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Once_day的回忆

给未来的自己留下一点回忆 | 可互三连(现在最大上限100, 不能及时请见谅)

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

原创 C之(16)scan-build与clang-tidy使用

Clang是一个由Apple主导开发的开源编译器前端项目,旨在提供一个现代化、高效、易于使用和可扩展的编译器工具链。Clang项目的主要目标是为C、C++、Objective-C等编程语言提供更好的编译支持,同时与底层的LLVM编译器基础设施紧密集成。Clang采用模块化的架构设计,将编译过程分为词法分析、语法分析、语义分析、代码生成等多个阶段,每个阶段都有相应的库和工具来处理。这种模块化的设计使得Clang易于理解、维护和扩展,开发者可以方便地为Clang添加新的功能或优化现有功能。

2025-03-30 18:39:37 1161 41

原创 内存检查之Valgrind工具

Valgrind是一个功能强大的开源动态分析工具,主要用于检测和调试C/C++程序中的内存管理和线程同步问题。它最初由Julian Seward在2000年开发,旨在帮助程序员发现难以捕捉的bug,特别是那些与内存相关的错误,如内存泄漏、越界访问、使用未初始化的内存等。经过多年的发展和完善,Valgrind已经成为了业界广泛使用的调试工具之一。它不仅支持Linux,还可以在macOS和Android等平台上运行。

2025-03-26 21:48:33 1290 38

原创 C之(15)cppcheck使用介绍

Cppcheck是一款静态代码分析工具,专门用于检查C/C++代码中潜在的错误和漏洞。它由瑞典程序员Daniel Marjamäki在2007年开发,旨在帮助开发者提高代码质量,减少bug。Cppcheck的诞生源于Daniel在工作中遇到的一些棘手的编程问题。他发现,许多C/C++项目中存在许多常见的编码错误,如内存泄漏、未初始化变量、数组越界等,这些问题不易被发现,但却可能导致程序崩溃或产生安全隐患。为了解决这一痛点,Daniel利用业余时间开发了Cppcheck。

2025-03-23 22:19:25 1433 48

原创 Git(12)GitLab持续集成(CICD)

Continuous Integration (CI) 持续集成:假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。Continuous Delivery (CD) 持续交付:应用程序不仅会在推送到代码库的每次代码更改时进行构建和测试,而且,尽管部署是手动触发的,但作为一个附加步骤,它也可以连续部署。

2025-03-20 21:43:20 1541 36

原创 Linux错误(2)程序触发SIGBUS信号分析

SIGBUS是BUS error的缩写,中文称为总线错误信号。它是Unix/Linux系统中的一种异常信号,通常在访问内存时发生某些类型的错误时产生。地址对齐错误(Alignment Fault):当访问的内存地址不满足硬件的对齐要求时触发。例如在需要4字节对齐的系统上访问一个地址不是4的倍数的int变量。未映射的物理地址访问:试图访问未映射到任何设备的物理地址空间时会触发SIGBUS。这可能是由错误的指针运算或直接访问物理内存导致的。特定于设备的硬件错误。

2025-03-17 23:03:07 1103 37

原创 系统可观测性(5)OpenTelemetry基础使用

OpenTelemetry是一个开源的、独立于供应商的遥测数据收集和管理框架,旨在帮助实现系统的可观测性。它为创建和管理追踪、指标和日志等遥测数据提供了一套标准化的工具和API。

2025-03-14 20:25:06 952 11

原创 Linux错误(5)程序fork子进程后访问内存触发缺页中断(COW)

在一个多线程程序中,使用popen()创建子进程后,系统出现了大量缺页中断(Page Fault),导致瞬间突发耗时(约 50ms)。由于popen()本质上调用了fork(),而fork()在多线程环境下可能会触发写时拷贝(Copy-On-Write, COW),进而导致内存页复制,引发性能抖动。是创建子进程并执行新程序的高效方法,通常用于替代组合。避免fork()继承大量地址空间,减少写时拷贝(COW)和缺页中断。实现方式因系统不同,在Linux,可能使用vfork()进行优化。在macOS,

2025-03-12 21:14:23 2253 34

原创 Linux之kernel(1)系统基础理论(6)

Author: Once Day Date: 2025年3月10日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…

2025-03-10 23:15:36 1515 38

原创 Linux之kernel(1)系统基础理论(5)

内存管理是操作系统的核心功能之一,其主要目标是支持多个应用程序同时运行,并提供内存保护和重定位机制。内存保护确保各个应用程序之间相互隔离,防止非法访问;而重定位使得程序可以在内存中自由移动,而无需修改代码。操作系统引入了地址空间的抽象概念。每个进程都拥有独立的虚拟地址空间,其中包含了代码、数据、堆栈等区域。这种抽象屏蔽了物理内存的细节,简化了程序的编写和内存管理。程序可以在自己的地址空间内自由访问,而不必关心具体的物理内存分配。为了实现地址空间的映射和转换,硬件芯片提供了基址寄存器和变址寄存器。

2025-03-05 00:04:03 879 13

原创 linux之crosstool-NG(1)生成toolchain

Crosstool-NG 是一款用于建立交叉编译器的开源工具。交叉编译器是一种特殊类型的编译器,可以在一种类型的计算机上(称为“主机”)为另一种类型的计算机(称为“目标”)生成可执行代码。这对于嵌入式系统开发者特别有用,他们需要在功能强大的主机上为资源受限的目标设备(如 ARM 或 MIPS 微控制器)生成代码。自定义构建: Crosstool-NG 允许用户选择他们想要的特定版本的 GCC,glibc 和 binutils,以及其他的库和工具。这意味着你可以根据项目需求创建一个精细调整的工具链。

2025-02-28 01:14:02 2083 52

原创 linux之perf(17)PMU事件采集脚本

perf是 Linux 内核提供的性能分析工具,用于监控和分析 CPU、缓存、内存、I/O 等系统性能指标。常用于统计 CPU 使用情况,分析函数调用热点(热点分析),监测硬件事件(如缓存未命中、指令执行),发现性能瓶颈。perf stat是perf的子命令,用于统计系统或进程的性能指标,比如指令执行数、CPU 时钟周期、缓存未命中等。选项作用-e <event>指定监测的事件(如cycles-a监视整个系统-C <cpu>监视指定 CPU-p <pid>监视指定进程-I <ms>每ms。

2025-02-22 21:52:16 1880 51

原创 easelog(1)基础C++日志功能实现

(1) 支持日志级别分类:DEBUG、INFO、WARNING、ERROR,可选支持FATAL。(2) 输出信息类别:时间戳、进程ID、线程ID、函数名、代码行号和日志信息(支持不定参数)。(3) 支持多线程:要求时间戳不能乱序,性能方面没有特别要求。

2025-02-22 21:49:16 1033 5

原创 系统可观测性(4)SRE实践思考(矢量比特)读书总结

自动化的的建设一定要敢想,想后马上行动,不能像做菜一样等着所有的材料都备齐了才下锅,最重要的是快速行动起来,有了最小雏形后小心求证、快速迭代、小步快跑。

2025-02-19 20:29:49 1123 33

原创 Linux之kernel(1)系统基础理论(4)

进程和线程是操作系统中两个基本的执行单位。进程是资源分配的基本单位,而线程是CPU调度的基本单位。每个进程都有自己独立的地址空间、文件资源、内存资源等,而一个进程中可以包含多个线程,这些线程共享进程的资源,但每个线程有自己独立的运行栈和程序计数器。为了让系统中多个进程和线程能够有序地执行,操作系统需要对它们进行调度。调度的目的是为了提高系统的效率,合理利用系统资源,让各个进程和线程都能够获得执行的机会。先来先服务(FCFS):按照进程到达就绪队列的先后顺序来调度,先来的进程先执行。

2025-02-19 20:21:55 1074 2

原创 Linux之kernel(1)系统基础理论(3)

介绍内核线程以及相关的互斥、同步、通信等知识

2025-02-16 10:30:32 1049 11

原创 系统可观测性(2)DistributedSystemsObservability

可观察性团队的目标不是收集日志、指标或跟踪,而是要建立一种基于事实和反馈的工程文化,然后将这种文化传播到更广泛的组织中。对于可观察性本身也可以这样说,它不是关于日志、指标或跟踪,而是关于在调试过程中以数据为导向,并使用反馈来迭代和改进产品。系统可观察性的价值主要来自于从中获得的业务和组织价值。能够快速调试和诊断生产问题不仅可以带来出色的最终用户体验,而且还为服务的人性化和可持续运营铺平了道路,包括随叫随到的体验。只有当构建系统的工程师将可靠性设计放在系统中的首要位置时,可持续的随叫随到才有可能实现。

2025-02-15 13:27:00 888 6

原创 系统可观测性(1)基础概念

文中将可观测性问题映射到了如何处理指标(metrics)、追踪(tracing)、日志(logging)三类数据上。可观测性(Observability)是近年来在IT领域,特别是云原生应用和分布式系统中备受关注的话题。它源于控制论,是。

2025-02-15 13:17:27 1728 32

原创 Linux之kernel(1)系统基础理论(2)

进程是操作系统中一个非常重要的概念。简单来说,进程就是一个正在运行的程序实例。当我们在计算机上启动一个程序时,操作系统就会创建一个进程,分配必要的系统资源,如CPU时间、内存空间等,来支持该程序的运行。每个进程都有自己独立的地址空间,包含程序代码、数据、堆栈等。从操作系统的角度来看,进程是资源分配和调度的基本单位。操作系统通过对进程的管理和调度,合理有效地分配和利用系统资源,使多个程序可以并发执行,从而提高系统的整体性能。不同进程之间一般是相互独立的,互不干扰。

2025-02-12 20:45:22 2710 30

原创 Linux之kernel(3)内核模块编译

Author: Once Day Date: 2025年2月7日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…

2025-02-12 20:37:26 1248 3

原创 Linux之kernel(4)netlink通信

这一段话来自The Linux Kernel Documentation的Introduction to Netlink,它描述了一个事实:netlink缺乏系统的文档描述。这也是本文撰写的动机所在,如果不能了解netlink的”历史用途“,那么很容易陷入片面的观点中,从而导致各种意外发生。Netlink是一种基于网络的机制,允许在内核内部以及内核与用户层之间进行通信。最早在内核2.2引入,旨在替代笨拙的IOCTL,IOCTL不能从内核向用户空间发送异步消息,而且必须定义IOCTL号。

2025-02-09 23:27:00 1883 18

原创 Linux之kernel(2)获取内核代码

linux内核的基本架构如下:运行于用户空间,执行用户进程。运行于内核空间,处于进程上下文,代表某个特定的进程执行。运行于内核空间,处于中断上下文,于任何进程无关,处理某个特定的中断。内核设计一般有两种,宏内核(单个大内核)和微内核。Linux基于宏内核设计,但同时吸收了微内核设计的模块化思想。Linux内核运行在单独的内核地址空间上 ,同时支持抢占式内核、支持内核线程、动态装载内核模块的能力。Linux内核支持对称多处理机制(SMP),对待线程和进程一视同仁,线程就像一些能够共享资源的进程。

2025-02-08 21:59:15 1329 6

原创 Linux之kernel(1)系统基础理论(1)

操作系统首先是软件程序操作系统是计算机系统中最基础、最核心的软件程序。它是计算机硬件与用户之间的桥梁,为用户提供一个方便、高效、安全的工作环境。操作系统管理和控制着计算机系统中的各种硬件资源,如CPU、内存、存储设备、输入输出设备等,合理地组织、调度和分配这些资源,使它们能够协调工作,发挥最大效能。(2)计算机系统的核心和基石操作系统也是其他应用软件运行的基础。它为应用程序提供了统一的编程接口和运行环境,屏蔽了硬件细节,使得应用程序开发者无需关注底层硬件,专注于应用功能的实现。

2025-02-08 21:53:43 12029 28

原创 Linux之kernel(7)系统调用源码分析

系统调用是指内核提供给用户线程,用于和内核自身进行交互的一组接口。这些接口可以让应用程序受限的访问硬件设备,创建新线程并于已有进程进行通信的机制,以及申请操作系统其他资源的能力。为用户空间提供一种硬件的抽象接口。系统调用保证了系统的稳定和安全。进程运行在虚拟的系统中,由系统提供访问内核的手段。系统调用是除了异常和陷入外,内核唯一的合法入口。Linux的系统调用比大部分操作系统都少得多,重点强调Linux系统调用的规则和实现方法。

2025-02-07 00:58:15 1018 5

原创 Linux之kernel(6)Kconfig语法详解

Kconfig是用于内核编译的,其是makefile的帮手,用于定制编译的组件。在c源码的编译过程中,makefile指定c编译的环境变量,头文件,库文件,编译参数等。但是并不是每一个C源码文件都是必须的。因此,Kconfig就会指定当前文件夹内的内核(组件)配置情况。在整个工程内,每个源码目录内都用makefile和kconfig,许多层次的makefile+Kconfig组成了分布式数据库,控制了整个大工程的编译情况。

2025-02-07 00:53:01 1089 2

原创 GCC之编译(8)AR打包命令

GCC中的AR命令全称是Archive,是一个用于创建、修改和提取档案(archive)文件的工具。档案文件通常用于将多个目标文件打包成一个文件,以便于管理和分发。AR命令在Linux/Unix系统的开发和构建过程中经常使用。以下是AR命令的一些常见用法:(1)创建档案文件上述命令会创建一个名为libmylib.a的档案文件,并将file1.ofile2.o和file3.o三个目标文件打包进去。(2)查看档案文件内容该命令会列出libmylib.a档案文件中包含的所有目标文件。(3)

2025-01-25 21:36:53 2999 18

原创 Linux-arm(1)ATF启动流程

ARM ATF-A (ARM Trusted Firmware-A)是ARM官方为ARMv8-A架构提供的一套开源、安全、可靠的参考firmware实现。它主要面向ARM64(AArch64)和ARM32(AArch32)架构,提供了全面的安全世界(Secure World)支持和丰富的功能。ATF-A支持ARMv7-A和ARMv8-A架构系列处理器,包括Cortex-A53/57/72/73/75/76/77等。

2025-01-23 23:29:39 2973 33

原创 2024年度总结-优快云

Author:OnceDay Date:2025年1月21日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…24年非常重要的一个工作是认真总结了TCP详解这本书里面的内容,从网络层往上,总结了大量的文档,逐个协议分析,并且深入阅读RFC资料,养成了阅读标准协议文档的习惯。这部分文档学习和总结时,预期也准备自己实现用户态协议栈来加深理解,但是一直磨蹭,25年这项工作可以开始了。加密报文处理。

2025-01-21 22:19:41 2227 5

原创 C之(14)gcov覆盖率

在现代软件开发过程中,代码质量和可靠性至关重要。为了确保软件的正确性和稳定性,软件测试已成为开发流程中不可或缺的一部分。而在众多软件测试方法中,代码覆盖率测试因其客观、量化的特点而备受关注。代码覆盖率测试是一种白盒测试方法,旨在衡量测试用例对代码的执行覆盖程度。通过插桩等技术手段,代码覆盖率测试工具可以记录并统计测试过程中每一条代码的执行情况,并以此计算出多种覆盖率指标,如语句覆盖率、分支覆盖率、条件覆盖率等。这些指标从不同维度反映了代码的测试充分性,为发现未被测试覆盖的代码片段提供了量化依据。

2025-01-01 14:17:00 1006 8

原创 Git(11)之log显示支持中文

在Linux平台上使用Git时,有时会遇到git log命令输出中文乱码的问题。这通常是由于终端或系统的字符编码设置与Git的输出编码不匹配导致的。下面我们来详细了解一下这个问题的背景、使用情况以及解决方法。Linux系统默认使用UTF-8编码,但有时终端或系统的字符编码设置可能与UTF-8不同,如ISO-8859-1、GB2312等。Git在输出日志信息时,会使用默认的编码方式,通常是UTF-8。当终端或系统的字符编码设置与Git的输出编码不一致时,就会导致中文乱码问题。

2024-12-22 22:51:39 1453 12

原创 Git(10)之忽略指定文件改动

在Git中,我们可以通过多种方式来忽略文件的改动,以避免将不必要的文件提交到版本控制系统中。下面我们来详细介绍几种常见的忽略文件改动的方式,并对比它们的优缺点和适用场景。灵活性高,可以针对个别文件进行操作,而无需修改配置文件。它适用于需要临时忽略特定文件改动的情况,或者需要在不影响其他文件的情况下忽略某些文件的改动。然而,需要注意的是,使用命令忽略的文件信息存储在.git目录中,不会在仓库之间共享。如果需要与团队成员共享忽略规则,还是建议使用.gitignore文件或其他配置文件的方式。

2024-12-21 13:26:20 1615 5

原创 Git(9)之创建新空白分支

在使用Git进行版本控制和协作开发时,我们有时候需要创建一个全新的、独立的分支。这个分支不基于任何已有的提交,而是一个完全空白的起点。创建空白分支的场景主要有以下几种:启动全新项目:当我们要开始一个全新的项目,而不是基于现有的代码库时,就需要创建一个空白分支作为项目的起点。这样,我们就可以从头开始,按照项目的需求和设计来组织代码结构。独立开发实验性功能:在开发过程中,我们可能想要尝试一些实验性的想法或功能,但又不想影响主分支或其他分支的稳定性。

2024-12-21 13:24:17 1696 2

原创 NAT(6)RFC3235友好设计

描述网络地址转换 (NAT) 的其他文档讨论了术语和注意事项 [RFC2663] 和协议问题 [RFC3022]、[RFC3027],或讨论了 NAT 的影响 [RFC2993]。所有这些都与 NAT 机制的各种问题、对协议的影响以及对一般互联网架构的影响有关。本文档的重点是向新协议的作者提供有关在设计新协议时需要考虑的影响的建议,以便在 NAT 网关点不需要特殊处理。当协议无法干净地通过 NAT 时,使用应用级网关 (ALG) 仍可能允许协议运行。

2024-12-15 13:20:17 1496 36

原创 NAT(5)RFC3027应用兼容

当终端节点不在同一个地址域中,并在途中寻求 IP 网络地址转换器 (NAT) 的帮助来桥接这些域时,许多互联网应用程序可能会受到不利影响。NAT 设备本身无法在所有情况下提供必要的应用程序/协议透明度,因此在可能的情况下寻求应用程序级网关 (ALG) 的帮助来提供透明度。本文档的目的是识别在途中与 NAT 不兼容的协议和应用程序。本文档还试图识别任何已知的解决方法。不可能在单个文档中捕获所有与 NAT 不兼容的应用程序。本文档试图捕获尽可能多的信息,但绝不是全面的覆盖范围。

2024-12-15 13:19:23 702 4

原创 NAT(4)RFC2993架构影响

鉴于人们对网络地址转换 (NAT) RFC-1631 的兴趣和部署日益增长,本文将讨论一些架构含义和实施指南。假设读者熟悉 RFC-1631 中提出的地址转换概念。RFC-1631 于 1994 年 5 月发布,由 K. Egevang 和 P. Francis 编写,将 NAT 定义为一种减缓 IPv4 地址使用增长率的手段。但作者担心这项技术的影响。他们在文档中的几处指出,需要进行实验,看看哪些应用程序可能会受到 NAT 标头操作的不利影响,甚至在有任何重大操作经验之前。

2024-12-12 09:42:58 1483 7

原创 NAT(3)RFC3022进阶概念

本文档中描述的 NAT 操作扩展了 RFC 1631 中引入的地址转换,并包含一种新型网络地址和 TCP/UDP 端口转换。此外,本文档更正了 RFC 1631 中发布的校验和调整算法,并尝试详细讨论 NAT 操作和限制。基本网络地址转换或基本 NAT 是一种将 IP 地址从一个组映射到另一个组的方法,对最终用户透明。网络地址端口转换或 NAPT 是一种将许多网络地址及其 TCP/UDP(传输控制协议/用户数据报协议)端口转换为单个网络地址及其 TCP/UDP 端口的方法。

2024-12-07 20:53:57 1665 38

原创 NAT(2)RFC2663常见术语

本备忘录为互联网社区提供信息。它不指定任何类型的互联网标准。本备忘录的分发不受限制。本文档的目的是澄清与网络地址转换器一起使用的术语。术语“网络地址转换器”在不同上下文中的含义不同。本文档的目的是定义各种 NAT 并标准化所用术语的含义。列出的作者是本文档的编辑,其内容归功于工作组成员的贡献。文档中的大部分内容“IP 网络地址转换器 (NAT)”几乎按原样提取,以构成本文档的初始基础。

2024-12-07 20:52:04 1223 2

原创 NAT(1)RFC1631基础概念

RFC1631是由国际互联网工程任务组(IETF)于1994年6月发布的一份文档,主要介绍了IP网络地址转换(Network Address Translation,NAT)技术。NAT的定义与目的:介绍了NAT技术的基本概念,即通过修改IP报文的源IP地址和目的IP地址,实现内部私有IP地址与外部公有IP地址之间的转换。NAT的工作原理:详细描述了NAT设备如何处理进出网络的数据包,执行地址转换的过程。介绍了NAT转换表的概念和结构,用于维护内外地址映射关系。

2024-12-02 23:24:02 1253 11

原创 GCC之编译(7)Linker链接脚本

每个链接都由链接器脚本控制。此脚本以链接器命令语言编写。链接器脚本的主要目的是描述输入文件中的部分应如何映射到输出文件中,并控制输出文件的内存布局。大多数链接器脚本仅此而已。但是,必要时,链接器脚本还可以使用下面描述的命令指示链接器执行许多其他操作。链接器始终使用链接器脚本。如果自己不提供链接器脚本,链接器将使用编译到链接器可执行文件中的默认脚本。可以使用命令行选项显示默认链接器脚本。某些命令行选项(例如-r或-N)会影响默认链接器脚本。可以使用-T命令行选项提供自己的链接器脚本。

2024-10-28 22:30:56 1811 14

原创 网络运输层之(1)TCP连接管理

TCP提供面向连接的可靠数据传输服务。它在传输层协议中占据核心地位。

2024-10-23 21:14:47 2624 50

原创 编码风格之(8)C++语言规范(Google风格)3.md

**最重要的一致性规则是那些控制命名的规则**。名称的风格会立即告诉我们命名实体是什么类型:类型、变量、函数、常量、宏等,而无需我们搜索该实体的声明。我们大脑中的模式匹配引擎很大程度上依赖于这些命名规则。命名规则相当随意,但我们认为一致性比个人偏好更重要,因此无论您是否认为它们合理,规则就是规则(遵循一致性)。

2024-10-17 21:24:52 1153 19

Autotool Tutorial(epita.fr) - Autorools使用教程PDF文档

本教程涵盖如下工具: - GNU构建系统 - GNU自动化构建工具: Autoconf, Automake, Libtool。 获取文本它的目标读者是熟悉Unix开发的人(即假定具有shell、make、C和Unix的基本知识),这些人希望学习使用这些工具,或者只是了解它们的用途。 这些文件是在知识共享署名-相似方式共享2.0许可下发布的。然而,本教程中展示的微不足道的源代码示例(例如C文件、Makefile。和配置。所有amhello项目中的任何一个都可以被重用,就像它们在公共领域一样。 本教程生动而形象的以实例展示Autoconf类工具使用,对于入门程序员来说,是非常好的教程,资源完全免费。

2023-12-16

空空如也

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

TA关注的人

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