1. 程式人生 > >關於S3C2440開發板Nand flash程式燒寫和執行的一些理解

關於S3C2440開發板Nand flash程式燒寫和執行的一些理解

這兩天剛開始學習ARM9的裸機程式設計和Linux系統移植,在燒寫Nand flash記憶體的時候對一些指定的地址產生了疑惑。

我看過很多教學視訊,他們在燒寫程式到Nand flash的時候一般會指定一個地址0X3000_0000,而S3C2440的官方手冊上指明瞭0X3000_0000地址對應的片內外設是SDRAM。這不禁讓我產生了疑問。明明是指定了SDRAM卻燒寫到了Nand flash,為什麼?

為了解決我的疑惑,在網上看了很多人的解釋,這不僅解開了我的疑惑,還引出了許多相關知識點。

要解答這個問題,首先要從Nand flash本身的結構說起。Nand flash的結構和RAM不一樣,它的資料線是複用的,內與足夠的地址線用來定址,對於它的資料存取通常是以塊為單位。這一點跟Nor flash不一樣,Nor flash帶有RAM介面,有足夠的地址線進行定址,所以CPU可以訪問Nor flash內部的每一個位元組,程式可以在nor flash中執行,而Nand flash不行,所以Nand flash中的程式想要執行必須拷貝到記憶體(一般是SDRAM)當中來。

當我們想燒寫程式至Nand flash中時,會藉助一個“中轉站”,既SDRAM。程式先燒寫到SDRAM中(這就是指定0X3000_0000地址的原因),然後在從SDRAM中拷貝到Nand flash中去,而這個拷貝工作由實現燒寫到Nor flash中的uboot程式引導完成。

此外,當我們向2440開發板移植Linux系統的時候,要向Nand flash燒寫三個檔案,分別是:uboot、Linux kernel和檔案系統。每一步的燒寫也跟前面一樣借用SDRAM作為燒寫的“中轉站”。但是,我們在燒寫的時候並沒有對每一步的燒寫地址做特定的處理,那怎麼能夠保證寫著三個檔案的時候後面的不會覆蓋前面的呢?我的理解是:還是Nor flash中的uboot程式的功勞,它會引導著三個檔案分別拷貝到Nand flash的不同位置中。

那麼,說完了Nand flash燒錄的問題,自然而然就應該說一下Nand flash中程式執行的問題。前面我們說到,Nand flash中不可以執行程式,而在我們選擇從Nand flash啟動的時候,S3C2440會自動將Nand flash的前4KB的程式碼拷貝到記憶體當中一個Stepping Stone(一般稱為墊腳石)的片內記憶體當中(這一步操作由晶片內部的硬體決定,不用我們操心),PC跳轉到0地址去執行這些程式碼。但是,這個片內記憶體只有4KB,當我們在Nand flash中的程式大於4KB的時候怎麼辦呢?這時候,就是這最先拷貝過去的4KB程式碼發揮作用的時候了。這4KB的程式碼會幫我們初始化SDRAM,然後將Nand flash中剩下的程式碼一併拷貝到SDRAM中,PC跳轉到SDRAM中去執行剩下的程式(所以我們的裸機程式一般不會超過4KB)。

終於說完了,雖然燒寫只有短短的幾步,但是其中蘊含的知識點還是蠻多的,這或許也就是嵌入式的特點吧。