您的位置:首页 > 编程语言 > C语言/C++

独立式环境与宿主式环境————《标准C语言指南》读书笔记01

2016-03-15 22:37 239 查看

独立式环境与宿主式环境————《标准C语言指南》读书笔记01

在编写和转换一个C程序之前,需要考虑它的执行环境,因为这关系到源文件的内容(程序应当如何编写),也关系到转换后的程序能否正常执行。通常有两种不同的执行环境,分别是独立式环境(freestanding environment)和宿主式环境(hosted environment)。

这两种环境的划分基于C在不同领域里的广泛应用。在很多情况下,可能没有操作系统,或者从操作系统那里得到的支持有限,又或者正在编写一个操作系统。此时,要求程序能独立自主地执行。在这方面,典型的例子包括仪器仪表的固件、控制器等嵌入式领域里的设备。

在宿主式环境下,程序的加载、执行和终止通常要受操作系统的控制和调度,并允许使用操作系统提供的各种功能和组件,比如文件系统。

举例来说,如果制作了一个带有处理器的数字电路,并想用C编写一个程序来直接驱动它工作(前提是存在一个针对该处理器的C的实现,能够生成被该处理器识别和执行的机器代码),那么,这个简单的电路就是独立式环境;如果想写一个能在Windows下运行的窗口程序,那么,Windows连同运行它的硬件就构成了宿主式环境。

以上文字摘自《标准C语言指南》(电子工业出版社)的1.3.2节“执行环境”。

一天有个同事说“C程序的执行是从main函数开始的”。另一个同事反驳道:“对于有操作系统的,C程序从main函数开始执行;对于没有操作系统的,比如单片机上的程序,就不是从main函数开始的。”乍一听,后面这个同事说得有道理,可是仔细想想,其实也不然。

不管是宿主式环境还是独立式环境,C程序的执行都不是从main函数开始的。

在宿主式环境下运行的程序,它不仅仅包含了由源文件的内容所生成的代码,也包括一些和宿主(比如操作系统)交互的代码,这些代码用于做一些初始化(运行前准备)和清理工作。

举个最简单的例子,比如在Linux上用GCC编译一个输出“Hello World”的源程序,整个程序的入口点是crt1.o中提供的_start,它首先做一些初始化工作,然后调用C代码中提供的main函数。所以,说main函数是程序的入口点其实不准确。在这个例子中,_start才是真正的入口点,而main函数是被_start调用的。

对于独立式环境,道理类似。在我们编写的main函数执行之前,总要做一些初始化的工作。比如我们在Keil环境下开发cortex-M3平台上的程序,一般会有一个启动文件,假设是ST公司提供的启动文件“stm32f10x_vector.s”,其中有一行

LDR R0, =__main ;


这里的
__main
不是我们通常定义的那个main函数,而是C运行时库(C run-time library)里的一个初始化子程序。该程序的一个主要作用是初始化堆栈,并初始化映像文件,最后跳转到C程序中的main函数。

【end】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: