panorama

计算机专业的同学应该都听过一本书,深入理解计算机系统(CSAPP)

其实我很早就开始读了,但是只是囫囵吞枣,根本不知所云,于是便放弃了一段时间。

现在经历了许多(并非),对许多名词有了一些概念后,我又重新翻开了这本书,发现许多地方豁然开朗,今天将第一章,计算机系统漫游,也就是标题所说的panorama,总结一下,以遍展开后续的学习。

以这本书的方式,从你的第一个程序hello的生命周期说起,我们来开始对系统的学习

1
2
3
4
5
#include<stdio.h>
int main(){
printf("Hello,World!\n");
return 0;
}

hello这个程序,从被你用编辑器创建,到在系统运行,再到输出信息,最后中止,中间发生了什么?

首先你用某个编辑器创建了文件hello.c,写下代码,并保存,其被称为源程序,储存在磁盘中,实际上就是一个由值0和1组成的(又称比特bit)序列,每8个位被称为一个字节,每个字节表示程序中的某些文本字符。

字符如何和字节所代表的数字序列对应呢,通常采用ASCII标准用数字来表示文本字符,二者一一对应

如图所示

现在,你应该理解了一个基本思想,计算机系统中所有的信息,无论是磁盘文件,内存中的程序,还是网络上传送的数据,都不过是一串比特。区分不同数据对象的唯一方法是我们读到的这些数据的上下文,在不同的上下文中,一个同样的字节序列可能会有不同的含义,这点要注意。

那么hello.c是怎么变成可执行文件hello的呢?

编译系统

如图所示,hello.c经过预处理,编译,汇编,链接,最终得到我们的可执行文件hello

我就直接引用原文了

预处理,编译

汇编,链接

其中,编译涉及到优化程序的性能,链接过程我是通过pwnret2dlresolve这种攻击方式才得以理解,涉及链接过程的细节与机制,以及各种安全问题,可以参考我的另一篇博客,虽然我还没写…

到这里,便得到了可执行文件hello,接下来运行它时发生了什么?

在终端中可以看到

1
2
3
linux> ./hello
Hello,World!
linux>

累了,休息,有空再写…


暂时懒得写

以后再说!

加油!


2026.3.22

似乎目前来看有点过于基础了

我还是太拖延了

procrastination😭

以后见啦~


panorama
https://roxy5201314.github.io/2026/01/16/panorama/
作者
roxy
发布于
2026年1月16日
更新于
2026年3月22日
许可协议