自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 LeetCode94.二叉树的中序遍历、LeetCode144. 二叉树的前序遍历、LeetCode145. 二叉树的后序遍历

本文介绍了二叉树的两种遍历方式及其实现方法。递归算法采用分治思想,按照"左-根-右"顺序访问节点,代码简洁但可能栈溢出;迭代算法使用栈结构模拟递归过程,通过手动管理节点访问顺序避免递归开销。两种方法时间复杂度均为O(n),空间复杂度为O(h)。文中通过示例详细分析了递归序的执行过程,并比较了两种实现的核心差异:递归由系统管理调用栈,迭代则需显式处理栈操作。此外还简要提及前序遍历的递归实现。对于深度较大的树,迭代实现更为安全可靠。

2025-11-16 17:09:16 1116

原创 位图(Bitmap)管理机制详解:从原理到内核实现

摘要:本文分析了操作系统内核中位图(bitmap)的实现原理,该数据结构用于高效管理内存、磁盘等系统资源。位图通过比特位(0表示空闲,1表示占用)紧凑记录资源状态。核心代码包含初始化(bitmap_init)、状态检测(bitmap_scan_test)、连续空间查找(bitmap_scan)和状态设置(bitmap_set)四个关键函数。其中bitmap_scan_test通过位运算快速判断单比特状态,bitmap_scan实现连续空闲资源查找功能,体现了内核代码的高效性。

2025-11-11 22:00:19 1068

原创 操作系统中断处理机制详解

本文详细分析了一个32位操作系统中断处理机制的实现,涵盖GDT表结构、IDT构建、8259A配置及中断处理流程。系统通过GDT定义内核代码段、数据段和显存段,使用选择子机制实现保护模式转换。中断描述符表(IDT)包含33个中断门,通过中断门描述符指定处理程序地址和特权级。8259A中断控制器被配置为主从结构,仅开启时钟中断。中断处理程序通过宏批量生成,完成错误处理、显示信息和发送EOI命令等操作。整个中断系统实现了从硬件中断到内核处理的完整通路。

2025-11-06 15:28:35 1267

原创 ELF 文件格式深度解析:从节区到段,链接视图与运行视图的统一理解

本文系统介绍了ELF二进制文件格式的核心结构,重点解析了节区(Section)与段(Segment)的区别与联系。ELF文件包含文件头、程序头表(段信息)、节区内容和节区头表四部分,分别服务于链接器和加载器。节区是链接视角的逻辑单元,包含.text、.data等代码数据;段是运行视角的内存映射单元,由多个节区按属性聚合而成。文章还详细阐述了ELF的动态链接机制、安全优化特性,并提供了常用分析工具。理解ELF的双重抽象设计,是进行系统编程、安全分析和性能优化的基础。

2025-11-04 16:47:06 1607

原创 LeetCode58最后一个单词的长度、LeetCode69.x的平方根、LeetCode70. 爬楼梯

本文介绍了三个算法问题的解决方案: 最后一个单词的长度:通过反向遍历字符串跳过末尾空格,然后计数直到遇到空格或字符串开头。提供两种实现方式:指针法和字符串分割法。 x的平方根:使用二分查找在[0,x]范围内寻找平方根整数部分,通过比较中间值平方与x调整边界,时间复杂度O(log x)。 爬楼梯问题:采用动态规划思想,将问题转化为斐波那契数列,使用滚动数组优化空间至O(1),时间复杂度O(n)。 三题均给出清晰解题思路和Python实现代码,并分析了时间复杂度。

2025-11-03 11:34:33 790

原创 LeetCode3. 无重复字符的最长子串、LeetCode9.回文数

本文介绍了两种常见算法问题的解决方案。第一部分探讨了"无重复字符的最长子串"问题,详细讲解了滑动窗口算法及其优化版本,时间复杂度为O(n),空间复杂度为O(min(m,n))。第二部分分析了"回文数"问题,比较了字符串法和数学反转法两种解法,后者通过反转数字后半部分来避免额外空间使用,时间复杂度为O(log n)。两种算法都提供了清晰的实现代码和复杂度分析。

