導航:首頁 > 源碼編譯 > 將編譯器加入目標平台

將編譯器加入目標平台

發布時間:2022-11-18 19:51:46

⑴ 求如何將visual studio 2012的C++編譯器加入到環境變數中,其他程序要用這個編譯器。

有人提取過 vs 2010 的,2012 應該沒什麼改變,你可以照葫蘆畫瓢。www.xdowns.com/soft/38/138/2011/Soft_73814.html

⑵ 如何用編譯器將自己的源代碼轉換成目標代碼

我們使用編譯器將自己的源代碼轉換成目標代碼,
使用鏈接器將我們的目標代碼鏈接成一個可執行程序。另外,
我們使用一些程序在計算機中輸入源代碼文本並且編輯它。這些是最初的和最重要的工具,
它們構成程序員的工具集合或「程序開發環境」。
如果你使用的是命令行窗口,
就像很多專業程序員所做的那樣,
你將不得不自己來編寫編譯和鏈接命令。如果你使用IDE(「互動式開發環境」或「集成式開發環境」),
就像很多程序員所做的那樣,
簡單地點擊正確按鈕就可以完成這個工作。附錄C介紹了如何在你的C++實現中編譯和鏈接。
IDE通常包括一個具有有用特性的編輯器,
例如用不同顏色的代碼來區分你的源代碼中的注釋、
關鍵字和其他部分,
以及其他幫助你來調試代碼、
編譯和運行代碼的功能。調試是發現程序中的錯誤和排除錯誤的活動,
你在前進的道路上會聽到很多有關它的內容。
我們使用微軟的Visual
C++作?喑炭
⒒肪呈道
H綣
頤羌虻サ廝怠氨嘁肫鰲被蚴恰癐DE」的某些部分,
那就是所指Visual
C++系統。但是,
你可以使用一些提供最新的、
符合標準的C++實現的系統。我們所說的大多數內容(經過微小的修改)對所有的C++實現都將是正確的,
並且其代碼可以在任何地方運行。在工作中,
我們使用幾種不同的實現。

⑶ 編譯c#項目,在項目屬性中,平台與目標平台的區別是什麼

這其實是C#編譯器為我們提供的1個 /platform命令行開關選項,
any cpu 為默認選項,它表示最終生成的程序集可以在任何版本的Windows上運行
X86 它表示最終生成的程序集只能在32位Windows版本的X86機器上使用
X64 它表示最終生成的程序集只能在64位Windows版本的X64機器上使用
Itanium(安騰) 它採取了WoW64技術,可以模擬X86指令,也就是允許運行32位Windows應用程序,由這些32位應用程序最終生成的程序集可以在64位Windows版本的IA64機器上使用

⑷ 什麼是編譯器 編譯器是什麼意思

1、編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼→ 預處理器 → 編譯器→ 目標代碼→ 鏈接器→ 可執行程序。

2、編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。

⑸ 編譯器和開發環境的關系

談談程序設計語言、編譯器和開發環境之間的關系

許多初學者都會對這三個概念區分不清,應該說這三個概念是完全不同的,不能混為一談。在本文中,我就盡我最大的能力來講講這三個概念以及他們之間的關系。

首先說程序設計語言,它同人類的自然語言一樣也是一個語言,並且它是自然語言的一個子集。大家都知道自然語言是極其龐大和復雜的系統,具有很多不不確定性和不精確性,因此至今我們也沒有辦法對自然語言進行形式化的描述。程序設計語言只是自然語言的一個很小的子集,在計算機系統中,一切都是需要確定性和精確性的描述,因此程序設計語言也是極為規范的,在程序設計語言中,幾乎就不允許存在不確定性和不精確性,也就是說不能存在文法的二義性。這樣一個程序設計語言就可以通過一系列的產生式來進行形式化的描述,這一系列的產生式就被稱為文法,語言就是由文法來定義的。從另外一個角度來說,一個程序設計語言,它僅僅是一個語言,它只對程序進行形式上的要求。或者說,程序設計語言對應於編程中的編碼階段。我們有必要對程序開發的三個階段進行了解,程序開發從時間先後順序上可以分為三個階段:1.編碼階段,2.編譯階段,3.運行階段。在編碼階段,我們使用的就是程序設計語言。語言除了定義了文法以外,其他的任何事情他都不做。當然一種語言也有很多種版本,比如 BASIC 語言,就有很多種版本,C語言也是如此。這里所講的語言的版本與編譯器的版本是不一樣的。C語言的標准版本就是 ANSI C,如果初學者會提出這樣的問題「C語言哪個更好?」,這樣的問題反映出他們對語言與編譯器之間的關系的認識的不足。如果從語言的角度來講 VC 和 TC 是沒有多大區別的,他們基本上都能支持 ANSI C。

