惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
博客园 - 【当耐特】
WordPress大学
WordPress大学
爱范儿
爱范儿
美团技术团队
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
量子位
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
博客园 - 叶小钗
GbyAI
GbyAI
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Full Disclosure
G
Google Developers Blog
D
Docker
T
Tailwind CSS Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
B
Blog
博客园 - 三生石上(FineUI控件)
博客园 - Franky
H
Help Net Security
MyScale Blog
MyScale Blog
U
Unit 42
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
L
LangChain Blog
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog

Jun's Blog

2023 年度总结 OS 学习记 之 XV6 如何编译 GraalVM LLVM 中端优化之 InstCombine C++ 中 inline 关键字的语义 链接与库 C++ 移动语义基础 如何优化矩阵相乘 2022年度总结 CUDA初学笔记 汇编语言之保护模式 汇编语言之实模式 浅析 libc++ 中的 string 实现 std::expected 基本使用 C++模板基础 CSAPP第九章笔记之虚拟内存 CSAPP第八章笔记之异常控制流 2021年度总结 编译安装GCC12 如何给LLVM贡献代码 CSAPP第三章笔记Part 1 GDB基本使用笔记 读Effetive Modern C++ 之类型推导 给计算机新生的一封信 CMake学习笔记 由Redis学习数据结构--字典 C++中lambda表达式基础 由Redis学习数据结构--链表 对Python及爬虫行业的思考 Vim实用技巧 浅谈C++中的类 简要剖析const关键字 正则表达式基础总结 使用Hugo和Firebase部署个人博客 浅谈HTTPS证书 Linux常用命令总结 Git学习笔记 Linux下使用v2ray 娱乐至死读书笔记 自控力读书笔记 少有人走的路力读书笔记 Postfix & Dovecot 自建邮箱服务 Linux用户管理 Linux开机流程 Linux文件与目录 Linux硬盘管理 Linux服务浅谈 About Me
CSAPP第三章笔记Part 2
Jun · 2021-10-22 · via Jun's Blog

· Jun

前面简单介绍了一些常见的汇编指令,接下来我们谈一下在程序执行中一个非常重要的概念:过程

过程是软件工程中一种重要的抽象。它使得我们可以复用之前的代码,隐藏具体的实现。不同的编程语言或范式中它有不同的名字:函数,方法,等等。

假设P调用过程Q,Q执行后返回P。这些动作包括下面一个或多个机制:

  • 传递控制 在进入过程Q的时候,程序计数器必须被设置为Q的代码的起始地址。
  • 传递数据 P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值。
  • 分配和释放内存 Q必须能够为局部变量分配空间,而在返回前要能够释放掉这些空间。

C语言的实现

C语言实现“调用”机制的一个关键特性便是在于使用栈所提供的先进后出的内存管理原则。 在P调用Q时,栈会向上增长,为Q分配内存。而当Q结束后,栈指针减小重新回到P中。

控制转移

将控制从函数P中转移到Q中只需要把程序计数器设置为Q的起始地址就行了。不过它还需要把返回地址 先压入栈中,指明Q返回时要从哪里继续。在x86_64机器中,这些操作由call完成。

数据传送

当调用一个过程时,除了要把控制权转移给它外,还可能把数据作为参数传递给它。如果参数的个数 小于或等于6个,可以通过寄存器实现。而如果参数的个数大于6个,剩余的部分就要通过栈来传递。

内存分配

寄存器是在过程中唯一被共享的资源。我们必须保证当某一时刻调用另一个过程时,被调用者不会覆盖调用者稍后会使用的的寄存器。在x86_64中,有以下规则:

  • 被调用者保存寄存器

当过程P调用过程Q时,Q必须保存这些值。Q可以完全不去改变这些值,也可以先将旧值压入栈中,使用他们,最后弹出栈。这样就可以保证寄存器中的值不会遭到破坏。

寄存器%rbx %rbp 和%12 ~ %r15都属于这个。

  • 调用者保存寄存器

这意味着所有函数都可以随意更改他们的值,调用者必须自行保存好这个数据。

除%rsp外的所有非被调用者保存寄存器都属于这个。