
CSAPP
文章平均质量分 74
青衫客36
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
再探mmap(Memory Mapped File)
mmap通过将文件内容映射到进程的虚拟内存空间,提供了一种高效、便捷的文件访问方式。它利用了虚拟内存管理的分页机制,使得文件访问像操作内存一样高效,特别适合处理大文件、进程间通信等场景。然而,由于它依赖操作系统的虚拟内存管理,因此也可能带来一些内存管理和同步问题。原创 2024-09-20 21:37:48 · 912 阅读 · 0 评论 -
在系统总线的数据线上,不可能传输的是()。
在系统总线的数据线上,不可能传输的是A.指令 B.操作数C.握手(应答)信号 D.中断类型号答案:在系统总线的数据线上,原创 2024-09-20 21:17:08 · 905 阅读 · 0 评论 -
内存分配- brk & mmap
malloc实现中的brk和mmapbrk适合小块内存分配,mmap适合大块内存分配。这种分配机制既能提高内存管理的效率,又能优化系统资源的使用。原创 2024-09-20 16:36:38 · 921 阅读 · 0 评论 -
整数的补码转换(以[+, -]7为例)
补码系统在计算机中被广泛使用,因为它简化了包括负数在内的所有整数的加法和减法运算。在不同位数的系统中(如 16 位、32 位或 64 位),这个过程是一样的,只是二进制数的长度不同。例如,在 32 位系统中,简单来说,对于任何正整数或零,其二进制补码表示与其普通二进制表示相同。在不同位数的系统中(例如 16 位、32 位或 64 位),这个过程也是一样的,只不过要将二进制数填充到相应的位数。例如,在 32 位系统中,对于正数来说,其二进制补码就是它的普通二进制表示。(在 8 位系统中)。原创 2023-11-28 18:02:37 · 1486 阅读 · 0 评论 -
内存屏障(Memory Barrier)
内存屏障(Memory Barrier),也被称为内存栅栏(Memory Fence)或内存围栏(Memory Fence),是一种硬件或软件的同步机制,用于在并发系统中保持内存操作的顺序性。这是多核和多线程环境中至关重要的,因为现代处理器会对指令进行重排序以提高执行效率。原创 2023-10-20 00:17:44 · 2010 阅读 · 0 评论 -
Linux- DWARF调试文件格式
DWARF是一个用于在可执行程序和其源代码之间进行关联的调试文件格式。当开发者使用调试编译选项(例如,使用gcc时的-g标志)编译程序时,编译器会生成这种格式的调试信息。这些信息在后续的调试过程中非常有用,例如,使用gdb(GNU调试器)。以下是DWARFDWARF起初是为了满足UNIX系统上的高效、紧凑和跨平台的调试需求而设计的。自那时起,它已经经历了多个版本,每个版本都增加了新的特性。:从DWARF 1到DWARF 5,每个版本都引入了新的特性和改进,以支持新的编程语言特性、编译器优化等。DWARF。原创 2023-10-12 23:33:51 · 2090 阅读 · 0 评论 -
Linux上x86_64架构的动态链接器 ld-linux-x86-64.so.2
是Linux操作系统上x86_64架构的动态链接器(也称为动态链接编辑器)。它负责加载和链接在运行时(即程序启动时或之后)被引用的动态库。现在,我们来深入了解其作用和重要性:动态链接器的作用:优势:如何工作:查找共享库:ldd工具:总之,是Linux上的动态链接器,用于加载和链接动态库,进而可以运行各种程序。 文件在 Linux 系统中起到一个重要的作用:它缓存动态链接器查找共享库时所需的路径信息。以下是关于这个文件的详细介绍:目的:如何生成:查看内容:为什么是重要的:更新:总之, 是一个为系统上的动态链接原创 2023-09-13 14:17:34 · 6972 阅读 · 0 评论 -
gcc中的cc1 & collect2
命令编译一个C程序时,我们可能认为这是一个简单的操作,但实际上,编译过程包含了多个步骤和子工具的调用。是其中两个最主要的组件,负责核心的编译和链接前端工作。如果想深入了解这些工具是如何工作的,可以考虑在。通常作为一个前端,管理这些步骤并调用其他工具来完成特定的工作。的完整编译和链接过程中,其实还涉及到其他一些子工具和步骤,如预处理(选项,这将显示编译过程中的详细信息,包括所有子工具的调用。原创 2023-09-13 14:03:24 · 1045 阅读 · 0 评论 -
C运行时库- CRT(C Runtime)
为了更好地理解这些文件是如何工作的,可以考虑它们为程序的生命周期提供了一个框架:从程序的开始,到 main 函数的执行,再到程序的结束,每个阶段都有相应的初始化和清理工作需要完成。当你编译和链接一个程序时,链接器将自动选择正确的CRT文件,以确保程序的生命周期管理正确。如果你使用特定的编译和链接选项,如。CRT(C Runtime)是指C运行时库,它为C和C++程序提供了一组初始化和终止程序的基本构建块。函数执行之前和之后进行适当的初始化和清理。,链接器可能会选择不同的CRT文件,如。原创 2023-09-13 13:57:17 · 2470 阅读 · 0 评论 -
C- 运行时链接
运行时链接,是在程序运行时(而非编译时或加载时)将程序代码与其依赖的库代码进行链接的过程。动态链接在程序启动时或实际运行过程中通过API函数完成。这种方式的主要优点是它允许程序在运行时加载和卸载不同的库模块,从而实现更高的模块化和灵活性。在C语言的上下文中,运行时链接通常通过动态链接库(例如.so文件在Unix-like系统中,.dll文件在Windows系统中)来实现。:与静态库(如.a或.lib文件)不同,动态链接库包含可以被多个程序共享的代码。这意味着可以在多个程序中使用同一份库代码的物理副本。原创 2023-09-13 13:13:14 · 189 阅读 · 0 评论 -
C - fprintf函数 & sprintf函数
fprintf是 C 语言中的一个库函数,用于格式化输出到文件。它是头文件中定义的一部分。函数名的 “f” 表示 “file”,因为你可以指定输出到哪个文件。原创 2023-09-12 16:42:49 · 313 阅读 · 0 评论 -
argp包处理命令行参数
argp是一个在 GNU C Library (glibc) 中的库,用于解析命令行参数。它为 UNIX 风格的命令行参数提供了一种简洁和统一的方法。以下是一个简单的使用argp解析命令行参数的例子:先确保您的系统中有argp。它通常随glibc一起分发,所以大多数 Linux 系统上应该都有。下面我们来看一个实例。原创 2023-09-12 16:34:44 · 1061 阅读 · 0 评论 -
x86_64汇编指令 cqto & idivq
简而言之,这两条指令一起用于执行64位有符号整数除法,并处理可能出现的溢出和余数。是x86_64汇编的指令,它们通常用于有符号整数除法。原创 2023-09-12 13:27:03 · 2006 阅读 · 0 评论 -
浅谈反汇编器
反汇编器是用来将机器码(通常是二进制格式)转换回汇编语言的工具。该过程是汇编过程的逆过程。为了理解反汇编器的工作原理,首先需要理解编译和汇编。:反汇编器首先读取目标机器码二进制文件。每个指令的长度可能会因指令集架构(ISA)的不同而不同。例如,在某些架构中,所有指令的长度都是固定的,而在其他架构中,指令的长度可能会有所不同。:反汇编器使用指令集架构(ISA)的规范来解码机器码。每个机器指令都对应于特定的汇编指令。解码的过程通常涉及查找与机器码相对应的汇编指令。原创 2023-08-07 10:48:43 · 375 阅读 · 0 评论 -
CSAPP Lab5- MallocLab
本实验需要用c语言实现一个动态的存储分配器,也就是你自己版本的malloc,free,realloc函数。原创 2023-05-28 14:28:54 · 2626 阅读 · 0 评论 -
CSAPP Lab4- PerfLab
在kernel.c中有rotate的实现方法,我们需要添加自己的rotate实现,函数名自己命名,然后通过把自己实现的函数注册进去。原创 2023-05-21 16:40:33 · 1869 阅读 · 0 评论 -
CSAPP Lab3- bufbomb
(1)掌握函数调用时的栈帧结构(2)利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使得程序执行我们所期望的过程。原创 2023-05-10 12:24:48 · 1701 阅读 · 0 评论 -
LeetCode146- LRU 缓存
【代码】LeetCode146- LRU 缓存。原创 2023-04-28 10:37:22 · 84 阅读 · 0 评论 -
Compiler- 尾调用
这种方式是尾递归,特点是,这种调用在整个函数的最后一步,它调用完之后整个函数就结束了,由于这是函数最后一步,做完之后函数调用堆栈框架也可以拆除了。所以,这种优化真是很了不起的。这两个代码在功能上是一致的,只不过第二个代码把a原创 2023-04-25 15:35:12 · 438 阅读 · 0 评论 -
Compiler- 循环展开
ps:上述PHP源码中的switch也比较有意思,它的作用是:如果nKeyLength不是8的倍数,就需要额外的处理最后这几个数字,源码中还特意在case后面提示了/* fallthrough... */,我们知道case后面一般都会跟上break,不然会把后面的代码一行一行的执行一遍,而PHP源码在此处故意不写break,这样的好处是,如果nKeyLength=7,那么从case 7开始执行7行,如果nKeyLength=5,那么从case 5开始执行5行,这种写法还是比较高效的hh~原创 2023-04-25 11:13:17 · 736 阅读 · 0 评论 -
CSAPPLab2- BombLab
6个炸弹拆除成功原创 2023-04-22 12:27:25 · 508 阅读 · 3 评论 -
GDB调试实验
在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。本篇主要讲GDB的断点设置与查看源码。当我们想查看变量内容,堆栈情况等等,可以指定断点。程序执行到断点处会暂停执行。break 命令用来设置断点,缩写形式为b。设置断点后,以便我们更详细的跟踪断点附近程序的执行情况。原创 2023-04-18 19:02:35 · 1044 阅读 · 1 评论 -
CSAPPLab1-DataLab
((~(x+1)^x)) 是否为1即可判断是否为最大值这里有一个例外就是x=-1 由于-1=1111 他利用上面的式子判断也符合,故要特判-1 利用!我们可以看到“十”位必须是3, 并且只需要“个”位小于A即可,这里的小于运算 ,用了 a < b = a + (-b) < 0的性质,x & 0xF保存了x的后四位, 加上(-A)是否为负数来判断后四位的范围,判断负数是与0x1原创 2023-04-16 14:40:23 · 885 阅读 · 0 评论 -
CSAPP第三章课后作业题
【代码】CSAPP第三章课后作业题。原创 2023-04-12 10:21:10 · 882 阅读 · 0 评论 -
CSAPP第二章课后作业题
【代码】第二章课后作业。原创 2023-03-18 20:48:52 · 393 阅读 · 0 评论