独立式环境与宿主式环境————《标准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】

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

  1. 抄书(标准C语言指南)

    1.7 输入和输出 C有完善的数据和控制流处理机制,但并不提供任何输入/输出手段.因此,为了实现这样的目的,往往需要借助于机器语言.汇编语言,或者调用为特定设备而编写的库函数.如果程序是在宿主式环境下 ...

  2. 转换环境与执行环境、宿主环境与独立环境、宿主实现与独立实现

    文章目录 1 转换环境与执行环境 1.1 转换环境与执行环境的概念 1.2 为什么要区分转换环境和执行环境 2 宿主环境和独立环境 2.1 宿主环境 2.2 独立环境 3 宿主实现.独立实现 3.1 ...

  3. windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署

    windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署 [背景]最近需要在windows server 2012上,使用nginx+ nginx-http-flv- ...

  4. 系统无法执行指定的程序。_使用Rust编写操作系统(一):独立式可执行程序

    创建一个不连接标准库的Rust可执行文件,将是我们迈出的第一步.无需底层操作系统的支撑,这将能让在裸机(bare metal)上运行Rust代码成为现实. 简介 要编写一个操作系统内核,我们需要不基于 ...

  5. FF300R08W2P2B11A 汽车用EasyPACK 模块 2 个独立式

    FF300R08W2汽车用EasyPACK 2B EDT2模块紧凑.灵活,一体式隔离设计,适用于混合动力和电动汽车的主逆变器.EDT2 IGBT允许750V的阻断电压和300A的IcN.FF300R0 ...

  6. c语言开发运动控制系统,独立式运动控制器的可编程实现技术

    摘要: 目前,基于计算机标准总线(如PCI,ISA总线)的运动控制器大多采用在高级编程语言环境(如VC)中调用API接口函数的使用方式,但随着运动控制器的硬件功能越来越强大(同时控制多个插补轴),以及 ...

  7. Redis-学习笔记01【Redis环境搭建】

    Java后端 学习路线 笔记汇总表[黑马程序员] Redis-学习笔记01[Redis环境搭建] Redis-学习笔记02[Redis命令操作] Redis-学习笔记03[Redis持久化] Redi ...

  8. RN学习笔记01:概述、特点与环境搭建

    RN学习笔记01:概述.特点与环境搭建 一.RN概述 React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 Reac ...

  9. 2021-2025年中国独立式梳妆浴缸行业市场供需与战略研究报告

    独立式梳妆浴缸市场的企业竞争态势 该报告涉及的主要国际市场参与者有Doctorgimo.Shor-Line.Surgicalory.Groomer's Best.Master Equipment.Pe ...

最新文章

  1. [Quiz]竞赛题目 Word Trace
  2. android 信息添加附件功能,Android实现带附件的邮件发送功能
  3. html之四种方法导入css...
  4. numpy中的clip函數的用法
  5. Different Integers
  6. 数据库实验一(MySQL基本操作命令总结)
  7. python列表大于60_Python使用filter如何对给定列表中的数字进行过滤,保留大于等于60的数字?...
  8. 用友u8 12.1服务器硬件要求,用友U8-12.1安装操作手册(服务器)
  9. 春眠不觉晓,Kubernetes知多少
  10. 一步一步教你 https 抓包
  11. 强制删除被占用文件 windows
  12. 监听pda扫描_uniapp App监听PDA扫描工具数据
  13. 基于JESD204B的LMK04826时钟芯片开发笔记
  14. c#如何使用webservice、存储过程及存储过程的创建(简单模仿类似QQ统计用户在线时间为例)
  15. Django DTL 加减乘除求余
  16. MOOC人工智能原理学习笔记1
  17. CS224n Assignment4解读 · 上
  18. ApeCoin计划推出自己的区块链,Messari分析师们怎么看?
  19. 【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用法比较
  20. 记一次Kafka warning排查过程

热门文章

  1. 动态规划之矩阵连乘讲解
  2. hdu 3065 病毒侵袭持续中(AC自动机)
  3. 用sqlSessionFactoryBeanName而不用sqlSessionFactory的原因
  4. redis 基本类型和命令(一)
  5. 数论-扩展中国剩余定理
  6. Java 第7章 数组
  7. android内部通信handler
  8. Win7下程序结束为何没有调用 DLL_PROCESS_DETACH?
  9. Python学习笔记:第三方模块2
  10. JVM学习01总体概述