笔试
文章平均质量分 89
Nahida_nora
这个作者很懒,什么都没留下…
展开
-
csapp proxy lab part 1
在计算机网络中,数据被封装成数据包(packet)是为了在网络中进行传输。数据从应用程序发送到传输层。在这个过程中,数据通常被封装为特定应用层协议的数据报文,比如HTTP请求或者SMTP邮件。传输层(通常是TCP或UDP协议)会在应用数据的基础上添加传输层头部信息,包括源端口和目标端口等信息,形成一个传输层数据报文段(segment)。网络层(通常是IP协议)将传输层的数据报文段添加网络层头部信息,包括源IP地址和目标IP地址等信息,形成一个网络层数据报文(packet)。原创 2024-05-08 23:57:02 · 1009 阅读 · 0 评论 -
leetcode 1766
将边的关系,转化为树结构。记录val 对应的id 列表。记录是否遍历过节点。记录id 和对应的深度。使用dfs, 从根开始遍历。原创 2024-04-11 19:54:45 · 726 阅读 · 0 评论 -
leetcode 1702
首先,需要定义自定义数据结构,可以是一个类或者结构体,包含希望进行迭代访问的元素。接下来,需要实现一个迭代器类,用于访问自定义数据结构中的元素。迭代器类负责追踪当前位置,并提供方法来获取下一个元素、判断是否到达结尾等。在自定义数据结构中提供一个接口,让用户能够获取迭代器的实例。这通常是通过方法或者重载操作符来实现的。在迭代器类中,你需要实现迭代的具体逻辑,例如重载++操作符来获取下一个元素,重载!操作符来判断是否到达结尾等。最后,用户可以使用迭代器来遍历自定义数据结构中的元素。原创 2024-04-11 10:19:04 · 1126 阅读 · 0 评论 -
CSAPP Malloc lab
是一个 C 语言中的语句,它的含义是将一个指针类型的值设置为-1,然后将其转换为void指针类型,并返回。这通常用于表示一个特殊的错误条件或者指示函数执行失败。sizeof函数的单位是byte。ALIGN 找到最小的alignment的倍数。原创 2024-03-10 00:24:25 · 1443 阅读 · 0 评论 -
CSAPP shell lab
Shell中的作业(job)管理是一种用于跟踪和控制正在运行的进程的机制。Shell通常支持前台任务和后台任务,它们之间有以下差别:前台任务是由用户启动并在前台运行的任务。当你在Shell中运行一个命令,它通常会成为前台任务,并且会占用你的终端会话,直到任务完成或被中断。前台任务会接收来自终端的输入,并将其输出显示在终端上。这使得它们非常适合需要与用户交互的任务,例如编辑文本文件或运行交互式程序。要将一个正在运行的前台任务放入后台,你可以使用Ctrl+Z暂停任务,然后使用bg命令将其放入后台运行。原创 2024-01-29 11:19:04 · 1073 阅读 · 0 评论 -
CSAPP 第八章 Exceptional Control Flow 读书笔记 part 1
Operating system subroutine” 是指操作系统中的子程序(subroutine),用于执行特定的操作系统功能。这些子程序通常由操作系统提供,为应用程序和其他系统组件提供服务。文件系统子程序:通过提供文件名和权限,打开文件以便读取或写入。关闭先前打开的文件,释放相关资源。进程控制子程序:在操作系统中创建新的进程。终止正在运行的进程。内存管理子程序:为程序或进程分配内存空间。释放先前分配的内存空间。设备管理子程序:打开并准备使用设备。关闭设备,释放相关资源。原创 2024-01-21 21:37:13 · 921 阅读 · 0 评论 -
CSAPP 第七章 Linking part2
是dlopen函数中的一个标志,用于指定共享库的全局符号在解析外部符号时应该是可用的。当使用标志时,共享库中的符号将被链接到全局符号表中,使得其他共享库或可执行文件可以访问这些符号。具体来说,使用标志的效果是,共享库中的符号可以被后续加载的共享库或主程序(如果使用了-rdynamic标志编译)引用。这对于在不同的共享库之间共享全局变量或函数非常有用,因为它们可以在整个应用程序的多个模块之间共享状态。举例说明,在使用dlopen打开共享库时,如果使用了。原创 2024-01-17 10:05:59 · 1060 阅读 · 0 评论 -
CSAPP 第七章读书笔记 - Linking part1
ld是GNU Binutils工具集中的一个命令,用于链接目标文件并生成可执行文件。它在编译器生成目标文件之后,将这些目标文件组合在一起,解析符号引用,执行地址重定位,并生成最终的可执行文件。以下是ld目标文件的链接ld的主要任务是将一个或多个目标文件链接在一起,创建一个完整的可执行文件。这些目标文件可以是由编译器生成的,也可以是其他程序员提供的。符号解析ld解析目标文件中的符号引用,确保每个符号都能找到其对应的定义。这通常涉及在不同目标文件之间解决函数和变量的引用关系。地址重定位。原创 2024-01-15 21:12:22 · 990 阅读 · 0 评论 -
CSAPP cache lab - Optimizing Matrix Transpose
矩阵转置是一种操作,它将矩阵的行和列互换位置,即将原始矩阵的行变为转置矩阵的列,将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。假设有一个m×n的矩阵A,其转置矩阵为n×m的矩阵B。那么B的第i行第j列的元素就是A的第j行第i列的元素,即B[i][j] = A[j][i]。可以看到,B的第一行是A的第一列,B的第二行是A的第二列,以此类推。矩阵转置在很多领域中都有广泛的应用,例如线性代数、图像处理、矩阵运算等。原创 2024-01-08 22:28:57 · 1231 阅读 · 0 评论 -
cache blocking
缓存的更新通常是以缓存块为单位进行的,而不是以单个元素为单位。当程序访问内存时,它将一个块的数据加载到缓存中,这称为缓存行(cache line)。缓存行是缓存的基本单位,通常包含多个字节或数据项。当某个数据被请求并加载到缓存时,可能会带入其周围的数据,即将整个缓存行加载到缓存中。这是因为在程序中,通常存在着局部性原理,即相邻的数据项很可能也会被近期使用。如果在缓存中的某个块的数据被修改,通常整个缓存块会被标记为“脏”(dirty)。当这个缓存块被替换出缓存时,它的内容会被写回到主内存。原创 2024-01-02 15:29:42 · 482 阅读 · 0 评论 -
csapp cache lab - Writing a Cache Simulator
定义Cache的结构:首先需要定义一个结构体来表示Cache的属性,如Cache大小、块大小、关联度等。可以使用数组来表示Cache的行和块,每个块包含标记、有效位、数据等信息。实现Cache的初始化函数:编写一个初始化函数,用于初始化Cache的各个属性和数据。可以根据Cache的大小和块大小计算出所需的行数和块数,并分配相应的内存空间。S: Set 数量, E: 每个set的cache line 数量。对cache的操作是基于tracefile的内容(指令和地址两部分组成)原创 2023-12-25 16:26:25 · 959 阅读 · 0 评论 -
CSAPP 第六章读书笔记 part2
传统内存和关联内存的输入和输出有一些区别。传统内存的输入和输出是通过地址来进行的。当CPU需要读取或写入传统内存中的数据时,它会发送一个地址信号,以指示所需数据的位置。传统内存会根据这个地址信号来读取或写入相应的数据。关联内存的输入和输出则是通过标签来进行的。关联内存中的数据是通过标签进行检索的,而不是通过具体的地址。当CPU需要访问关联内存中的数据时,它会发送一个标签信号,关联内存会根据这个标签信号来查找匹配的数据。原创 2023-12-18 14:15:51 · 937 阅读 · 0 评论 -
csapp 第六章读书笔记 part1
作为程序员,需要理解内存层次结构,因为它对你的应用程序的性能有很大影响。如果你的程序需要的数据存储在CPU寄存器中,那么它们可以在指令执行期间以0个周期的时间访问。如果存储在缓存中,则需要4到75个周期。如果存储在主内存中,则需要数百个周期。如果存储在磁盘中,则需要数千万个周期!如果你了解系统如何在内存层次结构中传递数据,那么你可以编写应用程序,使其数据项存储在更高的层次,这样CPU可以更快地访问它们。原创 2023-12-16 13:13:48 · 132 阅读 · 0 评论 -
csapp 第五章读书笔记 分析程序指标工具
complier 无论怎样优化代码,都不会替换数据结构和算法。要在基本水平之上调优性能,需要对处理器的微体系结构有一定的了解,描述了处理器实现其指令集体系结构的基本机制。对于乱序处理器的情况,了解一些关于功能单元的操作、能力、延迟和发射时间等方面的知识,可以建立一个基准,用于预测程序的性能。原创 2023-12-07 14:26:24 · 328 阅读 · 0 评论 -
csapp 第五章读书笔记 part1
Retirement unit” 是一个术语,通常在计算机架构和微处理器设计中使用。在处理器的流水线执行过程中,指令会按照顺序进入流水线的不同阶段进行处理。在执行完最后一个阶段(写回阶段)后,指令就被认为是“退休”了,也就是完成了它的任务并从流水线中移除。在现代处理器中,有一个专门的硬件单元被称为“退休单元”(retirement unit),用于管理指令的退休过程。它负责确保指令按照正确的顺序退休,以保持程序的正确执行。原创 2023-12-05 18:22:00 · 963 阅读 · 0 评论 -
csapp第四章读书笔记 part3
ret 使用了3个bubble, ret 在write-back 阶段后确定下一条指令。对于jump指令,需要到execute 阶段后,才能确认是否存在mispredicted branch问题。control logic通过插入bubble来取消错误的brach, 同时获取正确的brach。原创 2023-11-30 15:59:18 · 103 阅读 · 0 评论 -
CSAPP 第四章读书笔记 part2
在PIPE-中的一个块,在SEQ+中以完全相同的形式不存在,这个块被标记为“Select A”,位于解码阶段。这些指令中没有一个需要从寄存器文件中读取的值。在SEQ+的各个阶段之间插入了流水线寄存器,并稍微重新排列了信号,得到了PIPE−处理器,其中名称中的“−”表示该处理器的性能略低于我们的最终处理器设计。然后,当新的时钟周期开始时,这些值通过完全相同的逻辑传播,以计算当前指令的PC。在流水线设计中的目标是在每个时钟周期发出一个新指令,这意味着在每个时钟周期,一个新指令进入执行阶段,并最终完成。原创 2023-11-27 17:50:11 · 315 阅读 · 0 评论 -
csapp archlab part 1
/yas 和 ./yis 是汇编语言编译器和模拟器的命令行工具。./yas 是一个汇编语言编译器,它将汇编语言代码转换为可执行的二进制文件。./yas sum.ys 将sum.ys文件编译成了sum.yo可执行文件。./yis 是一个模拟器,它用于执行和模拟已编译的二进制文件。运行./yis sum.yo 将执行sum.yo文件并输出结果。这两个工具通常用于汇编语言的开发和调试过程中。原创 2023-11-23 11:01:46 · 220 阅读 · 0 评论 -
csapp 第四章 读书笔记 part1
Y86-64 是一个教学用的指令集架构,用于教授计算机体系结构和汇编语言的课程。它是为了简化教学和理解而设计的,因此它的指令集和功能相对较少。而 x86-64 是一种常见的处理器架构,用于商业计算机系统和服务器。它是由英特尔和AMD等公司开发的,具有复杂的指令集和丰富的功能,可以执行各种复杂的任务和应用程序。因此,Y86-64 和 x86-64 的主要区别在于它们的设计目的和使用范围。Y86-64 用于教学和学术研究,而 x86-64 用于商业和实际的计算机系统。原创 2023-11-21 20:33:23 · 340 阅读 · 0 评论 -
csapp attack lab phase4
每个gadget由一系列指令字节组成,最后一个字节为0xc3,编码为ret指令。举个例子:48 89 c7 是指令 movq %rax, %rdi, 对应的地址是0x400f15 + 0x3 也就是0x400f18, 是开始的指令位置。例如:ret编码为0xc3,nop编码为0x90。0x4019a7 + 0x4 得到地址0x4019ab48 89 c7 对应的汇编指令是 mov %rax, %rdi0x4019c3 + 0x2 得到地址 0x4019c5。原创 2023-11-16 15:44:48 · 170 阅读 · 0 评论 -
csapp attack lab phase3
通过将touch3函数覆盖test的stack frame, 在40个字符的范围内写入汇编代码,使寄存器执行mov等指令,并跳转到touch3。mov指令不能直接修改rip寄存器的值。因为rip寄存器存储的是指令的地址,它是由处理器自动更新的。原创 2023-11-15 15:12:42 · 249 阅读 · 0 评论 -
caspp attacker lab
ctarget 会先调用test , test调用getbuf, getbuf调用Get。任务目的是通过缓冲区注入攻击,将函数getbuf返回直接重定向到函数touch1。0x28 是 40 比特,getbuf 下一次执行的指令是401976, rsp对应的汇编文件行数,通过objdump 可以获取地址,40个字符加上touch1的地址,课件的例子1课件的例子2。原创 2023-11-14 19:52:58 · 113 阅读 · 0 评论 -
csapp第三章读书笔记
Carry flag 是一个标志位,用于标识在进行算术运算时是否发生了进位。在计算机的处理器架构中,carry flag 通常被用于加法和减法运算。在加法中,如果两个数相加的结果超出了所能表示的范围,就会发生进位。carry flag 在这种情况下会被设置为 1,表示发生了进位;否则被设置为 0,表示没有发生进位。在减法中,如果被减数小于减数,也会发生借位。carry flag 在这种情况下同样会被设置为 1,表示发生了借位;否则被设置为 0,表示没有发生借位。原创 2023-11-14 15:54:30 · 149 阅读 · 0 评论 -
csapp bomb lab part4
是一个循环,不断累加,访问的地址基于0x4024b0,原创 2023-11-05 14:58:05 · 143 阅读 · 0 评论 -
CSAPP BOMB LAB part3
bomb.s phase_4的代码:格式:40102e行,比较0x8+rsp的值和0xe, 需要让0x8+rsp小于0xe, 然后跳转到40103a,func函数根据bomb.s 转化为c代码:这个直接参考了知乎网友的翻译,func4的返回值等于0, 跳转到40105d。原创 2023-11-05 13:56:22 · 655 阅读 · 0 评论 -
CSAPP BOMB LAB part1
objdump是一个用于分析可执行文件、目标文件和共享库的工具。它可以显示这些文件的二进制指令、符号表、段信息、重定位表等内容,帮助开发者了解和调试程序。objdump的常用选项和用法如下:,这会以汇编代码的形式显示可执行文件或目标文件的二进制指令。,这会显示可执行文件或目标文件的符号表,包括函数名、变量名等信息。,这会显示可执行文件或目标文件的段信息,包括段名、段地址、段大小等。,这会显示可执行文件或目标文件的重定位表,用于动态链接和地址重定位。原创 2023-10-31 15:37:25 · 199 阅读 · 0 评论 -
csapp datalab
在64位操作系统上运行32位可执行文件需要在系统上安装相应的32位库和运行环境。如果你尝试在64位操作系统上运行32位可执行文件,可能会遇到错误,例如缺少所需的库或不兼容的系统调用。如果你希望在64位操作系统上运行代码,你应该使用默认的。这样将生成适用于64位目标平台的可执行文件。命令来编译代码,而不是使用。原创 2023-10-30 10:59:03 · 183 阅读 · 0 评论 -
笔试合集1
数组中的逆序对例如:756475 647 5 6 457 46count=2 (5<7, 4<6)4567count=5 (5>4, 7>4,6)public class Solution { int cnt; public int InversePairs(int[] array) { cnt = 0; if (array != null) mergeSortUp2Down(array,原创 2020-07-02 06:04:54 · 86 阅读 · 0 评论