├── LICENSE
├── README.md
├── doc
└── illustrations
│ ├── binary
│ ├── Binary01.gif
│ └── Binary02.gif
│ ├── condition
│ ├── condition0101.gif
│ ├── condition0102.gif
│ ├── condition0103.gif
│ ├── condition0104.gif
│ ├── conditioncontrol01.png
│ ├── conditioncontrol02.png
│ ├── conditioncontrol03.png
│ ├── conditioncontrol04.png
│ ├── conditioncontrol05.png
│ └── conditioncontrol06.png
│ ├── foreword
│ ├── foreword01.png
│ └── mpweixin.jpg
│ ├── introduce
│ └── pushpop.png
│ ├── jump
│ ├── jump01.gif
│ └── jump02.gif
│ ├── leaq
│ ├── leaq01.gif
│ ├── leaq02.gif
│ ├── leaq03.gif
│ ├── leaq04.gif
│ └── leaq05.gif
│ ├── linuxpre
│ ├── win11Update-01.png
│ ├── win11Update-02.png
│ ├── win11wsl-01.png
│ ├── win11wsl-03.png
│ ├── win11wsl-05.png
│ ├── win11wsl-07.png
│ ├── win11wsl-08.png
│ ├── win11wsl-11.png
│ └── win11wsl-12.png
│ ├── linuxuse01
│ ├── win11wsl-12.png
│ ├── win11wsl-13.png
│ ├── win11wsl-17.png
│ ├── win11wsl-18.png
│ ├── win11wsl-19.png
│ ├── win11wsl-20.png
│ ├── win11wsl-21.png
│ ├── win11wsl-22.png
│ ├── win11wsl-23.png
│ ├── win11wsl-39.png
│ └── win11wsl-40.png
│ ├── linuxuse02
│ ├── win11wsl-24.png
│ ├── win11wsl-26.png
│ ├── win11wsl-28.png
│ ├── win11wsl-29.png
│ ├── win11wsl-31.png
│ ├── win11wsl-32.png
│ ├── win11wsl-36.png
│ ├── win11wsl-38.png
│ ├── win11wsl-41.png
│ └── win11wsl-42.png
│ ├── linuxuse03
│ ├── win11gcc-01.png
│ ├── win11gcc-02.png
│ ├── win11gcc-05.png
│ ├── win11gcc-07.png
│ ├── win11gcc-08.png
│ ├── win11gcc-09.png
│ ├── win11gcc-10.png
│ ├── win11gcc-11.png
│ ├── win11gcc-12.png
│ ├── win11gcc-13.png
│ ├── win11gcc-14.png
│ ├── win11gcc-15.png
│ ├── win11gcc-16.png
│ ├── win11gcc-17.png
│ ├── win11gcc-18.png
│ ├── win11gcc-19.png
│ └── win11gcc-20.png
│ ├── linuxuse04
│ ├── architecture-wsl.png
│ ├── win11vscode-02.png
│ ├── win11vscode-10.png
│ ├── win11vscode-11.png
│ ├── win11vscode-12.png
│ ├── win11vscode-13.png
│ ├── win11vscode-14.png
│ ├── win11vscode-15.png
│ ├── win11vscode-16.png
│ ├── win11vscode-17.png
│ └── win11vscode-18.png
│ ├── linuxuse05
│ ├── win11gdb-01.png
│ ├── win11gdb-02.png
│ ├── win11gdb-03.png
│ ├── win11gdb-04.png
│ ├── win11gdb-05.png
│ ├── win11gdb-06.png
│ ├── win11gdb-07.png
│ ├── win11vscode-03.png
│ └── win11vscode-06.png
│ ├── loop
│ ├── loop01.PNG
│ ├── loop02.PNG
│ ├── loop03.PNG
│ ├── loop04.PNG
│ ├── loop05.PNG
│ ├── loop06.PNG
│ ├── loop07.PNG
│ └── loop08.PNG
│ ├── memory
│ ├── Memory01.png
│ ├── Memory02.png
│ ├── Memory03.png
│ ├── Memory04.png
│ ├── Memory05.png
│ ├── Memory06.png
│ ├── Memory07.png
│ ├── memory02_1.png
│ ├── memory03_1.png
│ ├── memory07_1.png
│ ├── png01.png
│ ├── png02.png
│ ├── png03.png
│ └── png04.png
│ ├── mov
│ ├── mov01.png
│ ├── mov01_1.png
│ ├── mov02.gif
│ ├── mov02_1.gif
│ ├── mov03.gif
│ ├── mov03_1.gif
│ └── mov1.PNG
│ ├── operand
│ ├── operand01.png
│ ├── operand1.PNG
│ ├── operand2.PNG
│ ├── operand3.PNG
│ ├── operand4.PNG
│ ├── operand5.PNG
│ ├── operand6.PNG
│ ├── operand7.PNG
│ ├── operand8.PNG
│ └── operand9.PNG
│ ├── recursion
│ ├── recursion.gif
│ ├── recursion0101.gif
│ ├── recursion0102.png
│ ├── recursion0103.png
│ ├── recursion0104.gif
│ ├── recursion0105.png
│ ├── recursion0106.gif
│ ├── recursion0107.gif
│ └── recursion0108.gif
│ ├── register
│ ├── register01.png
│ ├── register02.png
│ ├── register03.gif
│ ├── register04.png
│ ├── register05.gif
│ ├── register06.gif
│ └── register07.gif
│ ├── runtimestack
│ ├── Stack0301.png
│ ├── break02.png
│ ├── break03.png
│ ├── break04.png
│ ├── debug.png
│ ├── debug01.png
│ ├── gdb01.png
│ ├── gdb02.png
│ ├── gdb03.png
│ ├── gdb04.png
│ ├── gdb05.png
│ ├── gdb06.png
│ ├── gdb07.png
│ ├── gdb08.png
│ ├── gdb09.png
│ ├── gdb10.png
│ ├── gdb11.png
│ ├── gdb12.png
│ ├── gdb13.png
│ ├── gdb14.png
│ ├── gdb15.png
│ ├── gdb16.png
│ ├── gdb17.png
│ ├── register0102.png
│ ├── register0301.png
│ ├── register0302.png
│ ├── register0303.png
│ ├── register0304.png
│ ├── runtimestack01.png
│ ├── runtimestack0102.png
│ ├── runtimestack0201.gif
│ ├── runtimestack0202.gif
│ ├── runtimestack0203.gif
│ ├── runtimestack0204.gif
│ ├── runtimestack0206.gif
│ ├── runtimestack0208.gif
│ ├── runtimestack0209.gif
│ ├── runtimestack0210.gif
│ ├── runtimestack0211.gif
│ ├── runtimestack0301.gif
│ ├── runtimestack0302.gif
│ ├── runtimestack0303.gif
│ ├── runtimestack0401.gif
│ ├── runtimestack0401.png
│ ├── runtimestack0402.gif
│ ├── runtimestack0402.png
│ ├── runtimestack0403.gif
│ ├── runtimestack0403.png
│ ├── runtimestack0501.gif
│ ├── runtimestack0502.gif
│ ├── runtimestack0508.gif
│ ├── runtimestack0509.gif
│ ├── runtimestack0510.gif
│ ├── runtimestack0511.png
│ ├── runtimestack0512.png
│ ├── runtimestack0513.png
│ ├── runtimestack0601.png
│ ├── runtimestack0602.gif
│ ├── stack0302.png
│ ├── stack0303.png
│ ├── stack0304.png
│ ├── stack0305.png
│ └── stack0306.png
│ ├── stack
│ ├── stack01.png
│ ├── stack02.png
│ ├── stack03.gif
│ └── stack04.gif
│ ├── summary
│ ├── DALL·E 2024-04-15 18.08.21 .webp
│ ├── gif15.gif
│ ├── summary01.png
│ ├── summary02.png
│ ├── summary03.png
│ ├── summary04.jpg
│ └── summary05.jpg
│ └── unary
│ ├── unary01.gif
│ └── unary02.gif
├── linuxenvrionment
└── illustrations
│ ├── HyperV01.png
│ ├── HyperV02.png
│ ├── HyperV03.png
│ ├── HyperV04.png
│ ├── HyperV05.png
│ ├── HyperV06.png
│ ├── HyperV07.png
│ ├── HyperV08.png
│ ├── HyperV09.png
│ ├── HyperV10.png
│ ├── HyperV11.png
│ ├── HyperV12.png
│ ├── HyperV13.png
│ ├── HyperV14.png
│ ├── HyperV15.png
│ ├── HyperV16.png
│ ├── Ubuntu.txt
│ ├── Ubuntu01.png
│ ├── Ubuntu02.png
│ ├── Ubuntu03.png
│ ├── Ubuntu0301.png
│ ├── Ubuntu0302.png
│ ├── Ubuntu04.png
│ ├── Ubuntu05.png
│ ├── Ubuntu06.png
│ ├── Ubuntu07.png
│ ├── Ubuntu08.png
│ ├── Ubuntu09.png
│ ├── Ubuntu10.png
│ ├── Ubuntu11.png
│ ├── Ubuntu12.png
│ ├── Ubuntu13.png
│ ├── Ubuntu14.png
│ ├── Ubuntu15.png
│ ├── Ubuntu16.png
│ ├── Ubuntu17.png
│ ├── Ubuntu18.png
│ ├── Ubuntu19.png
│ ├── Ubuntu20.png
│ ├── Ubuntu21.png
│ ├── Ubuntu22.png
│ ├── Ubuntu23.png
│ ├── Ubuntu24.png
│ ├── Ubuntu25.png
│ ├── VMtoHostSpeed.png
│ ├── WindowsTerminal01.png
│ ├── WindowsTerminal02.png
│ ├── WindowsTerminal03.png
│ ├── binutils01.png
│ ├── binutils02.png
│ ├── binutils03.png
│ ├── binutils04.png
│ ├── binutils05.png
│ ├── binutils06.png
│ ├── binutils07.png
│ ├── binutils08.png
│ ├── binutils09.png
│ ├── gcc01.png
│ ├── gcc02.png
│ ├── gcc03.png
│ ├── gcc04.png
│ ├── gdb01.png
│ ├── gdb02.png
│ ├── gdb03.png
│ ├── gdb04.png
│ ├── gdb05.png
│ ├── git01.png
│ ├── git02.png
│ ├── git03.png
│ ├── git04.png
│ ├── git05.png
│ ├── git06.png
│ ├── git07.png
│ ├── git08.png
│ ├── git09.png
│ ├── git10.png
│ ├── git11.png
│ ├── git12.png
│ ├── git13.png
│ ├── git14.png
│ ├── git15.png
│ ├── git16.png
│ ├── git17.png
│ ├── linux0.11 01.png
│ ├── linux0.11 02.png
│ ├── linux0.11 03.png
│ ├── linux0.11 04.png
│ ├── linux0.11 05.png
│ ├── linux0.11 06.png
│ ├── linux0.11 07.png
│ ├── linux0.11 08.png
│ ├── linux0.11 09.png
│ ├── linux0.11 10.png
│ ├── linux0.11 11.png
│ ├── linux0.11 12.png
│ ├── linux0.11 13.png
│ ├── linux0.11 14.png
│ ├── linux0.11 15.png
│ ├── linux0.11 16.png
│ ├── linux0.11 17.png
│ ├── linux0.11 18.png
│ ├── linux0.11 19.png
│ ├── linux0.11 20.png
│ ├── linux0.11 21.png
│ ├── linux0.11 22.png
│ ├── linux0.11 23.png
│ ├── linux0.11 24.png
│ ├── linux0.11 25.png
│ ├── linux0.11 26.png
│ ├── linux0.11 27.png
│ ├── linux0.11 28.png
│ ├── linux0.11 29.png
│ ├── linux0.11 30.png
│ ├── linux0.11 31.png
│ ├── linux0.11 32.png
│ ├── linux0.11 33.png
│ ├── linux0.11 34.png
│ ├── linux0.11 35.png
│ ├── linuxProgramming01.png
│ ├── linuxProgramming02.png
│ ├── linuxProgramming03.png
│ ├── linuxProgramming04.png
│ ├── linuxProgramming05.png
│ ├── linuxProgramming06.png
│ ├── linuxProgramming07.png
│ ├── linuxProgramming08.png
│ ├── linuxProgramming09.png
│ ├── linuxProgramming10.png
│ ├── linuxProgramming11.png
│ ├── qemu01.png
│ ├── qemu02.png
│ ├── qemu03.png
│ ├── qemu04.png
│ ├── qemu05.png
│ ├── qemu06.png
│ ├── qemu07.png
│ ├── qemu08.png
│ ├── qemu09.png
│ ├── riscvgcc01.png
│ ├── riscvgcc02.png
│ ├── riscvgcc03.png
│ ├── riscvgcc04.png
│ ├── riscvqemu64 01.png
│ ├── riscvqemu64 02.png
│ ├── share01.png
│ ├── share02.png
│ ├── share03.png
│ ├── share04.png
│ ├── share05.png
│ ├── share06.png
│ ├── share07.png
│ ├── share08.png
│ ├── share09.png
│ ├── share10.png
│ ├── share11.png
│ ├── share12.png
│ ├── share13.png
│ ├── share14.png
│ ├── share15.png
│ ├── share16.png
│ ├── share17.png
│ ├── share18.png
│ ├── share19.png
│ ├── share20.png
│ ├── share21.png
│ ├── share22.png
│ ├── share23.png
│ ├── share24.png
│ ├── share25.png
│ ├── share26.png
│ ├── share27.png
│ ├── share28.png
│ ├── share29.png
│ ├── share30.png
│ ├── ssh.png
│ ├── ssh01.png
│ ├── ssh02.png
│ ├── ssh03.png
│ ├── ssh04.png
│ ├── ssh05.png
│ ├── ssh06.png
│ ├── ssh07.png
│ ├── ssh08.png
│ ├── ssh09.png
│ ├── ssh10.png
│ ├── ssh11.png
│ ├── ssh12.png
│ ├── ssh13.png
│ ├── ssh15.png
│ ├── ssh16.png
│ ├── ssh17.png
│ ├── ssh18.png
│ ├── ssh19.png
│ ├── ssh20.png
│ ├── ssh21.png
│ ├── ssh22.png
│ ├── ssh23.png
│ ├── ssh24.png
│ ├── ssh25.png
│ ├── ssh26.png
│ ├── ssh27.png
│ ├── ssh28.png
│ ├── ssh29.png
│ ├── ssh30.png
│ ├── ssh31.png
│ ├── ssh32.png
│ ├── ssh33.png
│ ├── ssh34.png
│ ├── ssh35.png
│ ├── toolchain01.png
│ ├── toolchain02.png
│ ├── toolchain03.png
│ ├── toolchain04.png
│ ├── toolchain05.png
│ ├── toolchain06.png
│ ├── toolchain07.png
│ ├── toolchain08.png
│ ├── toolchain09.png
│ ├── toolchain10.png
│ ├── toolchain11.png
│ ├── toolchain12.png
│ ├── toolchain13.png
│ ├── toolchain14.png
│ ├── toolchain15.png
│ ├── toolchain16.png
│ ├── toolchain17.png
│ ├── toolchain18.png
│ ├── toolchain19.png
│ ├── toolchain20.png
│ ├── toolchain21.png
│ ├── toolchain22.png
│ ├── toolchain23.png
│ └── toolchain24.png
├── mpweixin
├── 00前言.md
├── 01内存.md
├── 02内存的布局.md
├── 03寄存器.md
├── 04指令1MOV.md
├── 05指令2LEA.md
├── 06指令算术和逻辑.md
├── 07指令push和pop.md
├── 08指令call和ret.md
├── 09运行时栈.md
├── 10栈帧的布局.md
├── 11条件码寄存器.md
├── 12条件分支.md
├── 13循环.md
├── 14递归.md
├── 15gcc.md
├── 16gdb.md
├── 17 02.md
└── 17从底层逻辑开始.md
├── pdf
└── Computer_Systems_A_Programmers_Perspective(3rd).pdf
├── 使用Ubuntu01.md
├── 使用Ubuntu02.md
├── 使用Ubuntu03.md
├── 使用Ubuntu04.md
├── 使用Ubuntu05.md
├── 使用gdb.md
├── 准备Linux环境.md
├── 寄存器.md
├── 导读.md
├── 循环.md
├── 指令集1操作数.md
├── 指令集2mov.md
├── 指令集3pushpop.md
├── 指令集4leaq.md
├── 指令集5一元操作.md
├── 指令集6二元操作.md
├── 条件控制.md
├── 条件码.md
├── 栈帧的布局.md
├── 程序角度的内存.md
├── 程序角度的内存布局.md
├── 资源.md
├── 跳转指令.md
├── 运行时栈1准备.md
├── 运行时栈2分配内存.md
├── 运行时栈3转移控制.md
├── 运行时栈4被保存的寄存器.md
├── 运行时栈5返回值.md
└── 递归.md
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Terry Ding
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # csapp-learning
2 |
3 | Computer Systems A Programmer's Perspective
4 |
5 | 深入理解计算机系统 学习笔记
6 |
7 | ## 准备
8 |
9 | 1. [资料](/资源.md)
10 |
11 | 2. [WSL 01 -- 安装 Ubuntu](/准备Linux环境.md)
12 |
13 | 3. [WSL 02 -- Ubuntu 中安装 GUI 应用](/使用Ubuntu01.md)
14 |
15 | 4. [WSL 03 -- 访问文件目录](/使用Ubuntu02.md)
16 |
17 | 5. [WSL 04 -- gcc](/使用Ubuntu03.md)
18 |
19 | 6. [WSL 05 -- VS Code](/使用Ubuntu04.md)
20 |
21 | 7. [WSL 06 -- gdb](/使用Ubuntu05.md)
22 |
23 | ## 第三章 程序的机器级表示 笔记
24 |
25 | 1. [内存](/程序角度的内存.md)
26 |
27 | 2. [内存的布局](/程序角度的内存布局.md)
28 |
29 | 3. [寄存器](/寄存器.md)
30 |
31 | 4. [指令集 1 - 操作数格式](/指令集1操作数.md)
32 |
33 | 5. [指令集 2 - mov](/指令集2mov.md)
34 |
35 | 6. [指令集 3 - leaq](/指令集4leaq.md)
36 |
37 | 7. [指令集 4 - 一元操作](/指令集5一元操作.md)
38 |
39 | 8. [指令集 5 - 二元操作](/指令集6二元操作.md)
40 |
41 | 9. [指令集 6 - push / pop](/指令集3pushpop.md)
42 |
43 | 10. [运行时栈 1 - 准备](/运行时栈1准备.md)
44 |
45 | 11. [运行时栈 2 - 分配内存和参数传递](/运行时栈2分配内存.md)
46 |
47 | 12. [运行时栈 3 - 转移控制 call](/运行时栈3转移控制.md)
48 |
49 | 13. [运行时栈 4 - 被保存的寄存器](/运行时栈4被保存的寄存器.md)
50 |
51 | 14. [运行时栈 5 - 返回值和 ret](/运行时栈5返回值.md)
52 |
53 | 15. [栈帧的布局](/栈帧的布局.md)
54 |
55 | 16. [递归](/递归.md)
56 |
57 | 17. [条件码](/条件码.md)
58 |
59 | ## 第三章 程序的机器级表示 笔记 公众号版本
60 |
61 | 1. [前言 - 学习笔记](/mpweixin/00前言.md)
62 |
63 | 2. [从程序的角度看,内存是什么?](/mpweixin/01内存.md)
64 |
65 | 3. [内存的布局](./mpweixin/02内存的布局.md)
66 |
67 | 4. [寄存器](./mpweixin/03寄存器.md)
68 |
69 | 5. [指令 1 - MOV](./mpweixin/04指令1MOV.md)
70 |
71 | 6. [指令 2 - LEA](./mpweixin/05指令2LEA.md)
72 |
73 | 7. [指令 3 - 算术和逻辑](./mpweixin/06指令算术和逻辑.md)
74 |
75 | 8. [指令 4 - PUSH 和 POP](./mpweixin/07指令push和pop.md)
76 |
77 | 9. [指令 5 - CALL 和 RET](./mpweixin/08指令call和ret.md)
78 |
79 | 10. [程序运行时的栈](./mpweixin/09运行时栈.md)
80 |
81 | 11. [栈帧的布局](./mpweixin/10栈帧的布局.md)
82 |
83 | 12. [条件码寄存器](./mpweixin/11条件码寄存器.md)
84 |
85 | 13. [条件分支](./mpweixin/12条件控制.md)
86 |
87 | 14. [循环](./mpweixin/13循环.md)
88 |
89 | 15. [递归](./mpweixin/14递归.md)
90 |
91 | 16. [从底层逻辑开始](./mpweixin/17%2002.md)
--------------------------------------------------------------------------------
/doc/illustrations/binary/Binary01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/binary/Binary01.gif
--------------------------------------------------------------------------------
/doc/illustrations/binary/Binary02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/binary/Binary02.gif
--------------------------------------------------------------------------------
/doc/illustrations/condition/condition0101.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/condition0101.gif
--------------------------------------------------------------------------------
/doc/illustrations/condition/condition0102.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/condition0102.gif
--------------------------------------------------------------------------------
/doc/illustrations/condition/condition0103.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/condition0103.gif
--------------------------------------------------------------------------------
/doc/illustrations/condition/condition0104.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/condition0104.gif
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol01.png
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol02.png
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol03.png
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol04.png
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol05.png
--------------------------------------------------------------------------------
/doc/illustrations/condition/conditioncontrol06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/condition/conditioncontrol06.png
--------------------------------------------------------------------------------
/doc/illustrations/foreword/foreword01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/foreword/foreword01.png
--------------------------------------------------------------------------------
/doc/illustrations/foreword/mpweixin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/foreword/mpweixin.jpg
--------------------------------------------------------------------------------
/doc/illustrations/introduce/pushpop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/introduce/pushpop.png
--------------------------------------------------------------------------------
/doc/illustrations/jump/jump01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/jump/jump01.gif
--------------------------------------------------------------------------------
/doc/illustrations/jump/jump02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/jump/jump02.gif
--------------------------------------------------------------------------------
/doc/illustrations/leaq/leaq01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/leaq/leaq01.gif
--------------------------------------------------------------------------------
/doc/illustrations/leaq/leaq02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/leaq/leaq02.gif
--------------------------------------------------------------------------------
/doc/illustrations/leaq/leaq03.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/leaq/leaq03.gif
--------------------------------------------------------------------------------
/doc/illustrations/leaq/leaq04.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/leaq/leaq04.gif
--------------------------------------------------------------------------------
/doc/illustrations/leaq/leaq05.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/leaq/leaq05.gif
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11Update-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11Update-01.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11Update-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11Update-02.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-01.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-03.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-05.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-07.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-08.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-11.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxpre/win11wsl-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxpre/win11wsl-12.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-12.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-13.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-17.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-18.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-19.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-20.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-21.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-22.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-23.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-39.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse01/win11wsl-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse01/win11wsl-40.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-24.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-26.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-28.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-29.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-31.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-32.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-36.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-38.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-41.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse02/win11wsl-42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse02/win11wsl-42.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-01.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-02.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-05.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-07.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-08.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-09.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-10.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-11.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-12.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-13.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-14.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-15.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-16.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-17.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-18.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-19.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse03/win11gcc-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse03/win11gcc-20.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/architecture-wsl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/architecture-wsl.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-02.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-10.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-11.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-12.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-13.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-14.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-15.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-16.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-17.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse04/win11vscode-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse04/win11vscode-18.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-01.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-02.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-03.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-04.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-05.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-06.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11gdb-07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11gdb-07.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11vscode-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11vscode-03.png
--------------------------------------------------------------------------------
/doc/illustrations/linuxuse05/win11vscode-06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/linuxuse05/win11vscode-06.png
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop01.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop01.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop02.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop02.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop03.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop03.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop04.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop04.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop05.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop05.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop06.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop06.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop07.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop07.PNG
--------------------------------------------------------------------------------
/doc/illustrations/loop/loop08.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/loop/loop08.PNG
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory01.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory02.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory03.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory04.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory05.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory06.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/Memory07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/Memory07.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/memory02_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/memory02_1.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/memory03_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/memory03_1.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/memory07_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/memory07_1.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/png01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/png01.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/png02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/png02.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/png03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/png03.png
--------------------------------------------------------------------------------
/doc/illustrations/memory/png04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/memory/png04.png
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov01.png
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov01_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov01_1.png
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov02.gif
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov02_1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov02_1.gif
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov03.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov03.gif
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov03_1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov03_1.gif
--------------------------------------------------------------------------------
/doc/illustrations/mov/mov1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/mov/mov1.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand01.png
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand1.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand2.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand3.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand4.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand5.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand5.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand6.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand6.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand7.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand7.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand8.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand8.PNG
--------------------------------------------------------------------------------
/doc/illustrations/operand/operand9.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/operand/operand9.PNG
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion.gif
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0101.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0101.gif
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0102.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0102.png
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0103.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0103.png
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0104.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0104.gif
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0105.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0105.png
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0106.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0106.gif
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0107.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0107.gif
--------------------------------------------------------------------------------
/doc/illustrations/recursion/recursion0108.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/recursion/recursion0108.gif
--------------------------------------------------------------------------------
/doc/illustrations/register/register01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register01.png
--------------------------------------------------------------------------------
/doc/illustrations/register/register02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register02.png
--------------------------------------------------------------------------------
/doc/illustrations/register/register03.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register03.gif
--------------------------------------------------------------------------------
/doc/illustrations/register/register04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register04.png
--------------------------------------------------------------------------------
/doc/illustrations/register/register05.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register05.gif
--------------------------------------------------------------------------------
/doc/illustrations/register/register06.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register06.gif
--------------------------------------------------------------------------------
/doc/illustrations/register/register07.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/register/register07.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/Stack0301.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/Stack0301.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/break02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/break02.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/break03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/break03.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/break04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/break04.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/debug.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/debug01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/debug01.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb01.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb02.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb03.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb04.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb05.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb06.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb07.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb08.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb09.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb10.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb11.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb12.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb13.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb14.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb15.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb16.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/gdb17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/gdb17.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/register0102.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/register0102.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/register0301.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/register0301.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/register0302.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/register0302.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/register0303.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/register0303.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/register0304.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/register0304.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack01.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0102.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0102.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0201.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0201.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0202.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0202.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0203.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0203.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0204.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0204.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0206.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0206.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0208.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0208.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0209.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0209.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0210.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0210.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0211.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0211.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0301.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0301.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0302.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0302.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0303.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0303.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0401.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0401.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0401.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0401.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0402.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0402.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0402.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0402.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0403.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0403.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0403.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0403.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0501.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0501.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0502.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0502.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0508.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0508.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0509.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0509.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0510.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0510.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0511.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0511.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0512.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0513.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0513.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0601.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0601.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/runtimestack0602.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/runtimestack0602.gif
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/stack0302.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/stack0302.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/stack0303.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/stack0303.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/stack0304.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/stack0304.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/stack0305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/stack0305.png
--------------------------------------------------------------------------------
/doc/illustrations/runtimestack/stack0306.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/runtimestack/stack0306.png
--------------------------------------------------------------------------------
/doc/illustrations/stack/stack01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/stack/stack01.png
--------------------------------------------------------------------------------
/doc/illustrations/stack/stack02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/stack/stack02.png
--------------------------------------------------------------------------------
/doc/illustrations/stack/stack03.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/stack/stack03.gif
--------------------------------------------------------------------------------
/doc/illustrations/stack/stack04.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/stack/stack04.gif
--------------------------------------------------------------------------------
/doc/illustrations/summary/DALL·E 2024-04-15 18.08.21 .webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/DALL·E 2024-04-15 18.08.21 .webp
--------------------------------------------------------------------------------
/doc/illustrations/summary/gif15.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/gif15.gif
--------------------------------------------------------------------------------
/doc/illustrations/summary/summary01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/summary01.png
--------------------------------------------------------------------------------
/doc/illustrations/summary/summary02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/summary02.png
--------------------------------------------------------------------------------
/doc/illustrations/summary/summary03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/summary03.png
--------------------------------------------------------------------------------
/doc/illustrations/summary/summary04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/summary04.jpg
--------------------------------------------------------------------------------
/doc/illustrations/summary/summary05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/summary/summary05.jpg
--------------------------------------------------------------------------------
/doc/illustrations/unary/unary01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/unary/unary01.gif
--------------------------------------------------------------------------------
/doc/illustrations/unary/unary02.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/doc/illustrations/unary/unary02.gif
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/HyperV16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/HyperV16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu.txt:
--------------------------------------------------------------------------------
1 | https://phoenixnap.com/kb/hyper-v-ubuntu
2 |
3 | https://www.youtube.com/watch?v=ACUhGz4_Ceo
4 |
5 | -------
6 |
7 | https://ubuntu.com/download/desktop
8 |
9 | https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/should-i-create-a-generation-1-or-2-virtual-machine-in-hyper-v
10 |
11 | ----------
12 |
13 |
14 | https://zh.wikihow.com/%E8%8E%B7%E5%8F%96Linux%E7%9A%84root%E6%9D%83%E9%99%90
15 |
16 |
17 | ----------
18 |
19 | https://linuxize.com/post/how-to-enable-ssh-on-ubuntu-20-04/
20 |
21 | https://wangdoc.com/ssh/client.html
22 |
23 |
24 | ----
25 | https://www.jianshu.com/p/b7a105a67253
26 | https://docs.microsoft.com/en-us/windows/terminal/tutorials/ssh
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu0301.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu0301.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu0302.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu0302.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu18.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu19.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu20.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu21.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu22.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu23.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu24.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/Ubuntu25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/Ubuntu25.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/VMtoHostSpeed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/VMtoHostSpeed.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/WindowsTerminal01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/WindowsTerminal01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/WindowsTerminal02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/WindowsTerminal02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/WindowsTerminal03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/WindowsTerminal03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/binutils09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/binutils09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gcc01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gcc01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gcc02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gcc02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gcc03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gcc03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gcc04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gcc04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gdb01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gdb01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gdb02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gdb02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gdb03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gdb03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gdb04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gdb04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/gdb05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/gdb05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/git17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/git17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 18.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 19.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 20.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 21.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 22.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 23.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 24.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 25.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 26.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 27.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 28.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 29.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 30.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 31.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 32.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 33.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 34.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linux0.11 35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linux0.11 35.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/linuxProgramming11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/linuxProgramming11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/qemu09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/qemu09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvgcc01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvgcc01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvgcc02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvgcc02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvgcc03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvgcc03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvgcc04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvgcc04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvqemu64 01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvqemu64 01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/riscvqemu64 02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/riscvqemu64 02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share18.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share19.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share20.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share21.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share22.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share23.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share24.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share25.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share26.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share27.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share28.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share29.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/share30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/share30.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh18.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh19.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh20.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh21.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh22.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh23.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh24.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh25.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh26.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh27.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh28.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh29.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh30.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh31.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh32.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh33.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh34.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/ssh35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/ssh35.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain01.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain02.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain03.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain04.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain05.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain06.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain07.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain08.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain09.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain10.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain11.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain12.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain13.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain14.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain15.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain16.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain17.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain18.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain19.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain20.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain21.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain22.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain23.png
--------------------------------------------------------------------------------
/linuxenvrionment/illustrations/toolchain24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/linuxenvrionment/illustrations/toolchain24.png
--------------------------------------------------------------------------------
/mpweixin/00前言.md:
--------------------------------------------------------------------------------
1 | # 00 前言 - 学习笔记
2 |
3 | 2021 年,我在学习 JavaScript 时看到了一篇关于 V8 引擎的文章。当在这篇文章中看到 “栈” 和 “寄存器” 这些概念的时候,就有点读不下去了。我想大家可能都有过这种感觉,对计算机基础知识的欠缺导致深入理解技术原理的时候步履维艰。
4 |
5 | 于是接下去几个月我决定从头开始认真学习一遍《深入理解计算机系统》。
6 |
7 | 在学习的过程中走过不少弯路,有些内容需要重复看几遍才明白,有些内容则需要再找其他资料对比来看。
8 |
9 | 一开始我是边学习边在纸上记笔记,做"第三章 程序的计算机级表示"笔记的时候,我发现电子版会更方便理解,于是便有了这份学习笔记。
10 |
11 | 选择把这份笔记公开出来,也是希望这份笔记也可以帮助到更多正在学习这本书的朋友。
12 |
13 | 相对于直接看书,结合笔记来学习,我觉得有这么三点好处:
14 |
15 | ## 1. 可视化的演示
16 |
17 | 在学习的过程中,经常会遇到操作内存和寄存器相关的指令,比如 Push 和 Pop。
18 |
19 | 书本上会用多张图来演示这些指令的执行过程。
20 |
21 |
22 |
23 |
24 |
25 | 这种情况下,通过动图可以更加直观地了解整个过程。
26 |
27 |
28 |
29 |
30 |
31 |
32 | 整个笔记中,我在每篇文章中都配有相应的图片来帮助理解,目前已经完成了100多张动态图片。
33 |
34 | ## 2. 新的视角
35 |
36 | 书本上的讲解,是按照概念从小到大的顺序来进行的。这符合人们认识事物的心理预期。
37 |
38 | 但我在学习的过程中我发现有时候这反而容易让我失去学习的耐心。因为内容实在太多了,一章的内容不是一两天就能看完的,很容易就钻进一个小的细节中,而忘了整个结构。
39 |
40 | 我需要一张导航图,知道我今天学习的内容在这张图的那个部分。
41 |
42 | 于是我的笔记中重新整理了顺序,首先介绍内存的布局。
43 |
44 |
45 |
46 |
47 |
48 |
49 | 然后在介绍完简单指令后,就直接通过一个完整的例子介绍过程(函数),最后再回过头来介绍条件码等其他内容。
50 |
51 | 当然,我也会在每篇文章中标注出这是书本中的哪个章节。按照书本的顺序来学习的时候,可以将笔记作为对照。
52 |
53 |
54 |
55 |
56 |
57 | ## 3. 查漏补缺
58 |
59 | 学习的过程中,我也会去查找其他学习资料。有些内容是书本中没有讲到的。比如,程序使用的虚拟内存最高位为什么是 '0x00007FFFFFFFFFFF'?这其实跟 AMD64 架构的规定有关,“虚拟内存地址只用48位地址”。
60 |
61 |
62 |
63 |
64 |
65 |
66 | 另外,有些书中没有细讲,但我在学习的时候不是很清楚的部分,笔记中也会详细介绍。比如,在介绍条件码寄存器的溢出标志 OF 时,提到补码的正溢出和负溢出,笔记中会有详细的示例来解释。
67 |
68 |
69 |
70 |
71 |
72 | ## 总结
73 |
74 | 这是一份个人的学习笔记。在笔记中,我尽可能地用一种可视化的方式将书本中的概念展现出来。这些内容虽然无法替代你亲自去阅读《深入理解计算机系统》这本书,但是肯定可以帮助你更好地理解书本中的内容。
75 |
76 | 如果你对这份笔记有兴趣,可以直接关注这个公众号“dingtingli-pub”。我会每周更新三篇笔记。
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/mpweixin/01内存.md:
--------------------------------------------------------------------------------
1 | # 01 从程序的角度看,内存是什么?
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章内容的第一篇笔记,对应书本第 13 页的内容。
6 |
7 | 第三章中其实并没有专门讲解内存的定义,只是在之前的章节有所提及。第一篇笔记之所以从介绍内存开始,是因为我希望在进入正题之前能从全局的角度了解一下内存,毕竟之后的内容中主要操作的存储单元之一就是内存。
8 |
9 | 如果说程序就是一个状态机的话,内存就是保存状态的地方。
10 |
11 | 本文分为 4 个部分:
12 | * 内存的基本概念
13 | * 64 位操作系统内存空间
14 | * 48 位寻址空间
15 | * 虚拟内存
16 |
17 | 现在,让我们进入笔记的正题吧。
18 |
19 | ## 1. 内存的基本概念
20 |
21 | 从程序的角度,我们可以把内存想象成一个连续的数组,数组中的每个元素的大小是 1 字节(byte)。
22 |
23 | 在数组中访问一个元素可以使用索引,同样在内存中为了能访问元素,也为每个元素配置了地址。
24 |
25 | 在上面的这个类比中我们可以看出,内存对于程序来说有这么几个特性:
26 |
27 | 1. 内存的最小空间是1个字节(byte),也就是 8 位(bit)。
28 |
29 | 2. 内存是由许多这样的空间组合在一起的。
30 |
31 | 3. 每个空间都有一个地址。
32 |
33 | 以一个 4 位寻址空间的内存为例,我们用图形的方式来模拟一下内存的样子。
34 |
35 | 什么是 4 位寻址空间?这是指内存地址的范围是用 4 位(bit)的二进制表示,从 0000 到 1111,换算成十进制就是 0 ~ 15。
36 |
37 | 因为每个地址只能保存 1 个字节(byte)的数据,所以这个内存的容量就是 16 个字节( $2^{4}$ =16 )。
38 |
39 |
40 |
41 |
42 |
43 | ## 2. 64 位操作系统内存空间
44 |
45 | 现代的操作系统都是 64 位,也就是说理论上支持 64 位寻址空间的内存,用二进制表示:
46 |
47 | 0000000000000000000000000000000000000000000000000000000000000000(64个0)
48 |
49 | ~
50 |
51 | 1111111111111111111111111111111111111111111111111111111111111111(64个1)
52 |
53 | 二进制的字符太长,换算成十六进制(每 4 位二进制数转换成 1 位十六进制数):
54 |
55 | 0x0000000000000000(16个0)~ 0xFFFFFFFFFFFFFFFF(16个F)
56 |
57 | 这么大的寻址空间如果都填满,内存最多可以存储多少数据呢?
58 |
59 | $2^{64}$ = 18,446,744,073,709,551,616 字节(byte),大概是16,777,216 TB。
60 |
61 |
62 |
63 |
64 |
65 |
66 | ## 3. 48 位寻址空间
67 |
68 | 64 位的寻址空间实在是太大了,根据 AMD64 架构的规定,其实内存地址只用 48 位地址,具体规则如下:
69 |
70 | >一个表示内存地址的 64 位指针只有低 48 位有效,并带符号扩展到64位。换句话说,其高 16 位必须是全 1 或全 0,而且必须与低48位的最高位(第 47 位)一致。
71 |
72 | 根据上面的规则,内存地址分为如下两段:
73 |
74 | 1. 二进制表示:
75 |
76 | 0000000000000000 000000000000000000000000000000000000000000000000(64个0)
77 |
78 | ~
79 |
80 | 0000000000000000 011111111111111111111111111111111111111111111111(17个0,47个1)
81 |
82 | 十六进制表示:0x0000000000000000 ~ 0x00007FFFFFFFFFFF(128T)
83 |
84 | 2. 二进制表示:
85 |
86 | 1111111111111111 100000000000000000000000000000000000000000000000(17个1,47个0)
87 |
88 | ~
89 |
90 | 1111111111111111 111111111111111111111111111111111111111111111111(64个1)
91 |
92 | 十六进制表示:0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF(128T)
93 |
94 |
95 |
96 |
97 |
98 | ## 4. 虚拟内存
99 |
100 | 上面提到的内存,跟我们日常生活中见到的内存条好像有些不同。现实中,我们没有见过以 T 为单位的内存条,大多数的内存条都是 8G / 16G / 32G等。
101 |
102 | 可以想象一个内存使用的场景,一台有 32 G 物理内存的计算机,正在运行着浏览器,Word 等程序。这时候内存的使用情况大概是什么样子呢?
103 |
104 | 如果操作系统是 Windows,打开任务管理器就能看到,每个程序都占用着一定数量的物理内存空间。这时候我们可能会认为,程序可以直接操作分配给应用程序的物理内存空间。
105 |
106 | 然而真实情况是,程序本身是无法直接操作物理内存的,程序所能操作的是虚拟内存。
107 |
108 | 虚拟内存有这么几个特点:
109 | 1. 每个程序都感觉自己单独拥有系统的整个内存。
110 | 2. 每个程序实际可以使用的内存寻址空间是 0x0000000000000000 ~ 0x00007FFFFFFFFFFF (通常程序的起始地址也不是从 0 开始的,详情请看下一篇文章)。
111 | 3. 0x0000800000000000 ~ 0xFFFFFFFFFFFFFFFF 这段寻址空间的内存属于操作系统内核虚拟内存。
112 |
113 |
114 |
115 |
116 |
117 | 也就是说每个程序都感觉自己单独拥有完整的系统内存。
118 |
119 | 看到这里我们肯定会有一堆疑问:
120 |
121 | * 虚拟内存是什么技术?
122 |
123 | * 虚拟内存如何映射到物理内存?
124 |
125 | * 虚拟内存这么大,如果程序使用的范围超出物理内存的空间,会发生什么情况?
126 |
127 | * 程序之间是如何通信的?
128 | * ...
129 |
130 | 这些问题在《深入理解计算机系统》这本书里面都有解释,我们以后都会了解。现阶段我们可粗略地认为,有一种叫虚拟内存的技术可以将程序使用的内存映射到物理内存上。
131 |
132 |
133 |
134 |
135 |
136 | *注:映射过程中,不仅会用到物理内存,可能还会涉及到对硬盘空间的使用,图中没有画出。
137 |
138 | ## 总结
139 |
140 | 这篇文章我们从程序的角度,了解到内存是什么样子,以及可以操作多少内存空间。
141 |
142 | 每个程序都认为自己单独拥有整个内存,每个程序可操作的内存地址空间也是一样的。
143 |
144 | 下面一篇文章,我们将介绍程序可以操作的这一部分内存空间是如何布局的。
145 |
146 | ---
147 |
148 | 笔记列表:
149 | 1. [前言 - 学习笔记](./00前言.md)
150 |
151 | 如果你对这份笔记有兴趣,可以直接关注这个公众号“dingtingli-pub”。我会每周更新三篇笔记。
152 |
153 |
154 |
--------------------------------------------------------------------------------
/mpweixin/03寄存器.md:
--------------------------------------------------------------------------------
1 | # 03 寄存器
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章内容的第三篇笔记,对应书本 3.4 节第 120 页和 125 页的内容。
6 |
7 | [前面的笔记](./02内存的布局.md)中我们已经介绍了关于内存的相关内容。在学习指令集之前,我们还需要了解一个概念——寄存器。
8 |
9 | 平时大家没有机会使用到寄存器,因为现代的编程语言将这个概念给封装起来,大家看不到。但是,对于指令集来说寄存器非常重要。
10 |
11 | 笔记分为 2 个部分:
12 | * 寄存器的概念
13 | * 使用寄存器进行数据传送
14 |
15 | 让我们一起进入笔记的正题吧。
16 |
17 | ## 1. 寄存器的概念
18 |
19 | 寄存器(Register)是 CPU 内部的存储单元。可以用来暂存程序指令,数据和内存地址。因为存在于 CPU 内部,所以它的读写速度要比内存快得多。
20 |
21 | **在寄存器和内存之间,还有一层存储介质叫缓存(Cache)。缓存也在 CPU 内部,访问速度比寄存器慢,比内存快。对于程序而言缓存是透明的,不可操作。*
22 |
23 | 有三类寄存器与程序的运行关系密切:
24 |
25 | 1. 整数寄存器文件:有 16 个寄存器,每个寄存器空间为 64 位,可以存放内存地址和整数数据。
26 |
27 | 2. PC(Program Counter)程序计数器:存放程序将要执行的下一条指令在内存中的地址,用 %rip 表示。
28 |
29 | 3. 条件码寄存器(condition code register):主要有 4 个寄存器,每个寄存器空间为 1 位,用于存储最近执行的算术或逻辑指令的状态信息。主要是用来实现编程语言中的条件语句,比如 if,while 等。
30 |
31 | **除了上面提到的寄存器,还有其他寄存器,比如多个处理浮点运算的128位寄存器等。*
32 |
33 | 这次我们先介绍第一类寄存器,让大家对寄存器这个概念有一个了解,其他两类寄存器在使用到的时候再做讲解。
34 |
35 | 寄存器作为一类存储空间,有多大?
36 |
37 | 为了可以存储 X64 系统中一个完整的内存地址,每个寄存器大小都是 64 位。
38 |
39 | 怎么访问寄存器?
40 |
41 | 就像每个内存空间都有自己的内存地址,这 16 个整数寄存器,也都有自己的名称,以便于访问。
42 |
43 | 同时为了兼容之前的系统,寄存器根据使用的位数不同,名称也会有差别,64 位有一个名字,32 位,16 位,8 位都有自己的名字,具体形式如下图。
44 |
45 |
46 |
47 |
48 |
49 | 现在我们知道了,每个寄存器都有名字和固定的大小。那么寄存器和内存之间有什么关系呢?
50 |
51 | 前面提到,寄存器可以用来暂存程序指令,数据和内存地址。所以寄存器和内存之间的关系就是传递这几种类型的数据,以便于 CPU 进行计算。
52 |
53 |
54 |
55 |
56 |
57 | ## 2. 数据传递
58 |
59 | 这么介绍有点抽象,我们用一个简单的例子来演示一下程序在运行期间寄存器和内存之间是如何一起工作的。
60 |
61 | 先看一段示例代码:
62 |
63 | ```c
64 | long exchange (long *xp, long y){
65 | long x = *xp;
66 | *xp = y;
67 | return x;
68 | }
69 |
70 | int main(){
71 | long a = 4;
72 | long b = exchange(&a, 3);
73 | }
74 | ```
75 |
76 | 这段代码的主要功能:
77 |
78 | * 将 main 函数中变量 a 的地址 和 数值 3 传递给 exchange 函数。
79 |
80 | * 在 exchange 函数中,将变量 a 的值变成 3。
81 |
82 | * main 函数中,变量 b 被赋值为 4 (即调用 exchange 函数之前变量 a 的值)。
83 |
84 | 我们来按步骤查看一下 exchange 函数运行时,内存和寄存器的变化。
85 |
86 | 1. exchange 函数的初始状态
87 |
88 | * 变量 a (数值 4 )保存在内存中,这里假设该内存的起始地址为 0x100 。
89 | * **参数 xp** 中存放的是数值 4 的内存地址,**该地址存放在寄存器 %rdi 中。**
90 | * **参数 y** 中的数值是 3,**该值保存在寄存器 %rsi 里**。
91 |
92 |
93 |
94 |
95 |
96 | **注:图中 Memory 一格为 8 个连续的字节(long 类型需要 8 个字节,占用 8 个内存地址),右侧的地址为这 8 个字节的起始地址。*
97 |
98 | 2. 执行 `long x = *xp;` 语句,变量 x 保存在寄存器 %rax 中。
99 |
100 | * 从 %rid(参数 xp )所指向的内存中读取数值 4。
101 | * 将读取到的数值 4 保存到寄存器 %rax (变量 x)中。
102 |
103 |
104 |
105 |
106 |
107 | 3. 执行 `*xp = y;` 语句,将参数 y 的值赋给参数 xp 所指向的内存。
108 |
109 | * 从 %rsi (参数 y)中取出数值3,将其保存到 %rid 所指向的内存中。
110 |
111 |
112 |
113 |
114 |
115 | 寄存器 %rax 是保存函数返回值的地方,编译器非常聪明,在一开始就用 %rax 来保存变量 x 。因为变量 x 被赋值之后没有变化,所以最后一句 `return x;` 在这里不需要额外的指令来执行。
116 |
117 | 整个函数完整的执行过程就像下面这张动图:
118 |
119 |
120 |
121 |
122 |
123 | 而函数 exchange 最终转换成指令集(汇编代码)正好对应着这两步操作:
124 |
125 | ```arm
126 | movq (%rdi),%rax
127 | movq %rsi,(%rdi)
128 | ```
129 |
130 | 上面的指令什么意思🤯?如何查看代码转换后的机器指令😵💫?
131 |
132 | 这些问题现在一定让你很困惑。不要着急,我们会在之后的笔记中详细介绍。
133 |
134 | ## 总结
135 |
136 | 因为编程语言的封装,大家在平时开发过程中接触不到寄存器。但对于机器指令来说,寄存器则是必不可少的。
137 |
138 | 通过书中的示例,我们尝试以一种直观的方式让大家初步理解寄存器,以及它和内存之间是如何一起工作的。**CPU 进行运算时所需要的数据,都必须先从内存传送到寄存器。**
139 |
140 | 接下来让我们一起进入指令的世界吧。
141 |
142 | 今天就到这里了,我们下一个笔记再见!
143 |
144 | ---
145 |
146 | 笔记列表:
147 | 1. [前言 - 学习笔记](./00前言.md)
148 | 2. [从程序的角度看,内存是什么?](./01内存.md)
149 | 3. [内存的布局](./02内存的布局.md)
150 |
151 | 如果你对这份笔记有兴趣,可以直接关注这个公众号“dingtingli-pub”,我会每周更新三篇笔记。
152 |
153 |
154 |
155 |
--------------------------------------------------------------------------------
/mpweixin/05指令2LEA.md:
--------------------------------------------------------------------------------
1 | # 05 LEA 指令
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章的第五篇笔记,对应书本 3.5.1 节的内容。
6 |
7 | 前面的笔记中介绍了 [mov 指令](./04指令1MOV.md),这次我们再来看一个新的指令 **lea**。
8 |
9 | 笔记分为 3 个部分:
10 | * movq 指令回顾
11 | * leaq 指令介绍
12 | * c 语言示例
13 |
14 | ## 1. movq 指令回顾
15 |
16 | 在[上一篇笔记](./04指令1MOV.md)介绍操作数格式时,我们看到过下面这种格式:
17 |
18 | ```arm
19 | (%rax,%rdx,0x8)
20 | ```
21 |
22 | 这个操作数的意思是,计算出 %rax + %rdx * 0x8 的值,然后以该值为地址读取相应内存中的内容。
23 |
24 |
25 |
26 |
27 |
28 | 如果在 `movq` 中使用这个操作数,指令如下:
29 |
30 | ```arm
31 | movq (%rax,%rdx,0x8),%rax
32 | ```
33 |
34 | 该指令会将从内存中读出的值 `0x11`,写入 `%rax`。
35 |
36 |
37 |
38 |
39 |
40 | ## 2. leaq 指令介绍
41 |
42 | 这次介绍的 leaq 指令,其实是 movq 指令的变形,全称叫做“加载有效地址(load effective address)”。
43 |
44 | leaq 指令在形式上跟 movq 类似,也有两个操作数。但不一样的是,**第二个操作数必须是寄存器**。
45 |
46 | 比如将上面示例中的 movq 指令变成 leaq 指令:
47 |
48 | ```arm
49 | leaq (%rax,%rdx,0x8),%rax
50 | ```
51 |
52 | 该指令会将 `%rax + %rdx * 0x8` 计算出来的值 `0x118`,直接写入 `%rax` 中。
53 |
54 |
55 |
56 |
57 |
58 | 虽然 leaq 指令从名字上看是用来计算有效地址的, 但从执行结果来看,该指令已经超越了它的名字,它会做一次计算并保存计算结果,不管这个结果是不是一个有效地址。
59 |
60 | ## c 语言示例
61 |
62 | 为了演示 leaq 指令的作用,我们来看一段 c 语言代码:
63 |
64 | ```c
65 | long scale(long x, long y, long z)
66 | {
67 | long t = x + 4 * y + 12 * z;
68 | return t;
69 | }
70 | ```
71 |
72 | 代码很简单,就是做了一个计算,我们来看看转换后的指令:
73 |
74 | ```arm
75 | leaq (%rdi, %rsi, 4), %rax
76 | leaq (%rdx, %rdx, 2), %rdx
77 | leaq (%rax, %rdx, 4), %rax
78 | ```
79 |
80 | 试着解读一下这段指令。
81 |
82 | 函数的初始状态是这样的:
83 |
84 | 1. 参数 x 保存在 %rdi 中。
85 |
86 | 2. 参数 y 保存在 %rsi 中。
87 |
88 | 3. 参数 z 保存在 %rdx 中。
89 |
90 | 4. 返回值保存至 %rax 中。
91 |
92 | **函数的参数和返回值的传递方式,会在之后的笔记中详细介绍。*
93 |
94 | 执行第一条指令:
95 |
96 | ```arm
97 | leaq (%rdi, %rsi, 4), %rax
98 | ```
99 |
100 | 该指令计算 `%rdi + %rsi * 4`,对照初始状态即 `x + y * 4`,并将值直接写入 %rax。
101 |
102 |
103 |
104 |
105 |
106 | 执行第二条指令:
107 |
108 | ```arm
109 | leaq (%rdx, %rdx, 2), %rdx
110 | ```
111 |
112 | 该指令计算 `%rdx + %rdx * 2`, 即 `z + z * 2 = 3 * z`,并将值直接写入 %rdx。
113 |
114 |
115 |
116 |
117 |
118 | 执行第三条指令:
119 |
120 | ```arm
121 | leaq (%rax, %rdx, 4), %rax
122 | ```
123 |
124 | 该指令计算 `%rax + %rdx * 4`,即 `x + y * 4 + (3z) * 4 = x + 4 * y + 12 * z`,并将值直接写入 %rdx。
125 |
126 |
127 |
128 |
129 |
130 | 我们看到, c 语言中的一句 `long t = x + 4 * y + 12 * z;` 被分解成了 3 条 leaq 指令来运行。
131 |
132 | ```arm
133 | leaq (%rdi, %rsi, 4), %rax
134 | leaq (%rdx, %rdx, 2), %rdx
135 | leaq (%rax, %rdx, 4), %rax
136 | ```
137 | ## 总结
138 |
139 | leaq 指令虽然是 load effective address(加载有效地址)的简称,但它根本就没有引用内存,更多的是被用来描述复杂的计算逻辑。
140 |
141 | 你可能会奇怪,为什么要用 leaq 指令来做计算,没有直接用来计算的指令吗?答案是有的。
142 |
143 | 指令集中有 add,sub 等直接用于计算的指令,但是 leaq 指令在表达一些计算时更简洁。
144 |
145 | 今天就到这里了,我们下一个笔记再见!
146 |
147 | ---
148 |
149 | 笔记列表:
150 | 1. [前言 - 学习笔记](./00前言.md)
151 | 2. [从程序的角度看,内存是什么?](./01内存.md)
152 | 3. [内存的布局](./02内存的布局.md)
153 | 4. [寄存器](./03寄存器.md)
154 | 5. [MOV 指令](./04指令1MOV.md)
155 |
156 | 如果你对这份笔记有兴趣,可以直接关注这个公众号“dingtingli-pub”,我会每周更新三篇笔记。
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/mpweixin/07指令push和pop.md:
--------------------------------------------------------------------------------
1 | # PUSH 和 POP 指令
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章的第七篇笔记,对应书本 3.4.4 节的内容。
6 |
7 | 前面的笔记中已经介绍了 [mov 指令](./04指令1MOV.md), [lea 指令](./05指令2LEA.md) 和 [算术和逻辑指令](./06指令算术和逻辑.md)。
8 |
9 | 在内存布局中,我们知道内存是分成不同的功能区域的。这次就来学习一下操作 stack(栈)的两条指令,push 和 pop。
10 |
11 |
12 |
13 |
14 |
15 | **stack(栈)在内存布局的最上面。*
16 |
17 | Stack(栈)的功能主要有两个:
18 | * 函数中使用的局部变量保存在这里。
19 | * 可执行文件中的指令主要就是使用这块区域的变量。
20 |
21 | 所以它是函数执行是非常重要的一部分。
22 |
23 | 笔记分为 3 个部分:
24 | * 栈的结构
25 | * push指令
26 | * pop指令
27 |
28 | ## 1. 栈的结构
29 |
30 | 这一块内存之所以称为栈(stack),是因为操作系统将以栈这种数据结构来管理这块内存区域。
31 |
32 | 栈这种数据结构添加删除数据,要遵循“后进先出”(LIFO:Last In First Out)原则。
33 |
34 | 为了配合栈的操作,这块内存区域首先必须是一块地址连续的区间,然后需要将一端“封住”,称为“栈低”,所有数据从另外一端进出,称为“栈顶”。
35 |
36 | 栈顶元素的内存地址保存在专门的寄存器 %rsp 中(rsp: register stack point)。
37 |
38 | 通常,“栈底”在高位的内存地址,“栈顶”在低位的内存地址。由于我们画内存示意图的时候,习惯将低位内存地址放在下面,高位在上面,所以栈的示意图像一个倒扣过来的桶,桶口朝下。
39 |
40 |
41 |
42 |
43 |
44 | ## 2. push 指令
45 |
46 | 向栈中添加数据的动作称为“Push(压入)”,指令的格式如下:
47 |
48 | ```arm
49 | push S
50 | ```
51 |
52 | 该操作会执行两个步骤:
53 |
54 | 1. 修改栈指针 %rsp。
55 |
56 | 2. 将操作数 S 写到内存新的栈顶地址。
57 |
58 | 我们用示例演示一下 `push` 指令的具体操作。
59 |
60 | 首先假设指令开始之前,内存和寄存器的状态是这样的:
61 |
62 |
63 |
64 |
65 |
66 | 此时执行指令:
67 |
68 | ```arm
69 | pushq %rax
70 | ```
71 |
72 | 具体操作如下:
73 | 1. 修改栈指针,将栈指针减去 8 (即 8 个字节的地址),以扩展栈的空间。
74 | 2. 将 `%rax` 的内容写到新的栈顶地址所指的内存空间。
75 |
76 |
77 |
78 |
79 |
80 | ## 3. pop 指令
81 |
82 | 将栈中数据读出的动作称为“pop(弹出)”,指令的格式如下:
83 |
84 | ```arm
85 | pop D
86 | ```
87 |
88 | pop 与 push 的操作正好相反:
89 |
90 | 1. 从栈顶读取数据,写到 操作数 D 中。
91 |
92 | 2. 修改栈指针 `%rsp`。
93 |
94 | 沿用之前的初始状态,执行如下指令:
95 |
96 | ```arm
97 | popq %rdx
98 | ```
99 |
100 | 具体操作如下:
101 |
102 | 1. 将栈顶数据写到 %rdx 中,
103 |
104 | 2. 修改栈指针,将栈指针加上 8 ,以减小栈的空间。
105 |
106 |
107 |
108 |
109 |
110 | 需要注意的是,我们只是修改了栈顶指针,原来栈顶的地址的数据并没有删除(图中标灰的部分)。
111 |
112 | ## 总结
113 |
114 | 初学者可能会搞混两个概念,内存中栈和数据结构中栈。
115 |
116 | 内存中栈,其实只是将一块连续的地址内存空间分配出来,然后用栈这种数据结构来管理。
117 |
118 | 不知道你是否还记得,在[内存布局的笔记]()中我们曾经介绍过,栈的大小是 8 M。
119 |
120 | 因为这个空间不大,当使用超过这个空间限制时,就会发生栈溢出(stack overflow),这也是 stackoverflow 这个网站名字的由来。什么时候会产生栈溢出的问题,我们以后再介绍。
121 |
122 | 今天就到这里了,我们下一个笔记再见!
123 |
124 | ---
125 | 笔记列表:
126 | 1. [前言 - 学习笔记](./00前言.md)
127 | 2. [从程序的角度看,内存是什么?](./01内存.md)
128 | 3. [内存的布局](./02内存的布局.md)
129 | 4. [寄存器](./03寄存器.md)
130 | 5. [MOV 指令](./04指令1MOV.md)
131 | 6. [LEA 指令](./05指令2LEA.md)
132 | 7. [算术和逻辑指令](./06指令算术和逻辑.md)
133 |
134 | 如果你对这份笔记有兴趣,可以直接关注这个公众号“dingtingli-pub”,我会每周更新三篇笔记。
135 |
136 |
137 |
138 |
--------------------------------------------------------------------------------
/mpweixin/08指令call和ret.md:
--------------------------------------------------------------------------------
1 | # call 和 ret 指令
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章的第八篇笔记,对应书本 3.7.2 节的内容。
6 |
7 | 前面的笔记中介绍了栈相关的操作[指令 push 和 pop](./07指令push和pop.md)。
8 |
9 | 栈中主要存放的是函数中使用的局部变量,今天我们再来介绍两个跟函数调用相关的指令 call 和 ret。
10 |
11 | 笔记分为 3 个部分:
12 | * 函数
13 | * 程序计数器
14 | * call 指令
15 | * ret 指令
16 |
17 | ## 1. 函数
18 |
19 | 假设我们正在编写汇编指令,有一个地方需要把两个数相乘,因此我们就编写了一段用于两数相乘的指令。
20 |
21 | 然后在另一个地方我们发现需要再次对两数进行相乘,因为前面已经写过类似的指令,所以这次我们希望最好能重复使用之前的代码。
22 |
23 | 这该怎么实现呢?
24 |
25 | 我们可以在所有执行两数相乘的地方,跳转到先前写的那段乘法指令的位置,执行完成后再返回到当前的指令。
26 |
27 | 你可能会想,这不就是我们每天都在使用的函数嘛?是的。对于指令集来说,实现函数调用是其基本的组成部分。
28 |
29 | 下面,我们先用 c 语言写一个两数相乘的函数:
30 |
31 | ```c
32 | long mult2(long a, long b)
33 | {
34 | long s = a * b;
35 | return s;
36 | }
37 | ```
38 |
39 | 通过 gdb 可以查看该函数运行时在内存中对应的指令:
40 |
41 | ```arm
42 | 0x0000555555555129: endbr64
43 | 0x000055555555512d: movq %rdi,%rax
44 | 0x0000555555555130: imulq %rsi,%rax
45 | 0x0000555555555134: retq
46 | ```
47 |
48 |
49 |
50 |
51 |
52 | 第一次看到这种格式有点陌生,没关系,我们以第二行指令为例解释一下,该指令分为三段,含义如下:
53 |
54 | * `0x55555555512d` 表示指令在内存中的起始地址。
55 | * `48 89 f8` 表示指令的机器码,并被保存到内存中。
56 | * `movq %rdi,%rax` 是指令的可读形式,相当于注释,不保存到内存中。
57 |
58 | 结合之前[内存布局](./02内存的布局.md)的相关知识,指令在内存中大概这样保存:
59 |
60 |
61 |
62 |
63 |
64 | ## 2. 程序计数器
65 |
66 | 我们现在已经知道了指令在内存中的样子。在了解调用函数之前,我们先来了解一个知识点——程序计数器(PC:Program Counter)。
67 |
68 | 之前介绍[寄存器](./03寄存器.md)的时候,我们曾经提过程序计数器的寄存器用 `%rip` 来表示。
69 |
70 | 程序计数器的作用是提供下一条将要执行的指令地址。
71 |
72 | 比如,`0x55555555512d` 地址中的指令执行结束时,`%rip` 中地址会变成下一条指令的地址 `0x555555555130`。
73 |
74 |
75 |
76 |
77 |
78 | ## 3. call 指令
79 |
80 | 现在可以试着调用 mult2 函数了。
81 |
82 | 我们假设有这么一个函数,在该函数的代码中调用了之前的两数相乘的函数 mult2:
83 |
84 | ```c
85 | void multstore(...)
86 | {
87 | ...
88 | long t = mult2(x, y);
89 | ...
90 | }
91 | ```
92 |
93 | 同样,通过 gdb 我们也找到了在 multstore 中调用 mult2 函数的相关指令:
94 |
95 | ```arm
96 | 0x000055555555513d: callq 0x555555555129
97 | 0x0000555555555142: movq %rax,(%rbx)
98 | 0x0000555555555145: popq %rbx
99 | ```
100 |
101 |
102 |
103 |
104 | 现在我们就可以研究一下 call 指令会做哪些操作。
105 |
106 | call 指令会完成两步操作:
107 |
108 | 1. 在栈中扩展 8 个字节,用于存放 call 指令下面一条指令的内存地址,作为返回地址。
109 |
110 | 2. 将程序计数器 `%rip` 设置成 call 指令操作数中的地址。
111 |
112 | 在我们这个例子中:
113 |
114 | 1. 首先会扩展栈,栈指针 `%rsp` 变为 `0x7fffffffdfc0`,并在该地址保存 call 指令的下面一条指令 `movq %rax,(%rbx)` 的地址 `0x555555555142`。
115 |
116 | 2. 将操作数 `0x555555555129` 写入程序计数器 `%rip`。
117 |
118 |
119 |
120 |
121 |
122 | ## 4. ret 指令
123 |
124 | 上面的 callq 指令执行完成后,程序计数器将会指向 mult2 函数指令的起始位置 `0x555555555129`。
125 |
126 | 在 mult2 函数中,会执行 'imulq' 指令将两数相乘并返回。
127 |
128 | ```arm
129 | 0x0000555555555129 :
130 | 0x0000555555555129: endbr64
131 | 0x000055555555512d: movq %rdi,%rax
132 | 0x0000555555555130: imulq %rsi,%rax
133 | 0x0000555555555134: retq
134 |
135 | 0x0000555555555135 :
136 | ...
137 | 0x000055555555513d: callq 0x555555555129
138 | 0x0000555555555142: movq %rax,(%rbx)
139 | 0x0000555555555145: popq %rbx
140 | ...
141 | ```
142 |
143 |
144 |
145 |
146 |
147 | 函数执行完两数相乘之后,mult2 中最后一条指令是 ret。
148 |
149 | ret 指令正好和 call 指令相反,它会做两个操作:
150 |
151 | 1. 将栈顶弹出的返回地址写入程序计数器(PC %rip),保证了下一条执行的指令是返回地址上的指令。
152 |
153 | 2. 从栈顶弹出返回地址。
154 |
155 | 在我们这个例子中:
156 |
157 | 1. 将栈顶弹出的返回地址 `0x555555555142` 写入程序计数器(PC %rip)中。这个地址也是返回到 multstore 函数中的位置,即 multstore 函数中 callq 指令下面一条指令 `movq %rax,(%rbx)` 的地址。
158 |
159 | 2. 从栈中弹出栈顶的返回地址 `0x555555555142`。
160 |
161 |
162 |
163 |
164 |
165 | ## 总结
166 |
167 | 函数是所有编程语言中重要的组成部分,因此在指令集中实现函数调用也极为重要。
168 |
169 | 这篇文章介绍的两个指令 call 和 ret 可以实现函数调用以及返回原函数。当然在函数调用中还有其他功能需要考虑,比如参数和返回值的传递。这些内容我们将在之后的笔记中详细介绍。
170 |
171 | 今天就到这里了,我们下一个笔记再见!
172 |
173 | ---
174 |
175 | 笔记列表:
176 | 1. [前言 - 学习笔记](./00前言.md)
177 | 2. [从程序的角度看,内存是什么?](./01内存.md)
178 | 3. [内存的布局](./02内存的布局.md)
179 | 4. [寄存器](./03寄存器.md)
180 | 5. [MOV 指令](./04指令1MOV.md)
181 | 6. [LEA 指令](./05指令2LEA.md)
182 | 7. [算术和逻辑指令](./06指令算术和逻辑.md)
183 | 8. [PUSH 和 POP 指令](./07指令push和pop.md)
184 |
185 | 如果你对这份笔记有兴趣,可以关注这个公众号“dingtingli-pub”,我会每周更新笔记。
186 |
187 |
188 |
189 |
--------------------------------------------------------------------------------
/mpweixin/13循环.md:
--------------------------------------------------------------------------------
1 | # 循环
2 |
3 | 这个系列是我学习《深入理解计算机系统》的笔记。
4 |
5 | 本篇文章是学习第三章的第十三篇笔记,对应书本 3.6.7 节的内容。
6 |
7 | [上一篇笔记](./12条件分支.md)中我们介绍了跳转指令,并且详细讲解了如何使用跳转指令实现编程语言中的 `if` 语句。
8 |
9 | 我们知道计算机之所以比人力计算厉害,有一个很重要的原因是它可以不知疲倦地一直计算,而让计算机在有限的指令上不停地执行的关键就是循环。
10 |
11 | 今天我们就来看看,跳转指令是如何实现循环语句的。
12 |
13 | 笔记分为 3 个部分:
14 |
15 | * `do…while` 语句
16 | * `while` 语句
17 | * `for` 语句
18 |
19 | ## 1. `do…while` 语句
20 |
21 | 我们使用书上的一个求解阶乘的示例,来说明循环的实现。
22 |
23 | 阶乘写作 n!,含义为 n!=1×2×3×...×(n-1)×n。
24 |
25 | 使用 do……while 语句来求解阶乘,可以用如下 c 语言代码:
26 |
27 | ```c
28 | long fact_do(long n)
29 | {
30 | long result = 1;
31 |
32 | do{
33 | result *= n;
34 | n = n - 1;
35 | }while(n > 1);
36 |
37 | return result;
38 | }
39 | ```
40 |
41 | 编译后生成的指令所使用的控制流,跟 c 语言的源代码有些不同。为了方便描述,我们用 c 语言来解释一下指令所使用的控制流。
42 |
43 | 左侧是源代码,右侧的代码跟指令使用的控制流一致。
44 |
45 |
46 |
47 |
48 |
49 | 最终的指令可以和右侧的代码一一对应。
50 |
51 |
52 |
53 |
54 |
55 |
56 | 可以看到循环和 `if` 条件分支在指令的表现形式上是差不多的,都是通过 `cmp` 和 `jump` 指令组合来实现。
57 |
58 | 但上面这段代码有一个问题,在阶乘的定义中 0!=1,而上面代码中 0!=0。
59 |
60 | ## 2. `while` 语句
61 |
62 | 我们使用 `while` 语句来修复一下上面阶乘的问题。
63 |
64 | ```c
65 | long fact_while(long n)
66 | {
67 | long result = 1;
68 |
69 | while(n > 1){
70 | result *=n;
71 | n = n - 1;
72 | }
73 |
74 | return result;
75 | }
76 | ```
77 |
78 | 这段代码很好地解决了 `0!` 的问题。我们来看看这段代码生成的指令是什么样子的。
79 |
80 | ### 2.1 第一种指令形式
81 |
82 | 编译器不同的优化方案,产生的指令也不同。 使用 GCC 编译器 的 `-Og` 优化选项进行编译,生成第一种指令的翻译形式,称之为 jump to middle。
83 |
84 | 这种形式将 `while` 的执行内容放到中间。执行顺序是:首先无条件跳转到结尾,然后在结尾处再进行条件判断,确认是否要跳转到中间。
85 |
86 | 具体的控制流可以用一段 c 语言表示:
87 |
88 |
89 |
90 |
91 |
92 | 同样,我们也可以观察一下对应的指令:
93 |
94 |
95 |
96 |
97 |
98 | 将这个 `while` 指令的形式与 `do…while` 进行对比,我们发现整体结构很类似,只是在开始是添加了一个无条件跳转,然后跳转处进行条件判断,并再次跳转到中间,这和它的名字 jump to middle 很契合。
99 |
100 |
101 |
102 |
103 |
104 | ### 2.2 第二种指令形式
105 |
106 | 使用 GCC 编译器的 `-O1` 优化选项进行编译时,生成了第二种指令翻译形式,称之为 guarded-do。
107 |
108 | 这种形式首先是进行条件分支判断,然后进行一段 `do…while` 循环。
109 |
110 |
111 |
112 |
113 |
114 | 有没有发现,这时候将源代码中 `while` 的判断进行了反转,从 `n>1` 变成了 `n<=1`,这样的变化我们在[上一篇笔记](./12条件控制.md) `if` 生成的指令中也曾经看到过。通常这会带来更简洁高效的指令。
115 |
116 | 另外我们发现最后在判断 `n>1` 时,指令使用了 `n!=1`,因为编辑器知道在做完 `n<=1`的判断后,只要保证 `n!=1` 就能满足 `n>1` 这个条件。因为 `n!=1` 执行效率更高。
117 |
118 | 生成的指令也同样可以和代码对应起来:
119 |
120 |
121 |
122 |
123 |
124 | 将这个 `while` 语句生成的指令与 `do…while` 进行对比,我们不难发现这次指令中完整地保留了 `do…while` 的指令,所以这种指令形式称为 guarded-do。
125 |
126 |
127 |
128 |
129 |
130 | ## 3. `for` 语句
131 |
132 | 我们再使用 `for` 语句实现一下阶乘的算法:
133 |
134 | ```c
135 | long fact_for(long n)
136 | {
137 | long result = 1;
138 |
139 | long i;
140 | for(i = 2; i<=n; i++)
141 | result *= i;
142 |
143 | return result;
144 | }
145 | ```
146 |
147 | 上面的代码完全可以使用 `while` 语句来替代 `for` 语句。
148 |
149 | ```c
150 | long fact_for_while(long n)
151 | {
152 | long result = 1;
153 |
154 | long i = 2; //replace 'for'
155 | while(i <= n){
156 | result *= i;
157 | i++;
158 | }
159 |
160 | return result;
161 | }
162 | ```
163 |
164 | 所以 `for` 语句最终的指令形式,就是其对应 `while` 语句的指令形式。
165 |
166 | 从这个角度来看,`for` 语句就是一个语法糖,是为了让编程更方便而产生的。
167 |
168 | ## 总结
169 |
170 | 这篇笔记我们学习了常用的循环语句 `do…while`,`while` 和 `for` 的指令形式。
171 |
172 | 我们可以看到 `cmp` 和 `jump` 的指令组合,可以实现编程语言中所有跟条件判断和循环相关的语句。
173 |
174 | 下一篇文章中我们将介绍编程语言中另外一种循环,函数的自我循环——递归。
175 |
176 | 今天就到这里了,我们下一个笔记再见!
177 |
178 | ---
179 |
180 | 笔记列表:
181 | 1. [前言 - 学习笔记](./00前言.md)
182 | 2. [从程序的角度看,内存是什么?](./01内存.md)
183 | 3. [内存的布局](./02内存的布局.md)
184 | 4. [寄存器](./03寄存器.md)
185 | 5. [MOV 指令](./04指令1MOV.md)
186 | 6. [LEA 指令](./05指令2LEA.md)
187 | 7. [算术和逻辑指令](./06指令算术和逻辑.md)
188 | 8. [PUSH 和 POP 指令](./07指令push和pop.md)
189 | 9. [CALL 和 RET 指令](./08指令call和ret.md)
190 | 10. [程序运行时的栈](./09运行时栈.md)
191 | 11. [栈帧的布局](./10栈帧的布局.md)
192 | 12. [条件码寄存器](./11条件码寄存器.md)
193 | 13. [条件控制](./12条件控制.md)
194 |
195 | 如果你对这份笔记有兴趣,可以关注这个公众号“dingtingli-pub”,我会每周更新笔记。
196 |
197 |
198 |
199 |
--------------------------------------------------------------------------------
/mpweixin/15gcc.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mpweixin/16gdb.md:
--------------------------------------------------------------------------------
1 | https://zhuanlan.zhihu.com/p/483372519
2 |
3 | https://ftp.gnu.org/old-gnu/Manuals/gdb/html_chapter/gdb_5.html
4 |
--------------------------------------------------------------------------------
/mpweixin/17 02.md:
--------------------------------------------------------------------------------
1 |
2 | # 为什么要了解计算机的底层原理?
3 |
4 | 
5 |
6 | 终于完成了《深入理解计算机系统》第三章的笔记整理,这个过程耗费了我将近半年的时间。
7 |
8 | 在这个系列笔记完成之际,我回想起了一位网友提出的问题:“现在学习 CSAPP 对我的工作有帮助吗?”
9 |
10 | 我也曾困惑于此。经过深入阅读和笔记整理,我对这个问题有了更深的见解。
11 |
12 | ## 1 理解抽象泄漏
13 |
14 | 以第三章的标题“Machine-Level Representation of Programs”为例,翻译过来就是“程序的机器级别表示”。
15 |
16 | 我们通常在工作中使用如 Java、C#、Python、JavaScript 这样的高级编程语言。
17 |
18 | 看似,这些高级语言已经足够远离底层的汇编语言。那么,我们为什么还需要了解“程序的机器级别表示”呢?
19 |
20 | 我在阅读 Stack Overflow 创始人 Joel Spolsky 的一篇文章后,对此豁然开朗。
21 |
22 | 他在文章中提出了“抽象泄漏法则”,深刻指出:所有非琐碎的抽象,在某种程度上,都无法完全封装底层的复杂性。
23 |
24 | 编程语言的演进过程中,从机器语言到汇编,再到如 Java 和 Python 的高级语言,每一步抽象都旨在简化开发者的工作。尽管如此,这些抽象层并不总是完美无瑕。
25 |
26 | 
27 |
28 | 例如,当我们在高级语言中使用加号(`+`)连接字符串,如 `"foo" + "bar"` 时,其背后的实现复杂度和性能开销却常常被隐藏。
29 |
30 | 资深程序员可能会建议使用 `StringBuilder` 类来优化此类操作。这些建议的背后正反映了抽象泄漏的现象。
31 |
32 | 在低级别语言中,并没有字符串这一类型,只有 `char *`,即字符数组。当我们了解到 `StringBuilder` 类的底层原理实际上是操作字符数组时,就能更全面地理解其优势。
33 |
34 | 
35 |
36 | 深入理解这些抽象背后的机制不仅能提高我们解决问题的效率,还能拓宽我们的技术视野。
37 |
38 | 正如 Joel Spolsky 所强调的:“抽象可以节省我们的工作时间,但不能节省我们的学习时间。”
39 |
40 | 因此,学习底层原理,尤其是那些我们日常看似不必深入了解的部分,实际上是提升我们编程技能的关键。
41 |
42 | ## 2 栈帧和闭包
43 |
44 | 从底层开始学习,我们不仅能够更好地把握编程的基础知识,还可以深入理解一些看似晦涩的概念,例如闭包和递归。
45 |
46 | 让我们从一个常见的前端编程挑战开始探索:闭包。
47 |
48 | 想象一下,你在使用 JavaScript 写一个循环,代码如下:
49 |
50 | ```javascript
51 | for (var i = 0; i < greetings.length; i++) {
52 | ...
53 | }
54 | ```
55 |
56 | 运行这段代码,你可能会遇到一些问题,比如循环内部的变量 `i` 不按预期工作。这时候,如果你将 `var` 替换为 `let`,问题似乎就解决了。这背后的原因是什么呢?
57 |
58 | 这个现象揭示了闭包的实际应用。
59 |
60 | 在 JavaScript 中,使用 `var` 声明变量会导致变量提升,这意味着变量在整个函数中都是可见的,即使它是在循环内部声明的。
61 |
62 | 而 `let` 提供了块级作用域,每次迭代都会创建一个新的变量实例,这解决了由于变量共享引起的问题。
63 |
64 | 通过理解 JavaScript 的函数栈帧和堆内存管理,你就能从根本上理解闭包的运作机制。
65 |
66 | 
67 |
68 | 参考:[JavaScript 闭包在 Heap 中的表示](https://zhuanlan.zhihu.com/p/468527405)
69 |
70 | ## 3 递归和迭代
71 |
72 | 现在,让我们来谈谈递归。我记得第一次尝试通过递归来解决汉诺塔问题时,整个过程让我困惑不已。
73 |
74 | 递归的复杂性主要来源于它的自引用性质,每个函数调用都在等待它自己的一个更小版本完成。
75 |
76 | 但当我们理解了函数栈帧的工作机制,递归的原理就变得清晰多了:每次函数调用都会创建一个新的栈帧,其中保存着函数的局部变量和返回地址。
77 |
78 | 计算机使用栈帧来追踪每一层递归调用的过程,形成了一个层次分明的推导过程。
79 |
80 | 
81 |
82 | 递归是计算机处理问题的独特方式,这种方式有别于人类的正常思维。作为程序员,我们需要理解并按照这种方式编写自己的代码。
83 |
84 | 理解递归,意味着你能够更深入地理解计算机如何使用其本身的运算特性来优雅地解决问题。
85 |
86 | ## 4 如何从底层开始学习
87 |
88 | 如何从底层开始学习计算机系统?首先,我们需要了解“程序的机器级别表示”,这通常意味着学习汇编语言。
89 |
90 | 在了解汇编之前,我们首先应从程序的视角理解一些核心硬件概念:内存、寄存器和程序计数器是如何工作的,以及它们在编程中的角色。
91 |
92 | 
93 |
94 | 我们并不需要深入到编写复杂的汇编代码,但至少应该理解其基本结构和指令。
95 |
96 | 这种理解有助于任何程序员更好地掌握计算机的工作原理。以下内容将帮助你快速掌握这些基础概念:
97 |
98 | [从内存的视角出发:什么是内存?](./01内存.md) — 探索内存的基本作用。
99 |
100 | [深入内存布局](./02内存的布局.md) — 了解程序运行时内存时如何布局的。
101 |
102 | [寄存器的重要性](./03寄存器.md) — 理解寄存器在执行程序时的功能。
103 |
104 | 
105 |
106 | 接下来,我们会详细探讨汇编语言的基本组成部分。这一过程类似于学习任何新语言的基本语法:
107 |
108 | [基础指令学习:了解MOV指令](./mpweixin/04指令1MOV.md) — 介绍MOV指令如何在程序中转移数据。
109 |
110 | [内存访问与LEA指令详解](./mpweixin/05指令2LEA.md) — 解释LEA指令如何有效地处理地址计算。
111 |
112 | [算术与逻辑操作简介](./mpweixin/06指令算术和逻辑.md) — 看看如何执行基本的计算和逻辑判断。
113 |
114 | [栈操作入门:PUSH 和 POP](./mpweixin/07指令push和pop.md) — 学习如何使用栈来保存和恢复数据。
115 |
116 | [函数调用的核心:CALL 和 RET](./mpweixin/08指令call和ret.md) — 理解函数如何被调用和返回。
117 |
118 | 
119 |
120 | 在理解了这些基本指令之后,我们将深入学习函数的实现细节,特别是栈和栈帧的概念:
121 |
122 | [掌握程序运行时栈的管理](./mpweixin/09运行时栈.md) — 揭示运行时栈如何支持程序执行。
123 |
124 | [详解栈帧布局](./mpweixin/10栈帧的布局.md) — 透视函数调用中栈帧的具体结构。
125 |
126 | 
127 |
128 | 最后,我们会学习如何通过汇编实现条件分支,这对理解编程语言中的 `if` 语句和循环控制极为重要:
129 |
130 | [条件码寄存器的作用和重要性](./mpweixin/11条件码寄存器.md) — 探索条件码寄存器如何影响程序流。
131 |
132 | [实现条件分支:if语句的底层逻辑](./mpweixin/12条件控制.md) — 理解如何在汇编中处理条件判断。
133 |
134 | [深入循环的底层逻辑](./mpweixin/13循环.md) — 学习循环控制在汇编中的实现方式。
135 |
136 | [递归的底层原理](./mpweixin/14递归.md) — 揭示递归在底层的具体执行过程。
137 |
138 | 
139 |
140 | 通过这些学习,你不仅能够读懂汇编代码,还能深刻理解那些通常由高级编程语言自动处理的底层细节,从而让你在技术上看得更远、走得更稳。
141 |
142 | ## 5 结语
143 |
144 | 最后说一件最近工作中遇到的问题。在前端开发中,我使用了 ajax 来请求数据,接下来的操作必须等待这些数据被成功加载。
145 |
146 | 这引发了我对一些问题的思考:既然 JavaScript 是单线程的,那么它又是如何处理像 ajax 这样的异步调用的呢?这些操作是否与多线程有关?又如何确保这些异步调用的执行顺序呢?
147 |
148 | 回过头来仔细思考,我发现这些问题的出现其实是因为我曾经学习过操作系统是如何处理并发以及线程的知识。这些问题自然而然地浮现在我的脑海中。
149 |
150 | 顺着这个思路,让我能够链接到 JavaScript 中的异步编程技术,比如 promises 和 async/await。
151 |
152 | 
153 |
154 | 参考:[可视化的 JavaScript Promises & Async/Await](https://zhuanlan.zhihu.com/p/467601693)
155 |
156 | 值得一提的是,异步编程并不仅限于 JavaScript。其他高级编程语言,比如 C# 也提供了类似的异步编程工具,比如 async、await 和 Task。
157 |
158 | 表面上看,它们功能相似,但实际上 JavaScript 使用的是Event Loop,而 C# 则使用多线程。
159 |
160 | 通过了解底层原理,我们不仅可以更好地理解和应用这些高级特性,还能通过底层的视角看待问题,从而找到更有效的解决方案。
161 |
162 | 因此,深入学习计算机系统的底层知识不仅仅是满足我们对知识的好奇,更是为了在实际编程中能够运用这些知识解决问题。
163 |
164 | 理解了底层,我们才能真正精通编程,不仅是在使用高级语言时,更是在面对各种技术挑战时能够迎刃而解。
165 |
166 | 让我们在这条道路上一起努力吧,Happy Coding!😊
--------------------------------------------------------------------------------
/pdf/Computer_Systems_A_Programmers_Perspective(3rd).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dingtingli/csapp-learning/HEAD/pdf/Computer_Systems_A_Programmers_Perspective(3rd).pdf
--------------------------------------------------------------------------------
/使用Ubuntu01.md:
--------------------------------------------------------------------------------
1 | # WSL 02 -- Ubuntu 中安装 GUI 应用
2 |
3 | 在[前面一篇文章](/准备Linux环境.md)中,我们已经介绍了如何通过 WSL 安装 Ubuntu。
4 |
5 | 接下来我们就来探讨如和使用这个系统。
6 |
7 | ## 测试命令
8 |
9 | 安装完成之后,会出现一个命令行。
10 |
11 | 
12 |
13 | 这就是 Ubuntu 的使用界面,这里可以输入任何有效的 Linux 命令。
14 |
15 | 比如,我们输入以下命令,用来查看当前所在的目录。
16 |
17 | ```cmd
18 | pwd
19 | ```
20 |
21 | 
22 |
23 | 可以看到 `/home/terry`,说明是在 home 下面叫 terry 的文件夹下。
24 |
25 | ## 打开 Ubuntu
26 |
27 | 当前所在的这个窗口就是 Ubuntu 系统的入口。**我们在 Windows 中如何打开这个窗口呢?**
28 |
29 | 在 Windows 中,把安装后的 WSL 子系统当作一个应用程序来看待,因此我们可以在开始菜单中找到它。
30 |
31 | 
32 |
33 | 点击该应用图标就可以打开命令行窗口。
34 |
35 | *注意:使用 windows 终端也可以打开该系统的命令行。
36 |
37 | ## 测试 GUI
38 |
39 | 这样的使用体验和在虚拟机中直接安装一个 Ubuntu 还是很不一样的。
40 |
41 | 1. 首先,我们只能看到 Ubuntu 的命令行入口,这个系统内部的图像界面应用如何安装和使用?
42 |
43 | 2. 其次,这个系统很像是 Windows 中的一个应用,上面看到的文件目录 `/home/terry` 在哪?它跟 Windows 系统中的文件夹有什么关系?
44 |
45 | 我们先来看第一个问题,关于第二个问题,[下一篇文章](/使用Ubuntu02.md)再回答。
46 |
47 | ### 1. Ubuntu 中如何安装 GUI 应用
48 |
49 | 在 Ubuntu 中,使用命令 `apt` 来管理前端软件包(Advanced Packaging Tool)
50 |
51 | 该命令需要以系统管理员的身份运行,而命令 `sudo` (Super User do) 允许以系统管理员的身份运行命令。
52 |
53 | 所以我们可以组合这两个命令 `sudo apt`——以系统管理员的身份运行 `apt`命令。
54 |
55 | 为了测试 GUI,我们选择了 gedit 这个应用,该应用类似于 windows 中的系统应用 notepad (记事本)。
56 |
57 | 通过下面命令来安装 gedit 应用
58 |
59 | ```cmd
60 | sudo apt install gedit -y
61 | ```
62 |
63 | 其中 `-y` 的意思是,安装过程中的提示全部选择“yes”。
64 |
65 | 
66 |
67 | 图中该命令上面的显示,是命令 `sudo apt update` 的结果(列出所有可更新的软件清单)。
68 |
69 | 开始安装 gedit,命令行中先是显示一堆 Get 信息
70 |
71 | 
72 |
73 | 然后显示进度条
74 |
75 | 
76 |
77 | 安装完成后,回到命令行
78 |
79 | 
80 |
81 | gedit 应用就安装完成了。
82 |
83 | ### 2. Ubuntu 中如何打开 GUI 应用
84 |
85 | 通过上面的步骤,我们在 Ubuntu 中安装了一个图形界面应用 gedit。
86 |
87 | **如何打开这个应用?**
88 |
89 | 在命令行中输入
90 |
91 | ```cmd
92 | gedit
93 | ```
94 |
95 | *如果觉得之前的命令使得命令行显示的信息太多,可以使用 `clear` 命令来清空所有信息。下面的截图,在输入 gedit 之前,就使用 clear 清空过。
96 |
97 | 
98 |
99 | 神奇的事情发生了,在 Windows 系统中弹出了 gedit 的图形界面。
100 |
101 | 注意是在 Windows 系统中,这就跟你在 windows 中打开记事本的感觉是一样的。
102 |
103 | 
104 |
105 | 除了通过命令行来打开 gedit 之外,我们甚至可以在开始菜单中找到打开该应用的入口。
106 |
107 | 
108 |
109 | 可以发现 WSL 的设计者,不仅仅希望子系统 Ubuntu 看起来像是一个 windows 应用,还希望该系统下的应用看起来也像一个 windwos 应用。太魔性了!
110 |
111 | 这让我对之前的第二个问题更感兴趣了——**两个系统的文件目录是如何在一起工作的?**
112 |
113 | ## 本文中使用的命令
114 |
115 | 1. pwd
116 |
117 | 英文全称:Print Work Directory
118 |
119 | 作用:显示工作目录。
120 |
121 | 2. clear
122 |
123 | 作用:清除屏幕。
124 |
125 | 3. sudo
126 |
127 | 英文全称:Super User do
128 |
129 | 作用:以系统管理者的身份执行指令
130 |
131 | 4. apt
132 |
133 | 英文全称:Advanced Packaging Tool
134 |
135 | 作用:前端软件包管理工具( Debian / Ubuntu 中使用)
136 |
137 | 在 RedHat / Fedora 中,使用 yum(Yellow dog Update, Modified)来代替 apt。
138 |
139 |
--------------------------------------------------------------------------------
/使用Ubuntu02.md:
--------------------------------------------------------------------------------
1 | # WSL 03 -- 访问文件目录
2 |
3 | 在[上一篇文章](/使用Ubuntu01.md)中我们安装了 gedit 应用。通过该应用,可以快速地浏览 Ubuntu 系统中的目录结构。
4 |
5 | 点击左上角的 Open
6 |
7 | 
8 |
9 |
10 | 快速查看文件目录结构
11 |
12 | 
13 |
14 | 可以看到这就是 Linux 系统的标准目录结构,跟当前 Windows 系统中的文件夹没有什么关系。
15 |
16 | ## 在 Windows 中如何访问 Ubuntu 中的目录结构
17 |
18 | 虽然 Ubuntu 是安装在 Windows 中的子系统,看上去也像是 Windows 中的一个应用。但 Ubuntu 和这个 Windows 的关系,仍然是两个不同系统之间的关系,这种关系跟在 Windows 中通过 VMWare 安装一个 Ubuntu 系统是类似的。
19 |
20 | 所以想通过 Windows 访问 Ubuntu 中的目录结构,可以通过共享文件夹的方式来进行。
21 |
22 | WSL 为这种访问方式提供了两种便利的入口。
23 |
24 | 1. 通过命令行
25 |
26 | ```cmd
27 | explorer.exe .
28 | ```
29 |
30 | 在命令行中输入 `explorer.exe .` (注意最后面的小点),就会在Windows 中弹出文件资源管理器,访问 Ubuntu 中的目录。
31 |
32 | 
33 |
34 | 2. 文件资源管理器中直接打开
35 |
36 | 通过 WSL 安装好 Ubuntu 系统之后,在 Windows 的文件资源管理器中可以看到,左侧导航的最下方有一个 Linux 图标。点击后也可以访问 Ubuntu 中的目录。
37 |
38 | 
39 |
40 |
41 | ## 测试:在 Windows 和 Ubuntu 中修改同一份文件
42 |
43 | 1. Windows 中创建文件
44 |
45 | 既然可以在 Window 的文件资源管理器中打开 Ubuntu 的目录,我们就测试一下在 Windows 和 Ubuntu 中同时修改一份文件。
46 |
47 | 首先,通过 Windows 系统在 '/home/terry' 目录下创建一个文件 'test.txt'。
48 |
49 | 
50 |
51 | 2. Ubuntu 中修改文件
52 |
53 | 然后在 Ubuntu 的命令行中确认该文件是否存在。
54 |
55 | ```cmd
56 | ls
57 | ```
58 |
59 | 
60 |
61 | `ls` 命令将显示指定工作目录下之内容,可以看到只有一个文件'test.txt',其他以 `.` 开头的文件或者文件夹都不显示。
62 |
63 | 输入以下命令,通过 gedit 打开 'test.txt' 文件。
64 |
65 | ```cmd
66 | sudo gedit text.txt
67 | ```
68 |
69 | 直接使用 `gedit text.txt` 命令,会显示没有权限保存,所以前面加上 `sudo` ,表示使用管理员权限打开。
70 |
71 | 在文件中输入 “from ubuntu.” 后保存。
72 |
73 | 
74 |
75 | 3. Windows 中修改同一份文件
76 |
77 | 在 Windows 中用笔记本打开 'test.txt' 文件,可以看到上一步输入的 “from ubuntu.”。
78 |
79 | 在文件中输入 “from windows.” 后保存。
80 |
81 | 
82 |
83 | 4. Ubuntu 中确认
84 |
85 | 通过 gedit 打开文件,确认结果。
86 |
87 | 
88 |
89 | **我们可以通过 Windows 来方便地创建文件,然后使用 Ubuntu 中的命令来编译或者运行该文件,这样就可以同时兼顾二者的优势。**
90 |
91 | ## 在 Ubuntu 中如何访问 Windows 中的目录结构
92 |
93 | 上面介绍了如何在 Windows 中访问 Ubuntu 的目录结构,那么反过来,如何在 Ubuntu 中访问 Windows 中的文件夹呢?
94 |
95 | 之前看过 Linux 系统根目录下面的文件夹。
96 |
97 | 
98 |
99 | 其中有一个文件夹叫做 `mnt`,点开后就可以看到如下目录结构:
100 |
101 | 
102 |
103 | 这里的 `c` 就是指 Windows 系统中的 C 盘,如果机器中有其他盘符,这里就会看到对应的 `d`,`e`等等。
104 |
105 | 
106 |
107 | 这种访问方式太神奇,可以直接通过 Linux 命令管理 windows 文件系统。
108 |
109 | *猜测:通过 WSL 安装的 Ubuntu 发行版是微软修改过后的版本。
110 |
111 | ## 本文中使用的命令
112 |
113 | 1. ls
114 |
115 | 英文全称:List Files
116 |
117 | 作用:显示指定工作目录下之内容。
--------------------------------------------------------------------------------
/使用Ubuntu03.md:
--------------------------------------------------------------------------------
1 | # WSL 04 -- gcc
2 |
3 | [之前的文章中](/使用Ubuntu01.md)我们介绍了在 Ubuntu 中如何安装图形应用 gedit,以及 [Windows 和 Ubuntu 两个系统之间如何访问各自的文件目录](/使用Ubuntu02.md)。
4 |
5 | 这次我们来尝试一个实用功能,在 Ubuntu 中安装并其使用 C 语言编译器 gcc。
6 |
7 | ## 安装 gcc
8 |
9 | 首先我们先尝试一下,系统中是否已经安装了 gcc
10 |
11 | ```cmd
12 | gcc --version
13 | ```
14 |
15 | 
16 |
17 | 可以看到并没有安装,而且给出了安装命令 `sudo apt install gcc`。
18 |
19 | 接下来我们并没有直接使用提示给出的命令进行安装,而是按照下面链接给出的步骤,一次性安装 gcc 相关的所有内容。
20 |
21 | https://linuxize.com/post/how-to-install-gcc-on-ubuntu-20-04/
22 |
23 | 先来检查一下当前 Ubuntu 的版本
24 |
25 | ```cmd
26 | lsb_release -a
27 | ```
28 |
29 | 
30 |
31 | `lsb_release`(Linux Standard Base)命令用来查看 Linux 内核的版本信息。
32 |
33 | Linux 版本确认后,通过下面的命令来安装开发包。
34 |
35 | ```cmd
36 | sudo apt install build-essential
37 | ```
38 |
39 | 
40 |
41 | 安装完成后再次检查 gcc 版本信息,一切正常。
42 |
43 | 
44 |
45 | ## 创建 c 语言代码文件
46 |
47 | 目标:在当前目录 `/home/terry` 下创建一个新的目录 `clang` ,然后在该目录中创建一个 c 语言文件 `printtest.c`。
48 |
49 | 我们尝试使用命令行来完成上述目标。
50 |
51 | 1. 创建新的目录
52 |
53 | ```cmd
54 | mkdir clang
55 | ```
56 |
57 | `mkdir` (Make Directory),用于创建目录。
58 |
59 | 
60 |
61 | Windows 文件管理器中可以查看到对应文件夹。
62 |
63 | 
64 |
65 | 2. 创建文件
66 |
67 | ```cmd
68 | touch printtest.c
69 | ```
70 | `touch` 用于修改文件或者目录的时间属性,如果文件不存在,那么将创建一个新的空白文件。
71 |
72 | 
73 |
74 | 通过 `ls` 命令发现我们把 printtest.c 这个文件的位置搞错了,需要将这个文件移到 clang 目录下面。
75 |
76 | ```cmd
77 | mv printtest.c clang
78 | ```
79 |
80 | `mv`(move file) 用来将文件或者目录改名,或者移入其他位置。
81 | 上述命令,将 printtest.c 移入 clang 目录。
82 |
83 | ```cmd
84 | cd clang
85 | ```
86 | 同时通过 `cd`(change directory)进入该目录。
87 |
88 | 
89 |
90 | 
91 |
92 | ## 使用 Vim 编辑 c 语言文件
93 |
94 | 为了体验 Unix 文件编辑功能,我们将使用 vim 编辑器来编辑 c 语言文件。
95 |
96 | Vim 的具体使用方法,可以参考下面这个链接:
97 | https://www.runoob.com/linux/linux-vim.html
98 |
99 | ```cmd
100 | vi printtest.c
101 | ```
102 | 通过上述命令进入 vim。进入后按一下字母 `i` 切换到输入模式。
103 |
104 | 
105 |
106 | 注意,此时左下方显示 `--INSERT--`,表示现在是输入模式。
107 |
108 | 输入 c 语言代码
109 |
110 | ```c
111 | #include
112 |
113 | int main()
114 | {
115 | long i = 1;
116 | printf("i = %ld", i);
117 | return 0;
118 | }
119 | ```
120 |
121 | 
122 |
123 | 注意:编辑器对代码进行了高亮显示。
124 |
125 | 按 `ESC` 退出输入模式,然后输入 `:wq` 保存文件并退出。
126 |
127 | 
128 |
129 | ## 使用 gcc 编译 c 语言文件
130 |
131 | 使用 gcc 命令编译该文件:
132 |
133 | ```cmd
134 | gcc printtest.c -o printtest
135 | ```
136 |
137 | 
138 |
139 | 最终在同一个目录下,会得到一个二进制文件 printtest。
140 |
141 | 
142 |
143 | 最后通过下面的命令来执行这个文件
144 |
145 | ```cmd
146 | ./printtest
147 | ```
148 |
149 | 
150 |
151 | 可以看到,命令行中输出了c 语言文件运行的结果 `i = 1`。
152 |
153 | ## 本文中使用的命令
154 |
155 | 1. lsb_release
156 |
157 | 英文全称:Linux Standard Base
158 |
159 | 作用:查看 Linux 内核的版本信息。
160 |
161 | 2. mkdir
162 |
163 | 英文全称:Make Directory
164 |
165 | 作用:创建目录。
166 |
167 | 3. touch
168 |
169 | 作用:用于修改文件或者目录的时间属性,如果文件不存在,那么将创建一个新的空白文件。
170 |
171 | 4. mv
172 |
173 | 英文全称:Move file
174 |
175 | 作用:将文件或者目录改名,或者移入其他位置。
176 |
177 | 5. cd
178 |
179 | 英文全称:Change Directory
180 |
181 | 作用:进入所选目录。
182 |
183 | ## 本文中使用的 vi 命令
184 |
185 | 1. vi filename
186 |
187 | 作用:进入 vi 编辑环境,对选定文件进行编辑。
188 |
189 | 2. i
190 |
191 | 作用:进入 vi 编辑环境的输入模式。
192 |
193 | 3. ESC
194 |
195 | 作用:退出 vi 编辑环境的输入模式。
196 |
197 | 4. :wq
198 |
199 | 作用:保存文件并退出 vi。
200 |
201 | ## 本文中使用的 gcc 命令
202 |
203 | 1. gcc --version
204 |
205 | 作用:检查 gcc 的版本
206 |
207 | 2. gcc printtest.c -o printtest
208 |
209 | 作用:编译 c 语言文件,并输出可执行的二进制文件
--------------------------------------------------------------------------------
/使用Ubuntu04.md:
--------------------------------------------------------------------------------
1 | # WSL 05 -- VS Code
2 |
3 | [上一篇文章](/使用Ubuntu03.md)中我们介绍了 gcc 编译器,并且尝试了在 Ubuntu 中使用 Vim 编辑器创建 c 语言文件。
4 |
5 | 命令行形式的编辑器毕竟太古老了。这次我们来介绍如何配合 Ubuntu 系统来使用 VS Code 编辑器。
6 |
7 | ## 安装 VS Code
8 |
9 | 首先,在 Windows 环境中安装 VS Code。
10 |
11 | 从官网下载最新版本,直接安装。具体步骤就不赘述了。
12 |
13 | 官网地址:https://code.visualstudio.com/
14 |
15 | 注意这是在 Windows 上安装的应用,现在看来跟我们在 WSL 中的 Ubuntu 系统毫无关系。
16 |
17 | ## Remote WSL
18 |
19 | 打开 VS Code,注意左下角是不是又绿色的 '><' 图标。
20 |
21 | 
22 |
23 | 如果没有,打开左侧导航中的 'Extensions',搜索 'remote-wsl'。安装该插件后,就会出现上图中的界面。
24 |
25 | 
26 |
27 | 点击该绿色图标,就可以 Remote 之前安装的 WSL 系统了。
28 |
29 | 注:或者 'F1' 之后,搜索 'Remote-WSL'。
30 |
31 | 
32 |
33 | 图中有好几个选项。
34 |
35 | Remote-WSL: New Window 是在新的 VS Code 窗口中 Remote WSL。
36 |
37 | Remote-WSL: New Window using Distro 如果我们安装了多个 WSL 系统,这里可以选择。
38 |
39 | 我们这次选择 'Open Folder in WSL...',弹出文件夹选择对话框。就像[之前介绍文件目录中](/使用Ubuntu03.md)说的那样,这里直接指向了 Ubuntu 所对应的目录。
40 |
41 | 
42 |
43 | 选择上一篇文章创建的 'clang' 目录然后确定。
44 |
45 | 
46 |
47 | 回到 VS Code 我们先着重注意一下左下角绿色的图标,已经变成了 '>< WSL:Ubuntu',表示我们已经 Remote 到了 Ubuntu 中。
48 |
49 | 随意修改一个该目录中的文件,然后选择另存为 'Save As ...'。
50 |
51 | 
52 |
53 | 可以看到文件的保持路径是 Ubuntu 系统的文件目录。
54 |
55 | ## VS Code 中直接打开 Ubuntu 终端
56 |
57 | 在终端菜单 Terminal 中选择 'New Terminal',或者使用快捷键 'Ctrl+Shift+`'。
58 |
59 | 
60 |
61 | 我们打开了一个新的 Ubuntu 命令行,这跟之前在 [Linux 准备](/使用Ubuntu01.md)一文中所使用的终端是一样的。
62 |
63 | 
64 |
65 | ## Ubuntu 终端打开 VS Code
66 |
67 | 可以在 Ubuntu 终端使用下面的命令,直接打开 VS Code
68 |
69 | ```cmd
70 | code .
71 | ```
72 |
73 | 
74 |
75 | 打开的 VS Code 就已经 Remote 到这个 WSL 中了。
76 |
77 | ## c 语言文件的代码格式化
78 |
79 | VS Code 是一个更现代的代码编辑器,我们来试试其中一个功能——代码格式化。
80 |
81 | 打开一个 c 语言文件时,VS Code 会提示安装一个插件 'C/C++'。如果没有安装,可以在 'Extensions' 中搜索。
82 |
83 | 
84 |
85 | 注意插件名称下方的一行小字 'Extension is enabled on WSL:Ubuntu',说明这是 Linux 版本的插件,从安装过程中的输出也可以看出来。
86 |
87 | 安装完插件后,使用快捷键 **'Shift+Alt+F' (或者 Ctrl+K+F)** 就可对输入的 c 语言进行格式化。
88 |
89 | 既然已经使用了先进的编辑器,那么我们接下来就试试如何在 vs code 中进行 debug 吧。
90 |
91 | ## 参考资料
92 |
93 | [1] https://code.visualstudio.com/docs/remote/wsl#_getting-started
94 |
95 | [2] https://code.visualstudio.com/docs/remote/wsl-tutorial
--------------------------------------------------------------------------------
/使用Ubuntu05.md:
--------------------------------------------------------------------------------
1 | # WSL 06 -- gdb
2 |
3 | [上一篇文章](/使用Ubuntu04.md)中介绍了如何通过 VS Code Remote 到 WSL 的 Ubuntu 系统中,通过这种形式我们就在 Windows 系统中配置了一个 Linux 开发环境。
4 |
5 | 这篇文章,我们接着来看看如何在 VS Code 中调用安装在Ubuntu中 c 语言的调试工具 gdb,从而实现在 VS Code 中实现调试功能。
6 |
7 | ## 安装 gdb
8 |
9 | 我们先用下面的命令来检查一下 Ubuntu 中是否已经安装有 gdb。
10 |
11 | ```cmd
12 | gdb --version
13 | ```
14 |
15 | 
16 |
17 | 命令结果显示并没有安装,因此通过下面的命令来安装 gdb。
18 |
19 | ```cmd
20 | sudo apt install gdb
21 | ```
22 |
23 | 注意:有些文章中会用 `sudo apt-get install gdb` 命令来安装,`apt` 命令是 `apt-get` 命令的新版本,具体二者有什么不同,可以参考文章:https://zhuanlan.zhihu.com/p/350690109
24 |
25 | 安装完成后,可以使用 `gdb --version` 检查一下。
26 |
27 | 
28 |
29 | ## 测试 gdb 功能
30 |
31 | 在介绍 [gcc 的文章](/使用Ubuntu03.md)中,我们创建了一个 c 语言文件 printtest.c
32 |
33 | ```c
34 | #include
35 |
36 | int main()
37 | {
38 | long i = 1;
39 | printf("i = %ld \n", i);
40 | return 0;
41 | }
42 | ```
43 | 并且使用 gcc 命令,生成了一个二进制文件 printtest
44 |
45 | ```cmd
46 | gcc printtest.c -o printtest
47 | ```
48 |
49 | 这次我们就用这个二进制 printtest 文件来测试一下 gdb 的反编译功能。
50 |
51 | 进入到文件所在目录后,使用如下命令。
52 |
53 | ```cmd
54 | gdb printtest
55 | ```
56 |
57 | 
58 |
59 | 然后在 (gdb) 中输入
60 |
61 | ```cmd
62 | disassemble main
63 | ```
64 |
65 | 
66 |
67 | main 函数的汇编代码就直接打印在屏幕上。
68 |
69 | 如果需要退出,可以在 (gdb) 后面输入 `quit`,直接退回到命令行。
70 |
71 | ## VS code 中使用 gdb
72 |
73 | 从上面的测试中我们可以看到 gdb 是一个命令行模式的调试工具,使用起来比较麻烦。但是它功能很强大,如果可以结合 VS Code 窗口功能,将会非常方便。
74 |
75 | 通过[上一篇介绍 VS Code 的文章](/使用Ubuntu04.md)所讲的方法,在 VS Code 中 打开 clang 目录,然后创建一个新的 c 语言文件 msstore.c 并保存。
76 |
77 | ```c
78 | #include
79 |
80 | long mult2(long a, long b)
81 | {
82 | long s = a * b;
83 | return s;
84 | }
85 |
86 | void multstore(long x, long y, long *dest)
87 | {
88 | long t = mult2(x, y);
89 | *dest = t;
90 | }
91 |
92 | int main()
93 | {
94 | long d;
95 | multstore(2, 3, &d);
96 | //printf("2 * 3 --> %ld\n", d);
97 | return 0;
98 | }
99 | ```
100 |
101 | 在语句 `multstore(2, 3, &d);` 前设置断点(点击语句左侧的行标)。
102 |
103 | 
104 |
105 | 然后选择菜单 'Run' -> 'Start Debuging' (或者按快捷键 F5)。
106 |
107 | 
108 |
109 | 因为已经安装了 'c/c++'插件,此时 VS Code 会自动生成一个 .vscode 的目录,目录下有两个配置文件 launch.json 和 task.json。
110 |
111 | 其中 launch.json 就是 debug 在 VS Code 中的配置文件。
112 |
113 | 
114 |
115 | 从中可以看到 gdb 的安装路径 '/usr/bin/gdb',这也是为什么需要先安装 gdb 的原因,否则会因为在相应路径下将找不到 gdb 而报错。
116 |
117 | 因为我们已经准备就绪,所以此刻就直接进入 debug 模式
118 |
119 | 
120 |
121 | 跟大多数编译器一样,此时使用 'F11' 可以跳入相应函数,'F10' 可以一步一步地跟踪代码的执行。
122 |
123 | 同时,VS Code 的左侧还有程序运行时的各种状态。
124 |
125 | 
126 |
127 | 比如我们可以看到函数中各个变量的值,以及CPU 寄存器中状态等等。
128 |
129 | 这样,我们就在 Windows 系统中配置了一个 Linux 开发环境,无缝地使用 Linux 带来的开发工具。
130 |
131 | ## 参考资料
132 |
133 | [1] https://code.visualstudio.com/docs/cpp/config-wsl
134 |
135 | [2] https://code.visualstudio.com/docs/languages/cpp
--------------------------------------------------------------------------------
/使用gdb.md:
--------------------------------------------------------------------------------
1 | # 如何使用 gdb 进行调试
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/准备Linux环境.md:
--------------------------------------------------------------------------------
1 | # WSL 01 -- 安装 Ubuntu
2 |
3 | 我们可以在物理机上直接安装 Linux 发行版,也可以在 VMWare 或者 Hyper-V 等虚拟机软件上安装。
4 |
5 | 但自从微软发布 WSL(Windows SubSystem for Linux)之后,我一直希望尝试一下,所以这次将使用 WSL 来安装 Linux。
6 |
7 | WSL 本身也是基于虚拟机技术的,它最大的优势大概是可以方便地在 Windows 中使用 Linux。
8 |
9 | 我自己对 Linux 没有任何使用经验,所以这篇文章是以一个初学者的视角,记录每一步安装配置的过程。
10 |
11 | ## 升级 Windows 11
12 |
13 | 为了可以使用 GUI,也就是 Linux 中的图形界面,我们需要先将操作系统升级到 Windows 11。
14 |
15 | 详情需求可以参考如下链接:
16 | https://docs.microsoft.com/zh-cn/windows/wsl/tutorials/gui-apps
17 |
18 | ### 1. 检查是否可以升级
19 |
20 | 微软目前还没有全面推送 Windows 11 的更新,所以需要手动将 Windows 10 更新到 11。
21 |
22 | 首先需要检查当前的机器是否可以升级到 Windows 11。从下面的链接下载一个应用。
23 |
24 | https://www.microsoft.com/zh-cn/windows/windows-11?r=1#pchealthcheck
25 |
26 | 安装后运行,就可以确实是否可以升级。
27 |
28 | 
29 |
30 | ### 2. 安装升级包
31 |
32 | 手动下载 Windows 11 更新包。
33 |
34 | https://www.microsoft.com/zh-cn/software-download/windows11
35 |
36 | 直接安装即可,整个过程大概需要 30 分钟。
37 |
38 | 
39 |
40 | ## 安装 WSL
41 |
42 | 现在我们已经将系统升级到 Windows 11,接下来就可以安装 WSL 了。
43 |
44 | ### 1. 升级显卡驱动
45 |
46 | 首先我们需要升级适用于 WSL 的虚拟显卡驱动。这一步主要是为了使用 Linux 中的图像界面,如果不需要,可以跳过这一步。
47 |
48 | 下面链接中提供了 Intel ,AMD 和 NVIDIA 的相关显卡驱动的下载地址。
49 | https://docs.microsoft.com/zh-cn/windows/wsl/tutorials/gui-apps
50 |
51 | 我这里安装的是 Intel 的驱动。
52 |
53 | 
54 |
55 | ### 2. 安装 WSL
56 |
57 | 打开 Windows 命令行,或者 Windows 终端,输入命令
58 |
59 | ```cmd
60 | wsl --list --online
61 | ```
62 |
63 | 
64 |
65 | 就会列出所有可以安装的 Linux 发行版本,默认是 Ubuntu。
66 |
67 | 通过下面的命令直接安装 Ubuntu。
68 |
69 | ```cmd
70 | wsl --install
71 | ```
72 |
73 | 
74 |
75 | 从命令提示中也可以看到 GUI 相关的内容。
76 |
77 | 
78 |
79 | 下载完成后需要重启电脑。重启后会直接弹出 Ubuntu 的命令行界面。
80 |
81 | 
82 |
83 | 按照提示输入用户名和密码。
84 | 
85 |
86 | *注意:1,该用户为系统管理员。 2. Linux 默认系统用户 root 的密码是随机的,每次开机都有一个新的密码,如果希望修改可以参考[这篇文章](https://www.jianshu.com/p/e43e11d6ba09)。
87 |
88 | 安装完成后,如下图所示,出现命令行。
89 |
90 | 
91 |
92 | 到这一步,WSL 就已经安装好了。我们已经在 Windows 中安装了一个 Linux 子系统 Ubuntu。
93 |
94 | 接下来就开始一步步探索如何使用这个 Linux 系统吧。
--------------------------------------------------------------------------------
/寄存器.md:
--------------------------------------------------------------------------------
1 | # 寄存器
2 |
3 | [之前的文章](/程序角度的内存布局.md),我们已经介绍了关于内存的相关内容。对于程序而言,我们还会接触到 CPU 内部的存储单元——寄存器(Register)。
4 |
5 | 寄存器可以用来暂存程序指令,数据和内存地址。寄存器是在 CPU 内部,所有它的读写速度比内存快很多。
6 |
7 | *寄存器和内存之间,还有一层存储介质叫缓存(Cache)也在 CPU 内部,访问速度也在两者之间,但 Cache 对程序而言是透明的。*
8 |
9 | 有三类寄存器与程序的运行有关:
10 |
11 | 1. PC(Program Counter)程序计数器:存放程序将要执行的下一条指令在内存中的地址(用 %rip 表示)。
12 |
13 | 2. 整数寄存器文件:有 16 个寄存器,每个寄存器 64 位,可以存放内存地址和整数数据。
14 |
15 | 3. 条件码寄存器(condition code register):主要有 4 个寄存器,每个寄存器 1 位,用于存储最近执行的算术或逻辑指令的状态信息。主要是用来实现编程语言中的条件语句,比如 if,while。
16 |
17 | *除了上面提到的寄存器,还有其他寄存器,比如多个处理浮点运算的128位寄存器等。*
18 |
19 | 16 个整数寄存器,都有自己的名称。因为可以用来存储 X64 系统中的内存地址,所以每个寄存器都是 64 位。
20 |
21 | 为了兼容之前的系统,同样位置的寄存器根据使用的位数不同,名称也会有差别,64 位是一个名字,32 位,16 位,8 位都有自己的名字,具体形式如下图。
22 |
23 |
24 |
25 | 整数寄存器
26 |
27 |
28 |
29 | 前面提到寄存器可以用来暂存程序指令,数据和内存地址,所以寄存器和内存之间的关系就是传递这几种类型的数据,以便于 CPU 进行计算:
30 |
31 |
32 |
33 | 寄存器和内存
34 |
35 |
36 |
37 | 程序编译后的代码是保存到内存中的,机器会一条一条地读取代码里面的指令并执行。执行期间,机器根据指令的内容来使用内存和寄存器。
38 |
39 | 我们用一个简单的例子来演示一下程序运行期间,寄存器和内存是如何工作的。
40 |
41 | ```c
42 | long exchange (long *xp, long y){
43 | long x = *xp;
44 | *xp = y;
45 | return x;
46 | }
47 |
48 | int main(){
49 | long a = 4;
50 | long b = exchange(&a, 3);
51 | }
52 | ```
53 | 上面代码的主要功能是,将变量 a 的地址 和 数值 3 传递给 exchange 函数,最终变量 a 的值变成了3,变量 b 赋值为 4 (即调用函数之前变量 a 的值)。
54 |
55 | 1. 函数初始化状态:
56 | * 假设数值 4 保存在内存开始地址为 0x100 的地方(long 类型需要 8 个字节,占用 8 个内存地址)。
57 | * 参数 xp 是数值 4 的内存地址,这个地址存放在寄存器 %rdi 中。
58 | * 参数 y 的数值是 3,该值保存在寄存器 %rsi 中。
59 |
60 |
61 |
62 | 初始化
63 |
64 |
65 |
66 | *注:图中 Memory 一格为 8 个连续的字节,右侧的地址为这 8 个字节的开始地址。
67 |
68 | 2. 设置变量 x 的值:
69 | * 变量 x 保存在寄存器 %rax 中。
70 | * 从 xp (即 %rid)所指向的内存中读取数值 4。
71 | * 将上一步取到的数值 4 保存到寄存器 %rax 中。
72 |
73 |
74 |
75 | 设置 x 的值
76 |
77 |
78 |
79 | 3. 将参数 y 的值赋给 xp 所指向的内存。
80 | * 从 %rsi 中取出数值3,将其保存到 %rid 所只向的内存中。
81 |
82 |
83 |
84 | 将参数 y 的值赋给 xp 所指向的内存
85 |
86 |
87 |
88 | 寄存器 %rax 是保存函数返回值的地方,变量 x 被赋值之后没有变化,所以最后一句 `return x;` 在这里不需要额外的指令。
89 |
90 | 完整的过程如下面这张图:
91 |
92 |
93 |
94 | 整体流程
95 |
96 |
97 |
98 | 函数 exchange 最终转换成指令集(汇编代码)如下:
99 |
100 | ```amd
101 | movq (%rdi),%rax
102 | movq %rsi,(%rdi)
103 | ```
104 |
105 | * 这些指令什么意思?
106 | * 如何将编写的代码转换成机器指令?
107 |
108 | 这些问题一定让你很困惑,不要着急,我们会在之后的文章中详细介绍这些内容。
109 |
110 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/导读.md:
--------------------------------------------------------------------------------
1 | # 导读
2 |
3 | 2021 年,我在学习 JavaScript 时,看到了一篇关于[ V8 引擎的文章](https://github.com/dingtingli/javascript-translation/blob/main/doc/Ignition.md)。当看到 “栈” 和 “寄存器” 这些概念的时候,就有点看不下去了。对计算机基础知识的欠缺导致深入理解技术原理的时候步履维艰。
4 |
5 | 于是接下去几个月我决定从头开始认真学习一遍《深入理解计算机系统》。学习的过程中,也走过不少弯路,有些内容需要重复看几遍才明白,有些内容则需要再找其他资料对比来看。
6 |
7 | 一开始我是边学习边在纸上记笔记。在做"第三章 程序的计算机级表示"笔记的时候,觉得电子版会更方便理解,于是便有了这个学习笔记。希望这部分的笔记也可以帮助到更多正在学习这本书的朋友。
8 |
9 | 相对于直接看书,结合这个笔记来学习,有这么三点好处。
10 |
11 | ## 可视化演示
12 |
13 | 在学习的过程中,经常会遇到操作内存和寄存器相关的指令,比如 `Push` 和 `Pop`。
14 |
15 | 书本上会用多张图来演示这些指令的执行过程。
16 |
17 |
18 |
19 |
20 |
21 | 这种情况,通过动图可以更加直观的了解整个过程。
22 |
23 |
24 |
25 |
26 |
27 |
28 | 整个笔记中,我在每篇文章中都配有相应的图片来帮助理解,目前已经完成了100多张动态图片。
29 |
30 | ## 重新整理视角
31 |
32 | 书上的讲解是按照概念从小到大的顺序来进行的,正常来说这符合人们认识事物的心里预期。
33 |
34 | 但我在学习的过程中我发现有时候这反而容易让我失去学习的耐心。因为内容实在太多了,一章的内容不是一两天就能看完的。我需要一张导航图,知道我今天学习的内容在这张图的那个部分。
35 |
36 | 于是笔记中重新整理了顺序,首先介绍内存的布局。
37 |
38 |
39 |
40 |
41 |
42 |
43 | 然后在介绍完简单指令后,就直接通过一个完整的例子介绍过程,最后再回过头来介绍条件码等其他内容。
44 |
45 |
46 |
47 |
48 |
49 | 当然我也会在每篇文章中标注出这是书本中的哪个章节。如果你希望按照书本的顺序来学习,也可以对照学习。
50 |
51 | ## 查漏补缺
52 |
53 | 学习的过程中,我也会去查找其他学习资料,有些内容是书本中没有讲到的,比如,程序使用的内存最高位为什么是 '0x00007FFFFFFFFFFF'?这其实跟 AMD64 架构的规定有关,“虚拟内存地址只用48位地址”。
54 |
55 |
56 |
57 |
58 |
59 |
60 | 另外,有些书中没有细讲,但我在学习的时候不是很清楚的部分,笔记中也会详细介绍。比如,在介绍条件码寄存器的溢出标志时,提到补码的正溢出和负溢出,笔记中会有详细的示例。
61 |
62 |
63 |
64 |
65 |
66 | ## 总结
67 |
68 | 这是一份个人的学习笔记。在笔记中,我尽可能地用一种可视化的方式将书本中的概念展现出来。这些内容可能无法替代你亲自去阅读《深入理解计算机系统》,但是肯定可以帮助你更好的理解书本中的内容。
69 |
70 |
71 |
--------------------------------------------------------------------------------
/指令集1操作数.md:
--------------------------------------------------------------------------------
1 | # 指令集 01 - 操作数格式
2 |
3 | [上一篇文章](/寄存器.md)我们谈到了指令,从这篇文章开始我们就来了解一下指令相关的内容。
4 |
5 | ## 指令集介绍
6 |
7 | 我们用高级语言来编写代码,而计算机却不能直接解读这些代码,因为 CPU 有一套自己理解的格式和行为,被称为指令集架构(ISA Instruction Set Architecture),它定义了**处理器状态,指令的格式以及每条指令对状态的影响**。
8 |
9 | 编译器将我们的代码转换成相应的指令,之后 CPU 会一条一条地执行这些指令,这就是代码执行的大致流程。
10 |
11 | 我们首先来学习一下有哪些指令,它们是如何执行的;之后会结合具体的 c 语言代码,看看指令和代码的对应关系;最后再结合之前学习的内存相关的知识,了解程序运行时是如何使用内存的。
12 |
13 | ## 指令
14 |
15 | 指令的结构大概是这样的,一条命令后面接着一个或者多个这个命令需要的操作数。
16 |
17 | 比如上一篇文章最后提到的指令:
18 |
19 | ```amd
20 | movq (%rdi),%rax
21 | ```
22 |
23 | `movq` 就是一条指令,`(%rdi)` 和 `%rax` 就是这条指令需要的两个操作数。
24 |
25 | ## 操作数格式
26 |
27 | 我们首先来了解一下操作数的格式。
28 |
29 | 在介绍操作数之前,我们首先统一一下图示中内存的表示。
30 |
31 | 之前介绍内存的时候说过一个内存地址所代表的内存空间大小为 1 个字节,所以图示中一格内存的大小也是 1 个字节。之后为了表示方便,图示中一格内存的大小为 8 个字节,这样正好可以完整保存一个整数寄存器中的内容。
32 |
33 |
34 |
35 | 内存示意图
36 |
37 |
38 |
39 | 操作数的格式有下面几种形式:
40 |
41 | ### 1. 寄存器
42 |
43 | 操作数接是寄存器,对应的值就是该寄存器中的值。
44 |
45 | 比如 `%rax`,在图中对应该寄存器中的 `0x100`。
46 |
47 |
48 | %rax
49 |
50 |
51 |
52 | ### 2. 绝对地址
53 |
54 | 操作数是内存地址,对应该地址指向的内存空间中保存的值。
55 |
56 | 比如 `0x108`,在图中对应内存中保存的值 `0xAB`。
57 |
58 |
59 | 0x108
60 |
61 |
62 |
63 | ### 3. 立即数
64 |
65 | 操作数的前面加上 `$` 符号,表示该操作数是一个立即数,对应的值就是该操作数。
66 |
67 | 比如 `$0x101`,在图中对应的值是 `0x101`。
68 |
69 |
70 | $0x101
71 |
72 |
73 |
74 | ### 4. 间接地址
75 |
76 | 操作数是用 `()` 将寄存器包起来,那么就会从寄存器的值所对应的内存地址中读取相应内存空间中的值。
77 |
78 | 比如 `(%rax)`,在图中先会找到 `%rax` 的值 `0x100`,然后查找内存地址为 `0x100` 所对应内存空间保存的值 `0xFF`。
79 |
80 |
81 |
82 | (%rax)
83 |
84 |
85 |
86 | ### 5. 变换地址
87 |
88 | 从间接地址的格式中还演变出几种需要计算的地址。
89 |
90 | 比如 `0x8(%rax)`,在图中需要先将 `%rax` 中的值 `+ 0x8`,得到 `0x100 + 0x8 = 0x108`,然后再从内存地址 `0x108` 中找到所对应的值 `0xAB`。
91 |
92 |
93 |
94 | 0x8(%rax)
95 |
96 |
97 |
98 |
99 | 这类需要计算的格式还有如下几种:
100 |
101 | `0x15(%rax,%rdx) = 0x15 + %rax + %rdx`
102 |
103 |
104 |
105 | 0x15(%rax,%rdx)
106 |
107 |
108 |
109 | `(%rax,%rdx,0x8) = %rax + %rdx * 0x8`
110 |
111 |
112 |
113 | (%rax,%rdx,0x8)
114 |
115 |
116 |
117 | `0xFC(,%rcx,0x4) = 0xFC + %rcx * 0x4`
118 |
119 |
120 | 0xFC(,%rcx,0x4)
121 |
122 |
123 |
124 |
125 | 最后,让我们再来看看开头的那条指令:
126 |
127 | ```amd
128 | movq (%rdi),%rax
129 | ```
130 |
131 | 试着来理解后面的两个操作数:
132 |
133 | * %rdi 中的值应该是一个内存地址,`(%rdi)` 的意思是从该地址中取出相应内存的值。
134 | * %rax 就是指寄存器。
135 |
136 | 从指令名称字面上来看,是不是将第一步从内存中取出的值移动到 %rax 中呢?
137 |
138 | 这就需要来理解指令 `movq` 的具体含义了。下次再聊。
139 |
--------------------------------------------------------------------------------
/指令集2mov.md:
--------------------------------------------------------------------------------
1 | # 指令集 02 - MOV
2 |
3 | [上一篇文章](./指令集1操作数.md)介绍了指令操作数的格式,这次让我们来看看一条具体的指令 mov。
4 |
5 | ```arm
6 | mov S, D
7 | ```
8 |
9 | mov 指令是将数据从一个位置(S)复制到另一个位置(D)。
10 |
11 | 我们以一段之前使用过 c 语言为例。
12 | [详情可点击这里](./寄存器.md)
13 | ```c
14 | long x = *xp;
15 | *xp = y;
16 | return x;
17 | ```
18 |
19 | 这段代码转换成指令如下:
20 |
21 | ```arm
22 | movq (%rdi),%rax
23 | movq %rsi,(%rdi)
24 | ```
25 |
26 | 运行指令前假设:
27 | 1. %rdi 中存放的是内存地址 0x100
28 | 2. %rsi 中存放的是数值 3
29 | 3. %rax 中没有值
30 | 4. 地址 0x100 对应的内存空间中的值为 4
31 |
32 |
33 |
34 | 初始状态
35 |
36 |
37 |
38 | ```arm
39 | movq (%rdi),%rax
40 | ```
41 |
42 | 我们先忽略 `mov` 后面的 `q`,按照上面对 mov 指令的定义,这句指令的意思是:将 (%rdi) 代表的数据复制到 %rax 中。
43 |
44 | (%rdi)操作数的意思:%rdi 中的数据 0x100 是内存地址,从该地址中读取内存空间的值 4。
45 |
46 |
47 |
48 | movq (%rdi),%rax
49 |
50 |
51 |
52 | ```arm
53 | movq %rsi,(%rdi)
54 | ```
55 | 这句指令的意思是:将 %rsi 中的数据复制到 (%rdi) 中。
56 |
57 |
58 |
59 | movq %rsi,(%rdi)
60 |
61 |
62 |
63 | 现在我们来看一下 `q` 是什么意思。
64 |
65 | q 代表操作数所对应的位数是 64 位(8 字节)。除了 q 之外还有 b,w, l 它们分别对应着:
66 |
67 | |缩写|位数|字节|全称|
68 | |:--|:--|:--|:--|
69 | |b|8 位|1 字节| byte|
70 | |w|16 位|2 字节| word|
71 | |l|32 位|4 字节| double words|
72 | |q|64 位|8 字节| quad words|
73 |
74 | 比如:`movl $0x4050, %eax`,就是将立即数 `0x4050` 复制到 32 位寄存器 %eax 中。
75 |
76 | 注意两点:
77 | 1. mov 指令不可以将数据从内存直接复制到内存,这个操作需要经过寄存器。
78 |
79 | 2. 32 位 movl 指令会将寄存器中的高位 4 个字节设置成 0。
80 | `movl $0x4050, %eax`,除了设置 32 位的 %eax,同时还会将 %rax 的高位 4 个字节设置成 0。
81 |
82 | ## 参考
83 |
84 | ```c
85 | long exchange (long *xp, long y){
86 | long x = *xp;
87 | *xp = y;
88 | return x;
89 | }
90 |
91 | int main(){
92 | long a = 4;
93 | long b = exchange(&a, 3);
94 | }
95 | ```
96 | 上面代码的主要功能是将变量 a 的地址 和 数值 3 传递给 exchange 函数,最终变量 a 的值变成了3,变量 b 赋值为 4 (即调用函数之前变量 a 的值)。
97 |
98 |
--------------------------------------------------------------------------------
/指令集3pushpop.md:
--------------------------------------------------------------------------------
1 | # 指令集 03 - 压入和弹出栈
2 |
3 | 在[内存布局](./程序角度的内存布局.md)中,最上面一部分叫做 Stack(堆),这次我们就来看看两个关于 Stack 的指令,Push 和 Pop。
4 |
5 |
6 |
7 | 内存布局
8 |
9 |
10 |
11 | ## Stack 的结构
12 |
13 | 首先,我们先来了解一下 Stack 的结构。
14 |
15 | 这一个内存区域之所以称之为 Stack(堆),是因为:
16 | 1. 这是一块地址连续的内存区域
17 | 2. 以 Stack(堆)这种数据结构来管理这块内存区域。
18 |
19 | Stack(堆)可以添加和删除数据,不过要遵循“后进先出”的原则。根据这个原则,这段内存需要有一端被封住,称之为“栈底”,所有数据从从另外一端进出,称为“栈顶”。
20 |
21 | 通常,“栈底”在高位内存地址,栈顶在低位内存地址。所以,栈顶元素的内存地址是栈中所有元素中最低的。
22 |
23 | 由于我们画内存示意图的时候,习惯将低位内存地址放在下面,高位内存地址放在上面,所以栈的内存示意图像一个倒扣过来的桶,底上。
24 |
25 | 另外,**栈顶元素的内存地址保存在寄存器 %rsp 中(register stack point)。**
26 |
27 |
28 |
29 | stack 示意图
30 |
31 |
32 |
33 |
34 | ## 压入和弹出栈的指令
35 |
36 | 向栈中添加数据的动作称为“Push(压)”,从栈中删除数据的动作称为“Pop(弹)”。
37 |
38 | ### 压栈指令
39 |
40 | ```arm
41 | pushq S
42 | ```
43 |
44 | 该操作会执行两个步骤:
45 |
46 | 1. 修改栈指针 %rsp,因为压入的是 q(8 个字节),所以栈指针需要 `-8`。
47 | 2. 将值 S 写到新的栈顶地址。
48 |
49 | c 语言中没有直接操作栈的语句,所有我们直接使用指令语句做演示,以后我们会详细讲解什么样的 c 语言代码会导致栈操作。
50 |
51 | 假设指令开始之前,内存和寄存器的状态是这样的。
52 |
53 |
54 |
55 | 初始状态
56 |
57 |
58 |
59 |
60 | ```arm
61 | pushq %rax
62 | ```
63 |
64 | 具体操作如下:
65 | 1. 修改栈指针,将栈指针 `-8`,以扩展栈的空间。
66 | 2. 将 %rax 的内容写到新的栈顶地址。
67 |
68 |
69 |
70 | push
71 |
72 |
73 |
74 | ### 弹出指令
75 |
76 | ```arm
77 | popq D
78 | ```
79 |
80 | pop 与 push 正好相反:
81 |
82 | 1. 从栈顶读取数据,写到 D
83 | 1. 修改栈指针 %rsp,因为弹出的是 q(8 个字节),所以栈指针需要 `+8`。
84 |
85 | 沿用上面图示的状态,使用如下指令:
86 |
87 | ```arm
88 | popq %rdx
89 | ```
90 | 具体操作如下:
91 | 1. 将栈顶数据写到 %rdx 中,
92 | 2. 修改栈指针,将栈指针 `+8`,以减小栈的空间。
93 |
94 |
95 |
96 | push
97 |
98 |
99 |
100 | 需要注意的是,我们只是修改了栈顶指针,原来栈顶的地址的数据并没有删除。
101 |
--------------------------------------------------------------------------------
/指令集4leaq.md:
--------------------------------------------------------------------------------
1 | # 指令集 04 - leaq
2 |
3 | ## movq 回顾
4 |
5 | 在[操作数格式](./指令集1操作数.md)中,我们介绍了各种操作数的使用格式,比如下面这种:
6 |
7 | ```arm
8 | (%rax,%rdx,0x8)
9 | ```
10 |
11 | 相当于计算出 `%rax + %rdx * 0x8` 所对应的地址,然后从该地址对于的内存中读取相应的值。
12 |
13 |
14 |
15 | (%rax,%rdx,0x8)
16 |
17 |
18 |
19 | 如果在 `movq` 中使用这个操作数:
20 |
21 | ```arm
22 | movq (%rax,%rdx,0x8),%rax
23 | ```
24 |
25 | 该指令会将从内存中读出的值 `0x11`,写入 %rax 中。
26 |
27 |
28 |
29 | movq
30 |
31 |
32 |
33 | ## leaq 指令
34 |
35 | 这次介绍一个 `movq` 的指令变形,叫做 `leaq` (load effective address:加载有效地址)。
36 |
37 | 跟 `movq` 类似,`leaq` 也有两个操作数,但不一样的是,第二个操作数必须是寄存器。所以,该指令只有 `leaq` 一种形式,没有 `b`,`w`, `l` 等其它形式。
38 |
39 | ```
40 | leaq S, register
41 | ```
42 |
43 | 还有一点不同的是,`leaq` 会将计算出的地址直接写入寄存器中,并不读取地址所在内存中的值。
44 |
45 | 比如跟上面那条指令对应的 `leaq`:
46 |
47 | ```arm
48 | leaq (%rax,%rdx,0x8),%rax
49 | ```
50 |
51 | 该指令会将 `%rax + %rdx * 0x8` 计算出来的值 `0x118`,直接写入 %rax 中。
52 |
53 |
54 |
55 | leaq
56 |
57 |
58 |
59 | ## C 语言示例
60 |
61 | 我们来看一段 c 程序,
62 |
63 | ```c
64 | long scale(long x, long y, long z)
65 | {
66 | long t = x + 4 * y + 12 * z;
67 | return t;
68 | }
69 | ```
70 |
71 | 这段代码会转换成如下指令:
72 |
73 | ```arm
74 | leaq (%rdi, %rsi, 4), %rax
75 | leaq (%rdx, %rdx, 2), %rdx
76 | leaq (%rax, %rdx, 4), %rax
77 | ```
78 |
79 | 在进入函数之前,初始状态:x 保存在 %rdi 中, y 保存在 %rsi 中,z 保存在 %rdx 中。
80 |
81 | 注意:函数参数的传递方式,我们会在之后详细介绍。
82 |
83 | 另外,函数的返回值会保存在 %rax 中。
84 |
85 | ```arm
86 | leaq (%rdi, %rsi, 4), %rax
87 | ```
88 |
89 | 该指令将计算 `%rdi + %rsi * 4 = x + y * 4`,并将值直接写入 %rax。
90 |
91 |
92 |
93 |
94 |
95 |
96 | ```arm
97 | leaq (%rdx, %rdx, 2), %rdx
98 | ```
99 |
100 | 该指令将计算 `%rdx + %rdx * 2 = z + z * 2 = 3 * z`,并将值直接写入 %rdx。
101 |
102 |
103 |
104 |
105 |
106 |
107 | ```arm
108 | leaq (%rax, %rdx, 4), %rax
109 | ```
110 |
111 | 该指令将计算 `%rax + %rdx * 4 = x + y * 4 + (3z) * 4 = x + 4 * y + 12 * z`,并将值直接写入 %rdx。
112 |
113 |
114 |
115 |
116 |
117 |
118 | ## 作用
119 |
120 | `leaq` 虽然是 load effective address(加载有效地址)的简称,但它根本就没有引用内存。
121 |
122 | 在转换的过程中,`leaq` 更多的是被用来描述复杂的计算逻辑。
--------------------------------------------------------------------------------
/指令集5一元操作.md:
--------------------------------------------------------------------------------
1 | # 指令集 05 - 一元操作
2 |
3 | 我们之前看到的指令大多都有两个操作数,有些指令只需要一个操作数,被称为一元操作。
4 |
5 | ## inc 指令
6 |
7 | inc(Increment,自增),将操作数加 `1`, 相当于 c 语言中的 `++`。
8 |
9 | ```
10 | inc D
11 | ```
12 |
13 |
14 |
15 |
16 |
17 |
18 | ## dec 指令
19 |
20 | dec(decrement,自减),将操作数减 `1`, 相当于 c 语言中的 `--`。
21 |
22 | ```
23 | dec D
24 | ```
25 |
26 |
27 |
28 |
29 |
30 |
31 | ## 其他一元操作指令
32 |
33 | |指令|作用||
34 | |:--|:--|:--|
35 | |NEG D|取负|-D|
36 | |NOT D|取补|~D|
37 |
38 |
39 |
--------------------------------------------------------------------------------
/指令集6二元操作.md:
--------------------------------------------------------------------------------
1 | # 指令集 06 - 二元操作
2 |
3 | [上一篇文章](./指令集5一元操作.md)介绍了只需要一个操作数的一元操作指令,这次介绍几组需要两个操作数的二元操作指令。
4 |
5 | ## 算术运算
6 |
7 | ### 加法和减法
8 |
9 | add,对两个操作数进程加法运算,并将结果写入第二个操作数。
10 |
11 | ```arm
12 | add S, D
13 | ```
14 |
15 |
16 |
17 |
18 |
19 | sub, 对两个操作数进程减法运算,并将结果写入第二个操作数。
20 |
21 | ```arm
22 | sub S, D
23 | ```
24 | **需要注意的是,减法操作是 `D-S`,也就是用第二个操作数减去第一个操作数。**
25 |
26 |
27 |
28 |
29 |
30 |
31 | ### 乘法和除法
32 |
33 | 另外还有乘法指令 `imul S, D`,使用方式和 `add`,`sub` 类似。
34 |
35 | 但是需要注意,该指令是的运算结果必须是 64 位的数值。如果超过超过 64 位,就需要使用 `imulq S` 指令,该指令只有一个操作数。
36 |
37 | `imulq S`, 将 S 与 %rax 相乘,运算结果保存在两个寄存器中,低位的 64 位保存在 %rax, 高位的 64 位 保存在 %rdx。
38 |
39 | `idiv` 除法指令没有二元操作的形式,只有一元操作。
40 |
41 | `idivq S` 将计算 `%rax / S`,计算结果:商保存到 %rax,余数保存到 %rdx。
42 |
43 | `imulq S`,`idivq S` 是对有符号数进行的运算,无符号数对应的指令是`mulq S`,`divq S`。
44 |
45 | ## 逻辑运算
46 |
47 | 逻辑运算有 `AND` ,`OR` 和 `XOR`。使用方式和 `SUB` 指令一样,都是用第二个操作数与第一个操作数进行逻辑运算,并将结果保存到第二个操作数中。
48 |
49 | 在生成的指令中,经常会遇到对同一个操作数进行 `xor` 的操作:
50 |
51 | ```
52 | xor %eax, %eax
53 | ```
54 |
55 | `xor` 异或操作原理是,相同为 `0`,不同为`1`。
56 |
57 | | ^| 0| 1|
58 | |:--|:--|:--|
59 | |**0**|0|1|
60 | |**1**|1|0|
61 |
62 | 因此两个相同的操作数进行 `xor`(所有位数都相同),结果就是将该操作数设置为 `0`。
63 |
64 | 该操作的效率高于 `mov $0, %eax`。
65 |
66 | 另外,对 32 位寄存器 %eax 进行操作有一个额外的好处,它会默认将寄存器的高 32 位也设置为 `0`,即可将 %rax 设置为 `0`。
67 |
68 | ## 位移运算
69 |
70 | 在二进制中将数字左移一位,相当于将该数字乘以 $ 2^1 $,左移 2 位,相当于将该数字乘以 $ 2^2 $。
71 |
72 | ```arm
73 | SAL k, D
74 | ```
75 |
76 | 该指令对操作数 D,左移 k 位。类似于 c 语言中的 `D << k`。
77 |
78 | 同样,`SAR` 会对操作数进行右移操作。
79 |
80 | ```arm
81 | SAR k, D
82 | ```
83 |
84 | 位移时需要考虑有符号和无符号数,上面两个指令都是针对有符号数的位移,被称之为算术位移。
85 |
86 | 无符号数的位移,称之为逻辑位移,对应的指令是 `SHL` 和 `SHR`。
87 |
88 | * 左位移都是向低位填 `0`,所以算术和逻辑左移指令 `SAL` 和 `SHL` 的作用是一样的。
89 |
90 | * 右移是向高位填值,算术位移 `SAR` 向高位填入符号位,逻辑位移`SHR` 向高位填入 `0`。
91 |
92 | 注意:寄存器 %cl 与位移指令相关,如果操作数 k 保存在寄存器中,一个字节就足以表示 64 位操作系统的位移量了,而这个字节会被保存到寄存器 %cl 中。
--------------------------------------------------------------------------------
/程序角度的内存.md:
--------------------------------------------------------------------------------
1 | # 从程序的角度看,内存是什么?
2 |
3 | ## 内存的基本概念
4 |
5 | 我们可以把内存想象成一个数组,其中每个数组元素的大小是 1 字节(byte)。
6 |
7 | 在数组中访问一个元素可以使用索引。同样,为了能访问内存中的元素,每个元素也有自己的地址。
8 |
9 | 从上面的类比中,可以看出内存对于程序来说有这么几个特性:
10 | 1. 内存的最小空间是1个字节(byte),也就是 8 位(bit)。
11 | 2. 内存是由许多这样的空间组合在一起的。
12 | 3. 每个空间都有一个地址。
13 |
14 | 我们以一个 4 位寻址空间的内存为例,用图形的形式来模拟一下内存的样子(只是模拟,真实的内存不是这样的)。
15 |
16 | 什么是 4 位 寻址空间?这是指内存地址的范围是用 4 位(bit)的**二进制**表示,从 0000 到 1111,换算成十进制就是 0 ~ 15。
17 |
18 | 因为每个地址可以保存 1 个字节(byte)的数据,所以这个内存的容量就是 16 个字节( $ 2^4 =16 $)。
19 |
20 |
21 |
22 | 4 位寻址空间内存
23 |
24 |
25 |
26 | Q: 为什么内存最小空间是 1 个字节(byte)?
27 |
28 | ## 64 位操作系统内存空间
29 |
30 | 现在的操作系统都是 64 位,也就是说支持 64 位寻址空间的内存:
31 |
32 | 0000000000000000000000000000000000000000000000000000000000000000(64个0)
33 |
34 | ~
35 |
36 | 1111111111111111111111111111111111111111111111111111111111111111(64个1)
37 |
38 | 二进制的显示太长,换算成十六进制(每 4 位二进制数转换成 1 位十六进制数):
39 |
40 | 0x0000000000000000(16个0) ~ 0xFFFFFFFFFFFFFFFF(16个F)
41 |
42 | 这么大的寻址空间如果都填满,内存最多可以存储多少数据呢?
43 |
44 | $2^{64}$ = 18,446,744,073,709,551,616 字节(byte),大概是16,777,216 TB。
45 |
46 | TB 这个容量单位一般都用来描述硬盘,而内存的容量通常是 GB,我们的个人电脑内存通常是 8/16/32 GB。
47 |
48 | 上面计算出的这个数字只是说明,我们现在使用的操作系统理论上最多支持 16,777,216 TB 的内存大小。
49 |
50 |
51 |
52 | 64 位寻址空间内存
53 |
54 |
55 |
56 |
57 | 虽然现实中我们看不到这么大的内存,但是从程序的角度来看,了解这个寻址空间还是有意义的。
58 |
59 | Q: 32 位操作系统的内存寻址空间是多少?
60 |
61 | ## 程序角度的内存
62 |
63 | 我们可以想象一个场景,一台有 32 G 内存的计算机,正在运行着浏览器,Word 等程序。这时候内存的使用情况大概是什么样子呢?
64 |
65 | 如果操作系统是 Windows,打开任务管理器就能看到,每个程序都占用着一定数量的内存空间。
66 |
67 | 我们可能会认为,程序可以直接操作分配给它的内存空间。
68 |
69 | 然而真实情况是,程序本身是无法直接操作物理内存,程序所能操作的是**虚拟内存**。
70 |
71 | 这个虚拟内存有这么几个特点:
72 |
73 | 1. 每个程序都感觉自己单独拥有系统的整个内存。
74 |
75 | 2. 每个程序可以看到的内存寻址空间是 0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF,而不是计算机真实的物理内存寻址空间。
76 |
77 | 3. 0x0000800000000000 ~ 0xFFFFFFFFFFFFFFFF 这段寻址空间的内存属于操作系统内核虚拟内存。
78 |
79 | 4. 每个程序实际可以使用的内存寻址空间是 0x0000000000000000 ~ 0x00007FFFFFFFFFFF (通常程序的起始地址也不是从 0 开始的,详情请看[下一篇文章](/程序角度的内存布局.md))。
80 |
81 |
82 |
83 | 虚拟内存分配
84 |
85 |
86 |
87 | 也就是说每个程序都感觉自己拥有了完整的64位寻址空间的内存。
88 |
89 | 看到这里我们肯定会有一堆疑问:
90 | * 虚拟内存是什么技术?
91 | * 虚拟内存如何映射到物理内存?
92 | * 虚拟内存这么大,如果程序使用范围了超出物理内存的空间,会发生什么情况?
93 | ...
94 |
95 | 这些问题都需要理解虚拟内存这项技术之后才能解答。
96 |
97 | 现阶段我们只需知道,每个程序看到的内存都是操作系统所能提供的完整寻址空间的内存,并且有一个叫虚拟内存的技术,可以将程序在这里使用的内存映射到物理内存上。
98 |
99 |
100 |
101 | 虚拟映射到物理内存
102 |
103 |
104 |
105 | *注:映射过程中,不仅会用到物理内存,可能还会涉及到对硬盘空间的使用。
106 |
107 | ## 补充
108 |
109 | 根据 AMD64 架构的规定:虚拟内存地址只用48位地址。
110 |
111 | 一个表示虚拟内存地址的64位指针只有低48位有效,并带符号扩展到64位。换句话说,其高16位必须是全1或全0,而且必须与低48位的最高位(第47位)一致。
112 |
113 | 因此,虚拟内存地址分为如下两段:
114 |
115 | 1.
116 | 0000000000000000 000000000000000000000000000000000000000000000000(64个0)
117 |
118 | ~
119 |
120 | 0000000000000000 011111111111111111111111111111111111111111111111(17个0,47个1)
121 |
122 | 0x0000000000000000 ~ 0x00007FFFFFFFFFFF(128T)
123 | 2.
124 | 1111111111111111
125 | 100000000000000000000000000000000000000000000000(17个1,47个0)
126 |
127 | ~
128 |
129 | 1111111111111111
130 | 111111111111111111111111111111111111111111111111(64个1)
131 |
132 | 0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF(128T)
133 |
134 | 文章中关于虚拟内存的配图,需要修改一下:
135 |
136 |
137 |
138 | 64 位寻址空间内存
139 |
140 |
141 |
142 |
143 |
144 |
145 | 虚拟内存分配
146 |
147 |
148 |
149 | 参考:
150 |
151 | [1] https://www.zhihu.com/question/28638698
--------------------------------------------------------------------------------
/资源.md:
--------------------------------------------------------------------------------
1 | # 资源
2 |
3 | 1. 课本 [英文](./pdf/Computer_Systems_A_Programmers_Perspective(3rd).pdf)
4 |
5 | 2. 课本 [中文]
6 |
7 | 3. 教学 [官网](https://csapp.cs.cmu.edu/)
8 |
9 | 自学 [官网](http://csapp.cs.cmu.edu/3e/students.html)
10 |
11 | 实验 [官网](http://csapp.cs.cmu.edu/3e/labs.html)
12 |
13 | 4. 教学视频 [官网](https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22&sortColumn=0&sortAscending=true)
14 |
15 | 5. 教学视频 [B站](https://www.bilibili.com/video/BV1iW411d7hd/)
16 |
17 |
18 | 6. 教学 [课件](http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html)
--------------------------------------------------------------------------------
/跳转指令.md:
--------------------------------------------------------------------------------
1 | # 跳转指令 jmp
2 |
3 | 在介绍[递归](./递归.md)的时候,我们提到 `if` 语句被转换成了两条指令。
4 |
5 | ```c
6 | if(n <= 1)
7 | ...
8 | ```
9 |
10 | 转换后的指令:
11 |
12 | ```arm
13 | 0x55555555512d: 48 83 ff 01 cmp $0x1,%rdi
14 | 0x555555555131: 7f 06 jg 0x555555555139
15 | 0x555555555133: ...
16 | ```
17 |
18 | [条件码](./条件码.md)一文中我们已经知道了第一行中的 `cmp` 指令的具体含义,这次我们就来看看第二行的跳转指令。
19 |
20 | ## 跳转指令 JMP
21 |
22 | 代码正常情况下会一句接着一句的顺序往下运行,但是如果遇到条件判断等情况,就需要根据条件的情况直接跳转到下一句需要运行的语句。
23 |
24 | 在高级语言中,我们可以使用 if 等判断语句进行跳转,在指令集中我们可以使用的是跳转指令 `jmp`(Jump)。
25 |
26 | ### 直接跳转和间接跳转
27 |
28 | `jmp` 是直接跳转指令,意思是直接跳转到后面操作数所对应的地址。
29 |
30 |
31 |
32 |
33 |
34 | 另外, `jmp` 还有一种间接跳转,写法是 `*`后面跟操作数:
35 |
36 | ```arm
37 | jmp *%rax //用 %rax 中的值作为操作目标
38 |
39 | jmp *(%rax) //以 %rax 中的值为地址,从内存中读取该地址中的值,并以该值为跳转目标。
40 |
41 | ```
42 |
43 | ### 条件跳转
44 |
45 | `jmp` 指令直接进行跳转,并不读取条件码寄存器中的值。
46 |
47 | [递归](./递归.md)示例中出现的 `jg` (jump greater)指令,则需要读取条件码寄存器中的值进行判断,如果之前算术或逻辑指令的状态值是大于,就进行跳转。
48 |
49 | 类似 `jg` 这类的指令有很多,具体的条件和[之间文章](./条件码.md)中介绍的 `set` 指令一样。只不过 `set` 指令是直接获取条件码寄存器中的判断结果,而 `j**` 则是根据判断结果进行指令跳转操作。
50 |
51 | |指令|跳转条件|描述|
52 | |:--|:--|:--|
53 | |je Label|ZF|相等/零|
54 | |jne Label|~ZF|不等/非零|
55 | |js Label|SF|负数|
56 | |jns Label|~SF|非负数|
57 | |jg Label|~(SF^OF) & ~ZF|大于(有符号`>`)|
58 | |jge Label|~(SF^OF)|大于等于(有符号`>=`)|
59 | |jl Label|SF^OF |小于(有符号`<`)|
60 | |jle Label|(SF^OF) | ZF|小于等于(有符号`<=`)|
61 | |ja Label|~CF & ~ZF |大于(无符号`>`)|
62 | |jae Label|~CF |大于等于(无符号`>=`)|
63 | |jb Label|CF|小于(无符号`<`)|
64 | |jbe Label|CF | ZF|小于等于(无符号`<=`)|
65 |
66 | 现在我们基本可以明白,之前[递归](./递归.md)中的指令是什么意思了。
67 |
68 | 如果 `%rdi > 1`,就跳转到指令 `0x555555555139`。
69 |
70 | ```arm
71 | cmp $0x1,%rdi
72 | jg 0x555555555139
73 | ```
74 |
75 | ## 跳转指令的编码
76 |
77 | 在前面的文章中,我们只关注了指令,并没有注意指令的编码的细节。
78 |
79 | ```arm
80 | 0x55555555512d: 48 83 ff 01 cmp $0x1,%rdi
81 | 0x555555555131: 7f 06 jg 0x555555555139
82 | 0x555555555133: ...
83 | ```
84 |
85 | 比如在上面的示例中,`jg 0x555555555139 `指令的编码为 `7f 06`。
86 |
87 | 指令编码的细节,在第四章会有介绍。这里简单了解一下,`7f` 代表的是 `jg` 指令,那么 `06` 是如何代表跳转地址 `0x555555555139` 的呢?
88 |
89 | `06` 编码只有一个字节,当然无法保存完整的跳转地址,它其实就是一个偏移量。
90 |
91 | 具体的做法是:执行跳转指令的时候,程序计数器(PC)的值先变成了下一条指令的地址 `0x555555555133`, 最终的跳转地址是由程序计数器的值加上编码中的偏移量。这个例子中就是,`0x555555555133 + 0x06` 等于 `0x555555555139`。
92 |
93 |
94 |
95 |
96 |
97 | 例子中是向下面的指令跳转,如果需要向上面的指令跳转,偏移量就需要给个负数。比如需要向上跳转 8 行,偏移量可以设置为 `f8`,补码形式的`0xf8` 就是十进制的 `-8`,`0x555555555133` 减 `8` 等于 `0x55555555512B` 。
98 |
99 | 例子中的偏移量用一个字节的补码就可以表示,如果偏移量过大,也可以用 2 或者 4 个字节来表示。
100 |
101 | 这种方式叫做 PC 相对寻址,只记录偏移量可以保证指令编码的简洁。在介绍链接的内容时这部分知识非常重要。
--------------------------------------------------------------------------------
/运行时栈2分配内存.md:
--------------------------------------------------------------------------------
1 | # 运行时栈 02 - 分配内存和参数传送
2 |
3 | [上一篇文章](./运行时栈1准备.md)中指令已经存放在内存中准备执行了。
4 |
5 | 这次我们开始执行指令,并观察 Stack(堆) 的变化。
6 |
7 | 我们先从 `main` 函数开始。
8 |
9 | ```c
10 | int main()
11 | {
12 | long d;
13 | multstore(2, 3, &d);
14 | return 0;
15 | }
16 | ```
17 |
18 | 该函数对应的指令如下:
19 |
20 | ```arm
21 | 0x0000555555555147 :
22 | 0x0000555555555147: endbr64
23 | 0x000055555555514b: subq $0x10,%rsp
24 | 0x000055555555514f: leaq 0x8(%rsp),%rdx
25 | 0x0000555555555154: movl $0x3,%esi
26 | 0x0000555555555159: movl $0x2,%edi
27 | 0x000055555555515e: callq 0x555555555135
28 | 0x0000555555555163: movl $0x0,%eax
29 | 0x0000555555555168: addq $0x10,%rsp
30 | 0x000055555555516c: retq
31 | ```
32 |
33 | 前面已经提到过 `endbr64` 指令可以跳过,我们就从第二条指令开始。
34 |
35 | ### `subq $0x10,%rsp`
36 |
37 | 执行 `subq $0x10,%rsp` 之前,我通过 gdb 调试器确认栈指针 %rsp 具体的值为 `0x7fffffffdfe8`。
38 |
39 | `subq $0x10,%rsp` 指令为 main 函数在 Stack(栈)中分配了16 个字节的空间。
40 |
41 | 执行完成后,栈指针 %rsp 为 `0x7fffffffdfd8`。
42 |
43 |
44 |
45 |
46 |
47 | ### `leaq 0x8(%rsp),%rdx`
48 |
49 | `leaq 0x8(%rsp),%rdx` 指令的意思是将 main 函数在 Stack 分配的内存中的前面 8 个字节的起始地址保存到 %rdx 中。
50 |
51 | 为什么是%rdx?%rdx 在[寄存器](./寄存器.md)中的含义是第三个参数。
52 |
53 |
54 |
55 |
56 |
57 | 我们可以看到,在 c 语言中,第三个参数是 `&d`, 即变量 `d` 的内存地址。
58 |
59 | ```c
60 | multstore(2, 3, &d);
61 | ```
62 |
63 | 因此,可以知道变量 `d` 的值就保存在 Stack 的前 8 个字节中,而 %rdx 中保存的是变量 `d` 的内存地址。
64 |
65 |
66 |
67 |
68 |
69 | ### `movl $0x3,%esi`
70 |
71 | `movl $0x3,%esi` 指令是将立即数 `3` 保存到 %esi 中。
72 |
73 | %rsi 在[寄存器](./寄存器.md)中的含义是第二个参数。
74 |
75 | 还是在这句 c 语言中,我们可以看到 `3` 是第二个参数。
76 |
77 | ```c
78 | multstore(2, 3, &d);
79 | ```
80 |
81 |
82 |
83 |
84 | ### `movl $0x2,%edi`
85 |
86 | `movl $0x2,%edi` 指令是将立即数 `2` 保存到 %esi 中。
87 |
88 | %rdi 在[寄存器](./寄存器.md)中的含义是第一个参数。
89 |
90 | 就像在 c 语言中看到的那样,`2` 是第一个参数。
91 |
92 | ```c
93 | multstore(2, 3, &d);
94 | ```
95 |
96 |
97 |
98 |
99 |
100 | ## 总结
101 |
102 | 前四条指令,做了3件事情:
103 | 1. 为 main 函数在 Stack(栈)中申请了 16 个字节的空间。
104 |
105 | 2. 确定了变量 `d` 在 Stack(栈)中的位置,并将地址保存到 %rdx。
106 |
107 | 3. 将 multstore 函数需要的参数,按顺序保存到相应寄存器中。
108 |
109 | *注意:虽然申请了 16 个字节,但其实只用了前 8 个字节,多申请的 8 个字节并没有使用。
110 |
111 | 所有的这些事情都是为下一句指令准备的,看名称应该是调用 `mulstroe` 函数,接下来我们来仔细介绍一下 `callq` 指令。
112 |
113 | ```arm
114 | callq 0x555555555135
115 | ```
116 |
117 | 参考:
118 |
119 | [1] 如果想了解 `endbr64` 指令,可以访问:
120 | https://stackoverflow.com/questions/56905811/what-does-the-endbr64-instruction-actually-do
--------------------------------------------------------------------------------
/运行时栈3转移控制.md:
--------------------------------------------------------------------------------
1 | # 运行时栈 03 - 转移控制 call
2 |
3 | [前面一篇文章](./运行时栈2分配内存.md)中,我们已经准备从 `main` 函数中调用 `multstore` 函数了。
4 |
5 | `callq 0x555555555135 ` 执行这条指令,将会调用 `multstore` 函数。
6 |
7 | 这次我们就着重来了解一下 `call` 指令。
8 |
9 | ## 程序计数器
10 |
11 | 在开始之前,我们先来回忆一下在介绍[寄存器](./寄存器.md)的时候,我们说过一个叫**程序计数器(PC:Program Counter)**的寄存器,用 %rip 来表示。
12 |
13 | 程序计数器的作用是给出下一条将要执行的指令地址。
14 |
15 | 比如, `0x0000555555555159` 地址表示的指令即将执行结束时,%rip 中地址会变成下一条指令的地址 `0x000055555555515e`。
16 |
17 |
18 |
19 |
20 |
21 | ## `call` 指令
22 |
23 | `callq 0x555555555135 ` 的操作数是 `multstore` 函数指令的内存起始地址 `0x555555555135`。
24 |
25 | 同时我们还需注意,`callq 0x555555555135 ` 下面一条指令 `movl $0x0,%eax` 的内存地址是 `0x555555555163`。
26 |
27 | ```arm
28 | 0x0000555555555135 :
29 | ...
30 |
31 | 0x0000555555555147 :
32 | ...
33 | 0x000055555555515e: callq 0x555555555135
34 | 0x0000555555555163: movl $0x0,%eax
35 | ...
36 | ```
37 |
38 | `call` 指令会完成两步操作:
39 | 1. 在 Stack(栈)中扩展 8 个字节,用于存放 `call` 下面一条指令的内存地址,作为返回地址。
40 |
41 | 2. 将程序计数器 %rip 设置成操作数中的地址。
42 |
43 | 在我们这个例子中:
44 |
45 | 1. 首先会扩展 Stack(栈),栈指针%rsp 变为 `0x7fffffffdfd0`,并在该地址保存 `call` 下面一条指令 `movl $0x0,%eax` 的地址 `0x555555555163`。
46 |
47 | 2. 将操作数 `0x555555555135` 写入程序计数器 %rip。
48 |
49 |
50 |
51 |
52 |
53 |
54 | 这样下一步将会执行 `0x555555555135` 地址上的指令,也就是 `multstore` 函数。
55 |
56 | `main` 函数会暂停,直到 `multstore` 函数返回。
57 |
58 | ## 总结
59 |
60 | 这篇文章介绍了一个新的指令 `call`,该指令会从一个函数跳转到另一个函数,就像进行了一次 Stack 控制权的转移。
61 |
62 | ## 参考
63 |
64 | [1] `main` 函数和 `multstore` 函数
65 |
66 | ```c
67 | void multstore(long x, long y, long *dest)
68 | {
69 | long t = mult2(x, y);
70 | *dest = t;
71 | }
72 |
73 | int main()
74 | {
75 | long d;
76 | multstore(2, 3, &d);
77 | return 0;
78 | }
79 | ```
80 |
81 | 该函数对于内存中的指令如下。
82 |
83 | ```arm
84 | 0x0000555555555135 :
85 | 0x0000555555555135: f3 0f 1e fa endbr64
86 | 0x0000555555555139: 53 pushq %rbx
87 | 0x000055555555513a: 48 89 d3 movq %rdx,%rbx
88 | 0x000055555555513d: e8 e7 ff ff ff callq 0x555555555129
89 | 0x0000555555555142: 48 89 03 movq %rax,(%rbx)
90 | 0x0000555555555145: 5b popq %rbx
91 | 0x0000555555555146: c3 retq
92 |
93 | 0x0000555555555147 :
94 | 0x0000555555555147: f3 0f 1e fa endbr64
95 | 0x000055555555514b: 48 83 ec 10 subq $0x10,%rsp
96 | 0x000055555555514f: 48 8d 54 24 08 leaq 0x8(%rsp),%rdx
97 | 0x0000555555555154: be 03 00 00 00 movl $0x3,%esi
98 | 0x0000555555555159: bf 02 00 00 00 movl $0x2,%edi
99 | 0x000055555555515e: e8 d2 ff ff ff callq 0x555555555135
100 | 0x0000555555555163: b8 00 00 00 00 movl $0x0,%eax
101 | 0x0000555555555168: 48 83 c4 10 addq $0x10,%rsp
102 | 0x000055555555516c: c3 retq
103 | ```
--------------------------------------------------------------------------------
/运行时栈4被保存的寄存器.md:
--------------------------------------------------------------------------------
1 | # 运行时栈 04 - 被保存的寄存器
2 |
3 | [上一篇文章](./运行时栈3转移控制.md)中,执行完 `call` 指令后,程序计数器(PC:Program Counter)中下一条指令就是被调用函数 `multstore` 中的第一条指令。
4 |
5 | 并且,在 `call` 指令之前就已经在寄存器中准备好了 `multstore` 函数所需要的参数。
6 |
7 |
8 |
9 |
10 |
11 | ## 被保存的寄存器
12 |
13 | ```c
14 | void multstore(long x, long y, long *dest)
15 | {
16 | long t = mult2(x, y);
17 | *dest = t;
18 | }
19 | ```
20 |
21 | ```arm
22 | 0x0000555555555135 :
23 | 0x0000555555555135: endbr64
24 | 0x0000555555555139: pushq %rbx
25 | 0x000055555555513a: movq %rdx,%rbx
26 | 0x000055555555513d: callq 0x555555555129
27 | 0x0000555555555142: movq %rax,(%rbx)
28 | 0x0000555555555145: popq %rbx
29 | 0x0000555555555146: retq
30 | ```
31 |
32 |
33 | `multstore` 中第一条有效的指令是 `pushq %rbx`,其中操作数 %rbx 的作用是**被调用者保存**。意思就是说接下来的指令会用到 %rbx,所以要先将其中的值保存到 Stack(栈)上,用完之后再使用 `popq %rbx`指令将其从 Stack(栈)中复制回 %rbx,从而恢复原样。
34 |
35 |
36 |
37 |
38 |
39 | 所以,这里 %rbx 中原来的是什么并不重要,我们只需要先将其复制到 Stack(栈)中即可。
40 |
41 |
42 |
43 |
44 |
45 | 我们知道 `%rdx` 中保存的是 `main` 函数中变量 `d` 的地址。`movq %rdx,%rbx` 将 `%rdx` 复制到 `%rbx`,接下来的指令中就不需要直接使用 `%rdx`。
46 |
47 | 这样的好处是,不需要改变通过参数传过来的地址。如果传过来的地址是一个数组的起始地址,我们既可以在 `%rdx` 保持数组的起始地址不变,同时还可以通过直接修改 `%rbx` 来计算偏移地址。
48 |
49 | 当然,在我们这个简单的示例中这个操作看不出有什么优势。
50 |
51 |
52 |
53 |
54 |
55 | ## 准备参数
56 |
57 | 接下去就要调用 `mult2` 函数了。在调用之前,需要在寄存器中准备好 `mult2` 函数所需要的参数。
58 |
59 | ```c
60 | mult2(x, y);
61 | ```
62 |
63 | 因为参数 x 和 y 目前仍然保存在 %rdi 和 %rsi 中,所以不需要额外的指令来处理参数。
64 |
65 | 然而,如果我们将 x 和 y 的顺序换一下
66 |
67 | ```c
68 | void multstore(long x, long y, long *dest)
69 | {
70 | long t = mult2(y, x); //chang the position of x and y.
71 | *dest = t;
72 | }
73 | ```
74 |
75 | 这时候我们就可以从指令中看到变化:
76 |
77 | ```arm
78 | 1 pushq %rbx
79 | *2 movq %rdi, %rax
80 | *3 movq %rsi, %rdi
81 | 4 movq %rdx, %rbx
82 | *5 movq %rax, %rsi
83 | 6 call mult2
84 | 7 movq %rax, (%rbx)
85 | 8 popq %rbx
86 | ```
87 | 第 2,3, 5 行指令将 `%rdi` 和 `%rsi` 中的值做了调换。
88 |
89 | 注意:使用了 %rax 作为调换的中转,因为 %rax 不是被调用者保存的寄存器,所以不需要先 Push。%rax 的作用是用来保存返回值,在执行 Call 之后,如果函数有返回值, %rax 会自动改变。
90 |
91 | ## 再次调用 call 指令
92 |
93 | `callq 0x555555555129 ` 的执行方式跟[上一篇文章](./运行时栈3转移控制.md)介绍的一样。
94 |
95 | 首先是在 Stack(栈)上申请空间,将 `call` 下面一条指令`movq %rax,(%rbx)` 的地址 `0x555555555142` 存入 Stack(栈)中,
96 |
97 | 然后将程序计数器中的值修改为 call 中的操作数 `0x555555555129`。
98 |
99 |
100 |
101 |
102 |
103 | 接下来我们就可以进入最后一个函数 `mult2` 了。
104 |
105 | ```c
106 | long mult2(long a, long b)
107 | {
108 | long s = a * b;
109 | return s;
110 | }
111 | ```
112 |
113 | ## 总结
114 |
115 | 这篇文章,我们进入到了 `multstore` 函数,第一条指令就是先将 `%rbx` 中的值保存到 Stack (栈)上,其目的是为了在之后的指令中可以自由使用 `%rbx` 寄存器,在 `multstore` 函数结束时,再将 Stack (栈)上的值写入 `%rbx` 中使其恢复原样。这类的寄存器被称为**被调用者保存的寄存器**。
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------