独立式环境与宿主式环境————《标准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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arrays类中的binarysearc
- 下一篇: 产品经理是否应该给 UI 设计师的设计稿