C函数机制和内存布局的关系

  • C函数是首先属于高级语言的概念,提供了诸如调用,模块化等功能,而在底层汇编语言这个级别,函数实现为一种固定模式的翻译,其中包括比如编译器会自动添加函数序,函数跋等汇编语言代码,完成对一些寄存器的入栈现场保护等。
  • 非常重要的一点是:栈。这个东西属于函数机制在底层实现时包含的概念,属于函数的原生组成部分,所以只要有函数,就必定需要栈,这点很明确,而CPU中提供关于栈的寄存器和指令,说明从硬件架构上就支持函数的实现。
  • 栈从本质上就是一块内存空间,指令使用的关于栈的地址在相关寄存器中存储,并在调用第一个C函数之前完成初始化。
  • 所以栈位于哪段存储空间呢?有两个角度来回答,第一个是具体栈的起始位置,第二个是栈不会在位置,这里只说:栈不会在指令段代码段中。那么如何保证栈不在指令段和代码段所在的地址空间中呢,在对程序编译连接的过程中,软件工具知道指令代码段等所占的内存空间大小和位置,则可以分配那部分被占据内存之外的空间。
  • 地址空间都作了何种用处?第一被指令数据所占据,第二被栈所占据,那么剩下的内存空间呢?这部分内存空间,在不同场合下会有不同的称呼和用户,比如在进行应用编程的时候,malloc利用此部分空间,这时这部分空间叫做堆,而在Linux内核中,没有堆这种概念,Linux内核将内存划分了更多的用途,其实就看指令如何使用这部分空间,想要实现各种功能。
  • 没有函数概念,C语言也就不具备存在的基础,假设一种高级语言不实现函数,而是另外一种机制(不管它叫什么名字),为了实现这种机制,每次都需要一块具有特定用途的的内存区域,那么在内存布局中,每次都会存在这种区域,这里想说的是,可以将函数这个机制本身也理解为一种高级功能,每次编写C函数,就每次都使用到了函数本身这个功能,而底层就必然每次都使用到了栈,函数体内部代码实现的功能,则是更上一个层次的应用功能,从底层概括,还是从地址上读数,计算,再存入地址上的空间这样的行为。
  • 汇编以一种固定模式的指令(开始和结束,中间则根据不同的函数体有无穷多种不同的指令)实现了函数,但汇编不限于这种固定模式,直接写指令等等都是理论上可行的,因此不要将某些汇编的指令序列的逻辑强行纳入到高级语言的思维中,因为根本纳入不进去。
posted @ 2019-07-17 20:27  点点的本子  阅读(212)  评论(0编辑  收藏  举报