- 博客(14)
- 收藏
- 关注
原创 16位反码求和、奇偶校验和CRC
本文介绍了网络协议中常见的校验机制,包括IPv4、TCP、UDP、ICMP使用的16位反码求和算法,以及链路层的CRC校验。16位反码求和通过分块、求和、回卷进位和取反操作生成校验和,接收方通过验证全1结果判断数据完整性。CRC则采用模2运算(XOR)进行更严格的校验,由硬件高效完成。两种校验方式各有侧重:反码求和简单高效,CRC检错能力更强,但都不能防止数据篡改。文章通过具体计算示例详细说明了两种校验方法的实现过程。
2026-02-13 16:12:02
562
原创 MIT6.s081——lab4 trap调用实现用户态和内核态的切换
本文摘要: RISC-V函数调用参数传递:a0-a7寄存器用于传递参数,在printf调用中a0传递格式字符串,a1和a2分别传递参数值。 函数调用优化:编译器会内联简单函数(如f和g),直接计算结果而不生成调用指令。 小端存储影响:通过示例分析57616和字符变量i的输出结果,说明小端存储模式下字节顺序对输出的影响。 格式字符串问题:当参数不足时,printf会读取栈上的随机值,导致未定义行为。 回溯功能原理:通过栈帧(包含返回地址和调用者帧指针)实现函数调用链追踪,用于调试目的。
2026-02-13 13:37:32
622
原创 MIT6.s081——lab3虚拟内存的结构和pgtl的实现
本文摘要探讨了在xv6操作系统中通过共享只读内存区域来加速getpid()系统调用的方法。关键思路是在用户空间和内核之间映射一个包含进程PID的只读页面USYSCALL,使用户程序可直接读取而无需陷入内核。实现需要修改三个核心函数:allocproc()分配并初始化页面,proc_pagetable()建立页表映射,freeproc()释放页面。该方法不仅提升了getpid()性能,也为其他只读系统调用(如uptime)的优化提供了参考模式。实验通过ugetpid测试验证优化效果,展示了用户态与内核态数据共
2026-02-12 13:56:20
541
原创 MIT6.s081——lab2 系统调用的创建
本文介绍了在xv6操作系统中添加系统调用和进行内核调试的方法。主要内容包括:1) 使用gdb调试xv6内核,包括设置断点、查看堆栈回溯和寄存器状态;2) 通过实验分析系统调用执行流程,包括从用户态到内核态的转换过程;3) 实现一个trace系统调用,用于跟踪指定系统调用的执行情况。文章详细展示了如何利用gdb工具调试内核代码、分析系统调用参数传递机制,以及如何通过修改内核代码来添加新的系统调用功能。
2026-02-12 13:51:45
626
原创 MIT6.s081——lab1 实现常见的用户程序
本文介绍了在xv6操作系统中实现几个经典UNIX用户程序的方法,包括sleep、pingpong、primes、find和xargs。这些程序分别展示了系统调用的使用、进程间通信、并发编程和文件系统操作等核心概念。sleep程序通过系统调用实现定时休眠;pingpong利用管道实现父子进程间的通信;primes使用管道和fork实现并发质数筛;find程序递归遍历目录树查找文件;xargs则将标准输入转换为命令行参数。实现时需要注意正确处理命令行参数、管理文件描述符、处理进程间同步以及递归逻辑等细节。这些程
2026-01-05 23:13:05
863
原创 JDK17集合源码阅读——HashSet+HashMap
摘要:HashSet基于HashMap实现,底层使用HashMap存储元素,其中键为元素值,值为固定虚设对象PRESENT。HashMap采用数组+链表+红黑树结构,默认容量16,负载因子0.75,当链表长度≥8且数组长度≥64时会转为红黑树。扩容时容量翻倍,通过(n-1)&hash计算索引位置。哈希冲突时采用拉链法,JDK1.8后引入红黑树优化查找效率。HashSet本质上是一个只使用Key的HashMap,通过HashMap的特性实现集合的唯一性和无序性。
2025-12-24 21:03:16
876
原创 JDK17集合源代码阅读——LinkedList
摘要:LinkedList实现了List和Deque接口,采用双向链表结构,维护头尾指针和节点数。其节点类包含前后指针,支持高效的双端操作。构造方法简单,核心操作如addAll实现了链表拼接功能。作为List、Queue和Deque使用时,分别提供添加/获取、入队/出队、压栈/弹栈等方法。虽然功能全面,但由于链表遍历效率低且非线程安全,JDK8后更推荐使用ArrayList。LinkedList在JDK1.7取消了循环链表设计,相比数组结构在快速构建场景更具灵活性。
2025-12-24 19:15:11
302
原创 JDK17集合源码阅读——Vector
Java中的Vector是早期版本(1.0)提供的线程安全集合类,基于Object数组实现。其特点是方法同步(synchronized)但性能较差,默认容量10,支持指定扩容步长(capacityIncrement),未指定时默认翻倍扩容。与现代集合(如ArrayList)相比,Vector采用protected字段设计便于继承,但存在空间浪费问题。由于同步机制无法保证复合操作安全且性能低下,现代开发已不推荐使用Vector,建议改用Collections.synchronizedList等替代方案。
2025-12-23 16:13:19
253
原创 JDK17集合源码阅读——ArrayList
ArrayList是基于动态数组实现的列表结构,默认容量为10,支持动态扩容(1.5倍增长)。它实现了List、RandomAccess等接口,提供快速随机访问能力。关键特性包括:1)扩容机制通过grow()方法实现,性能开销大,建议初始化时指定容量;2)线程不安全,多线程环境需同步处理;3)迭代时修改会触发快速失败机制;4)subList()返回的是原列表视图而非独立副本;5)允许存储null值但不建议使用。ArrayList适合尾部操作频繁的场景,但中间/头部操作效率较低。
2025-12-23 16:02:18
424
原创 KMP算法
KMP算法是由Knuth、Morris和Pratt三位学者发明的字符串匹配算法,其核心是前缀表(next数组)。该表记录模式串中各位置的最长相同前后缀长度,用于匹配失败时确定子串回退位置。计算前缀表时,逐个比较前后缀字符,匹配则长度加1,不匹配则回退到前一个匹配点。使用next数组可避免主串回溯,将时间复杂度优化至O(M+N)。算法通过动态规划思想构建next数组,利用已知匹配信息减少重复比较,显著提升匹配效率。
2025-11-22 15:39:24
844
原创 使用MacOS配置MIT6.S081的环境
摘要:在MacOS上运行XV6实验时,2020版本存在较多问题,包括环境配置复杂、路径查找困难以及运行时报错,最终无法进入内核。切换到2022版本后问题有所改善,但仍需修改user/usertests.c中的代码才能成功运行。建议直接使用2022版本进行实验,并注意环境配置和代码调试。
2025-11-02 15:27:52
242
原创 C++底层内存机制——栈和堆详细解析
因为很多同学对内存的使用是很困惑的,不知道什么是栈空间什么是堆空间,也不知道变量在内存里的具体分配是什么样子的,这个文章主要是来解释两种内存的区别的——栈上是从上到下按照顺序来的,堆是随机的根据内存大小来进行的(这一部分的底层实现和原理要涉及计算机组成原理和汇编语言,实在不等可以等以后就知道了)在我们进行空间的申请的时候,栈和堆的申请逻辑是不一样的,栈是根据顺序来进行申请的,因此我们才不需要用指针来进行指向,但是堆是去空余空间的表里面进行空间的查找,找到了就进行分配。
2025-10-09 21:01:09
343
原创 C语言快速入门笔记
重点阐述了C语言的基本程序结构、编译运行环境配置方法,以及数据类型分类(基本类型、枚举、void和派生类型),特别说明了整数类型在不同平台下的差异和浮点类型的标准规范。最后提及void类型在函数返回、参数传递和指针应用中的关键作用。
2025-10-09 20:49:47
510
原创 IA-32笔记
本文主要介绍了x86汇编语言的基础知识和核心概念。文章首先概述了汇编语言的应用场景和计算机体系结构基础,包括数据表示、布尔运算和x86处理器的工作模式。随后详细讲解了汇编语言的基础语法,包括数据类型定义、符号常量、宏指令和程序结构。文章重点介绍了x86的核心指令集,包括数据传输、算术运算、位操作和控制流指令,并提供了大量示例代码说明各指令的使用方法。此外,还涵盖了高级编程主题如过程调用、字符串操作、结构体定义等,以及系统编程和混合语言编程接口。最后,文章介绍了汇编开发环境的配置方法,并提供了多个实用程序实例
2025-08-21 17:09:57
940
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