- 博客(124)
- 收藏
- 关注
原创 Linux 多线程编程:让你的程序跑得更快、更高效!
本文详细介绍了Linux多线程编程的基础知识及其重要性,包括线程与进程的区别、为何使用多线程以及如何通过`pthread`库创建和管理线程。文中讲解了线程同步的关键机制,如互斥锁(`mutex`)、读写锁(`rwlock`)、条件变量(`condition variable`)的使用方法,并提供了代码示例来展示这些概念的应用。此外,还探讨了线程间通信的方法,包括利用全局变量加互斥锁、线程安全队列以及信号量(`semaphore`)实现数据交换。
2025-03-20 09:15:00
897
原创 掌握 Linux 文件操作函数,让你的代码高效又稳健
本文深入探讨了Linux文件操作的核心API,包括`open`、`read`、`write`、`close`、`lseek`、`stat`和`mmap`等函数的使用方法及最佳实践。文章首先介绍了如何正确地打开和关闭文件,强调了参数传递的重要性以及避免资源泄漏的方法。接着,详细讲解了读写文件数据时需要注意的事项,如处理信号中断和检查返回值。此外,还介绍了高级文件操作技巧,比如利用`lseek`进行文件定位、通过`stat`获取文件信息、采用`mmap`实现内存映射以提高大文件处理效率
2025-03-18 09:15:00
811
原创 eBPF 实时捕获键盘输入
本文将介绍如何使用eBPF技术通过`Go`语言和`libbpfgo`实现键盘输入的实时捕获。文章首先概述了利用eBPF的`kprobe`技术来监听内核函数`input_handle_event`,从而在按键事件发生时捕获数据,并将其传递到用户空间进行处理。文中详细讲解了从硬件中断触发到字符显示在终端上的完整流程,包括内核态与用户态的不同捕获方式。
2025-03-15 21:15:00
774
原创 eBPF XDP 实现简单防火墙
本文介绍了如何使用eBPF的XDP(eXpress Data Path)技术实现一个简单的防火墙。XDP能够在网卡驱动层高速处理数据包,通过几种操作如XDP_PASS、XDP_DROP等来过滤或丢弃不符合规则的流量,相比传统的iptables和tc方案具有更低的CPU开销和更快的处理速度。文中详细讲解了基于IPv4的数据包解析过程以及如何利用eBPF map存储和匹配防火墙规则,实现了对特定源IP、目标IP、端口及协议的数据包进行过滤。
2025-03-13 09:15:00
751
原创 eBPF uprobe审计sshd登录用户和密码
本文介绍了如何使用eBPF的uprobe功能来审计sshd登录用户和密码。首先,文章解释了sshd验证用户密码的流程,特别是auth_password()函数的作用。接着,详细解析了eBPF程序如何绑定到auth_password()函数,通过逐层解引用从ssh结构体中读取用户名和密码,并通过perf_event_output()将信息上报至用户空间。此外,还展示了Go语言部分代码如何加载eBPF程序、创建perf buffer监听事件并解析打印用户名和密码。
2025-03-12 09:15:00
841
原创 eBPF uprobe 跟踪动态库中的函数
本文介绍了使用eBPF的`uprobe`机制来跟踪动态库中的函数调用,特别是针对`libc.so.6`中的`mkdir()`函数。通过`libbpf`自动解析符号地址并附加到目标函数,文中详细讲解了如何定义eBPF程序以捕获函数调用时的参数和进程信息,并通过`bpf_perf_event_output()`将这些信息发送至用户态进行处理。此外,还展示了如何利用Go语言加载和附加eBPF程序,包括自动化与手动指定符号地址的方法。
2025-03-11 09:15:00
814
原创 eBPF uprobe 应用程序跟踪
本文介绍了使用eBPF的uprobe机制来跟踪用户态程序中的函数调用。首先,文章解释了uprobe的基本原理和工作流程,强调了与kprobe的区别在于其针对用户态进程。接着,详细说明了如何通过符号地址挂载uprobe,因为用户态程序的函数地址可能因ASLR而变化。文中还展示了如何利用libbpfgo将探针挂载到指定函数,并提供了Go语言代码示例来加载eBPF程序、绑定uprobe及监听perf buffer以输出目标函数的调用信息。
2025-03-10 09:15:00
697
原创 Go+eBPF kprobe 禁止运行指定程序
本文详细介绍了如何使用Go语言结合eBPF技术,通过kprobe机制拦截Linux系统调用execve来禁止指定程序的运行。首先解释了项目背景与应用场景,如防止服务器重启、未经授权的文件下载等。接着深入探讨了实现原理,包括kprobe的工作方式和如何利用它监听execve调用,以及使用bpf_override_return API修改函数返回值以阻止程序执行。
2025-03-08 09:17:11
1407
原创 Go 语言 + libbpfgo 实战 eBPF 开发
本文介绍了如何使用Go语言结合libbpfgo进行eBPF开发, 并提供实战案例源代码下载和运行讲解。
2025-03-07 09:15:50
1074
原创 Git 从入门到精通:高效管理代码的终极指南
本文详细介绍了Git从入门到精通的各个方面,旨在帮助读者高效管理代码。首先解释了Git的基本概念,包括工作区、暂存区、版本库等核心概念,并通过实例说明如何进行提交和分支管理。接着,文章指导了如何安装和配置Git,以及基础用法如初始化仓库、添加与提交代码、查看状态等操作。进一步,探讨了Git的进阶用法,如远程仓库管理、分支管理、变基、撤销修改及使用stash保存当前工作进度。最后,深入讲解了Git的高级功能,包括标签管理、钩子脚本、cherry-pick挑选提交、子模块、工作区管理、大文件支持(LFS)
2025-03-06 09:15:00
673
原创 C++入门教程:从零开始掌握C++编程
本文详细介绍了C++编程的基础知识,包括其作为一种支持面向对象编程、泛型编程语言的特点及应用场景。文中首先引导读者搭建Linux和Windows上的C++开发环境,使用g++编译器与VS Code编辑器,并演示了如何编写并运行第一个C++程序——“Hello, World!”。接着深入讲解了C++的基本语法与数据类型,如变量、常量、基本数据类型、数组、指针、结构体、类等概念,并提供了示例代码帮助理解。此外,还探讨了控制语句(条件语句、循环语句)以及函数的定义与调用方法。
2025-03-05 09:04:10
772
原创 学会 Linux shell 脚本,让你的工作效率提升 10 倍
本文详细介绍了Linux `shell`脚本编程的基础知识及其应用,旨在帮助读者提升工作效率。首先解释了什么是`shell`脚本及其重要性,包括如何通过脚本实现文件管理、自动化运维等任务。接着深入讲解了`shell`脚本的基本语法,如`shebang`行的使用、注释规则,以及`sh`和`bash`的区别。进一步探讨了变量与环境变量的使用方法,涵盖了变量赋值、类型、只读变量等内容。文章还讨论了条件判断(`if`、`case`)、循环结构(`for`、`while`、`until`)及函数定义与参数传递的方法。
2025-03-04 19:40:30
1186
原创 Linux内核同步机制:掌握原子操作,避免竞态陷阱
本文详细介绍了Linux内核中的原子操作及其在避免竞态条件方面的重要性。文中首先解释了为何需要原子操作,即为了提供比传统锁机制更高效的同步手段。接着展示了Linux内核提供的原子类型(`atomic_t`和`atomic64_t`)以及一系列原子操作API,如加法、减法、自增、自减等,并通过代码示例说明了如何使用这些API实现线程安全的计数器和简单的自旋锁。此外,文章还深入探讨了如何利用比较并交换(`cmpxchg`)技术来实现无锁队列,包括入队和出队的具体实现方法,并提供了相应的代码分析。
2025-03-04 09:15:00
814
原创 Linux内核模块开发入门:GCC、Makefile和Kbuild -- 搞定编译三剑客
本文详细介绍了Linux内核模块开发过程中编译相关的知识,包括GCC、Makefile和Kbuild这三个核心工具的使用。首先解释了每个工具的作用:GCC用于将C代码编译成二进制文件;Makefile定义了程序编译和链接的方式;Kbuild是Linux内核的构建系统,管理着内核模块的构建流程。文中通过一个简单的Hello World例子展示了如何创建、编译、加载及卸载内核模块,并深入探讨了Makefile的具体配置及其在内核模块编译中的重要性。
2025-03-03 20:59:44
883
原创 Linux终端使用技巧与常用命令 -- 让你看起来很专业!
本文介绍了Linux终端的使用技巧与常用命令,旨在帮助读者提高工作效率。文中首先讲解了快捷键和命令行编辑技巧,如Tab自动补全、Ctrl+C中断命令等,接着阐述了如何利用`history`命令查找历史命令及通过管道符和重定向操作数据流的方法。此外,还详细介绍了包括`ls`、`cd`、`rm`在内的多个基本命令及其选项,并分享了使用`scp`和`rsync`进行文件传输的经验。最后,文章强调了通过创建别名简化命令输入的重要性,并说明了如何使这些自定义设置永久生效。练习被提出为掌握这些技能的关键。
2025-03-01 21:00:00
879
原创 TCP/IP协议栈之网络层: IPv4、IPv6、ICMP,你真的掌握了吗?
本文详细介绍了TCP/IP协议栈中的网络层,特别是IPv4、IPv6和ICMP的核心概念。首先解释了网络层在实现主机到主机通信中的关键角色,接着描述了一个数据包从源到目的地的完整旅程,强调了IP地址的作用以及ARP和MAC地址的重要性。文章深入解析了IPv4与IPv6地址结构的区别、子网划分技术及IP地址分配方式,并讨论了NAT在网络中的应用。此外,还探讨了路由的概念及其配置方法,包括静态路由和动态路由的特点。
2025-03-01 09:30:00
888
原创 TCP/IP协议栈之网络接口层: 以太网与wifi -- 一个地上, 一个天上
本文详细介绍了TCP/IP协议栈中网络接口层的两大核心技术——以太网与WiFi,分别代表了有线和无线网络通信的基本方式。文章首先对比了两者在物理特性和数据传输上的基础差异,包括传输介质、速率、干扰情况及适用场景等。接着深入探讨了以太网(IEEE 802.3)的技术细节,如物理层的不同介质类型、数据链路层的工作机制以及以太网帧结构;同时也分析了WiFi(IEEE 802.11)的关键技术特点,涵盖其物理层使用无线电波的特点、不同工作频段及其应用场景,并解析了WiFi帧格式。
2025-02-28 09:15:00
1682
5
原创 程序员必懂网络基础:让你远离90%的网络故障!
本文详细介绍了网络基础的重要性及对程序员的价值,包括快速定位问题、优化网络请求和提升面试竞争力等方面。文中对比了OSI七层模型与TCP/IP四层模型,指出尽管OSI模型在理论上更为详细,但TCP/IP模型更贴近实际应用,是现代互联网的标准。文章还深入解析了TCP/IP协议栈中的关键协议(如DNS、IP、TCP、HTTP)的工作流程,并通过实例说明了从应用层到物理层的数据封装与解封装过程。最后,文章提供了基于分层思想的网络故障排查方法,涵盖数据链路层、网络层、传输层和应用层的具体工具和技术使用建议。
2025-02-27 09:15:00
871
原创 Linux 程序员必修课:命令、脚本、程序、进程与线程的全貌
- **命令** 是 `shell` 解析并执行的基本单位。 - **脚本** 提供了自动化能力。 - **程序** 是 `Linux` 上的可执行文件。 - **进程** 独立运行,`IPC` 负责通信。 - **线程** 共享资源,提高并发能力。
2025-02-26 09:15:00
1718
原创 搞懂Linux文件系统,99%的操作不求人
本文详细介绍了Linux文件系统的关键概念和操作,包括文件系统的类型、结构概览以及磁盘与分区管理。文章首先解释了什么是文件系统及其功能,接着探讨了常见的文件系统类型如ext4、XFS和btrfs的特点及适用场景。文中还深入讲解了如何进行磁盘分区、格式化、挂载等操作,并指导读者如何配置自动挂载。此外,还涵盖了文件权限管理、软硬链接的区别与使用、文件系统的健康检查与修复等内容。最后通过实战案例展示了如何在Linux上创建和管理一个新的文件系统,并分享了一些高级技巧来调整和优化文件系统。
2025-02-25 09:15:00
3856
原创 Linux文件系统揭秘:这些目录到底有什么用?
本文介绍了Linux文件系统的结构,帮助读者理解各个目录的功能和用途,以避免在查找文件时迷失方向。文章首先解释了根目录`/`作为整个文件系统起点的重要性,并详细描述了如`/bin`、`/sbin`存放核心命令,`/etc`用于配置文件存储,`/home`和`/root`代表用户私人空间,以及`/dev`、`/proc`和`/sys`涉及设备与内核信息的关键作用。
2025-02-24 09:15:00
1494
原创 详解 Linux 用户与文件权限管理
本文详细讲解了Linux用户与文件权限管理的核心概念和操作方法。首先介绍了Linux系统中的用户分类,包括超级用户、系统用户和普通用户,并解释了UID与GID机制以及用户组的重要性。接着探讨了用户和用户组的管理命令,如`useradd`、`usermod`、`groupadd`等,用于创建、修改和删除用户及组。文章还深入讲述了文件权限管理的基础知识,涵盖了传统Unix权限模型、特殊权限(SUID、SGID、Sticky Bit)、访问控制列表(ACL)以及能力(Capabilities)。
2025-02-22 09:30:00
741
原创 eBPF的CO-RE用法与原理简介
本文介绍了eBPF的CO-RE(Compile Once – Run Everywhere)技术的应用与实现原理,旨在帮助开发者编写跨内核版本兼容的eBPF程序。文章首先阐述了背景与意义,指出eBPF作为内核级执行环境在多种领域的重要性以及不同内核版本间数据结构差异带来的挑战。接着详细讲解了从代码编写、编译生成BTF信息到程序加载和内核适配的具体步骤,并深入分析了如何确保eBPF代码符合CO-RE标准。
2025-02-21 09:15:00
994
原创 请让你的Go程序优雅退出:避免数据丢失、资源泄露的隐患!
本文详细介绍了如何在Go语言程序中实现优雅退出,以避免数据丢失和资源泄露的风险。首先揭示了强制退出可能带来的五大风险,包括未保存的数据丢失、未释放的资源泄露等,并阐述了优雅退出对系统稳定性和用户体验的重要性。接着,文章讲解了如何使用`os/signal`包捕获系统信号(如SIGINT、SIGTERM),并通过代码示例展示了具体的实现方法。
2025-02-14 09:15:00
537
原创 基于Linux内核模块的USB设备访问控制系统-开发教程
本文详细介绍了基于Linux内核模块的USB设备访问控制系统的开发教程。首先,文章阐述了项目背景与意义,指出USB设备带来的安全隐患如数据泄露和病毒传播,并强调了通过内核级别的访问控制来降低这些风险的重要性。接着,描述了系统的设计目标、功能以及应用场景,包括企业安全管理、个人电脑防护等。在架构设计部分,深入讲解了内核模块的设计细节,特别是如何使用Hook技术拦截USB请求(`usb_submit_urb`函数),以及用户空间与内核空间之间的通信机制。
2025-02-11 09:08:30
994
原创 入门KVM:Linux内核虚拟化原理与实践
本文详细介绍了基于Linux内核的虚拟化解决方案KVM(Kernel-based Virtual Machine),旨在为有一定Linux基础的开发者和系统管理员提供从原理到实践的全面指导。首先阐述了KVM作为一种Type-1 Hypervisor的优势,包括开源、稳定以及与Linux生态系统的高度集成,并对比了其他虚拟化技术如Xen和VMware。接着深入探讨了KVM的核心原理和架构,解释了硬件辅助虚拟化的概念及其在CPU、内存和I/O虚拟化中的应用。
2025-02-10 09:15:00
948
原创 基于eBPF和LSM的强制文件访问控制系统架构设计和实现
本文介绍了一种基于 eBPF 与 Linux 安全模块(LSM)实现的强制文件访问控制系统。该系统利用 eBPF 的高性能和动态加载能力以及 LSM 的系统调用拦截功能,提供了灵活且强大的文件访问控制策略。文章详细描述了系统的设计思路、架构组成、关键代码实现及错误处理方式。通过用户空间程序与内核态 eBPF 程序的协作,实现了对文件操作的实时监控和控制,支持动态更新安全策略而无需重启系统。此外,文中还讨论了未来可能的扩展方向,如增加更多 hook 点、集成其他安全模块以及性能优化等。
2025-02-06 09:15:00
928
原创 eBPF 的 Go 语言库 libbpfgo 源代码分析和使用
本文介绍了eBPF的Go语言库libbpfgo的源代码分析和使用方法。文章首先概述了eBPF在Linux系统中的重要性,以及`libbpf`库如何简化eBPF程序的加载与管理。接着,文章详细探讨了libbpfgo通过cgo桥接Go与C语言编写的`libbpf`库,解决了内存管理、错误处理和性能开销等挑战。文中重点解析了libbpfgo中的三个核心结构体:`Module`负责加载和管理eBPF对象文件;`BPFMap`封装了对eBPF映射的操作;`BPFProg`则用于管理和附加eBPF程序到内核事件。
2025-01-16 09:15:00
1780
原创 搞懂Linux图形界面相关术语
通过本篇文章的学习,你现在应该对Linux图形界面的主要组件和术语有了清晰的了解。从桌面环境、显示管理器,到窗口管理器、合成器,再到X11和Wayland的差异,最后我们还了解了Linux上常用的GUI开发工具包。无论是作为用户选择适合的桌面环境,还是作为开发者编写高效的图形应用程序,这些知识点都将帮助你在Linux世界中更加得心应手。
2025-01-10 09:26:41
847
原创 使用QEMU调试Linux内核 - aarch64
本文介绍了如何在ARM64架构下设置Linux内核调试环境,包括安装所需工具、编译内核、制作根文件系统,以及如何使用GDB进行内核调试。
2025-01-08 09:15:00
1840
原创 深入解析LD_PRELOAD注入动态库.so的原理
本文介绍了`LD_PRELOAD`和`/etc/ld.so.preload`在Linux系统中用于动态库注入的原理及应用。`LD_PRELOAD`允许用户指定共享库来覆盖程序默认库,适用于函数Hook、调试与性能分析等场景;而`/etc/ld.so.preload`则为系统级配置,影响所有程序。当程序启动时,动态链接器会优先加载`LD_PRELOAD`或`/etc/ld.so.preload`指定的库,进而覆盖原有库函数。
2025-01-07 09:15:00
1198
原创 WayLand的架构和协议
Wayland通过简化图形渲染流程,直接与硬件对话,减少了不必要的通信层,提高了性能。其架构中合成器即为显示服务器,可直接从内核获取事件并传递给合成器,避免了额外中间层,从而减少通信开销。`Wayland`利用现代GPU功能确保图像内容即时响应,通过DMA-BUF接口发送绘图命令保持高效运作。
2025-01-06 09:00:00
1825
原创 Linux内核与应用程序通讯 -- 字符设备和ioctl
Linux内核与用户程序之间的通讯可通过多种方式实现,其中字符设备结合ioctl提供了一种简单且灵活的选择。字符设备以文件形式呈现,允许使用标准文件操作如open、close、read和write与其交互。而ioctl则为执行非标准任务提供了接口,例如调整设备设置或发送特定命令。
2024-12-31 08:45:00
794
原创 理解并使用Linux内核等待队列wait_queue
等待队列是Linux内核中非常重要的同步机制,广泛应用于驱动开发和多线程编程。通过本教程,我们掌握了基本的使用方法、底层实现原理,以及高级用法。深入学习等待队列,有助于更好地理解Linux内核的线程调度与同步机制。
2024-12-30 08:43:42
1367
原创 Go语言方法接收者与C++中this指针的对比
- **C++的`this`指针**是隐式传递的指针,允许成员函数访问对象的成员。它对于链式调用和成员函数的实现非常有用。- **Go语言的接收者**则通过显式声明值接收者或指针接收者,达到了类似于C++ `this`指针的效果,但提供了更多的灵活性和可读性。
2024-12-28 09:15:00
921
原创 Go语言接口中的值接收者和指针接收者:用法和区别
1. **值接收者实现的接口**,既可以存储值类型也可以存储指针类型,灵活性高。 2. **指针接收者实现的接口**,只能存储指针类型,明确意图,避免误用。
2024-12-28 09:00:00
716
原创 TCP网络编程:CLOSE_WAIT和TIME_WAIT导致端口耗尽的问题与解决方案
- CLOSE_WAIT问题的根源是代码逻辑错误,修复代码即可解决。 - TIME_WAIT积压的本质是TCP的安全机制,需根据场景选择解决方法: - 强制关闭:使用`SO_LINGER`。 - 快速重用:使用`SO_REUSEADDR`。 - 理解TCP状态和内核行为,才能在解决问题时更有针对性。
2024-12-27 09:08:17
1915
原创 理解并使用 Linux 内核线程
本文介绍了内核线程的概念、创建与管理方法,以及如何编写一个简单的内核线程模块。内核线程是内核开发中强大的工具,掌握它能让我们更高效地处理异步任务和复杂系统问题。
2024-12-26 09:00:00
1304
原创 理解并使用 Linux 内核的字符设备
本文介绍了Linux内核中的字符设备,这是一种支持逐字节数据传输的设备类型,与块设备相比不需要缓冲区。字符设备广泛用于直接硬件交互,如读取传感器或控制外设。文中详细描述了编写简单字符设备驱动的过程,包括定义`file_operations`结构来处理打开、读写和关闭操作,以及使用`register_chrdev`动态分配主设备号。
2024-12-25 09:19:53
1088
原创 理解并使用cmake
`CMake` 是一个强大的跨平台构建工具,它能够简化现代软件的构建过程,尤其适用于复杂项目的管理和构建。通过模块化的设计和平台无关的特性,`CMake` 提供了灵活性和可扩展性,可以使得构建过程更加高效和可维护。了解 `CMake` 的核心语法和高级功能是构建复杂项目的基础,尤其在多平台、多库依赖和自动化构建的场景中,`CMake` 展现出了巨大的优势。
2024-12-24 09:15:00
1089
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人