独立式环境与宿主式环境————《标准C语言指南》读书笔记01
独立式环境与宿主式环境————《标准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相关推荐
- 抄书(标准C语言指南)
1.7 输入和输出 C有完善的数据和控制流处理机制,但并不提供任何输入/输出手段.因此,为了实现这样的目的,往往需要借助于机器语言.汇编语言,或者调用为特定设备而编写的库函数.如果程序是在宿主式环境下 ...
- 转换环境与执行环境、宿主环境与独立环境、宿主实现与独立实现
文章目录 1 转换环境与执行环境 1.1 转换环境与执行环境的概念 1.2 为什么要区分转换环境和执行环境 2 宿主环境和独立环境 2.1 宿主环境 2.2 独立环境 3 宿主实现.独立实现 3.1 ...
- windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署
windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署 [背景]最近需要在windows server 2012上,使用nginx+ nginx-http-flv- ...
- 系统无法执行指定的程序。_使用Rust编写操作系统(一):独立式可执行程序
创建一个不连接标准库的Rust可执行文件,将是我们迈出的第一步.无需底层操作系统的支撑,这将能让在裸机(bare metal)上运行Rust代码成为现实. 简介 要编写一个操作系统内核,我们需要不基于 ...
- FF300R08W2P2B11A 汽车用EasyPACK 模块 2 个独立式
FF300R08W2汽车用EasyPACK 2B EDT2模块紧凑.灵活,一体式隔离设计,适用于混合动力和电动汽车的主逆变器.EDT2 IGBT允许750V的阻断电压和300A的IcN.FF300R0 ...
- c语言开发运动控制系统,独立式运动控制器的可编程实现技术
摘要: 目前,基于计算机标准总线(如PCI,ISA总线)的运动控制器大多采用在高级编程语言环境(如VC)中调用API接口函数的使用方式,但随着运动控制器的硬件功能越来越强大(同时控制多个插补轴),以及 ...
- Redis-学习笔记01【Redis环境搭建】
Java后端 学习路线 笔记汇总表[黑马程序员] Redis-学习笔记01[Redis环境搭建] Redis-学习笔记02[Redis命令操作] Redis-学习笔记03[Redis持久化] Redi ...
- RN学习笔记01:概述、特点与环境搭建
RN学习笔记01:概述.特点与环境搭建 一.RN概述 React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 Reac ...
- 2021-2025年中国独立式梳妆浴缸行业市场供需与战略研究报告
独立式梳妆浴缸市场的企业竞争态势 该报告涉及的主要国际市场参与者有Doctorgimo.Shor-Line.Surgicalory.Groomer's Best.Master Equipment.Pe ...
最新文章
- [Quiz]竞赛题目 Word Trace
- android 信息添加附件功能,Android实现带附件的邮件发送功能
- html之四种方法导入css...
- numpy中的clip函數的用法
- Different Integers
- 数据库实验一(MySQL基本操作命令总结)
- python列表大于60_Python使用filter如何对给定列表中的数字进行过滤,保留大于等于60的数字?...
- 用友u8 12.1服务器硬件要求,用友U8-12.1安装操作手册(服务器)
- 春眠不觉晓,Kubernetes知多少
- 一步一步教你 https 抓包
- 强制删除被占用文件 windows
- 监听pda扫描_uniapp App监听PDA扫描工具数据
- 基于JESD204B的LMK04826时钟芯片开发笔记
- c#如何使用webservice、存储过程及存储过程的创建(简单模仿类似QQ统计用户在线时间为例)
- Django DTL 加减乘除求余
- MOOC人工智能原理学习笔记1
- CS224n Assignment4解读 · 上
- ApeCoin计划推出自己的区块链,Messari分析师们怎么看?
- 【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用法比较
- 记一次Kafka warning排查过程