再來看看編譯器。編譯器與語言的關系就是,翻譯者與語言的關系。編譯器就是一個翻譯,他把使用某種語言書寫的源程序,翻譯成為等價的使用目標語言書寫的目標程序。前面我們也說了,語言是一個抽象的概念,是由文法來定義的。唯一實在的東西,也就是定義語言的文法。在使用語言時,我們只能說,使用這種語言去書寫一段程序。編譯器則是能夠將某種語言的源程序進行翻譯,然後生成目標程序。我們通常會說,某個編譯器支持了什麼語言,也就是說這個編譯器能識別並翻譯這種語言。現在的C編譯器,一般都是支持了 ANSI C 語言的,另外,編譯器的設計者可能還會對 ANSI C 進行一定的擴充,而且各個編譯器進行擴充功能都是不同的,因此可能就會出現一個編譯器誕生以後,就會出現一個新的語言的現象。TC 和 VC 就分別對 ANSI C 進行了不同的擴充,比如在 TC 中有 far 等關鍵字,ANSI C 中是沒有的,在 VC 中有內嵌匯編的語法 _asm,而在 TC 中則是使用 asm 關鍵字,這些內容在 ANSI C 中沒有的。編譯器的輸入時源程序,而其輸出則是目標程序。一般情況下,源程序是使用某種高級語言書寫的,而目標程序則是某個特定機器的機器語言程序。另一方面,編譯器除了提供編譯功能,還會提供一些運行庫。所謂運行庫就是由一些事先寫好的子程序所組成的子程序庫。例如C語言中的 printf 函數,就是由C的運行庫提供的。在 ANSI C 中定義了一些C語言的標准庫函數,這些庫函數是標准C必須具備的,也可以說這些庫函數成為了 ANSI C 的一個部分。另外,不同的編譯器還可以提供自己的,非標準的庫給用戶使用,在 TC 中的 Graphics 庫,其實就是由 TC 提供的,它不是屬於 ANSI C 的。簡單的說,編譯器是由編譯程序和運行庫組成的。在程序的編譯階段,就是使用編譯器對源程序進行編譯生成目標程序。

在程序的運行階段則是在一個特定的平台上,由這個平台來執行編譯生成的程序。Java 虛擬機是一個平台,DOS 和 Windows 也是平台,編譯器的作用就是溝通源程序和程序的運行平台。源程序相對於一個運行平台來說是不可識別的,但當編譯器將源程序編譯成為這個平台所能夠識別的目標語言以後,程序就可以在這個平台上運行了。

應該看到,編譯器在其中起到了很重要的作用。我們現在可以明確一些概念了,程序設計語言只是語言,它本身很難說有什麼好壞,這就如同說「漢語和英語哪個好」一樣。使用某一種程序設計語言,我們可以書寫自己的程序,從而向計算機表達自己希望完成的功能。這個階段,我們稱為編碼階段。編譯器由編譯程序和運行庫組成,編譯程序負責將源程序翻譯成為目標程序,運行庫提供了一些基本的子程序給程序編寫者使用。我們可以說編譯器是否支持某種語言,例如 TC 編譯器是支持 ANSI C 的,而 GCC 則是一個能夠支持多種語言的編譯器。然而不同的編譯器除了提供對某種語言的支持以外,還可能對該語言進行了某些功能擴充。編譯器在對語言的支持上,差別都是不太大的,這是因為許多語言都制定了一個標准,例如 ANSI C。編譯器的另外一個重要特性,就是對運行平台的支持。平台指的是一個程序運行所需要的所有軟體和硬體的基礎。編譯器對運行平台的支持,是通過將源程序編譯成為目標程序,以及編譯器所提供的運行庫來實現的。例如,TC只能將C源程序編譯生成,使用 80x86 CPU,操作系統為 DOS 的 16bit DOS 程序。VC只能將C源程序編譯生成 80x86 CPU、操作系統為 Windows 的 32bit Windows 程序。使用編譯器對源程序進行編譯被稱為編譯階段,這個階段編譯程序將源程序編譯為某個平台的目標代碼。程序在具體的平台上運行時,被稱為運行階段。應該指出,在編碼階段使用到的是程序設計語言,以及編譯器所提供的庫函數,這個階段產生的是源程序。在編譯階段使用的是源程序和編譯器,這個階段產生的是目標程序。在運行階段使用到的是目標程序和運行平台,這個時候產生的是程序運行結果。

