要分析arm2440的啟動流程,先得了解arm2440的硬件配置,在arm2440這款cpu里面沒有什么存儲的芯片,除了以個4kb的SRAM(靜態(tài)存儲器可以運行程序,但是最重要的一點就是掉電就失掉所有的數(shù)據(jù))注意這4kb是cpu自己的不是外設的的。好了現(xiàn)在講述下啟動的流程。(一下是從nand flash 啟動)
1、首先機器上電,從外部的nand flash 的0x0000-0x01000也就是前4kb的內容通過硬件的辦法來拷貝到我們的cpu內部的4kb的SRAM里面,并且把這個地址映射成起始地址,也就是說把cpu的sp指針指向內部的4kb的SRAM的0x0000地址,開始運行。
備注:(具體的在硬件上怎么拷貝到cpu內部的SRAM里面,下面的這段話也許能解釋下)
During reset, Nand flash controller will get information about the connected NAND flash through Pin status
(NCON(Adv flash), GPG13(Page size), GPG14(Address cycle), GPG15(Bus width) – refer to PIN
CONFIGURATION), After power-on or system reset is occurred, the NAND Flash controller load automatically the
4-KBytes boot loader codes. After loading the boot loader codes, the boot loader code in steppingstone is
executed.(2440技術手冊)
2.好了現(xiàn)在程序在你的內部4kb的SRAM里面開始運行了,但是這個只有4kb的SRAM空間太小,也許你覺得我寫的程序很大起碼有M級的,怎么辦呢,那你只好外擴一片大點的SRAM,64M怎么樣,可以了吧,你要是覺得還是下那就256M,但是不管怎么樣你現(xiàn)在最重要的問題:怎么把我的程序放到我的外部SRAM里面去啊,于是你就想到為啥我不像在單片機里面的中斷一樣跳轉指令似的,我在我的4kb里面來個復制指令,讓我的外部nan flash 的程序全部考到我們的外部SRAM里面去啊,于是這個SRAM作用就體現(xiàn)出了
3.先在有一問題是你的拷貝指令的想法是可以的,但是假設你拷貝到外部的內存中,好了你得把你的sp指針也就是程序指針的地址放到外部的內存的起始地址上,這樣子你才能完整的啟動你的整個程序。于是你需要將你的地址重新映射下,將外部的內存地址映射成我們程序指針的地址,當然在單片機里面沒有什么映射的概念(也許有但很少用),如果是單片機外擴的話,那你只是需要將sp指針的地址指向我們的外部的內存的首地址就可以了
備注:
1、在整個流程如果你是采用Linux來啟動的你的系統(tǒng)的話,那么一般就會用到bootloader,那么你可以將你的bootloader放到你的nand flash的首地址。在隨后的地址上放你程序,這樣子在上電的時候你的bootloader會把你的程序拷貝到你的外部的存儲器里面
2、緊跟的問題就來了,bootloader的大小?拷貝的地址從那一段地址到那一段地址?
先考慮第一個問題:大小
如果你的bootloader大于4kb怎么辦,也很簡單解決問題方法是,那你就得修改bootloader,當然你也可以修改其大小,使其小于4kb,但是你想要你bootloader的功能很強大,怎么辦,那也很簡單,那你就在bootloader的小于4kb的地址主要做一下初始化的工作,然后同樣把你要的東西全部拷到你的外部內存中。記住在實際的bootloader中比喻:
0x00000000-0x00060000 //u-boot
0x00060000-0x00080000 //啟動參數(shù),即saveenv命令,將設置的參數(shù)保存的地址。
這里面就分的很詳細,程序和啟動參數(shù)都分得很仔細。
好了第二個問題:拷貝的地址段
如果你的bootloader很小,在cpu的內部sram就可以運行的話,那就拷貝從4kb以后的你的程序就可以了,但是如果大于4kb的話,參考前面的說法,當然你先拷貝你的內核0x00080000-0x00280000 //內核 0x00280000-之后的就是文件系統(tǒng)存放的區(qū)域了
4、好了在你的外部內存里面有你的內核和一些啟動的bootloader,這個不是很重要,但是你現(xiàn)在就像看看,能不能呢個啟動你的linux內核,可以考慮讓你程序的地址指針指向的內核的首地址,看是否能啟動起來。但是說實在話,很多文章在測試他們的內核是否啟動起來的,都把他們下到0x31000000這個起始地址,很是不解。
5.英文技術手冊的相關內容:
In recent times, NOR flash memory gets high in price while an SDRAM and a NAND flash memory is
comparatively economical , motivating some users to execute the boot code on a NAND flash and execute the
main code on an SDRAM.
S3C2440A boot code can be executed on an external NAND flash memory. In order to support NAND flash boot
loader, the S3C2440A is equipped with an internal SRAM buffer called ‘Steppingstone’. When booting, the first 4
KBytes of the NAND flash memory will be loaded into Steppingstone and the boot code loaded into Steppingstone
will be executed.
Generally, the boot code will copy NAND flash content to SDRAM. Using hardware ECC, the NAND flash data
validity will be checked. Upon the completion of the copy, the main program will be executed on the SDRAM