2025-10-31 17:13:34 900

原创 LeetCode1. 两数之和、LeetCode2. 两数相加

本文介绍了两种经典算法问题的解决方案: 两数之和问题: 暴力解法:双重循环遍历数组,时间复杂度O(n²),空间复杂度O(1) 哈希表解法:利用字典存储元素值及其索引,一次遍历完成查找,时间复杂度O(n),空间复杂度O(n) 对比显示哈希表解法在较大数组时效率更优 两数相加问题(链表形式): 算法思路:同时遍历两个链表,逐位相加并处理进位 时间复杂度O(max(m,n)),空间复杂度O(max(m,n)) 包含虚拟头节点处理技巧和进位处理逻辑 提供Python代码实现和示例执行流程图示。

2025-10-27 12:46:50 819

原创 Leetcode27.移除元素

摘要:本文介绍使用双指针法原地移除数组中等于给定值的元素。慢指针(i)记录新数组位置,快指针(j)遍历原数组。当元素不等于目标值时,将其赋值给慢指针位置并递增i。遍历结束后,i即为新数组长度。示例演示了去除nums=[3,2,2,3]中3的过程,最终返回长度2,前两位为[2,2]。该算法时间复杂度O(n),空间复杂度O(1)。

2025-10-27 12:22:22 907

原创 LeetCode26.删除有序数组中的重复项、LeetCode35.搜索插入位置

本文介绍了两种处理有序数组的高效算法。第一部分使用双指针法删除有序数组中的重复项,通过slow指针标记不重复元素位置,fast指针遍历数组,时间复杂度O(n)。第二部分采用二分查找在有序数组中定位目标值或插入位置,通过不断缩小区间实现O(log n)的时间复杂度。两种算法都充分利用了数组有序的特性,通过指针操作避免了不必要的遍历,具有较高的空间效率(O(1))。文中包含详细的算法步骤、代码实现和执行流程说明,特别强调了边界条件处理和关键计算技巧(如防溢出的中间值计算),为解决类似有序数组问题提供了清晰思路。

2025-10-27 12:20:28 927

原创 X86操作系统引导器:MBR、Loader与内核加载全解析

本文摘要介绍了操作系统引导加载程序(MBR)和内核加载的相关配置与实现。这些代码为操作系统的引导加载过程和内核加载提供了基础框架,定义了关键内存布局和段描述符配置,是操作系统启动过程中的核心组成部分。

2025-10-25 10:59:41 2381

原创 x86 保护模式下的特权级访问控制机制详解

摘要:x86保护模式通过段描述符和特权级机制实现内存访问控制。核心要素包括:代码段(执行身份)、数据段/栈段(资源访问)的类型区分,以及DPL(段权限门槛)、CPL(当前特权级)、RPL(请求权限)的三级校验。访问规则严格遵循max(CPL,RPL)≤DPL原则,栈段需CPL=RPL=DPL完全一致。特权级切换仅能通过门描述符(提升)或iret指令(降级)完成,确保控制流安全。该机制以执行身份(CS.RPL)为锚点,结合最小权限原则,实现系统资源的精细管控与安全隔离。

2025-10-21 18:26:47 799

原创 实例演示32 位 x86 系统程序指针到物理地址的完整转换流程

摘要 在x86保护模式下,C指针int*p=(int*)0x0804A000的地址转换分两步: 段机制:逻辑地址DS:0x0804A000(如DS=0x7B)通过段选择子解析(Index=0x7B>>3=0xF)访问GDT第15项,获取段基地址(通常为0),生成线性地址0x0804A000。 分页机制:32位分页将线性地址拆分为页目录索引(32)、页表索引(74)和偏移(0),通过CR3寄存器遍历页表,最终映射到物理地址(如0x01A5B000)。

2025-10-19 19:39:10 1282 1

原创 全面解析:全局描述符表(GDT)、分段、分页与内存分配问题