因此說討論一個程序設計語言好壞沒有多大意義,因為他們使用的場合不同,比如匯編語言和 Java 語言,要談論這兩個語言的好壞是沒有實際意義的。而說「C語言哪個好」之類的話也是沒有意義的,我想大家學的C也就是在 ANSI C 基礎上的C,並且不同的C語言之間的差別是極小的。我們通常指的 TC、VC 都是指編譯器,而不是語言。編譯器能夠支持一種或者多種的程序設計語言,TC 能夠支持 ANSI C,VC 能夠支持 ANSI C 和 ANSI C++,而 GCC 則是一個支持多語言的編譯器。如果真要說 VC 比 TC 好,只能說 VC 編譯器提供的庫函數更多,並且 VC 能夠支持的平台是 Windows,而 VC 編譯出來的代碼也都是 32bit 的。

在以上概念中糾纏了這么久,我也不再想多說了。再來看開發環境。為了能夠方便程序設計者進行編碼、調試等工作,編譯器製造商在製作好一個編譯器以後,都會提供一個集成開發環境(又稱為IDE)。在這個 IDE 中,用戶可以完成編碼、編譯、調試、運行的全部工作。並且在最新的IDE中,可能還會提供一個可視化的設計功能,可以方便用戶進行程序界面的設計。例如 VB 等。另外一個方面,開發環境除了包括 IDE 以外,還包括了程序運行的平台。比如硬體是 IBM PC 兼容機,操作系統是 Windows 等。

可能,能講的也就這么多了,感覺講的並不是很好,不過我已經盡力了。有些東西是很難說清楚的,「只能意會不可言傳」指的就是這個了。不要怪我講的不好,還是自己用心去理解和體會吧。

⑹ 「干貨」嵌入式linux系統移植的四大步驟(上)


在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對於我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對於我們的開發環境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復雜的功能,可是我們有沒有想過,為什麼會有這樣的效果?


如果沒有去追問,只是機械地完成,並且看到實驗效果,這樣做其實並沒有真正的掌握系統移植的本質。


在做每一個步驟的時候, 首先問問自己,為什麼要這樣做,然後再問問自己正在做什麼? 搞明白這幾個問題,我覺得就差不多了,以後不管更換什麼平台,什麼晶元,什麼開發環境,你都不會迷糊,很快就會上手。對於嵌入式的學習方法,我個人方法就是:從宏觀上把握(解決為什麼的問題),微觀上研究(解決正在做什麼的問題),下面以自己學習的arm-cortex_a8開發板為目標,介紹下自己的學習方法和經驗。


嵌入式Linux系統移植主要由四大部分組成:


一、搭建交叉開發環境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統的製作


第一部分:搭建交叉開發環境


先介紹第一分部的內容:搭建交叉開發環境,首先必須得思考兩個問題,什麼是交叉環境? 為什麼需要搭建交叉環境?


先回答第一個問題,在嵌入式開發中,交叉開發是很重要的一個概念,開發的第一個環節就是搭建環境,第一步不能完成,後面的步驟從無談起,這里所說的交叉開發環境主要指的是:在開發主機上(通常是我的pc機)開發出能夠在目標機(通常是我們的開發板)上運行的程序。嵌入式比較特殊的是不能在目標機上開發程序(狹義上來說),因為對於一個原始的開發板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要藉助pc機進行燒錄程序等相關工作,開發板才能跑起來,這里的pc機就是我們說的開發主機,想想如果沒有開發主機,我們的目標機基本上就是無法開發,這也就是電子行業的一句名言:搞電子,說白了,就是玩電腦!


