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


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

 

linux內核啟動時幾個關鍵地址  
1、名詞解釋
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的虛擬起始地址,即內核虛擬地址空間的起始地址。
              
2、小結  
從上面分析可知道,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地址。

 

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

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

 

 

其中,內核鏡像的加載地址是100,入口地址是180,也就是說內核鏡像本身要加載到內存地址為100的地方,然后從地址180開始執行內核代碼(一般是_start指示的tag位置)。

uboot啟動內核的步驟是

先把內核鏡像uImage拷貝到內存某個位置上
然后使用bootm命令去啟動內存里的內核鏡像
如果我們沒有把內核鏡像uImage拷貝到指定的加載地址,那么bootm就會把內核鏡像在內存中移動到指定的加載地址上,然后再去從內核的入口地址開始執行。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM