Skip to content

Commit 8473750

Browse files
committed
new(in progress): csapp
1 parent 359f0ea commit 8473750

2 files changed

Lines changed: 47 additions & 0 deletions

File tree

content/posts/csapp/image.png

362 KB
Loading

content/posts/csapp/index.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
+++
2+
date = '2025-11-19T15:54:44+08:00'
3+
draft = true
4+
title = 'Csapp'
5+
+++
6+
7+
## ELF 的分布
8+
9+
- 段头部表:指示下面的各种段是如何加载进入内存的。(头)
10+
- 节头部表:指示如何让动态链接的程序如何去加载共享库。(末尾)
11+
12+
13+
`ELF` 中有一部分只读的,还有读写的部分。
14+
15+
只读:
16+
17+
- `.init`: 在程序运行前设置运行环境的代码部分。
18+
- `.text`: 编译后的机器码。
19+
- `.rodata`: 常量区,比如 `C-Style` 的字符串。
20+
21+
读写:
22+
23+
- `.data`: 存储已初始化的全局变量、静态变量。
24+
- `.bss`: 可以认为是 `Better Save Storage`,因为放在此处可以减少 `ELF` 的体积。
25+
26+
---
27+
28+
> 使用 `readelf`,会发现这些段的加载到 `2MB` 的整数倍上,是为了内存对齐。
29+
> `ELF` 段头表上面,会看到 `vaddr``paddr`,一般只考虑前者。
30+
31+
在现代操作系统上面,使用 `PIE` (非位置无关可执行文件),所以看到的是4K页的映射,已经没有物理地址的说明了。这样让加载器自动确定地址。
32+
33+
在读写的部分,会发现文件大小和加载后的内存大小不一致,因为 `bss` 段不会加载进去,而是预留八字节。
34+
35+
## 加载可执行目标文件
36+
37+
![内存布局图](image.png)
38+
39+
一个相比微机原理更加详细的内存布局图。
40+
41+
在64位系统上面, `2^48` 以上的部分保留给内核,`2^48-1` 部分是栈,向低地址增长,共享库位于堆和栈的中间。
42+
43+
## PIC (位置无关代码)
44+
45+
通过 `PIC`,可以实现不同的程序共用加载在同一段在内存中的共享库,从而节省空间。
46+
47+
在数据段开始的部分,添加一个 `GOT` 全局偏移表,这个表可以被动态链接器查找对应的共享库内存地址,从而使用共享库。

0 commit comments

Comments
 (0)