然後回答第二個問題,為什麼需要交叉開發環境?主要原因有以下幾點:


原因 1: 嵌入式系統的硬體資源有很多限制,比如cpu主頻相對較低,內存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬體資源更加豐富,因此利用pc機進行開發會提高開發效率。


原因2: 嵌入式系統MCU體系結構和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標程序才能夠在相應的平台上比如:ARM、MIPS、 POWEPC上正常運行。


交叉開發環境的硬體組成主要由以下幾大部分


1.開發主機
2.目標機(開發板)
3.二者的鏈接介質,常用的主要有3種方式:(1)串口線 (2)USB線 (3)網線


對應的硬體介質,還必須要有相應的軟體「介質」支持:


1.對於串口,通常用的有串口調試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;


2.對於USB線,當然必須要有USB的驅動才可以,一般晶元公司會提供,比如對於三星的晶元,USB下載主要由DNW軟體來完成;


3.對於網線,則必須要有網路協議支持才可以, 常用的服務主要兩個


第一:tftp服務:

主要用於實現文件的下載,比如開發調試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統直接下載到內存中運行,而不需要預先燒錄到Flash晶元中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然後再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數是有限的;另外一方面:測試的目的就是把這些目標文件載入到內存中直接運行就可以了,而tftp就剛好能夠實現這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。


第二: nfs服務:

主要用於實現網路文件的掛載,實際上是實現網路文件的共享,在開發的過程中,通常在系統移植的最後一步會製作文件系統,那麼這是可以把製作好的文件系統放置在我們開發主機PC的相應位置,開發板通過nfs服務進行掛載,從而測試我們製作的文件系統是否正確,在整個過程中並不需要把文件系統燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動後,kernel運行起來後會根據我們設置的啟動參數進行自動掛載,因此,對於開發測試來講,這種方式非常的方便,能夠提高開發效率。


另外,還有一個名字叫 samba 的服務也比較重要,主要用於文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現網路文件的共享,而samba實現的是開發主機上 Windows主機和Linux虛擬機之間的文件共享,是一種跨平台的文件共享 ,方便的實現文件的傳輸。


以上這幾種開發的工具在嵌入式開發中是必備的工具,對於嵌入式開發的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發效率會提高很多。等測試完成以後,就會把相應的目標文件燒錄到Flash中去,也就是等發布產品的時候才做的事情,因此對於開發人員來說,所有的工作永遠是測試。


通過前面的工作,我們已經准備好了交叉開發環境的硬體部分和一部分軟體,最後還缺少交叉編譯器,讀者可能會有疑問,為什麼要用交叉編譯器?前面已經講過,交叉開發環境必然會用到交叉編譯工具,通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程序,開發主機PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。相對於交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。用來編譯這種跨平台程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程序,必須要用交叉編譯工具鏈來完成。

