在剛開始學習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)。
雖然說燒寫只有短短的幾步,但是其中蘊含的知識點還是蠻多的,這或許也就是嵌入式的特點吧。
-
嵌入式
+關注
關注
5141文章
19537瀏覽量
315036 -
SDRAM
+關注
關注
7文章
441瀏覽量
56032 -
NAND
+關注
關注
16文章
1719瀏覽量
137814 -
FlaSh
+關注
關注
10文章
1667瀏覽量
150991
原文標題:為什么指定了SDRAM,程序卻燒寫到了Nand flash?
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論