你所不知道的C語言:函數調用篇


你所不知道的C语言:函数调用篇

  • 早期 C 语言 (1972-1973) -> K&R C (1976-1979) -> ANSI C (1983-1989) -> ISO
  1. ANSI C -> C++ (1985-) # 融合 Simula 67 和 Ada 特色
  2. Cfront: C with class
  3. source: History of C
  • 许多程序语言允许 function 和 data 一样在 function 內部定义,但 C 语言不允许这样的 nested function,换言之,C 语言所有的 function 在语法都是位于最顶层 (top-level)
  1. nested function 是编译器的扩展
  • 「不允许 nested function」这件事简化了 C 编译器的设计
  1. 在 Pascal, Ada, Modula-2, PL/I, Algol-60 这些允许 nested function 的程序语言中,需要一个称为 static link 的机制来记录指向目前 function 的外层 function 的信息
  2. uplevel reference

补充说明:内嵌函数(Nested Function),所谓内嵌函数就是定义于另一个函数内部的函数.(GNU C++不支持内嵌函数) 内嵌函数名在它被定义的块中是局部有效的。

再论Function

你所不知道的C语言:函数调用篇

  • 数学定义的 Function
你所不知道的C语言:函数调用篇

  • 在 C 语言中,“function” 其实是特定的形式,并非数学意义上的函数,而是隐含了一个状态到另一个状态的关联,以下摘自 Wikipedia C-- 词条:
  1. C is a poor choice for functional languages: it does not support tail recursion, accurate garbage collection or efficient exception handling.(下划线部分分别为:尾递归/垃圾回收/异常处理)
  2. C-- is a simpler, tightly-defined alternative to C which does support all of these things.

C-- 在 1997 年才提出,距离 C 语言出现整整过了 25 年,前者主要的功能是作为编译器的 IR (中间表示式),主要用于Glasgow Haskell Compiler (缩写 ghc,是 Microsoft Research 一项高影响力的开源源码)。关于GHC相关的知识,感兴趣的读者可自行搜索了解。

wiki链接地址:https://en.wikipedia.org/wiki/C--

Process 和 C 程序的关联

  • 背景知识:
  1. IRQ (interrupt request)
  2. ISR (Interrupt Service Routines)
  3. IRQ mode
  4. MMIO v.s PMIO
  • 以网卡的收报文流程为例:

封包进來 -> interrupt -> ISR -> IRQ mode -> 下图绿色的区块里面 (IORQ) 进行内存作(读取/写入数据)

你所不知道的C语言:函数调用篇

  • The Internals of “Hello World” Program

简单的hello World,背后的一些事情... ...

你所不知道的C语言:函数调用篇

下面是hello world程序背后涉及到的一些背景知识点(取自jserv老师的一篇关于hello world的PPT文档),头条无法插入ppt附件(读者可以评论留下邮箱索取),将以图片的形式插入,强烈推荐大家仔细阅读,这篇PPT文档要求读者有一定的操作系统以及计算机组成原理方面的基础,读者如果遇到不能理解的地方,欢迎留言交流探讨。

• Computer Architecture Review

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇


• Static Linking
 Compilation & Linking

你所不知道的C语言:函数调用篇

 Object File Format

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

 Static Linking

你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇


你所不知道的C语言:函数调用篇

你所不知道的C语言:函数调用篇

• Loading & Dynamic Linking
 Executable File Loading & Process
 Dynamic Linking
• Memory
• System Call

后面几个章节的PPT图片暂时不贴出来,否则会造成文章过长,有需要的话评论留下邮箱,我会将ppt文档发给您。

你所不知道的C语言:函数调用篇

  • instructions: 自 object file (ELF) 映射 (map) 到 process 的 program code (机器码)
  • static data: 静态初始化的变量
  • BSS: 全名已

    不可考

    ,一般认定为 "Block Started by Symbol”,未初始化的变量或数据可用 size 指令來观察
  • Heap 或 data segment: 执行期间才能动态配置的空间sbrk 系统调用 (sbrk = set break)malloc/free 实际的实现通过 sbrk 系统调用

ELF segment & section

一个 segment 包含若干个 section

<code>$ sudo cat /proc/1/maps | less
55cff6602000-55cff678b000 rw-p  [heap]
7fff7e13f000-7fff7e160000 rw-p  [stack]/<code>

program loader
XIP: execution in place

关于链接/加载相关,强烈推荐书籍

你所不知道的C语言:函数调用篇


分享到:


相關文章: