csapp的简单摸索
这是我学习csapp所做的笔记
如有错误请评论或邮箱告知2567031030@qq.com
会按照书上的讲写笔记(因为我也从头开始看的),但只会记录我觉得重要的
对于一个hello.c 文件
1 | #include<stdio.h> |
使用od -t d1 hello.c
可以将hello.c
以10进制看到
1 | 0000000 35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 |
在计算机眼中
例如:
在不同的上下文中,一个同样的字节序列可以表示一个整数,浮点数,字符串,或着机器指令
有一个例子可以证明,新建一个1.ppm
1 | P3 |
这是一种图片格式.ppm
你可以看看这张图
===========================================================
可以看一下图片
![从hello.c到hello](https://i.ibb.co/tpj2GLV/Deepin-Screenshot-select-area-20230722110544.png = 100x50)
由hello.c->hello.i
可以使用gcc -E
进行预处理
gcc -E hello.c -o hello.i
也可以使用cpp
hello.i->hello.s
可以使用gcc -S
进行编译,生成汇编代码
gcc -S hello.i -o hello.i
在这一阶段中编译器会进行优化,会发现汇编与C的语言代码不能一一对应
当然gcc 可以指定是否优化
hello.s->hello.o
使用gcc -c
进行汇编,生成目标文件
gcc -c hello.s -o hello.o
hello.o->hello
链接生成可执行文件
gcc hello.o -o hello
这上面
可以用一句话
gcc hello.c -o hello
预处理(cpp)根据#
字符开头的命令
如#include<stdio.h>
把这个stdio.h
的文件直接插入
如#define
这种宏进行处理
就是将c的代码转换为汇编的代码
将汇编代码转换为机器语言的指令,把这些指令打包成一种叫可重定位目标程序(relocatable object program)的格式
hello
程序调用了printf
函数,printf
函数是标准C库中的函数,
printf
函数存在与一个名为printf.o
的一个预预编译好了的目标文件中,
链接器(ld)就处理这种合并
(如果想要更多的查询关于gcc)
可以使用man gcc
进行观看
使用man gcc | vim -
可以使用管道将man gcc
传入vim
进行观看
未完待续.。。
date: 2023-07-23 18:31:00
一图抵万字,哈哈哈!
总线
贯穿整个系统的电子管道,称为总线.它携带信息字体并负责在各个部件间传输
I/O 设备
就是除了总线,主存,处理器以外的都是(例如:键盘,鼠标,磁盘,显示器等网络是种特殊的I/O设配)
是一个临时存储设配,在处理器执行期间,用来存放程序和程序处理的数据
可以从两方面视角来看计算机:计算机视角和用户视角(物理视角和逻辑视角)
物理视角:主存是由一组动态随机存取存储器(DRAM)芯片组成的
逻辑视角:存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引)
就写一个概念吧
中央处理单元(cpu),是解释(或执行)存储在主存中的指令引擎
在shell上运行./hello
这个hello
是./hello
shell
是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令
是用来与系统交互的
这个使用了直接存储器存储(DMA),数据可以不用通过处理器而直接从磁盘到达主存
来看看流程
在shell 中输入./hello
,shell程序将字符逐一读入寄存器,再将它存放在内存中(内存一般指的是主存)
在键盘上按回车时,shell 程序知道我们已经结束了命理的输入
shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存
目标文件hello中的代码和数据加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令
这些指令将“hello,world\n
字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设配,最终显示到屏幕上
可以使用命令strace ./hello
在我的电脑上会显示
1 | execve("./hello", ["./hello"], 0x7ffcdebfb7e0 /* 64 vars */) = 0 |
这是chatgpt所说
1 |
|
我可以简单的看出是比较符合所说的
从这个示例看出来,系统花费大量的时间把信息从一个地方挪到一个地方
好累 这个书是真的有意思但讲不清
未完待续.。。
date: 2023-07-27 22:53:00
处理器从寄存器文件中读取数据比从主存读数度要快100倍以上,处理器与主存之间的距离速度还在增大
为了解决这些问题
系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memory)
作为暂时的集结区存放处理器近期可能需要的信息
高速缓存的局部性原理,程序具有访问局部区域里的数据和代码的趋势,
通过让高速缓存存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成
shell运行hello程序时,hello 程序输出自己消息时,shell 和hello程序会通过
操作系统进行访问键盘,显示器,磁盘,主存
操作系统是应用程序和硬件之间的一层软件,所有程序对于硬件的尝试都必须通过
操作系统
基本作用
操作系统通过几个基本的抽象概念(进程,虚拟内存和文件)来实现这两个功能
进程是操作系统对一个正在运行的程序的一种抽象
一个系统上可以运行多个进程,每个进程都好像认为自己在独占的使用硬件
并发运行 是指一个进程的指令和另一个指令是交错运行的
在大多数系统中,需要的进程数是多于可以运行它们的cpu个数的.
传统的系统在一个时刻只能运行一个程序,而先进的多核处理器可以执行多个程序