題:
為什麼我們需要一個與我們的微控制器應用程序分開的引導程序?
alt-rose
2019-07-02 18:12:07 UTC
view on stackexchange narkive permalink

為什麼在微控制器的同一閃存程序存儲器中需要一個單獨的程序,特別是STM32F103,稱為引導加載程序?

將其與主應用程序分開的特殊之處是什麼?

通常來說,基於微處理器的系統(例如PowerPC MPC8270)的引導加載程序執行的工作是否與微控制器(例如ARM STM32F103)的引導程序執行相同的工作?'bootloader'?

同樣的原因,您需要單獨的芯片和零件,而不是一個巨大的整體結構
你不知道只需使用計算機控制台上的開關和指示燈輸入程序即可。
嚴格來說,您在微控制器上不需要單獨的引導程序。但是我們通常會選擇為其提供的其他實用程序功能使用一個。如果不需要這些功能,則可以刪除引導加載程序。微控制器自舉程序通常用於將新程序刻錄到閃存中。有時可以將其用於調試功能,某些支持斷點和其他功能強大的功能。在微型計算機上,引導加載程序通常會從大容量存儲器中加載程序,並且在那兒將是必需的。
八 答案:
CurtisHx
2019-07-02 18:22:59 UTC
view on stackexchange narkive permalink

微控制器上的引導加載程序負責通過通訊通道(而不是編程頭)更新主固件。這對於通過BLE,UART,I2C,SD卡,USB等在現場更新固件非常有用。要求客戶購買編程器僅用於更新其設備上的固件,將非常不便。

Bootloader分開存放的原因是出於可靠性考慮。引導加載程序和應用程序代碼位於閃存的不同部分,因此引導加載程序可以擦除並重寫應用程序代碼,而無需更改與引導加載程序代碼相關的任何內容。

如果將引導加載程序和應用程序放在一起,則必須將引導加載程序代碼複製到RAM才能運行,因為任何固件更新都會擦除閃存中的引導加載程序代碼。如果通過RAM中的引導加載程序代碼斷電並且擦除了閃存,則設備將變磚。

我們的原因是相同的。它們位於同一閃存中,但引導加載程序對齊閃存時,它們的邊界是擦除的,並且足夠聰明,只能擦除比其自身地址高的閃存。
因此,對於STM32F103 MCU和Keil或GCC編譯器,首先將執行startup.s文件,然後將控制權傳遞給bootloader,一旦bootloader返回控件,它將進入main()應用程序。如果我的理解有誤,請糾正我。
在某些情況下,微處理器的編程標頭實際上可能是不可訪問的,而不必拆卸產品的底盤,因此無需額外的硬件就能夠通過通信總線對其進行重新編程是可靠性的關鍵因素。
@alt-rose引導程序和應用程序是單獨編譯的程序,每個程序都有自己的啟動代碼和`main()`函數。開機時,引導加載程序啟動代碼將運行並調用引導加載程序的`main()`。引導加載程序檢查有效的應用程序,然後跳轉到應用程序的啟動代碼,該代碼調用應用程序的“ main()”。每個程序的啟動代碼都會為各自的程序初始化C運行時環境(即,初始化變量,堆棧等),通常,程序的“ main()”都不會返回到啟動代碼。
@kkrambo如果引導加載程序和應用程序都分別編譯,那麼引導加載程序如何知道應用程序啟動代碼的起始地址?
@alt-rose:與CPU獲取引導加載程序的起始地址的方式相同-不會。取而代之的是,CPU指定它將用作引導加載程序的起始地址的內容,而引導加載器則指定它將用作應用程序的起始地址的內容。
@kkrambo儘管通常是正確的,但也沒有要求(也不是全球通用的事實)完全使用C或C派生的語言(帶有main)來編寫引導加載程序。
@alt-rose應用程序的起始地址由開發人員在設計時確定。然後可以將其硬編碼到引導加載程序中,以便引導加載程序知道應用程序從何處啟動。引導加載程序還需要知道應用程序的位置,以便它可以驗證或更新應用程序。
user4574
2019-07-02 23:21:17 UTC
view on stackexchange narkive permalink
  1. 以便加載過程可以從錯誤中恢復。 假設在升級期間出現通信錯誤或電源斷開。如果引導加載程序是您要升級的應用程序的一部分,那麼用戶將無法在不使用特殊硬件重新刷新到引導加載程序的情況下再次嘗試。

  2. 某些微控制器無法從RAM執行代碼。如果將引導加載程序與軟件的其餘部分混在一起,則實際上將無法升級軟件,因為您無法擦除當前正在執行的閃存頁面。解決方法是先將新代碼刻錄到閃存的後半部分,然後再跳轉到閃存的後半部分。然後,新代碼將自身複製到閃存的前半部分。當然,不利的一面是,刻錄閃存通常速度較慢,現在您必須將其刻錄兩次,因此加載過程可能要花兩倍的時間。同樣,此替代方法將您的應用程序大小限制為不超過閃存總數的一半。

  3. 寫得很好的引導加載程序會嘗試在執行設備之前驗證設備上是否存在有效的代碼。如果將引導加載程序和其他代碼混合在一起,那麼如何確定如果所有代碼都未加載,您的驗證例程將起作用?

  4. 身份驗證。安全啟動加載程序會在執行之前嘗試驗證加載的應用程序是否與數字簽名匹配。但是,如果將引導加載程序和其他代碼混合在一起,則您將無法控制設備上運行的內容,因為一旦用戶加載了新代碼,您就無法控制啟動時會發生什麼。

  5. ol>