x86架构采用两级地址转换机制:通过GDT分段将逻辑地址转为线性地址,再通过页表分页转为物理地址。现代操作系统将段基址设为0,使分段机制透明化,而分页机制成为核心。仅用分段会导致严重问题,因为它强制逻辑连续地址映射到物理连续内存,而实际物理内存高度碎片化,无法满足连续分配需求。分页通过"虚拟连续、物理分散"的设计解决了这一问题,支持虚拟内存、进程隔离等关键功能。这也是所有现代操作系统都必须启用分页的根本原因。

2025-10-18 09:28:04 1564 1

原创 Windows 10 使用 WSL 安装 Linux 图形界面失败的解决方案

摘要:在旧版Windows10(如Build19041)中运行WSL图形界面应用会出现无法启动或显示异常的问题,原因是该版本缺少WSLg组件支持。解决方案必须将系统升级至Build19044(21H2)或更高版本,可通过系统设置自动更新或使用微软官方更新助手强制升级。升级后需验证WSL版本包含WSLg组件,并确保使用WSL2和兼容的Linux发行版。

2025-10-16 16:24:10 796

原创 全局描述符表(GDT)执行过程

GDT(全局描述符表)是x86架构保护模式的核心数据结构,用于定义内存段属性和访问权限。其执行过程包括:1.实模式下准备GDT表;2.加载GDTR寄存器;3.设置CR0.PE位启用保护模式;4.通过远跳转刷新CS寄存器;5.加载其他段寄存器;6.CPU根据段描述符进行内存访问控制。GDT为x86提供内存保护机制,是操作系统内存管理的基础,在64位模式下功能被简化但仍需保留。整个过程确保了从实模式到保护模式的平稳过渡和后续内存的安全访问。

2025-10-15 22:59:21 1368

原创 操作系统保护模式初期内存布局及分页

摘要:x86 PC启动时,低1MB物理内存被BIOS、bootloader和硬件保留,不可随意使用。内核通常将页目录表放在0x100000(1MB)处,通过页表建立虚拟地址到物理地址的映射。页表本身是管理数据结构(如存放在0x101000),其内容指向被映射的物理内存(如0x0)。关键要区分页表存储地址和页表项映射的物理地址,前者是"地图"位置,后者是"目的地"。在32位系统中,CPU通过页目录和页表两级查找完成地址转换。

2025-10-11 09:14:00 433

C99语言标准新增特性解析文件

内容概要:本文详细介绍了C99标准相较于C89的多项重要更新与增强特性,涵盖语法、数据类型、预处理、数组、函数等多个方面。主要包括:新增restrict指针以优化内存访问、引入inline关键字支持内联函数、增加_Bool、_Complex、long long等新数据类型、支持可变长数组和柔性数组成员、允许在for循环中声明变量、支持单行注释“//”、增强预处理功能(如变参宏)、引入复合赋值、指定初始化符、扩展printf/scanf格式支持、新增多个标准头文件(如<stdbool.h>、<complex.h>等),并引入__func__预定义标识符获取函数名。同时放宽了编译器对标识符长度、嵌套层数等限制,废除了隐式int类型声明和隐式函数声明规则,强化了类型安全与程序可移植性。; 适合人群:具备C语言基础,从事系统编程、嵌入式开发或对语言标准演进感兴趣的中高级开发者;适用于希望深入理解现代C语言特性和提升代码效率的技术人员。; 使用场景及目标:①在需要高性能计算或内存优化的场景中利用restrict和inline提升效率;②在跨平台开发中使用stdatomic.h、stdint.h等头文件保证类型一致性;③利用可变长数组和复合字面量编写更灵活的函数接口;④通过指定初始化符提高结构体和数组初始化的可读性与维护性; 阅读建议:此文档适合作为C99标准的入门指南与参考手册,建议结合实际编译器(如GCC)进行代码实验,注意不同编译器(如MSVC)对C99支持程度的差异,重点关注兼容性与移植性问题。

2025-10-17

java编程思想第四版习题解答

java编程思想第四版习题解答

2025-10-17

C程序设计语言(第2版)习题解答

C程序设计语言(第2版)习题解答

2025-10-17

C语言标准库源代码文件

C语言标准库源代码文件

2025-10-17

空空如也

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

TA关注的人

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