這里又有一個問題,不就是一個交叉編譯工具嗎?為什麼又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調試,對於一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由 編譯器、連接器和解釋器 組成的綜合開發環境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統提供C編譯器)和glibc(一些基本的C函數和其他函數的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。

那麼,如何得到一個交叉工具鏈呢?是從網上下載一個「程序」然後安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標開發平台比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平台,每個平台專門定製一個交叉工具鏈放在網路上,然後供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內核一樣,我們只關心我們需要的東西,編譯我們需要的東西在我們的平台上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的製作方法和系統移植有著很多相似的地方,也就是說,交叉開發工具是一個支持很多平台的工具集的集合(類似於Linux源碼),然後我們只需從這些工具集中找出跟我們平台相關的工具就行了,那麼如何才能找到跟我們的平台相關的工具,這就是涉及到一個如何製作交叉工具鏈的問題了。


通常構建交叉工具鏈有如下三種方法:


方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。


方法二: 通過Crosstool-ng腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。


方法三 : 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。

crosstool-ng是一個腳本工具,可以製作出適合不同平台的交叉編譯工具鏈,在進行製作之前要安裝一下軟體:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然後解壓,接下來就是進行安裝配置了,這個配置優點類似內核的配置。主要的過程有以下幾點:
1. 設定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構架

3. 增加編譯時的並行進程數,以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環境變數
7. 刷新環境變數。
8. 測試交叉工具鏈

到此,嵌入式Linux系統移植四大部分的第一部分工作全部完成,接下來可以進行後續的開發了。



第二部分:bootloader的選擇和移植


01 Boot Loader 概念


就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核准備好正確的環境,他就是所謂的引導載入程序(Boot Loader)。


02 為什麼系統移植之前要先移植BootLoader?


BootLoader的任務是引導操作系統,所謂引導操作系統,就是啟動內核,讓內核運行就是把內核載入到內存RAM中去運行,那先問兩個問題:第一個問題,是誰把內核搬到內存中去運行?第二個問題:我們說的內存是SDRAM,大家都知道,這種內存和SRAM不同,最大的不同就是SRAM只要系統上電就可以運行,而SDRAM需要軟體進行初始化才能運行,那麼在把內核搬運到內存運行之前必須要先初始化內存吧,那麼內存是由誰來初始化的呢?其實這兩件事情都是由bootloader來乾的,目的是為內核的運行准備好軟硬體環境,沒有bootloadr我們的系統當然不能跑起來。

03 bootloader的分類


首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,


由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導程序,而且同時支持X86、ARM和PowerPC等多種處理器架構。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發的用於多種嵌入式CPU的bootloader程序,對於Linux的開發,德國的u-boot做出了巨大的貢獻,而且是開源的。

u-boot具有以下特點:

① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;
其實,把u-boot可以理解為是一個小型的操作系統。

04 u-boot的目錄結構


* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;

05 u-boot的工作模式


U-Boot的工作模式有 啟動載入模式和下載模式 。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。 下載模式 就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的SDRAM中運行,用戶可以利用Bootloader提供的一些令介面來完成自己想要的操作,這種模式主要用於測試和開發。

06 u-boot的啟動過程


大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。


1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鍾頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。


2、 stage2(C語言代碼部分)

lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。

07 基於cortex-a8的s5pc100bootloader啟動過程分析


s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:


1. S5PC100 USB啟動過程

[1] A8 reset, 執行iROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到4對面),判斷從哪裡啟動(USB)
[3] iROM中的程序會初始化USB,然後等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續接管A8, 然後等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader

2. S5PC100 Nandflash啟動過程

[1] A8 reset, 執行IROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到靠4那邊),判斷從哪裡啟動(Nandflash)
[3] iROM中的程序驅動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然後拷貝完整的BootLoader到SDRAM並運行
[6] BootLoader拷貝內核到SDRAM,並運行它
[7] 內核運行起來後,掛載rootfs,並且運行系統初始化腳本

08 u-boot移植(基於cortex_a8的s5pc100為例)


1.建立自己的平台

(1).下載源碼包2010.03版本,比較穩定
(2).解壓後添加我們自己的平台信息,以smdkc100為參考版,移植自己s5pc100的開發板
(3).修改相應目錄的文件名,和相應目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平台進行相應的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).「開關」相應的宏定義
(7).添加Nand和網卡的驅動代碼
(8).優化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設置環境變數,即啟動參數,把編譯好的u-boot下載到內存中運行,過程如下:
1. 配置開發板網路
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內存的環境變數
$saveenv 保存環境變數的值到nandflash的參數區

網路測試:
在開發開發板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)

如果網路測試失敗,從下面幾個方面檢查網路:
1. 網線連接好
2. 開發板和虛擬機的ip地址是否配置在同一個網段
3. 虛擬機網路一定要採用橋接(VM--Setting-->option)
4. 連接開發板時,虛擬機需要設置成 靜態ip地址

2. 在開發板上,配置tftp伺服器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發板內存
$ tftp 20008000(內存地址即可) u-boot.bin(要下載的文件名)

如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務啟動失敗,重啟tftp服務
#sudo service tftpd-hpa restart

