C运行时包含哪些功能以及包含哪些功能

时间:2014-05-02 11:29:04

标签: c runtime

所以我一直试图了解C运行时到底是什么,并且在构建我自己的内核时必须深入了解。

我所理解的是,您不需要C运行时来构建每个 C程序(如内核的情况)。此外,运行时提供C程序和内核之间的接口。以下是我的问题:

  • 那么运行时到底是做什么的?

  • 是否作为此接口(因此,如果我们自己实现它,我们不需要运行时),或者它还有其他一些功能?< / p>

  • 编译程序时,运行时链接是否在任何文件中?

  • printfscanf等常用函数是运行时或C库的一部分吗?运行时将提供什么样的功能?

编辑:我提到What is the C runtime library?,但它没有回答我的问题。我问过的问题没有在那里得到解决。

2 个答案:

答案 0 :(得分:4)

我将从不同的角度回答这个问题,即没有操作系统的裸机嵌入式系统。在这种情况下,c运行时执行两个重要的功能:

  1. 未初始化的静态变量的值为零(bss部分)

  2. 显式初始化的静态变量获得其初始值

  3. 这些是C运行时的最小职责,尽管可能还有其他依赖于处理器的初始化函数。执行这些任务后,运行时只会转移到main函数。我还没有检查crt1.o是否初始化变量,但我认为它确实...我的C运行时只是一个简短的汇编程序。

答案 1 :(得分:3)

我将首先回答最后一个问题来设定一些定义:

  

printf或scanf等常用函数是运行时或C库的一部分吗?运行时将提供哪些功能?

如果你遵循this definition of runtime,那么是:它将“运行时”视为与“标准库实现”(或至少是其中的编译部分)几乎同义。但这并不是全部。

除了库之外,在常见的C实现中还有一些称为“启动文件”的东西,这也称为“运行时”(例如GCC的crt1.o)。这个小对象通常不会导出任何公共函数。

  

那么运行时究竟做了什么?

除了提供标准API(如果我们使用包含库的运行时的广义定义),它还包含符合OS约定的程序的入口点(在Linux上称为_start)切入点

  • 使用C约定(mainargc)调用argv;
  • getenv;
  • 设置环境
  • 将返回代码从main或参数转移到exit回到操作系统;
  • 确保即使atexit返回时也会运行main次回调;
  • 初始化malloc;
  • 的数据结构
  • 初始化标准流stdinstdoutstderr;
  • 可以加载共享库,例如libc和编译时给定的共享库的-l标志。
  

它是否仅作为此接口(因此,如果我们自己实现它,我们不需要运行时),或者它还有其他一些功能?

这真的取决于平台。运行时将完成为C程序提供C标准和编译器手册所保证的环境所需的所有功能。例如。在MS-DOS的旧时代,名为“DOS extenders”的运行时也会将CPU设置为受保护模式,并在此模式下进行各种API转换以调用DOS。

  

编译程序时,运行时链接是否在任何文件中?

运行时在运行时(duh)工作,而不是编译时。如果你的意思是,运行时链接文件中的运行时链接:它可能是,例如,它可能链接在可执行文件需要的DLL中。如果你的意思是,编译器链接在运行时文件中:通常是,但它可能有一个标志来禁用它或选择不同的运行时。