
Linux
文章平均质量分 90
自学、入门,对Linu感兴趣的,均欢迎订阅~
Mr_-G
嵌入式软件开发工程师
展开
-
Git 核心原理与实践
Git作为分布式版本控制系统,由Linus Torvalds开发,专为高效管理代码而生。其核心特性包括:分布式架构:每个开发者拥有完整仓库副本,支持离线工作高效存储:采用快照机制而非差异存储,支持海量分支(瞬间创建)三阶段工作流:工作区→暂存区→仓库,通过git add/commit流转原创 2025-05-27 17:16:30 · 715 阅读 · 0 评论 -
【Linux入门】git rev-parse
gitrev-parse是Git内部的核心解析引擎,主要负责将人性化的版本标识符(如分支名、标签名、相对引用等)转换为精确的40位哈希值。它支持解析多种格式的版本标识,包括完整/缩写哈希值、分支指针、标签引用、HEAD相对引用等。通过参数组合,可以实现哈希验证、路径解析、引用查询等功能。该命令常用于脚本编写,用于获取当前分支、验证提交有效性、定位仓库根目录等场景。作为Git底层指令,它为git checkout、git merge等高级命令提供版本解析支持,是连接用户友好标识与Git内部对象的关键桥梁。原创 2025-05-26 16:04:03 · 939 阅读 · 0 评论 -
VS Code 从入门到实战(Linux 开发工程师版)
Visual Studio Code(VSCode)是微软开发的跨平台轻量级代码编辑器,凭借其灵活的扩展生态和强大的调试功能,成为全球开发者的“效率神器”。本指南专为VSCode小白设计,结合Linux开发场景,从安装到实战,手把手带你掌握核心操作。首先,介绍如何在Linux系统上安装VSCode,支持Debian、RedHat等主流发行版。接着,详细解析VSCode的界面布局,包括活动栏、侧边栏、编辑器区域、状态栏和集成终端。原创 2025-05-14 20:47:25 · 1074 阅读 · 0 评论 -
OpenSSL 在 Linux 系统中的全面解析:从核心原理到实践应用
从 HTTPS 网站的绿色小锁,到手机 APP 的登录加密,OpenSSL 默默守护着互联网的每一次数据传输。能为自己的程序穿上 “防弹衣”,防止用户数据泄露。理解加密算法的本质(而非停留在 “调用 API” 的层面),培养安全编程思维。跟上行业标准(如等保 2.0、GDPR 合规都要求使用 TLSv1.2 + 和强加密算法)。原创 2025-05-13 11:27:50 · 1045 阅读 · 0 评论 -
AUTOSAR(Automotive Open System Architecture)规范详解
随着汽车功能的日益复杂化,尤其是智能驾驶、车联网(V2X)、电动化和共享出行等新兴技术的快速发展,汽车电子系统的设计和开发面临着前所未有的挑战。AUTOSAR 通过提供一个模块化、可扩展的软件架构,帮助开发者降低复杂性、提高开发效率,并确保不同供应商和开发团队之间的兼容性。AUTOSAR 是一个重要的汽车电子标准,为汽车电子系统的开发提供了模块化、可扩展、标准化的解决方案。未来,随着智能驾驶、车联网等技术的不断发展,AUTOSAR 将继续演进,为汽车电子系统提供更加灵活、高效和安全的解决方案。原创 2025-04-17 22:22:06 · 482 阅读 · 0 评论 -
性行为同意协议系统小程序开发指南
本系统通过 “技术 + 法律” 双轮驱动,探索数字化时代性同意确认的新范式。开发者需始终保持技术中立性,明确系统的工具属性,避免陷入法律解释的越权风险。未来可结合 AI 伦理审查、分布式身份(DID)等技术,进一步提升电子证据的可靠性,为构建更安全的亲密关系提供科技支撑。原创 2025-04-20 19:41:29 · 1042 阅读 · 0 评论 -
等待队列完全指南
资源高效利用:通过休眠 - 唤醒机制,避免忙等待,让 CPU 在等待时处理其他任务。异步编程基石:是实现驱动 IO、同步原语、事件通知的底层核心机制。灵活性与通用性:通过可中断 / 不可中断模式、独占 / 共享模式,适应内核几乎所有等待场景。原创 2025-05-08 08:19:42 · 680 阅读 · 0 评论 -
等待相关事件的进程非互斥性
事件是 “通知” 而非 “资源”:多个进程可以同时订阅同一个事件,就像多人同时关注同一个快递通知。等待队列是 “观察者集合”:操作系统维护等待同一事件的进程列表,事件触发时批量通知。唤醒后需处理竞争:虽然等待时非互斥,但处理事件关联的资源可能需要互斥锁等额外机制。原创 2025-05-08 08:19:24 · 885 阅读 · 0 评论 -
Linux 进程资源限制的深度剖析
Linux 的进程资源限制机制,本质是通过一套 “规则系统” 确保每个进程在合理范围内使用资源,就像家长管理孩子一样:既给予足够的自由度,又防止过度索取导致家庭(系统)崩溃。从基础的ulimit到强大的 cgroups,从单个进程到进程组的管理,这套机制是系统稳定性、安全性和公平性的核心保障。能预防 “进程失控” 导致的故障(如内存泄漏、文件句柄耗尽)。能为不同服务分配合理的资源配额(如数据库服务需要更多内存,Web 服务需要更多文件描述符)。能在容器化、微服务架构中实现细粒度的资源隔离。原创 2025-05-08 08:19:05 · 898 阅读 · 0 评论 -
Linux 进程切换的技术内幕
定义:进程运行时的所有状态信息,包括:CPU 寄存器:如通用寄存器(保存临时数据)、程序计数器(PC,指向下一条要执行的指令)、状态寄存器(记录 CPU 当前状态,如是否溢出)。内存状态:页表基址(MMU 用于虚拟地址转换)、当前栈指针(SP)。资源句柄:打开的文件描述符、信号处理状态、线程局部存储等。类比:上下文相当于进程的 “存档文件”,记录了进程运行到哪一步、用了哪些 “工具”。阴(代价)原创 2025-05-08 08:18:46 · 694 阅读 · 0 评论 -
Linux之硬件上下文
硬件上下文是 CPU 在处理特定任务(如进程、线程、中断)时,所有硬件状态的总和。这些状态必须被保存和恢复,才能确保任务切换后执行的连续性和正确性。它是操作系统实现多任务处理、中断响应、虚拟化等功能的底层基石。从硬件视角看,上下文是一组与 CPU 执行环境直接相关的可读写状态参数,其核心作用是在任务切换时提供 “断点续传” 的能力 —— 就像游戏存档记录玩家的位置、血量、装备,以便读档时恢复进度。硬件上下文是 CPU 执行环境的 “快照”,是多任务、中断、虚拟化等技术的底层支撑。原创 2025-05-08 08:18:21 · 746 阅读 · 0 评论 -
具有链表的散列法比从PID到表索引的线性转换更优越
/ 哈希表桶数,定义为质数,减少冲突// 每个桶是双向链表头// 链表节点结构,包含pid和对应的task_structint pid;// 链表节点空间效率:不预设最大范围,按需分配,杜绝浪费。查找速度:通过哈希函数将查找范围从 “全空间” 缩小到 “单个桶”,配合短链表实现近似 O (1) 查找。动态性:增删操作仅涉及链表节点,无需重建整个结构,适合高频变更场景。原创 2025-05-07 21:27:30 · 819 阅读 · 0 评论 -
为什么说由中断或异常处理程序执行的代码不是一个进程
定义:由硬件设备(如键盘、硬盘、网卡)或软件(如定时器)发起的异步事件,用于通知 CPU “有紧急事件需要处理”。分类硬件中断:如网卡收到数据时触发的中断(IRQ),键盘按键触发的中断。软件中断:如 Linux 中的 “软中断”(Softirq,用于延后处理的批量任务,如网络包处理)、定时器中断(周期性触发,用于进程调度)。核心作用:让 CPU 从当前任务中跳出,转向处理紧急事件,实现 CPU 与外部设备的异步通信。原创 2025-05-07 21:15:46 · 799 阅读 · 0 评论 -
中断系统的技术本质与实现原理
从计算机体系结构角度,中断(Interrupt)是指:由硬件设备、软件程序或处理器内部状态变化引发的异步事件,该事件导致处理器暂停当前程序的执行,转而执行预先定义的中断处理程序(Interrupt Handler),处理完毕后返回原程序继续执行的机制。异步性:中断事件的发生时间不可预测,与 CPU 当前执行流程无关(如键盘按键、硬盘读写完成)。强制性:CPU 必须响应中断(除非处于中断屏蔽状态),无法拒绝。可恢复性。原创 2025-05-07 17:49:26 · 679 阅读 · 0 评论 -
从数据结构到操作系统实践
线性转换法像 “用空间换时间的土豪”,在 PID 范围小且连续时有效,但面对真实场景(稀疏、动态、大范围)时力不从心;带链表的散列法像 “精打细算的管家”,通过数学映射将大范围数据 “压缩” 到合理空间,用链表优雅处理冲突,在时间和空间上实现了近乎完美的平衡。这正是 Linux 内核选择它的原因 —— 在资源有限的计算机世界里,效率永远是第一法则。原创 2025-05-07 17:32:03 · 600 阅读 · 0 评论 -
pidhash 表的技术内幕
pidhash 表是 Linux 内核中用于管理进程 ID(PID)的数据结构,本质是一个哈希表(Hash Table),键(Key)是 PID,值(Value)是进程描述符指针(struct task_struct*)。它的核心目标是:O (1) 平均时间复杂度:通过哈希函数将 PID 映射到表中的特定位置,实现快速查找、插入和删除进程。处理 PID 唯一性:确保每个 PID 在系统中唯一,并高效处理 PID 循环重用(比如 PID 耗尽后从 30000 + 回绕到 1)。// 哈希表数组。原创 2025-05-07 17:02:36 · 588 阅读 · 0 评论 -
Linux之哈希表和链表
哈希表:利用 “快递站智能分桶” 思想,通过哈希函数快速定位,用链表解决冲突,实现高效的键值对操作。链表:像 “动态排队的糖葫芦”,适合频繁增删场景,Linux 内核通过list_head实现了与数据类型解耦的双向链表,成为驱动、文件系统等模块的基石。理解这两个数据结构,不仅能掌握编程的核心工具,还能深入理解 Linux 内核、数据库、编程语言(如 Python 的字典、C++ 的)的底层实现逻辑。原创 2025-05-07 16:51:23 · 913 阅读 · 0 评论 -
Linux之Bitmap
Bitmap(位图,又称位掩码、位向量)是一种基于二进制位(bit)的紧凑数据结构,用每一位表示一个元素的二元状态(如存在 / 不存在、可用 / 已用、真 / 假)。其核心优势是空间效率极高,N 个元素仅需ceil(N/8)字节(每个字节含 8 位)。// 定义一个包含n位的Bitmap(内核中常用unsigned long数组)// 示例:分配一个1024位的Bitmap(需1024/64=16个unsigned long)场景特征适合使用 Bitmap不适合使用 Bitmap状态类型。原创 2025-05-07 16:35:47 · 990 阅读 · 0 评论 -
【深度】task_struct 内核级全景图
是 Linux 内核中描述进程的核心数据结构,首次出现在 1991 年的 Linux 0.01 版本(当时叫 ,基于 Minix 操作系统设计)。经过 30 多年演进,它从最初的几十字段膨胀到 Linux 6.x 版本的数百个字段,成为连接 进程调度、内存管理、文件系统、网络子系统、信号处理 等模块的枢纽。 关键特性: 可中断 vs 不可中断睡眠:前者能被信号(如 )唤醒,后者只能等资源就绪(避免竞态条件)。 僵尸状态存在意义:保存退出状态供父进程读取(),若父进程不回收则成原创 2025-05-07 14:19:59 · 763 阅读 · 0 评论 -
为什么说一个线程组中的所有线程使用使用和该线程组的领头线程相同对PID
Linux 通过pid和tgid对外统一:所有线程组内的线程共享 TGID(PID),保持了pskill等工具的兼容性,资源统计以组为单位。对内独立:每个线程有独立的 TID(pid),支持内核调度、信号处理等需要区分单个执行流的场景。实现高效:通过clone()的标志位控制资源共享,复用结构体,避免为线程设计全新的数据结构。这种设计体现了 Linux 内核的 “实用主义哲学”—— 在兼容传统模型的同时,为新特性(多线程)提供支持,成为 UNIX 系系统中线程实现的经典范例。原创 2025-05-07 13:46:40 · 643 阅读 · 0 评论 -
为什么1个页框包含32768个位
二进制本质:计算机以位为基础,页框的位数是页大小与字节单位的自然推导,分层设计:分页机制将内存管理抽象为页(虚拟)和页框(物理),解耦软硬件复杂度,历史传承:4KB 页框是 x86 架构数十年优化的结果,32768 位是这一设计的具体体现。理解 32768 位,不仅是记住一个数字,更是理解计算机如何通过「分块 - 编号 - 映射」的思维,将复杂的内存管理转化为可高效处理的标准化单元。这一思想贯穿操作系统、计算机组成原理的方方面面,是深入学习 Linux 内存管理的重要基石。原创 2025-05-07 11:44:45 · 833 阅读 · 0 评论 -
为什么进程和进程描述符之间有非常严格的一一对应关系
进程是操作系统分配资源和调度的基本单位,是程序的一次动态执行实例。程序计数器(PC):记录下一条要执行的指令地址寄存器状态:保存当前运算的中间结果内存地址空间:包括代码段、数据段、堆、栈等区域打开的文件描述符表:记录进程访问的文件、管道、Socket 等资源进程间通信(IPC)相关信息:共享内存、信号量、消息队列的引用资源限制:如 CPU 时间、内存大小、打开文件数的上限Linux 进程与描述符的严格对应,本质是操作系统对 “确定性” 的追求资源管理的确定性。原创 2025-05-07 11:33:48 · 528 阅读 · 0 评论 -
进程、轻量级进程和线程的深度辨析
早期操作系统(如 DOS)一次只能运行一个程序,程序 = 进程,完全独占资源。随着多任务需求(如边听音乐边写文档),用户空间的线程需要内核支持才能被调度,早期操作系统(如 Solaris)引入cloneCLONE_VMLinux 内核用结构体描述一个 “执行单元”,它既可以是进程,也可以是线程(LWP)。pidmmmm_structmmstackparentchildrenLinux 内核调度器(CFS,完全公平调度器)以niceclonegettid()ps -eLf。原创 2025-05-07 11:07:04 · 828 阅读 · 0 评论 -
轻量级进程(LWP)的技术本质与 Linux 实现
轻量级进程是 Linux 实现高效并发的核心机制,它巧妙平衡了 “资源共享” 与 “调度灵活性”,成为用户线程与内核调度之间的桥梁。从早期的 pthread 库到现代的容器技术(如 Docker 容器本质上是受限的 LWP 组),LWP 的思想贯穿 Linux 系统设计。如何与用户态协程、内核态轻量化容器(如 eBPF 程序)协同工作;实时调度与能效优化的进一步结合;大规模线程组(如十万级 LWP)的调度算法优化。原创 2025-05-07 10:38:05 · 1029 阅读 · 0 评论 -
Linux之进程
隔离性:每个进程拥有独立的资源沙箱,避免互相干扰(如内存、文件、权限隔离)。动态性:程序运行时才创建进程,按需分配资源(如fork()时分配 COW 内存,open()时分配文件描述符),结束时自动回收。可控性:操作系统通过进程控制块()精准管理每个进程的资源使用,实现调度、监控、限制和故障恢复。对于 Linux 学习者来说,理解进程的资源分配角色,是掌握进程调度(topps命令)、内存管理(pmapvalgrind工具)、文件 I/O(lsof查看文件句柄)的基础。原创 2025-05-07 09:13:08 · 1235 阅读 · 0 评论 -
Linux之SUID/SGID/ 粘滞位
作用:当用户执行一个设置了 SUID 的可执行文件时,临时以文件所有者的身份运行该程序,而不是以用户自身的身份。生效条件必须是可执行文件(脚本、二进制程序等),设置在目录或不可执行文件上无效。执行时触发,执行结束后权限收回。权限位表示所有者的执行位(x)被替换为s,如原本是rwxr-xr--(754),设置 SUID 后变为rwsr-xr--(4754)。如果原本所有者没有执行权限(x=0),则显示为rwSr-xr--(即大写 S,表示无效的 SUID)。作用。原创 2025-05-07 08:26:30 · 630 阅读 · 0 评论 -
Linux之硬链接
一切皆文件:通过 inode 将文件内容与文件名解耦,允许同一内容有多个入口最小数据冗余:在不复制数据的前提下,实现文件的多重引用理解硬链接,需要跳出「文件名即文件」的思维定式,认识到文件名只是访问文件内容的入口之一。当你在 Linux 中创建硬链接时,你不是在创建一个「副本」,而是在为同一个文件实体添加一个新的「门牌号」—— 所有门牌号都通向同一个房间,房间里的家具(数据)永远只有一份。原创 2025-05-06 22:38:19 · 740 阅读 · 0 评论 -
Linux之守护进程
从技术角度看,守护进程是通过forksetsid等系统调用实现的特殊进程形态,具备脱离终端、长期运行的能力;从架构角度看,它是 Linux 系统 “一切皆服务” 理念的基石,支撑着网络通信、定时任务、硬件管理等核心功能。后台运行(脱离终端)、持续服务(不随用户退出终止)、默默守护(无需交互界面)。当你在终端输入看到绿色的时,就是守护进程正在履行 “服务承诺” 的证明。原创 2025-05-06 22:29:11 · 840 阅读 · 0 评论 -
Linux 之 前台进程 vs 后台进程
物理终端:早期的字符显示器 + 键盘(现在几乎不用)。虚拟终端:Linux 按下打开的控制台(tty1~tty6)。图形终端:X Window 下的终端模拟器(如 GNOME Terminal、Xshell)。网络终端:通过 SSH 远程连接的终端会话。接收用户输入的命令(如键盘输入)。显示进程的输出(如命令运行结果、错误信息)。向进程发送信号(如Ctrl+C发送SIGINT信号终止进程)。会话是一组相关进程的集合,通常由一个终端登录开启。原创 2025-05-06 22:22:32 · 947 阅读 · 0 评论 -
Linux之通配符
通配符看似简单,实则是 Shell 脚本编程的核心基石。从基础的和?到进阶的extglob模式,掌握它们能让你在处理批量文件时事半功倍。记住:通配符的本质是 “模式匹配”,学会用它描述 “一类文件” 而非 “一个文件”,你就掌握了 Linux 自动化的关键思维。原创 2025-05-06 22:09:33 · 781 阅读 · 0 评论 -
Linux 重定向技术
解耦输入输出:让命令与数据来源 / 去向分离,实现 “关注点分离”。自动化基础:是 Shell 脚本、批处理任务的核心机制,支撑日志管理、数据处理等场景。系统集成:通过重定向连接不同工具(如),构建复杂的数据处理流水线。掌握重定向后,你将真正理解 Linux “管道哲学”—— 每个命令专注于单一功能,通过重定向和管道组合成强大的工作流。从简单的日志归档到复杂的 ETL(抽取 - 转换 - 加载)流程,重定向都是底层的 “数据桥梁”。原创 2025-05-06 21:35:52 · 652 阅读 · 0 评论 -
x86-64 架构下的四级分页模型
分层管理:将超大虚拟地址空间拆解为四级索引,避免单级页表的内存爆炸问题。按需分配:仅为已使用的虚拟地址创建页表,节省内存。兼容性与扩展性:支持 48 位 / 57 位虚拟地址,适应 64 位架构的长期演进。性能平衡:通过 TLB 和大页技术,在地址转换效率与内存占用间找到平衡。原创 2025-05-06 14:20:51 · 870 阅读 · 0 评论 -
Linux之转换后援缓冲器(TLB)
TLB 是 CPU 与内存之间的 “翻译官加速器”,通过缓存常用的地址转换关系,将原本需要多次内存访问的页表查询优化为硬件级的直接映射。理解 TLB 的工作原理,不仅能掌握操作系统内存管理的核心机制,还能在性能调优、程序设计中针对性地减少地址转换开销。从硬件架构到软件协同,TLB 体现了计算机系统 “局部性原理” 的经典应用,是连接虚拟与物理世界的关键桥梁。原创 2025-05-06 14:10:45 · 894 阅读 · 0 评论 -
Linux之高速缓存侦听
局部性:通过缓存副本提升速度,容忍数据暂时不一致。一致性:通过侦听机制在必要时(写操作时)强制全局同步,牺牲部分带宽换取正确性。这一设计思想贯穿计算机系统:从 CPU 缓存到分布式数据库(如 Redis 的主从复制、ZooKeeper 的 Zab 协议),都是在 “性能” 与 “一致性” 间寻找最优解。原创 2025-05-06 13:53:10 · 892 阅读 · 0 评论 -
Linux 存储子系统中的通写与回写
通写和回写是计算机系统中典型的“CAP 理论”通写选择了一致性(C)和可用性(A)(假设磁盘可用),牺牲性能。回写选择了性能(P)和可用性(A),牺牲强一致性(允许短暂分区容错)。理解两者的核心在于把握数据的“耐久性需求”若数据丢失会导致灾难(如金融交易),选择通写或强制同步机制。若性能优先且允许一定数据丢失(如临时日志),回写是更优解。Linux 通过精巧的脏页管理和后台回写线程,在大多数场景下实现了 “性能与可靠性的平衡”,而作为开发者,需根据具体业务需求选择合适的写入策略,必要时结合。原创 2025-05-06 13:34:38 · 691 阅读 · 0 评论 -
Linux之硬件高速缓存内存
硬件高速缓存内存是计算机系统中 “时间换空间” 的经典范例:用相对小容量的高速存储(成本可控),通过精妙的局部性原理和硬件机制,将 CPU 的平均数据访问时间降低 1-2 个数量级。从单核心的 L1/L2 分层,到多核时代的一致性协议,再到 3D 堆叠等创新,缓存技术始终是突破 “内存墙” 的核心手段。对于 Linux 用户和开发者,理解缓存原理不仅能优化程序性能(如编写缓存友好的代码),还能深入分析系统瓶颈(如通过perf定位缓存失效问题)。原创 2025-05-06 11:29:38 · 617 阅读 · 0 评论 -
从计算机体系结构到内存管理机制
虚拟地址空间划分:32 位系统中,用户态进程默认使用 0~3GB 虚拟地址,3~4GB 为内核专属,由页表权限位(U/S)和 CPU 特权级(Ring 3)共同保护。硬件级保护机制:MMU 通过页表项的权限位阻止用户态访问内核空间,触发段错误(SIGSEGV64 位系统的改进:虚拟地址空间扩展,用户态和内核态隔离方式类似,但不再受限于 4GB,而是更大的地址范围(如 128TB+)。用户态进程不能使用大于 4GB 的物理地址空间,本质是操作系统通过虚拟地址空间划分和硬件级权限保护。原创 2025-05-06 11:11:57 · 765 阅读 · 0 评论 -
Linux 启用 PAE 时的页表初始化机制
x86 架构的 32 位 CPU 原生支持 32 位物理地址(4GB),但通过 PAE(1995 年随 Pentium Pro 引入),可支持 36 位物理地址(64GB)。PAE 的核心是将页表结构从两级转换为三级,并调整页表项的格式:PAE 下,PTE 从 32 位扩展到 64 位,高 20 位存储物理地址的高 20 位(36 位物理地址 = 16 位(PGD+PMD)+20 位(PTE)),低 12 位为标志位(权限、缓存、脏页等)。页目录表(Page Global Directory, PGD)注意原创 2025-05-06 10:50:40 · 838 阅读 · 0 评论 -
为什么PAE页表项必须包含12个标志位和24个物理地址位
24 位物理地址存储:通过 64 位页表项,突破传统 20 位限制,支持 36 位物理地址(64GB),满足服务器对大内存的需求。12 个标志位:细化内存页的权限、缓存策略、状态跟踪,为操作系统提供更精细的控制能力(如内存保护、性能优化、错误排查)。页表项从 32 位到 64 位的扩展,为后续技术(如大页、虚拟化页表)奠定基础。标志位的分层设计(权限、缓存、状态)成为处理器与操作系统协作的经典范式。原创 2025-05-06 10:33:57 · 817 阅读 · 0 评论 -
Linux之内核为什么不能对1GB以上的RAM进行寻址
早期设计限制:32 位内核将虚拟地址空间划分为 3GB 用户 + 1GB 内核,内核空间不足。硬件寻址限制:无 PAE 时,32 位 CPU 最多支持 4GB 物理内存,且内核空间只有 1GB,无法直接映射超过 1GB 的物理内存。解决方案的代价:PAE 和 HighMem 机制虽然让 32 位内核支持更大内存,但性能和稳定性问题显著,最终被 64 位架构取代。原创 2025-05-06 09:18:54 · 795 阅读 · 0 评论