5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區域
$nand write 20008000((緩存u-boot.bin的內存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)

6. 切換開發板的啟動方式到nandflash
1. 關閉開發板
2. 把SW1的開關4撥到4的那邊
3. 啟動開發板,它就從nandflash啟動

⑺ 編譯器如何指定cpu類型

只有完整的 Visual Studio 產品才支持此優化。
「目標 CPU」(C# 中為「平台目標」
)項目屬性指定編譯器是否應針對特定的 CPU 類型(如 64 位處理器)優化編譯。
可以將目標平台設置為所有 CPU 類型或 x86、x64 或 Itanium 之類的特定 CPU 類型。
默認情況下,此選項設置為「AnyCPU」(C# 中為「Any CPU」
),以指定編譯器不針對特定的 CPU 類型優化編譯。
注意對於在以下說明中使用的某些 Visual Studio 用戶界面元素,您的計算機可能會顯示不同的名稱或位置。

⑻ 匯編語言的編譯器是運行在什麼平台上

我知道 我回答了很多問題 都沒回復 沒意思了 我很失望 不回答了
去看編譯原理就明白了
好吧那我就告訴你吧
實際上裸機可以運行任何軟體
為什麼一定要在操作系統上運行
就是為了解決應用程序對硬體編程的復雜性 所以操作系統提供了編程介面 就是系統調用 應用程序直接調用操作系統的介面要比直接對硬體編程簡單的多 著就是操作系統其一的功能
你想知道匯編器和操作系統 是如何實現的嗎
我也知道
第一個匯編器其實 是人工翻譯的 就是看CPU廠家的手冊進行翻譯的 後來就把人工翻譯的過程 用計算機來實現就成了匯編器 第一個匯編器是人工翻譯成機器語言的 在計算機上運行的功能很有限 用這個功能很有限的匯編器 去編譯一個功能強大的匯編程序 在用這個匯編器去編譯匯編語言寫的C語言編譯程序 就這樣慢慢就發展成了今天的非常復雜的編譯器
操作系統是如何實現的那 我也知道
沒心情在說了

⑼ 32 位支持:使用 GCC 交叉編譯

如果你是一個開發者,要創建二進制軟體包,像一個 RPM、DEB、Flatpak 或 Snap 軟體包,你不得不為各種不同的目標平台編譯代碼。典型的編譯目標包括 32 位和 64 位的 x86 和 ARM。你可以在不同的物理或虛擬機器上完成你的構建,但這需要你為何幾個系統。作為代替,你可以使用 GNU 編譯器集合 ( GCC ) 來交叉編譯,在單一的構建機器上為幾個不同的 CPU 架構產生二進制文件。

假設你有一個想要交叉編譯的簡單的擲骰子 游戲 。在大多數系統上,以 C 語言來編寫這個相對簡單,出於給添加現實的復雜性的目的,我以 C++ 語言寫這個示例,所以程序依賴於一些不在 C 語言中東西 (具體來說就是 iostream)。

在你的系統上使用 g++ 命令編譯它:

然後,運行它來確認其工作:

你可以使用 file 命令來查看你剛剛生產的二進制文件的類型:

同樣重要,使用 ldd 命令來查看它鏈接哪些庫:

從這些測試中,你已經確認了兩件事:你剛剛運行的二進制文件是 64 位的,並且它鏈接的是 64 位庫。

這意味著,為實現 32 位交叉編譯,你必需告訴 g++ 來:

為編譯成 32 位二進制,你需要在你的系統上安裝 32 位的庫和頭文件。如果你運行一個純 64 位系統,那麼,你沒有 32 位的庫或頭文件,並且需要安裝一個基礎集合。最起碼,你需要 C 和 C++ 庫(glibc 和 libstdc++)以及 GCC 庫(libgcc)的 32 位版本。這些軟體包的名稱可能在每個發行版中不同。在 Slackware 系統上,一個純 64 位的帶有 32 位兼容的發行版,可以從 Alien BOB 提供的 multilib 軟體包中獲得。在 Fedora、CentOS 和 RHEL 系統上:

不管你正在使用什麼系統,你同樣必須安裝一些你工程使用的 32 位庫。例如,如果你在你的工程中包含 yaml-cpp,那麼,在編譯工程前,你必需安裝 yaml-cpp 的 32 位版本,或者,在很多系統上,安裝 yaml-cpp 的開發軟體包(例如,在 Fedora 系統上的 yaml-cpp-devel)。

一旦這些處理好了,編譯是相當簡單的:

-m32 標志告訴 GCC 以 32 位模式編譯。-march=i686 選項進一步定義來使用哪種最優化類型(參考 info gcc 了解選項列表)。-L 標志設置你希望 GCC 來鏈接的庫的路徑。對於 32 位來說通常是 /usr/lib,不過,這依賴於你的系統是如何設置的,它可以是 /usr/lib32,甚至 /opt/usr/lib,或者任何你知道存放你的 32 位庫的地方。

在代碼編譯後,查看你的構建的證據:

接著,當然, ldd ./dice32 也會指向你的 32 位庫。

在 64 位相同的處理器家族上允許 GCC 做出很多關於如何編譯代碼的假設來編譯 32 位軟體。如果你需要為完全不同的處理器編譯,你必需安裝適當的交叉構建實用程序。安裝哪種實用程序取決於你正在編譯的東西。這個過程比為相同的 CPU 家族編譯更復雜一點。

當你為相同處理器家族交叉編譯時,你可以期待找到與 32 位庫集的相同的 64 位庫集,因為你的 Linux 發行版是同時維護這二者的。當為一個完全不同的架構編譯時,你可能不得不窮追你的代碼所需要的庫。你需要的版本可能不在你的發行版的存儲庫中,因為你的發行版可能不為你的目標系統提供軟體包,或者它不在容易到達的位置提供所有的軟體包。如果你正在編譯的代碼是你寫的,那麼你可能非常清楚它的依賴關系是什麼,並清楚在哪裡找到它們。如果代碼是你下載的,並需要編譯,那麼你可能不熟悉它的要求。在這種情況下,研究正確編譯代碼需要什麼(它們通常被列在 README 或 INSTALL 文件中,當然也出現在源文件代碼自身之中),然後收集需要的組件。

例如,如果你需要為 ARM 編譯 C 代碼,你必須首先在 Fedora 或 RHEL 上安裝 gcc-arm-linux-gnu(32 位)或 gcc-aarch64-linux-gnu(64 位);或者,在 Ubuntu 上安裝 arm-linux-gnueabi-gcc 和 binutils-arm-linux-gnueabi。這提供你需要用來構建(至少)一個簡單的 C 程序的命令和庫。此外,你需要你的代碼使用的任何庫。你可以在慣常的位置(大多數系統上在 /usr/include)放置頭文件,或者,你可以放置它們在一個你選擇的目錄,並使用 -I 選項將 GCC 指向它。

當編譯時,不使用標準的 gcc 或 g++ 命令。作為代替,使用你安裝的 GCC 實用程序。例如:

驗證你構建的內容:

這是一個如何使用交叉編譯的簡單的示例。在真實的生活中,你的源文件代碼可能產生的不止於一個二進制文件。雖然你可以手動管理,在這裏手動管理可能不是好的正當理由。在我接下來的文章中,我將說明 GNU 自動工具,GNU 自動工具做了使你的代碼可移植的大部分工作。

via: https://opensource.com/article/19/7/cross-compiling-gcc

作者: Seth Kenlon 選題: lujun9972 譯者: robsean 校對: wxy

閱讀全文

與將編譯器加入目標平台相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:761
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:837
安卓怎麼下載60秒生存 瀏覽:796
外向式文件夾 瀏覽:228
dospdf 瀏覽:424
怎麼修改騰訊雲伺服器ip 瀏覽:380
pdftoeps 瀏覽:486
為什麼鴻蒙那麼像安卓 瀏覽:730
安卓手機怎麼拍自媒體視頻 瀏覽:180
單片機各個中斷的初始化 瀏覽:717
python怎麼集合元素 瀏覽:475
python逐條解讀 瀏覽:827
基於單片機的濕度控制 瀏覽:492
ios如何使用安卓的帳號 瀏覽:877
程序員公園采訪 瀏覽:805
程序員實戰教程要多長時間 瀏覽:968
企業數據加密技巧 瀏覽:128
租雲伺服器開發 瀏覽:807
程序員告白媽媽不同意 瀏覽:330
攻城掠地怎麼查看伺服器 瀏覽:595