栈与函数调用惯例(又称调用约定)— 基础篇
记得一年半前参加百度的校招面试时,被问到函数调用惯例的问题。当时只是懂个大概,比如常见函数调用约定类型及对应的参数入栈顺序等。最近看书过程中,重新回顾了这些知识点,对整个调用栈又有了较深入的理解。作为笔记,记录于此。
NOTICE:本文笔记以32位Linux系统为背景,可能与Windows操作系统的底层机制有些小差异(比如进程虚拟空间的布局),但总的来说,原理是相通的。
1. 进程虚拟地址空间
犹记得当年一个困扰了自己很长时间的问题:“我的机器物理内存只有1G,为什么很多资料提到32位系统下,每个进程都拥有4G的地址空间”?更不理解的是“为啥各进程的4G地址空间还相互独立,不会冲突”?对于非计算机科班出身、当时没学过操作系统的学生来说,实在是难以理解这其中的奥妙。后来读到Andrew.S.Tanenbaum教授写的《Modern Operating Systems》一书,才有种被醍醐灌顶、豁然开朗的感觉,原来都是操作系统在背后“作怪”!在此建议对这部分概念有疑问的同学去读经典的操作系统教材,可以少走很多弯路。
进程虚拟空间看似与本文