cpu會自動從nand flash 中讀取前4kb的資料放置在片內sram裡(s3c2440是soc),同時把這段片內sram對映到ngcs0片選的空間(即0x00000000)。
cpu是從0x00000000開始執行,也就是nand flash裡的前4kb內容。因為nand flash連位址線都沒有,不能直接把nand對映到0x00000000,通過這個載
把nandflash中大**複製到ram(一般是sdram)中去執行。sdram掛接在s3c2440的bank6 (ngcs6),即位址從0x30000000開始。
u-boot,除非在ram中除錯,一般情況下都是從flash中執行一段**,然後將flash中儲存的**和資料搬移到ram中,然後跳轉到ram中執行。當然這應該也是一般的bootloader的執行方式,大家都差不多,但是各個bootloader的記憶體規劃(棧,堆之類的)也 不太一樣,而且u-boot還在記憶體空間中規劃了一些用於存放環境變數和一些資料結構的空間,所以如果不了解一下的話,直接看**的話就會有一點迷糊。有必要先介紹一下。關於u-boot的記憶體分布,或者說記憶體對映,網上有人畫了一幅圖,比較的清晰,如下:
u-boot映像:u-boot燒寫進flash的映像,在uboot的術語中,這部分的大小叫做monitor_size。所以在uboot中,這個二進位制檔案就叫做monitor。這個u-boot映像會被運送到ram中,從圖中也可以看見ram中有一塊也是u-boot映像。
環境變數區域:環境變數存放在flash和ram中各乙份,在flash中一般存放在緊隨monitor也即u-boot映像的下乙個sector中,儲存一些諸如ip位址等資訊,在程式被拷貝到ram中時,環境變數也同時被拷貝到ram中。
cfg_malloc_len:這個區域是用來存放堆資料和環境變數的,這個區域是緊接著ram中的u-boot映象的,從圖中也可以看出,在u-boot的基位址往下開闢了這一段區域。環境變數本來儲存在flash中,在系統初始化的時候,flash中的這些環境變數也同樣被複製到ram中,在系統執行的時候,可以修改ram中的值來改變系統的環境變數,但是掉電重啟後,還是用的flash中的設定值,當然也可以寫flash來改變預設的環境變數。
gbl_data_size:這個區域是緊接著cfg_malloc_len資料段的,從圖上也可以看出來,這一段是用來存放乙個gd_t資料結構的,這個資料是乙個uboot中用到的資料結構,用來存放系統的一些資訊,在下面會列出這個資料結構。
另外,在sdram_base開始的位址上,一般存放著二級跳轉中斷向量,這些中斷向量一般是用來為uclinux等作業系統用的。
其他的如棧的分布如上圖所示。
U boot記憶體結構。
u boot,除非在ram中除錯,一般情況下都是從flash中執行一段 然後將flash中儲存的 和資料搬移到ram中,然後跳轉到ram中執行。當然這應該也是一般的bootloader的執行方式,大家都差不多,但是各個bootloader的記憶體規劃 棧,堆之類的 也 不太一樣,而且u boot還在...
變數的記憶體分布
const變數儲存在.rodata read only 區域 char p abcd p指向的是靜態文字區域.text rodata 和 text 被合併為乙個segment,由os保護起來,只可讀。register變數存放在.bss區域 區域性變數存放在棧空間,static變數存放在靜態儲存空間 ...
程式的記憶體分布
32位的系統中,記憶體空間擁有4gb 2的32次方 的定址能力。大多數的作業系統都會將記憶體空間 中的一部分挪給核心使用,應用程式無法直接訪問這一段記憶體。windows預設情況會將高位址的2gb空間分給核心,而linux缺省會將高位址的1gb空間分配給核心,剩下的空間被稱為記憶體空間。一般來說,應...