linux內核鏡像的加載地址和入口地址

copy from :https://blog.csdn.net/whahu1989/article/details/85255538  https://wenku.baidu.com/view/2670021c195f312b3069a532.htmlhtml

 

linux內核啓動時幾個關鍵地址  
一、名詞解釋
ZTEXTADDR  解壓代碼運行的開始地址。沒有物理地址和虛擬地址之分,由於此時MMU處於關閉狀態。這個地址不必定時RAM的地址,能夠是支持讀寫尋址的flash等存儲中介。  

ZRELADDR  內核啓動在RAM中的物理地址。壓縮的內核映像被解壓到這個地址,而後執行。  
           This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:     
                      __virt_to_phys(TEXTADDR) == ZRELADDR  The initial part of the kernel is carefully coded to be position independent.  
                      
TEXTADDR  內核啓動的虛擬地址,與ZRELADDR相對應。通常內核啓動的虛擬地址爲RAM的第一個bank地址加上0x8000。        
          TEXTADDR = PAGE_OFFSET + TEXTOFFST  Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.
          This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region.
          Previous kernels placed a restriction of 256MB here.   
          
TEXT_OFFSET  內核偏移地址,即內核起始位置相對於內存起始位置的偏移,對於相對於物理內存仍是相對於虛擬內存都是同樣的結果。在arch/arm/makefile中設定。   

PHYS_OFFSET  RAM第一個bank的物理起始地址,即物理內存的起始地址。
             Physical start address of the first bank of RAM.   
             PAGE_OFFSET  RAM第一個bank的虛擬起始地址,即內核虛擬地址空間的起始地址。
              
二、小結  
從上面分析可知道,linux內核被bootloader拷貝到RAM後,解壓代碼從ZTEXTADDR開始運行(這段代碼是與位置無關的PIC)。
內核被解壓縮到ZREALADDR處,也就是內核啓動的物理地址處。
相應地,內核啓動的虛擬地址被設定爲TEXTADDR,知足以下條件:
  TEXTADDR = PAGE_OFFSET + TEXT_OFFSET 內核啓動的物理地址和虛擬地址知足入下條件:  
  ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR)
  假定開發板爲smdk2410,則有:
  內核啓動的虛擬地址 TEXTADDR  = 0xC0008000 內核啓動的物理地址   ZRELADDR  = 0x30008000  
  若是直接從flash中啓動還須要設置ZTEXTADDR地址。linux

 

uboot引導linux內核鏡像(uImage)啓動時,會有2個地址.net

加載地址(Load Address),即內核鏡像總體要放置的內存空間位置
入口地址(Entry Point),即從內核鏡像中開始執行的地址
示意圖以下,3d

 

 

其中,內核鏡像的加載地址是100,入口地址是180,也就是說內核鏡像自己要加載到內存地址爲100的地方,而後從地址180開始執行內核代碼(通常是_start指示的tag位置)。rest

uboot啓動內核的步驟是code

先把內核鏡像uImage拷貝到內存某個位置上
而後使用bootm命令去啓動內存裏的內核鏡像
若是咱們沒有把內核鏡像uImage拷貝到指定的加載地址,那麼bootm就會把內核鏡像在內存中移動到指定的加載地址上,而後再去從內核的入口地址開始執行。orm

加載地址和入口地址在uImage的開頭部分有定義,這是編譯內核鏡像時指定的。
————————————————
版權聲明:本文爲CSDN博主「愛是恆久忍耐1989」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/whahu1989/article/details/85255538htm

相關文章
相關標籤/搜索