作為第2點的示例,某些微控制器甚至在啟動時甚至沒有*可訪問的RAM:例如[Raspberry Pi](https://raspberrypi.stackexchange.com/questions/10489/how-does-raspberry-pi-boot)使用其GPU從SD卡加載引導加載程序,然後啟用ARM處理器和內存。
Colin
2019-07-02 18:21:40 UTC
view on stackexchange narkive permalink

通常它們在這裡是為了允許您更新主應用程序。

您需要一些知道如何擦除和重新編程一些內部閃存的代碼,這些代碼不能成為主程序,因為一旦擦除自身,就無法重新編程。

CrossRoads
2019-07-02 18:25:41 UTC
view on stackexchange narkive permalink

引導加載程序允許MCU與其他設備進行通信,以接受新程序,對其進行存儲並在重置後運行該程序。如果您沒有引導程序,則需要使用Programmer來訪問內存並將程序放置在適當的位置。

就是這樣。MCU只能通過特殊的編程子系統(例如AVRICE或JTAG)或已經在閃存中包含引導加載程序來獲取代碼。引導加載程序的複雜程度由應用程序決定,例如有些系統可以從WiFi加載代碼。 在像ATTiny這樣的低端MCU上,引導加載程序(和串行引腳)的開銷很大,因此您總是使用編程器。
Nate S.
2019-07-02 22:20:02 UTC
view on stackexchange narkive permalink

除了其他有關允許從引導加載程序對主固件進行重新編程的正確答案之外,使引導加載程序獨立的另一個好處是,您可以在邏輯上將“啟動時執行”任務與運行時所需的代碼分開。然後,在引導加載程序完成其初始配置任務後,主固件可以使用其所有不再需要的代碼從內存中逐出引導加載程序,從而節省了大量的RAM空間。可以通過其他方式實現此目的,但是引導加載程序/固件的拆分使它在許多體系結構上都變得更加容易。

在微控制器上,代碼很可能永遠不會存儲在RAM中,因此無法將其逐出。您當然可以從RAM中丟棄引導加載程序的數據。
@BenVoigt,取決於微控制器。有些(主要是使用NOR閃存的)可以讓您直接從閃存中執行,而其他一些(通常是使用NAND閃存,這種情況越來越普遍)要求您在RAM之外執行。有時甚至沒有板載閃存,您必須先將外部閃存芯片中的代碼複製到本地SRAM中,然後才能執行任何操作。
Yakk
2019-07-05 01:31:23 UTC
view on stackexchange narkive permalink

最簡單的答案是因為軟件很棒。

引導加載程序所做的一切可能都是“純硬件”。但是,將引導加載程序確實以軟件形式編寫然後由硬件解釋的任務要容易得多。

這些任務可能涉及為要運行的“真實”軟件設置硬件(例如,在 Raspberry Pi上(通過@ErikF)),並具有替換“真實”軟件的協議。程序運行之前(檢查某個引腳,如果該引腳已設置,則重新刷新真實程序),甚至為“真實”程序設置軟件環境。

在較少規模的軟件上,當您運行可執行文件時,應用程序加載器會移動某些內容,例如將部分數據加載到內存中,有時會修復地址,為主要或其他全局內容設置參數,並旋轉提供的OS庫,然後跳轉到 _main 代碼的開頭。其中一些事情可以由引導加載程序完成。

在微控制器中,引導加載程序執行的某些任務可以分解為程序。您平台的編譯器可以自動將“設置”代碼注入到每個可執行文件中。

但是,在引導加載程序中使用它意味著同一個編譯器可以在不同的硬件上工作,因為引導加載程序可以“隱藏”平台之間的差異。

最重要的是,只要刷新主程序就不會冒引導程序的風險(以及重新刷新主程序的能力),並且擁有一個普通的引導程序是一件很棒的事。

BitShift
2019-07-04 10:50:53 UTC
view on stackexchange narkive permalink

一個尚未涵蓋的答案是,需要分離有關啟動代碼的關注點。

這樣做是為了設置某些特定內容,例如:

  • 分配C堆棧
  • 將堆棧指針讀入寄存器
  • 將程序計數器讀入寄存器
  • 聲明重置向量
  • 將第二階段(initramfs)加載到RAM。

這是所採取步驟的非常粗略的近似,我正在描述ARM引導過程,對於x86和其他體系結構,它又有所不同。

但是,原理仍然是相同的:分配C堆棧必須通過彙編完成。

為什麼要投票?這既相關又準確。
我沒做但是我想這是因為您在這裡描述的是啟動代碼的工作,而不是引導加載程序。(實際上,提到的設備中的引導加載程序很可能具有自己的啟動代碼,然後應用程序再次執行相同的工作...)(並且...在stm32f103上,您將沒有initramfs ...)
公平。我已指定我在談論啟動代碼。
Dakkaron
2019-07-04 14:36:54 UTC
view on stackexchange narkive permalink

到目前為止,尚未解決的問題之一是微控制器和微處理器系統上的引導加載程序之間的區別。

微控制器

大多數微控制器都具有包含其程序代碼的內置ROM存儲器。更改此代碼通常需要連接到微控制器編程接口的編程器設備(例如,ATMega上的ISP)。但是,與其他接口相比,這些編程接口通常通常不太方便使用,因為在給定的上下文中它們可能不容易使用。因此,例如,雖然幾乎每台計算機都具有USB端口,但ISP所需的SPI接口要少得多,而其他接口(如ATXMega上使用的PID接口)僅受專用編程硬件支持。

因此,例如,如果您想從沒有任何外部硬件的常規計算機上更新軟件,則可以使用從另一種接口(例如,像Arduino上的RS232,USB或USB上的RS232)讀取的引導加載程序來通過通用接口對設備進行編程。

也就是說,如果您不需要此功能,則引導加載程序是完全可選的。無需引導加載程序,微控制器仍可以完全運行其代碼。

微處理器

在微處理器上,情況有所不同。儘管大多數微處理器都具有足夠用於引導加載程序的ROM,但這些ROM的容量不足以容納完整的OS。因此,引導加載程序的目的是初始化硬件,尋找可引導的操作系統,加載並運行它。因此,引導加載程序對於每次引導都至關重要。

在x86 / x64系統上,此引導程序是BIOS或UEFI(基本上是BIOS的較新版本)。

有時,您甚至可能有多個引導程序在鏈中運行。例如,如果您具有Windows和Linux的雙引導系統,則可能會得到以下結果:

  • BIOS / UEFI引導並找到已安裝的GRUB。然後加載GRUB(= Grand Unified Bootloader)
  • GRUB找到了某種Linux和Windows Bootloader。用戶選擇Windows Bootloader。
  • Windows引導加載程序將啟動,並找到已安裝的Windows 7和Windows 10。用戶選擇Windows 10。
  • Windows 10最終啟動。

因此,在這種情況下,可以將三個軟件視為引導加載程序。GRUB和Windows Bootloader大多都在這裡,為用戶提供比BIOS / UEFI給他們的引導選擇更方便的選擇。它還允許從同一硬盤驅動器甚至同一分區啟動多個操作系統。

TLDR

因此,儘管在兩種系統中,引導加載程序都執行類似的操作(幫助用戶選擇要引導的代碼),但是兩者在實現方式和精確執行方式上都存在很大差異。

雖然區分具有足夠隨機訪問非易失性存儲(ROM或閃存)以容納整個程序的系統與需要從RAM運行代碼的系統是有用的,但存在兩種類型的微控制器和兩種類型的微處理器。
當然,微控制器和微處理器之間的區別不是硬邊界,並且某些微控制器的行為更像微處理器,反之亦然。這就是為什麼我以AtMega / Arduino和x86 / x64為例,因為它們的行為方式如此。
“微處理器具有足夠大的ROM用於引導加載程序...在x86 / x64系統上,該引導加載程序是BIOS或UEFI”。BIOS或UEFI存儲在片外閃存中。片上ROM甚至用於較低級別的功能,例如微代碼的初始化。
@Dakkaron:我將根據芯片是否設計為可用於非瑣碎用途而不在地址總線上放置其他東西,來在微處理器和微控制器之間劃清界限。8031不具備*功能*,但它在功能上沒有指定* 8051(絕對是微控制器)*在內部ROM中具有任何有用的功能,否則將被設計為完全可用於內部存儲)。即使RCA / CDP 1802可用於驅動LED名稱標籤,也無法勝任...
...沒有外部RAM和ROM,因為無RAM /無ROM設計僅限於瑣碎的任務。TMS 32050之類的東西,如果我還記得有一個引導程序,並且內部有數千個字的16位RAM,就可以用作微控制器。儘管許多應用程序需要更多的內存,但如果通過UART連接到另一個系統,則可以在沒有任何內存總線的情況下滿足多種用途。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...