arm2440 啟動(dòng)流程詳細(xì)分析
要分析arm2440的啟動(dòng)流程,先得了解arm2440的硬件配置,在arm2440這款cpu里面沒有什么存儲(chǔ)的芯片,除了以個(gè)4kb的SRAM(靜態(tài)存儲(chǔ)器可以運(yùn)行程序,但是最重要的一點(diǎn)就是掉電就失掉所有的數(shù)據(jù))注意這4kb是cpu自己的不是外設(shè)的的。好了現(xiàn)在講述下啟動(dòng)的流程。(一下是從nand flash 啟動(dòng))
1、首先機(jī)器上電,從外部的nand flash 的0x0000-0x01000也就是前4kb的內(nèi)容通過硬件的辦法來拷貝到我們的cpu內(nèi)部的4kb的SRAM里面,并且把這個(gè)地址映射成起始地址,也就是說把cpu的sp指針指向內(nèi)部的4kb的SRAM的0x0000地址,開始運(yùn)行。
備注:(具體的在硬件上怎么拷貝到cpu內(nèi)部的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技術(shù)手冊)
2.好了現(xiàn)在程序在你的內(nèi)部4kb的SRAM里面開始運(yùn)行了,但是這個(gè)只有4kb的SRAM空間太小,也許你覺得我寫的程序很大起碼有M級的,怎么辦呢,那你只好外擴(kuò)一片大點(diǎn)的SRAM,64M怎么樣,可以了吧,你要是覺得還是下那就256M,但是不管怎么樣你現(xiàn)在最重要的問題:怎么把我的程序放到我的外部SRAM里面去啊,于是你就想到為啥我不像在單片機(jī)里面的中斷一樣跳轉(zhuǎn)指令似的,我在我的4kb里面來個(gè)復(fù)制指令,讓我的外部nan flash 的程序全部考到我們的外部SRAM里面去啊,于是這個(gè)SRAM作用就體現(xiàn)出了
3.先在有一問題是你的拷貝指令的想法是可以的,但是假設(shè)你拷貝到外部的內(nèi)存中,好了你得把你的sp指針也就是程序指針的地址放到外部的內(nèi)存的起始地址上,這樣子你才能完整的啟動(dòng)你的整個(gè)程序。于是你需要將你的地址重新映射下,將外部的內(nèi)存地址映射成我們程序指針的地址,當(dāng)然在單片機(jī)里面沒有什么映射的概念(也許有但很少用),如果是單片機(jī)外擴(kuò)的話,那你只是需要將sp指針的地址指向我們的外部的內(nèi)存的首地址就可以了
備注:
1、在整個(gè)流程如果你是采用Linux來啟動(dòng)的你的系統(tǒng)的話,那么一般就會(huì)用到bootloader,那么你可以將你的bootloader放到你的nand flash的首地址。在隨后的地址上放你程序,這樣子在上電的時(shí)候你的bootloader會(huì)把你的程序拷貝到你的外部的存儲(chǔ)器里面
2、緊跟的問題就來了,bootloader的大小?拷貝的地址從那一段地址到那一段地址?
先考慮第一個(gè)問題:大小
如果你的bootloader大于4kb怎么辦,也很簡單解決問題方法是,那你就得修改bootloader,當(dāng)然你也可以修改其大小,使其小于4kb,但是你想要你bootloader的功能很強(qiáng)大,怎么辦,那也很簡單,那你就在bootloader的小于4kb的地址主要做一下初始化的工作,然后同樣把你要的東西全部拷到你的外部內(nèi)存中。記住在實(shí)際的bootloader中比喻:
0x00000000-0x00060000 //u-boot
0x00060000-0x00080000 //啟動(dòng)參數(shù),即saveenv命令,將設(shè)置的參數(shù)保存的地址。
這里面就分的很詳細(xì),程序和啟動(dòng)參數(shù)都分得很仔細(xì)。
好了第二個(gè)問題:拷貝的地址段
如果你的bootloader很小,在cpu的內(nèi)部sram就可以運(yùn)行的話,那就拷貝從4kb以后的你的程序就可以了,但是如果大于4kb的話,參考前面的說法,當(dāng)然你先拷貝你的內(nèi)核0x00080000-0x00280000 //內(nèi)核 0x00280000-之后的就是文件系統(tǒng)存放的區(qū)域了
4、好了在你的外部內(nèi)存里面有你的內(nèi)核和一些啟動(dòng)的bootloader,這個(gè)不是很重要,但是你現(xiàn)在就像看看,能不能呢個(gè)啟動(dòng)你的linux內(nèi)核,可以考慮讓你程序的地址指針指向的內(nèi)核的首地址,看是否能啟動(dòng)起來。但是說實(shí)在話,很多文章在測試他們的內(nèi)核是否啟動(dòng)起來的,都把他們下到0x31000000這個(gè)起始地址,很是不解。
5.英文技術(shù)手冊的相關(guān)內(nèi)容:
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