摘編:
在嵌入式系統中,內核映像與根文件系統映像存儲在 ROM 或 Flash 等固態存儲設備中,並且可以直接運行。但這樣做是運行速度太慢,所以要把他們加載到ram中.實現主要有以下過程以嵌入式linux為例)
*******************************************1.檢測內存映射.
內存映射就是指在整個 4GB(CPU) 物理地址空間中有哪些地址范圍被分配用來尋址系統的 RAM 單元。比如,在 Samsung S3C44B0X CPU 中,從 0x0c00,0000 到0x1000,0000 之間的 64M 地址空間被用作系統的 RAM 地址空間。雖然 CPU 通常預留出一大段足夠的地址空間給系統 RAM,但是在搭建具體的嵌入式系統時卻不一定會實現 CPU 預留預留的全部 RAM 地的全部 RAM 地址空間。也就是說,具體的嵌入式系統往往只把 CPU 址空間中的一部分映射到 RAM 單元上,而讓剩下的那部分預留 RAM 地址空間處於未使用狀態。
2.規划內存占用布局
這里包括兩個方面:(1)內核映像所占用的內存范圍;(2)根文件系統所占用的內存范圍。在規划內存占用的布局時,主要考慮基地址和映像的大小兩個方面。
對於內核映像,一般將其拷貝到從(MEM_START+0x8000) 這個基地址開始的大約1MB大小的內存范圍內(嵌入式 Linux 的內核一般都不操過 1MB)。為什么要把從 MEM_START 到 MEM_START+0x8000 這段 32KB 大小的內存空出來呢?這是因為 Linux 內核要在這段內存中放置一些全局數據結構,如:啟動參數和內核頁表等信息。
而對於根文件系統映像,則一般將其拷貝到 MEM_START+0x0010,0000 開始的地方。如果用 Ramdisk 作為根文件系統映像,則其解壓后的大小一般是1MB。
32k +0x8000 +0x0100 0000
|---------------|-----------------------|--------------
MEM_Start Kernel Rootfs (1MB)
3.從 Flash 上拷貝
由於像 ARM 這樣的嵌入式 CPU 通常都是在統一的內存地址空間中尋址 Flash 等固態存儲設備的,因此從 Flash 上讀取數據與從 RAM 單元中讀取數據並沒有什么不同。用一個簡單的循環就可以完成從 Flash 設備上拷貝映像的工作:while(count) {
*dest++ = *src++; /* they are all aligned with word boundary */
count -= 4; /* byte number */
};