- 博客(584)
- 收藏
- 关注
原创 从Intel开发手册看x86指令格式(含手动将指令转化为机器码的方法)
本文介绍了x86汇编指令翻译为机器码的方法,重点讲解了操作码、ModR/M字段、SIB字段的查找和使用。通过7个具体例题,详细演示了mov和add等指令的机器码转换过程,包括寄存器编号查找、寻址方式确定、偏移量和立即数处理等关键步骤。文章还提供了Intel开发手册和在线反汇编工具作为参考,帮助读者理解x86指令编码格式,并验证翻译结果的正确性。
2025-03-24 09:50:52
2283
2
原创 【x86汇编】C语言的switch&case结构的反汇编分析
push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。
2024-10-29 19:57:40
1945
原创 LKDS3.Linux内核的双向链表代码解析(3) 进程树遍历(上) 前置知识: children、sibling、real_parent、parent以及ptrace()调试进程
本文通过Linux内核双向链表遍历算法,解析了task_struct中tasks、children、sibling等链表成员,以遍历进程树。深入实验对比普通情况与ptrace特殊场景,阐明real_parent与parent字段的差异,并据此推导waitpid()校验父子关系的实现依据,最终将链表思想应用于LeetCode扁平化多级双向链表问题。
2026-10-02 20:31:04
148
原创 LKDS2.Linux内核的双向链表代码解析(2) 遍历算法
本文系统解析Linux内核双向链表的遍历机制,重点剖析list_for_each_entry系列与list_for_each系列宏的实现原理。核心在于container_of宏通过成员地址反推结构体首地址,结合offsetof计算偏移量,实现高效遍历。list_entry即container_of的别名,用于获取嵌入链表的结构体指针。文中还详细分析了正向/反向遍历、继续遍历、从指定节点遍历等框架,并通过实验验证__mptr在类型安全处理中的关键作用。最后介绍链表节点计数等实用工具函数,全面揭示内核链表操作的
2026-09-29 15:13:30
382
原创 LKDS1.Linux内核的双向链表代码解析(1) 初始化、插入、删除、判空
Linux内核list.h中双向循环链表结构,包括类型判断、初始化方法如LIST_HEAD_INIT和INIT_LIST_HEAD,WRITE_ONCE的必要性,插入删除函数如list_add、list_add_tail、__list_add、list_del等,以及无锁并发访问考虑。
2026-09-20 13:13:54
235
原创 130.【C语言】可变参数宏
本文回顾宏的基础知识,重点讲解C语言中可变参数宏的使用。可变参数需置于有名参数之后,用...表示,__VA_ARGS__作为占位符替换实际参数。通过##可处理空可变参数情况,避免多余逗号。示例展示宏展开与运行结果,帮助理解预处理阶段的宏替换机制。
2026-09-11 14:33:43
265
原创 OS86.【Linux】读者-写者模型
读者-写者模型类比班级黑板报场景,写者互斥更新内容,读者可共享阅读。该模型遵循"123原则":1个数据交换场所,2种角色(读者、写者),3种关系(写者互斥、读者共享、读写互斥同步)。通过读写锁实现同步控制,pthread库提供相关函数接口。读者优先策略可能导致写者饥饿问题,需通过计数器管理读写顺序。与生产者-消费者模型不同,读者不取走数据,仅读取内容。
2026-09-08 16:19:43
228
原创 提交Linux内核补丁的方法
Linux内核贡献补丁的完整流程:安装git及git-email、克隆linux-next分支、配置git发送邮件、建立开发分支、修改代码、撰写提交信息、生成并检查补丁(用checkpatch.pl)、发送补丁及遵守窗口期。还提及AI辅助开发规范与新手可做的清理任务。
2026-09-03 20:23:46
265
原创 vibecoding心得(3): 使用OpenCode测试模型,分析POST请求
OpenCode工作目录与使用建议,模型/APIKey配置,抓包分析显示发送“你是谁?”消耗7727 tokens是因为OpenCode自动附加的系统提示词与标题生成任务,最后总结temperature、top_p、top_k参数区别。OpenCode需在专用空目录运行以防误删文件
2026-08-30 13:51:42
95
原创 OS85.【Linux】分析glibc-2.43 x86_64版本的自旋锁的底层原理
glibc-2.43 x86_64版本自旋锁的实现原理。通过对比pthread_spin_lock.S和pthread_spin_trylock.S的汇编代码,揭示了两种锁的核心区别:pthread_spin_lock采用循环等待机制,使用lock dec指令原子减锁值并配合pause优化;而pthread_spin_trylock使用xchg指令尝试获取锁,失败立即返回EBUSY。文章还指出x86_64和i386版本的pthread_spin_init实现相同,并摘录了Raymond Chen关
2026-08-26 20:30:58
276
原创 OS84.【Linux】各种锁(重点分析glibc i386版本的自旋锁的底层原理)
介绍互斥锁、悲观锁、乐观锁和自旋锁的概念,重点分析了自旋锁的底层实现原理。自旋锁通过循环尝试获取锁而非挂起等待,适用于临界区执行时间短的场景。文章详细讲解了pthread库实现自旋锁的两种方法,并通过分析glibc汇编代码(i386架构)深入剖析了自旋锁的加解锁机制。其中,pthread_spin_lock使用lock前缀保证原子操作,通过循环检查锁状态实现自旋;pthread_spin_unlock则直接设置锁值为1释放锁。文章还介绍了相关的调用约定、lock前缀作用和处理器指令等前置知识,为理解自
2026-08-18 12:13:18
185
原创 VSCODE远程链接错误: 无法建立链接,过程试图写入的管道不存在的解决方法
本文档提供SSH连接故障排查指南,针对“管道不存在”及权限错误(如Bad owner or permissions)问题。重点说明.ssh/config文件权限要求(仅限当前用户完全控制),并给出PowerShell重置权限命令(使用icacls)。同时强调操作风险,建议提前备份、确认环境差异,非专业用户需咨询技术支持。免责声明指出文档内容仅供学习参考,使用者需自行承担操作后果。
2026-08-13 19:56:25
312
原创 OS83.【Linux】线程安全的单例模式
介绍单例模式的两种实现方式:饿汉式和懒汉式。饿汉式在类加载时就创建实例,而懒汉式在首次使用时才创建实例,具有延迟加载特性。重点分析了懒汉单例模式的线程安全问题,提出了通过双重检查锁定机制来优化性能。最后将线程池改造为懒汉单例模式,通过静态成员指针、私有构造函数和双重检查锁定等技术,既保证了线程安全又提高了效率。文章还区分了系统层的内存延迟分配与应用层的懒汉模式概念差异。
2026-08-10 09:49:15
256
原创 OS82.【Linux】设计线程池
线程池的实现原理与设计方法。线程池通过预先创建一批空闲线程来减少频繁创建线程的开销,采用生产者-消费者模型处理任务。文章详细讲解了基于C++的线程池实现,包括线程池类的设计、任务队列管理、线程同步机制(互斥锁和条件变量)以及任务分配策略。同时分析了Java线程池ThreadPoolExecutor的工作原理,包括核心线程数、最大线程数和队列容量的关系,并通过面试题案例计算了线程池执行45个任务(每个耗时50ms)的总耗时200ms,展示了线程池参数配置对性能的影响。
2026-08-08 08:00:00
216
原创 OS81.【Linux】基于环形队列的多生产者-多消费者模型
介绍将单生产者-单消费者环形队列模型扩展为多生产者-多消费者版本的方法。通过在生产者之间和消费者之间分别添加互斥锁(_p_lock和_c_lock),解决了多线程并发访问导致的资源竞争问题。关键改进包括:1)采用先申请信号量后加锁的方案(方案2)提高并发效率;2)在push和pop操作中合理放置锁操作以保护下标变量;3)通过分离生产者和消费者的互斥锁实现更高程度的并行性。测试结果表明该模型能有效支持多线程并发操作。
2026-08-05 11:20:48
205
原创 OS0.【Linux】服务器基础知识
介绍了服务器的核心概念:服务器本质是高性能计算机,具备高稳定性、强吞吐和扩展性。文章涵盖了外形分类(机架式、塔式等)、关键硬件细节(冗余电源、多盘位、多CPU及不同架构),并以Dell服务器为例解析了内部结构。此外,还梳理了云服务器平台、国内外差异、常见操作系统、特定服务器类型(如ECS、VPS)及选购指标(带宽、并发量)和注意事项。
2026-07-30 17:08:16
278
原创 OS80.【Linux】基于环形队列的单生产者-单消费者模型
基于环形队列的生产者-消费者模型实现。主要内容包括:1)理论分析环形队列中生产者与消费者的三种状态关系;2)使用信号量实现单生产者-单消费者模型,通过_p_space_sem和_c_data_sem两个信号量分别控制空间和数据资源;3)给出完整的C++代码实现,包含环形队列类模板、生产者和消费者线程函数;4)探讨如何将该模型应用于LeetCode循环队列问题,指出需要注意信号量操作不修改原始值的特性,并提供两种正确实现方案:通过sem_getvalue获取信号量值或直接访问sem_t底层数据结构。
2026-07-28 14:56:47
218
原创 OS79.【Linux】POSIX信号量
本文介绍了POSIX信号量的原理与实现。首先回顾信号量的基本概念,指出信号量是保证PV操作原子性的计数器。随后详细讲解了POSIX信号量的主要系统调用:sem_init(初始化)、sem_destroy(销毁)、sem_wait(P操作)、sem_post(V操作)等。通过glibc-2.43源码分析发现,sem_t实际上是一个联合体,系统调用通过强制类型转换将其作为结构体使用,以隐藏内部实现细节。文章还比较了信号量与锁的区别,指出PV操作无需手动判断资源状态,简化了临界资源访问逻辑。最后通过生产者-消费者
2026-07-18 11:28:35
269
原创 OS78.【Linux】线程互斥(7) 基于阻塞队列的多生产者-多消费者模型
介绍了基于阻塞队列的生产者-消费者模型的优化策略。首先通过设置生产阈值和消费阈值来定制唤醒策略,实现批量生产和消费。然后分析了多生产者多消费者场景下的伪唤醒问题及解决方法(使用循环判断条件)。文章还探讨了如何从全局视角提高模型效率,指出生产者获取数据和消费者处理数据可以与临界区操作并行。最后以LeetCode交替打印FooBar为例,展示了如何使用条件变量和状态变量实现线程同步。代码示例展示了带阈值的阻塞队列实现和线程交替打印解决方案。
2026-06-01 08:00:00
343
原创 OS77.【Linux】线程互斥(6) 基于阻塞队列的单生产者-单消费者模型(初步版本)
生产者-消费者模型是一种多线程同步策略,通过"123原则"(1个共享内存空间、2种角色、3种关系)实现高效通信。该模型利用阻塞队列作为缓冲区,解耦生产者和消费者,支持并发操作和忙闲不均的场景。关键实现包括:互斥锁保证线程安全,两个条件变量分别管理生产者和消费者等待队列。生产者队列满时阻塞,消费者队列空时阻塞,通过条件变量实现同步唤醒。代码示例展示了单生产者单消费者的实现,通过push/pop操作实现安全的数据交换。模型优点包括解耦、并发支持和平衡处理能力差异。
2026-05-29 08:00:00
267
原创 OS76.【Linux】线程互斥(5) 同步
通过VIP自习室案例类比线程同步问题,阐述了条件变量的工作原理。当多个线程竞争临界资源时,单纯互斥锁可能导致资源分配不均。条件变量(pthread_cond_t)配合互斥锁使用,通过等待队列和唤醒机制实现有序访问。关键函数pthread_cond_wait会在阻塞线程时自动释放锁,唤醒时重新获取锁,避免死锁。代码示例演示了多线程轮流修改全局变量的实现,验证了条件变量确保线程执行顺序的作用。源码分析显示pthread_cond_wait内部确实实现了锁的自动释放和重新获取机制。
2026-05-27 08:00:00
415
原创 OS75.【Linux】线程互斥(4) 死锁
代码示例和理论分析探讨了死锁问题。示例代码演示了由于重复加锁导致的死锁情况,当一个线程对同一把锁连续调用pthread_mutex_lock()时会造成所有线程阻塞。文章详细解释了死锁的定义、四个必要条件(互斥、请求保持、不剥夺和循环等待),并形象化地描述了死锁现象。同时提出了避免死锁的方法,包括破坏必要条件、保持加锁顺序一致等。最后补充说明了线程不能等待自身退出的特殊情况,通过glibc源码分析指出pthread_join()会检测并阻止这种自我等待的死锁情况。全文系统性地介绍了死锁的原理、条件和
2026-05-20 08:00:00
455
原创 OS74.【Linux】线程互斥(3) 线程安全、重入
线程安全指多线程并发执行时能保持正确行为,无需额外协调。MIT定义线程安全需满足规约、保持不变量,不受线程执行方式影响。重入指函数被不同执行流调用时结果一致,可重入函数必线程安全。线程不安全情况包括:未保护共享变量、状态变化的函数、返回静态变量指针。线程安全要求对共享变量只读、原子操作、无二义性。不可重入函数涉及全局数据或malloc等操作,而可重入函数避免这些。区别在于线程安全关注并发问题,重入是函数特性,可重入函数属于线程安全的一种。
2026-05-18 08:00:00
456
原创 FreeRTOS的内存管理机制(1) heap_1
分析了FreeRTOS内存管理机制中的heap_1.c实现。heap_1.c采用最简单的线性分配策略,仅支持内存分配不支持释放。其核心是维护一个静态数组ucHeap作为堆空间,通过xNextFreeByte记录分配位置。内存分配时会对齐到portBYTE_ALIGNMENT字节,确保CPU访问效率。虽然实现简单高效,但存在无法释放内存的缺点。文章通过调试演示了分配过程,并解释了configADJUSTED_HEAP_SIZE的作用是保证对齐后的可用空间。heap_1.c适用于不需要动态释放内存的场景,体
2026-05-13 12:48:11
651
原创 OS73.【Linux】线程互斥(2) 加锁、解锁、“原子的“含义
介绍了Linux线程互斥的实现方法,重点讲解了如何通过加锁保护共享资源。主要内容包括:1)演示了初始化锁、加锁和解锁的基本步骤;2)分析了错误加锁方式导致的问题;3)给出了正确的加锁方案,确保票数不会出现负数;4)讨论了锁作为共享资源的安全性问题;5)解释了原子操作的概念;6)通过伪代码展示了互斥锁的工作原理;7)总结了多线程访问临界资源需要加锁的原因;8)提供了简单的互斥锁封装实现。文章强调合理使用互斥锁可以保证多线程环境下共享资源的安全性。
2026-05-13 08:00:00
426
原创 OS72.【Linux】线程互斥(1) 模拟未加锁抢票
探讨多线程操作全局变量导致的数据不一致问题,通过抢票模拟程序演示了线程安全问题。当多个线程并发访问共享变量tickets时,由于"检查-修改"操作非原子性,会出现负数票等异常情况。通过GDB调试分析发现,线程切换导致多个线程同时通过tickets>0检查并执行减操作。解决方法是对共享资源加互斥锁(pthread_mutex_t),确保任何时刻只有一个线程访问共享数据。文章详细介绍了pthread库中的锁操作函数,包括初始化(pthread_mutex_init)、加锁(pth
2026-05-08 08:00:00
452
原创 OS71.【Linux】__thread、分离线程
介绍了Linux线程编程中的两个重要概念:线程私有变量和线程分离。使用__thread修饰符可以创建线程私有变量,每个线程拥有自己的变量副本,解决了全局变量共享问题。线程分离通过pthread_detach函数实现,允许线程退出时自动释放资源,无需主线程等待。文章还讨论了线程管理资源的策略(joinable/detachable)在TCB中的存储方式,并提供了相关代码示例。关键点包括:线程私有变量的应用场景、分离线程的两种方式(主线程分离/线程自分离)
2026-05-04 10:41:48
458
原创 OS70.【Linux】证明: x86_64,glibc的pthread库中,线程的tid就是线程控制块tcb的起始地址
glibc-2.42源代码证明:在x86_64架构下,pthread_self()返回的tid实际上是线程控制块struct pthread的地址。研究发现pthread_self()通过THREAD_SELF宏访问FS段寄存器获取该地址,其中header.self字段是一个自引用指针,指向struct pthread对象本身。测试代码验证了void* tcb和void* self存储相同地址,表明线程控制块和struct pthread实质相同。需要注意的是,此结论仅适用于x86_64架构,其
2026-04-29 08:00:00
480
原创 OS69.【Linux】使用线程求和、pthread_self、了解clone系统调用、创建多个线程、线程栈
C++11线程库与Linux pthread库的关系及其实现原理。主要内容包括:1)通过实验证明C++11 thread库底层调用pthread原生线程库;2)分析线程属性维护机制,指出pthread库通过线程控制块(TCB)管理线程属性;3)验证Linux线程由用户级线程和内核LWP组成的一对一模型;4)通过寄存器值和系统调用证明线程拥有独立栈结构,相邻线程栈间存在保护页。研究结果表明,C++11线程库基于成熟pthread实现,线程栈独立但共享地址空间,线程间数据访问无严格隔离。
2026-04-22 08:00:00
418
原创 OS68.【Linux】补充实验: 僵尸线程
通过实验验证了Linux中线程泄漏问题:当主线程不调用pthread_join时,新线程退出后其资源(包括栈空间)不会被释放,导致虚拟内存急剧增加(实验中达72GB)。这种"僵尸线程"现象类似于僵尸进程,但区别在于线程资源会在主线程退出时释放。对比分析表明,正确处理线程终止应使用pthread_join或pthread_detach,而非强制终止线程,否则会造成内存泄漏和安全风险。实验使用htop监控内存变化,直观展示了线程资源回收前后的内存差异。
2026-04-20 08:00:00
471
原创 OS67.【Linux】pthread线程库的使用
本文介绍了Linux下pthread线程库的基本使用方法。主要内容包括:1)通过pthread_create创建线程,分析其参数及返回值;2)线程共享进程资源的特点,包括代码段和全局变量;3)使用pthread_join等待线程终止并获取返回值;4)终止线程的几种方法:线程自行return、pthread_exit、主线程退出或pthread_cancel;5)线程不能使用exit退出,否则会导致整个进程终止。文章还验证了线程共享资源和线程终止对进程的影响,并演示了线程进行程序替换的效果。
2026-04-16 08:00:00
503
原创 无法安装.NET Framework 错误代码 0x80070005 解决方法
.NET Framework 3.5安装问题解决方案 问题描述:安装.NET Framework 3.5时遇到困难。 解决方法: 下载Windows Update Blocker工具 运行工具后选择"Enable Updates"选项 点击"Apply Now"应用更改 此方法通过重新启用Windows更新功能,成功解决了.NET Framework 3.5的安装问题。工具下载地址已提供,操作简单快捷。
2026-04-05 17:55:40
980
1
原创 OS66.【Linux】初识线程
线程与进程的核心概念及关系。线程是进程内的执行分支,执行粒度更细,作为操作系统调度的基本单位,一个进程可包含多个线程。文章从CPU角度分析了执行流概念,比较了Windows和Linux的线程管理实现方式(Linux采用轻量级进程模拟线程)。线程相比进程具有创建/释放更轻量、切换成本更低等优势,但也存在编程复杂、缺乏保护等缺点。关键点包括:线程共享进程地址空间等资源,但拥有独立栈和上下文;主线程与副线程的区别;多线程在计算密集型和I/O密集型任务中的应用价值。最后强调线程本质是进程内部的执行流资
2026-04-03 08:00:00
436
原创 OS65.【Linux】信号的补充说明: 父进程可以不用等待子进程,最终可以让父子进程正常退出
探讨Linux系统中避免僵尸进程的另一种方法——通过将SIGCHLD信号处理设为SIG_IGN,使子进程终止时自动清理而不通知父进程。文章指出该方法在System V等系统有效但在BSD系统不可用,并区分了SIG_IGN与默认处理动作SIG_DFL的区别:前者自动回收子进程,后者仅丢弃信号。最后分析了system函数在SIGCHLD被忽略时的行为,说明这种情况下system调用会因无法等待子进程而返回非零值。
2026-03-31 08:00:00
459
原创 OS64.【Linux】信号收尾
Linux信号处理相关内容:1. 详细讲解了sigaction函数的使用方法,包括sa_handler和sa_mask的设置,并通过测试代码展示了信号处理过程中pending和block位图的变化情况。2. 补充说明了可重入函数的概念,通过链表插入的例子说明了不可重入函数可能导致的错误。3. 介绍了volatile关键字的作用,通过实验展示了编译器优化对信号处理的影响,并解释了volatile如何保持内存可见性。4. 分析了SIGCHLD信号的使用场景,探讨了父进程通过信号处理函数回收子进程的机制
2026-03-25 08:00:00
492
原创 《x86汇编语言 从实模式到保护模式》VHD 写入SATA硬盘的真机启动方法
记录李忠老师的《x86汇编语言:从实模式到保护模式 第二版》书的配套资料提供的vhd写入SATA硬盘并成功实机启动的方法
2026-03-23 08:00:00
524
2
原创 OS63.【Linux】面试题: 简单讲讲信号的捕捉过程?
回顾了Linux信号处理机制的核心概念。首先介绍了信号的四种产生方式(键盘输入、kill命令、系统调用和异常),以及信号发送、保存和信号集操作的相关函数。重点阐述了进程处理信号的时机:当进程从内核态返回用户态时,会检查pending表处理未决信号。通过分析用户态与内核态的切换过程(涉及四次身份转换),解释了信号捕捉的完整流程。最后指出,当解除信号阻塞时,至少会递达一个未决信号。全文结合Linux内核代码和Intel架构手册,深入剖析了信号处理与CPU特权级切换的关联机制。
2026-03-19 08:00:00
435
原创 OS62.【Linux】与信号集相关的操作函数
本文介绍了Linux信号集的相关操作函数及其应用。主要内容包括:1)回顾信号相关的三张表(handler、block、pending);2)详细讲解信号集操作函数如sigemptyset、sigfillset、sigismember等的使用方法;3)通过代码示例演示如何屏蔽2号信号并验证其效果;4)探究能否屏蔽所有信号,发现9号和19号信号无法被屏蔽。文章强调操作信号集时必须先初始化,并指出9号和19号信号的独特性。
2026-03-16 08:00:00
856
原创 OS61.【Linux】面试题: 信号集是什么? 在Linux中是如何实现的?
本文分析了Linux内核中信号处理机制的实现原理。首先介绍了信号集(sigset_t)在x86_64架构下采用unsigned long位图表示64个信号。重点解析了信号编号获取过程:通过ffz(~x)+1计算,其中ffz函数使用tzcnt指令查找第一个0位。以LeetCode 2980题为例说明了tzcnt指令的应用。最后阐述了Linux内核中三张信号表的具体实现:handler表通过sighand_struct结构体数组存储信号处理函数,pending表和block表则采用sigset_t位图结构分别记
2026-03-10 08:00:00
446
原创 OS60.【Linux】理解信号: 信号的发送和保存
本文摘要: 文章系统介绍了Linux信号机制的核心概念和工作原理。主要内容包括:1)信号发送本质是操作系统修改进程task_struct中的信号位图;2)信号编号使用位图存储,比特位表示信号状态和编号;3)内核通过block、pending和handler三张表管理信号,分别处理信号屏蔽、未决状态和处理方式;4)信号处理常量SIG_DFL(默认)、SIG_IGN(忽略)和SIG_ERR(错误)的含义及使用场景。通过代码示例验证了不同处理方式的效果,解释了阻塞与忽略的关键区别,并强调信号屏蔽与信号产生无关的特
2026-03-06 08:00:00
496
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