關於設備變磚的思考
- 背景
前段時間同事在燒錄軟件時,在uboot模式下將imgaddr變量的值寫成了8010000(正確值應該0x84000000),斷電之後,設備就變磚了,無法啓動。
雖然知道他因爲地址的原因,破壞了flash裏面的數據,但是具體討論起來,發現自己也不是很清楚,從討論中,我也總結出了一些問題。該文章主要是解析這幾個問題點。
- 問題一:flash,RAM,ROM的區別
在和王工分析的過程中,我指着開發板上的flash,如圖:
圖 1
說這個就是保存了我們的固件,裏面包括bootload,firmwave,SQL等信息。之前的地址0x84000000應該是我們firmwave的起始地址,你現在改爲了8010000,地址這麼小,肯定把bootload給破壞了,導致設備起不來了。我對自己的分析感到很滿意,說的頭頭是道。
但是後面有聽到一個硬件專家說bootload應該不會存放在flash中的,一般會內嵌在CPU中,並且一般是無法訪問的,更不可能修改。還有說板子還有另一個flash,如圖:
圖 2
聽到他的這些話,我就產生了一系列問題,好奇害死貓。於是我就向他請教,加上自己在百度的查閱,不能說豁然開朗,但的確揭露了我的盲區,有種撥雲見日的舒心。
首先他說的兩個觀點都是對的。圖1表示的是NOR flash ,圖2表示的是NAND flash。
NOR flash:支持片上運行,但是價格昂貴,並且因爲工藝的原因,相同的容量,NOR flash的體積比NAND flash的要大很多,所以NOR flash在工藝上就註定無法大容量。
NAND flash:不支持片上運行,容量較大以及改寫速度快等優點
通過上面的區分,我們知道uboot 一般是放在NOR flash中,我們的固件一般是放在NAND F lash中。
說到flash,我們就必須要提及一下內存,內存有兩種,RAM,ROM。
ROM:是隻讀存儲器,斷電後數據還在。它不能修改和擦除,只能讀取事先燒錄好的程序,比如電腦的BIOS。用途不是很廣。
RAM:就是我們平時提及的內存,斷電後數據不能保存,讀寫速度很快。如圖:
圖 3
第二點:吳工說有些bootload 是內嵌到CPU的,這個應該是有些產品這樣設計的,但是我目前還沒有遇到過這樣的設計。大部分都是uboot放在NOR flash中,Firmwave存放在NAND Flash中。
- 問題二:爲什麼王工的操作,導致設備變磚?
經過自己的推測和詢問,瞭解到,王工主要是做了以下兩步驟導致的出錯。
tftpboot 0x84000000 xxxx-ipq40xx-single.img
imgaddr=0x8010000 && source $imgaddr:script
第一步:通過tftpboot 將固件下載到內存中的0x84000000這個地址中(虛擬地址)。
第二部:設置環境變量,imgaddr,執行source $imgaddr:script,擦寫NOR flash和NAND Flash。
由於固件的地址在0x84000000,而燒錄的時候,使用的是0x801000(這個地址後面應該都是亂碼)。也就是說,NOR Flash 和NAND Flash此時裏面都是亂碼了。(可能NAND Flash還是正常的,不過NOR Flash肯定是錯誤的了)。之後斷電重啓,NOR Flash的bootload不存在,所以導致啓動不了。
- bootm從內存中啓動firmwave
後面於工的一頓操作,驚豔到了我。那就是他直接在內存中,啓動firmwave.不需要將firmwave燒錄到Flash中。
其實,事後自己思考了一下,覺得這其實也沒有什麼特別之處的。爲什麼呢?
因爲我們設備斷電重啓之後,都是將Flash中的firmwave拷貝到內存,再啓動的。現在這個操作不在是通過Flash的拷貝,而是通過boottftp 下載到內存中。